Files
JesseMarkowitzandClaude Opus 5 279a871a77 Planning: add the M4 implementation review report and rotate M3's
Reporting pass only. No application code, no test, and no product
requirement changes.

Result: PASS WITH CORRECTIVE WORK REQUIRED.

M4's Definition of Done is met and demonstrated at the API level, including
across a real two-process restart. The load-bearing constraint holds under
inspection rather than assertion: the only head-field assignment M4 added
anywhere in the backend is one line in head.py, and an exhaustive grep of the
diff finds no second mechanism that forks, prunes memories, reconstructs
state, filters the transcript or recomputes Redo.

Three corrective items, all M4's own, none in the head model:

- GET /checkpoints is an N+1 fetching whole Action rows including prose --
  measured at 53 SELECTs for 25 Save Points against 4 for the branch panel,
  in a codebase that keeps test_egress.py for this exact class of mistake;
- deleting a branch silently deletes Save Points naming it, and the branch
  panel's confirmation does not say so. M4 added the consequence to an
  existing destructive action without updating its warning;
- the shipped D11/L03 tests restart a client, not a process, so the suite is
  weaker than the acceptance items it is named for. Both pass here only
  because the report re-ran them across a real process boundary by hand.

The browser smoke test is NOT PERFORMED, for M4 and still for M3. Firefox is
a snap that hangs past 90s on a trivial headless screenshot; there is no
Xvfb, no display, no driver library. Two consecutive milestones now carry an
unperformed browser requirement, which the report raises as a standing
acceptance risk rather than a defect in either milestone's code.

Evidence recorded: 680 backend tests pass (42 M4, 130 M3 invariants, 93
security/local-only), frontend lint and build clean, Docker build clean,
migration 80 verified against a representative pre-M4 database with both
cascades and zero possible orphans, and I04 verified through a real round
trip with branch ids remapped 1->3 and 2->4.

M4 is NOT accepted by this report, and M5 is NOT authorized. That decision
belongs to whoever reviews this.

Rotation: planning/reports/M3-IMPLEMENTATION-REPORT.md moves to
planning/archive/milestone-reports/ as a pure rename, contents unedited
(git reports 100% similarity, 0 insertions, 0 deletions). Six path
references in five active documents are updated because the path changed
and for no other reason -- no status claim, no wording change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PWU4gTfLYY6Qq9U7aa9Qw2
2026-09-03 19:15:53 -04:00

3.9 KiB

Archive — historical material, not authoritative

Everything under planning/archive/ is evidence and history. None of it governs current implementation. If an archived document and an active planning document disagree, the active document is right and the archived one records what was believed or measured at the time.

Do not consult this directory during ordinary milestone work unless an active document sends you here for a specific piece of historical evidence.

What is here

phase0/ — why AI-DnD was selected

Phase 0A static research and Phase 0B local validation, closed 2026-09-01.

File What it is
RESEARCH-PLAN.md The question Phase 0 existed to answer, and its final dispositions.
PRELIMINARY-RECOMMENDATION.md The Phase 0A conclusion, from static review alone.
REUSE-MATRIX.md What each candidate offered against the required subsystems.
AI-DND-ANALYSIS.md The selected base, analysed before the fork.
AI-ADVENTURE-ANALYSIS.md The rejected finalist still cited as the implementation reference for typed state events.
OPEN-DUNGEON-ANALYSIS.md The rejected finalist still cited as the UX/future-media reference.
PHASE-0B-RECOMMENDATION.md The strongest single document. The measured Phase 0B findings and the fork decision.
PHASE-0B-BASELINE.md Clean clones, builds and test runs for the three finalists.
PHASE-0B-AI-DND-EXPERIMENT.md AI-DnD driven against a real local Ollama.
PHASE-0B-AI-ADVENTURE-OLLAMA.md ai-adventure's Ollama and service-boundary behaviour.
PHASE-0B-OPEN-DUNGEON-HISTORY.md Whether Open Dungeon could be retrofitted with history.
PHASE-0B-OFFLINE-NETWORK.md What each candidate reached for with no route to the Internet.
PHASE-0B-UNDO-SPIKE.md The disposable spike that proved non-destructive undo/redo, and became ADR 012's architecture.
PHASE-0B-FOLLOWUP-CHECKS.md The world-state protocol, export/head, story-card lineage and Postgres checks.

Phase 0A discovery and triage material (the candidate inventory, source index, reference-project list, licensing and static-privacy reviews, the Phase 0A status page) and the Phase 0B execution prompts were deleted in the 2026-09-03 documentation cleanup. They are intermediate working documents whose conclusions all reached the two recommendation reports above, and they remain in Git history.

milestone-reports/ — completed milestone evidence

M1-BASELINE-REPORT.md, M1-IMPLEMENTATION-REPORT.md, M2-BASELINE-REPORT.md, M2-IMPLEMENTATION-REPORT.md, M3-IMPLEMENTATION-REPORT.md.

M3's report is both its review and its primary evidence record; no separate M3 baseline report was produced. It arrived here when M4's report landed.

Every architectural conclusion these reports reached has already been applied to the active planning documents and the ADRs — see planning/VERSION.md, which lists the corrections each milestone produced. The reports are kept for their measurements and their reasoning, not as instructions.

The current milestone's report stays in planning/reports/ while it is still useful for reviewing the next milestone, and moves here when it is not.

decisions/ — superseded or completed ADRs

008-phase0-before-build-plan.md — a process gate ("do not start production work before Phase 0 closes") that Phase 0 satisfied on 2026-09-01. It constrains nothing now. ADR numbering continues from 012 in planning/DECISIONS/; 008 is not reused.

A note on paths inside these files

Archived documents are kept verbatim. File paths written inside them refer to where those files lived when the document was written — before this archive existed, and in some cases before files were deleted. That is deliberate: an evidence record that has been quietly edited is no longer evidence. Resolve any such path against Git history, not against the current tree.