Repository navigation
Releases
v0.21.1
Fixed
- Onboard no longer hides a project's
AGENTS.md(#25). Claude Code 2.1.277 and later reads
AGENTS.mdonly when there is noCLAUDE.md, or whenCLAUDE.mdimports it with@AGENTS.md.
Onboard used to create a bareCLAUDE.mdin projects that had onlyAGENTS.md, which silently
dropped their instructions from Claude sessions. It now createsCLAUDE.mdwith the import and
puts the pointer inAGENTS.md, so it loads once. When both files exist without the import,
onboard says so and leaves the choice to you. - Doctor checks the pointer Claude actually loads (#25). The pointer counts in
CLAUDE.md, in
an importedAGENTS.md, or inAGENTS.mdwhen there is noCLAUDE.md. A new WARN fires when
CLAUDE.mdexists and doesn't import an existingAGENTS.md(unless one is a symlink to the
other). Projects onboarded earlier with
both files may see this WARN: add@AGENTS.mdtoCLAUDE.mdif its instructions should apply. - Doc claims (#27). README no longer presents LCD's eval harness as the answer to a field-wide
gap (other frameworks now publish process evals), and explains how Claude Code picks between
CLAUDE.mdandAGENTS.md. Onboard's note on instruction-file research now states the measured
effect (small; developer-written beats LLM-written; both add cost).
Changed
- Skill frontmatter (#28): dropped
user-invocable: truefrom five skills. It is the default,
and the Agent Skills spec's validator rejects fields it doesn't define, so those five now pass it.
redgreen-loopkeepsuser-invocable: false, a Claude Code extension the spec validator still
rejects: that skill stays Claude Code-specific.
v0.21.0
Added
/lcd:vendor [install|update|check]freezes LCD into the current project from a plugin
session, so you no longer have to calllcd-vendor.shby path. It previews with--dry-run,
asks, applies, and runs doctor. On install it offers to set"enabledPlugins": {"lcd@lcd": false}
in the project's.claude/settings.jsonso the plugin and the frozen copy don't both run.
It calls its own plugin's script by path, because with two LCD copies loaded the name on PATH
can resolve to another version.
The frozen copy doesn't carry it (it carries/lcd-updateinstead); a test checks that.
v0.20.1
Fixed
- Edit-boundary hook checks
NotebookEdit, whose path arrives as
tool_input.notebook_path. Before this, notebook edits outside the boundary were allowed. It
also resolves.and..before matching:src/x/../../docs/yis checked asdocs/y,
and a newline in the path can't cut the resolution short (#21). - The AC convention now actually auto-loads (#22). Plugins have no rules component, so the
plugin'sac-conventionnever loaded on its own. Onboard now always writes the project copy
.claude/rules/ac-convention.md. If a copy exists whosepaths:doesn't cover the artifact
root, onboard rewrites that one line. Doctor checks the copy at every root: WARN on the
default root (projects onboarded earlier: re-run/lcd:onboard), FAIL on a custom root as
before. Coverage is judged on thepaths:globs ("<root>/**"), so rootdocsno longer
passes on the stockdocs/lcdglobs. Docs no longer claim the plugin copy auto-loads. - Boundary-hook tests: the fixture's branch switch-back failed silently in a repo with no
commits, so every later case ran with no active work-item and passed without testing anything.
v0.20.0
Vendoring: LCD frozen into a project, so contributors get it by cloning, no plugin install.
Added
bin/lcd-vendor.sh install|update|checkwrites LCD into a project's own.claude/:
skills, commands and agents aslcd-<name>, the engine (scripts, rules, templates) under
.claude/lcd/, hooks and path-based permissions merged into.claude/settings.json(other
keys kept), the CLAUDE.md/AGENTS.md pointer tokens renamed..claude/lcd/VERSIONrecords
the source version and commit;.claude/lcd/MANIFESTthe hash of every managed file.
updaterefuses when a managed file was edited or deleted locally unless--force;
--dry-runprints the plan and the CHANGELOG sections in between. Fixture test:
tests/test-vendor.sh./lcd-update(vendored copies only,templates/vendor/lcd-update.md): fetches the
target release (or uses a local clone), previews with--dry-run, asks, applies, runs doctor.
Notes
- In a vendored copy
ac-conventionsits in.claude/rules/, so itspaths:scope actually
auto-loads it. Plugins have no rules component, so under the plugin it is read on demand.
v0.19.0
T1-5.1: the benchmark re-baselined on the current model tier, with quality as an artifact.
Added
evals/rubric.md— the five-dimension, two-lens (inspection + mutation) quality rubric as
a persisted artifact, andevals/quality/scoring files: one for the T1-5.1 campaign
(claude-fable-5-1) and one applied retroactively to the verifiedclaude-fable-5
workspaces. Quality claims now point at a file, not a transcript.- T1-5.1 campaign conclusion in
evals/results.md: bare $1.41 / Standard $3.33 (2.4×,
evaluator on) / Deep $5.97 (4.2×) on 5.1; quality parity across arms on both tiers (72/72/71
vs 68/70/68 of 75); the closeout evaluator challenged 3 of 6 plugin closeouts, twice on a
real cross-surface parity defect.
Changed
- Eval fixture enables
closeout-evaluator: on, so the opt-in evaluator's cost lands in the
plugin rows instead of being priced at zero (test asserts the key). run-eval.shdefault model isclaude-fable-5-1; rows before 2026-09-04 ran
claude-fable-5and stay comparable only among themselves (D-015). Dry-run test pins the default.- README "Self-measuring" quotes the 5.1 numbers.
v0.18.1
Zero-weight release from the first Fable 5.1 review of the methodology (three-analyst council,
harness D-027): one hook fix and a batch of doc claims brought back in line with their sources.
Fixed
- Boundary hook splits
·- and;-separated EDIT BOUNDARY bullets (bin/lcd-hooklib.sh),
the same class as the v0.15.1 comma fix — a bullet like`a.md` · `b.md`was matched as
one literal path and silently denied every file it listed. Fixture case added (#17).
Changed (docs only)
- Dropped "most work is Quick" (triage SKILL,
docs/why-lcd.md): the dogfood log reads
3 Quick / 12 Standard / 3 Deep and trivial work skips triage by design, so the claim was
neither measured nor measurable. The lanes stand on resumability. - Dropped "denser tokenizer on newer model tiers" (README,
rules/lcd.md,docs/why-lcd.md):
the +30% tokenizer arrived with 4.7 and is shared by Fable 5 and 5.1 — not a tier property. - "~2k tokens to resume" is now stated as a target, not a result (README,
rules/lcd.md, triage
SKILL,docs/why-lcd.md); it has not been measured. - The edit-boundary hook's guarantee is scoped honestly (README,
rules/lcd.md): it sees
Edit/Write-family calls only; Bash-tool edits pass it. Deliberately not extended toBash
(shell parsing either misses cases or over-denies and breaks fail-open). - README "Self-measuring" now publishes the measured numbers with their caveats: Deep ~4.4× and
Standard ~2.1× a bare agent at near-parity single-shot quality (n=3, one fixture,
claude-fable-5); the cross-session half is the open measurement (#16).
v0.18.0 — lean-loop: closeout collapse, triage slimming, standard eval arm
The lean-loop release: a three-reviewer over-engineering audit of the methodology (run from
the dev harness; two independent Opus 5 reviewers plus a Fable fork, cross-examined to
consensus) found the weight concentrated at the loop's finish line and on triage's hot path.
This release removes it, and gives the benchmark the arm the audit said was missing.
Changed
- Closeout is ONE scripted action (
skills/triage/references/closeout.md): the single
lcd-triage-log.sh closeoutappend, with the opt-in evaluator dispatch folded in before it
and the opt-inlcd:reconcilefold after it — no longer a numbered multi-step contract.
--itersis now optional (--lane/--audit/--reroutes/--interventionsstay
mandatory); both closeout line shapes — with and withoutred-green iters— are valid, and
existing logs are never rewritten. - Triage skill slimmed ~1,930 → ~935 words on the every-item path: the three lane
execution bodies moved toskills/triage/references/lanes.md(read only for the routed
lane), the re-routing procedure toreferences/rerouting.md, the worked-examples table
dropped, and the file-count-soft-proxy rationale deduplicated to a pointer atrules/lcd.md. rules/ac-convention.mdslimmed to the format contract (~1,040 → ~660 words on the
auto-load path): the EVAL-coverage / must-not essay now lives in/lcd:specifyand the
worked AC examples in/lcd:test-gen— each at its point of use.
Added
evals/run-eval.sh --triage-routed— the median-lane benchmark arm the T1 campaign
lacked: a frozen prompt (evals/feature-prompt-standard.md, feature paragraph identical to
the Deep arm's) that routes throughlcd:triageinstead of mandating the Deep pipeline and
never names an expected lane; lane-agnosticEVAL-DONEfinish line. Contradicts
--baseline.- Plan
**Test scope:**declaration (template + audit): restricts the audit's
AC-N (SURFACE)test grep to the work-item's own test paths.
Fixed
bin/audit-crosspath.sh: stale foreign AC literals can no longer produce an OK row
when a test-scope is declared — the repo-wide first-match grep (the T1 audit's recorded
false-positive source) is now scoped, with a declared-but-missing scope counting as a miss,
never a fallback. Scope-less plans keep the legacy behavior.bin/lcd-boundary-check.sh:{a,b}boundary entries now match.casepatterns never
brace-expand, so a brace entry could match nothing and silently denied every edit under it
(open since 0.15.1); entries are now brace-expanded (lcd_expand_bracesin
bin/lcd-hooklib.sh) at match time, with the original entry kept in the deny reason.
v0.17.1 — eval isolation repair
Repairs the 0.17.0 isolation contract, found by the independent closeout evaluator refuting the first baseline campaign.
Fixed
--settings '{"enabledPlugins":[]}'was schema-invalid (array vs object map) and silently inert — user-installed plugins still loaded into "baseline" runs. The runner now builds{"<plugin>": false}for every enabled plugin from the operator's real settings, failing closed on unparseable settings or missing jq.- Tests now assert the model call's real argv via a recording stub (no
--plugin-dirin baseline legs; schema-valid disable map in both arms) — replacing printed-plan string checks.
Full changelog: CHANGELOG.md
v0.17.0 — eval baseline arm
The benchmark gains its missing comparison: a bare-agent baseline arm, so "context economy pays" is a measured claim, not an argument.
Added
evals/run-eval.sh --baseline— bare-agent arm: no plugin loads, the workspace copy is stripped of the fixture's methodology onboarding (strip verified fail-closed), driven by a new frozen prompt (evals/feature-prompt-baseline.md) whose feature paragraph is byte-identical to the LCD prompt's (test-enforced), with anEVAL-DONEfinish line.--baseline+--plugin-diris refused as a contradiction.evals/grade.sh --baseline— grades bare workspaces with the identical row shape (audit: n/a); fail-closed both ways. Golden-locked grading criteria unchanged.tests/test-eval-baseline.sh— fixture tests for all of the above.
Changed
- Both eval arms now run config-isolated, symmetrically:
CLAUDE_CONFIG_DIRat a fresh empty dir +--settings '{"enabledPlugins":[]}', so user-level plugins and the personal~/.claude/CLAUDE.mdno longer leak into benchmark runs. The arms differ by exactly one flag:--plugin-dir. Rows recorded before this isolation are not comparable with rows after it.
Full changelog: CHANGELOG.md
v0.16.0 — best-practices review fixes
From a full review of the plugin's prompt surfaces against Anthropic's current published guidance. Highlights — see CHANGELOG for the full list:
- Fixed: dead logic in the triage risk-signal definition — the one operative risk signal (multi-session cold-pickup) is now stated plainly in all three places the rule appears.
- Changed: the closeout contract lives once in
skills/triage/references/closeout.md, loaded at the finish line; the Standard-lane audit gets its own path in/lcd:audit, including an explicit BLOCKED branch andPASS (test-presence)in the result vocabulary. - Added:
bin/lcd-triage-log.sh— the machine-read triage log's write side is now a validating script (fixture-tested).
PR: #11