diff --git a/plugins/flow/skills/plan/SKILL.md b/plugins/flow/skills/plan/SKILL.md index 5e5a0080..e77d89f1 100644 --- a/plugins/flow/skills/plan/SKILL.md +++ b/plugins/flow/skills/plan/SKILL.md @@ -16,7 +16,7 @@ Opens a planning conversation. For `adapter: native` repos, this skill spawns th # Fast path — one-shot authoring (`/flow:plan `) -When the operator invokes this skill with a plain-language **feature description** as the argument, draft a single story from it directly — no planning conversation, no multi-story elicitation. This is the lean "propose one feature" seam (Epic 9, gate 1); it spawns a lean **author** subagent (distinct from the conversational planner) that produces exactly one draft. +When the operator invokes this skill with a plain-language **feature description** as the argument, draft a single story from it directly — no planning conversation, no multi-story elicitation. This is the lean "propose one feature" seam (Epic 9 — the readiness review); it spawns a lean **author** subagent (distinct from the conversational planner) that produces exactly one draft. The drafted story is never auto-ready: it is written **parked not-ready** behind the readiness brake (Story 9.1). To grade and approve it, the operator runs `/flow:ready ` (which runs the judge panel as part of approving). Nothing the fast path drafts can be built until it is graded and approved — that is the gate working. diff --git a/plugins/flow/workflows/internal/gate-1.workflow.js b/plugins/flow/workflows/internal/gate-1.workflow.js index fde10ec9..32afa1dd 100644 --- a/plugins/flow/workflows/internal/gate-1.workflow.js +++ b/plugins/flow/workflows/internal/gate-1.workflow.js @@ -63,7 +63,7 @@ const seam = async (cmd, label, retryable = false) => { // Session id: prefer the launcher-minted id; fall back to minting one via the CLI. const SU = A.sessionUlid || (await seam(`node ${CLI} mintSessionUlid`, 'mint', true)).sessionUlid if (!SU) return { error: 'no-session-ulid' } -log(`gate-1 session=${SU} repo=${REPO} ref=${REF}`) +log(`readiness review session=${SU} repo=${REPO} ref=${REF}`) // --------------------------------------------------------------------------- // Read the draft spec text and manifest so we can pass it to the judges. @@ -266,7 +266,7 @@ const riskLabel = riskTier || 'medium (fallback)' const judgeSharedPrefix = `${judgePersona}\n\n` + `## Your task: grade a draft story against ONE lens\n\n` + - `You are a lens judge for the gate-1 panel. ` + + `You are a lens judge for the readiness review panel. ` + `Your ONLY job is to grade the draft below against your assigned lens, ` + `then call the CLI tool to record your verdict. ` + `You MUST call writeLensVerdict exactly once and then stop — do NOT edit any files, do NOT run any other commands.\n\n` + @@ -379,7 +379,7 @@ if (decision === 'ready') { } else if (decision === 'escalate') { const reason = adjudicateResult.verdict?.escalation_reason || adjudicateResult.verdict?.rationale || 'see verdict' const failedLenses = aggregateResult.verdict?.lenses?.filter((l) => !l.pass).map((l) => `[${l.lens}] ${l.missed}`).join('; ') - log(`ref=${REF} ESCALATED — one or more lenses failed (k=1, round=1 → immediate escalate). Failed lenses: ${failedLenses}. Operator: revise the draft and re-run gate-1.`) + log(`ref=${REF} ESCALATED — one or more lenses failed (k=1, round=1 → immediate escalate). Failed lenses: ${failedLenses}. Operator: the readiness review did not pass — revise the draft and re-run /flow:ready to grade it again.`) log(`Escalation reason: ${reason}`) } else { log(`ref=${REF} unexpected decision=${decision} — this workflow always uses round=1 k=1, so rework should never occur.`)