Skip to content

Releases

v0.21.1

Choose a tag to compare

@stid stid released this 09 Nov 04:36
df9da11

Fixed

  • Onboard no longer hides a project's AGENTS.md (#25). Claude Code 2.1.277 and later reads
    AGENTS.md only when there is no CLAUDE.md, or when CLAUDE.md imports it with @AGENTS.md.
    Onboard used to create a bare CLAUDE.md in projects that had only AGENTS.md, which silently
    dropped their instructions from Claude sessions. It now creates CLAUDE.md with the import and
    puts the pointer in AGENTS.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 imported AGENTS.md, or in AGENTS.md when there is no CLAUDE.md. A new WARN fires when
    CLAUDE.md exists and doesn't import an existing AGENTS.md (unless one is a symlink to the
    other). Projects onboarded earlier with
    both files may see this WARN: add @AGENTS.md to CLAUDE.md if 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.md and AGENTS.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: true from 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-loop keeps user-invocable: false, a Claude Code extension the spec validator still
    rejects: that skill stays Claude Code-specific.

v0.21.0

Choose a tag to compare

@stid stid released this 09 Nov 04:36
e4c59cc

Added

  • /lcd:vendor [install|update|check] freezes LCD into the current project from a plugin
    session, so you no longer have to call lcd-vendor.sh by 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.json so 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-update instead); a test checks that.

v0.20.1

Choose a tag to compare

@stid stid released this 25 Oct 00:10
a2e73cb

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/y is checked as docs/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's ac-convention never loaded on its own. Onboard now always writes the project copy
    .claude/rules/ac-convention.md. If a copy exists whose paths: 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 the paths: globs ("<root>/**"), so root docs no longer
    passes on the stock docs/lcd globs. 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

Choose a tag to compare

@stid stid released this 24 Oct 19:06
9559bdd

Vendoring: LCD frozen into a project, so contributors get it by cloning, no plugin install.

Added

  • bin/lcd-vendor.sh install|update|check writes LCD into a project's own .claude/:
    skills, commands and agents as lcd-<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/VERSION records
    the source version and commit; .claude/lcd/MANIFEST the hash of every managed file.
    update refuses when a managed file was edited or deleted locally unless --force;
    --dry-run prints 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-convention sits in .claude/rules/, so its paths: scope actually
    auto-loads it. Plugins have no rules component, so under the plugin it is read on demand.

v0.19.0

Choose a tag to compare

@stid stid released this 04 Sep 21:32
b136539

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, and evals/quality/ scoring files: one for the T1-5.1 campaign
    (claude-fable-5-1) and one applied retroactively to the verified claude-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.sh default model is claude-fable-5-1; rows before 2026-09-04 ran
    claude-fable-5 and stay comparable only among themselves (D-015). Dry-run test pins the default.
  • README "Self-measuring" quotes the 5.1 numbers.

v0.18.1

Choose a tag to compare

@stid stid released this 04 Sep 19:02
98feb66

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 to Bash
    (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

Choose a tag to compare

@stid stid released this 30 Aug 17:10
cf5a1a1

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 closeout append, with the opt-in evaluator dispatch folded in before it
    and the opt-in lcd:reconcile fold after it — no longer a numbered multi-step contract.
    --iters is now optional (--lane/--audit/--reroutes/--interventions stay
    mandatory); both closeout line shapes — with and without red-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 to skills/triage/references/lanes.md (read only for the routed
    lane), the re-routing procedure to references/rerouting.md, the worked-examples table
    dropped, and the file-count-soft-proxy rationale deduplicated to a pointer at rules/lcd.md.
  • rules/ac-convention.md slimmed to the format contract (~1,040 → ~660 words on the
    auto-load path): the EVAL-coverage / must-not essay now lives in /lcd:specify and 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 through lcd:triage instead of mandating the Deep pipeline and
    never names an expected lane; lane-agnostic EVAL-DONE finish 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. case patterns 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_braces in
    bin/lcd-hooklib.sh) at match time, with the original entry kept in the deny reason.

v0.17.1 — eval isolation repair

Choose a tag to compare

@stid stid released this 29 Aug 01:16
d234408

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-dir in baseline legs; schema-valid disable map in both arms) — replacing printed-plan string checks.

Full changelog: CHANGELOG.md

v0.17.0 — eval baseline arm

Choose a tag to compare

@stid stid released this 23 Aug 00:37
ca41b35

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 an EVAL-DONE finish line. --baseline + --plugin-dir is 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_DIR at a fresh empty dir + --settings '{"enabledPlugins":[]}', so user-level plugins and the personal ~/.claude/CLAUDE.md no 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

Choose a tag to compare

@stid stid released this 22 Aug 07:09
30db105

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 and PASS (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