Claudinite growth: dedup local packs against the canon - #86
Merged
Conversation
Strip two portable rule restatements from the local packs' module headers — the twins of the two README lines PR #71's dedup run pruned, left behind in the .mjs files it didn't reach. - laughcounter/pack.mjs: drop the local promotion-ladder clause ("anything deterministic enough to check belongs in `rules` instead, and should move there when it appears"). Canon owns it: packs/basics/RULES.md:11 routes a rule "through the mechanism promotion ladder (platform setting -> hook -> check -> skill -> prose)", and growth-extract/task.md:23 spells the local form: "a deterministic rule becomes a check in that pack's `rules` ... and only what neither can carry lands as terse prose in the pack's RULES.md". Residue kept: this pack carries prose only for now. - on-device-privacy/pack.test.mjs: drop the restated isolation rule ("because a consumer file outside .claudinite/ may not reference into it"), keeping the pointer in the pack's own `(claudinite-isolation)` convention. The canon check enforces it: rule id `claudinite-isolation` -- "Outside the wiring files ..., nothing may reference .claudinite/". Refs #85
This was referenced Jul 30, 2026
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.
Growth-dedup run for #85. The dispatch carried no Context block, so the yardstick was the whole mounted canon (
.claudinite/shared/**prose + thecheck_the_world.mjs --listrule catalog), and the prune surface was both local packs in full:laughcounterandon-device-privacy(README.md,RULES.md,pack.mjs, the three check.mjs,pack.test.mjs).Two strips. Both are the twins of the two README lines PR #71's dedup run already pruned, left behind in the
.mjsmodule headers that run didn't reach — the same portable rule, restated in the same pack.1.
laughcounter/pack.mjs— the local promotion-ladder clauseRemoved: "— anything deterministic enough to check belongs in
rulesinstead, and should move there when it appears". Residue kept:It carries prose only for now.Covered by canon, chapter and verse:
packs/basics/RULES.md:11— a durable rule lands "routed through the mechanism promotion ladder (platform setting → hook → check → skill → prose)".packs/grow_with_claudinite/tasks/growth-extract/task.md:23— the local form verbatim: "run the local promotion ladder: a deterministic rule becomes a check in that pack'srules… and only what neither can carry lands as terse prose in the pack'sRULES.md."The canon also owns the doing of it (
prose-to-checks-sweep), so nothing depends on the local pack reminding itself. This is the exact sentence #71 pruned from this pack'sREADME.md("The promotion ladder still applies: anything deterministic enough to decide mechanically becomes a check inpack.mjs'srules…").2.
on-device-privacy/pack.test.mjs— the restated isolation ruleRemoved: "because a consumer file outside
.claudinite/may not reference into it (the claudinite-isolation barrier)". Residue kept, in the convention #71 established for this pack's README:They live here rather than in tests/ (`claudinite-isolation`).Covered by a canon check, which is stronger than prose — rule id
claudinite-isolation(blocking): "Outside the wiring files (.claude/,.gitignore,.gitattributes,.github/workflows/, the settings file), nothing may reference.claudinite/— CLAUDE.md included." The local wording is the general rule in local dress and is in fact looser than the check (it omits the wiring exceptions), so it says nothing the check leaves out. The pointer survives, so the reason the fixtures live in the pack is still one grep away. Same sentence #71 reduced to(claudinite-isolation)inREADME.md.Kept, deliberately
laughcounter/RULES.md— "don't prune a.gitignoresection while its artifacts are still in the worktree". No canon line touches ignore rules or untracked artifacts; the nearest canon items (repo-text-sweeps"deleting a file isn't done until you've grepped for inbound references", git-github-advanced "an automated commit-nag is not authorization to commit drift") make different points. Its tail — readgit diff --cached --statafter a bulkgit add -A, because a cleangit statusstops reporting staged additions — is stronger than the canon's "inspectgit status/git diff".on-device-privacy/RULES.md(metadata-not-audio, one deletable directory, no egress at all, no server/listener, usage strings stay true) and all three checks. The canon corpus and rule catalog carry nothing about audio, microphones, on-device inference, egress, or user-facing privacy disclosures — these assert narrower, stronger things with no canon counterpart.// Dependency-free by design (a local pack must load without the canon mount)comments in the three check modules.generate-project-instructions/SKILL.md:157does state the rule, but these are at-site rationale for why the file hand-builds findings instead of importing the engine helper — removing them invites the next reader to "fix" it, and the canon endorses a site-local gotcha comment (extracting-lessons.md).Verification
node --test .claudinite/local/packs/on-device-privacy/pack.test.mjs— 7/7 pass.node .claudinite/shared/engine/checks/check_the_world.mjs— exit 0, no findings..claudinite/shared/**was touched.Human approval gate — do not auto-merge (this task's outcome ceiling is
open-pr). Either strip is cheap to reject independently.🤖 Generated with Claude Code
https://claude.ai/code/session_0154hfoHbyLcKSqGpo3kKKc6
Generated by Claude Code