You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Architecture review due (10 PRs since arch-review/2026-10-18) #302
10 PRs have merged since arch-review/2026-10-18, the last architecture review.
What to build
The architecture review of arch-review/2026-10-18..master, following "Architecture review" in docs/agents/design-process.md: findings re-verified against master, filed as issues, placed next in the milestone orders, and the reviewed commit tagged.
First caller
The maintainer, who decides on the findings, and the next issues picked from the milestone orders.
Design
Design: not needed because the review procedure is already defined in docs/agents/design-process.md.
Reviewed arch-review/2026-10-18..8547e1d (10 PRs, #284–#300). Every finding was re-checked against master at 8547e1d. Tagged arch-review/2026-10-24 on 8547e1d and pushed.
DuplicateCopyTally is a process-wide singleton taken only when a crawl finishes, so a cancelled, released or failed crawl's copies go into the next report. Count them per run instead.
Worker.Work and Worker.Crawling depend on each other through WorkerState.
IngestionShutdown now covers an admin's cancel as well, and its comment names a crawl loop that is gone.
IWorkItemStore has nine members spanning executor, scheduler and retention: they are one table's state machine, all PostgreSQL-only and contract-tested together (ADR 0008).
IWorkHandler and IWorkProgress live in Core although only the Worker implements them: Core holds the payloads and WorkProgress, which IWorkItemReader returns, and work-handlers-live-in-worker keeps the handlers out. Moving the interface gains nothing.
WorkJson.Options builds new serializer options on every call: this follows CLAUDE.md's rule against static readonly initialisers, which cause mutants that flip between runs.
CrawlPayload and BurstDetectionPayload have the same shape: eight lines each. IStorageConfigPayload<TSelf> already shares what the scheduler needs.
Raw SQL naming WorkItems: checked as CLAUDE.md asks. It appears only in EfWorkItemStore (Worker) and EfWorkItemCanceller (Core), and neither inserts. architecture-exceptions.json is empty.
The Epic 4 milestone order now puts #304 and #303 after #250 and ahead of #33.
Activity
bitbiter-dev commentedon Oct 23, 2026
Reviewed
arch-review/2026-10-18..8547e1d(10 PRs, #284–#300). Every finding was re-checked against master at8547e1d. Taggedarch-review/2026-10-24on8547e1dand pushed.Filed
cpmakes itDuplicateCopy,mvmakes itPathTaken(a warning on every crawl), and either way the path's row keeps its old hash, metadata and proxies. This is Update the row when a file's content changes at the same path #250's problem by a route Update the row when a file's content changes at the same path #250 left out, andIngestionClassifierTestspins it. Decided with the maintainer: its own issue, design first. It blocks Soft-delete missing files after a crawl, and auto-restore them when they return #33 and Auto-restore a soft-deleted asset when its file is back at its path or its content turns up elsewhere #37.DuplicateCopyTallyis a process-wide singleton taken only when a crawl finishes, so a cancelled, released or failed crawl's copies go into the next report. Count them per run instead.Worker.WorkandWorker.Crawlingdepend on each other throughWorkerState.IngestionShutdownnow covers an admin's cancel as well, and its comment names a crawl loop that is gone.DbUpdateConcurrencyException. feat(worker): Similar photos join bursts — OpenCV feature matching on thumbnails #298's body has a new acceptance line, and the session working on feat(worker): Similar photos join bursts — OpenCV feature matching on thumbnails #298 has been told. Decided with the maintainer.StorageConfigSchedules<TPayload>uses the crawl interval for every per-config kind, and feat(worker): Orphaned proxy file sweeper (proxies ↔ DB reconciliation) #174's kinds should not inherit it silently.Dropped, with reasons
IWorkItemStorehas nine members spanning executor, scheduler and retention: they are one table's state machine, all PostgreSQL-only and contract-tested together (ADR 0008).IWorkHandlerandIWorkProgresslive in Core although only the Worker implements them: Core holds the payloads andWorkProgress, whichIWorkItemReaderreturns, andwork-handlers-live-in-workerkeeps the handlers out. Moving the interface gains nothing.Resultis an untyped jsonb summary served asJsonElement: decided in spec: Work queue — durable API/Worker work items with scope routing, leases and a live admin view #276 (user story 8 and the column list).WorkJson.Optionsbuilds new serializer options on every call: this follows CLAUDE.md's rule againststatic readonlyinitialisers, which cause mutants that flip between runs.BurstDetectionis both enqueued after a crawl and scheduled: decided in the spec: Bursts — group photos of the same scene by camera label or feature similarity, show one cover per burst #296 design note (section 3), and one dedup key coalesces them.CrawlPayloadandBurstDetectionPayloadhave the same shape: eight lines each.IStorageConfigPayload<TSelf>already shares what the scheduler needs.WorkItems: checked as CLAUDE.md asks. It appears only inEfWorkItemStore(Worker) andEfWorkItemCanceller(Core), and neither inserts.architecture-exceptions.jsonis empty.The Epic 4 milestone order now puts #304 and #303 after #250 and ahead of #33.
🤖 Generated with Claude Code