v2.0.2 — the map stops lying
A skill collection routes on two things: the description your agent matches a request against, and
the map you read when you want to know what hands off to what. Both were wrong in v2.0.1.
Seven descriptions now say what their bodies do
A description is the routing table. When it drifts from the body the skill either never fires or
fires on the wrong request, and nothing tells you which.
duck-runsaid "plan, implement, test, and independently review". It also frames, verifies,
and lands. It says so now.duck-drysaid comments and docstrings. It has always set the bar for commit messages and PR
descriptions too.duck-cutclaimed it would "finish every viable item autonomously". It closes, cuts, merges,
and unblocks whatever does not need you — it does not build.duck-planoffered "independent critique of a draft plan". What it does is decorrelated
co-authorship: a second family writes the plan with you, not a review after you.duck-campaignsaid "prioritized" workstreams; it carves independent ones.duck-dietnow names stage routing — which model tier and agent type a stage runs on —
because it decides that too.duck-landdropstagandcut a releasefrom its triggers, because it does neither.
That is a gap, not a cleanup: "cut a release" now routes to nothing, and this release was cut by
hand.
The map covers every skill
duck-why and duck-dry were absent from it. duck-decide was drawn off to one side when it is a
REJECT exit. Campaign planning sat inside each packet, when a campaign plans every packet before
any build starts.
Two vertical diagrams now, one per line — a single change through duck-run, a backlog through
duck-campaign — with the conditional edges beside the stage they leave: the CUT exit, duck-break
before proof, the diverging-loop breaker. The map moved above the skills table, because the map is
what groups the skills and the table is for alphabetical lookup.
duck-run names a cause before it patches
On REJECT the pipeline routes through duck-why when a blocker reports a symptom and the defect
behind it is not already obvious from the diff. A reviewer tells you where it hurt, not where it
broke.
The gate
Shipped under an owner waiver. Two families reviewed this span with no outage —
gemini-3.1-pro-high (Google) and gpt-oss-120b-medium (OpenAI) — and both returned REJECT.
Two of their three blockers died on evidence: a claimed CI failure the run log shows did not happen,
and a claimed contradiction in the duck-why routing that duck-why's own text answers. One
survived adjudication — this span removes the README section stating which rules are mechanically
checked and which are only discipline, under a justification that covers a different fact. The owner
read the finding and chose to ship without restoring it.
codex was unavailable for the third gate running (ERROR: Your workspace is out of credits), so
both reviewers came from one harness under different pinned models. The pin was proved before use:
a deliberately invalid --model errors with the full roster.