docs: single source of truth in the honesty rules (ADR 0022)#18
Conversation
…t 0.11.0 The "keep artifacts honest" rules bound code↔doc coupling but never named duplication — one fact hand-copied into two places that drift. A real incident in a consuming project (a scheduled-task prompt duplicated between its canonical skill and a setup-guide template) drifted unnoticed by the same-PR rule, the same-model reviewer, and CI; a cross-model adversarial review caught it retrospectively. Add a "single source of truth" item: a fact lives in one place; an unavoidable second copy is generated from or machine-checked against the source, never synced by memory. Duplication of a hand-maintained fact is a named review smell. The methodology already practices this for its own mirrored summaries (ADR 0018); this states the principle so consuming projects have a guard. Updates methodology.md, the global-CLAUDE.md and methodology.mdc summaries (same PR, ADR 0018), and the changelog (rolls the adversarial-review trial into 0.11.0 alongside). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Claude finished @vpciii's task in 2m 18s —— View job Review — single source of truth (ADR 0022)
The mechanics are clean: ADR 0022 numbers correctly (0021 was the prior max), The new rule indicts the methodology's own flagship mirror
But the methodology's own mirrored summary —
So the one example the rule names as legitimate ("a mirrored summary") is, in this repo, synced by precisely the mechanism the rule forbids. Two concrete consequences:
This is on-topic, not pedantic: it's the same doc↔doc reasoning the PR is about, applied to the PR itself. Suggested resolution — name the third sync mechanism the methodology already relies on. The honest set is generated, machine-checked, or bound by the same-PR honesty rule (ADR 0018/0020). Something like: "…the copy is generated from, machine-checked against, or bound to the source in the same PR (ADR 0018) — never left to drift between PRs." Then fix the 0022 reference to drop "generated" for 0018 (it's a same-PR-mirrored copy, with a CI equality check held in reserve). Fix this → Everything else checks out. Your call on whether to tighten the wording or accept the residual tension explicitly — but as written the ADR states something ADR 0018 declined, so at minimum the "generated" reference to 0018 should go. |
A cross-model adversarial review of the first draft (round 3, BLOCK) caught that the absolute rule "duplicate copies are generated or machine-checked, never synced by memory" outlawed the methodology's own flagship practices: global-CLAUDE.md / methodology.mdc are hand-synced curated summaries (ADR 0018, which explicitly rejected generating them as ceremony), and every consuming project's CLAUDE.md / CONTRIBUTING.md is a hand-customized template copy (ADR 0009). Scope the rule to the actual hazard — hand-maintained *verbatim* copies meant to stay identical, kept in sync by memory (the opn-mcp prompt case). Carve out deliberate *derivatives* (curated summaries, instantiated templates, small readability repetition): intentionally not identical, so equality-checking doesn't apply; kept honest by the same-PR rule instead. Also fixes a mischaracterization in the original References (it called global-CLAUDE.md "generated" — it is hand-synced, which was the bug). Commits the round-3 review record under docs/reviews/. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Third data point and the strongest: a design-mode review (agy CLI) of the single-source ADR (PR #18) returned a BLOCK that held up — the drafted rule contradicted the methodology's own hand-synced summaries (ADR 0018) and per-project templates (ADR 0009). A self-consistency hole the author model and a same-model review would likely have merged; resolved by scoping the rule. 3 runs / 2 repos / 2 real BLOCKs / 0 false positives — approaching the graduation threshold. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Summary
Names the single source of truth principle in the "keep the artifacts honest" rules — the gap the opn-mcp drift incident exposed. Cuts 0.11.0.
The honesty rules bound code↔doc coupling (docs change in the same PR) but never named doc↔doc / code↔code duplication — one fact hand-copied into two places that drift. That's exactly how the opn-mcp scheduled-task prompts went stale: a canonical skill and a setup-guide template duplicated the same prompt; an update touched only one. The same-PR rule didn't fire, the same-model reviewer (ADR 0021) missed it, CI had nothing to check — the cross-model adversarial review caught it retrospectively.
The rule
The methodology already practices this for its own mirrors (
global-CLAUDE.md, the.mdc; ADR 0018) — this states the principle so consuming projects have a guard to apply.Changes
methodology.md"Keep the artifacts honest" gains the item; theglobal-CLAUDE.mdandmethodology.mdcsummaries updated in the same PR (ADR 0018).Adoption: reference-only; optionally add an equality/codegen check where a project has known duplication. Forward-only.
Companion: the concrete instance — single-sourcing the opn-mcp scheduled-task prompts — ships as its own ADR + PR in that repo.
Post-merge: tag
v0.11.0; copytemplates/global-CLAUDE.md→~/.claude/CLAUDE.md(ADR 0018).🤖 Generated with Claude Code