Commit Graph
548 Commits
Author SHA1 Message Date
Addy Osmani 80b30f044a Merge #587: clear stale grading and record run identity in evals 2026-09-20 12:26:45 -07:00
Addy Osmani 3ee24fa300 Merge #496: add reference-led UI finish checks to frontend-ui-engineering 2026-09-20 12:23:27 -07:00
Addy Osmani 3c3184d1d6 Merge #497: interview-me stops the turn on intent confirmation 2026-09-20 12:23:23 -07:00
mavericksea-aiandClaude Opus 4.6 4eb29c10e4 refactor(evals): extract clearGradingSlot and test the production path
Extract the two fs.rmSync calls into clearGradingSlot(base), export it,
and call it from runBehavioral. Rewrite both slot-clearing tests to call
clearGradingSlot instead of inlining fs.rmSync, so each test exercises
the production cleanup path and fails if the call is removed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-09-21 02:52:39 +08:00
mavericksea-aiandClaude Opus 4.6 eb96f0c9fb fix(evals): clear result slot up front instead of on rejection
Move stale-file cleanup from persistGradingOutcome (which only ran on
rejected grading) to the top of each eval iteration, before the executor
is invoked.  Both ${base}.grading.json and ${base}.grading.raw.txt are
removed with fs.rmSync(p, { force: true }), which ignores a missing file
but still throws on a permissions error.

This closes three gaps at the source:
- The bare catch around unlinkSync swallowed EACCES alongside ENOENT.
- An executor or grader crash skipped persistGradingOutcome entirely,
  leaving the previous run's .grading.json intact.
- A successful grading left a stale .grading.raw.txt from a prior
  rejected run beside the new .grading.json.

persistGradingOutcome now only writes, never deletes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-09-21 02:42:48 +08:00
mavericksea-ai ee7fd58a93 fix(evals): record executor model and timestamp in grading.json
Each .grading.json now carries a run object with executor_model,
grader_model, and timestamp so results can be attributed to a
specific model version and point in time.

The executor model is read from the init event of the stream-json
output that the executor already produces (type "system",
subtype "init", top-level model field). The grader model is recorded
as "unknown": the grader is a bare `claude -p` whose output
parseGrading extracts by regex, so switching it to stream-json would
break parsing, and adding --model is a behaviour change that does
not belong in a recording fix.
2026-09-21 02:10:21 +08:00
mavericksea-ai f646694706 fix(evals): remove stale grading.json when grading is rejected
RESULTS_DIR is only ever created and never cleared, and the output
path is derived from skill name and eval id alone. When a run's
grading is rejected (parseGrading returns null), the runner writes
.grading.raw.txt but leaves any .grading.json from a previous
successful run in place. A collector reading that directory gets the
old score beside the raw output of the run that actually happened.

Extract persistGradingOutcome so the write-and-cleanup is a testable
unit, and unlink the stale .grading.json before writing the raw file.
2026-09-21 02:09:04 +08:00
Addy Osmani c004a74784 chore(release): bump plugin manifests to 0.6.10 0.6.10 2026-09-17 20:32:15 -07:00
Addy Osmani 4876585989 Merge #578: expand current file on simplify-ignore Stop to prevent data loss 2026-09-17 20:29:09 -07:00
Addy Osmani 2a96fb8c8a Merge #510: fix and CI-wire the SessionStart envelope test 2026-09-17 20:29:05 -07:00
Addy Osmani 61d0ca6e47 Merge #574: stop the plugin auto-injecting the meta-skill on SessionStart (#569) 2026-09-17 20:29:00 -07:00
Addy Osmani a120596f6d Merge #545: add authoring rule against model-specific workarounds 2026-09-17 16:38:02 -07:00
Addy Osmani e79ff3bb0d Merge #517: exempt fenced examples from the references link check 2026-09-17 16:37:57 -07:00
Addy Osmani b9f7706a18 Merge #573: make reference-link assertion portable on Windows 2026-09-17 16:37:53 -07:00
Addy Osmani e77fed035b Merge #568: strip every CommonMark fence form in skill-lint 2026-09-17 16:37:48 -07:00
Addy Osmani 6a3c7d692c Merge #576: bind grader results to declared expectations by id 2026-09-17 16:37:43 -07:00
Addy Osmani 92028277c7 Merge #570: fix stale skill count in README heading 2026-09-17 16:37:39 -07:00
mavericksea-aiandClaude Opus 5 510259aca0 fix(hooks): keep the rewrite in the cache when simplify-ignore falls back
When a Stop leaves no BLOCK_ placeholder to expand, the hook has to restore
the backup to recover the protected block — which overwrote whatever had
replaced the file. Copy that content into the cache as <id>.recovered first
and name both paths in the warning, so the rewrite is merged back by hand
rather than lost.

Adds a test that the fallback keeps the rewritten content in the cache, and
a minimal lifecycle test (Read, a direct write with no event, Stop) asserting
the write survives.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 01:59:59 +00:00
mavericksea-aiandClaude Opus 5 b1ac22c7d2 fix(hooks): expand simplify-ignore files at Stop instead of restoring backups
The Stop branch restores every cached file from its backup, but that
backup is written on PreToolUse Read and refreshed only by the
PostToolUse Edit|Write branch. A change made to a filtered file through
any other route between Read and Stop — a Bash command, a formatter, an
external editor — is overwritten at session end. Reproduced in #295:
Bash wrote const editable = 2 and read it back, Stop left const
editable = 1 on disk, with no crash and no failed tool call.

The hook protects the content of an annotated block, not the file: the
header documents the backup as holding the model's changes, and Edit and
Write already preserve them. So Stop now runs the same placeholder
expansion the Edit|Write branch runs, against the file as it is on disk.
Whatever wrote the file wrote its filtered form with the placeholders
intact, so expanding it restores the protected blocks and keeps the
change, whichever route it came from.

The expansion body moves into an expand_file function that both branches
call, so the fuzzy-match and deleted-block warnings apply at Stop too.
When no cached BLOCK_<hash> is left, the file was rewritten wholesale and
the hook cannot place the block; it falls back to the backup as before,
now with a warning instead of in silence. That residual is documented in
SIMPLIFY-IGNORE.md. With no outside write, expansion reproduces the
backup exactly, so Read→Stop and Read→Edit→Stop are byte-identical.

Test 11 drives the real hook through Read, an Edit event, a write with no
event after it, and Stop; it fails at be4e44a on the two assertions for
the lost write. Suite: 28 passed, 0 failed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 01:35:47 +00:00
mavericksea-aiandClaude Opus 5 0c497ba10f fix(evals): canonicalize expectation text and recompute pass_rate
Two hardening changes to parseGrading:

- Once a result's id is validated, overwrite its text with the declared
  expectation at that index. The id is the binding, so a grader that
  paraphrases an expectation no longer leaks its own wording into the
  saved grading report.
- Stop rejecting a grading whose summary.pass_rate disagrees with the
  counters. pass_rate is derived, not an independent observation, so a
  rounded or mis-divided value is now recomputed from the validated
  results instead of discarding the run. The integer counters
  (passed/failed/total) remain exact-match checks.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 01:19:15 +00:00
mavericksea-ai 13cd6a6d02 fix(evals): bind grader results to declared expectations by id
parseGrading accepted any result set whose length matched the expected count, without verifying that each result corresponded to a declared expectation. A grader could return duplicates, omit an expectation, or include results for undeclared expectations and still pass validation.

parseGrading now takes the full expectations array, requires each result to carry an integer id in 1..n matching the numbered expectations in the prompt, rejects duplicates and out-of-range ids, and derives pass_rate from the validated counters. The grader prompt requests the id field and the call site in runBehavioral is updated.

Five tests added: reordered-but-complete results, duplicate ids, out-of-range ids, omitted expectations, untrusted pass_rate.
2026-09-16 01:00:33 +00:00
dajiaohuang ef66f42509 test: normalize reference validator paths
Signed-off-by: dajiaohuang <mikewushuwen@outlook.com>
2026-09-16 07:57:15 +08:00
Santhi Prakash a598aab8d6 fix(hooks): stop auto-injecting the meta-skill on SessionStart (#569)
The plugin's SessionStart hook injected using-agent-skills/SKILL.md as
additionalContext on every session. Claude Code already discovers and
routes skills from their descriptions, so the hook stacks a second
router on the native one — the pattern docs/getting-started.md warns
against ("That creates two routers for the same task"), measured at
~3.5k wasted cache-creation tokens per session in #569.

Delete hooks/hooks.json (the registration; the plugin now ships no
hooks) and keep hooks/session-start.sh as a standalone script for hosts
without native skill routing, matching the fix shape suggested in the
issue. Update the hook header, CONTRIBUTING.md, codex-setup.md, and
gemini-cli-setup.md to match.
2026-09-15 19:21:06 +00:00
dajiaohuang d61823eff2 test: make reference-link assertion portable on Windows 2026-09-16 00:56:36 +08:00
Abhishek Sharma 9a62b94e22 docs(readme): the catalog heading says 24, the section lists 25
`## All 24 Skills` is contradicted by the sentence directly beneath it —
"The pack includes 25 skills total" — and by the section's own contents:

    skills listed under the heading   25
    directories under skills/         25
    validate-skills --strict          25 skills checked
    difference                        (none)

The section does list every skill, meta-skill included, in its own `Meta`
subsection. So 25 is the honest number for the heading.

The nearby "24 lifecycle skills plus the `using-agent-skills` meta-skill"
phrasing is correct and is left alone — 24 is a real count, just not of
what the heading is counting.

Also retargets the one inbound anchor, which the rename would otherwise
break:

    docs/adoption-guide.md:5  ...README.md#all-24-skills -> #all-25-skills

That link is the only reference to the anchor anywhere in the repo
(checked across md/json/ts/js), so the rename is complete.

Gates: validate-skills --strict 25 skills, 0 errors, 0 warnings; the JS
suite 44 pass / 0 fail.
2026-09-14 13:24:35 -07:00
ayobamiseun a1a80d56d1 fix(validator): strip every CommonMark fence form from linted prose (#437)
stripFencedCodeBlocks matched fences with a single whole-document regex that
only recognised a column-zero backtick fence closed by a run of exactly the
same length. Three CommonMark-legal forms slipped through and their contents
were linted as prose: tilde fences, fences indented one to three spaces, and
closing fences longer than their opener. This is live on main today —
spec-driven-development's list-nested examples use indented fences, so the
linter has been reading their contents as skill text.

Replace the regex with a line scanner that tracks the opener's marker and
length, closes only on a same-marker run at least as long, treats an
unterminated fence as running to end of file (so sections after it fail
loud), and follows the CommonMark rule that a backtick fence's info string
may not contain backticks. Stripped lines become empty lines so positions
are preserved.

Add unit coverage for each form plus CRLF input, and run
scripts/lib/skill-lint-test.js in CI — it was the only test file the
workflow did not execute.

Revives the approach from #444 by @ujjwalks, which was approved and then
closed after a rebase conflict.

Closes #437
2026-09-14 14:04:13 +01:00
Addy Osmani be4e44a9fb Merge #553: clarify setup for existing projects
docs: clarify setup for existing projects
2026-09-11 20:14:58 -07:00
Addy Osmani fd00a70f8a Merge #559: define restartable task boundaries
docs: define restartable task boundaries
2026-09-11 20:14:49 -07:00
Addy Osmani 4e94bb5912 Merge #560: map shared core to native adapters
docs: map shared core to native adapters
2026-09-11 20:14:41 -07:00
Addy Osmani 17cbf4b720 Merge #557: avoid double routing on native skill hosts
docs: avoid double routing on native skill hosts
2026-09-11 20:14:31 -07:00
Addy Osmani bc97fd46fd Merge #554: clarify external artifact ownership
docs(spec): clarify external artifact ownership
2026-09-11 20:14:24 -07:00
Addy Osmani 57c0196ff2 Merge #552: clarify stable browser skill name
docs(skills): clarify stable browser skill name
2026-09-11 20:14:16 -07:00
Addy Osmani a9d4b4656e Merge #563: reject null grader expectations without crashing
fix(evals): reject null grader expectations without crashing
2026-09-11 20:14:08 -07:00
Addy Osmani 20e8699cbf Merge #556: link runnable workflow tutorials
docs: link runnable workflow tutorials
2026-09-11 20:14:00 -07:00
Federico Bartoli 6ca0cd7db3 Merge pull request #531 from ayobamiseun/fix/518-plan-clobber-guard
fix(planning): never overwrite an incomplete plan without asking
2026-09-08 09:21:56 +02:00
Federico Bartoli fe6f08112b Merge pull request #422 from HMAKT99/feat/runbooks-observability
docs(observability): expand runbook guidance in alerting section
2026-09-08 09:19:30 +02:00
Federico Bartoli 38e2a4a18f Merge pull request #434 from ayobamiseun/fix/rank1-description-vocab
fix(skills): close description-vocabulary gaps, raise trigger rank-1 floor to 95
2026-09-08 09:05:33 +02:00
ayobamiseun cda4542ade fix(skills): close description-vocabulary gaps, raise rank-1 floor to 95
Eleven positive trigger prompts ranked their skill #2-#3 because the
descriptions lacked vocabulary users actually say (follow-up to #351):

- debugging-and-error-recovery: regression vocabulary (worked yesterday,
  what broke)
- documentation-and-adrs: 'document an architecture decision', design
  reasoning ('documentation' and 'document' don't stem together)
- doubt-driven-development: cross-examining assumptions, stress-testing
  a plan for hidden failure modes, high-stakes changes
- git-workflow-and-versioning: splitting a messy working tree into
  atomic commits
- incremental-implementation: thin/verifiable slices, next task from a
  plan, feature flags
- shipping-and-launch: what needs to be in place before shipping
- spec-driven-development: PRD, objectives and scope
- test-driven-development: red-green-refactor
- using-agent-skills: deciding which workflow applies to the work
- source-driven-development: verify against the official docs
  ('docs'/'documentation' don't stem together)

Trigger rank-1 rate: 86% -> 100% (76/76), no new collision warnings.
CI floor raised from 80 to 95 per the ratchet policy; README baseline
updated and the stale #351 tracking sentence rephrased as guidance.
2026-09-07 21:46:11 +01:00
vam 226bdd3aef Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	skills/context-engineering/SKILL.md
2026-09-07 15:10:46 +08:00
Raghu :) e6a58d5fc3 fix(evals): reject null grader expectations without crashing 2026-09-06 23:20:26 -07:00
Addy Osmani 48cb1168ae Merge #447: add Context Budget Management to context-engineering
docs(context): add Context Budget Management section
2026-09-06 00:43:57 -07:00
Federico Bartoli 469d00f4e6 Merge pull request #415 from HMAKT99/feat/slo-error-budgets
docs(shipping): add Error Budget Release Gate section
2026-09-05 21:22:59 +02:00
vam 17d8e52b7c docs: map shared core to native adapters 2026-09-05 11:54:33 +08:00
vam a1c9bd627c docs: define restartable task boundaries 2026-09-05 11:51:37 +08:00
vam a71eb51e05 docs: avoid double skill routing on native hosts 2026-09-05 11:45:31 +08:00
vam 5b98a0b17b docs: link runnable workflow tutorials 2026-09-05 11:42:49 +08:00
vam 15af65e75b docs(spec): clarify external artifact ownership 2026-09-05 11:40:39 +08:00
vam 4fd76c6f00 docs: clarify setup for existing projects 2026-09-05 11:39:33 +08:00
vam 674921ca8d docs(skills): clarify stable browser skill name 2026-09-05 11:38:44 +08:00
Addy Osmani 84ee506738 chore(release): bump plugin manifests to 0.6.9 0.6.9 2026-09-04 20:24:36 -07:00