Read and change the harness-wide flow defaults — default model, reviewer slots and self-review model. Standalone, not a pipeline stage. Use for /flow-settings.
Resources
1Install
npx skillscat add tweety53/agents/flow-settings Install via the SkillsCat registry.
Read and change the harness-wide settings record flow settings get/set manage: the default
model (defaultModel) every /flow run's implementer, fixer and reviewer roles use unless a
session overrides it, the reviewer slots (reviewers) the review panel dispatches by default, and
the recorded value (selfReviewModel) unless a project overrides it — the archive-phase
self-review pass itself runs inline, on whatever model the archive session is already on, so
this field is resolved but governs no dispatch (step 9, skills/flow/archive.md).
This is a standalone command, not a pipeline stage. It takes no change name, reads and writes
no per-change state file, and marks no flow stage call. It changes the harness-wide store, not
any one change's record.
No flags. Per Command surface (skills/flow-contracts/pipeline.md), no /flow* command
accepts a flag; that rule extends to this command as part of the same family. The
only input is the operator's answers to the questions this skill asks interactively.
Announce at start: "Using flow-settings."
Workflow
1. Read current settings
CURRENT="$(flow settings get)"flow settings get prints one line of JSON: defaultModel (a string), reviewers (an array of
strings) and selfReviewModel (a string, empty meaning "the store's own default, fable"). A
non-zero exit means the store could not be reached — report the CLI's stderr verbatim and stop;
there is no per-harness fallback file for this record the way a per-change state file has one.
Print the current values plainly before asking anything:
Current flow settings:
default model: <defaultModel, verbatim>
reviewers: <comma-separated list from Reviewers, verbatim>
self-review model: <selfReviewModel, or "(fable — store default)" when empty>Then run step 3's conductor-depth check against the stored roster and print its line when it
fires — a roster saved before the check existed surfaces its gap here too, not only when the
operator changes something.
2. Offer to change each field
Ask about the three fields the settings store actually holds — defaultModel, reviewers andselfReviewModel. Use AskUserQuestion, one field at a time, starting from the current value
read in step 1:
- Default model — offer the harness's known model identifiers, read from
<agents repo>/stats/internal/store/settings.go'sValidModelsmap at the time this skill runs,
plus "keep current". This is the one value every/flowrun's implementer, fixer and reviewer
roles default to; a session can still override it via plain-language instruction, recorded per-run
rather than here. - Reviewers — offer the exact reviewer-slot ids read from
<agents repo>/stats/internal/store/settings.go'sValidReviewersmap at the time this skill runs, never a copy of that list written into this
file —ValidReviewersis that store's own enum and the only place it is canonical. This list is
the review panel: every id it holds is dispatched by every/flowrun until this command changes
it again, none held back as a fixed floor — resolution is canonical inskills/flow/SKILL.md's
Model resolution, dispatch inskills/flow/review-panel.md's roster. A per-run operator
instruction can add a slot for a single run without touching this list; an id's presence here is
what makes every run dispatch it. Offer the full
set as a multi-select seeded with the current list, plus "keep current", and say plainly when
asking that the selection made here becomes every subsequent run's panel, not just this one. The
CLI itself refuses an empty-reviewersbefore the store is ever contacted: its required-flags
check (<agents repo>/stats/cmd/flow/settings.go's-model and -reviewers are both required
check) exits 2, distinct from the store's own
exit-1 rejection covered in step 3 below — warn the operator before they try it that selecting zero
slots fails at step 3 with exit 2, rather than turning review off. - Self-review model — offer the same
ValidModelsset as Default model, plus an explicit
"Store default (fable)" option (maps to the empty string,-self-review-model "") and "keep
current". This field still resolves — the 5-angle retrospective/flowruns after a change
reachesFINISHED— but governs no dispatch: the archive session runs that pass inline, on
whatever model it is already on; an empty value is a legitimate, first-class choice, not a
fallback born of an unreachable store, so offer it as a named option rather than only as "keep
current". Empty resolves to the literalfable, unless<project>/.flow/project.md's## self review modelkey overrides it, per step 9 (skills/flow/archive.md).
If the operator keeps all three fields unchanged, say so and stop — do not callsettings set
for a no-op write.
3. Write the change
flow settings set -model "<defaultModel>" -reviewers "<comma,separated,list>" -self-review-model "<selfReviewModel>"-model and -reviewers are required by the CLI even when only one field changed — settings set
writes the whole record, replacing what was recorded before. -self-review-model is optional on
the CLI (omitting it means empty), but this skill always passes it explicitly — "keep current"
resolves to the value read in step 1, exactly as the other fields do — so a no-op run of this skill
never silently resets it to empty. Pass the value just confirmed for each field that changed, and
the value read in step 1 for each field that did not.
Before the write, tell the operator which slots cannot dispatch as themselves here. The
roster's slots spawn as The roster (skills/flow/review-panel.md) spawns them — onflow-low, or on flow-<effort> where the panel is decided — and a conductor whose harness
offers neither substitutes a harness-provided type (general-purpose) for those slots. Compare
each confirmed slot's spawn type against the agent types this session's own harness offers at
conductor depth, and when the type is absent print one line ahead of the write, naming every
affected slot in roster order:
⚠ roster: no `flow-low` agent type at conductor depth — primary, principles, bugbot will be substituted (general-purpose) at panel timeThe write proceeds either way: never a gate. Never
block the save on it and never drop a slot to silence it.
A non-zero exit means the store rejected the write (an invalid model or reviewer name) or could not
be reached. Print the CLI's stderr verbatim — it names the specific bad value on a rejection — and
do not report success.
On success, report exactly what changed against the values read in step 1: which field(s) changed,
old value → new value. A field left unchanged is not mentioned as a change.
Guardrails
- Never commit, stage, push, merge, or create a worktree or branch.
Commands (user-facing)
| Intent | Say |
|---|---|
| View and change the harness-wide flow defaults | /flow-settings |