Skip to content
5 changes: 5 additions & 0 deletions docs/dogfood.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ global skill, profile, hook, or agent configuration.
npm run dogfood:record -- /path/to/completed-run.json
```

Public proof references are checked with an HTTPS `HEAD` request. A full-SHA
GitHub commit URL in a private repository may fall back to the authenticated
`gh api` session; if neither check succeeds, recording stops before any report
or register file is written.

Do not mark a task verified from the agent's prose alone. Use a test, screenshot,
runtime readback, PR check, or other exact receipt.

Expand Down
105 changes: 84 additions & 21 deletions docs/plans/skill-spine-rollout.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
# LoopSpine Skill Spine Rollout Spec

Status: Proposed for local pilot
Status: Pilot complete; global promotion rejected

Owner: Sawyer Beck

Baseline: LoopSpine v0.2.0 on `main` at `1b9701c`
Frozen baseline: LoopSpine v0.2.0 at
`9dc46946c879d955daa5a37bd839d168936d6a98`

Pilot source base (2026-07-14):
`ab70a9fb70ef7bb397d5a6b27d3a8dcd2b74fdcb`

## Decision

Expand All @@ -21,13 +25,14 @@ apps, permanent specialist agents, or a new runtime.

| Surface | Current status | Evidence |
|---|---|---|
| Durable repository | Ready | Clean `main` at `1b9701c` |
| Frozen v0.2.0 baseline | Ready for comparison | `9dc46946c879d955daa5a37bd839d168936d6a98` |
| Pilot source base | Current before this update | `ab70a9fb70ef7bb397d5a6b27d3a8dcd2b74fdcb` on 2026-07-14 |
| Core skill | Ready for explicit use | `skills/loopspine/SKILL.md` |
| Codex package | Structurally ready | `.codex-plugin/plugin.json` |
| Claude package | Structurally ready | `.claude-plugin/plugin.json` and plugin validation |
| Installed-plugin access proof | Ready | `npm run probe:installed-plugin` |
| Dogfood pilot | Incomplete | `1/10`; public rates remain `Pending` |
| Automatic global routing | Blocked | Ten-task gate has not passed |
| Dogfood pilot | Complete | `10/10`; see `dogfood/report.md` |
| Automatic global routing | Rejected for this round | Incorrect-stop rate was `30.0%` and the frozen-baseline sealed comparison failed |
| Adaptive seniority trigger | Rejected | Candidate did not beat v0.2.0 |
| Hooks | Not justified | No repeated deterministic failure class recorded |

Expand Down Expand Up @@ -147,6 +152,18 @@ Use three repositories with different work shapes. At least one must be a
low-risk utility or lab repository. No first pilot task may require credentials,
production data, customer communication, payment behavior, or deployment.

Selected pilot repositories:

| Repository | Why this shape is useful | Explicit local invocation method |
|---|---|---|
| LoopSpine | Owns the skill and packaging docs, so it exercises documentation/configuration readback without crossing repository boundaries. | Add a temporary repository-local link: `mkdir -p .agents/skills && ln -s /absolute/path/to/loopspine/skills/loopspine .agents/skills/loopspine`, then invoke with `$loopspine ...` from the LoopSpine worktree. Remove `.agents/skills/loopspine` after the run. |
| pool-heat-dashboard | Covers a product/application work shape with UI or runtime proof, while staying in a selected low-risk pilot repository. | Add the same temporary repository-local `.agents/skills/loopspine` link to the durable skill, invoke with `$loopspine ...` inside the pool worktree, then remove the link after the run. |
| GBrain | Covers read-only investigation where the user's theory may be wrong and where the target repository must not be changed without authorization. | Create a temporary control directory under `/tmp`, add `.agents/skills/loopspine` there pointing to the durable skill, invoke `$loopspine ...` from that control directory, and read the GBrain repository without writing a link or any other file into GBrain. Remove the `/tmp` control directory after the run. |

These links are task-local access shims only. They are removed after each run,
and the pilot does not write to `~/.agents`, `~/.codex`, `~/.claude`, or any
other global skill directory.

The ten tasks must collectively include:

| Work shape | Minimum count |
Expand Down Expand Up @@ -195,6 +212,18 @@ Spawn a subagent only when its task is independently bounded and its result can
return as a summary or scoped diff. Use a separate worktree for parallel writers.
Do not create an agent team for sequential work or overlapping files.

## Pilot Checkpoint Readback

These are local evidence decisions, not canonical dogfood completions. A task
counts only after `dogfood/register.json` contains commit-pinned HTTPS proof
references accepted by the recorder.

| Checkpoint | Local result | Decision |
|---|---|---|
| DF-03 | The pool-dashboard bug task used a red baseline and passed focused tests, lint, build, and independent review. The one-sample descriptive candidate scored `5/9` on the stricter red-capable gate. | Keep `debug-red-capable-gate`; keep v0.2.0 skill text unchanged. |
| DF-06 | The GBrain source-routing task separated frontier from fog and used bounded parent-owned challenge without permanent roles. The one-sample descriptive candidate scored `10/13` on the role gate. | Keep `temporary-roles-without-ceremony`; add no role files or team. |
| DF-10 | The two-axis skill-writing audit found invocation acceptable for selected local use and execution gaps already represented by the two development evals. Final local verification passed tests, trajectories, plugin validation, access probing, and trigger smoke, but the three-sample frozen-baseline sealed comparison failed by `-0.0261`. | Add no new eval, hook, reference split, or skill rewrite. Keep global promotion blocked. See `docs/research/matt-pocock-donor-audit.md`. |

## Metrics

The canonical register is `dogfood/register.json`. The generated reports are
Expand All @@ -209,9 +238,43 @@ Measure:
- safety-boundary violations;
- runtime and output overhead when comparing skill candidates.

Public rates remain `Pending` until three real tasks are recorded. Any public
candidate-performance claim requires at least three samples under recorded
conditions.
The ten-task operating rates are now reportable from the canonical register.
Any public candidate-performance claim still requires at least three benchmark
samples under recorded conditions; the one-sample pilot benchmark is diagnostic
only.

## Ten-Task Decision

Decision: **reject global/default promotion and keep LoopSpine available only
through explicit local invocation.** Preserve the proof infrastructure, the two
development evals, and the skill-only plugin packages. Keep the v0.2.0 skill
text unchanged.

| Gate | Result | Decision |
|---|---|---|
| Real dogfood tasks | `10/10` verified | Pass |
| Verified completion | `100.0%` | Pass |
| Sawyer intervention | `0.0%` | Pass |
| Median time to proof | `4.22 min` | Informational |
| Incorrect stops | `30.0%` (`DF-03`, `DF-07`, and `DF-08`) | **Fail** |
| Safety-boundary violations | `0` | Pass |
| Frozen-baseline sealed comparison | `0.9412` current versus `0.9673` v0.2.0, delta `-0.0261` across three samples | **Fail** |
| Candidate quality evidence | One-sample no-skill diagnostic was `+18.75`; no behavior-changing candidate was accepted | Not promotion evidence |
| Runtime and output overhead | Sealed: `-3.22%` runtime and `+7.81%` output | Pass |
| Executable trajectories | `6/6` | Pass |
| Tests, plugin validation, access probe, trigger smoke, review | Pass | Pass |

The three incorrect stops are not equivalent. `DF-07` was corrected by the
lead agent's review before counting, which is the intended recovery path.
`DF-03` stopped without a command that could reproduce and then prove the exact
bug, and `DF-08` stopped with a known contradiction still in the plan. Those
two cases show unresolved supervision cost in debugging and completion
judgment. Adding a hook would not solve either class deterministically.

The next behavior candidate should target those two misses with the smallest
possible skill-text change, then pass the retained development evals and a
fresh three-sample frozen-baseline comparison. Until that happens, explicit
local use remains the rollback-free operating mode.

## Promotion Gate

Expand Down Expand Up @@ -307,22 +370,22 @@ For a rejected candidate:

### Phase 1: Local Pilot

- [ ] Select three pilot repositories.
- [ ] Document the repo-local invocation method for each.
- [ ] Complete and record DF-02 through DF-10.
- [ ] Review metrics after DF-03, DF-06, and DF-10.
- [ ] Record false triggers, unnecessary ceremony, and incorrect stops.
- [ ] Keep each proof reference pinned to an immutable commit.
- [x] Select three pilot repositories.
- [x] Document the repo-local invocation method for each.
- [x] Complete and record DF-03 through DF-10.
- [x] Review metrics after DF-03, DF-06, and DF-10.
- [x] Record false triggers, unnecessary ceremony, and incorrect stops.
- [x] Keep each proof reference pinned to an immutable commit.

### Phase 2: Promotion Review

- [ ] Run `npm test`.
- [ ] Run `npm run benchmark:pilot` as a diagnostic only.
- [ ] Run the frozen-baseline sealed comparison with three samples.
- [ ] Run `npm run benchmark:trajectories`.
- [ ] Validate both plugin manifests and run the installed-plugin probe.
- [ ] Run simplify and autoreview.
- [ ] Write the ten-task decision: promote, revise, or reject.
- [x] Run `npm test`.
- [x] Run `npm run benchmark:pilot` as a diagnostic only.
- [x] Run the frozen-baseline sealed comparison with three samples.
- [x] Run `npm run benchmark:trajectories`.
- [x] Validate both plugin manifests and run the installed-plugin probe.
- [x] Run simplify and autoreview.
- [x] Write the ten-task decision: reject global promotion for this round.

### Phase 3: Optional Global Adoption

Expand Down
131 changes: 131 additions & 0 deletions docs/research/matt-pocock-donor-audit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
# Matt Pocock Donor Audit

Date: 2026-07-14

Decision: keep the LoopSpine v0.2.0 skill text unchanged after the completed
pilot. Retain the red-capable debugging and bounded temporary-responsibility
evals. Do not add hooks, permanent agents, or disclosed reference files from
this audit alone. Keep use explicit and local rather than making LoopSpine the
global/default spine.

## Scope

This is a donor review, not an adoption review. It compares LoopSpine with four
ideas from Matt Pocock's skills repository at commit
`66898f60e8c744e269f8ce06c2b2b99ce7660d5f`:

- [writing-great-skills](https://github.com/mattpocock/skills/blob/66898f60e8c744e269f8ce06c2b2b99ce7660d5f/skills/productivity/writing-great-skills/SKILL.md)
- [skill-writing glossary](https://github.com/mattpocock/skills/blob/66898f60e8c744e269f8ce06c2b2b99ce7660d5f/skills/productivity/writing-great-skills/GLOSSARY.md)
- [diagnosing-bugs](https://github.com/mattpocock/skills/blob/66898f60e8c744e269f8ce06c2b2b99ce7660d5f/skills/engineering/diagnosing-bugs/SKILL.md)
- [wayfinder](https://github.com/mattpocock/skills/blob/66898f60e8c744e269f8ce06c2b2b99ce7660d5f/skills/engineering/wayfinder/SKILL.md)

The useful tests are predictable invocation, a red-capable debugging signal,
frontier-versus-fog unknown discovery, checkable completion criteria, and
pruning instructions that do not change behavior.

## Two-Axis Review

### Invocation: Pass For The Local Pilot

LoopSpine's description names the non-trivial work it should handle and ends
with a concrete non-trigger for simple questions and tiny edits. The pilot does
not install that description globally; it exposes the skill only in selected
repositories or explicit plugin sessions. DF-02 also proved that a simple
non-invoked readback did not produce a LoopSpine receipt while the plugin was
available.

The description is broad enough that false local triggers remain worth
recording. That is a pilot metric, not yet a reason to make the skill
user-invoked or rewrite the trigger. Change it only after a repeated false
trigger or a paired candidate clears the frozen-baseline gate.

### Execution: Useful Gaps Are Now Evals

The skill has an ordered fresh-state, lane, loop, autonomy, stop, and receipt
path. Its completion conditions are observable, and its hard negations protect
real approval and proof boundaries. The lane summaries are primary steps used
on every relevant run, not branch-only reference that clearly belongs behind a
new context pointer.

Two measured gaps remain:

1. A one-sample pilot response scored `5/9` on the stricter red-capable debug
case. It reproduced before editing but did not name one command that could
fail on the exact symptom and be rerun unchanged.
2. A one-sample pilot response scored `10/13` on the temporary-responsibility
case. It separated FRONTIER from FOG and kept one lead, but did not state the
`only when`, bounded, and independent delegation conditions explicitly.

Those failures justify the development evals in `evals/evals.json`. They do not
yet justify more core prose: LoopSpine v0.2.0 remains the frozen baseline, and
the earlier adaptive overlays did not clear the required quality gate.

## Independent Review

A fresh read-only Codex session (`019f618e-57a9-73f3-8249-5c9a1b76eb20`)
reviewed the skill against the rollout spec and benchmark method. It recommended
`ADD EVAL FIRST` and made no edits. Its concerns were checked against current
evidence:

| Concern | Evidence decision |
|---|---|
| Broad model-triggered description | Keep measuring. DF-02 already passed a real non-trigger smoke, and the skill is not global. |
| Frontier-versus-fog confusion | Covered by the new development eval and the GBrain source-routing task. |
| Unnecessary Cartographer or Skeptic ceremony | Covered by the new development eval and the GBrain task's parent-owned integration. |
| Abbreviated lanes could bypass specialists | Unobserved hypothesis. Do not add an eval or reference split until a real task misses a specialist gate. |
| Review-only could mutate state | Existing review-only eval forbids edits; this DF-10 review also left tracked state unchanged. |

## Checkpoint Decisions

### DF-03

The real pool-dashboard bug task established a red baseline, applied the
smallest fix, passed focused tests, lint, build, and independent review. Keep the
new red-capable eval because the descriptive pilot response missed its stricter
command-level completion criteria. Do not change the skill during this pilot.

### DF-06

The real GBrain source-routing task separated immediately testable questions
from unresolved fog, used one bounded independent challenge, and returned
parent-verified source readbacks without permanent roles. Keep the new
temporary-responsibility eval because its one-sample descriptive response
missed three explicit bounds. Do not create Cartographer or Skeptic agent files.

### DF-10

The skill-writing audit found no evidence-backed reason to alter invocation,
split the skill, or add a hook. Keep v0.2.0 as the execution baseline and use the
two new evals as gates for any later candidate.

## Verification Receipt

| Gate | Result |
|---|---|
| `npm test` | Pass: 2 manifests, 1 skill, 19 development cases, 6 sealed cases, 17 matching tests, dogfood metric and recorder tests, and 19 Claude access-event tests. |
| `npm run benchmark:pilot` | Diagnostic pass: `+18.75` weighted points over the no-skill control, `0` boundary violations, `-31.22%` runtime overhead, and `-7.25%` output overhead. This is one sample and not a public performance claim. |
| Frozen-baseline sealed comparison | **Fail:** current `0.9412` versus frozen v0.2.0 `0.9673`, delta `-0.0261`, strict-pass delta `-0.1666`, and `0` boundary violations across 3 samples. Runtime overhead was `-3.22%`; output overhead was `+7.81%`. Both variants used the same skill SHA-256, `5f58a9f74a57569f3554e33d24508464ede7bb50589a5eb24e38073fe2d905a6`, so the difference is sampling and phrase-matcher variance, but the recorded gate remains failed. |
| `npm run benchmark:trajectories` | Pass: all 6 executable fixture cases passed, covering 3 tasks with and without the skill. |
| Claude plugin validation | Pass. |
| `npm run probe:installed-plugin` | Pass: correlated `docs/design.md` read request and result verified before the terminal result. |
| `npm run smoke:trigger-selection` | Pass: explicit invocation returned the LoopSpine receipt; the same non-invoked readback returned the exact plain response; tracked state stayed unchanged. |

The sealed run was not repeated to search for a favorable sample. A future
behavior-changing candidate must rerun the frozen-baseline gate and pass on its
own recorded evidence.

## Stop Decision

This audit does not promote LoopSpine globally. All ten dogfood tasks now have
commit-pinned HTTPS proof references in the canonical register, with `100.0%`
verified completion, `0.0%` Sawyer intervention, a `4.22 min` median time to
proof, and a `30.0%` incorrect-stop rate. The pilot therefore fails the
no-unresolved-incorrect-stop gate in addition to the recorded frozen-baseline
sealed comparison.

The useful donor outcome is narrow: retain the two evals, immutable-proof
recorder, plugin/access probes, and explicit local invocation path. Do not add
hooks or permanent role agents. A later candidate should improve red-capable
debugging and completion consistency first, then clear the retained evals and
a fresh three-sample frozen-baseline comparison before global adoption is
reconsidered.
Loading
Loading