Tier-2 CLAUDE_MD_CHARTER_PATH has no production caller — ADR-0062's CLAUDE.md-only catalog may never load #166

Open
opened 2026-07-27 16:45:18 +00:00 by jared · 1 comment
Owner

Problem

AiddLint::Tier2::Judge::CLAUDE_MD_CHARTER_PATH (lib/aidd_lint/tier2/judge.rb:16) points at references/tier2-claude-md-charter.md, the ADR-0062 supplementary catalog scoped to the CLAUDE.md artifact class (contradictory-rules, non-load-bearing-content). It is selected via the charter_path: keyword on Judge#initialize.

Nothing in production ever passes that keyword. All three production construction sites default it:

bin/aidd-lint:68:  AiddLint::Tier2::Judge.new(config).prompt_for(document)
bin/aidd-lint:88:  AiddLint::Tier2::Judge.new(config, invoker: invoker).run(document)
bin/aidd-lint:119: AiddLint::Tier2::Judge.new(config).run(document) if tier2

So @charter_path is always CHARTER_PATH, and the CLAUDE.md-only entries appear to never reach a live judge. ADR-0062's basename gate ("gated by artifact class/basename", per judge.rb's own comment at :17-21) looks unimplemented — the constant and the seam exist, the dispatch does not.

What I verified

  • grep -rn "CLAUDE_MD_CHARTER_PATH" across the whole plugin (lib/, bin/, hooks/, skills/, tests/, references/, agents/): matches are judge.rb:16 (the definition), judge.rb:18 (a comment), and five call sites in tests/tier2/judge_test.rb. No production caller.
  • grep -rn "Judge.new" across bin/, lib/, hooks/: the three sites above, none passing charter_path:.
  • grep -rn for CLAUDE_MD_CHARTER_PATH/tier2-claude-md-charter across the rest of the repo outside the plugin: only prose mentions in docs/adr/0063-*.md, no code.

What I did NOT verify

  • Whether some other entry point (a hook payload path, a skill-driven invocation, an external consumer) constructs a Judge in a way my greps missed — I grepped for the literal Judge.new only, not for reflective or indirect construction.
  • Whether this is deliberate deferral. ADR-0063 line 27 describes "the existing CHARTER_PATH / CLAUDE_MD_CHARTER_PATH pair" as though selection were wired, and judge_test.rb:329-334 carries a NOTE about charter_path: being "left as open wiring, not fixed here" — so this may be known and intentionally parked rather than a regression. A maintainer should confirm intent before anyone wires it up.

Why it matters

If confirmed, two catalog entries admitted by ADR-0062 have never judged a real file, and any validation study or recall claim resting on them is unfounded. The tests pass because they construct the Judge with charter_path: explicitly — exactly the path production never takes, so the suite cannot catch this.

Suggested resolution

Either wire the basename gate (select CLAUDE_MD_CHARTER_PATH when the subject's basename is CLAUDE.md/CLAUDE.local.md, per ADR-0062) and add a test asserting the selection happens through the production entry point, or record explicitly that ADR-0062's dispatch is deferred and mark the entries as not-yet-live.

Provenance

Found while implementing #164 (Tier-2 cross-file authority sources); deliberately not fixed there, since wiring an unrelated ADR's dispatch under a charter-amendment ticket would have been scope creep. Filed as decision-needed, not as agreed work.

### Problem `AiddLint::Tier2::Judge::CLAUDE_MD_CHARTER_PATH` (`lib/aidd_lint/tier2/judge.rb:16`) points at `references/tier2-claude-md-charter.md`, the ADR-0062 supplementary catalog scoped to the CLAUDE.md artifact class (`contradictory-rules`, `non-load-bearing-content`). It is selected via the `charter_path:` keyword on `Judge#initialize`. Nothing in production ever passes that keyword. All three production construction sites default it: ``` bin/aidd-lint:68: AiddLint::Tier2::Judge.new(config).prompt_for(document) bin/aidd-lint:88: AiddLint::Tier2::Judge.new(config, invoker: invoker).run(document) bin/aidd-lint:119: AiddLint::Tier2::Judge.new(config).run(document) if tier2 ``` So `@charter_path` is always `CHARTER_PATH`, and the CLAUDE.md-only entries appear to never reach a live judge. ADR-0062's basename gate ("gated by artifact class/basename", per judge.rb's own comment at :17-21) looks unimplemented — the constant and the seam exist, the dispatch does not. ### What I verified - `grep -rn "CLAUDE_MD_CHARTER_PATH"` across the **whole plugin** (`lib/`, `bin/`, `hooks/`, `skills/`, `tests/`, `references/`, `agents/`): matches are judge.rb:16 (the definition), judge.rb:18 (a comment), and five call sites in `tests/tier2/judge_test.rb`. No production caller. - `grep -rn "Judge.new"` across `bin/`, `lib/`, `hooks/`: the three sites above, none passing `charter_path:`. - `grep -rn` for `CLAUDE_MD_CHARTER_PATH`/`tier2-claude-md-charter` across the **rest of the repo** outside the plugin: only prose mentions in `docs/adr/0063-*.md`, no code. ### What I did NOT verify - Whether some other entry point (a hook payload path, a skill-driven invocation, an external consumer) constructs a Judge in a way my greps missed — I grepped for the literal `Judge.new` only, not for reflective or indirect construction. - Whether this is deliberate deferral. ADR-0063 line 27 describes "the existing CHARTER_PATH / CLAUDE_MD_CHARTER_PATH pair" as though selection were wired, and `judge_test.rb:329-334` carries a NOTE about `charter_path:` being "left as open wiring, not fixed here" — so this may be known and intentionally parked rather than a regression. **A maintainer should confirm intent before anyone wires it up.** ### Why it matters If confirmed, two catalog entries admitted by ADR-0062 have never judged a real file, and any validation study or recall claim resting on them is unfounded. The tests pass because they construct the Judge with `charter_path:` explicitly — exactly the path production never takes, so the suite cannot catch this. ### Suggested resolution Either wire the basename gate (select `CLAUDE_MD_CHARTER_PATH` when the subject's basename is `CLAUDE.md`/`CLAUDE.local.md`, per ADR-0062) and add a test asserting the selection happens *through the production entry point*, or record explicitly that ADR-0062's dispatch is deferred and mark the entries as not-yet-live. ### Provenance Found while implementing #164 (Tier-2 cross-file authority sources); deliberately not fixed there, since wiring an unrelated ADR's dispatch under a charter-amendment ticket would have been scope creep. Filed as decision-needed, not as agreed work.
Author
Owner

Frozen in the 2026-08-16 backlog reset — see #419 for the expiry procedure. Do not work unless a live run rediscovers this issue.

Frozen in the 2026-08-16 backlog reset — see #419 for the expiry procedure. Do not work unless a live run rediscovers this issue.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#166
No description provided.