From 147f86a1df0df893340298c1cbb4cef89ac7f2b5 Mon Sep 17 00:00:00 2001 From: Pierre Brisorgueil Date: Thu, 16 Jul 2026 18:56:31 +0200 Subject: [PATCH] =?UTF-8?q?feat(skills):=20/feature=20non-interactive=20in?= =?UTF-8?q?vocation=20=E2=80=94=20structured=20SKIP/STOP=20instead=20of=20?= =?UTF-8?q?prompts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When an orchestrating agent invokes /feature #N headlessly, collision, gh-failure, closed-issue, aged-scope and plan-validation waits emit structured SKIP:/STOP: lines instead of prompting, with claim rollback on post-claim stops. Interactive sessions unchanged. Closes #4454 --- .claude/skills/feature/SKILL.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/.claude/skills/feature/SKILL.md b/.claude/skills/feature/SKILL.md index 6385dd760..f186d60e3 100644 --- a/.claude/skills/feature/SKILL.md +++ b/.claude/skills/feature/SKILL.md @@ -61,6 +61,26 @@ The issue `body` is the **primary scope source** — read it, not just the title - Fresh issue with matching references → continue silently. - If the user aborts at this gate, roll back the FULL claim from step 3 — `gh issue edit --remove-assignee @me` AND delete the `WIP —` comment just posted (`gh api -X DELETE repos///issues/comments/` — capture the id when posting, or take the last own `WIP —` comment). Leaving the comment behind would make step 2 treat the aborted claim as resumable on the next run. +### 4b. Non-interactive invocation (orchestrated runs) + +When the invoker's brief declares a **non-interactive run** (an orchestrating +agent executes the issue headlessly — no human present to answer), every +STOP-and-ask in this skill becomes a structured final line instead of a +question: + +| Interactive behavior | Non-interactive replacement | +|---|---| +| Collision prompt (any `y/N` row of the table above) | Emit `SKIP: collision — ` and stop | +| `gh` command failure (step 1) or `state == closed` | Emit `STOP: claim — ` and stop | +| Aged-scope drift confirmation (step 4) | Emit `STOP: freshness — ` and stop | +| Phase 0 "Present plan & wait for validation" | Satisfied by the issue body when the brief states the scope was validated upstream; insufficient scope → emit `STOP: scope — ` and stop | + +Never wait on a prompt in a non-interactive run. If the stop happens after +the claim (step 3) already landed, roll the claim back first (step 4's +rollback: `--remove-assignee` + delete the `WIP —` comment) so the aborted +attempt doesn't read as live work on the next run. Interactive sessions keep +the exact behavior above. + ### 5. Proceed to Phase 0 Continue to scope analysis below. @@ -99,7 +119,8 @@ For each user-facing flow this feature creates or modifies, identify: - UI elements needed - Open questions or scope decisions -**Wait for user validation before coding.** +**Wait for user validation before coding.** (Non-interactive runs: Phase 0.0 +§4b — a validated issue body satisfies this step; never wait.) ## Phase 1 — Implementation