Architecture Decision Records¶
Every non-obvious choice in FlowForge is written down with the alternative that was rejected and the reason. A decision that only exists in a commit message is a decision the next person will re-litigate.
A short summary of every decision, including the ones without a full ADR, is in the decisions index.
| ADR | Decision | Status |
|---|---|---|
| ADR-007 | Celery as interim task infrastructure | Superseded by ADR-011 (owner decision 2026-10-20); Celery removed in Phase 4 |
| ADR-009 | Project name evaluated; "FlowForge" retained | Accepted 2026-10-19 |
| ADR-010 | Move to Django 5.2 LTS | Accepted 2026-10-19 |
| ADR-011 | Custom scheduler and transactional outbox; Celery removed in Phase 4 | Accepted 2026-10-20 — owner decision |
| ADR-012 | Retry policy and dead-letter semantics (DEAD, consumed attempts, scheduled_at backoff) |
Accepted 2026-10-21 — scope mandated by the owner's Phase 6 directive |
| ADR-013 | The event log is transactional with its state change | Accepted 2026-10-22 |
| ADR-014 | Multi-tenancy via a shared schema and per-organization scoping | Accepted 2026-10-23 (v0.9.0) |
How an ADR is written here¶
- Context — the constraint or problem, stated without the answer.
- Decision — what was chosen, in the present tense.
- Consequences — what becomes easier, what becomes harder, and what is now impossible without a new ADR.
- Alternatives rejected — each with the specific reason it lost, not "it was worse".
An ADR that records only the winner is a press release, not a record.