| Metadata | Value |
|---|---|
| Status | Archived |
| Version | 1.1.0 |
| Last Updated | 2026-09-10 |
| Author | Sangeetha Grantha Team |
| Document Type | Archive |
[!NOTE] Historical evidence: results, counts, commands, and observations below belong to the original work described here. The editorial update date is not a new test or corpus verification. For present behavior, use current feature map.
This report consolidates findings from application_documentation/07-quality/bulk-import-implementation-review-claude.md and application_documentation/07-quality/csv-import-strategy-implementation-review-goose.md with a focused pass over the current backend implementation. The architecture (unified dispatcher, staged workers, event logging) is solid, but there are several critical correctness and security risks plus strategic gaps around quality scoring, review workflow depth, and performance at scale.
RUNNING with startedAt at claim time, but workers may not begin immediately when channels are full; the watchdog re-marks these as RETRYABLE, risking double-processing and duplicate side effects. Consider a QUEUED state or only setting startedAt when a worker begins execution. (modules/backend/dal/src/main/kotlin/com/sangita/grantha/backend/dal/repositories/BulkImportRepository.kt, modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/BulkImportWorkerService.kt)failManifestTask updates the task/job and emits an event but never updates the batch status, leaving RUNNING batches with zero tasks. This contradicts the clarified requirement to mark the batch FAILED on manifest ingest errors. (modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/BulkImportWorkerService.kt)originalFileName is used directly (no basename sanitization), and the entire file is read into memory with no size limit; null filenames can also throw. This is a security and stability issue. (modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/routes/BulkImportRoutes.kt)quality_score, quality_tier, or confidence aggregations, and auto-approval uses hardcoded heuristics instead of strategy-defined tiers. This blocks strategy goals around review prioritization and automation. (database/migrations/15__add_missing_import_metadata.sql, modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/AutoApprovalService.kt)modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/routes/ImportRoutes.kt, modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/routes/BulkImportRoutes.kt)modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/routes/BulkImportRoutes.kt, modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/BulkImportWorkerService.kt)modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/EntityResolutionService.kt, database/migrations/15__add_missing_import_metadata.sql)modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/DeduplicationService.kt)checkAndTriggerNextStage loads all tasks on every task completion; for large batches this becomes significant DB overhead. (modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/BulkImportWorkerService.kt)modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/BulkImportWorkerService.kt)FileReader defaults to system charset and is not closed, risking incorrect diacritic handling and file descriptor leaks. (modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/BulkImportWorkerService.kt)modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/BulkImportWorkerService.kt)"\b" is a backspace in Kotlin strings, so honorifics are not removed during normalization. (modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/NameNormalizationService.kt)associateBy keeps only one entity per normalized key, so collisions can silently bias resolution toward the last entry. (modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/EntityResolutionService.kt)modules/backend/api/src/main/kotlin/com/sangita/grantha/backend/api/services/BulkImportOrchestrationService.kt)Raga column is optional; it is used only for validation at CSV creation time and the authoritative value is scraped from the URL.FAILED, even with zero tasks.