2.5 KiB
2.5 KiB
DECISIONS.md — ADR log
Decisions inside the set architecture. D-NNN, never renumbered.
- D-001 — SDD+BDD+TDD adopted (2026-07-13). SPEC-system port:
numbered requirements in
specs/, coverage classes feature/test/manual,tools/trace.pyenforcement inmake check. Process is binding — see SPEC-000. - D-002 — BDD runs at the responder seam, not against live
services.
FakeModelResponderscripts model output; Discord-event behavior is unit-tested with mocked discord.py objects. Rationale: Discord ToS forbids test-account automation and LLM output is nondeterministic — a live-BDD lane would be flaky by construction. - D-003 — Packaging = uv + pyproject only (2026-07-13). setup.py,
requirements.txt and pytest.ini removed; single source of truth,
locked via uv.lock. Python
>=3.11floor keeps the kitchen host (py3.11) deployable until FDB-016 lands. - D-004 — openai SDK pinned
<2(1.109.x). The v2 SDK migration happens together with the FDB-005 envelope rewrite (structured outputs / Responses API) — one breaking change, one test cycle, instead of two. - D-005 —
--strict-markersstays on; requirement tags from.featurefiles are registered as pytest markers dynamically intests/conftest.py. - D-006 — FDB-005 stays on chat.completions + structured outputs; the Responses API migration is deferred to FDB-007, where history handling gets redesigned anyway — one conversation-state reshape instead of two.
- D-007 — openai SDK bumped to 2.x together with the envelope
rewrite (supersedes the D-004 pin).
multilinedependency dropped — strict schema output made relaxed-JSON parsing dead code. - D-008 — Operator runtime flags (pause/images/tasks/quiet) are in-memory only; a restart resets to config defaults. Persistence arrives with the FDB-011 task store if staff practice demands it.
- D-009 —
translate()still keys offfix-modelalthough the repair path is gone; the whole translate-before-draw step dies in FDB-009 (gpt-image-2 is multilingual). Not worth a config rename for one phase. - D-010 — Persistence uses stdlib
sqlite3viaasyncio.to_thread, not aiosqlite: no new dependency, and a connection-per-operation with WAL is plenty at this message volume. - D-011 —
save_historyreplaces the channel's rows wholesale per message instead of appending: histories are capped athistory-limit(~200-350 rows) and trims must be reflected; correctness over micro-optimization.