Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plugins/flow/skills/plan/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Opens a planning conversation. For `adapter: native` repos, this skill spawns th

# Fast path — one-shot authoring (`/flow:plan <feature>`)

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 <ref>` (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.

Expand Down
6 changes: 3 additions & 3 deletions plugins/flow/workflows/internal/gate-1.workflow.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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` +
Expand Down Expand Up @@ -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 <ref> 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.`)
Expand Down
Loading