feat(pipeline-cli): intake-compose verb for the format-2 sub-issue body — one composer, not N re-derivations (#3688)#3703
Conversation
|
review-code: advisory — blocking-set PR (manual merge) §CP PR ( Reviewed-head: @ abf132d Acceptance criteria (issue #3688)
Rebase-integrity checks (silent-revert class, #3678)
Gates at this head
Observation (non-blocking)The issue framed the migration as "~4 skills that re-derive the format (report / triage / plan-epic / …)"; this PR migrates one. That narrowing is correct, not a shortfall: the manifest signature discriminates a real format-2 filer by the co-occurrence of both section headings and a bare Verdict: PASS on substance — recorded as advisory; a |
|
review-skill: advisory — blocking-set PR (manual merge) §CP PR ( Reviewed-head: @ abf132d Behavioral-artifact review —
|
|
§CP bank — reviewed-ready, awaiting control-plane approval. Both gates PASS (advisory) at head
CI green. Per ADR 0135 this control-plane PR needs a non-author |
…dy — one composer, not N re-derivations (#3688) Add `pipeline-cli intake-compose sub-issue`: one tested composer that emits the format-2 sub-issue body of the gh-issue-intake-formats.md prose contract (§2) from a structured spec JSON, so a filer cites the verb instead of re-deriving the format by hand (#3254 / epic #3258). - Pure, unit-tested core (`compose.ts`): `composeSubIssueBody` emits the body deterministically; `validateSubIssueSpec` enforces the format-2 invariants (the ≥1-acceptance-criterion hard floor). - The verb emits the body BY VALUE to stdout only (no `--out` file), so the caller captures it into `$BODY` and posts `-f body="$BODY"` — the `gh api -f body=@<path>` machine-local-path leak (#2002 / #754 / PR #1567) is structurally unreachable. A command test covers the safe path. - Adopt same-commit: migrate plan-epic's child-body composition to call the verb and cite it; add the `intake-compose sub-issue` decision to the adoption-lint manifest (its signature isolates a real format-2 filer via the bare POST-/issues create tell, keeping the contract file and format-readers out of scope). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
48b4795 to
abf132d
Compare
Repair: rebased onto
|
|
§CP re-bank — reviewed-ready at the NEW head, awaiting fresh control-plane approval. This PR was rebased to resolve a conflict with landed #3697/#3696, which moved the head to Fresh gates both PASS (advisory) at
Silent-revert scrutiny clean: Per ADR 0135 this needs a fresh non-author |
Fixes #3688
What
Adds
pipeline-cli intake-compose sub-issue— one tested composer that emits the format-2 sub-issue body of thegh-issue-intake-formats.mdprose contract (§2) from a structured spec JSON, so a filer cites the verb instead of re-deriving the format by hand (#3254 / epic #3258).How
packages/pipeline-cli/src/tools/intake-compose/compose.ts):composeSubIssueBodyemits the body deterministically;validateSubIssueSpecenforces the format-2 invariants (the ≥1-acceptance-criterion hard floor,yes|noTDD flag, non-empty Stories / What-to-build).command.ts): the verb emits the body to stdout only (there is deliberately no--out <file>flag), so a caller captures it into$BODYand posts-f body="$BODY". Thegh api -f body=@<path>machine-local-path leak class (report skill: /tmp body-file collision is warned-against, not prevented — files one issue's body under another's title #2002 / plan-epic cross-epic body bleed: parallel runs cross-contaminate child bodies (structural floor misses it) #754 / PR feat(pipeline-cli): deterministic fail-closed trivial-diff classifier (ADR 0120 §1, #1557) #1567) is structurally unreachable — there is no file to@-reference. Acommand.test.tscase covers the safe path (asserts the emitted body carries no filesystem path).packages/pipeline-cli/src/registry.ts.plan-epic's child-body composition to call the verb and cite it, and added theintake-compose sub-issuedecision to the adoption-lint manifest (packages/pipeline-cli/src/tools/adoption-lint/manifest.ts). Its signature isolates a real format-2 filer via the barePOST /issuescreate tell, keeping the contract file (defines the format, no create) and format-readers (write-code) out of scope. Verified: over the full live corpus adoption-lint stays green (plan-epicmatches the signature and is now cited → 0 findings).Out of scope (per the issue): changing the prose contract's format itself, or the §CP path regex.
Acceptance criteria
-f body=@fileleak (stdout-only, no--out; a command test covers the safe path).Note
This is a §CP change (
packages/pipeline-cli+ the intake-format contract's consumer) — it banks for human approval, it does not auto-merge. The §CP path regex (CONTROL_PLANE_RE) and the format contract's meaning are unchanged; this is an extract-and-adopt only.Guards run locally
pnpm typecheck(pipeline-cli, incl. new test files) clean ·pnpm lint:worktreeclean · pipeline-cli tests green (intake-compose 16, adoption-lint full-corpus 15, router/commands 13) ·leak-guard scanclean on the diff · pre-commit + pre-push hooks passed.🤖 Generated with Claude Code