/vision
You are running the vision skill. Produce a VISION.md the author can approve: an
acceptance policy for the project's future, grounded in what they actually build, and
sharpened by hypotheticals they answer on a review board.
This is not a writing exercise. Follow this file top to bottom.
Provenance
Adapted from the upstream kunchenguid/vision
Agent Skill (MIT). The pipeline, hard rules, output anatomy, and the review-board
house style are upstream. Three things are localized to this repo and are the reason
this is a first-class skill rather than a vendor-manifest.json entry — the vendor
fetcher overwrites files in place and would clobber all three:
- Evidence ladder (Step 3) — mines this repo's decision artifacts (OpenSpec specs
and archived proposals,
docs/decisions/ capability timelines, merge logs) ahead of
PR titles, rather than treating merged-PR history as the primary source.
- Review-loop transport (Step 6) — verdicts return through
AskUserQuestion, this
repo's established human-gate tool, instead of npx -y lavish-axi. No external
service and no npm dependency sit between the author and their own vision.
- Repo conventions — house frontmatter keys, the
<skill-base-dir> path rule, the
worktree mutation guard, and the tail-block contract enforced by
skills/tests/vision/.
When syncing upstream improvements, re-adapt these three; do not overwrite them.
Hard rules
- Evidence over vibes. Every principle in the draft must be traceable to concrete
evidence: a named spec requirement, archived proposal, ADR entry, PR, commit, file,
or the author's recorded answers. Generic engineering virtues ("we value quality")
are banned unless the history demonstrates them specifically.
- Check for an existing VISION.md first. If one exists on the default branch,
switch to delta mode: treat it as the approved baseline, propose line-level candidate
changes from evidence newer than it, and never write a competing document.
- The author owns the vision. You draft, stress-test, and fold in their verdicts;
you never approve, never soften a hypothetical to please, and never fold in a
principle they did not state or demonstrate.
- A vision is an acceptance policy. Write testable accept/resist criteria in
declarative present tense, with explicit non-goals, so a future reader — human or
agent — can apply them to a concrete change.
- No softball hypotheticals. Each one must sit on a genuine fault line where yes
and no are both defensible, with both sides steelmanned. If you can predict the
author's answer, replace the hypothetical.
- The review board is built from the shipped template, and verdicts come back
through the host. The board is the shipped template with only its slots filled,
never restyled or restructured; verdicts return via
AskUserQuestion, never by you
reading an answer into the record yourself. Mechanics in Step 6.
- Iterate in batches, trace every edit. Each author verdict maps to a named edit in
a changelog; the author must be able to see exactly how their answer changed the text.
- Formatting of the VISION.md output. One sentence per line. Plain hyphens, never
em dashes. No roadmap, no feature list, no marketing voice. (This rule governs the
drafted VISION.md only, not this skill file or your chat replies.)
Pipeline
Step 0 - Parse target and author
- Target repo: current working directory by default, or an explicit
owner/repo.
- Author: the person whose vision this is; default to the repo owner. Their merged work
is the evidence base.
- Ask one short question via
AskUserQuestion if the target or author is genuinely
ambiguous. Do not ask if the default is obvious.
Step 0b - Claim a work surface [mutating skill]
This skill writes VISION.md and an answers file. Where they land depends on the
target resolved in Step 0:
Target is the current repo (the default): the launcher invariant applies — never
mutate the shared checkout in local CLI execution.
eval "$(python3 "<skill-base-dir>/../worktree/scripts/worktree.py" setup vision)"
cd "$WORKTREE_PATH"
python3 "<skill-base-dir>/../shared/checkout_policy.py" require-mutation
In cloud-harness environments both calls short-circuit to success — the container
already provides isolation. Full rules: docs/guides/worktree-management.md in the
consumer project.
Target is an external owner/repo: the write surface is a clone of the target,
never this repo's checkout or worktree. Clone the target, work there, and skip the
worktree/guard calls above — they govern this repo only. If the target clone is
read-only (no push access), still draft there and deliver the files to the author
instead of pushing.
Everywhere below, "the work surface" means whichever of these Step 0b resolved.
Step 1 - Learn the pattern
A VISION.md has a stable anatomy; hold the draft to it:
- Identity opener: "X exists so that ...", who it serves, and "It owns exactly one
thing: ...".
- 3-6 principle sections with short declarative headings, each a set of testable
present-tense commitments and refusals.
- Explicit non-goals, named concretely ("it is not a CI system, not a ...").
- A closing pair of tests: "A change aligns when ..." and "A change should be resisted
when ...", concrete enough to apply to a real PR.
- Voice: declarative, present tense, zero marketing; length 40-70 lines.
If the author names exemplar visions, read them; note shape, voice, length.
Step 2 - Existing-vision check
- If the default branch has a
VISION.md: delta mode (hard rule 2). Diff its age
against the history and propose only evidence-backed candidate additions or edits,
as a numbered list, each independently acceptable.
- If not: from-scratch mode.
Step 3 - Mine the evidence
Work down this ladder. Tier A is the primary source in this repo — a merged PR
title tells you what was built; an archived proposal with its rejected alternatives
tells you what was chosen over what, which is the raw material of an acceptance
policy. Skip a tier only when its artifacts do not exist.
If no tier yields readable history, stop and say so. Never fabricate the
author's values, PR titles, proposals, or evidence. A vision built on invented
evidence is worse than no vision.
Tier A - Decision artifacts (OpenSpec repos)
| Source |
What it reveals |
openspec/project.md |
Stated purpose, stack, conventions. Test these claims against behavior; where they diverge, the behavior is the value. |
openspec/specs/<capability>/spec.md |
Standing commitments the project holds itself to. Requirements are already written as testable criteria — the vision's closest existing relative. |
openspec/changes/archive/*/proposal.md |
What was accepted, and the stated why. The strongest revealed-value signal in the repo. |
openspec/changes/archive/*/design.md |
Trade-offs weighed and alternatives rejected. A rejected alternative is a refusal with reasoning attached — mine these hardest. |
docs/decisions/<capability>.md |
Capability timelines with active / superseded status and Supersedes links. A superseded decision is a value the project changed its mind about; the reversal is evidence. |
docs/guides/*.md |
Conventions codified enough that someone wrote them down. |
docs/lessons-learned.md, docs/mental-models.md |
Values the author articulated explicitly. Quote, do not paraphrase into generics. |
docs/merge-logs/ |
Merge-session decision records: what got integrated, what got held back. |
CLAUDE.md and docs/guides/* |
Standing instructions to agents. These are non-negotiables stated in the imperative — near-vision text already. |
Read broadly, then read deep: scan 30-60 archived proposal titles, then read 8-15 full
proposal.md + design.md pairs spread across the date range.
Tier B - Merged pull requests
gh pr list --author <owner> --state merged --limit 100 --json number,title,body,closedAt
One call returns titles and bodies together — scan 30-100 titles, then read 8-15 full
bodies spread across the range from the same payload; no per-PR gh pr view round
trips.
Tier C - Commit history
git log --author=<owner> --no-merges --format='%h %ad %s%n%b' --date=short
Titles and messages still reveal what the author builds. This repo uses conventional
commits, so feat(scope): prefixes cluster the work by capability for free.
Output of Step 3
- Extract recurring revealed values: what gets built, what gets refused, what class of
bug gets fixed at the root, what the author writes in intent statements, and what
got reversed (superseded ADRs, rejected alternatives, reverted changes).
- Produce a private evidence sheet:
value -> supporting specs, proposals, ADR entries, PRs, commits, or files. This sheet is the source of truth for every drafted line.
Step 4 - Draft
- Follow the Step 1 anatomy and the output template below.
- Every line must map to the evidence sheet. Length target: 40-70 lines.
- In delta mode, keep the baseline untouched and emit the numbered candidate list
Step 2 defines.
Step 5 - Design the hypotheticals
- 8-12 concrete change proposals per vision, aimed at the draft's fault lines. Draw from
this taxonomy:
- tempting-but-off-mission features the author will plausibly be asked for;
- principle collisions (simplicity vs capability, safety vs speed, generality vs
focus, cost vs quality);
- slippery slopes, where one reasonable step normalizes the next;
- scope expansions (new users, new content types, new hosts, teams);
- identity questions the draft leaves open.
- Format per hypothetical: id, title, the concrete proposal (2-4 sentences), the
principle it tests (quote the draft), and why the answer is non-obvious (steelman both
sides).
- Quality gate: delete and replace any hypothetical whose answer you can predict.
In an OpenSpec repo, the archive is a hypothetical generator. A proposal that was
accepted narrowly, or a design.md whose rejected alternative still looks defensible,
marks a fault line the author has already stood on once.
Step 6 - Review loop
The board is the reading surface; AskUserQuestion is the verdict channel. Both
are required: the board carries the full draft and both steelmen, which a question
prompt cannot hold; the question tool carries the verdict back to you, which a static
file cannot.
6a. Build the board
Copy <skill-base-dir>/assets/review-template.html and assets/review.css next to each
other on the work surface, then fill only the template's marked slots: {{PROJECT}},
{{RUN_NOTE}}, {{DRAFT_MARKDOWN}} (the full latest VISION.md text as one JSON
string literal — JSON.stringify it, replacing the quoted placeholder whole; raw
splicing breaks on the backticks the output template mandates), and the CARDS
array — one object per hypothetical: { id, title, body, tests, why }, every field
plain text (the board escapes them at render time).
Change nothing else. The template already carries the house structure: full draft on the
left, one card at a time on the right, the steelman in full view. No boilerplate gets
rewritten and no run gets restyled.
6b. Hand the board to the author
Write the board to VISION-review.html on the work surface. Do not launch a server,
install a package, or route the board through an external service. How the author
reaches it depends on where this session runs:
- Local session: give the author the path; the file opens in a browser directly.
- Remote session (cloud harness, container): a container-local path is unreachable
from the author's browser, so a bare path is never the handoff. Deliver the file
through the host's file-delivery mechanism (send/attach it for inline rendering), or
commit it to the working branch and hand the author the hosted file link.
The board's own verdict buttons record a local ledger the author can read back — treat
that ledger as a convenience, never as the channel of record.
6c. Collect verdicts
Ask through AskUserQuestion, in batches of 2-3 hypotheticals, one question per card:
- question: the card's title plus a one-line restatement of the proposal.
- header: the card id (
H-7).
- options:
In vision / Off mission / Conditional, each description naming the
concrete consequence for the draft if chosen.
- multiSelect:
false.
Include one open-ended reasoning question in the same call — the reasoning, not the
verdict, is what the vision gets rebuilt from. The tool takes at most 4 questions per
call, which is why a batch is 2-3 cards, never 4: the reasoning slot must always fit.
Authors can also attach reasoning per card via each question's free-form "Other" path;
harvest both.
If AskUserQuestion is unavailable in the current runtime, present the batch as a
numbered list in regular output and ask the author to respond inline, matching the
fallback convention plan-feature uses.
6d. Fold in and reply
On each batch: record the verdicts verbatim in a durable answers file
(VISION-answers.md), distill the principles they reveal, fold every verdict into the
draft, rebuild the board in place with the new draft text and remaining cards, and reply
with a changelog line per verdict:
H-7 Off mission -> authority section now opens with "the author approves; the tool never does"
Continue until the author approves or ends the session. Do not approve on their behalf;
do not treat silence as approval.
Step 7 - Finish
- Deliver: the approved
VISION.md text (or approved delta), the full hypothetical set
with recorded verdicts and reasoning, and the changelog.
- The answers file is durable calibration material; keep
VISION-answers.md next to the
vision and commit both.
- Commit and push per the consumer project's
docs/guides/git-conventions.md; the work
is not complete until git push succeeds. On a read-only external target (Step 0b),
delivery of the files to the author replaces the push — say which happened.
Output template (from-scratch mode)
# Vision
`{project}` exists so that {the one-sentence reason the project exists}.
It serves {the named user}, and it {what it turns their input into}.
It owns exactly one thing: {the single owned surface}.
## {Principle section, 3-6 of these}
{Declarative, testable, present-tense lines; one sentence per line.}
{Explicit boundaries: what is welcome, what is refused, and why.}
## Scope
{What this project is not, named concretely.}
{Where personal/private material stays, if applicable.}
{How the repo holds itself to its own standard, if applicable.}
A change aligns when {testable positive criteria}.
A change should be resisted when {testable negative criteria}.
Pre-flight checklist (before drafting)
Pre-approval checklist (before the author signs off)
Common Rationalizations
| Rationalization |
Why it's wrong |
| "The README already says what this project is — I can draft from that" |
A README states intent; the archive states what was actually chosen when intent collided with reality. Drafting from the README reproduces the marketing voice rule 8 bans. |
| "I know what the author would say to this hypothetical, so I'll record it and move on" |
Rule 3 makes the author the only approver. A predicted answer is an invented one, and rule 5 requires you to replace any hypothetical you can predict, not answer it. |
| "PR history is unreadable here, so I'll infer values from the code structure" |
Structure shows what exists, not what was refused. Tier C (git log) is the floor; below it the skill stops rather than infers. |
| "The board collects verdicts, so I can read them off the ledger" |
The in-page ledger is a convenience for the author. Verdicts of record arrive through AskUserQuestion (6c); reading the ledger back means you never confirmed the author committed to it. |
| "This vision is generic because the project is generic" |
Generic principles mean the evidence sheet is thin, not that the project lacks values. Go back to Tier A rejected alternatives and superseded ADRs. |
Red Flags
- A drafted principle has no entry in the evidence sheet, or its entry cites the draft
itself.
- The vision contains a roadmap, a feature list, or the word "world-class".
- Every hypothetical resolved
In vision — the fault lines were softballs (rule 5).
VISION.md changed but VISION-answers.md did not, or a changelog line names no
verdict id.
- The skill reported an approved vision without a recorded author verdict on approval.
- The board was restyled, restructured, or replaced with a different review surface.
- Evidence citations are all from one month of history, or all from one capability.
Verification
- Every line of the delivered
VISION.md maps to a named entry in the evidence sheet
(spec requirement, archived proposal, ADR entry, PR, commit, or recorded verdict).
- The hypothetical set numbers 8-12, and each carries a quoted draft principle plus a
two-sided steelman.
VISION-answers.md exists beside VISION.md, and every verdict in it has a matching
changelog line naming the edit it produced.
- The board file was generated from
assets/review-template.html with only the four
slots filled — diff against the shipped template shows changes confined to
{{PROJECT}}, {{RUN_NOTE}}, {{DRAFT_MARKDOWN}}, and CARDS.
- The author's approval is recorded explicitly; no step inferred it from silence.
1---2name: vision3description: Draft and stress-test a VISION.md for a repository, then iterate with the author until they approve it. Mines the repo's real decision record — OpenSpec specs and archived change proposals, capability-timeline ADRs, merged PRs, git history — for evidence, drafts the vision as a testable acceptance policy, and stress-tests it with fault-line hypotheticals only the author can answer. Use on /vision, or when asked to write, refine, or stress-test a project vision, a statement of what a project refuses to become, or contribution-acceptance criteria.4---56# /vision78You are running the **vision** skill. Produce a VISION.md the author can approve: an9acceptance policy for the project's future, grounded in what they actually build, and10sharpened by hypotheticals they answer on a review board.1112This is not a writing exercise. Follow this file top to bottom.1314## Provenance1516Adapted from the upstream [`kunchenguid/vision`](https://github.com/kunchenguid/vision)17Agent Skill (MIT). The pipeline, hard rules, output anatomy, and the review-board18house style are upstream. Three things are localized to this repo and are the reason19this is a first-class skill rather than a `vendor-manifest.json` entry — the vendor20fetcher overwrites files in place and would clobber all three:21221. **Evidence ladder** (Step 3) — mines this repo's decision artifacts (OpenSpec specs23 and archived proposals, `docs/decisions/` capability timelines, merge logs) ahead of24 PR titles, rather than treating merged-PR history as the primary source.252. **Review-loop transport** (Step 6) — verdicts return through `AskUserQuestion`, this26 repo's established human-gate tool, instead of `npx -y lavish-axi`. No external27 service and no npm dependency sit between the author and their own vision.283. **Repo conventions** — house frontmatter keys, the `<skill-base-dir>` path rule, the29 worktree mutation guard, and the tail-block contract enforced by30 `skills/tests/vision/`.3132When syncing upstream improvements, re-adapt these three; do not overwrite them.3334## Hard rules35361. **Evidence over vibes.** Every principle in the draft must be traceable to concrete37 evidence: a named spec requirement, archived proposal, ADR entry, PR, commit, file,38 or the author's recorded answers. Generic engineering virtues ("we value quality")39 are banned unless the history demonstrates them specifically.402. **Check for an existing VISION.md first.** If one exists on the default branch,41 switch to delta mode: treat it as the approved baseline, propose line-level candidate42 changes from evidence newer than it, and never write a competing document.433. **The author owns the vision.** You draft, stress-test, and fold in their verdicts;44 you never approve, never soften a hypothetical to please, and never fold in a45 principle they did not state or demonstrate.464. **A vision is an acceptance policy.** Write testable accept/resist criteria in47 declarative present tense, with explicit non-goals, so a future reader — human or48 agent — can apply them to a concrete change.495. **No softball hypotheticals.** Each one must sit on a genuine fault line where yes50 and no are both defensible, with both sides steelmanned. If you can predict the51 author's answer, replace the hypothetical.526. **The review board is built from the shipped template, and verdicts come back53 through the host.** The board is the shipped template with only its slots filled,54 never restyled or restructured; verdicts return via `AskUserQuestion`, never by you55 reading an answer into the record yourself. Mechanics in Step 6.567. **Iterate in batches, trace every edit.** Each author verdict maps to a named edit in57 a changelog; the author must be able to see exactly how their answer changed the text.588. **Formatting of the VISION.md output.** One sentence per line. Plain hyphens, never59 em dashes. No roadmap, no feature list, no marketing voice. (This rule governs the60 drafted VISION.md only, not this skill file or your chat replies.)6162## Pipeline6364### Step 0 - Parse target and author6566- Target repo: current working directory by default, or an explicit `owner/repo`.67- Author: the person whose vision this is; default to the repo owner. Their merged work68 is the evidence base.69- Ask one short question via `AskUserQuestion` if the target or author is genuinely70 ambiguous. Do not ask if the default is obvious.7172### Step 0b - Claim a work surface [mutating skill]7374This skill writes `VISION.md` and an answers file. Where they land depends on the75target resolved in Step 0:7677- **Target is the current repo** (the default): the launcher invariant applies — never78 mutate the shared checkout in local CLI execution.7980 ```bash81 eval "$(python3 "<skill-base-dir>/../worktree/scripts/worktree.py" setup vision)"82 cd "$WORKTREE_PATH"83 python3 "<skill-base-dir>/../shared/checkout_policy.py" require-mutation84 ```8586 In cloud-harness environments both calls short-circuit to success — the container87 already provides isolation. Full rules: `docs/guides/worktree-management.md` in the88 consumer project.8990- **Target is an external `owner/repo`**: the write surface is a clone of the *target*,91 never this repo's checkout or worktree. Clone the target, work there, and skip the92 worktree/guard calls above — they govern this repo only. If the target clone is93 read-only (no push access), still draft there and deliver the files to the author94 instead of pushing.9596Everywhere below, "the work surface" means whichever of these Step 0b resolved.9798### Step 1 - Learn the pattern99100A VISION.md has a stable anatomy; hold the draft to it:101102- Identity opener: "X exists so that ...", who it serves, and "It owns exactly one103 thing: ...".104- 3-6 principle sections with short declarative headings, each a set of testable105 present-tense commitments and refusals.106- Explicit non-goals, named concretely ("it is not a CI system, not a ...").107- A closing pair of tests: "A change aligns when ..." and "A change should be resisted108 when ...", concrete enough to apply to a real PR.109- Voice: declarative, present tense, zero marketing; length 40-70 lines.110111If the author names exemplar visions, read them; note shape, voice, length.112113### Step 2 - Existing-vision check114115- If the default branch has a `VISION.md`: delta mode (hard rule 2). Diff its age116 against the history and propose only evidence-backed candidate additions or edits,117 as a numbered list, each independently acceptable.118- If not: from-scratch mode.119120### Step 3 - Mine the evidence121122Work down this ladder. **Tier A is the primary source in this repo** — a merged PR123title tells you what was built; an archived proposal with its rejected alternatives124tells you what was *chosen over what*, which is the raw material of an acceptance125policy. Skip a tier only when its artifacts do not exist.126127If **no** tier yields readable history, **stop** and say so. Never fabricate the128author's values, PR titles, proposals, or evidence. A vision built on invented129evidence is worse than no vision.130131#### Tier A - Decision artifacts (OpenSpec repos)132133| Source | What it reveals |134|---|---|135| `openspec/project.md` | Stated purpose, stack, conventions. Test these claims against behavior; where they diverge, the behavior is the value. |136| `openspec/specs/<capability>/spec.md` | Standing commitments the project holds itself to. Requirements are already written as testable criteria — the vision's closest existing relative. |137| `openspec/changes/archive/*/proposal.md` | What was accepted, and the stated why. The strongest revealed-value signal in the repo. |138| `openspec/changes/archive/*/design.md` | Trade-offs weighed and **alternatives rejected**. A rejected alternative is a refusal with reasoning attached — mine these hardest. |139| `docs/decisions/<capability>.md` | Capability timelines with `active` / `superseded` status and `Supersedes` links. A superseded decision is a value the project *changed its mind about*; the reversal is evidence. |140| `docs/guides/*.md` | Conventions codified enough that someone wrote them down. |141| `docs/lessons-learned.md`, `docs/mental-models.md` | Values the author articulated explicitly. Quote, do not paraphrase into generics. |142| `docs/merge-logs/` | Merge-session decision records: what got integrated, what got held back. |143| `CLAUDE.md` and `docs/guides/*` | Standing instructions to agents. These are non-negotiables stated in the imperative — near-vision text already. |144145Read broadly, then read deep: scan 30-60 archived proposal titles, then read 8-15 full146`proposal.md` + `design.md` pairs spread across the date range.147148#### Tier B - Merged pull requests149150```bash151gh pr list --author <owner> --state merged --limit 100 --json number,title,body,closedAt152```153154One call returns titles and bodies together — scan 30-100 titles, then read 8-15 full155bodies spread across the range from the same payload; no per-PR `gh pr view` round156trips.157158#### Tier C - Commit history159160```bash161git log --author=<owner> --no-merges --format='%h %ad %s%n%b' --date=short162```163164Titles and messages still reveal what the author builds. This repo uses conventional165commits, so `feat(scope):` prefixes cluster the work by capability for free.166167#### Output of Step 3168169- Extract recurring revealed values: what gets built, what gets refused, what class of170 bug gets fixed at the root, what the author writes in intent statements, and **what171 got reversed** (superseded ADRs, rejected alternatives, reverted changes).172- Produce a private evidence sheet: `value -> supporting specs, proposals, ADR entries,173 PRs, commits, or files`. This sheet is the source of truth for every drafted line.174175### Step 4 - Draft176177- Follow the Step 1 anatomy and the output template below.178- Every line must map to the evidence sheet. Length target: 40-70 lines.179- In delta mode, keep the baseline untouched and emit the numbered candidate list180 Step 2 defines.181182### Step 5 - Design the hypotheticals183184- 8-12 concrete change proposals per vision, aimed at the draft's fault lines. Draw from185 this taxonomy:186 - tempting-but-off-mission features the author will plausibly be asked for;187 - principle collisions (simplicity vs capability, safety vs speed, generality vs188 focus, cost vs quality);189 - slippery slopes, where one reasonable step normalizes the next;190 - scope expansions (new users, new content types, new hosts, teams);191 - identity questions the draft leaves open.192- Format per hypothetical: id, title, the concrete proposal (2-4 sentences), the193 principle it tests (quote the draft), and why the answer is non-obvious (steelman both194 sides).195- Quality gate: delete and replace any hypothetical whose answer you can predict.196197In an OpenSpec repo, the archive is a hypothetical generator. A proposal that was198accepted *narrowly*, or a `design.md` whose rejected alternative still looks defensible,199marks a fault line the author has already stood on once.200201### Step 6 - Review loop202203The board is the **reading surface**; `AskUserQuestion` is the **verdict channel**. Both204are required: the board carries the full draft and both steelmen, which a question205prompt cannot hold; the question tool carries the verdict back to you, which a static206file cannot.207208#### 6a. Build the board209210Copy `<skill-base-dir>/assets/review-template.html` and `assets/review.css` next to each211other on the work surface, then fill only the template's marked slots: `{{PROJECT}}`,212`{{RUN_NOTE}}`, `{{DRAFT_MARKDOWN}}` (the full latest VISION.md text as one JSON213string literal — `JSON.stringify` it, replacing the quoted placeholder whole; raw214splicing breaks on the backticks the output template mandates), and the `CARDS`215array — one object per hypothetical: `{ id, title, body, tests, why }`, every field216plain text (the board escapes them at render time).217218Change nothing else. The template already carries the house structure: full draft on the219left, one card at a time on the right, the steelman in full view. No boilerplate gets220rewritten and no run gets restyled.221222#### 6b. Hand the board to the author223224Write the board to `VISION-review.html` on the work surface. Do not launch a server,225install a package, or route the board through an external service. How the author226reaches it depends on where this session runs:227228- **Local session**: give the author the path; the file opens in a browser directly.229- **Remote session** (cloud harness, container): a container-local path is unreachable230 from the author's browser, so a bare path is never the handoff. Deliver the file231 through the host's file-delivery mechanism (send/attach it for inline rendering), or232 commit it to the working branch and hand the author the hosted file link.233234The board's own verdict buttons record a local ledger the author can read back — treat235that ledger as a convenience, never as the channel of record.236237#### 6c. Collect verdicts238239Ask through `AskUserQuestion`, in batches of 2-3 hypotheticals, one question per card:240241- **question**: the card's title plus a one-line restatement of the proposal.242- **header**: the card id (`H-7`).243- **options**: `In vision` / `Off mission` / `Conditional`, each `description` naming the244 concrete consequence for the draft if chosen.245- **multiSelect**: `false`.246247Include one open-ended reasoning question in the **same call** — the reasoning, not the248verdict, is what the vision gets rebuilt from. The tool takes at most 4 questions per249call, which is why a batch is 2-3 cards, never 4: the reasoning slot must always fit.250Authors can also attach reasoning per card via each question's free-form "Other" path;251harvest both.252253If `AskUserQuestion` is unavailable in the current runtime, present the batch as a254numbered list in regular output and ask the author to respond inline, matching the255fallback convention `plan-feature` uses.256257#### 6d. Fold in and reply258259On each batch: record the verdicts verbatim in a durable answers file260(`VISION-answers.md`), distill the principles they reveal, fold every verdict into the261draft, rebuild the board in place with the new draft text and remaining cards, and reply262with a changelog line per verdict:263264```265H-7 Off mission -> authority section now opens with "the author approves; the tool never does"266```267268Continue until the author approves or ends the session. Do not approve on their behalf;269do not treat silence as approval.270271### Step 7 - Finish272273- Deliver: the approved `VISION.md` text (or approved delta), the full hypothetical set274 with recorded verdicts and reasoning, and the changelog.275- The answers file is durable calibration material; keep `VISION-answers.md` next to the276 vision and commit both.277- Commit and push per the consumer project's `docs/guides/git-conventions.md`; the work278 is not complete until `git push` succeeds. On a read-only external target (Step 0b),279 delivery of the files to the author replaces the push — say which happened.280281## Output template (from-scratch mode)282283 # Vision284285 `{project}` exists so that {the one-sentence reason the project exists}.286 It serves {the named user}, and it {what it turns their input into}.287 It owns exactly one thing: {the single owned surface}.288289 ## {Principle section, 3-6 of these}290291 {Declarative, testable, present-tense lines; one sentence per line.}292 {Explicit boundaries: what is welcome, what is refused, and why.}293294 ## Scope295296 {What this project is not, named concretely.}297 {Where personal/private material stays, if applicable.}298 {How the repo holds itself to its own standard, if applicable.}299300 A change aligns when {testable positive criteria}.301 A change should be resisted when {testable negative criteria}.302303## Pre-flight checklist (before drafting)304305- [ ] Target repo and author resolved306- [ ] Work surface claimed (worktree setup + mutation guard, or cloud short-circuit)307- [ ] Existing VISION.md checked (mode chosen)308- [ ] Evidence sheet built from real artifacts at the highest available tier (no invented309 evidence)310311## Pre-approval checklist (before the author signs off)312313- [ ] Every drafted line traces to the evidence sheet or a recorded verdict314- [ ] 8-12 hypotheticals, none predictable, both sides steelmanned315- [ ] Every author verdict folded in with a traced changelog line316- [ ] Answers file saved next to the vision317318## Common Rationalizations319320| Rationalization | Why it's wrong |321|---|---|322| "The README already says what this project is — I can draft from that" | A README states intent; the archive states what was actually chosen when intent collided with reality. Drafting from the README reproduces the marketing voice rule 8 bans. |323| "I know what the author would say to this hypothetical, so I'll record it and move on" | Rule 3 makes the author the only approver. A predicted answer is an invented one, and rule 5 requires you to *replace* any hypothetical you can predict, not answer it. |324| "PR history is unreadable here, so I'll infer values from the code structure" | Structure shows what exists, not what was refused. Tier C (`git log`) is the floor; below it the skill stops rather than infers. |325| "The board collects verdicts, so I can read them off the ledger" | The in-page ledger is a convenience for the author. Verdicts of record arrive through `AskUserQuestion` (6c); reading the ledger back means you never confirmed the author committed to it. |326| "This vision is generic because the project is generic" | Generic principles mean the evidence sheet is thin, not that the project lacks values. Go back to Tier A rejected alternatives and superseded ADRs. |327328## Red Flags329330- A drafted principle has no entry in the evidence sheet, or its entry cites the draft331 itself.332- The vision contains a roadmap, a feature list, or the word "world-class".333- Every hypothetical resolved `In vision` — the fault lines were softballs (rule 5).334- `VISION.md` changed but `VISION-answers.md` did not, or a changelog line names no335 verdict id.336- The skill reported an approved vision without a recorded author verdict on approval.337- The board was restyled, restructured, or replaced with a different review surface.338- Evidence citations are all from one month of history, or all from one capability.339340## Verification3413421. Every line of the delivered `VISION.md` maps to a named entry in the evidence sheet343 (spec requirement, archived proposal, ADR entry, PR, commit, or recorded verdict).3442. The hypothetical set numbers 8-12, and each carries a quoted draft principle plus a345 two-sided steelman.3463. `VISION-answers.md` exists beside `VISION.md`, and every verdict in it has a matching347 changelog line naming the edit it produced.3484. The board file was generated from `assets/review-template.html` with only the four349 slots filled — `diff` against the shipped template shows changes confined to350 `{{PROJECT}}`, `{{RUN_NOTE}}`, `{{DRAFT_MARKDOWN}}`, and `CARDS`.3515. The author's approval is recorded explicitly; no step inferred it from silence.