Skip to content

Retrospective: what this session established, and what to build next #9

Description

@jeremymanning

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

  1. 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.
  2. 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.
  3. 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.
  4. 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:

  1. 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.
  2. 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".
  3. 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

  1. Fix skillreport counting failed invocations. One line, and it corrupts the only
    evidence this package produces about itself.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions