fix: re-extract sticky v2 canonical copy from ADR 0030 §9 — heals red main#4
Merged
Conversation
… main PR #3 mounted the v2 sticky (Seven Pillars) into the kit's own CLAUDE.md but left the packaged canonical data file at v1, so cf-sticky-check graded the mounted v2 block ABSENT and self-ci went red on main. Re-extracted the v2 block byte-faithful (fence lines excluded) from canon ADR 0030 §9 into src/cf_quality/data/sticky-intro.md; refreshed the SOURCE.md provenance (parent now ADR 0030 §9, lineage note keeps ADR 0029 — history is sacred; new content sha recorded). MIRROR_HEADER now writes the ratified 'ADR 0029 + ADR 0030' one-liner; tests that pinned the v1 sha, the v1 header, and v1 phrases re-anchor to v2. Stale ADR 0029-only provenance strings in README, the package docstring, and the self-ci mirror notice updated to match. Full self-ci battery green locally (310 passed; cf-sticky-check check . exits 0 on the repo itself). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Root cause
Merged PR #3 replaced the sticky block in the kit's own
CLAUDE.mdwith the v2 text (the Seven Pillars), but did NOT update the canonical packaged data filesrc/cf_quality/data/sticky-intro.md, which still carried the v1 text.canonical_text()loads that data file viaimportlib.resourcesand compares byte-identical (line-ending normalization only), so the gate held v1 as canonical and graded the mounted v2 blockSTICKY_INTRO_ABSENT—self-cion main (c2c7765) is red at thecf-sticky-check check .step. ADR 0030 (the Seven Pillars ADR, ratified 2026-06-11) is the canon parent; per the declared-mirror convention insticky-intro.SOURCE.md('update the canon first, then re-extract here'), the canon was updated — this PR is the re-extraction.What changed
src/cf_quality/data/sticky-intro.md— re-extracted programmatically and byte-faithful (content between the ```markdown fence and the closing fence, exactly; fences excluded) from candyfactory-canondecisions/0030-bubblegum-v2-seven-pillars.md§9 at canon main `00d6822`.src/cf_quality/data/sticky-intro.SOURCE.md— provenance: parent is now ADR 0030 §9; lineage note keeps ADR 0029 (its body retains the v1 copy, immutable, as history); extraction date 2026-06-11; new content sha recorded.src/cf_quality/sticky_check.py—MIRROR_HEADERnow writes the ratifiedADR 0029 + ADR 0030one-liner (matches the header PR DO-NOT-MERGE · BubbleGum v2 sticky — awaits ADR 0030 ratification #3 merged into the kit's own CLAUDE.md).tests/test_sticky_check.py—DECLARED_SHA256re-anchored to the v2 content hash; the header pin test updated; the two tamper fixtures re-anchored from v1-only phrases (≤ 500\n→≤ 500 lines,Budgets, not vibes:→Budgets come from) with an added must-differ assert so a silent no-op replace can never fake a tamper fixture again.README.md,src/cf_quality/__init__.pydocstring, theself-ci.ymlmirror-skip notice.Byte-faithfulness proof
sha256(src/cf_quality/data/sticky-intro.md)=7dc04712c33f98318563bb2a1b9e60c753b83e257ed5aa403c406911d7d45e07(raw bytes == LF-normalized; same convention as the v1 recording, verified against the v1 blob:11e941b1…).CLAUDE.md(everything below the one-line mirror header). Verified programmatically; zero diff.Verification — the full self-ci battery, locally, in order (fresh venv,
pip install -e '.[dev]'+ pyyaml)ruff check .ruff format --check .cf-sticky-check check .cf-file-budget checkcf-mirror-checkcf-recursion-check srccf-exemptionscf-import-contract --root .mypy srcpytestPre-registration (the CandyFactory Method)
Prediction:
self-cigoes green on this branch. Anchor: the local run of the identical battery above, every step green. Main's redself-cirun atc2c7765is the failing oracle this PR is predicted to flip.Open items for the maintainer
checkas TAMPERED/ABSENT against the v2 canonical until re-mounted — that is the ratchet working as designed, but the re-mount wave is not this PR.checkmode never reads the mirror header, so consumers carrying the oldADR 0029-only header are NOT broken by theMIRROR_HEADERconstant change (it only affects what futuremountwrites); no consumer-breaking logic was touched.DESIGN.md§1 still says the mirror parent is 'ADR 0029's fenced block' — left untouched here (history-flavored design narrative); flag if you want it refreshed in the same docs pass.🤖 Generated with Claude Code