spec(import): decide and document mass-import operator policy (3 open questions) #534
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Type: Spec / operator policy (3 open questions to resolve)
Priority: P2-medium — answers should land before the first real prod import campaign so the runbook reflects intent
Source: review of #526 by Elicit (req engineer) — comment #8647
Parent PR: #526 (mass-import bind mount)
Summary
#526 unlocked the mass-import card on production but left three operator-policy questions unanswered. Decide each, document the answer in
docs/DEPLOYMENT.md§6.4 (or a new ADR if architectural), and file implementation follow-ups only where current behaviour diverges from the decision.Context
#526 unlocked the existing
/admin/systemmass-import card on production. The feature now works, but its operator policy is unspecified. These three questions should be answered before the first real import campaign so the runbook indocs/DEPLOYMENT.md§6.4 reflects an actual policy rather than mechanical steps.Open Questions
OQ-IMP-001: Is the bind mount permanent or campaign-only?
The current PR makes it permanent — staging and prod always have
/importmounted, even when no import is running.Trade-off:
IMPORT_HOST_DIR).IMPORT_HOST_DIRto a tmpfs/empty dir between campaigns, set to real path before each import. Lower attack surface, more ops friction.Recommendation: decide and document. If "permanent", make the doc explicit so future-Marcel doesn't second-guess.
OQ-IMP-002: Is there a size ceiling per import?
Current rsync: 2.6 GB / 1,607 files.
MassImportServicehas no upper bound — it walks the entire/importtree.Trade-off:
Document the intended ceiling so future operators know whether 10× the current payload is in or out of scope.
OQ-IMP-003: What's the recovery story for a partial import?
If
MassImportServicefails halfway through (e.g. S3 write error on file 800/1607),ImportStatusreportsFAILEDwith a message — but the database has 800 new rows and 800 new S3 objects. Re-running the import: does the de-dup viafindByOriginalFilenamecorrectly skip the already-imported 800 and pick up at 801? Or does it leave the placeholder rows in a weird state?Possible answers, each with operator-doc implications:
documents/ clean S3 before retry. Worse, but document the steps.Acceptance criteria
docs/DEPLOYMENT.md§6.4 — "permanent" vs "campaign-only" stated explicitly with rationaledocs/DEPLOYMENT.md§6.4 — intended size ceiling stated (or "no cap, fails naturally" stated)docs/DEPLOYMENT.md§6.4 — recovery story documented; if "resumable by design", de-dup behaviour explained; if "manual cleanup", steps enumeratedLinked NFRs
docs/DEPLOYMENT.mdis the canonical runbook for production operations.Definition of Ready
docs/DEPLOYMENT.md§6.4)🤖 Generated with Claude Code during /implement on #526