Table of Contents

Prose CLI Commands

GENERATED — do not hand-edit. Produced by CommandDocGenerator from the dispatch chain in src/Prose.Cli/Program.cs, which is the single source of truth for what the CLI actually does. To refresh:

dotnet run --project src/Prose.Cli -- --export-commands docs/CLI_COMMANDS.md

Every command executes inside Prose.Hub — Prose.Cli forwards to it and never touches the database itself. A command marked cost-gated spends LLM money and routes through the cost gate; everything else is deterministic or read-only. Most commands require a --universe <slug> scope.

A command marked DEACTIVATED still has its handler, but the gate at the top of Program.cs refuses it — see src/Prose.Cli/DeactivatedInstruments.cs for why and how to restore it. Reading that list from the same place the gate reads it is deliberate: RFC 0014 §2.4 is about a gate documented as seven checks, coded as six and advertised as five, and this reference is not going to repeat that.

291 commands. 30 deactivated. 10 cost-gated. 18 have no description in their dispatch comment (12 have neither a description nor a usage line); they are listed anyway with whatever could be recovered, because a reference that silently omits what it could not parse is worse than one that admits the hole.

--add-alias

prose --add-alias --value "<alias>" --entity <id-or-name> [--apply] [--force]

add one alias row to one entity (dry-run unless --apply). The other half of --delete-alias — re-binding a name the prose actually uses to the entity that owns it, which until now had no path outside create_character's aliases parameter.

handler AddAliasCli

--add-apparel

prose --add-apparel --file path.json

insert an Apparel item from an ApparelData JSON file.

handler AddApparelCli

--add-character

prose --add-character --file path.json

insert a Character from a CharacterData JSON file.

handler AddCharacterCli

--add-corponation

prose --add-corponation --file path.json

insert a CorpoNation from a CorponationData JSON file.

handler AddCorponationCli

--add-doc

prose --add-doc --title "…" --body-file path.md [--category essay] [--tags "a,b,c"] [--filename slug.md]

insert a worldbuilding Document directly into canon.

handler AddDocCli

--add-faction

prose --add-faction --file path.json

insert OR update a Faction from a FactionData JSON file. Upsert: include "id" to update, omit to create. Safe service-layer path (FactionRepository.Save) — no hand-SQL, collision-safe slugs.

handler AddFactionCli

--add-news

prose --add-news --file path.json

insert a News article from a NewsData JSON file.

handler AddNewsCli

--add-place

prose --add-place --file path.json [--print]

insert OR update a Place/District from a DistrictData JSON file. Upsert: include "id" to update, omit to create. Safe service-layer path (DistrictRepository.Save) — no hand-SQL, collision-safe slugs.

handler AddPlaceCli

--add-weapon

prose --add-weapon --file path.json

insert a Weapon from a WeaponryData JSON file.

handler AddWeaponryCli

--ambient-palette

prose --ambient-palette --character [--as-of date]

handler AmbientPaletteCli

--architecture-scan

prose --architecture-scan [--json] [--out <file>] [--top <n>] [--force]

automated inventory of every service/DI-registration/CLI-verb/MCP-tool/script in the tree, plus name-overlap clusters worth a second look. See ArchitectureScanCli class doc.

handler ArchitectureScanCli

--archive-book

prose --archive-book (--id ... | --slug ...) [--reason "..."] --universe <u>

snapshot a book's entire current live prose into ArchivedBooks — a pre-edit backup, read-only against the live content. See ArchiveBookCli class doc.

handler ArchiveBookCli

--ask

prose --ask "Question" [--k 8] [--type character]

cloud RAG over the canon corpus. Replaces the retired Ollama path.

handler AskCli

--assemble-scene

prose --assemble-scene (--beat <guid> | --text "<prose>") [--budget N]

X-Ray scene assembly (RFC 0002): print the entity roster + voice context block for a beat or raw prose. CLI twin of the MCP tool assemble_scene_context.

handler AssembleSceneCli

--audit-consistency

prose --audit-consistency [--json]

DataConsistencyService SSOT-drift audit (SQL-only, no LLM calls).

handler DataConsistencyCli

--audit-denorm

prose --audit-denorm Entities.TagsJson
prose --audit-denorm Characters.Affiliation

report flat-vs-bridge drift for a denormalised column.

handler AuditDenormCli

--audit-drift

prose --audit-drift           pretty-printed report
prose --audit-drift --json    JSON dump

report Character columns that disagree with their latest matching EntityStateEvents row. Lights up the static-vs-dynamic recipe only for columns that actually drifted.

handler AuditDriftCli

--auto-correct-nightly — DEACTIVATED

prose --auto-correct-nightly [--universe <slug>] [--dry-run] [--json]

the nightly AutoCorrect pass — pure ML/deterministic, zero LLM calls. Invoked by the Windows Task Scheduler task registered by scripts/register-autocorrect-task.ps1 at 2:00 AM Central every night. See AutoCorrectOrchestratorService for the pipeline.

handler AutoCorrectNightlyCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--auto-correct-status

prose --auto-correct-status [--list-runs]

list recent AutoCorrect runs and their undo state.

handler AutoCorrectUndoCli

--auto-correct-undo

prose --auto-correct-undo (--run-id <guid> | --last-n <N>)

rewind a nightly AutoCorrect run (or the last N logged actions) via the undo ledger.

handler AutoCorrectUndoCli

--auto-run — DEACTIVATED

prose --auto-run (--slug <slug> | --id <guid>) [--effort draft|standard] [--dry-run] [--force]

(no description in the dispatch comment — add one above the guard in Program.cs)

handler AutoRunCli · cost-gated (spends LLM money) · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--backfill-character-relationships

prose --backfill-character-relationships [--dry-run] [--json] One-time repair for CharacterRelationships.TargetEntityId never being resolved at save time.

handler BackfillCharacterRelationshipsCli

--backfill-character-state

backfill EntityStateEvents from the dynamic columns currently sitting on Characters (Location, LifeStatus, Role, Affiliation, Belongings*, Territory*, DailyLife). One-shot, idempotent.

handler StateBackfillCli

--backfill-coverage

prose --backfill-coverage --slug Populates BeatServiceLog + BeatModeLog for prose written before ProseWriterRouter existed, WITHOUT regenerating any beat. Runs the router's coverage-only path over each existing beat so --workflow-status has real logs to report.

handler BackfillCoverageCli

--backfill-entity-docs

prose --backfill-entity-docs --slug <slug> [--text]

backfill entity-doc MarkdownFiles rows for a book's characters. Replays EntityDocService.InferFromTextAsync over every beat goal (+ prose text with --text) so future prose generation and the DCM viz see per-character entity docs.

handler BackfillEntityDocsCli

--backfill-entity-presence

prose --backfill-entity-presence [--slug ] [--dry-run] Re-runs SceneContextAssembler's name/alias/embedding scan (no LLM call) against already-written beats with no BeatEntities roster yet — lets a missing-alias fix take effect without a live generation pass.

handler BackfillEntityPresenceCli

--backfill-meaning

prose --backfill-meaning --slug [--limit N] [--dry-run] Fill the MEANING coordinate (Beat.Description) for beats with prose but no meaning.

handler BackfillMeaningCli

--backfill-missing-characters

prose --backfill-missing-characters

materialize relational rows for active characters that are blob-only (no Characters row) — the no-data-loss gate before dropping the Character blob. (RFC 0007)

handler BackfillMissingCharactersCli

--backfill-missing-subtype-rows

prose --backfill-missing-subtype-rows [--dry-run] [--exclude-name ""]... One-time data repair: inserts a minimal Characters/Places row for any character/place Entities row that has none (root cause: raw SQL writes bypassing the app — see BackfillMissingSubtypeRowsCli).

handler BackfillMissingSubtypeRowsCli

--backfill-pov

prose --backfill-pov [--slug ] [--dry-run] Heuristically tags each beat's highest-scoring character-type BeatEntities row as BeatEntityPresence PresenceType='pov' — closes the gap where DocContextService's per-beat voice-pinning and the SACRED-FLAW/VOICE-DRIFT audits had no POV data for most books. No LLM call. See BackfillPovCli.cs.

handler BackfillPovCli

--backfill-short-name-alias

prose --backfill-short-name-alias [--universe glmz|scry|...] [--dry-run] Registers each multi-word-named character's first name as a CharacterAlias when missing — the root cause behind --backfill-entity-presence's low yield (prose refers to characters by first name; ScanNames only matches full Name or a registered alias). No LLM call.

handler BackfillShortNameAliasCli

--backfill-stubs

prose --backfill-stubs

backfill Entities.Status = 'stub' / 'canon' based on BeatEntityMentions. Entities with no BeatEntityMentions row → Status='stub' (excluded from universe graph). Entities that ARE mentioned → Status='canon'. Re-run after --scan-entity-mentions.

handler BackfillStubsCli

--backfill-synopses / --backfill-structure-roles

prose --backfill-synopses --slug [--model ] [--force] prose --backfill-structure-roles --slug [--force] Fill missing beat metadata without touching prose. Synopses via LLM (BeatGoal proxy for mode detection); StructureRole deterministically by book-global Save-the-Cat arc.

handler BackfillBeatMetaCli

--banned-names

prose --banned-names --list
prose --banned-names --add --name <name> [--notes <notes>]
prose --banned-names --remove --id <id>

CRUD for BannedNames — Prose-wide hard name ban, enforced at write time.

handler BannedNameCli

--barks-export

Portable-writing-service plan, Phase 4: narrow dialog-beat filter/export — see BarksExportCli's own doc comment.

handler BarksExportCli

--beat

prose --beat — fine-grained beat manipulation: insert --node <slug|id> [--after ] [--text "..."] delete --id [--node <slug|id>] update --id --text "..." (use '-' for stdin) meta --id [--title "..."] [--kind "..."] [--description "..."] [--tone "..."] ... show --id list --node <slug|id>

handler BeatCli

--beat-archive

prose --beat-archive --beat-id The Beat Context Archive (observability Part F5): everything that fed one beat, resolved as-of that beat's own BeatContextTrace timestamp — prose, per-service trace, full LLM prompt/response, entity roster resolved to that moment's canon, and DCM doc content as of that moment.

handler BeatArchiveCli

--beat-granularity

prose --beat-granularity [--slug | --code | --all] [--beats] Analyses beat-size distribution against the 4,000–7,500 char optimal range. Labels each beat as OK / SPLIT / MERGE and prints per-story stats. CPU-only — no LLM calls. Exit 0 = success.

handler BeatGranularityCli

--beat-index

prose --beat-index --slug [--json] [--tsv] Read-only, FREE dump of one book's per-beat metadata in reading order: position, chapter, chars, PlaceName + whether it resolved to a canon Place, SceneType/StructureRole/Act, and the trust state of Description against the beat's current TextHash. Exists because Beat.PlaceName had no read path at all — --extract-beat-locations wrote it and nothing could show you the result.

handler BeatIndexCli

--beat-positions

prose --beat-positions [--slug <slug-or-code-or-id>] [--all] [--dry] [--json]

stamp Beat.StoryPosition — a book's reading order as a number, which is the engine's authoritative story clock (author ruling 2026-09-04: track time in beats; the wall clock is an overlay for day/night alignment and short timers that have to add up). Deterministic and FREE: reads the order GetOrderedBeatsAsync already defines, writes an integer, touches no prose and marks no beat dirty. Re-run after anything that changes reading order.

handler BeatPositionsCli

--beat-write-trace

prose --beat-write-trace (--beat-id | --last) [--json] Single-source-writer RFC, step one: every LLM + embedding call one beat write made, by stage, with tokens/cost/wall time, plus the per-stage execution log and gate-skipped stages. Read-only, free.

handler BeatWriteTraceCli

--book / --ask

book operations — list / new / show / chapters / absorb / review / apply / export / delete. Run prose --book (no subcommand) to see full usage. --ask documents --book as its --node alias, so it is excluded here too.

handler BookCli

--book-report

prose --book-report --slug [--out

] [--code ] [--complete] [--no-export] Deterministic findings/convergence/decision-log pull for one book, written to Downloads\GLMZ_Book_Reports\drafts{CODE}[_complete].md, plus a BookReports DB row and the latest {CODE}_BookReport.md in the book's export directory (see BookReportService/BookReportStore/BookReportCli).

handler BookReportCli

--booktok

prose --booktok --slug <slug> --provider kling|runway|sora [--duration 8] [--dry-run] [--yes]
prose --booktok --standalone --cover-path <path> --title "<title>" --provider kling|runway|sora

composite a book's cover onto a 3D mockup template, generate a short AI image-to-video clip (hand shows the cover, opens it, flips pages) via a chosen video provider (kling/runway/sora), and assemble a vertical 1080x1920 #booktok MP4. Costs real money per call unless --dry-run, which stops after the local ImageMagick mockup.

--browse-repository

prose --browse-repository [--type ] [--search ] [--page N] [--format text|json] Browse entities by repository/type (built-in or custom) — no hand-written SQL required.

handler BrowseRepositoryCli

--burst-beats

prose --burst-beats [--min-chars 800] [--node slug] [--kind book] [--dry-run]

burst oversized beats (e.g. chapter-as-one-beat from old book imports) into paragraph-sized pieces. Idempotent — already-small beats are skipped on rerun.

handler BurstBeatsCli

--calibrate-obligations

(no description in the dispatch comment — add one above the guard in Program.cs)

handler ObligationCalibrationCli · cost-gated (spends LLM money)

--canon-retrieve

prose --canon-retrieve "<query>" [--k N] [--types t1,t2]

show what the universal canon reach pulls for a query, across ALL entity types — verifies the full-interconnect retrieval path.

handler CanonRetrieveCli

--causality-check / --affect-check / --interpersonal-check — DEACTIVATED

prose --causality-check / --affect-check / --interpersonal-check --slug [--json] "Behave like people" beat lenses: cause-effect (kill "and then"), emotion→action, and verbal+non-verbal interpersonal dynamics (the 90+ relational lever).

handler BeatLensCli · cost-gated (spends LLM money) · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--chapters

prose --chapters --slug <slug-or-code-or-id> [--json]

list a book's chapter units in reading order — the 100 ft rung of the Three Altitudes, previously unreachable from the CLI (every read path was a flat beat list, which is why a full-book read fell back to the one-line Description spine). Story Ledger Phase 1. Reuses SynopsisExportService's segmentation, so the listing matches story-synopsis.txt.

handler ChaptersCli

--character-depth-audit — DEACTIVATED

prose --character-depth-audit --universe <slug> [--json]

read-only survey — which characters have zero rows across every relational depth bridge (PsychologyTraits/StatScalars/ArchetypeScores/StoryHooks/SpeechPhrases), cross-referenced against BeatEntityMentions to separate "actually used in prose" from inert stub rows. Built to size the blast radius of a 2026-09-05 incident where --rebuild-readmodel overwrote a character's cached read-model (which held rich content) with an empty relational projection. Writes nothing.

handler CharacterDepthAuditCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--character-gear

prose --character-gear --character <name-or-id> [--bucket <b>] [--json]
prose --character-gear --character <name-or-id> --remove --id <rowId>
prose --character-gear --search "<text>" [--json]

surgical CRUD over a character's signature-gear / pharmaceuticals list. Added 2026-09-03 — there was no sanctioned way to remove ONE gear entry; create_character round-trips the whole record through the delete-all-and-reinsert mapper, so correcting a single invented item risked every other field. Logic lives in CharacterGearService, shared with the *_character_gear MCP tools. Universe-scoped (--character resolves through db.Characters), so it stays out of UniverseAgnosticCommands.

handler CharacterGearCli

--character-history / --story-edges

prose --character-history --entity <id|slug> [--in-book <CODE>]
prose --story-edges --entity <id|slug> [--relation <r>]

the story's own answers, from beat contributions (WO:01a13278).

handler StoryCli

--check-duplicate-beats — DEACTIVATED

prose --check-duplicate-beats --slug [--threshold 0.90] [--json] Corpus-wide near-duplicate-scene detector over prose embeddings (BeatDuplicateService). Candidate generator, not a verdict — verify by reading both beats before acting.

handler CheckDuplicateBeatsCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--check-temporal-hygiene

prose --check-temporal-hygiene [--json] Enforces (not just documents) the two rules that make re-enabling SYSTEM_VERSIONING on Nodes/Beats/BeatNodes safe: no IsEnabled/IsActive-style status-flag column on any versioned table, and no application query joins a live table to its own _History shadow. Run after any schema change touching a versioned table, not just once.

handler TemporalHygieneCli

--check-text-integrity

prose --check-text-integrity [--fix] [--json]

handler TextIntegrityCli

--clone-book

prose --clone-book (--id | --slug ) [--title "New Title"] [--book-code SM1]

handler CloneNodeCli

--close-all-sessions

prose --close-all-sessions Called by the /commit skill before every commit to close open edit sessions.

handler CloseAllSessionsCli

--close-session

prose --close-session (--slug | --session-id )

handler CloseSessionCli

--combat

prose --combat --file scene.json [--out prose.txt]
prose --combat --location "Hegewisch" --objective "..." --exchanges 6 --tone Cinematic

generate a resource-tracked combat sequence via CombatSceneWriter.

handler CombatCli

--command-log

prose --command-log [--since

] [--handler ] [--take N] [--json] Read back the Command Ledger — every CLI/MCP/cost-gated call Prose.Hub has executed.

handler CommandLogCli

--composition

prose --composition … The rebuilt beat-write pipeline's verbs. These ran as their own Prose.V4.Cli executable with a local DbContext while the pipeline lived in a separate v4\ folder; folded in 2026-09-20 they forward like every other command, so the Hub's resident services do the work and the rule that only the Hub reaches the database holds for them too.

handler CompositionCli

--compute-metrics

prose --compute-metrics [--slug | --all] CPU-only per-beat prose quality metrics: word count, sentence count, TTR, Flesch-Kincaid readability, dialogue proportion. Upserts into BeatProseMetrics. Safe to re-run nightly. Exit 0 = success.

handler BeatProseMetricsCli

--context

prose --doc-context --slug <node> [--goal "<text>"] [--budget <tokens>]
prose --context add     --doc <path|guid> [--node <slug>]   Pin doc into prompts
prose --context exclude --doc <path|guid> [--node <slug>]   Exclude doc
prose --context remove  --doc <path|guid> [--node <slug>]   Remove override
prose --context clear   [--node <slug>]                     Clear all overrides
prose --context status                                       Show active overrides

Doc Context Stack dry-run — print the rotating cast of .md docs that WOULD load for a node + optional scene text (tier, reason, score, budget). Read-only. CLI mode: manage user context overrides for the DocContextStack.

handler ContextCli

--continuity — DEACTIVATED

unified continuity store — migrate / stats / contradictions / resolve / entity. Run prose --continuity (no subcommand) to see full usage.

handler ContinuityCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--cost / --history

prose --cost              print session cost table
prose --cost --json       emit summary as JSON
prose --cost --reset      clear the ledger
prose --cost --history [--command <name>] [--take N] [--json]

show running token cost tally for the current process, or the durable per-command calibration data the cost gate estimates from. print CommandCostHistories — what each cost gate calibrates from When appended to another command (e.g. prose --expand-beat --slug foo --cost), the cost of that command's LLM calls is printed after the command finishes.

handler CostCli

--coverage

prose --coverage

per-entity-type reachability matrix (how much canon is embedded and thus pullable into prose). The standing gap-finder.

handler CoverageCli

--create-archetype

prose --create-archetype --name "<name>" [--category …] [--description …] [--behavioral-signature …]

[--under-stress …] [--at-rest …] [--will-always a;b] [--will-never a;b] [--unless a;b] [--tags a,b] Create or update an archetype — the CLI twin of MCP create_archetype. Same gap again: ArchetypeRepository.Save existed with nothing exposing it.

handler CreateArchetypeCli

--create-book

prose --create-book --title "..." [--code SRZR] [--kind book] [--description "..."] [--logline "..."] [--previous <slug|id>] [--parent <slug|id>]

create a new, EMPTY book — no outline, no beats. Plan it with planned beats (a title and a description, no text: prose --beat insert / MCP insert_beat), then write them.

handler CreateNodeCli

--create-material

prose --create-material --name "<name>" [--category …] [--description …] [--properties a,b,c]

[--applications a,b,c] [--tier …] [--cost …] [--tags a,b,c] [--append-lists] Create or update a material — the CLI twin of MCP create_material. Material was the one canon entity type with a relational table, a repository that could write it (MaterialRepository.Save), read surfaces on both CLI and MCP — and no write path at all.

handler CreateMaterialCli

--create-repository

prose --create-repository --name "Artifacts" [--category World] [--icon bi-box] [--description "..."]

create a runtime-defined repository (custom entity type).

handler CreateRepositoryCli

--create-universe

prose --create-universe --slug <slug> --name <name> [--theme <theme>] [--description <text>]

create a new Universe row. See CreateUniverseCli.

handler CreateUniverseCli

--create-vocabulary

prose --create-vocabulary --term "<term>" [--definition …] [--origin …] [--usage …]

[--category …] [--example …] [--tier …] [--tags a,b,c] [--append-tags] Create or update a vocabulary entry — the CLI twin of MCP create_vocabulary. Same gap as material: VocabularyRepository.Save existed with nothing exposing it.

handler CreateVocabularyCli

--cross-book-consistency-audit — DEACTIVATED

prose --cross-book-consistency-audit [--since ] Renamed from --consistency-audit (2026-08-30) — collided by word order with the unrelated --audit-consistency (DataConsistencyCli's SSOT-drift audit). Surfaces factual contradictions that span multiple story nodes by querying the existing ContinuityClaims table. CPU-only — no LLM calls. Exit 0 = clean, 1 = conflicts found.

handler CrossBookConsistencyAuditCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--data-scan

prose --data-scan --tool <name> [--apply] [--overwrite] --universe <slug>

DataScanUtility family (fix-phi/fix-identity/tag-lethality/tag-normalize/ assign-tiers/cross-reference) -- mass canon-entity maintenance tools. Defaults to a dry-run preview; pass --apply to actually write.

handler DataScanCli

--dcm-backfill

prose --dcm-backfill --slug [--dry-run] Retroactive DCM footprint for books written OUTSIDE the engine (update_beat_text / --edit-beat / --import-md bypass ProseWriterRouter, so step-0 entity inference never ran — PURSUED shipped 127 beats with zero entity docs this way). Runs EntityDocService.InferFromTextAsync over every enabled beat's prose; hash-gated, no prose touched. Run after --sync-markdown.

handler DcmBackfillCli

--dcm-viz

prose --dcm-viz --slug <slug> [--out <dir>]

DCM lifecycle visualization — dry-run context pass + Gantt .htm export.

handler DcmVizCli

--decision-log

prose --decision-log [--since

] [--session ] [--take N] [--json] Read back the Decision Ledger written by --log-decision.

handler DecisionLogCli

--delete-alias

prose --delete-alias --value "<alias>" [--type <character|place|…>] [--apply]

remove a bad entity alias row (dry-run unless --apply). The sanctioned fix for alias pollution — an ordinary phrase registered as an alias, which makes EntityMentionScanner tag that phrase as the entity corpus-wide.

handler DeleteAliasCli

--delete-canon-document

prose --delete-canon-document --type <DocumentType> --confirm <sectionCount> [--universe <slug>]

(no description in the dispatch comment — add one above the guard in Program.cs)

handler DeleteCanonDocumentCli

--delete-entity-cluster

prose --delete-entity-cluster --root --universe --confirm The execution half of --export-entity-cluster — hard-deletes the reviewed cluster after re-verifying the count and checking every entity for outside references. See DeleteEntityClusterCli.

handler DeleteEntityClusterCli

--delete-node

prose --delete-node --id Hard-delete a node and its BeatNode memberships. Beats that are exclusively owned by this node are also deleted. HARD RULE: never use raw sqlcmd DELETE on Nodes — use this command instead.

handler DeleteNodeCli

--deprecated-names

prose --deprecated-names --list [--universe <slug>]
prose --deprecated-names --add --universe <slug> --name <deprecatedName> --canonical <canonicalName> [--notes <notes>]
prose --deprecated-names --remove --id <id>

CRUD for DeprecatedEntityNames (list/add/remove).

handler DeprecatedNameCli

--derive-scenes

prose --derive-scenes --slug <slug|id> [--apply] [--gap-minutes N] Free and deterministic: group a chapter's existing beats into scenes by place change and time gap. Derives structure only — no beat is split, merged, reworded or reordered. Dry run unless --apply is passed.

handler DeriveScenesCli

--description-drift — DEACTIVATED

prose --description-drift --slug <slug-or-code-or-id> [--json]
prose --description-drift --all --universe <slug>

report beats whose Beat.Description was verified against prose that has since changed (DescriptionHash != TextHash). Deterministic — no LLM, no embeddings, no cost. Report-only per docs/LOGIC.md §4. Story Ledger Phase 1.

handler DescriptionDriftCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--detect-mojibake

prose --detect-mojibake --slug <slug|code|id> [--json]

read-only report of UTF-8-read-as-Windows-1252 corruption in a node's beats. Exits 1 when anything is found, so a runbook can loop prose --repair --fix-mojibake until 0.

handler DetectMojibakeCli

--dictionary

prose --dictionary list|add |remove |check … The author's spelling dictionary, the same rows as the Writer's "Add to dictionary" and Settings.

handler SpellingCli

--doc-context

(no description in the dispatch comment — add one above the guard in Program.cs)

handler DocContextCli

--doc-context-hook

(no description in the dispatch comment — add one above the guard in Program.cs)

handler DocContextHookCli

--dry-run

(no description in the dispatch comment — add one above the guard in Program.cs)

handler BookTokCli

--dual-read — DEACTIVATED

prose --dual-read --old <slug|id> --new <slug|id> [--panel <name>] [--readers N]

dual-read comparative review — the SAME pinned panel grades both versions of a story; pairs scores per reader (within-reader delta cancels taste bias) → keep/revert/merge verdict.

handler DualReadCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--duel — DEACTIVATED

prose --duel --beat-id --candidate [--goal "..."] [--apply] [--json] Blind A/B duel: beat's current prose vs a candidate revision. 3 voters (register/goal/reader lenses), three-way ballot; replace needs >=2 better with zero dissent; splits escalate to 7 voters with written rationales. Verdicts hash-cached by text pair. SS-LAW-17: invoking this IS the explicit ask. Exit 0 = replace, 1 = keep, 2 = error.

handler BeatDuelCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--duplicate-book

prose --duplicate-book (--id <guid|prefix> | --slug <slug>) --title "New Title"

deep-duplicate a node (and its sub-node tree) into a fresh, independent copy — every beat cloned to a new row (prose + metadata kept; audio/score/stale reset). Editing the copy never touches the original.

handler DuplicateNodeCli

--duplicate-entity-scan — DEACTIVATED

prose --duplicate-entity-scan --universe [--json] Deterministic scan for duplicate/near-duplicate character Entity names within a universe that aren't explained by legitimate cross-book OriginNodeId disambiguation. No LLM. Exit 0 = none found, 1 = candidates found (informational — read the prose before merging).

handler DuplicateEntityScanCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--duplicate-entity-scan-broad — DEACTIVATED

prose --duplicate-entity-scan-broad --universe [--entity-type ] [--json] LLM-assisted scan for duplicate rows the deterministic scan above cannot catch (a title/rank/ code suffix or otherwise different name for the same entity, not a 1-character typo). Two-stage cost-bounded design — see DuplicateEntityScanService.ScanBroadAsync. Report-only, costs real LLM calls — gated like other LLM-calling commands.

handler DuplicateEntityScanBroadCli · cost-gated (spends LLM money) · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--edit-beat

prose --edit-beat --slug <slug> (--beat-number N | --insert-after N) --file <path>

overwrite one beat's prose from a file, or insert a new beat after a position.

handler EditBeatCli

--edit-book

prose --edit-book (--id <guid|prefix> | --slug <slug>) [--top N]

review-driven auto-editor. Weight the latest reviews, target the lowest / most-flagged beats (raise the floor), and emit conservative before/after rewrite PROPOSALS (JSON) for an approval survey. Nothing is written.

handler EditNodeCli

--edit-distribution

prose --edit-distribution [--slug ] [--top N] [--json] RFC 0009 Phase 0: Beat.Version histogram per book + corpus-wide, and the most-rewritten beats. Read-only, free. The baseline that must not rise once the autonomous rewriters are deleted.

handler EditDistributionCli

--ensure-chapter

prose --ensure-chapter --slug | --all Enforce "every story has >= 1 chapter": wrap a flat story's direct beats into a single ChapterNode child (no-op if already chaptered). No LLM.

handler EnsureChapterCli

--entity-history

prose --entity-history (--id <guid> | --type <t> --slug <s>) [--as-of <utc>] [--diff <utc>]

an entity's version history, read from the system-versioned _History tables.

handler EntityHistoryCli

--entity-mentions

prose --entity-mentions --entity <id|slug> [--limit <n>]

list every beat that mentions a given entity (node, beat number, excerpt).

handler EntityMentionsCli

--entity-relationships

prose --entity-relationships --character <name-or-id> [--json] [--orphans]
prose --entity-relationships --character <name-or-id> --remove --id <rowId>
prose --entity-relationships --character <name-or-id> --add --target <name> --type <type>

surgical CRUD over a character's CharacterRelationships rows. Added 2026-09-02 — there was previously NO sanctioned way to remove a single relationship row (see EntityRelationshipCli's doc comment and the Seo Jisun cross-book contamination). Deliberately universe-scoped: --character resolves through db.Characters, which the Entity query filter scopes, so this stays out of UniverseAgnosticCommands.

handler EntityRelationshipCli

--entity-tags

prose --entity-tags --entity <guid-or-name> [--json]
prose --entity-tags --entity <guid-or-name> --remove "tag1,tag2"
prose --entity-tags --entity <guid-or-name> --add "tag1,tag2"

an entity's tags — list / add / REMOVE. Added 2026-09-03: tags could be added and never taken away (create_character's tags MERGES, like aliases), so a wrong tag was permanent, and a stale book tag can pull a character into that book's context loads. NOT the same as --tag-entities, which rewrites inline markup inside beat text.

handler EntityTagsCli

--entity-tree

prose --entity-tree (--id | --slug ) [--depth N] [--rel-types type1,type2] [--as-of date]

handler EntityTreeCli

--estimate-cost

prose --estimate-cost [--beats ] [--pov-characters ] [--tier free|deep|full] Cost-governance check (RFC 0009 §9.5, 2026-08-13): prints the LLM call count implied by BookHealthService's current wiring for a book of N beats — no DB access, pure arithmetic against the tier shapes read directly out of the code. Run this before merging a new per-beat service so the cost jump is visible before it ships, not discovered by totaling a bill months later.

--exclusion-rules

prose --exclusion-rules [--all] [--json]
prose --exclusion-rules --propose --predicate-a <p> --predicate-b <p> --why "..." [--universal]
prose --exclusion-rules --approve|--reject --id <n>
prose --exclusion-rules --test --predicate-a <p> --object-a "..." --predicate-b <p> --object-b "..."

manage the PredicateExclusion ontology the Tuned Read runs on — list, propose, approve/reject, and --test a rule against a hypothetical claim pair before approving it. Deterministic and free; no LLM call anywhere in this command.

handler ExclusionRulesCli

--expand-beat

prose --expand-beat (--slug <slug> | --id <guid>) [--beat <beatId>] [--force]

(no description in the dispatch comment — add one above the guard in Program.cs)

handler ExpandBeatCli

--export

prose --export global                every repo, zipped + timestamped
prose --export <repoName>            one repo, zipped (e.g. "people", "weaponry")
prose --export <entityId>            one entity, plain .json

dump canon JSON to the user's Downloads folder.

handler ExportCli

--export-book-report

prose --export-book-report --slug Writes the stored BookReports row to {book export dir}{CODE}_BookReport.md (ExportBookReportCli).

handler ExportBookReportCli

--export-commands

prose --export-commands [<output-path>] [--source <path-to-Program.cs>]

Documentation generator, deliberately ABOVE the Hub gate: it reads this file's own dispatch chain and writes a markdown reference. It touches no database and needs no running Hub, and requiring one would make the CLI reference unbuildable in exactly the situation where you most want to read it. Mirrors Prose.Mcp -- --export-tools, which closes the asymmetry docs/ARCHITECTURE.md §8 recorded as an open gap.

--export-entity-cluster

prose --export-entity-cluster --root --universe --out <path.md> Report-only: walks the full connected component from --root and archives it to Markdown — the review step before --delete-entity-cluster. See ExportEntityClusterCli.

handler ExportEntityClusterCli

--export-node

prose --export-node (--id <guid|prefix> | --slug <slug>) [--author "Name"]

render a node to .docx + .epub + .pdf + .txt + metadata artifacts (description.txt, story-synopsis.txt, -dcm-viz.htm). Local file rendering only — no KDP API integration, hence "export" not "publish".

handler ExportNodeCli

--export-personas-json

prose --export-personas-json [--out ] Exports all 1024 Legion persona details + OCEAN psychometric profiles to JSON for consumption by the Python ML package (ml/artifacts/personas.json).

--extract-beat-locations

prose --extract-beat-locations --slug [--force] [--limit N] [--dry-run] Backfill the per-beat scene location (Beat.PlaceName / PlaceEntityId) — hash-gated.

handler ExtractBeatLocationsCli

--fact-ledger-refresh — DEACTIVATED

prose --fact-ledger-refresh --slug — zero-LLM-cost re-run of just the fact-ledger check (see FactLedgerRefreshCli's own doc comment). Not cost-gated: it is the deliberate cheap alternative to the (since-deleted, BIBLE ADR-10) --audit-book --deep bundle.

handler FactLedgerRefreshCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--factory / --order / --session / --ruling

The Novel Factory (RFC 0015): prose --factory status|next|capture|context|journal|usage · prose --order add|list|show|close|abandon|seed (show --id prints one order in full: paths, checks, detail) · prose --session end · prose --ruling add|list|supersede|violations|metrics|seed. See FactoryCli's class doc.

handler FactoryCli

--family

prose --family parent  --parent <id|slug> --child <id|slug>
prose --family sibling --a <id|slug> --b <id|slug>
prose --family spouse  --a <id|slug> --b <id|slug>
prose --family show    --of <id|slug>

family ties — hand-seed parent/sibling/spouse links between characters.

handler FamilyCli

--family-gen

prose --family-gen propose --of <id|slug>           dry run
prose --family-gen propose --of <id|slug> --commit  write characters + edges + propagate genetics

propose a plausible immediate family for one character. --seed N for reproducible RNG

handler FamilyGenCli

--find-entity

prose --find-entity --name "<text>" [--type character] [--universe <slug>] [--limit N]

search seeded entities by name or alias — the read-side counterpart to --add-character, so authoring can check for an existing entity before creating a duplicate.

handler FindEntityCli

--findings

findings inbox — list / show / apply / dismiss / scan.

handler FindingsCli

--findings-staleness

prose --findings-staleness [--json] RFC 0011 Brick 2: generic staleness report across every Findings category that stamps SourceRuleVersion on write (currently CraftChecklist + StructuralFailure).

handler FindingsStalenessCli

--fix-bad-name-matches

prose --fix-bad-name-matches [--dry-run] Deletes BeatEntities rows where MatchSource='name' but the entity's Name no longer appears in the beat's current Text (a checkable, unambiguous staleness signal name-matches carry that embedding/graph matches don't). See FixBadNameMatchesCli for root-cause detail.

handler FixBadNameMatchesCli

--fix-cross-universe-contamination

prose --fix-cross-universe-contamination [--dry-run] Deletes BeatEntities/BeatEntityPresence rows whose entity belongs to a different universe than the beat's own book (a hard "Universe division absolute" violation) — historical bad data, not a live matching-pipeline bug (see FixCrossUniverseContaminationCli for root-cause detail).

handler FixCrossUniverseContaminationCli

--fix-location-aspect

prose --fix-location-aspect --character --find --replace [--apply] Corrects a character's current 'location' EntityStateEvent.NewValue via an exact, single-occurrence substring replace. Dry-run by default. See FixLocationAspectCli's doc comment for why this exists.

handler FixLocationAspectCli

--fix-self-aliases

Corpus-wide repair: remove CharacterAlias/PlaceAlias/FactionAlias/WeaponAlias rows whose Value matches their own owning entity's Name — a redundant self-alias, usually a leftover from an entity merge that relinked a loser's alias onto the winner it now duplicates.

handler FixSelfAliasesCli

--gate-check

prose --gate-check --beat-id --file <candidate.txt> [--spine <original.txt>] [--json] RFC 0012 §3.4: run the writer's gate (brief, free checks, one verifier call, optional spine test against an original) on any text, without saving. One Haiku call.

handler GateCheckCli

--gear-check — DEACTIVATED

prose --gear-check --slug --character [--story-time date]

handler GearCheckCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--generate-book-glossary

prose --generate-book-glossary --slug <slug>
prose --generate-book-glossary --all

regenerate a book's Glossary (docs/nodes/{CODE}-Glossary.htm/.json/.txt) — the subset of its universe's Master Glossary whose terms appear in the book's live prose.

handler GlossaryCli

--generate-canon-md

prose --generate-canon-md --type <WorldBible|WorldMaster|Franchise|UniverseCanon>
prose --generate-canon-md --all

regenerate canon document .md files from DB (CanonDocuments + CanonDocumentSections). The disk files are generated read-only mirrors; source of truth is the DB.

handler CanonDocumentCli

--generate-glossary

prose --generate-glossary --universe <slug>   (omit --universe for all)

regenerate a universe's Master Glossary (Glossary.htm/.json/.txt under docs/universes/{SLUG}/) from the GlossaryTerms table.

handler GlossaryCli

--generate-scene

Portable-writing-service plan, Phase 2: write a scene/line of dialog without a pre-existing Book/Chapter/Beat row — see OneShotGenerateCli's own doc comment.

handler OneShotGenerateCli

--genetics

prose --genetics propagate                     full graph
prose --genetics propagate --id <id|slug>      single character
prose --genetics propagate --seed 42           reproducible RNG

propagate genetic_ancestry from parents to children via the family graph (with ±5% recombination noise). Currently a no-op until family ties are seeded.

handler GeneticsCli

--get

prose --get — targeted entity lookup. Types: character | place | weapon | faction | corponation

handler GetEntityCli

--get-canon-section

(no description in the dispatch comment — add one above the guard in Program.cs)

handler GetCanonSectionCli

--get-entity-fields / --set-character-fields / --set-entity-fields / --verify-entity

prose --universe glmz --get-entity-fields --id <id>   (read only; never writes)
prose --universe glmz --set-character-fields | --set-entity-fields --id <id> --file fields.json [--confirm-unread]
prose --universe glmz --verify-entity begin --entity <id> --node <book> | commit --nonce <nonce>

the world's read and write path and station F1 (RFC 0015 §3.3–3.4). (the key "summary" writes the entity's one-paragraph summary, Entities.Description)

handler WorldCli

--get-place

prose --get-place --name "<exact name>" [--print-raw]

read a Place/District's full DistrictData record by exact name — the read-side counterpart to --add-place, so a rename/edit can round-trip the existing record instead of upserting blind and clobbering fields the caller didn't know about.

handler GetPlaceCli

--gpu

prose --gpu <status|stop|start|destroy> [--instance <id>]

manage the rented vast.ai review box (key from the MindAttic vault, provider 'vast').

handler VastGpuCli

--graph-health

prose --graph-health --universe <slug> [--json]

GraphHealthService — orphaned/weakly-connected/malformed world-graph node audit.

handler GraphHealthCli

--graph-query

prose --universe --graph-query co-occurrence|shared-neighbors|path --a <id|slug> --b <id|slug> [--in-book ] [--max-hops N] prose --universe --graph-query cast (--at-beat | --chapter <id|slug>) Read-only answers over entity tags in beats and live Edges. See GraphQueryCli.

handler GraphQueryCli

--grep-beats

prose --grep-beats --pattern "<text>" [--case-sensitive]

plain substring search over every Beat.Text corpus-wide (all universes) — read-only, no LLM cost. Built to check whether a defect found in one book (e.g. leaked LLM repair-pass scaffolding) also hit others.

handler GrepBeatsCli

--ground-entity-records — DEACTIVATED

(no description in the dispatch comment — add one above the guard in Program.cs)

handler GroundEntityRecordsCli · cost-gated (spends LLM money) · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--harvest-entities

prose --harvest-entities --file <path> [--universe glmz] [--dry-run]

harvest entities + edges from open text (design notes, canon briefs). Routed BEFORE the bare --universe command: --universe here is the scope flag, not a subcommand.

handler HarvestEntitiesCli · cost-gated (spends LLM money)

--harvest-voice

prose --harvest-voice (--slug <s> | --id <id> | --all-80 | --pending | --apply <guid> | --reject <guid>) [--force]

distill voice rules from winning (≥80%) nodes into the codified DB-backed rules the generator reads. Propose-then-approve.

handler HarvestVoiceCli · cost-gated (spends LLM money)

--help

Nothing above matched. Falling off the end used to exit 0 with no output, so a mistyped flag read as a command that ran and found nothing, and --help (allowlisted above) printed nothing.

--history

prose --history … Read-only SQL Server temporal-history forensics — what a beat used to say, which day a book was rewritten wholesale. Free: no LLM call, no write.

handler TemporalHistoryCli

--hub-narration

prose --hub-narration on|off|status Runtime toggle for CommandNarrator's Haiku command gloss. Default OFF.

handler HubNarrationCli

--image-prompts

prose --image-prompts regen --id <id|slug> [--force]
prose --image-prompts regen --all-changed

rewrite ethnicity-keyed visual descriptors in image prompts to match a character's current genetic_ancestry. Cost-aware via stored hash.

handler ImagePromptsCli

--import-book

prose --import-book --file path.node [--title ...] [--kind ...] [--slug ...] [--parent ...] [--dry-run]

import a hand-authored .node file (beat + gap + beat …) into a fresh node — for drafts written elsewhere (chat exports, transcripts, paper notes typed up), as opposed to LLM-generated via --auto-run (AutoRunCli; --write-story/--refine-story, the predecessor this once complemented, was removed 2026-08-13 — see this file's own note near StoryDirectorService). See ImportNodeCli class doc for the file format.

handler ImportNodeCli

--import-cover

prose --import-cover --file PATH [--book-code CODE] [--type TYPE] [--notes TEXT] [--dry-run]

import a local image file (png, jpg, webp) into the Media table. Optionally links to a node by --book-code and sets the media type.

handler ImportCoverImageCli

--import-md

prose --import-md --file path.md [--dry-run]

reimport an edited --publish-md Markdown file back into the DB. Each marker identifies the beat; prose between markers updates Beat.Text.

handler ImportMarkdownCli

--inject-calibration-defects / --revert-calibration-defects

(no description in the dispatch comment — add one above the guard in Program.cs)

handler ObligationCalibrationCli

--interpret

prose --interpret --text "..."  | --file path.txt

prose → entities + edges. LLM-driven. add --commit to apply, --auto-create to stub missing entities, --tag

handler InterpretCli

--kdp-export

prose --kdp-export [--to <dir>] [--markers-in-place]

Writes the KDP store back out as JSON in the original shapes (default: a new folder under %LocalAppData%\MindAttic\Prose\kdp-export). --markers-in-place also rewrites book-folder markers.

handler KdpExportCli

--kdp-import

prose --kdp-import [--from <dir>] [--legacy-markers]

Loads the KDP store from JSON (title-ids.json, category-tree-*.json, logs/, publish-markers/) in --from (default tools/kdp). --legacy-markers also reads each book folder's .publish marker.

handler KdpImportCli

--kdp-manifest

prose --kdp-manifest [--out <path>] [--userscript]

Reconciles DB + disk + the KDP store (title ids, sign-offs, publish records) into tools/kdp/manifest.json (a generated view of what needs to go up on KDP). --userscript also regenerates tools/kdp/kdp-panel.user.js from tools/kdp/kdp-panel.template.js.

handler KdpManifestCli

--kdp-mark-published

prose --kdp-mark-published --slug <slug> [--url <amazonUrl>] [--title-id <id>]

Closes the loop after a republish actually completes on KDP.

handler KdpMarkPublishedCli

--kdp-signoff

prose --kdp-signoff --code <CODE>[,<CODE>...] [--off]

Signs books off for KDP publishing (the gate a .publish marker file used to be); --off holds them.

handler KdpSignOffCli

--kdp-status

prose --kdp-status

Show KDP publication status: Published / Outdated / WorkInProgress for all tracked nodes. Outdated = published but beats edited since last KDP push.

handler KdpStatusCli

--kdp-store

prose --kdp-store [--code <CODE>]

Shows the KDP store's location, contents and import history; --code shows one book's sign-off, title id and publish history.

handler KdpStoreCli

--ledger-adjudicate

prose --ledger-adjudicate --slug <slug> [--dry] [--max N] [--entity <t>] [--predicate <t>] [--json]

judges the fact ledger's SAME-PREDICATE contradiction groups against the prose they came from. The deterministic exemptions (volatile / set-valued / paraphrase) already removed everything that was never a contradiction; what reaches here is dominated by complementary facets and temporal states, which need the prose to tell apart from a real conflict. Writes claim STATUS only, never prose (docs/LOGIC.md §4). Cost-gated: one Sonnet call per uncached group, cached on the claim uids plus every anchor beat's current TextHash.

--legion

prose --legion ask "Q" --options "A,B,C"  → forced-choice Quorum decision (JSON on stdout)
prose --legion vote "Q" [--context "…"]    → open-ended vote with synthesized narrative

query the Legion / LLMVoting cloud-LLM panel directly.

handler LegionCli

--lesson-add

prose --lesson-add --scope <scope> --kind <kind> --text "<text>"

add an author ruling to the prose-lessons memory store. Lessons are injected into review ballot prompts so reviewers don't penalise beats the author has already ruled are doing their job. Scope: global | node: | beat: Kind: score-vs-function | delight | voice | pacing | continuity | other

handler ProseLessonCli

--lessons-list

prose --lessons-list [--scope <scope>]

list prose lessons (all scopes or filtered).

handler ProseLessonCli

--liberty-report — DEACTIVATED

prose --liberty-report [--beat | --slug ] Show liberty analysis + Rule of Cool findings for a beat or all beats in a story.

handler LibertyReportCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

prose --link-weapon-ammo [--local-url URL] [--local-key KEY] [--local-model TAG] [--dry-run]

(no description in the dispatch comment — add one above the guard in Program.cs)

handler LinkWeaponAmmoCli

--lint-prose

prose --lint-prose --slug [--dry-run] Deterministic prose linter: echo words, crutch phrases, pet words, dialogue-attribution runs.

handler LintProseCli

--list-archives

prose --list-archives (--id ... | --slug ...) --universe <u>

list every ArchivedBook snapshot for a node, newest first — read-only, use to find the archive-id for --restore-node-field. See ListArchivesCli class doc.

handler ListArchivesCli

--list-books

prose --list-books [--archived | --all-archived] [--kind <k>] [--search <text>] [--limit <n>] [--scores] [--json]

list every node as a table (or JSON). Headless twin of /nodes.

handler ListNodesCli

--list-canon-sections

prose --list-canon-sections --type <DocumentType> [--universe <slug>]
prose --set-canon-section --type <DocumentType> --key <sectionKey> --file <path.md> [--title <t>] [--universe <slug>]

read/edit CanonDocumentSections directly — the CLI equivalent of the MCP tools list_canon_sections / set_canon_section, built 2026-08-23 to close the gap where canon editing was MCP-only and unreachable from a CLI-only session.

handler ListCanonSectionsCli

--list-plants / --add-plant / --update-plant

prose --plant-audit --slug [--json] audit plant/payoff pairs prose --list-plants --slug [--json] list all pairs prose --add-plant --slug --plant "..." --payoff "..." [--cat detail] prose --update-plant --id [--plant "..."] [--payoff "..."] correct a registered pair

handler PlantPayoffCli

--list-sessions

prose --list-sessions --slug [--limit N]

handler ListSessionsCli

--list-species

prose --list-species — print the species taxonomy (canonical name, label, sentience).

handler ListSpeciesCli

--list-surveys / --get-survey

prose --list-surveys [--status Open|Completed]
prose --get-survey --slug <slug>

survey management.

handler SurveyCli

--location-scan — DEACTIVATED

prose --location-scan [--min-travel-minutes N] Character-in-two-places-at-once contradiction scan; conflicts land in Findings.

handler LocationScanCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--log-decision

prose --log-decision --summary "..." [--rationale "..."] [--category ...] [--related id,id] Durable "why" record — the Decision Ledger half of the Command/Decision Ledger pair (CommandLedgerEntries is written automatically by every dispatch; this is explicit).

handler LogDecisionCli

prose --log-search [--since

] [--severity ] [--text ] [--take N] [--json] Durable, searchable log history (Serilog daily files) — not the live in-memory tail.

handler LogSearchCli

--logic-sweep

prose --logic-sweep --slug [--json] Codifies docs/LOGIC.md's sweep (SS-LAW-17) as one LLM call per dimension: causality chain, knowledge states, timeline, plant/payoff (two-way), orphan references, inserted-beat drift. A single-pass approximation over the whole node's prose — for a large book or a thorough pass, prefer the /logic-sweep Claude Code skill (range-scoped subagents + quote verification + fix + re-verify). Findings persist to Findings and auto-heal on re-run. Exit 0 = clean, 1 = MODERATE/MINOR only, 2 = any BLOCKER.

handler LogicSweepCli

--logs

prose --logs [--since 2h] [--level Error] [--search <text>] [--detail <sig>] [--raw]
prose --logs --track <sig> [--note "..."] | --issues [--all] | --resolve|--ignore|--reopen <id>

engine-error triage — group Serilog errors into distinct faults, queue them, and re-check "fixed" against the logs rather than trusting the flag.

handler LogsCli

--make-group

prose --make-group --name "Group B" [--size 128]

create a fixed, named reviewer panel of N personas, disjoint from every existing focus group (no persona on two panels). No LLM calls.

handler MakeGroupCli

--mark-canon

prose --mark-canon (--slug <s> | --id <guid>) [--off]

author-only Canon trust gate — mark a node strong enough to draw conclusions about its characters/events (the voice-harvest learns from canon).

handler MarkCanonCli

--merge-beats

prose --merge-beats --slug [--from N] [--to N] [--limit N] [--resume] --yes RFC 0012 §11: per beat — two dry-run drafts, one merge against the book's own text as spine, spine + gate test, save as AuthorMerge or keep the original. Expensive; requires --yes.

handler MergeBeatsCli

--merge-edge

prose --merge-edge --keep --dedupe [--as ] [--register-alias] The execution half of --scan-edge-duplicates — collapses two Edge rows describing the same relationship under different wording into one. See MergeEdgeCli.

handler MergeEdgeCli

--merge-entity

prose --merge-entity --winner --loser The execution half of the report-only duplicate-scan tools — a human, having confirmed two rows are the same identity from real book/prose knowledge, executes the merge. No LLM call, no fuzzy matching. See MergeEntityCli.

handler MergeEntityCli

--merge-entity-into-vocabulary

prose --merge-entity-into-vocabulary --from --into --universe --term "" --definition "" [--origin ""] [--usage ""] [--category ""] [--example ""] [--dry-run] One-off duplicate resolution: merges --from's content/edges onto an existing vocabulary entity and deletes --from. See MergeEntityIntoVocabularyCli.

handler MergeEntityIntoVocabularyCli

--migrate-canon-docs

prose --migrate-canon-docs [--dry-run]

Truth-First Architecture — Step A2: migrate hand-editable canon .md files (BIBLE.md, WORLD.md, FRANCHISE.md, universes/CAUL.md) into CanonDocument + CanonDocumentSection DB rows. Idempotent; skips already-migrated documents.

handler MigrateCanonDocsCli

--migrate-legacy-book-chapter

prose --migrate-legacy-book-chapter

delete the 44 legacy book/chapter Entity+Records blobs whose content already lives in the Nodes/Beats model. Classifies each as JUNK, REDUNDANT, or ORPHAN (converts orphans to Nodes before deleting).

handler MigrateLegacyBookChapterCli

--migrate-nodes

prose --migrate-nodes

migrate legacy Books/Chapters/ChapterBeats/Episodes/EpisodeBeats data into the unified Beat/Node schema. Idempotent — safe to re-run.

handler MigrateNodesCli

--migrate-sql

prose --migrate-sql --schema           apply EF migrations
prose --migrate-sql --import people    import character JSON files
prose --migrate-sql --all              schema + import all supported types
prose --migrate-sql --import-continuity-sqlite [--apply]   one-shot copy of legacy continuity.db rows into SQL Server

SQL Server migration — apply EF migrations and import JSON entities.

handler MigrateSqlCli

--morning-report

prose --morning-report [--since ] Aggregates overnight findings: cross-story contradictions, new Findings, prose metrics outliers, near-duplicate alerts, score correlation, leaderboard. Writes HTML to PublishExportDirectory. Default window: 24h. Exit 0 always.

handler MorningReportCli

--move-beat

prose --move-beat --slug <slug> --beat-number N --after M   (M=0 moves to the top)

re-slot a beat within its node's reading order (wraps NodeWorkbenchService .MoveBeatAsync, previously reachable only from the Blazor drag-and-drop UI).

handler MoveBeatCli

--move-beat-to-node

prose --move-beat-to-node --slug <from-slug> --beat-number N --to-slug <to-slug> --after M

relocate a beat OUT of one chapter and INTO another (--move-beat only re-slots within a single node's existing siblings). Wraps NodeWorkbenchService.MoveBeatToNodeAsync.

handler MoveBeatToNodeCli

--move-node-universe

prose --move-node-universe (--slug <slug> | --id <id>) --to-universe <universeSlug>

relocate a book node (and its full descendant chapter subtree) into a different universe. See MoveNodeUniverseCli.

handler MoveNodeUniverseCli

--narrate-book

prose --narrate-book (--id <guid|prefix> | --slug <slug>)

(re)narrate an EXISTING node by id (full or prefix) or slug. Runs the same NarrateAsync path the Record button uses. Use to re-record a node whose beats failed (e.g. a TTS 400) without regenerating prose.

handler NarrateNodeCli

--narrative-health — DEACTIVATED

(no description in the dispatch comment — add one above the guard in Program.cs)

handler NarrativeHealthCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--obligations

prose --obligations list|trial-balance|history|open|close|drop|defer|reopen|due|accept|rescan …

Narrative Obligation Ledger (RFC 0013) — what the story owes the reader.

handler ObligationCli

--orphan-beats

prose --orphan-beats [--min-number N] [--max-number N] [--limit N] [--contains "text"] — read-only diagnostic: Beats rows with no BeatNodes membership. See OrphanBeatsCli's own doc comment for why this exists (VIGL fact-ledger investigation, 2026-09-01).

handler OrphanBeatsCli

--populate-queue

prose --populate-queue --entity-review|--story-review|--beat-write|--status [options]

(no description in the dispatch comment — add one above the guard in Program.cs)

handler PopulateQueueCli

--prepare-audible

prose --prepare-audible (--slug <slug> | --id <guid|prefix>) [--no-phonetics]

build an Audible AI-narration hand-off package for a node. Produces a narration-clean manuscript, pronunciation guide, and README.

handler PrepareAudibleCli

--print-book

prose --print-book (--id <guid|prefix> | --slug <slug>)

(no description in the dispatch comment — add one above the guard in Program.cs)

handler PrintNodeCli

--print-voice

prose --print-voice

print the voice context the generator/re-beater receive — the verification that the canon-trained voice is wired into prompts.

handler PrintVoiceCli

--progress

Strand Progress Dashboard: every non-archived book, code/title/kind/status/score/pages, sorted by score descending. Cross-universe by design. See .claude/commands/progress.md.

handler ProgressCli

--prose-health — DEACTIVATED

prose --prose-health [--slug ] [--json] [--out

] Zero-cost overnight health scan: surface stats + kNN score prediction + semantic outlier detection using cached ProseEmbeddings. No API calls.

handler ProseHealthCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--provenance-audit / --provenance

prose --provenance-audit [--slug <slug-or-code-or-id>] [--samples N] [--json]
prose --provenance --grade <grade> --entity <id> | --relationship <rowId> | --claim <uid>
prose --provenance --grades

the Story Ledger's provenance surface (Phase 3) — "what is in canon that no human ever approved?", plus the explicit human act that promotes one candidate row to authored. Deterministic and free; report-only for the audit (docs/LOGIC.md §4). Universe-scoped deliberately: the entity/relationship counts come through the ambient query filter.

handler ProvenanceCli

--provider-status

prose --provider-status [--live] [--json] RFC 0011 Brick 3: degraded-services status on demand. See docs/PROVIDERS.md.

handler ProviderStatusCli

--publish-audiobook / --record / --export-audio / --export-mp3

prose --record | --export-audio | --export-mp3 | --publish-audiobook

render the WHOLE node as one continuous audiobook (one TTS pass, tiered to ElevenLabs limits — one request, else per-chapter, else split) and drop the MP3 in Downloads. The headless twin of the "Export Audio" button. (--id <guid|prefix> | --slug )

handler PublishAudiobookCli

--publish-book

prose --publish-book (--id <guid|prefix> | --slug <slug>)

stitch an existing node's beats into one combined file (WAV → MP3), copy it to the publish output dir (Downloads by default), and record the publication run + process-event ledger. Headless Publish button.

handler PublishNodeCli

--publish-md / --publish-pdf

render a node to Markdown or PDF in Downloads. Markdown output embeds markers for prose --import-md round-trip. ss (--publish-md | --publish-pdf) (--id <guid|prefix> | --slug ) [--author "Name"]

handler PublishManuscriptCli

--publish-readiness

prose --publish-readiness --slug [--json] docs/LOGIC.md §9's six-check publish-readiness convergence gate as a single readout (2026-08-30) — see BookHealthService.PublishReadinessAsync and PublishReadinessCli.cs. Read-only, no LLM calls, no cost gate needed.

handler PublishReadinessCli

--read-beats

prose --read-beats (--slug <slug> | --id <guid>) [--from N] [--to N] [--numbers <csv>]

print beat text WITH its authoritative POV character attached (sourced fresh from BeatEntityPresence every call, never inferred from prose content). Use this instead of raw sqlcmd/SELECT Text reads whenever a conclusion about character voice, attribution, or continuity will be drawn from what's read — see ReadBeatsCli's own doc comment for the live mistake (2026-08-10, VIGL multi-POV misattribution) this exists to make structurally harder to repeat. Reads in true reading order, so it is also the sanctioned bulk-read for audit/logic-sweep work — no --publish-md export round-trip required. [--format text|json]

handler ReadBeatsCli

--read-status / --read-note

prose --read-status --node <slug|code|guid> [--list]
prose --read-note add|list|resolve --node <x> [--beat N --kind defect|question|note --text "…" --read-by <name>]

which beats are unread (never read / text changed / moved / entity changed), and the notes a read filed. Export refuses while any beat is unread; there is no override.

handler ReadStatusCli

--reader-qa — DEACTIVATED

prose --reader-qa (--slug | --all) [--force] [--json] Reader-Proxy QA (docs/READER-QA.md) — the default reader-facing quality instrument. Phase 1: comprehension probes — a cheap model reads each chapter cold, diffed against the Sonnet synopsis ground truth, Sonnet-arbitrated, filed as ComprehensionDefect findings. NO scores (measurement, not vote — SS-LAW-17 exempt). Hash-cached per chapter. Exit 0 = clean, 1 = defects found, 2 = error.

handler ReaderQaCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--rebeat-book

prose --rebeat-book (--slug <s> | --id <guid> | --all) [--apply]

rebuild a node's beats to the codified beat doctrine via LLM re-segmentation (story beats + dialogue/'?' mechanics + gaps). Dry-run by default; --apply backs up to markdown then replaces beats if the word-retention guard passes. --all targets every doctrine-violating node.

handler RebeatNodeCli

--rebuild-graph

dotnet run --project ... -- --rebuild-graph [--universe ] Rebuilds the scoped universe's _universe_graph.json cache from source data without starting the web server. One universe per invocation (scope is pinned below).

handler RebuildGraphCli

--rebuild-readmodel

prose --rebuild-readmodel [--archived] [--force]

(re)build the materialized character read-model projection from the relational source of truth. Run after a bulk import / relational migration, or whenever ReadModelVersion is bumped. Backfills missing/stale rows, prunes orphans. The steady-state path self-heals, so this is a one-time / maintenance op. Any character whose relational read is poorer than its current cache is SKIPPED and named in the output, not silently overwritten — pass --force only once you've reviewed that list (see the 2026-09-05 incident note on RebuildReadModelCli).

handler RebuildReadModelCli

--recall

prose --recall <keyword> [--content] [--to-disk] [--as-of <datetime-utc>]

keyword recall — call up (print) or create (--to-disk) the select few tracked .md files relevant to a topic, straight from the DB.

handler RecallMarkdownCli

--reconcile-obligations — DEACTIVATED

RFC 0013 instruments. The free trial-balance rules forward plainly; --deep adds the paid resurfacing judge and is cost-gated under its own command name (the gate keys estimates on the name alone, so a cheap and an expensive mode must not share one — BIBLE ADR-10).

handler ReconcileObligationsCli · cost-gated (spends LLM money) · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--reconcile-trinity

prose --reconcile-trinity --extract|--survey --slug |--all prose --reconcile-trinity --slug |--all --allow-votes --confirm-auto-edit [--dry-run] prose --reconcile-trinity --undo --decision-id Autonomous-but-reversible Bible/Book/Entity divergence resolution for GLMZ/SCRY/FICTION books — see ReconcileTrinityCli / TrinityReconciliationService.

handler ReconcileTrinityCli

--reembed

prose --reembed              drift-skipped corpus pass (only changed entities re-embed)
prose --reembed --force      clear the table first, re-embed everything

rebuild the entity-embedding cache via cloud OpenAI.

handler ReembedCli

--reflow-book

prose --reflow-book (--id <guid|prefix> | --slug <slug>) [--apply]

bounded copy-edit of a node — proper paragraph/dialogue spacing, a "?" on questions that lack one, and "asks"/"asked" (not "says") on question dialogue. Dry-run by default; --apply commits. Beats edited beyond those bounds are rejected (word-token guard) and left untouched.

handler ReflowNodeCli

--reimport-node

prose --reimport-node (--id ... | --slug ...) --file path.node [--dry-run] [--force]

replace an EXISTING node's beats wholesale from a .node file. The other half of the export/edit/reimport loop for edits that no longer line up with the old beat boundaries (import-md patches beats in place by ID; this swaps the whole set). Old beats are disabled, never deleted. See ReimportNodeCli class doc for details and the safety checks.

handler ReimportNodeCli

--relation-aliases

prose --relation-aliases --list
prose --relation-aliases --add --alias <wording> --canonical <standardizedRelationType> [--notes <notes>]
prose --relation-aliases --remove --id <id>

CRUD for RelationTypeAliases — normalizes link_entities free-text RelationType wording (e.g. "has" -> "owns") so the same relationship doesn't fork into multiple Edge rows.

handler RelationAliasCli

--rename-entity

prose --rename-entity --entity <guid|slug> --node <book-guid|slug|code> --new-name "..." [--apply --yes] Preview is the default; the apply form replaces exact full-name references in this book's descendant beats, then relabels linked ledger claims.

handler RenameEntityCli

--rename-node

prose --rename-node --node <id|slug|code> --title "…" [--slug ] Set a node's Title (and optionally its Slug, pinned, references moved). Twin of MCP rename_node.

handler RenameNodeCli

--rename-universe

prose --rename-universe --slug <oldSlug> --new-slug <newSlug> --new-name <newName> [--new-theme <newTheme>]

rename a Universe row in place (Slug/Name/Theme only) — a seamless cutover, every Node/Entity/Book already scoped to its Id keeps working unmodified. See RenameUniverseCli.

handler RenameUniverseCli

--renumber-chapters

prose --renumber-chapters --slug <slug|id> [--apply] Titles only, no prose: close the gaps a reader sees when unnumbered units consumed chapter numbers ("Chapter 3", an interlude, then "Chapter 5"). Dry run unless --apply.

handler RenumberChaptersCli

--repair

prose --repair                # cheap timeline-only pass
prose --repair --continuity   # also run continuity extraction (LLM-heavy)

dossier-driven story repair — walks every chapter, augments character records with timeline entries and (optionally) LLM-extracted continuity claims.

handler RepairCli

--repair-entity-docs

prose --repair-entity-docs [--dry-run]

re-materialize the entity-doc row for EVERY active entity, in every universe. Unlike --backfill-entity-docs (per-book, inference-driven, so it only reaches entities a given book mentions) this iterates the entity table itself — which is what stamping MarkdownFiles.UniverseId on all of them requires.

handler RepairEntityDocsCli

--repair-slugs

prose --repair-slugs [--apply] [--family entities|nodes|books|series|episodes] [--json] Regenerate every slug from its Name/Title metadata and update slug-carrying references (beat audio paths, publication paths, on-disk dirs, alt_slug). DRY-RUN by default; --apply writes. Slugs are loose keys — guid is the key.

handler SlugRepairCli

--reparent-node

prose --reparent-node (--slug <slug> | --id <id>) (--parent-slug <slug> | --parent-id <id>)
prose --reparent-node --slug <slug> --clear   — detach from parent

set the ParentNodeId on an existing node (move it into a collection).

handler ReparentNodeCli

--reset-password

prose --reset-password --email --password

[--require-change] Operator password reset over the MindAttic.Authentication store, no web server.

handler ResetPasswordCli

--restore-beat-text

prose --restore-beat-text --id <beatGuid> --as-of <datetime-utc> [--dry-run]

recover Beats.Text from Beats_History (system-versioned temporal table) after a bad overwrite — see RestoreBeatTextCli class doc.

handler RestoreBeatTextCli

--restore-entity

prose --restore-entity --id <guid> --as-of <datetime-utc> [--dry-run]

restore a hard-deleted Entities row from Entities_History (system-versioned temporal table) — see RestoreEntityCli class doc.

handler RestoreEntityCli

--restore-markdown

prose --restore-markdown [--file <relativePath>] [--as-of <datetime-utc>] [--dry-run] [--list]

restore .md files from DB back to disk. Supports point-in-time recovery from the MarkdownFiles_History temporal table.

handler RestoreMarkdownCli

--restore-node-field

prose --restore-node-field (--id ... | --slug ...) --archive-id <guid>

restore a Node content field (Description/Summary/Seed/Subtitle) from a named ArchivedBook snapshot back onto the live node. Explicit archive-id, never "latest" — see RestoreNodeFieldCli class doc. --field description|summary|seed|subtitle|all --universe

handler RestoreNodeFieldCli

--retire-records-blobs

prose --retire-records-blobs [--rebuild] [--validate] [--apply]

RFC 0007 unified blob-retirement gate — backfill all 29 relational types from Records.Json, validate, and delete the blobs in a single pass. (RFC 0007)

handler RetireRecordsBlobsCli

--retype-document-to-vocabulary

prose --retype-document-to-vocabulary --id --universe --term "" --definition "" [--origin ""] [--usage ""] [--category ""] [--example ""] [--dry-run] One-off recategorization for a populated document-type entity whose Name is a generic in-world common noun (e.g. "CorpoNation") — moves it to vocabulary type without touching its existing Edge relationships. See RetypeDocumentToVocabularyCli.

handler RetypeDocumentToVocabularyCli

--review-entity — DEACTIVATED

prose --review-entity [--type <type>] [--ballots N] [--prose N] [--unrated]

run Legion persona quality voting across canon entity repos. Replaces the old LlmVoting (10 GLMZ residents) with the full 1000-persona library, 1-100 scale, and append-only EntityReview rows (same process as node reviews).

handler ReviewEntityCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--review-node — DEACTIVATED

prose --review-node (--id <guid|prefix> | --slug <slug>) [--readers N]

have N Legion personas each read an EXISTING node and write an honest, scored reader review (saved to NodeReviews), then synthesize the Amazon-style aggregate summary. Round-robins reviewers across the trusted-4. --review-book/--run-panel literal aliases retired 2026-08-30 — one canonical name only.

handler ReviewNodeCli · cost-gated (spends LLM money) · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--review-report — DEACTIVATED

prose --review-report (--slug <slug> | --id <guid> | --code <CODE>) [--provider local|cloud|all]

(re)generate the portable per-voter report (JSON + filterable HTM) from a node's most recent stored review batch, without re-running the panel.

handler ReviewReportCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--review-settings

prose --review-settings [--set ] — view or update review voting settings. Keys: ballots, prose, panel, readers, max-concurrency, judge-provider, allowed-providers

handler ReviewSettingsCli

--runpod

prose --runpod <status|stop|start|terminate> [--pod <id>]

manage the rented RunPod review pod (key from the MindAttic vault, provider 'runpod').

handler RunPodGpuCli

--sanitize-beats

prose --sanitize-beats [--slug <slug> | --all] [--dry-run]

print all beats of a node as continuous prose to stdout. No headers, no beat numbers, no metadata — just the prose, beats separated by blank lines.

handler SanitizeBeatsCli

--sanity-scan — DEACTIVATED

prose --sanity-scan (--slug <slug|code> | --all) [--json] Deterministic prose checks — no LLM. Catches leaked internal node codes, undefined all-caps acronyms, encoding corruption, and heft-floor violations. Exit 0 = clean, 1 = warnings only, 2 = any blocks.

handler SanityScanCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--scan-edge-duplicates

prose --scan-edge-duplicates --universe [--json] Report-only: flags (Source, Target) pairs with more than one live RelationType wording (link_entities free-text drift, e.g. "owns" vs "has"). See ScanEdgeDuplicatesCli.

handler ScanEdgeDuplicatesCli

--scan-entity-mentions

prose --scan-entity-mentions

backfill BeatEntityMentions — index which entity names appear in each beat so entity-update staleness propagation works.

handler ScanEntityMentionsCli

--scan-unnamed-referents — DEACTIVATED

(no description in the dispatch comment — add one above the guard in Program.cs)

handler UnnamedReferentsCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--schema

prose --schema snapshot --table NAME [--out path.sql]
prose --schema rebuild  --table NAME --order "col1,col2,col3,…"

per-table schema operations (snapshot + safe column-reorder rebuild).

handler SchemaCli

--seed / --create-book

prose --seed                     list known seeds
prose --seed <name>              apply one
prose --seed --all [--force]     apply every known seed in order

apply canonical SQL seeds via C# (replaces sqlcmd-by-hand workflow). NOTE: --seed is also a flag of --create-book — that command must win the dispatch or its calls get hijacked by the SQL seeder.

handler SeedCli

--seed-keywords

prose --seed-keywords --slug <slug> --keywords "phrase one|phrase two|..."

set Amazon KDP backend keywords for one node (no generic default).

handler SeedKeywordsCli

--seed-sensory-hints

prose --seed-sensory-hints [--list] [--weapon "Name" --hints "hint1; hint2"] [--force]

handler SeedSensoryHintsCli

--seed-voice-rules

prose --seed-voice-rules

codify the GLMZ house voice + world rules from the memory rubric into the DB stores the generator reads (literary_rules / tone_bible). De-fragilizes the rules so they no longer depend on an .md file being parsed. Idempotent.

handler SeedVoiceRulesCli

--session-beats

prose --session-beats --session-id

handler SessionBeatsCli

--set-beat-enabled

prose --set-beat-enabled --slug <slug> (--beat-number N | --beat-id <guid>) [--enable]

enable/disable a beat's membership in a node's reading order without touching the Beat row itself (wraps NodeWorkbenchService.SetBeatMembershipEnabledAsync).

handler SetBeatEnabledCli

--set-byo-key

prose --set-byo-key --provider claude|openai

(--key [--key ...] | --add-key | --remove-key | --list | --clear) Personal API key (or rotation/failover pool of several, tried in order) the operator tool-calling loop (KdpOperatorService et al.) tries before its own default credential chain (Claude: Team OAuth; OpenAI: Vault 'openai').

handler SetByoKeyCli

--set-canon-section

(no description in the dispatch comment — add one above the guard in Program.cs)

handler SetCanonSectionCli

--set-edge-validity

prose --set-edge-validity --edge [--slug ] [--from-beat-number ] [--until-beat-number ] [--clear-from] [--clear-until] Sets/adjusts/clears an existing edge's beat-scoped validity window (2026-09-02, replaces the dead DateTime story-time mechanism). See SetEdgeValidityCli.

handler SetEdgeValidityCli

--set-entity-slug / --set-entity-name / --edit-edge / --prune-orphan-tag / --delete-obligation

prose --set-entity-slug --id --to [--apply] prose --set-entity-name --id --to "" [--apply] prose --edit-edge --edge [--target ] [--description ""] [--apply] prose --prune-orphan-tag --name "" [--apply] prose --delete-obligation --id [--apply] Corrections no record writer reaches: an entity slug or row name, an edge's target and wording, a tag name no entity carries, a retired narrative obligation. Dry-run unless --apply. See CanonMaintenanceCli.

handler CanonMaintenanceCli

--set-entity-status

prose --set-entity-status --id <entity guid> --status canon|archived|stub

explicit, by-id correction of Entities.Status — the one lifecycle column neither --set-entity-fields nor --backfill-stubs can reach (see SetEntityStatusCli's doc comment).

handler SetEntityStatusCli

--set-narrative-mode

prose --set-narrative-mode --slug --mode original|retelling|historical Gates TrinityReconciliationService's book scope — see SetNarrativeModeCli.

handler SetNarrativeModeCli

--set-node-author

prose --set-node-author --slug <slug|code|guid> --author "<Name>"

set Node.Author — the pen name exports fall through to instead of "MindAttic". See SetNodeAuthorCli class doc.

handler SetNodeAuthorCli

--set-node-layout

prose --set-node-layout --slug --layout prose|lyrics|screenplay How the book's beats print in every export format — see SetNodeLayoutCli / BeatLayout.

handler SetNodeLayoutCli

--set-node-slug

prose --set-node-slug --slug --to [--apply] [--json] Name a node deliberately and move its slug-carrying references with it. Dry-run by default. The result is PINNED, so --repair-slugs will not regenerate it from the Title.

handler SetNodeSlugCli

--set-node-version

prose --set-node-version (--slug <slug> | --id <id>) --version <N>

Directly sets Node.Version — the counter DocxExportService reads as nextVersion = Version + 1. For continuing a book's real version lineage after its local export folder was reset (e.g. a rename/regen) while the live KDP listing's history continues from an earlier number.

handler SetNodeVersionCli

--set-previous-node

prose --set-previous-node (--slug <slug> | --id <id>) (--previous-slug <slug> | --previous-id <id>)
prose --set-previous-node --slug <slug> --clear   — detach sequel link

Unblocks deleting/renaming a book another book's PreviousNodeId points at (FK_Nodes_PreviousNode is a DB-level Restrict, not just a C# guard — --delete-node --force cannot bypass it).

handler SetPreviousNodeCli

--set-timeline

Book chronology within its universe (Node.Timeline, PRS-T320). No mode flag = print it. prose --set-timeline --slug [--value | --before | --after | --same-as | --clear]

handler BookTimelineCli

--show

/show lookup: resolve a subject (name/slug/alias) to one Entity or Node and return a structured profile. See .claude/commands/show.md.

handler ShowCli

--simulate-collision

Scene Collision engine manual test harness (2026-08-10): runs SceneCollisionService against one real beat without a full ProseWriterRouter pass. See SimulateCollisionCli for details.

handler SimulateCollisionCli · cost-gated (spends LLM money)

--splice-beats

prose --splice-beats --node <slug|code|guid> --file <docket.json> [--apply] [--analyze]

a docket of exact-text replacements across a book, guarded all-or-nothing, dry-run unless --apply, verified by read-back. Replaces the 2026-09-22 scratchpad splice.py.

handler SpliceBeatsCli

--split-collection

prose --split-collection (--slug <s> | --id <guid>)

split a monolithic node into a Collection (parent + chapter child nodes) at IsChapterStart boundaries. Backs up to markdown first.

handler SplitCollectionCli

--sql-export

prose --sql-export --schema             schema-only DDL
prose --sql-export --data               schema + INSERT data
prose --sql-export --schema --out path  override output path

dump the entire Prose DB to a re-runnable .sql script.

handler SqlExportCli

--start-session

── Edit Sessions ───────────────────────────────────────────────────────────── prose --start-session --slug --label "prose-pass-1" [--type prose-pass|gripes-cleanup|logic-sweep|custom]

handler StartSessionCli

--strip-beat-artifacts

prose --strip-beat-artifacts --slug <slug> [--dry-run]

one-off cleanup of a generation-artifact heading/marker leaking into Beats.Text — see StripBeatArtifactsCli class doc.

handler StripBeatArtifactsCli

--sync-audio

prose --sync-audio   (no flags: one bidirectional newest-wins pass; --dry-run/--push/--pull/--node are refused)

reconcile audio bytes between local disk and Azure Blob storage. Companion to DualWriteAudioStore — repairs drift from offline recordings and failed background uploads: one full bidirectional newest-wins pass. See SyncAudioCli class doc.

handler SyncAudioCli

--sync-markdown

prose --sync-markdown [--dry-run]

sync project-rule, Codex, and Claude Code memory .md files to DB. Upserts by RelativePath; only changed files (hash diff) produce a history row.

handler SyncMarkdownCli

--tag-entities

prose --tag-entities (--id <guid> | --slug <slug> | --all) [--dry-run]

retroactive inline entity-GUID tagging backfill (corpus-trust-recovery Phase 1a/1b).

handler TagEntitiesCli

--timeline

prose --timeline (--slug <slug> | --id <id>)

extract a time / elapsed-duration timeline from all beats in a node. Flags clock anchors, infers story-relative timestamps, and surfaces conflicts.

handler TimelineCli

--timeline-check — DEACTIVATED

prose --timeline-check (--slug <slug> | --id <guid>)

deterministic timeline-consistency check (RFC 0009 §5). Detects dead-character-acting and wound-regression violations. No LLM calls.

handler TimelineCheckCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--tuned-read — DEACTIVATED

prose --tuned-read --slug <slug> [--dry] [--no-extract] [--max-candidates N] [--json]

the Story Ledger's Tuned Read (Phase 2) — walks a book in reading order, keeps its fact ledger fresh, pairs claims an exclusion axiom says cannot both be true, adjudicates only those pairs, and files a finding for each contradiction whose quote survives the mechanical grounding gate. Report-only (docs/LOGIC.md §4). Cost-gated: a real run spends one Sonnet call per uncached candidate. --dry runs the whole deterministic half for free.

deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--universe-export

(no description in the dispatch comment — add one above the guard in Program.cs)

handler UniverseInterchangeCli

--universe-import

RFC 0007 "Universe Interchange" — import/export between an app's /universe/.universe.json contract file and Prose's Entity spine. Each subcommand resolves its own explicit universe (file's own id, or a required positional slug) — see UniverseAgnosticCommands near the top of this file.

handler UniverseInterchangeCli

--universe-sync

(no description in the dispatch comment — add one above the guard in Program.cs)

handler UniverseInterchangeCli

--unresolved-nouns — DEACTIVATED

prose --unresolved-nouns (--slug | --all) [--min N] [--limit N] [--json] Report-only: capitalized phrases in a book's LIVE BEAT PROSE that resolve to no Entity row. Deterministic, no LLM, writes nothing. The residue detector already existed but ran against outline text only, so "is every named thing an entity?" had no measurable answer for prose.

handler UnresolvedNounsCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--validate-chapters

prose --validate-chapters (--slug | --universe | --all) [--json] Report-only, free: chapter structure and title-standard conformance, from BookSpineService. Never repairs — every finding is an author decision. See ValidateChaptersCli.

handler ValidateChaptersCli

--validate-nouns — DEACTIVATED

prose --validate-nouns --slug <slug>

scan beats for deprecated/renamed noun references.

handler ValidateNounsCli · deactivated 2026-09-22 (RFC 0014) — handler intact; remove its line from DeactivatedInstruments.cs to restore

--verify-quote / --verify-quotes-batch

prose --verify-quote --id <beatId> --quote "<claimed text>" [--claimed-by <name>] [--json]
prose --verify-quotes-batch --json-file <path> [--json]
prose --verification-staleness [--json]

QuoteGrounding checks: confirm a logic-sweep audit agent's claimed quote actually appears in the beat it's attributed to, before that finding is trusted for triage/fix (SS-LOGIC-4a). --verification-staleness: which books have BeatVerification rows computed under an older CurrentRuleVersion and need a re-run (2026-08-10 — added after the same "book never re-run after a check-logic fix" gap was found and manually re-diffed twice in one session; see BeatVerification.RuleVersion's doc comment).

handler VerifyBeatCli

--weapon-network

prose --weapon-network (--id | --character [--as-of date])

handler WeaponNetworkCli

--worker-mode

Fail-closed Hub dependency (Phase 2, explicit user decision): "the hub is running, Prose is working; hub goes down, Prose is down." Every command gates on the Hub being reachable and healthy before anything else runs — no silent fallback to the old direct-in-process behavior. The one exception: --worker-mode runs on a rented remote GPU pod talking to a separate Azure-hosted coordinator and its own local LLM endpoint — it has no access to this machine's loopback-only Hub by construction, not by choice, and gets its own equivalent fail-closed check against ITS hard dependency (see WorkerModeCli) instead of this one.

--workflow-status

prose --workflow-status [--slug | --all] [--json] Per-node or global prose service coverage matrix. Shows which services (Pacing, StoryMethodology, PlantPayoff, StoryAudit, Combat) were active when beats were written, and surfaces gaps where applicable services weren't used.

handler WorkflowMonitorCli

--world-state

prose --world-state --beat [--story-time "date"] [--json]

handler WorldStateCli

--wound

prose --wound — character wound ledger: list --character <id|name> [--as-of "date"] log --character <id|name> --description "..." [--location "chest"] [--severity moderate] ... status --wound --status active|healed|noted

handler WoundCli

--write-synopsis

prose --write-synopsis --slug [--json] Generates a beat-by-beat narrative synopsis (act-grouped, one sentence per beat) FROM the written prose. For a logic check, use --logic-sweep instead.

handler WriteSynopsisCli