Skip to content

docs: single source of truth in the honesty rules (ADR 0022)#18

Merged
vpciii merged 2 commits into
mainfrom
docs/single-source-of-truth
Jun 20, 2026
Merged

docs: single source of truth in the honesty rules (ADR 0022)#18
vpciii merged 2 commits into
mainfrom
docs/single-source-of-truth

Conversation

@vpciii

@vpciii vpciii commented Jun 20, 2026

Copy link
Copy Markdown
Owner

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

A fact lives in one place. If it must exist in two — a generated artifact, a mirrored summary, a copy a tool requires — the copy is generated from or machine-checked against the source, never kept in sync by memory. Duplication of a hand-maintained fact is a review smell.

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

  • New ADR 0022.
  • methodology.md "Keep the artifacts honest" gains the item; the global-CLAUDE.md and methodology.mdc summaries updated in the same PR (ADR 0018).
  • CHANGELOG cut to 0.11.0 (rolls in the already-merged adversarial-review trial entry).

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; copy templates/global-CLAUDE.md~/.claude/CLAUDE.md (ADR 0018).

🤖 Generated with Claude Code

…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

claude Bot commented Jun 20, 2026

Copy link
Copy Markdown

Claude finished @vpciii's task in 2m 18s —— View job


Review — single source of truth (ADR 0022)

  • Read governing artifacts (ADRs 0018/0020/0021, methodology.md, CHANGELOG)
  • Review diff against this project's standards
  • Check doc↔doc consistency (the PR's own subject)
  • Post review

The mechanics are clean: ADR 0022 numbers correctly (0021 was the prior max), Status: Accepted / Deciders: vpc match house style, dates line up (ADR + 0.11.0 both 2026-06-20), the CHANGELOG is well-formed (compare links correct, adversarial-review entry rolled into 0.11.0 as the body states), and the conventional-commit docs: is right. The three mirrors — methodology.md, global-CLAUDE.md, methodology.mdc — are updated in the same PR and say the same thing, so the change practices ADR 0018 on itself. One substantive thing to resolve before merge.

The new rule indicts the methodology's own flagship mirror

methodology.md:145-150 lists "a mirrored summary" as a sanctioned second location, then requires that the copy be "generated from or machine-checked against the source, never kept in sync by memory."

But the methodology's own mirrored summary — templates/global-CLAUDE.md vs methodology.md — is exactly "kept in sync by memory." ADR 0018 rejected generating it and binds it solely by same-PR editorial discipline:

0018, Alternatives considered (lines 50–55): "Generate the summary from methodology.md — rejected: the summary is a curated abridgment … If drift recurs despite the same-PR rule, revisit as a CI check … not a generator."

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:

  1. ADR 0022 contradicts accepted ADR 0018. The References section calls 0018 "the global summary as a generated/mirrored copy — the principle already in practice." It is not generated — 0018 explicitly rejected generation. As written, the new ADR cites 0018 as evidence for a property 0018 declined to adopt. (adr/0022-single-source-of-truth.md, References)

  2. The absolutist wording over-reaches. "never kept in sync by memory" makes global-CLAUDE.md, methodology.mdc, and the deployed ~/.claude/CLAUDE.md review smells under the methodology's own rule. The "mild tension" paragraph in Consequences only covers convenience value-copies ("a self-contained doc that repeats a value for readability"), not same-PR-bound mirrors — the central case.

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>
vpciii added a commit that referenced this pull request Jun 20, 2026
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>
@vpciii vpciii merged commit 6c139b4 into main Jun 20, 2026
@vpciii vpciii deleted the docs/single-source-of-truth branch June 20, 2026 16:26
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