scriveno 2.5.0 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +6 -4
  2. package/agents/voice-checker.md +10 -0
  3. package/commands/scr/autopilot-publish.md +1 -1
  4. package/commands/scr/autopilot-translate.md +5 -6
  5. package/commands/scr/autopilot.md +10 -6
  6. package/commands/scr/beta-reader.md +6 -3
  7. package/commands/scr/build-ebook.md +1 -1
  8. package/commands/scr/build-print.md +2 -2
  9. package/commands/scr/continuity-check.md +1 -0
  10. package/commands/scr/copy-edit.md +1 -0
  11. package/commands/scr/dialogue-audit.md +1 -0
  12. package/commands/scr/discussion-questions.md +1 -0
  13. package/commands/scr/draft.md +5 -4
  14. package/commands/scr/editor-review.md +1 -0
  15. package/commands/scr/export.md +1 -1
  16. package/commands/scr/help.md +1 -1
  17. package/commands/scr/line-edit.md +1 -0
  18. package/commands/scr/manuscript-stats.md +7 -7
  19. package/commands/scr/map-manuscript.md +1 -0
  20. package/commands/scr/multi-publish.md +3 -2
  21. package/commands/scr/new-character.md +1 -0
  22. package/commands/scr/new-work.md +1 -1
  23. package/commands/scr/next.md +1 -0
  24. package/commands/scr/originality-check.md +1 -0
  25. package/commands/scr/outline.md +2 -2
  26. package/commands/scr/pacing-analysis.md +1 -0
  27. package/commands/scr/pause-work.md +1 -1
  28. package/commands/scr/polish.md +1 -0
  29. package/commands/scr/progress.md +15 -10
  30. package/commands/scr/quick-write.md +4 -1
  31. package/commands/scr/resume-work.md +1 -1
  32. package/commands/scr/save.md +7 -4
  33. package/commands/scr/scan.md +17 -3
  34. package/commands/scr/sensitivity-review.md +1 -0
  35. package/commands/scr/submit.md +2 -1
  36. package/commands/scr/synopsis.md +1 -0
  37. package/commands/scr/theme-tracker.md +1 -0
  38. package/commands/scr/timeline.md +1 -0
  39. package/commands/scr/track.md +2 -0
  40. package/commands/scr/translate.md +1 -1
  41. package/commands/scr/voice-check.md +1 -0
  42. package/data/CONSTRAINTS.json +6 -1
  43. package/data/export-templates/scriveno-book.typst +2 -2
  44. package/data/export-templates/scriveno-chapbook.typst +1 -1
  45. package/data/export-templates/scriveno-picturebook.typst +9 -0
  46. package/data/export-templates/scriveno-stageplay.typst +14 -4
  47. package/docs/architecture.md +6 -3
  48. package/docs/auto-invoke-policy.md +4 -3
  49. package/docs/command-reference.md +29 -24
  50. package/docs/configuration.md +28 -3
  51. package/docs/context-protocol.md +2 -1
  52. package/docs/contributing.md +2 -2
  53. package/docs/creative-context.md +1 -1
  54. package/docs/drafter-quality.md +1 -1
  55. package/docs/history-protocol.md +1 -1
  56. package/docs/progress-protocol.md +132 -0
  57. package/docs/release-notes.md +54 -0
  58. package/docs/route-graph.md +1 -1
  59. package/docs/shipped-assets.md +4 -2
  60. package/docs/translation.md +7 -11
  61. package/docs/voice-dna.md +3 -3
  62. package/lib/auto-invoke-engine.js +95 -0
  63. package/lib/track-safety.js +72 -0
  64. package/package.json +1 -1
  65. package/templates/PROGRESS.md +56 -0
  66. package/templates/config.json +1 -1
@@ -5,7 +5,7 @@ argument-hint: "[--fix] [--quiet]"
5
5
 
6
6
  # /scr:scan -- Context Drift Scanner
7
7
 
8
- You are the project's drift detector. Trust nothing. Compare what `.manuscript/STATE.md`, `OUTLINE.md`, `RECORD.md`, `config.json`, and the various structural files **claim** against what the filesystem actually contains, and report every mismatch.
8
+ You are the project's drift detector. Trust nothing. Compare what `.manuscript/STATE.md`, `OUTLINE.md`, `RECORD.md`, `PROGRESS.md`, `config.json`, and the various structural files **claim** against what the filesystem actually contains, and report every mismatch.
9
9
 
10
10
  Follow the auto-invoke policy. In the source repository it is documented at `docs/auto-invoke-policy.md`. `/scr:scan` does not spawn agents. It may run deterministic local checks and, under `--fix` after confirmation, deterministic local repairs.
11
11
 
@@ -23,7 +23,7 @@ This complements `/scr:health` (which fixes structural issues like missing direc
23
23
 
24
24
  ## Instruction
25
25
 
26
- Load `.manuscript/config.json`, `.manuscript/STATE.md`, `.manuscript/OUTLINE.md`, and `.manuscript/RECORD.md` when present. Each check below produces a finding with one of three severities:
26
+ Load `.manuscript/config.json`, `.manuscript/STATE.md`, `.manuscript/OUTLINE.md`, `.manuscript/RECORD.md`, and `.manuscript/PROGRESS.md` when present. Each check below produces a finding with one of three severities:
27
27
 
28
28
  - **DRIFT** -- recorded state contradicts disk reality. Trust nothing downstream until resolved.
29
29
  - **WARNING** -- an artifact is stale or out of date. Downstream work may be silently using outdated input.
@@ -206,6 +206,20 @@ Do not over-claim. RECORD.md is an interpretive store, so uncertain findings sho
206
206
 
207
207
  ---
208
208
 
209
+ ### CHECK 12: PROGRESS.md ledger staleness
210
+
211
+ If `.manuscript/PROGRESS.md` exists, compare its mtime against STATE.md and the newest draft. If PROGRESS.md is older than either, the saved per-unit ledger no longer reflects the work on disk. Emit:
212
+
213
+ ```
214
+ WARNING .manuscript/PROGRESS.md is older than the recorded state.
215
+ The saved per-unit ledger may show stale unit status.
216
+ Fix: /scr:save to rebuild it (or /scr:scan --fix).
217
+ ```
218
+
219
+ Recompute per-unit status from disk per `docs/progress-protocol.md`. If the bucket counts (done / in progress / untouched) disagree with what PROGRESS.md records, emit a DRIFT finding citing both. If PROGRESS.md does not exist, emit INFO with a one-line suggestion to run `/scr:save` once to generate the openable ledger.
220
+
221
+ ---
222
+
209
223
  ### REPORT
210
224
 
211
225
  Output a single structured report:
@@ -248,7 +262,7 @@ If `--quiet` was passed and there are zero findings, exit silently with no outpu
248
262
 
249
263
  When `--fix` is passed, after the report, group findings by auto-fixability:
250
264
 
251
- - **Auto-fixable now** -- finding has a deterministic fix Scriveno can apply (e.g. update STATE.md unit counts to match disk, initialize missing RECORD.md from the installed template, regenerate stale CONTEXT.md, sort orphan drafts into a `_unsorted/` review directory). For each, ask the writer once:
265
+ - **Auto-fixable now** -- finding has a deterministic fix Scriveno can apply (e.g. update STATE.md unit counts to match disk, initialize missing RECORD.md from the installed template, regenerate stale CONTEXT.md, regenerate stale or missing PROGRESS.md from disk per `docs/progress-protocol.md`, sort orphan drafts into a `_unsorted/` review directory). For each, ask the writer once:
252
266
  > Apply [N] auto-fixes? (yes / no / show me what each does)
253
267
  - **Requires writer decision** -- finding needs a judgment call (e.g. character orphans, scaffold pending, voice drift). List with suggested next command.
254
268
  - **Manual** -- finding requires manual cleanup (e.g. malformed HISTORY.log lines).
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Flag potential sensitivity issues with context, suggest alternatives, and note intentional craft.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:sensitivity-review -- Sensitivity Review with Craft Awareness
@@ -20,7 +20,8 @@ Load `.manuscript/config.json` for `command_unit`. The runnable command stays `/
20
20
  1. Load `.manuscript/config.json` for project context
21
21
  2. Check that the specified unit has been through editor review. Prefer `.manuscript/reviews/{N}-REVIEW.md`; if it is missing, accept legacy `{N}-EDITOR-NOTES.md`.
22
22
  3. Mark the unit as submitted in `STATE.md`
23
- 4. Report: "Unit {N} submitted. {remaining} units remaining."
23
+ 4. Refresh `.manuscript/PROGRESS.md` so the ledger shows this unit as done, per `docs/progress-protocol.md`.
24
+ 5. Report: "Unit {N} submitted. {remaining} units remaining."
24
25
 
25
26
  ## Response Contract
26
27
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Generate plot synopsis at specified length for query and submission packages.
3
+ argument-hint: "[--length <1p|2p|5p>]"
3
4
  ---
4
5
 
5
6
  # /scr:synopsis -- Plot Synopsis Generator
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Track thematic threads across the work with auto-detection suggestions.
3
+ argument-hint: "[--detect]"
3
4
  ---
4
5
 
5
6
  # /scr:theme-tracker -- Track Thematic Threads
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Generate a chronological event timeline from the outline.
3
+ argument-hint: "[--story-order] [--chronological]"
3
4
  ---
4
5
 
5
6
  # /scr:timeline -- Chronological Event Timeline
@@ -48,6 +48,8 @@ Track metadata lives in `.manuscript/tracks.json`. Create this file on first `tr
48
48
 
49
49
  **Label-to-branch mapping (D-01):** Writer-friendly labels are stored as-is. The git branch name is derived by slugifying the label: lowercase, replace spaces with hyphens, strip special characters (keep alphanumeric and hyphens only), prefix with `track/`. Example: "Second Draft Attempt" becomes `track/second-draft-attempt`.
50
50
 
51
+ This slugify step is the one safety boundary that keeps a writer-chosen label out of a shell command, so it is mandatory, never optional. The canonical algorithm ships as `lib/track-safety.js` (installed to `<data-dir>/lib/track-safety.js`). To derive the slug and a collision-free branch deterministically instead of applying the rules by hand, run `node <data-dir>/lib/track-safety.js "<label>"`, which prints `{"slug":"...","branch":"..."}` with collisions already resolved against a comma-separated second argument of existing branch names. A correct slug contains only `[a-z0-9-]`; if it contains anything else, do not pass it to git.
52
+
51
53
  **Canon branch metadata:** `canon_branch` stores the real branch name of the canon manuscript. This may be `main`, `master`, `trunk`, or any other branch name the writer uses.
52
54
 
53
55
  ## Canon Branch Resolution
@@ -214,7 +214,7 @@ After all units are translated, show a summary:
214
214
  > - Build translation memory: `/scr:translation-memory [lang] --build`
215
215
  > - Cultural adaptation review: `/scr:cultural-adaptation [lang]`
216
216
  > - Back-translate to verify: `/scr:back-translate [lang]`
217
- > - Export translation: `/scr:export --format [format] --language [lang]`
217
+ > - Export translation: `/scr:multi-publish --languages [lang] --format [format]` (the translated-export path; `/scr:export` builds the source-language manuscript only)
218
218
 
219
219
  ## Agent and Automation Status
220
220
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Compare drafted prose against STYLE-GUIDE.md to detect voice drift.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:voice-check -- Voice Fidelity Check
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "./constraints.schema.json",
3
- "version": "2.5.0",
3
+ "version": "2.7.1",
4
4
  "description": "Scriveno constraint system: work types, command availability, exports, and dependencies. Every command checks this file at runtime.",
5
5
  "_notes": {
6
6
  "sacred_keys": "Sacred subcommands live at commands/scr/sacred/<name>.md and run as /scr:sacred:<name>. Their CONSTRAINTS keys use the sacred:<name> form so /scr:help can render the runnable slash-command path directly. The sacred-numbering-format entry is a separate flat command (commands/scr/sacred-numbering-format.md) that surfaces the active tradition's numbering format. It used to be named sacred-verse-numbering, which collided with sacred:verse-numbering at install time -- both flattened to scr-sacred-verse-numbering. Renamed in v1.6.x; the installer now refuses to install when two sources share a flat skill name."
@@ -2340,6 +2340,7 @@
2340
2340
  },
2341
2341
  "beta-reader": {
2342
2342
  "category": "review",
2343
+ "description": "Simulate a beta reader's experience of the manuscript using a fresh-context reader persona (same model, not a second or external AI).",
2343
2344
  "available": [
2344
2345
  "all"
2345
2346
  ],
@@ -3743,6 +3744,7 @@
3743
3744
  "default": {
3744
3745
  "BRIEF.md": "BRIEF.md",
3745
3746
  "RECORD.md": "RECORD.md",
3747
+ "PROGRESS.md": "PROGRESS.md",
3746
3748
  "CHARACTERS.md": "CHARACTERS.md",
3747
3749
  "RELATIONSHIPS.md": "RELATIONSHIPS.md",
3748
3750
  "WORLD.md": "WORLD.md",
@@ -3752,6 +3754,7 @@
3752
3754
  "academic": {
3753
3755
  "BRIEF.md": "PROPOSAL.md",
3754
3756
  "RECORD.md": "RECORD.md",
3757
+ "PROGRESS.md": "PROGRESS.md",
3755
3758
  "CHARACTERS.md": "CONCEPTS.md",
3756
3759
  "WORLD.md": "CONTEXT.md",
3757
3760
  "PLOT-GRAPH.md": "ARGUMENT-MAP.md",
@@ -3760,6 +3763,7 @@
3760
3763
  "technical": {
3761
3764
  "BRIEF.md": "DOC-BRIEF.md",
3762
3765
  "RECORD.md": "RECORD.md",
3766
+ "PROGRESS.md": "PROGRESS.md",
3763
3767
  "CHARACTERS.md": "AUDIENCE.md",
3764
3768
  "RELATIONSHIPS.md": "DEPENDENCIES.md",
3765
3769
  "WORLD.md": "SYSTEM.md",
@@ -3769,6 +3773,7 @@
3769
3773
  "sacred": {
3770
3774
  "BRIEF.md": "FRAMEWORK.md",
3771
3775
  "RECORD.md": "RECORD.md",
3776
+ "PROGRESS.md": "PROGRESS.md",
3772
3777
  "CHARACTERS.md": "FIGURES.md",
3773
3778
  "RELATIONSHIPS.md": "LINEAGES.md",
3774
3779
  "WORLD.md": "COSMOLOGY.md",
@@ -13,10 +13,10 @@
13
13
  #let margin-bottom = $if(margin-bottom)$$margin-bottom$$else$0.75in$endif$
14
14
 
15
15
  // Text direction: parameterized for RTL compatibility (Phase 7)
16
- #let text-dir = $if(text-direction)$$text-direction$$else$ltr$endif$
16
+ #let text-dir = $if(dir)$$dir$$else$ltr$endif$
17
17
 
18
18
  // Language code for CJK detection
19
- #let lang-code = $if(language)$"$language$"$else$"en"$endif$
19
+ #let lang-code = $if(lang)$"$lang$"$else$"en"$endif$
20
20
 
21
21
  // CJK detection helper
22
22
  #let is-cjk = lang-code in ("zh", "ja", "ko")
@@ -16,7 +16,7 @@
16
16
  #let margin-outside = $if(margin-outside)$$margin-outside$$else$0.625in$endif$
17
17
 
18
18
  // Text direction
19
- #let text-dir = $if(text-direction)$$text-direction$$else$ltr$endif$
19
+ #let text-dir = $if(dir)$$dir$$else$ltr$endif$
20
20
 
21
21
  // Font configuration -- chapbooks default to a clean readable serif
22
22
  #let body-font = $if(mainfont)$"$mainfont$"$else$"Libertinus Serif"$endif$
@@ -20,6 +20,13 @@
20
20
  // Override with -V margin-top= etc. if custom margins are needed
21
21
  #let margin-all = $if(margin-top)$$margin-top$$else$0.375in$endif$
22
22
 
23
+ // Text direction: parameterized for RTL compatibility (set via --metadata dir=rtl).
24
+ // Margins are symmetric and body text is centered, so only the base text
25
+ // direction needs to flip for right-to-left scripts.
26
+ #let text-dir = $if(dir)$$dir$$else$ltr$endif$
27
+ #let is-rtl = text-dir == rtl
28
+ #let lang-code = $if(lang)$"$lang$"$else$"en"$endif$
29
+
23
30
  // Metadata
24
31
  #let book-title = $if(title)$"$title$"$else$"Untitled"$endif$
25
32
  #let book-author = $if(author)$"$for(author)$$it.name$$sep$, $endfor$"$else$""$endif$
@@ -46,6 +53,8 @@
46
53
  #set text(
47
54
  font: $if(mainfont)$"$mainfont$"$else$"Helvetica"$endif$,
48
55
  size: $if(fontsize)$$fontsize$$else$16pt$endif$,
56
+ dir: text-dir,
57
+ lang: lang-code,
49
58
  fallback: true,
50
59
  )
51
60
 
@@ -17,6 +17,13 @@
17
17
  #let margin-top = $if(margin-top)$$margin-top$$else$1in$endif$
18
18
  #let margin-bottom = $if(margin-bottom)$$margin-bottom$$else$1in$endif$
19
19
 
20
+ // Text direction: parameterized for RTL compatibility (set via --metadata dir=rtl).
21
+ // For right-to-left scripts the wider binding margin moves to the right edge and
22
+ // the page number flips to the top-left.
23
+ #let text-dir = $if(dir)$$dir$$else$ltr$endif$
24
+ #let is-rtl = text-dir == rtl
25
+ #let lang-code = $if(lang)$"$lang$"$else$"en"$endif$
26
+
20
27
  // Metadata
21
28
  #let play-title = $if(title)$"$title$"$else$"Untitled"$endif$
22
29
  #let play-author = $if(author)$"$for(author)$$it.name$$sep$, $endfor$"$else$""$endif$
@@ -30,16 +37,17 @@
30
37
  width: page-width,
31
38
  height: page-height,
32
39
  margin: (
33
- left: margin-left,
34
- right: margin-right,
40
+ // The 1.5in binding margin sits on the left for LTR and flips to the right for RTL.
41
+ left: if is-rtl { margin-right } else { margin-left },
42
+ right: if is-rtl { margin-left } else { margin-right },
35
43
  top: margin-top,
36
44
  bottom: margin-bottom,
37
45
  ),
38
- // Page numbering: top-right, industry standard for scripts
46
+ // Page numbering: top-right for LTR scripts, top-left for RTL
39
47
  header: context {
40
48
  let page-num = counter(page).get().first()
41
49
  if page-num > 1 {
42
- align(right, text(size: 10pt)[#str(page-num).])
50
+ align(if is-rtl { left } else { right }, text(size: 10pt)[#str(page-num).])
43
51
  }
44
52
  },
45
53
  )
@@ -48,6 +56,8 @@
48
56
  #set text(
49
57
  font: $if(mainfont)$"$mainfont$"$else$"Courier New"$endif$,
50
58
  size: $if(fontsize)$$fontsize$$else$12pt$endif$,
59
+ dir: text-dir,
60
+ lang: lang-code,
51
61
  fallback: true,
52
62
  )
53
63
 
@@ -164,7 +164,8 @@ scriveno/
164
164
  scriveno-book.typst Book interior PDF
165
165
  scriveno-epub.css EPUB styling
166
166
  scriveno-academic.latex Academic paper formatting
167
- templates/
167
+ proof/ Committed proof bundles (voice-dna, runtime-parity)
168
+ templates/ Per-project starting content (repo root, sibling of data/)
168
169
  config.json Per-project configuration template
169
170
  WORK.md Work overview template
170
171
  OUTLINE.md Structural outline template
@@ -174,6 +175,8 @@ scriveno/
174
175
  WRITING-RULES.md Universal AI-tell rulebook (1.6.0+)
175
176
  THEMES.md Thematic threads template
176
177
  STATE.md Progress tracking template
178
+ CONTEXT.md Session bootstrap scaffold (derived, auto-regenerated)
179
+ PROGRESS.md Per-unit progress ledger scaffold (derived, 2.7.0+)
177
180
  BRIEF.md Project brief template
178
181
  WORLD.md World-building template
179
182
  pitfalls/ Per-work-type pitfall packs (1.6.0+)
@@ -354,7 +357,7 @@ Codex uses a skill-native variation of this strategy. The installer generates on
354
357
 
355
358
  Scriveno also ships `lib/auto-invoke-engine.js`, exposed through `scriveno status --project .`, `scriveno status . --json`, `scriveno status --project . --apply-safe`, `scriveno sync --check`, `scriveno smoke`, `scriveno agents`, and `scriveno routes`. The installer copies this library into the shared Scriveno asset directory for global and project installs, so command surfaces can call a single status and audit engine before falling back to embedded markdown logic.
356
359
 
357
- The engine checks disk evidence only: project presence, required project files, STATE.md, CONTEXT.md freshness, plan files, draft files, review coverage, unresolved notes, revision-track proposals, translation work, publishing prerequisites, exports, history, and save signals. It recommends the next command, but it does not mutate files and does not spawn agents by itself. That boundary keeps proactive behavior portable across Claude Code, Codex, Cursor, Gemini CLI, OpenCode, GitHub Copilot, Windsurf, Antigravity, Manus, Perplexity Desktop, and the generic fallback.
360
+ The engine checks disk evidence only: project presence, required project files, STATE.md, CONTEXT.md freshness, plan files, draft files, review coverage, unresolved notes, revision-track proposals, translation work, publishing prerequisites, exports, history, and save signals. It also computes the per-unit progress ledger (done / in progress / untouched) through `computeProgressLedger`, which `/scr:progress` and `.manuscript/PROGRESS.md` build on. It recommends the next command, but it does not mutate files and does not spawn agents by itself. That boundary keeps proactive behavior portable across Claude Code, Codex, Cursor, Gemini CLI, OpenCode, GitHub Copilot, Windsurf, Antigravity, Manus, Perplexity Desktop, and the generic fallback.
358
361
 
359
362
  The engine now reports three automation lanes:
360
363
 
@@ -422,7 +425,7 @@ The voice-checker agent (`agents/voice-checker.md`) compares drafted prose again
422
425
  - Specific issues organized by category (structural voice, lexical voice, character voice, AI-slop indicators)
423
426
  - Severity ratings (drift vs critical violation)
424
427
 
425
- The voice-checker is invoked after every drafted unit. If drift exceeds the configured threshold (default: 0.3 in `config.json`), the writer is offered a re-draft.
428
+ The voice-checker is invoked after every drafted unit and returns an Overall score (0-100). Normalized drift is `drift = (100 - score) / 100`, so the default `config.json` threshold of 0.3 means the writer is offered a re-draft when the voice score falls below 70. See the "Normalized drift" section of `agents/voice-checker.md` for the single definition callers share.
426
429
 
427
430
  ### Calibration
428
431
 
@@ -63,7 +63,7 @@ Use `Automation status:` for command chains and `Sync status:` for runtime insta
63
63
  | Level | Behavior | Default | Examples |
64
64
  |-------|----------|---------|----------|
65
65
  | 1 | Read-only suggestion | Run by default | `/scr:next` route, progress sweep, review queue surfacing |
66
- | 2 | Safe local helper | Run when directly triggered | `CONTEXT.md` regeneration, `HISTORY.log` append, scan report, stats count |
66
+ | 2 | Safe local helper | Run when directly triggered | `CONTEXT.md` regeneration, `PROGRESS.md` ledger regeneration, `HISTORY.log` append, scan report, stats count |
67
67
  | 3 | Scoped agent | Spawn when the command implies it or evidence is bounded | drafter, plan-checker, voice-checker, continuity-checker, translator, beta-reader |
68
68
  | 4 | Writer-owned action | Require confirmation | publishing, destructive edits, merge decisions, accepting review findings |
69
69
 
@@ -81,6 +81,7 @@ Run these read-only checks in `/scr:next`, `/scr:progress`, and closeouts for ma
81
81
  - If front matter, back matter, blurb, or cover handoff assets are missing, surface the specific publishing prerequisite before packaging.
82
82
  - If export outputs are older than source files, suggest `/scr:export` or `/scr:publish`.
83
83
  - If no save exists after recent manuscript changes, suggest `/scr:save`.
84
+ - Surface deliverable progress (units done / in progress / untouched) and point at the per-unit ledger `.manuscript/PROGRESS.md`; if it is stale, suggest `/scr:save` to refresh it.
84
85
 
85
86
  These checks must not mutate files.
86
87
 
@@ -88,10 +89,10 @@ These checks must not mutate files.
88
89
 
89
90
  Run these only when the current command directly owns the file operation:
90
91
 
91
- - `/scr:save` regenerates `.manuscript/CONTEXT.md`, appends `HISTORY.log`, and commits `.manuscript/`.
92
+ - `/scr:save` regenerates `.manuscript/CONTEXT.md` and `.manuscript/PROGRESS.md` (the per-unit ledger), appends `HISTORY.log`, and commits `.manuscript/`.
92
93
  - `/scr:scan --fix` applies deterministic state repairs after confirmation and appends `HISTORY.log`.
93
94
  - `/scr:resume-work` may regenerate `CONTEXT.md` from disk state.
94
- - `/scr:progress` may count drafts, submitted units, open record threads, and stale reports, but does not write.
95
+ - `/scr:progress` may count drafts, submitted units, open record threads, and stale reports and render the per-unit ledger live, but does not write. The saved `.manuscript/PROGRESS.md` is refreshed by `/scr:save`, `/scr:draft`, `/scr:autopilot`, and `/scr:scan --fix`.
95
96
  - Runtime `/scr:sync --apply` runs the installer and verifies installed command, skill, and agent surfaces.
96
97
 
97
98
  Report these as local operations, not spawned agents.
@@ -245,7 +245,7 @@ Show the proof-first path, runtime command shapes, demo sequence, proof artifact
245
245
 
246
246
  ### `/scr:next`
247
247
 
248
- **Description:** Auto-detect what to do next in your workflow and recommend the best path. The one command a writer can always use.
248
+ **Description:** Auto-detect what to do next in your workflow and run it. The one command a writer can always use.
249
249
 
250
250
  **Usage:** `/scr:next`
251
251
 
@@ -277,7 +277,7 @@ Scriveno maps your intent to the right command and runs it.
277
277
 
278
278
  ### `/scr:help`
279
279
 
280
- **Description:** Show Scriveno commands grouped by inferred writer intent, filtered to what's relevant for your current work type and progress.
280
+ **Description:** Show Scriveno commands grouped by workflow stage, filtered to what's relevant for your current work type and progress.
281
281
 
282
282
  **Usage:** `/scr:help [category or search term]`
283
283
 
@@ -293,17 +293,22 @@ Show publishing-related commands available for your work type. Without a categor
293
293
 
294
294
  ### `/scr:progress`
295
295
 
296
- **Description:** Show current state and next step. How far along are you, what's drafted, what's pending.
296
+ **Description:** Show project progress: a unit progress bar, what's done / in progress / untouched, pipeline position, and a pointer to the per-unit ledger.
297
297
 
298
298
  **Usage:** `/scr:progress`
299
299
 
300
300
  **Prerequisites:** None
301
301
 
302
+ **Output includes:**
303
+ - A deliverable progress bar over units (done / in progress / untouched) with percent
304
+ - Pipeline position on the writing lifecycle (e.g., "Stage 6 of 10: Drafting")
305
+ - A pointer to `.manuscript/PROGRESS.md`, the openable per-unit ledger you can read any time
306
+
302
307
  **Example:**
303
308
  ```
304
309
  /scr:progress
305
310
  ```
306
- See "Chapter 4 of 12 drafted. 32,000 words. Next: discuss-chapter 5."
311
+ See "████████░░ 4/12 chapters done (33%). Pipeline: Stage 6 of 10 (Drafting). Next: discuss chapter 5. Full ledger: .manuscript/PROGRESS.md."
307
312
 
308
313
  ---
309
314
 
@@ -350,7 +355,7 @@ Import an existing Word document and split it into chapters, scenes, and context
350
355
 
351
356
  **Description:** Spawn parallel analysis agents to understand an existing manuscript's voice, structure, characters, and themes.
352
357
 
353
- **Usage:** `/scr:map-manuscript`
358
+ **Usage:** `/scr:map-manuscript [area]`
354
359
 
355
360
  **Prerequisites:** None
356
361
 
@@ -564,7 +569,7 @@ Visualize your novel's structure mapped to the hero's journey.
564
569
 
565
570
  **Description:** Generate a chronological event timeline from the outline.
566
571
 
567
- **Usage:** `/scr:timeline`
572
+ **Usage:** `/scr:timeline [--story-order] [--chronological]`
568
573
 
569
574
  **Prerequisites:** OUTLINE.md must exist
570
575
 
@@ -584,7 +589,7 @@ See events in chronological order, even if your narrative is non-linear.
584
589
 
585
590
  **Description:** Track thematic threads across the work with auto-detection suggestions.
586
591
 
587
- **Usage:** `/scr:theme-tracker`
592
+ **Usage:** `/scr:theme-tracker [--detect]`
588
593
 
589
594
  **Prerequisites:** THEMES.md must exist
590
595
 
@@ -780,7 +785,7 @@ Commands for creating and managing characters, relationships, and world-building
780
785
 
781
786
  **Description:** Build a complete character profile through guided interactive interview.
782
787
 
783
- **Usage:** `/scr:new-character`
788
+ **Usage:** `/scr:new-character <name>`
784
789
 
785
790
  **Prerequisites:** WORK.md must exist
786
791
 
@@ -962,7 +967,7 @@ Scriveno drafts a sample passage using your voice profile. If it doesn't sound r
962
967
 
963
968
  **Description:** Perform a line-level prose quality pass with inline annotations.
964
969
 
965
- **Usage:** `/scr:line-edit`
970
+ **Usage:** `/scr:line-edit [N]`
966
971
 
967
972
  **Prerequisites:** Draft must exist
968
973
 
@@ -980,7 +985,7 @@ Scriveno reads your prose line by line, flagging weak verbs, passive voice, redu
980
985
 
981
986
  **Description:** Perform a correctness pass for grammar, spelling, punctuation, and consistency.
982
987
 
983
- **Usage:** `/scr:copy-edit`
988
+ **Usage:** `/scr:copy-edit [N]`
984
989
 
985
990
  **Prerequisites:** Draft must exist
986
991
 
@@ -998,7 +1003,7 @@ Catch typos, grammar issues, and consistency problems (character name spellings,
998
1003
 
999
1004
  **Description:** Chain line-edit, copy-edit, and voice-check for comprehensive prose polish.
1000
1005
 
1001
- **Usage:** `/scr:polish`
1006
+ **Usage:** `/scr:polish [N]`
1002
1007
 
1003
1008
  **Prerequisites:** Draft and STYLE-GUIDE.md must exist
1004
1009
 
@@ -1016,7 +1021,7 @@ Run all three quality passes in sequence. The comprehensive final polish before
1016
1021
 
1017
1022
  **Description:** Write a scene, passage, or chapter outside the full planning workflow.
1018
1023
 
1019
- **Usage:** `/scr:quick-write`
1024
+ **Usage:** `/scr:quick-write [--discuss] [--research] [--full]`
1020
1025
 
1021
1026
  **Prerequisites:** None
1022
1027
 
@@ -1038,7 +1043,7 @@ Commands for reviewing your manuscript from different angles -- continuity, voic
1038
1043
 
1039
1044
  **Description:** Automated continuity verification to scan for narrative contradictions across the manuscript.
1040
1045
 
1041
- **Usage:** `/scr:continuity-check`
1046
+ **Usage:** `/scr:continuity-check [N]`
1042
1047
 
1043
1048
  **Prerequisites:** Draft must exist
1044
1049
 
@@ -1059,7 +1064,7 @@ Find contradictions: "In Chapter 3 Maria has brown eyes, but in Chapter 7 they'r
1059
1064
 
1060
1065
  **Description:** Compare drafted prose against STYLE-GUIDE.md to detect voice drift.
1061
1066
 
1062
- **Usage:** `/scr:voice-check`
1067
+ **Usage:** `/scr:voice-check [N]`
1063
1068
 
1064
1069
  **Prerequisites:** Draft and STYLE-GUIDE.md must exist
1065
1070
 
@@ -1080,7 +1085,7 @@ Detect where your drafted prose drifts from your established voice profile.
1080
1085
 
1081
1086
  **Description:** Flag potential sensitivity issues with context, suggest alternatives, and note intentional craft.
1082
1087
 
1083
- **Usage:** `/scr:sensitivity-review`
1088
+ **Usage:** `/scr:sensitivity-review [N]`
1084
1089
 
1085
1090
  **Prerequisites:** Draft must exist
1086
1091
 
@@ -1102,7 +1107,7 @@ Flag content that could be unintentionally harmful, with context-aware suggestio
1102
1107
 
1103
1108
  **Description:** Generate a structure-aware pacing report analyzing scene tempo and narrative flow.
1104
1109
 
1105
- **Usage:** `/scr:pacing-analysis`
1110
+ **Usage:** `/scr:pacing-analysis [N]`
1106
1111
 
1107
1112
  **Prerequisites:** Draft must exist
1108
1113
 
@@ -1120,7 +1125,7 @@ See where your story drags or rushes. Scriveno maps scene length, tension, and t
1120
1125
 
1121
1126
  **Description:** Audit dialogue for character voice differentiation, attribution clarity, and talking-head detection.
1122
1127
 
1123
- **Usage:** `/scr:dialogue-audit`
1128
+ **Usage:** `/scr:dialogue-audit [N]`
1124
1129
 
1125
1130
  **Prerequisites:** Draft must exist with dialogue
1126
1131
 
@@ -1139,9 +1144,9 @@ Check that each character sounds distinct, dialogue tags are clear, and scenes a
1139
1144
 
1140
1145
  ### `/scr:beta-reader`
1141
1146
 
1142
- **Description:** Simulate a beta reader's experience of the manuscript with cross-AI peer review.
1147
+ **Description:** Simulate a beta reader's experience of the manuscript using a fresh-context reader persona (same model, not a second or external AI).
1143
1148
 
1144
- **Usage:** `/scr:beta-reader`
1149
+ **Usage:** `/scr:beta-reader [N] [--focus <area>]`
1145
1150
 
1146
1151
  **Prerequisites:** Draft must exist
1147
1152
 
@@ -1163,7 +1168,7 @@ Get a simulated reader's reaction: what hooked them, where they got confused, wh
1163
1168
 
1164
1169
  **Description:** Scan drafted prose for AI-generated patterns and unintentional similarity to published works.
1165
1170
 
1166
- **Usage:** `/scr:originality-check`
1171
+ **Usage:** `/scr:originality-check [N]`
1167
1172
 
1168
1173
  **Prerequisites:** Draft must exist
1169
1174
 
@@ -1259,7 +1264,7 @@ Get three blurb variations: punchy (Amazon listing), standard (back cover), exte
1259
1264
 
1260
1265
  **Description:** Generate plot synopsis at specified length for query and submission packages.
1261
1266
 
1262
- **Usage:** `/scr:synopsis`
1267
+ **Usage:** `/scr:synopsis [--length <1p|2p|5p>]`
1263
1268
 
1264
1269
  **Prerequisites:** Complete draft must exist
1265
1270
 
@@ -1313,7 +1318,7 @@ Generate a full book proposal: overview, market analysis, chapter summaries, aut
1313
1318
 
1314
1319
  **Description:** Generate reading group discussion questions exploring themes, characters, and craft.
1315
1320
 
1316
- **Usage:** `/scr:discussion-questions`
1321
+ **Usage:** `/scr:discussion-questions [--count <N>]`
1317
1322
 
1318
1323
  **Prerequisites:** Complete draft must exist
1319
1324
 
@@ -1478,7 +1483,7 @@ Build a poetry-submission DOCX for journal or contest submission using the poetr
1478
1483
 
1479
1484
  **Description:** Run full publishing pipeline unattended with quality gate (voice-check + continuity-check).
1480
1485
 
1481
- **Usage:** `/scr:autopilot-publish --preset <preset>`
1486
+ **Usage:** `/scr:autopilot-publish --preset <preset> [--front-level <minimum|balanced|maximum|skip>] [--back-level <minimum|balanced|maximum|skip>]`
1482
1487
 
1483
1488
  **Prerequisites:** Complete draft must exist
1484
1489
 
@@ -1513,7 +1518,7 @@ Commands for generating cover art, scene illustrations, character references, ma
1513
1518
  - `--trim <size>` -- Preferred trim shorthand for prompt framing
1514
1519
  - `--kdp <trim_size>` -- Legacy alias for `--trim`
1515
1520
  - `--series` -- Generate series-consistent cover
1516
- - `--prompt-only` -- Generate prompts without calling image API
1521
+ - `--prompt-only` -- Generate prompts without packaging reminders
1517
1522
  - `--element` -- Generate specific cover element
1518
1523
 
1519
1524
  **Example:**
@@ -57,22 +57,47 @@ When a writer runs `/scr:new-work`, Scriveno creates `.manuscript/config.json`.
57
57
 
58
58
  ```json
59
59
  {
60
- "scriveno_version": "2.5.0",
60
+ "scriveno_version": "2.7.1",
61
61
  "work_type": "<chosen>",
62
62
  "group": "<group>",
63
63
  "command_unit": "<unit>",
64
64
  "developer_mode": false,
65
65
  "created_at": "<ISO timestamp>",
66
+ "updated_at": "<ISO timestamp>",
66
67
  "autopilot": {
67
68
  "enabled": false,
68
- "profile": "guided"
69
+ "profile": "guided",
70
+ "custom_checkpoints": []
71
+ },
72
+ "voice": {
73
+ "calibrated": false,
74
+ "last_calibration": null,
75
+ "drift_threshold": 0.3
76
+ },
77
+ "draft": {
78
+ "rigor": "standard",
79
+ "context_profile": "standard",
80
+ "pitfalls_enabled": true
81
+ },
82
+ "export": {
83
+ "default_format": "docx_manuscript",
84
+ "include_front_matter": true,
85
+ "include_back_matter": true
86
+ },
87
+ "translation": {
88
+ "source_language": "en",
89
+ "target_languages": []
90
+ },
91
+ "collaboration": {
92
+ "tracks_enabled": false,
93
+ "default_track": "canon"
69
94
  }
70
95
  }
71
96
  ```
72
97
 
73
98
  That `scriveno_version` value should track the current package release and the live `/scr:new-work` contract, not an older milestone snapshot.
74
99
 
75
- Every project gets those core keys. Additional blocks are added only when the work type requires them.
100
+ Every project gets those core keys and shared blocks (`autopilot`, `voice`, `draft`, `export`, `translation`, `collaboration`). The `voice.drift_threshold` default of 0.3 is the voice-drift gate: drift is `(100 - score) / 100`, so 0.3 offers a re-draft when the voice score falls below 70 (see [Drafter Quality](drafter-quality.md) and `agents/voice-checker.md`). Additional blocks are added only when the work type requires them: a `technical` block for technical writing, top-level sacred profile keys for sacred work types, and `platform` for work types with an inferred publishing target.
76
101
 
77
102
  ### Technical writing projects
78
103
 
@@ -6,6 +6,7 @@ It is part of the trust layer:
6
6
  - `STATE.md` -- structured snapshot (data)
7
7
  - `RECORD.md` -- compact established-content store
8
8
  - `.manuscript/CONTEXT.md` -- one-page narrative bootstrap (synthesis)
9
+ - `.manuscript/PROGRESS.md` -- per-unit progress ledger (derived; see `docs/progress-protocol.md`)
9
10
  - `.manuscript/HISTORY.log` -- append-only audit trail
10
11
 
11
12
  ## The rule
@@ -71,7 +72,7 @@ Filesystem mtime is a cheap, durable signal that does not require parsing the fi
71
72
  - **Drafter agents** (drafter.md, voice-checker.md, etc.) -- they need the full source files for fidelity.
72
73
  - **Read-only data display commands** (`/scr:progress`, `/scr:session-report`) -- already cheap; no orientation files to skip.
73
74
  - **First-write commands** (`/scr:new-work`, `/scr:import`) -- no CONTEXT.md exists yet.
74
- - **The CONTEXT.md regenerators themselves** (`/scr:save`, `/scr:pause-work`, `/scr:resume-work`) -- they MUST load the raw files to rebuild CONTEXT.md correctly. They are the *writers* of CONTEXT.md, not consumers.
75
+ - **The CONTEXT.md and PROGRESS.md regenerators themselves** (`/scr:save`, `/scr:pause-work`, `/scr:resume-work`) -- they MUST load the raw files to rebuild CONTEXT.md and the per-unit PROGRESS.md ledger correctly. They are the *writers* of those derived files, not consumers.
75
76
  - **`/scr:scan`** -- its job is to detect drift, so it must read the raw files to compare against CONTEXT.md.
76
77
 
77
78
  ## Expected savings
@@ -19,7 +19,7 @@ templates/ Base project templates + technical/ and sacred/ variants
19
19
  templates/technical/ 6 technical-writing context variants
20
20
  templates/sacred/ Sacred-specific context templates and tradition manifests
21
21
  bin/install.js Multi-platform installer (Node.js)
22
- docs/ Documentation suite (16 guides)
22
+ docs/ Documentation suite (25 guides)
23
23
  ```
24
24
 
25
25
  Key principle: the AI agent reads these files at runtime. There is no compilation, no bundling, no transpilation. If you can write markdown, you can contribute.
@@ -343,7 +343,7 @@ The export command (`commands/scr/export.md`) needs to know about your format. A
343
343
 
344
344
  ### Step 3: Add CONSTRAINTS.json entry (if restricted)
345
345
 
346
- If your export format is only available for certain work types, add an entry to the `"export_formats"` section of CONSTRAINTS.json with an `available_for` array specifying which work type groups can use it.
346
+ If your export format is only available for certain work types, add an entry to the `"exports"` section of CONSTRAINTS.json with an `available` array specifying which work type groups can use it (or `["all"]` for universal formats).
347
347
 
348
348
  ## Testing Your Changes
349
349
 
@@ -56,7 +56,7 @@ Do not turn `.manuscript/CONTEXT.md` into a glossary. It is an auto-regenerated
56
56
  | `cast` | `CHARACTERS.md`, `FIGURES.md` | Character state, voice anchors, relationships, figure continuity |
57
57
  | `world` | `WORLD.md`, `COSMOLOGY.md`, `SYSTEM.md` | Setting, constraints, environment, cosmology, operating rules |
58
58
  | `themes` | `THEMES.md`, `DOCTRINES.md`, `QUESTIONS.md` | Motifs, doctrine, argument, inquiry, recurring meaning |
59
- | `continuity` | `STATE.md`, `CONTEXT.md`, `HISTORY.log` | Current position, recent activity, open items, disk truth |
59
+ | `continuity` | `STATE.md`, `CONTEXT.md`, `PROGRESS.md`, `HISTORY.log` | Current position, recent activity, per-unit progress ledger, open items, disk truth |
60
60
  | `publication` | front matter, back matter, build files | Export and publishing intent |
61
61
  | `translation` | glossary, translation memory, language config | Term consistency and cultural adaptation |
62
62
  | `art` | cover, illustration, storyboard assets | Visual continuity and image direction |