Skip to content

docs: post-mortem on the guards arc — what shipped, and what did not work - #256

Merged
Polichinel merged 1 commit into
developmentfrom
docs/post-mortem-guards-arc
Aug 12, 2026
Merged

Polichinel merged 1 commit into
developmentfrom
docs/post-mortem-guards-arc

Conversation

@Polichinel

Copy link
Copy Markdown
Collaborator

Full post-mortem in reports/post_mortems/2026-08-12_the_guards_that_did_not_guard.md, following the platform convention (views-faoapi's shape).

Covers PR #239 through the release #240, epic #241, and register C-89…C-97.

The substance

We built a cross-repository guard surface. A post-merge review found fifteen defects in the change that built the newest part of it — all reproduced. Three would have shipped in the release:

  • the guard against publishing a coordinate value printed it, on the one event it fires for, into a world-readable CI log
  • the drift check fired on 12 of 25 rows this partner never reads
  • 15 of 29 markdown assignment forms escaped the no-copy scan

The remedy was deletion three times out of five.

The process section is the point

Lines added to code 341
Lines added to docs/register 452
Commits per story 7 · 7 · 12 · 5

Four named failures, worst first:

  1. A governance rule repealed in a permanent ADR on a claim false by six hours. views-crafdapi#53 closed at 12:15; the commit said it hadn't landed at 18:18.
  2. Each remediation introduced a defect of the class it was fixing — a tautology inside the fix for a tautology; a cry-wolf helper that was strictly worse than plain in.
  3. Numbers quoted from memory, wrong twice in consecutive tracking comments.
  4. A review reported as running when nothing had been launched.

The root cause is architectural, not personal

ADR-016 and ADR-017 contain descriptions of current implementation — "this is the shape the registry check now has". An ADR records a decision; the moment it also describes the code it becomes a second copy of the code, and it rots on every change. Most of #248's twelve commits were repairing exactly that. It is the rule #250 will land.

What worked

Independent review — five parallel reviewers found what four rounds of self-review had not, and the adversarial mutation reviewer was the single highest-value input. Deletion as default remedy. Refusing to chase five surviving mutations in writing. And the mid-sprint intervention, after which #248 took twelve commits and #243 took five.

Every figure was produced by a command and re-verified before commit — the rule this arc had to adopt halfway through.

🤖 Generated with Claude Code

Full post-mortem on the arc from PR #239 through the release, in
reports/post_mortems/ following the platform convention (views-faoapi's shape:
period/scope/final-stats header, why, timeline, what we did, what we learned,
process, what remains).

WHAT IT RECORDS. We built a cross-repository guard surface, and a post-merge review
found fifteen defects in the change that built the newest part of it — every one
reproduced. Three would have shipped in the release: the guard against publishing a
coordinate value PRINTED it, on the one event it fires for; the drift check fired on
12 of 25 rows this partner never reads; and 15 of 29 markdown assignment forms escaped
the no-copy scan.

The remedy was deletion three times out of five. The source-reading check broke twice
in 24 hours, both times because a consumer improved its own code — commits 8615574 and
0c493ae each introduce the named constant AND add that repository's registry-binding
test, so the improvement and the breakage were one edit.

THE PROCESS SECTION IS THE POINT, and it is not flattering. 341 lines of code against
452 lines of prose. Commits per story 7, 7, 12, 5. Four named failures: a governance
rule repealed in a permanent ADR on a claim that was false by six hours; each
remediation introducing a defect of the class it was fixing; numbers quoted from memory
and wrong twice in consecutive tracking comments; and a review reported as running when
nothing had been launched.

The root cause is recorded as architectural rather than personal: ADR-016 and ADR-017
contain DESCRIPTIONS OF CURRENT IMPLEMENTATION, so they rot on every change. An ADR
records a decision; the moment it also describes the code it becomes a second copy of
the code. Most of #248's twelve commits were repairing that.

And what worked: independent review (five parallel reviewers found what four rounds of
self-review had not), deletion as the default remedy, refusing to chase five surviving
mutations in writing rather than silently, and the maintainer's mid-sprint intervention
— after which #248 took twelve commits and #243 took five.

Every figure in the document was produced by a command and re-verified before commit,
which is the rule this arc had to adopt halfway through.

Epic #241.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@Polichinel
Polichinel merged commit d2b4f85 into development Aug 12, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant