Summary
post-review-pickup-workflow.md goes from 20,396 → 7,852 bytes (−61%), and the skill is added to the recursive Map/Atlas decay guard so the reduction cannot silently re-inflate.
The payload existed to prevent one failure mode: an agent finishing a PR and claiming "there is nothing left to do" — absurd against 200+ open tickets, a mailbox that generates lanes on its own once peers are online, and two skills (ideation-sandbox, tech-debt-radar) that mint effectively unbounded work.
That intent is four facts. The file was 20KB.
Evidence
Evidence: three of the four intent facts were already turn-loaded in the always-present L3 firewall block — "A lane done / blocked / merge-pending / peer-waiting is never a stop — jump to a different high-value area; high-value work is infinite, we never run out." The payload was paying a second time for a stance that already costs nothing.
The fourth fact — prefer a lane adjacent to your current context — was absent, and it is the one that matters most economically. Measured this session (401 assistant messages, 1.79h):
| component |
share of session cost |
| cache-read of context |
89.7% |
| cache write |
6.8% |
| output tokens |
3.4% |
|
tokens/message |
| first 25 messages |
19,871 |
| last 25 messages |
44,894 (2.26×) |
So lane adjacency is not a focus preference — it is the cheapest lane you will ever pick, and the payload never said so. It does now.
Model-generation context: this content was authored when the swarm ran Gemini 3 Pro, Opus 4.6 and GPT 5.5. The seats are now GPT 5.6 Sol, Opus 5, Fable 5 and Kimi K3. Choreography that scaffolded a weaker model's lane selection is drain.
Dispositions (ADR 0007 3-Axis Slot Rule)
Per-section, so the reduction is reviewable as judgment rather than as a byte total:
| Section |
Bytes |
Disposition |
Rationale |
| Three-Heartbeat threshold |
1,232 |
retire |
A counter for ignored pulses — no-hold apparatus whose consumer PR #15890 switched off |
| Reviewer Pickup Matrix |
2,007 |
retire |
Three rows all resolving to "the artifact is someone else's now, take another lane" |
| Author Pickup Matrix rows |
~700 |
retire |
Same collapse |
| Substrate-evolution-flywheel |
666 |
retire |
Restates "the backlog is never empty" at length; now one clause in §1 |
| My own compression-provenance note |
~400 |
retire |
Justified in its PR; does not belong in the payload forever |
| Trigger |
2,894 → ~600 |
compress |
The seven-event enumeration is a list a current-generation model does not need; the scope boundary survives |
| The Cycle |
1,792 → ~500 |
compress |
The lifecycle-first priority order survives verbatim in substance; lineage citations and liveness-not-throughput prose do not |
| Gated Own Lanes |
1,523 → ~450 |
compress |
Survey commands kept, "not a terminal" framing dropped (turn-loaded) |
| Broadcast-Suppressed |
1,166 → ~300 |
compress |
Operational content kept, restatement dropped |
| Anti-Patterns |
1,428 → ~400 |
compress |
Kept only rows carrying non-obvious content |
| PR-state freshness gate |
— |
keep |
Prevents false merge-ready claims reaching the operator |
| RC-response atomicity |
— |
keep |
Prevents silently stalled review cycles |
| Claim survey commands |
— |
keep |
Prevents claiming another reviewer's seat |
| Sibling trigger pointers, integration points |
— |
keep |
Progressive Disclosure routing |
The keep/retire line is does it change the verdict, or only the format? Verdict-changing content earns its slot at any model tier. pr-review was explicitly excluded from this lane on the same test — its payload flips approve vs request-changes and surfaces findings that would otherwise be missed.
Decay guard
Added to defaults.oversizedWorkflowMaps, which was a hand-maintained two-entry allowlist (pr-review-guide.md, pull-request-workflow.md) — not a measured threshold. This file had therefore never been under recursive Map/Atlas pressure, only the global maxPositiveDeltaBytes: 250 net-growth budget, which is a one-way ratchet: it blocks accretion and never forces reduction. Without this entry the reduction silently re-inflates.
This is the decay-mitigation the §self_evolving_systems Substrate Accretion Defense requires.
Test Evidence
node ai/scripts/lint/lint-skill-manifest.mjs --base origin/dev → OK (structure + growth budget).
- All four outbound pointers verified to resolve:
pre-review-intake-lane-gate.md, author-concentration-detector.md, learn/agentos/wake-substrate/NightShiftLeasedDriver.md, ai/scripts/lifecycle/validateMergeReady.mjs.
- Inbound reference swept:
pre-review-intake-lane-gate.md cited §5 (backlog self-survey), which renumbered to §6 (claim survey). Both sides of the cross-reference moved together — a stale section pointer would have survived as a silent contradiction.
skills.manifest.json diff verified surgical: 1 insertion. An earlier revision of this branch reformatted all 448 lines (2-space → 4-space via a JSON round-trip); that was reverted and replaced with a targeted edit before review.
Post-Merge Validation
Nothing to run. The payload is read on skill invocation, so the next /post-review-pickup picks it up.
- Sanity check: the next lifecycle boundary should still produce a
lane-state: next-lane (...) prose line and should NOT emit the fenced machine block (stopHook.laneContinuation defaults off since #15890).
- Regression signal to watch: if a peer starts declaring
verified-empty or human-gate as a terminal, that is this reduction cutting too deep — the L3 firewall is supposed to carry that stance, and this PR's premise is that it does.
Deltas
- vs the ticket: #15891's AC set is met as written — ≤8,000 bytes (7,852), negative net delta, no
[skill-growth-justified:] escape, per-section dispositions recorded, manifest entry added, SKILL.md router untouched.
- One AC is not in this PR: "the parent epic #13652's premise shift is recorded on the epic." #13652's thesis is "mechanical enforcement replaces prompt-machinery" — keep the hook, absorb the prose into its directive. #15890 inverted half of that by defaulting the hook's continuation OFF. Both positions agree the prose shrinks; they disagree on what replaces it. That is an epic-body edit, not a skill edit, and it belongs in its own commit so the epic's history reads cleanly. Flagging it explicitly rather than silently deferring.
Resolves #15891
Authored by Grace (@neo-opus-grace, Opus 5)
Summary
post-review-pickup-workflow.mdgoes from 20,396 → 7,852 bytes (−61%), and the skill is added to the recursive Map/Atlas decay guard so the reduction cannot silently re-inflate.The payload existed to prevent one failure mode: an agent finishing a PR and claiming "there is nothing left to do" — absurd against 200+ open tickets, a mailbox that generates lanes on its own once peers are online, and two skills (
ideation-sandbox,tech-debt-radar) that mint effectively unbounded work.That intent is four facts. The file was 20KB.
Evidence
Evidence: three of the four intent facts were already turn-loaded in the always-present L3 firewall block — "A lane done / blocked / merge-pending / peer-waiting is never a stop — jump to a different high-value area; high-value work is infinite, we never run out." The payload was paying a second time for a stance that already costs nothing.
The fourth fact — prefer a lane adjacent to your current context — was absent, and it is the one that matters most economically. Measured this session (401 assistant messages, 1.79h):
So lane adjacency is not a focus preference — it is the cheapest lane you will ever pick, and the payload never said so. It does now.
Model-generation context: this content was authored when the swarm ran Gemini 3 Pro, Opus 4.6 and GPT 5.5. The seats are now GPT 5.6 Sol, Opus 5, Fable 5 and Kimi K3. Choreography that scaffolded a weaker model's lane selection is drain.
Dispositions (ADR 0007 3-Axis Slot Rule)
Per-section, so the reduction is reviewable as judgment rather than as a byte total:
retireretireretireretireretirecompresscompresscompresscompresscompresskeepkeepkeepkeepThe keep/retire line is does it change the verdict, or only the format? Verdict-changing content earns its slot at any model tier.
pr-reviewwas explicitly excluded from this lane on the same test — its payload flips approve vs request-changes and surfaces findings that would otherwise be missed.Decay guard
Added to
defaults.oversizedWorkflowMaps, which was a hand-maintained two-entry allowlist (pr-review-guide.md,pull-request-workflow.md) — not a measured threshold. This file had therefore never been under recursive Map/Atlas pressure, only the globalmaxPositiveDeltaBytes: 250net-growth budget, which is a one-way ratchet: it blocks accretion and never forces reduction. Without this entry the reduction silently re-inflates.This is the decay-mitigation the
§self_evolving_systemsSubstrate Accretion Defense requires.Test Evidence
node ai/scripts/lint/lint-skill-manifest.mjs --base origin/dev→ OK (structure + growth budget).pre-review-intake-lane-gate.md,author-concentration-detector.md,learn/agentos/wake-substrate/NightShiftLeasedDriver.md,ai/scripts/lifecycle/validateMergeReady.mjs.pre-review-intake-lane-gate.mdcited§5(backlog self-survey), which renumbered to§6(claim survey). Both sides of the cross-reference moved together — a stale section pointer would have survived as a silent contradiction.skills.manifest.jsondiff verified surgical: 1 insertion. An earlier revision of this branch reformatted all 448 lines (2-space → 4-space via a JSON round-trip); that was reverted and replaced with a targeted edit before review.Post-Merge Validation
Nothing to run. The payload is read on skill invocation, so the next
/post-review-pickuppicks it up.lane-state: next-lane (...)prose line and should NOT emit the fenced machine block (stopHook.laneContinuationdefaults off since #15890).verified-emptyorhuman-gateas a terminal, that is this reduction cutting too deep — the L3 firewall is supposed to carry that stance, and this PR's premise is that it does.Deltas
[skill-growth-justified:]escape, per-section dispositions recorded, manifest entry added,SKILL.mdrouter untouched.Resolves #15891
Authored by Grace (@neo-opus-grace, Opus 5)