From ba11b44917f4d397e6d23a6f3b7b2f5746b52067 Mon Sep 17 00:00:00 2001 From: Jack McIntyre Date: Wed, 24 Jun 2026 14:12:45 +1000 Subject: [PATCH] feat(01KVVGC2): An operator who grades a drafted story reads the result in plain language, never the bare internal name "gate-1" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace every operator-facing reference to the bare internal codename "gate-1" in the readiness-grading workflow and related skills with plain language ("the readiness review"). The bless/escalate log lines the operator reads after grading now say "readiness review" throughout; the send-back guidance on the escalate path explicitly says the readiness review did not pass and what to do next. The plan skill's fast-path prose is updated to match. No grading behaviour is changed — the five-lens panel, model assignments, and Quality Lead adjudication are identical. --- plugins/flow/skills/plan/SKILL.md | 2 +- plugins/flow/workflows/internal/gate-1.workflow.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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.`)