Skip to content

Commit 30d3a87

Browse files
authored
docs(chart): name the destination test and refuse direction-only prompts (#285)
* docs(chart): name the destination test and refuse direction-only prompts Chart's premise is destination known, route unknown, but the documented entry condition ("one singular effort, oversized, unclear") admitted a theme. "Make flow-next more deterministic" passes every stated test and is unchartable: no end state means no Outcome, no boundary, and a map that never closes. - chart SKILL.md: new hard invariant for a missing destination, adjacent to the no-consequential-unknowns stop - chart workflow.md: phase 1.2 becomes two refusal shapes, the new one landing before grounding spend, with its own greppable verdict reason - chart examples.md: worked example 9 traces the refusal and the narrowing that makes the same idea chartable - guide SKILL.md: matching matrix row routing a theme to prospect or a narrowing, never to chart - test_chart_docs_inventory: asserts both skills name the test and the disqualifier, and that the refusal verdict string stays exact No version bump (batched release rule); staged under Unreleased. * fix(test): anchor the chart changelog assertion to 3.13.0, not the top section test_top_section_has_chart_entry_and_preserves_prior asserted that the FIRST changelog section contains /flow-next:chart, fn-135, #279 and the review sidecar entry. That pins release-specific content to a position, so the next release of any kind breaks it - as this branch's Unreleased section did on all four CI matrices while passing locally (the local run predated the CHANGELOG edit). The intent - chart's entry exists and its co-tenants were not clobbered - is preserved and now anchored to the 3.13.0 section itself. The top-heading shape assertion is unchanged. Also carries the destination test into both usage.md copies (template + dogfood, kept byte-identical) and names /flow-next:chart in the Unreleased entry, which reads better in a changelog anyway.
1 parent 6ebcd23 commit 30d3a87

13 files changed

Lines changed: 108 additions & 13 deletions

File tree

.flow/usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Task tracking for AI agents. All state lives in `.flow/`.
2222

2323
## Chart (optional pre-capture discovery)
2424

25-
One oversized/unclear idea; one decision (`<chart-id>.D<n>`) per invocation; never a pilot stage. `chart frontier` is the sole work-mode selection input; `chart claim` then `chart resolve --answer-file` close it; every work invocation ends with one greppable `CHART_VERDICT=...` line. Chart never writes specs; capture ingests the briefing.
25+
One oversized/unclear idea whose **destination is nameable but route is not** (a direction like "make X more Y" is refused - narrow it or run prospect); one decision (`<chart-id>.D<n>`) per invocation; never a pilot stage. `chart frontier` is the sole work-mode selection input; `chart claim` then `chart resolve --answer-file` close it; every work invocation ends with one greppable `CHART_VERDICT=...` line. Chart never writes specs; capture ingests the briefing.
2626

2727
## Common Commands
2828

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,22 @@
22

33
All notable changes to the flow-next.
44

5+
## Unreleased
6+
7+
### Changed
8+
9+
- **`/flow-next:chart` names the test it always applied: can you say what
10+
"arrived" looks like?** Chart's premise is *destination known, route unknown*, but the
11+
documented entry condition ("one singular effort, oversized, unclear")
12+
admitted a theme. A direction like "make the CLI more deterministic" has no
13+
end state, so no Outcome can be stated, nothing can be ruled out of scope,
14+
and the map never closes. Chart now refuses that shape before spending a
15+
grounding pass, says what is missing, and offers the two real routes:
16+
narrow to one effort whose arrival is nameable, or run `/flow-next:prospect`
17+
when the actual question is which effort to pick. `/flow-next:guide` gains
18+
the matching matrix row, and the skill carries a worked example of the
19+
refusal plus the narrowing that makes the same idea chartable.
20+
521
## [flow-next 3.13.0] - 2026-08-01
622

723
An oversized idea that is still wrapped in unknowns no longer has to become a

plugins/flow-next/codex/skills/flow-next-chart/SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ Attendance is stored and validated by flowctl for five types; `task` requires `-
9090
- **Claim before any work.** Refuse double-claim; release with note on stop; crash leaves claim visible.
9191
- **Attended hard gate.** Unattended driver + `attendance:attended` -> persist no answer, release or leave claim per workflow, terminate `NEEDS_HUMAN`.
9292
- **Prototype lifecycle.** Create/import one scoped throwaway artefact -> `chart attach-asset` while open -> present exact safe reference/revision -> record human reaction -> resolve/supersede. Interruption leaves asset + open D-ID resumable. Never rebuild, never infer approval, never promote prototype code into implementation.
93+
- **No nameable destination -> STOP.** Chart's premise is *destination known, route unknown*. A theme or direction ("make X more Y") has no end state to state as an Outcome and no boundary to rule anything out of scope. Offer narrowing to one effort with a stateable end state, or `/flow-next:prospect` when the real ask is which effort to pick; create nothing.
9394
- **No consequential unknowns -> STOP.** Recommend `/flow-next:capture` or the smaller direct route; create nothing.
9495
- **Over `chart.maxDecisions` (default 12).** Offer narrow Outcome or split first. Pass `--force-size --reason` only after explicit warning + consent read-back.
9596
- **Provenance lanes stay separate.** Grounding facts get citations under `## Notes` and never become D-IDs or acceptance-criterion trailing tags (`[user]` / `[paraphrase]` / `[inferred]` / `[strategy:*]`). fn-148 closed STOPPED with no verdict - **include NO verified/inferred fact grammar**.

plugins/flow-next/codex/skills/flow-next-chart/references/examples.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ Without consent after warning: create nothing; `CHART_VERDICT=NO_WORK chart=- de
102102

103103
---
104104

105+
### 9. "Make flow-next more deterministic - chart it"
106+
107+
| Field | Value |
108+
|---|---|
109+
| **Inferred operation** | Chart-mode refusal before grounding spend: the prompt names a **direction**, not a destination. No end state means no stateable Outcome, no boundary that can rule anything out of scope, and a map that never closes. Create nothing |
110+
| **Read-back point** | Say plainly what is missing (the end state), then offer exactly two routes: narrow to one effort whose arrival is nameable (invite the narrowed prompt), or `/flow-next:prospect` when the real ask is which determinism effort to pick |
111+
| **Evidence/consent boundary** | Do not silently chart a guessed narrowing - the user picks the effort. Do not chart "all of determinism" behind a `--force-size` override; the ceiling is not the problem here, the missing destination is |
112+
| **Terminal verdict** | `CHART_VERDICT=NO_WORK chart=- decision=- reason="direction not destination; narrow to one effort or run prospect"` |
113+
114+
Same prompt, narrowed by the user to *"make `flowctl list` output byte-identical across machines"*: now the destination is nameable and the route is genuinely unknown - chart it.
115+
116+
---
117+
105118
## Four adaptive traces (illustrative - not phases)
106119

107120
These are **possible** journeys. Real charts re-draw after every answer. Do not treat the steps as a fixed ceremony.

plugins/flow-next/codex/skills/flow-next-chart/workflow.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,15 @@ attended_unattended_cost:
169169

170170
Compose blocks with graceful degradation (`scanned: none (<reason>)` when a source is absent), matching prospect's style for strategy/specs/memory/git signals as relevant to the idea.
171171

172-
### 1.2 - No consequential unknowns -> STOP
172+
### 1.2 - Refuse to chart -> STOP (two shapes)
173173

174-
If after grounding the effort has **no consequential unknowns** (intent and boundaries already stateable; nothing worth parking; no decision that would change capture):
174+
**Shape A - no nameable destination.** Before anything else, confirm the idea has an end state you can name: the spec, decision, or change this effort is finding its way to. Chart's premise is *destination known, route unknown*. A theme or direction ("make the CLI more deterministic", "improve our test story") has no finish line, so no Outcome can be stated, nothing can be ruled out of scope, and the map never closes. Do not chart it and do not silently chart a guessed narrowing of it. Say what is missing, then offer exactly two routes: narrow to one effort with a stateable end state (invite the narrowed prompt), or run `/flow-next:prospect` when the real ask is which effort to pick. **Create nothing.**
175+
176+
```text
177+
CHART_VERDICT=NO_WORK chart=- decision=- reason="direction not destination; narrow to one effort or run prospect"
178+
```
179+
180+
**Shape B - no consequential unknowns.** If after grounding the effort has **no consequential unknowns** (intent and boundaries already stateable; nothing worth parking; no decision that would change capture):
175181

176182
1. Say so clearly.
177183
2. Recommend `/flow-next:capture` or authoring the spec / direct change path.

plugins/flow-next/codex/skills/flow-next-guide/SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Match the **starting state**. First clear match wins. Chart only when one oversi
4141
|---|---|---|---|
4242
| Looking for candidate investments across a domain | `/flow-next:prospect` | Domain search; need ranked candidates | Skip prospect when the idea is already singular. After selection: chart **only if** the candidate remains singular + oversized + unclear; otherwise capture |
4343
| One large idea, unclear boundaries, several consequential unknowns | `/flow-next:chart` then briefing then capture | Singular effort too big for one capture; unknowns block stating intent | Skip chart (`signal absent`) when intent and boundaries are already stateable - go capture or author the spec directly. Chart is never mandatory |
44+
| A theme or direction rather than one effort ("make X more Y") | `/flow-next:prospect`, or narrow to a single effort | No nameable end state, so no Outcome and no scope boundary | Chart cannot take this (`signal absent` for chart): it needs a destination whose route is unknown, not a direction. Narrow first, or prospect when the real ask is which effort to pick |
4445
| One meaningful idea whose intent and boundaries can already be stated | `/flow-next:capture` or author the spec directly | Clear meaningful idea | Skip chart (`signal absent`). Do not manufacture a chart for clear work |
4546
| Existing structured brief with resolved business and technical choices | `/flow-next:capture` the brief | Structured brief / chart briefing package ready | Skip chart. Narrow or skip interview **only after** capture read-back proves no material gaps - never pre-declare skip interview |
4647
| Tiny, local, low-risk change that fits one implementation context | Direct change + review path appropriate to the repo | One-context fix; low risk | Skip chart **and** the full spec pipeline (`signal absent`). Still run the review/consent gates the change would need |

plugins/flow-next/codex/templates/usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Task tracking for AI agents. All state lives in `.flow/`.
2222

2323
## Chart (optional pre-capture discovery)
2424

25-
One oversized/unclear idea; one decision (`<chart-id>.D<n>`) per invocation; never a pilot stage. `chart frontier` is the sole work-mode selection input; `chart claim` then `chart resolve --answer-file` close it; every work invocation ends with one greppable `CHART_VERDICT=...` line. Chart never writes specs; capture ingests the briefing.
25+
One oversized/unclear idea whose **destination is nameable but route is not** (a direction like "make X more Y" is refused - narrow it or run prospect); one decision (`<chart-id>.D<n>`) per invocation; never a pilot stage. `chart frontier` is the sole work-mode selection input; `chart claim` then `chart resolve --answer-file` close it; every work invocation ends with one greppable `CHART_VERDICT=...` line. Chart never writes specs; capture ingests the briefing.
2626

2727
## Common Commands
2828

plugins/flow-next/skills/flow-next-chart/SKILL.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ Attendance is stored and validated by flowctl for five types; `task` requires `-
8888
- **Claim before any work.** Refuse double-claim; release with note on stop; crash leaves claim visible.
8989
- **Attended hard gate.** Unattended driver + `attendance:attended` -> persist no answer, release or leave claim per workflow, terminate `NEEDS_HUMAN`.
9090
- **Prototype lifecycle.** Create/import one scoped throwaway artefact -> `chart attach-asset` while open -> present exact safe reference/revision -> record human reaction -> resolve/supersede. Interruption leaves asset + open D-ID resumable. Never rebuild, never infer approval, never promote prototype code into implementation.
91+
- **No nameable destination -> STOP.** Chart's premise is *destination known, route unknown*. A theme or direction ("make X more Y") has no end state to state as an Outcome and no boundary to rule anything out of scope. Offer narrowing to one effort with a stateable end state, or `/flow-next:prospect` when the real ask is which effort to pick; create nothing.
9192
- **No consequential unknowns -> STOP.** Recommend `/flow-next:capture` or the smaller direct route; create nothing.
9293
- **Over `chart.maxDecisions` (default 12).** Offer narrow Outcome or split first. Pass `--force-size --reason` only after explicit warning + consent read-back.
9394
- **Provenance lanes stay separate.** Grounding facts get citations under `## Notes` and never become D-IDs or acceptance-criterion trailing tags (`[user]` / `[paraphrase]` / `[inferred]` / `[strategy:*]`). fn-148 closed STOPPED with no verdict - **include NO verified/inferred fact grammar**.

plugins/flow-next/skills/flow-next-chart/references/examples.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ Without consent after warning: create nothing; `CHART_VERDICT=NO_WORK chart=- de
102102

103103
---
104104

105+
### 9. "Make flow-next more deterministic - chart it"
106+
107+
| Field | Value |
108+
|---|---|
109+
| **Inferred operation** | Chart-mode refusal before grounding spend: the prompt names a **direction**, not a destination. No end state means no stateable Outcome, no boundary that can rule anything out of scope, and a map that never closes. Create nothing |
110+
| **Read-back point** | Say plainly what is missing (the end state), then offer exactly two routes: narrow to one effort whose arrival is nameable (invite the narrowed prompt), or `/flow-next:prospect` when the real ask is which determinism effort to pick |
111+
| **Evidence/consent boundary** | Do not silently chart a guessed narrowing - the user picks the effort. Do not chart "all of determinism" behind a `--force-size` override; the ceiling is not the problem here, the missing destination is |
112+
| **Terminal verdict** | `CHART_VERDICT=NO_WORK chart=- decision=- reason="direction not destination; narrow to one effort or run prospect"` |
113+
114+
Same prompt, narrowed by the user to *"make `flowctl list` output byte-identical across machines"*: now the destination is nameable and the route is genuinely unknown - chart it.
115+
116+
---
117+
105118
## Four adaptive traces (illustrative - not phases)
106119

107120
These are **possible** journeys. Real charts re-draw after every answer. Do not treat the steps as a fixed ceremony.

plugins/flow-next/skills/flow-next-chart/workflow.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,15 @@ attended_unattended_cost:
167167

168168
Compose blocks with graceful degradation (`scanned: none (<reason>)` when a source is absent), matching prospect's style for strategy/specs/memory/git signals as relevant to the idea.
169169

170-
### 1.2 - No consequential unknowns -> STOP
170+
### 1.2 - Refuse to chart -> STOP (two shapes)
171171

172-
If after grounding the effort has **no consequential unknowns** (intent and boundaries already stateable; nothing worth parking; no decision that would change capture):
172+
**Shape A - no nameable destination.** Before anything else, confirm the idea has an end state you can name: the spec, decision, or change this effort is finding its way to. Chart's premise is *destination known, route unknown*. A theme or direction ("make the CLI more deterministic", "improve our test story") has no finish line, so no Outcome can be stated, nothing can be ruled out of scope, and the map never closes. Do not chart it and do not silently chart a guessed narrowing of it. Say what is missing, then offer exactly two routes: narrow to one effort with a stateable end state (invite the narrowed prompt), or run `/flow-next:prospect` when the real ask is which effort to pick. **Create nothing.**
173+
174+
```text
175+
CHART_VERDICT=NO_WORK chart=- decision=- reason="direction not destination; narrow to one effort or run prospect"
176+
```
177+
178+
**Shape B - no consequential unknowns.** If after grounding the effort has **no consequential unknowns** (intent and boundaries already stateable; nothing worth parking; no decision that would change capture):
173179

174180
1. Say so clearly.
175181
2. Recommend `/flow-next:capture` or authoring the spec / direct change path.

0 commit comments

Comments
 (0)