docs: handoff reflects the pushed state

22 commits pushed, CI green, deployed. Items 1-3 of the previous list are
done: staffing, attribution, and the door. Trigger is measured and
red-first turned out observable from run outputs rather than from the
diff — the previous list was wrong about that, and the skill says why.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_018i9Ten1LU4jUr5d7TAWda9
This commit is contained in:
Omar Sobh
2026-08-21 13:30:02 -07:00
co-authored by Claude Opus 5
parent 7525be3791
commit 72eda8b3d2
+70 -35
View File
@@ -7,12 +7,12 @@ than the agent's own account of it.
## State of the tree ## State of the tree
Local suite green: **107 test binaries, 796 tests** (`cargo test --workspace`), and the workspace builds with `--all-targets`. Local suite green: **108 test binaries, 815 tests** (`cargo test --workspace`).
Five measurement missions ran on the local stack (`scripts/skill-use-run.sh`); **Pushed** — 22 commits, CI green on gw-04, deployed.
all five are held 90 days and re-scorable with `--score <id>`.
10 commits on `main` this pass, **not pushed** — a push to `main` auto-deploys Eight measurement missions ran on the local stack
to gw-04, and the container-tier work already deployed is unexercised there (`scripts/skill-use-run.sh`); all are held 90 days and re-scorable with
(see below). `--score <id>`.
## The premise of the last handoff's item 1 was wrong ## The premise of the last handoff's item 1 was wrong
@@ -132,44 +132,79 @@ which is the only reason they were found.
`no_skill_shows_a_marker_the_parser_would_reject` guards the class, running the `no_skill_shows_a_marker_the_parser_would_reject` guards the class, running the
real parser over every marker in every skill's fenced blocks. real parser over every marker in every skill's fenced blocks.
### Trigger is measured, and the door is what made it possible
`skill_use` scores Trigger from `ReadMcpResourceTool` calls, parsed through
`mcp_skills::parse_uri` — the function that wrote the URI. Run 8, one mission,
one clean A/B:
| skill | delivered by | Trigger |
|---|---|---|
| `workspace-repo-commit-protocol` | retrieval | **pass** |
| `web-search-triage` | inlined | not observable |
| `structured-paper-summary` | inlined | not observable |
| `scientific-writing-conventions` | inlined | not observable |
Careful with what that proves: the retrieval was *instructed* by the task. It
demonstrates the instrument, not a spontaneous relevance judgement.
### Red-first is observable, and it needed neither ordering nor the diff
The previous version of this list said the TDD check needed the repository
diff. That was wrong, and `tdd-red-green-refactor` says why: *"Commit the
RED-to-GREEN pair as one commit."* The failing test and its fix land together
by instruction, so the diff and the commit history are as blind as tool
ordering already was.
The witness is what each run PRINTED, and the tap was discarding it. Claude
Code's `PostToolUse` payload carries `tool_response` (stdout/stderr/
interrupted) — verified against the binary. `bounded_response` keeps the END of
that output, the opposite of `bounded_input`, because a command's meaning is
its verdict and `cargo test` prints it last.
failing run then a passing one → Pass
every run failed → Fail
every run passed → NotObservable, because a test that never
failed is equally what a correct
implementation written first looks like
## Next, in order ## Next, in order
1. **The TDD check cannot confirm red-first, and that is structural.** Run 4 1. **Watch the first production mission.** Everything below the fold in this
(`research_and_code`, real repo) edited `src/lib.rs` once — implementation document is now deployed and unexercised in prod, because prod has still
*and* `#[cfg(test)] mod tests` in the same write — then ran `cargo test` never run a mission. The door, the staffing, the attribution and the orphan
five times. In Rust the unit test lives in the file under test, so that sweep all engage on the next launch. Prod auth is Clerk, so somebody has to
ordering is what following the skill precisely looks like from outside. The click.
check detects "wrote source, never ran a test" and nothing more. If you want
red-first, it needs the diff (did the test exist before the impl?), not the
tool order.
2. **Attribute tool calls to agents.** `record_vm_tools` writes ```
`agent_id: None`, because the container tap is per-container and all roles ssh gw-04 'docker logs clawmates_server_1 2>&1 | grep -E "skills door installed|drained .* tool call|orphans:"'
share one. Every Skill-Use score is therefore per-**mission**, not per-role, ```
and the World's per-agent view gets nothing from the container tier. The
hook payload carries `session_id`; mapping it back to a turn is the fix.
3. **Deploy the door** (`TOOL-CALL-ARCHITECTURE.md` §3). Config, not code: 2. **Measure Trigger properly, which means changing delivery.**
`/zeroclaw-data/clawmates-mcp.json` plus a door-shaped provider alias. It is `pinned_skills_text` still inlines full skill bodies, so agents are handed
now the single change that makes **Trigger** a real measurement, and the skills rather than reaching for them. The scorer already reports `Pass` for
precondition for skills moving from inlined bodies to progressive a retrieved skill and `NotObservable` for an inlined one — proven on run 8,
disclosure — which would also cut the prompt cost in item 1. where the retrieved skill scored `pass` and the three inlined ones did not.
Switching to progressive disclosure is the remaining change, and it could
regress Compliance, so **A/B it** rather than flipping it.
4. **Fold the microVM tier onto `container_tool_hooks`.** It has a gate and a 3. **Fold the microVM tier onto `container_tool_hooks`.** Two mechanisms for
tap by a different route (`vm_tool_tap` installs into the guest, one job is how they drift — the argument-discarding bug lived in the shared
`microvm_executor` drains inside the turn). Two mechanisms for one job is how parser precisely because nobody looked at it from the container side. The
they drift — and the argument-discarding bug above lived in the shared parser microVM path also still passes no turn agents, so its tool calls stay
precisely because nobody looked at it from the container side. The fleet has unattributed. Blocked: the fleet has been offline for over a week.
been offline for over a week, so this cannot be tested today.
5. **Pull upstream's egress policy** — `0db7d999a feat(plugins): add shared 4. **Pull upstream's egress policy** — `0db7d999a feat(plugins): add shared
egress policy foundation (#9137)`. We are ~220 commits behind; this is the egress policy foundation (#9137)`. ~220 commits behind; this is the one item
one item worth taking, and it is defence for a problem we have not solved. worth taking, and it is defence for a problem we have not solved.
5. **A narrow credential for the rest of the door.** `SCOPE_SKILLS_READ` covers
`/mcp/skills`. The `/mcp` door proper (`mcp_door.rs`) still authenticates
with a full session, and it is the one that can `delegate`. Nothing hands it
a token today; anything that does should not hand it a person's.
## Open decisions that are yours ## Open decisions that are yours
- **Push.** 10 commits are local. Pushing `main` triggers CI → auto-deploy to
gw-04.
- **Self-authoring scope.** Agents apply their own `skill_candidate` items with - **Self-authoring scope.** Agents apply their own `skill_candidate` items with
no human click (`CLAWMATES_SKILL_SELF_AUTHORING=0` restores the gate). no human click (`CLAWMATES_SKILL_SELF_AUTHORING=0` restores the gate).
`identity_refinement` and `brain_consolidation` still wait for a human, `identity_refinement` and `brain_consolidation` still wait for a human,