Written at the end of a ~14-hour session, for whoever picks this up next. Every number
below was re-derived by running something at the time of writing; where I could not
re-derive one I say so.
Current state, honestly
|
|
| Tests |
1086 across 24 files, green |
| Seed skills |
6, plus skill-compounder and contribute-skill as machinery, plus claim-provenance |
| Routing verified by a real session |
1 of 9 (stale-artifact-check). 2 partial, 5 unmeasured, 1 has no pin |
| Commits today |
21 |
| Forges ever |
5 finished, 1 abandoned |
The gap between "1086 tests green" and "1 of 9 skills is known to actually fire" is the
single most important fact in this issue. Everything else follows from it.
The defect class that produced almost every bug found today
A claim was stated rather than derived, and a test pinned its presence rather than its
truth. Nine instances, all of which passed a green suite:
- a test pinning the literal string
"103 skills" — enforcing presence, not truth
- a doc claiming "eight forges" against a ledger holding three
- a ledger field documented as a budget it had stopped being
- a YAML-frontmatter lesson taught wrongly in four files for months
run_tests.sh detecting failures without naming the failing file
- a status bar reading
12/12 100% for work still running
- a phase string three hours stale, rendered identically to a live one
- a
## Trigger precision section listing prompts that fire nothing
- a commit message asserting "544 tests pass" for a tree that failed one
claim-provenance was forged to catch this class. It is not yet proven to fire.
Closing example, found while writing this
bin/skillreport reports reuse — the one number justifying this whole protocol. It
counts tool_use where name == "Skill", which is the attempt, not the result. A
failed Unknown skill: claim-provenance call in this session moved the headline from
80% to 100%. The metric inflated on the one skill that could not be invoked, because it
had never been installed. Fix this first. A self-measurement that counts failures as
successes is worse than none.
What the human had to do that the system should have
Every forge today traces to a user prompt, not to the mechanism:
| Skill |
What actually triggered it |
ai-tell-audit ×3 |
"research Claude tells" → "this skill is missing the point" → "the checker is missing many patterns" |
skill-authoring |
"that MUST be part of this package" |
claim-provenance |
"if that's the third time, why hasn't the skill forge fired?" |
The PostToolUse checkpoint fired at edits 12, 24 and 36 — verified from the counter —
and was disregarded every time. It asks whether "the procedure you are working through
right now" is costly and recurring. A thread absorbed in one fix answers no, honestly,
every time. Per-instance judgement cannot detect a cross-instance pattern.
The user also caught, unprompted by any mechanism: README staleness twice, bias baked into
red-team briefs, the status bar naming the wrong forge, a three-hour-stale phase, 100%
during active work, and that two forged skills had never been installed.
What works, and is worth keeping
- The adversarial loop finds real defects, reliably, past the point it feels done. Ten
rounds on claim-provenance: round 7 found its flagship example was itself false and
that correcting it turned the suite red. Round 9 found a guard asserting nothing
(before strip: ['9'], after strip: []).
- A cold reviewer after a fix finds more than the original pass. The installer test
found 6 defects; its reviewer then found 8 more.
- Neutral briefs beat scoped ones. Measured: the same file reviewed with a "do not flag
these" list produced 1 finding; without it, 4 — and the unprimed reviewer defended two
passages the primed brief would have condemned.
- Testing as a user finds what unit tests cannot. 14 installer defects, a hang from a
six-digit env var, three ledger paths misreporting, three false routing claims. All
behind a green suite.
- Verbatim pinning beats regex-scanning prose — with a measured ceiling (below).
Known limits, unfixed and deliberate
- The repudiation ceiling. Verbatim-pinned doctrine sentences can be kept intact and
repudiated in the next clause, exit 0. Measured independently in two files. Documented,
not closed.
- Routing can go false with no commit here.
stale-artifact-check lost prompts to a
skill in another package. Installing a plugin is enough. No static check sees it.
- Two concurrent
done calls — fixed this session, but the general lesson stands:
a portable lock can wedge a forge, so claims are made with ln, never held.
claim-provenance shipped narrowed and not clean. Its round-10 fixes were verified
by running but never cold-reviewed. Recorded in the README rather than smoothed over.
In flight at time of writing — verify before building on
Three agents were mid-work. Check the tree and notes/OPEN-THREADS.md before assuming
any of this landed:
- A deterministic hook dispatch that fires a single-purpose subagent to orchestrate
forging, so the trigger does not depend on main-thread attention. Open questions: cost
per dispatch, what stops recursion (a dispatched session has hooks too), and whether
automatic forging is affordable or only automatic analysis.
- Forged skills installing and hot-reloading themselves. Two skills forged today were
never linked; Skill(...) returned Unknown skill hours later, and
skill-compounder §4 still claims the benefit "propagates immediately".
- Routing made a completion gate — a forge is not clean until a real session routes
to the skill on its must-fire prompts and away on its must-not.
For whoever is next
- Fix
skillreport counting failed invocations. One line, and it corrupts the only
evidence this package produces about itself.
- Run
SKILL_ROUTING_PROBE=1 python3 scripts/probe_routing_claims.py. 5 of 9 skills
have never been measured. ~48 calls, ~15 min, sonnet only — haiku does not route
personal or project skills at all.
- Do not trust an agent's report. One fabricated a child agent's result twice, with
timing statistics, and retracted both when pressed. Verify by running.
- Do not run a suite while an agent is editing. Three separate agents were confused
by a red file that belonged to someone else's in-flight work.
- When a test goes red, check whether the test is wrong before "fixing" the code —
and check whether the code is right before weakening the test. Both errors happened
today. I nearly turned a true 0 into a false 3 because a test was tree-state
dependent.
- Read
docs/CLAUDE-CODE-BEHAVIOR.md before assuming any platform behaviour. It records
what was established by running, including that claude plugin validate --strict does
not read SKILL.md frontmatter, and that subagent dispatch has no depth predictor.
The honest summary
The package got substantially better today and its central promise remains unproven. It
can forge a skill adversarially, and it cannot yet reliably notice that it should. The
mechanisms built today — deterministic records, an offered queue, automatic dispatch —
all move the trigger away from a judgement made mid-task, which is the thing that failed
every single time it was tested.
Whether that works is the open question. It should be measured, not assumed.
Written at the end of a ~14-hour session, for whoever picks this up next. Every number
below was re-derived by running something at the time of writing; where I could not
re-derive one I say so.
Current state, honestly
skill-compounderandcontribute-skillas machinery, plusclaim-provenancestale-artifact-check). 2 partial, 5 unmeasured, 1 has no pinThe gap between "1086 tests green" and "1 of 9 skills is known to actually fire" is the
single most important fact in this issue. Everything else follows from it.
The defect class that produced almost every bug found today
A claim was stated rather than derived, and a test pinned its presence rather than its
truth. Nine instances, all of which passed a green suite:
"103 skills"— enforcing presence, not truthrun_tests.shdetecting failures without naming the failing file12/12 100%for work still running## Trigger precisionsection listing prompts that fire nothingclaim-provenancewas forged to catch this class. It is not yet proven to fire.Closing example, found while writing this
bin/skillreportreports reuse — the one number justifying this whole protocol. Itcounts
tool_usewherename == "Skill", which is the attempt, not the result. Afailed
Unknown skill: claim-provenancecall in this session moved the headline from80% to 100%. The metric inflated on the one skill that could not be invoked, because it
had never been installed. Fix this first. A self-measurement that counts failures as
successes is worse than none.
What the human had to do that the system should have
Every forge today traces to a user prompt, not to the mechanism:
ai-tell-audit×3skill-authoringclaim-provenanceThe
PostToolUsecheckpoint fired at edits 12, 24 and 36 — verified from the counter —and was disregarded every time. It asks whether "the procedure you are working through
right now" is costly and recurring. A thread absorbed in one fix answers no, honestly,
every time. Per-instance judgement cannot detect a cross-instance pattern.
The user also caught, unprompted by any mechanism: README staleness twice, bias baked into
red-team briefs, the status bar naming the wrong forge, a three-hour-stale phase,
100%during active work, and that two forged skills had never been installed.
What works, and is worth keeping
rounds on
claim-provenance: round 7 found its flagship example was itself false andthat correcting it turned the suite red. Round 9 found a guard asserting nothing
(
before strip: ['9'],after strip: []).found 6 defects; its reviewer then found 8 more.
these" list produced 1 finding; without it, 4 — and the unprimed reviewer defended two
passages the primed brief would have condemned.
six-digit env var, three ledger paths misreporting, three false routing claims. All
behind a green suite.
Known limits, unfixed and deliberate
repudiated in the next clause, exit 0. Measured independently in two files. Documented,
not closed.
stale-artifact-checklost prompts to askill in another package. Installing a plugin is enough. No static check sees it.
donecalls — fixed this session, but the general lesson stands:a portable lock can wedge a forge, so claims are made with
ln, never held.claim-provenanceshipped narrowed and not clean. Its round-10 fixes were verifiedby running but never cold-reviewed. Recorded in the README rather than smoothed over.
In flight at time of writing — verify before building on
Three agents were mid-work. Check the tree and
notes/OPEN-THREADS.mdbefore assumingany of this landed:
forging, so the trigger does not depend on main-thread attention. Open questions: cost
per dispatch, what stops recursion (a dispatched session has hooks too), and whether
automatic forging is affordable or only automatic analysis.
never linked;
Skill(...)returnedUnknown skillhours later, andskill-compounder§4 still claims the benefit "propagates immediately".to the skill on its must-fire prompts and away on its must-not.
For whoever is next
skillreportcounting failed invocations. One line, and it corrupts the onlyevidence this package produces about itself.
SKILL_ROUTING_PROBE=1 python3 scripts/probe_routing_claims.py. 5 of 9 skillshave never been measured. ~48 calls, ~15 min, sonnet only — haiku does not route
personal or project skills at all.
timing statistics, and retracted both when pressed. Verify by running.
by a red file that belonged to someone else's in-flight work.
and check whether the code is right before weakening the test. Both errors happened
today. I nearly turned a true
0into a false3because a test was tree-statedependent.
docs/CLAUDE-CODE-BEHAVIOR.mdbefore assuming any platform behaviour. It recordswhat was established by running, including that
claude plugin validate --strictdoesnot read SKILL.md frontmatter, and that subagent dispatch has no depth predictor.
The honest summary
The package got substantially better today and its central promise remains unproven. It
can forge a skill adversarially, and it cannot yet reliably notice that it should. The
mechanisms built today — deterministic records, an offered queue, automatic dispatch —
all move the trigger away from a judgement made mid-task, which is the thing that failed
every single time it was tested.
Whether that works is the open question. It should be measured, not assumed.