git:20260824.be81288 to git:20260824.0bcd152
24 added, 8 removed. Audit A to A.
# Harbour
- Harbour is a ticketing service for small support teams. It accepts inbound mail,
- turns each thread into a ticket, and routes tickets to the queue that owns them.
+ The work queue is a table in the same database as everything else. That
+ costs throughput nobody is currently asking for and buys one thing to
+ back up, one thing to restore, and one place a stuck job can be found.
## Non-negotiables
- Inbound mail is never dropped. A message that cannot be parsed becomes a ticket
- in the triage queue with the raw body attached, and an operator decides.
+ Operators reassign rather than share. Cross-team tickets move between
+ queues, which means reassignment has to be one action and has to leave a
+ trail that answers who moved it and when.
+ Every test names the behaviour it protects in its title. A test that
+ cannot fail is deleted rather than kept for coverage, and one that needs
+ two fixtures to explain itself is usually testing two things.
+
## Commands
- The dev target runs the service against a local Postgres. The check target runs
- the whole test suite and the linter. Both must pass before a change is proposed.
+ Retention is the open question. The raw store keeps every message and has
+ no expiry, so the volume fills on a schedule nobody has written down and
+ ingest starts refusing when it does.
+ Rules are data and are reloaded without a restart, which took the deploy
+ out of the loop and put validation on the critical path. A malformed rule
+ set now reaches production with only the loader standing in front of it.
+
## After every task
- Update the decision log when a choice was made, and the pattern index when a new
- pattern file lands.
+ The bootstrap target is safe to re-run. It drops and recreates the local
+ database only, applies every migration in order, and loads a fixture set
+ with three queues and a handful of threads.
+
+ A health check that sends a message and reads it back is the only thing
+ that would catch a stalled sender, because tickets continue to look
+ answered from the operator's side while replies pile up unsent.