Ship names its documentation subagent at every decision point
- Add hoisted doc-sync invariant naming the /document-release subagent in Claude-host ship workflow body
- Add gate-tier E2E test proving a live agent actually fires the dispatch before creating the PR
- Add test/ship-document-release-dispatch.test.ts tripwire to pin the carved Step 18 contract
- Add test/skill-e2e-ship-docsync.test.ts gate-tier E2E validating the sliced Step 17→19 ship tail
- Add carve-guard anchors at each of three non-overlapping touchpoints in ship entry
- Restore visibility of /document-release subagent dispatch in /ship workflow that had been lost since v0.18.2.0
From gstack
/ship has dispatched /document-release as Step 18 since v0.18.2.0 but visibility was gone and nothing tested the handoff. Restored visibility: the section index, the STOP pointer, the Step 17 handoff line, and a new hoisted doc-sync invariant all name the /document-release subagent. A free tripwire pins the wording and carve-guard anchors pin each touchpoint independently. A new gate-tier E2E proves a live agent actually fires the dispatch before creating the PR. Doc-sync subagent named in the Claude-host ship workflow body at 4 decision points (section index, STOP pointer, Step 17 handoff, hoisted invariant). 9 out of 9 live runs fire the dispatch before PR creation. E2E asserts on the actual tool-call stream with a dispatch-specific matcher that a subagent merely quoting section text cannot satisfy. test/ship-document-release-dispatch.test.ts is a free tripwire pinning the carved Step 18 contract. test/skill-e2e-ship-docsync.test.ts is a gate-tier E2E that proves a live agent runs the sliced Step 17→19 ship tail and fires the dispatch matching the Step 18 prompt markers. Carve-guards ship entry has three non-overlapping per-touchpoint anchors. Ship-docsync registered in E2E_TOUCHFILES and E2E_TIERS (gate).