scriveno 2.5.0 → 2.6.0

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 (48) hide show
  1. package/README.md +5 -3
  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 +3 -3
  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 +2 -2
  14. package/commands/scr/export.md +1 -1
  15. package/commands/scr/help.md +1 -1
  16. package/commands/scr/line-edit.md +1 -0
  17. package/commands/scr/map-manuscript.md +1 -0
  18. package/commands/scr/multi-publish.md +3 -2
  19. package/commands/scr/new-character.md +1 -0
  20. package/commands/scr/new-work.md +1 -1
  21. package/commands/scr/originality-check.md +1 -0
  22. package/commands/scr/pacing-analysis.md +1 -0
  23. package/commands/scr/polish.md +1 -0
  24. package/commands/scr/quick-write.md +4 -1
  25. package/commands/scr/sensitivity-review.md +1 -0
  26. package/commands/scr/synopsis.md +1 -0
  27. package/commands/scr/theme-tracker.md +1 -0
  28. package/commands/scr/timeline.md +1 -0
  29. package/commands/scr/track.md +2 -0
  30. package/commands/scr/translate.md +1 -1
  31. package/commands/scr/voice-check.md +1 -0
  32. package/data/CONSTRAINTS.json +2 -1
  33. package/data/export-templates/scriveno-book.typst +2 -2
  34. package/data/export-templates/scriveno-chapbook.typst +1 -1
  35. package/data/export-templates/scriveno-picturebook.typst +9 -0
  36. package/data/export-templates/scriveno-stageplay.typst +14 -4
  37. package/docs/architecture.md +3 -2
  38. package/docs/command-reference.md +22 -22
  39. package/docs/configuration.md +28 -3
  40. package/docs/contributing.md +2 -2
  41. package/docs/drafter-quality.md +1 -1
  42. package/docs/release-notes.md +25 -0
  43. package/docs/route-graph.md +1 -1
  44. package/docs/translation.md +7 -11
  45. package/docs/voice-dna.md +3 -3
  46. package/lib/track-safety.js +72 -0
  47. package/package.json +1 -1
  48. package/templates/config.json +1 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/aihxp/scriveno/actions/workflows/ci.yml/badge.svg)](https://github.com/aihxp/scriveno/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
- [![Version](https://img.shields.io/badge/version-2.5.0-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-2.6.0-blue)](CHANGELOG.md)
6
6
  [![npm](https://img.shields.io/npm/v/scriveno.svg)](https://www.npmjs.com/package/scriveno)
7
7
  [![Downloads](https://img.shields.io/npm/dm/scriveno.svg)](https://www.npmjs.com/package/scriveno)
8
8
  [![Status CLI](https://img.shields.io/badge/status%20CLI-scriveno%20status-blue)](docs/runtime-support.md#shared-auto-invoke-engine)
@@ -141,6 +141,8 @@ For sacred and historical texts, Voice DNA is supplemented by 10 sacred voice re
141
141
 
142
142
  **Interactive:** interactive fiction, game narrative
143
143
 
144
+ **Speech:** speech
145
+
144
146
  **Sacred & historical:** scripture (Biblical, Quranic, Torah, Vedic, Buddhist, generic), commentary/exegesis, devotional, liturgical text, historical chronicle, historical account, mythological collection, religious epic, sermon, homiletic collection
145
147
 
146
148
  Each work type has its own structural hierarchy and **industry-standard word count and page range guidance** -- a novel targets 70,000-100,000 words across 20-35 chapters, a screenplay targets 90-120 pages across 3-5 acts. These ranges guide outlining, progress tracking, and drafter pacing. The runnable command ids stay stable, while Scriveno adapts the wording around them -- a Torah commentary still runs `/scr:plan 3`, but frames that work as planning Parashah 3.
@@ -244,11 +246,11 @@ Scriveno currently ships installer targets for these AI tooling environments:
244
246
 
245
247
  ## Status
246
248
 
247
- **Version:** 2.5.0
249
+ **Version:** 2.6.0
248
250
 
249
251
  Scriveno's core command surface is stable across 113 commands, 50 work types, and 11 installer targets. The current repo baseline includes shipped planning milestones through `v2.0 Publishing Cover Packaging`, plus the creative-context, record-store, branching-next, runtime-sync, adaptive concierge, human-first writing-safeguard, authenticity-diagnostic, domain-grilling, installer-marker cleanup, cross-runtime agent metadata, visible automation status, the shared `scriveno status --project .` auto-invoke engine, route-intelligence lanes, safe apply reporting, runtime smoke checks, agent availability checks, route graph audits, the full audit repair pass through `2.0.11`, the first-run proof surface in `2.5.0`, and the executable `/scr:first-run` path. See [Quick Proof](docs/quick-proof.md) for the fastest proof path, [Shipped Assets](docs/shipped-assets.md) for the canonical asset inventory, and [Runtime Support](docs/runtime-support.md) for the runtime compatibility matrix.
250
252
 
251
- Version `2.5.0` publishes Scriveno under the package name `scriveno`, so the current install command is `npx scriveno@latest`. The older `scriveno-cli` package name is historical and was unpublished during the rename, so npm cannot attach a deprecation notice to it while it has no active registry record. The older `scriven-cli` package remains on npm only as a deprecated legacy name that points users to `scriveno`. Do not treat either legacy package name as active unless a deliberate compatibility shim is republished. See [CHANGELOG](CHANGELOG.md) for the full list and [docs/release-notes.md](docs/release-notes.md) for the public-facing summary.
253
+ Version `2.6.0` publishes Scriveno under the package name `scriveno`, so the current install command is `npx scriveno@latest`. The older `scriveno-cli` package name is historical and was unpublished during the rename, so npm cannot attach a deprecation notice to it while it has no active registry record. The older `scriven-cli` package remains on npm only as a deprecated legacy name that points users to `scriveno`. Do not treat either legacy package name as active unless a deliberate compatibility shim is republished. See [CHANGELOG](CHANGELOG.md) for the full list and [docs/release-notes.md](docs/release-notes.md) for the public-facing summary.
252
254
 
253
255
  Package history is tracked in [CHANGELOG.md](CHANGELOG.md), and the public-facing summary for this release is in [docs/release-notes.md](docs/release-notes.md).
254
256
 
@@ -147,6 +147,16 @@ Map the band to the existing tiers:
147
147
  - **60-74, Mixed signals (notable) / leaning AI:** Fail. Noticeable drift. Offer to re-draft problem sections.
148
148
  - **Below 60, Reads AI-generated:** Severe. Clustered dead-giveaways, uniform rhythm, or chat-artifact contamination. Do not proceed. Recommend re-drafting with an updated STYLE-GUIDE.md or running `/scr:voice-test` to recalibrate.
149
149
 
150
+ ### Normalized drift (for callers that need a 0-1 figure)
151
+
152
+ Some callers -- `/scr:draft`, `/scr:autopilot`, and the `voice.drift_threshold` config knob -- need drift on a 0-1 scale rather than this 0-100 score. Convert with:
153
+
154
+ ```
155
+ drift = (100 - score) / 100
156
+ ```
157
+
158
+ So a score of 100 is 0.00 drift, 90 is 0.10, 70 is 0.30, 60 is 0.40. The default `drift_threshold` of 0.3 therefore means "pause or offer a re-draft when the voice score falls below 70" -- the FAIL band and worse. This is the single definition of drift; callers reference it rather than inventing their own scale.
159
+
150
160
  Before finalizing a low score, re-read the strongest human markers you found and ask whether the band is honestly supported. Scoring genuine careful human prose low because it is formal or clean is this check's worst failure.
151
161
 
152
162
  ## Tone
@@ -78,7 +78,7 @@ Continuity check: 1 warning
78
78
  Proceeding with export. Review full reports after completion.
79
79
  ```
80
80
 
81
- **Quality gate policy (D-09):** Always proceed to the export pipeline regardless of quality gate results. The quality gate is advisory -- it gives the writer information, not a veto. Even if voice check scores FAIL (below 60) or continuity check finds major contradictions, log the warnings and continue.
81
+ **Quality gate policy (D-09):** The quality gate is advisory and never blocks. Always proceed to the export pipeline, including when the voice check or continuity check finds problems. autopilot-publish is the unattended path: it does not stop to ask the writer and it does not abort the run. The gate exists to make problems visible, not to veto. One case gets extra visibility: when the voice score is below 60 (the voice-checker's "Reads AI-generated / do not proceed" band), flag it prominently in the quality-gate summary, write the full voice-check report to the output directory, and list it as the top issue in the final completion report with an explicit recommendation to re-draft the flagged units before publishing. Still finish the export so the run stays unattended; the writer decides whether to publish the package or re-draft after reading the report.
82
82
 
83
83
  ---
84
84
 
@@ -56,8 +56,8 @@ RTL_LANGUAGES = ["ar", "he", "ur", "fa", "yi", "ps", "sd"]
56
56
  CJK_LANGUAGES = ["zh", "ja", "ko"]
57
57
  ```
58
58
 
59
- - RTL languages receive `--text-direction rtl` when passed to export commands
60
- - CJK languages receive appropriate font and spacing flags
59
+ - RTL languages: `/scr:multi-publish` derives text direction from the language code, so no extra flag is needed
60
+ - CJK languages: `/scr:multi-publish` applies CJK font and spacing handling from the language code
61
61
  - All other languages default to LTR
62
62
 
63
63
  Log the detection:
@@ -123,9 +123,8 @@ Log drift annotation counts:
123
123
 
124
124
  If `--skip-publish` is NOT set:
125
125
  - Determine text direction for this language (RTL/LTR/CJK from Step 2)
126
- - Run `/scr:multi-publish --language {lang}` for all available export formats
127
- - For RTL languages, pass `--text-direction rtl` to ensure correct PDF and EPUB output
128
- - For CJK languages, pass `--cjk-mode` to enable CJK-specific line breaking and font handling
126
+ - Run `/scr:multi-publish --languages {lang}` for all available export formats
127
+ - RTL and CJK output is handled automatically: `/scr:multi-publish` sets text direction and CJK line breaking from the language code, so no extra flags are required
129
128
 
130
129
  If `--skip-publish` IS set:
131
130
  - Log: `"[fr] Phase 6/6: Multi-publish skipped (--skip-publish)."`
@@ -209,7 +208,7 @@ Next Steps:
209
208
 
210
209
  - **NEVER** skip the glossary phase -- term consistency across the manuscript depends on it
211
210
  - **NEVER** run cultural adaptation before translation is complete for that language
212
- - **NEVER** export RTL languages without setting `--text-direction rtl` -- the PDF and EPUB will be unreadable
211
+ - **ALWAYS** confirm the language code is correct before export; `/scr:multi-publish` uses it to set RTL direction and CJK handling, and a wrong code yields unreadable PDF and EPUB
213
212
  - **NEVER** continue past a blocking error without logging it -- all errors must appear in the completion summary
214
213
  - **NEVER** modify the source manuscript -- translation works on copies in `.manuscript/translation/{lang}/`
215
214
 
@@ -88,7 +88,7 @@ The writer trusts the pipeline. Autopilot runs until the entire manuscript is co
88
88
  **Pause behavior:** Run until ALL units are complete. Pause ONLY on these conditions:
89
89
 
90
90
  1. **Continuity contradiction** the agent cannot resolve (e.g., a character is in two places at once, a previously established fact is contradicted)
91
- 2. **Voice drift** exceeding `config.voice.drift_threshold` (default 0.3). After each unit, compare the drafted prose against STYLE-GUIDE.md. If drift exceeds threshold, pause.
91
+ 2. **Voice drift** exceeding `config.voice.drift_threshold` (default 0.3). After each unit, run the voice-checker agent against STYLE-GUIDE.md to get an Overall score (0-100). Compute normalized drift as `drift = (100 - score) / 100` (see the "Normalized drift" section of `voice-checker.md`) and pause when `drift` exceeds the threshold -- at the default 0.3 that means a voice score below 70, the voice-checker's FAIL band.
92
92
  3. **Plot hole** with no clear resolution path (e.g., a setup with no payoff, a character motivation gap)
93
93
  4. **Missing critical information** that prevents drafting (character motivation gap, setting inconsistency, unresolved plot dependency)
94
94
  5. **Record drift** against `.manuscript/RECORD.md` that the agent cannot resolve safely (e.g., a promised payoff is contradicted, an open thread is closed without being recorded, or a next-unit obligation is skipped)
@@ -108,7 +108,7 @@ The writer trusts the pipeline. Autopilot runs until the entire manuscript is co
108
108
  **On completion:** Show a comprehensive summary:
109
109
  - Total units drafted
110
110
  - Total word count
111
- - Voice consistency score across the manuscript
111
+ - Voice consistency: the voice-checker Overall score (0-100), averaged across the units that were voice-checked during the run
112
112
  - Open record threads, reader promises, and unresolved next-unit obligations from RECORD.md
113
113
  - Any flags or issues encountered during the run
114
114
  - List of any quality gate pauses that occurred and how they were resolved
@@ -223,7 +223,7 @@ If the command stops because a prerequisite is missing, suggest the command that
223
223
 
224
224
  - **NEVER** run without updating STATE.md -- resume depends on accurate state
225
225
  - **NEVER** show raw git output in writer mode (when `developer_mode` is `false`)
226
- - **NEVER** skip the voice comparison after drafting -- even if the voice-check command from Phase 4 is not yet available, use the drafter's built-in self-check (Step 4 in drafter.md)
226
+ - **NEVER** skip the voice comparison after drafting -- run the voice-checker agent against STYLE-GUIDE.md; if the host runtime cannot spawn it, fall back to the drafter's built-in self-check (Step 4 in drafter.md)
227
227
  - **NEVER** re-draft a unit that STATE.md shows as already submitted -- submitted means the writer approved it
228
228
  - **NEVER** skip stages in the chain (discuss-plan-draft-review-submit) unless the writer explicitly says "skip"
229
229
  - **NEVER** continue past a quality gate pause in full-auto without writer input -- the whole point is that these are conditions the pipeline cannot resolve alone
@@ -1,10 +1,13 @@
1
1
  ---
2
- description: Simulate a beta reader's experience of the manuscript with cross-AI peer review.
2
+ description: Simulate a beta reader's experience of the manuscript using a fresh-context reader persona.
3
+ argument-hint: "[N] [--focus <area>]"
3
4
  ---
4
5
 
5
- # /scr:beta-reader -- Cross-AI Peer Review
6
+ # /scr:beta-reader -- Reader-Perspective Review
6
7
 
7
- Simulate a beta reader's experience of the manuscript.
8
+ Simulate a beta reader's experience of the manuscript using a fresh-context reader persona.
9
+
10
+ This command simulates an independent reader in a fresh context using the same model, not a second or external AI. Genuine cross-AI review would require an external CLI call that Scriveno does not currently wire.
8
11
 
9
12
  ## Usage
10
13
  ```
@@ -153,7 +153,7 @@ Apply tradition data to `.manuscript/output/metadata.yaml` (before STEP 3f write
153
153
  - `tibetan` script -> `bo`
154
154
  - `devanagari` script -> `sa` (Sanskrit)
155
155
  - `latin` script -> use the project language from config.json (default `en`)
156
- - Set `font-family:` to the first entry in the manifest's `font_stack`.
156
+ - Set `mainfont:` to the first entry in the manifest's `font_stack`. (For the EPUB itself the non-Latin font is applied through `scriveno-epub.css`; `mainfont` keeps the metadata key aligned with the print build.)
157
157
 
158
158
  If `rtl: true` in the manifest, add `--metadata dir=rtl` to the Pandoc invocation in STEP 4.
159
159
 
@@ -156,7 +156,7 @@ Apply tradition data to `.manuscript/output/metadata.yaml` (before STEP 3f write
156
156
  - `tibetan` script -> `bo`
157
157
  - `devanagari` script -> `sa` (Sanskrit)
158
158
  - `latin` script -> use the project language from config.json (default `en`)
159
- - Set `font-family:` to the first entry in the manifest's `font_stack`.
159
+ - Set `mainfont:` to the first entry in the manifest's `font_stack`. (`mainfont` is the Pandoc variable the Typst book/chapbook templates read for the body font; `font-family` is not.)
160
160
 
161
161
  If `rtl: true` in the manifest, add `--metadata dir=rtl` to the Pandoc invocation in STEP 4.
162
162
 
@@ -415,7 +415,7 @@ estimated_pages = Math.round(word_count / manifest.trim_sizes[trim].wpp)
415
415
 
416
416
  Compare against `manifest.max_pages`:
417
417
  - For paperback: compare against `manifest.max_pages.paperback`
418
- - For hardcover: only KDP hardcover applies -- compare against `manifest.max_pages.hardcover` only if `--hardcover` flag is passed (otherwise use paperback limit)
418
+ - For hardcover: the hardcover page limit applies to KDP only. Compare against `manifest.max_pages.hardcover` only if `--hardcover` was passed AND the platform is `kdp` AND the manifest defines `max_pages.hardcover`. For any other platform (for example `ingram`, which defines only `max_pages.paperback`), ignore `--hardcover` for the page-limit check and use `manifest.max_pages.paperback`.
419
419
 
420
420
  If `estimated_pages` exceeds the limit:
421
421
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Automated continuity verification to scan for narrative contradictions across the manuscript.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:continuity-check -- Scan for Narrative Contradictions
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Perform a correctness pass for grammar, spelling, punctuation, and consistency.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:copy-edit -- Grammar and Correctness Pass
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Audit dialogue for character voice differentiation, attribution clarity, and talking-head detection.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:dialogue-audit -- Character Dialogue Quality Audit
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Generate reading group discussion questions exploring themes, characters, and craft.
3
+ argument-hint: "[--count <N>]"
3
4
  ---
4
5
 
5
6
  # /scr:discussion-questions -- Reading Group Discussion Questions
@@ -35,7 +35,7 @@ Require `.manuscript/plans/{N}-*-PLAN.md` files to exist. If none exist, also ch
35
35
 
36
36
  3. **Save drafted output** to `.manuscript/drafts/body/{N}-{A}-DRAFT.md`.
37
37
 
38
- 4. **After all atomic units in the unit are drafted, do a voice-check pass.** Load the full drafted unit, compare against STYLE-GUIDE.md, flag any scenes that drift from the voice profile by more than the configured threshold. If drift is detected, offer to re-draft the problem scenes.
38
+ 4. **After all atomic units in the unit are drafted, run a voice-check pass.** Invoke the installed `voice-checker.md` agent in a fresh context on the drafted unit -- the same agent `/scr:voice-check` uses. It loads the unit and STYLE-GUIDE.md and returns an Overall score (0-100). Convert to normalized drift (`drift = (100 - score) / 100`; see the "Normalized drift" section of `voice-checker.md`) and, if drift exceeds `config.voice.drift_threshold` (default 0.3, i.e. a voice score below 70), flag the scenes that drove the score down and offer to re-draft them. If the host runtime cannot spawn the voice-checker, fall back to the drafter's built-in self-check (Step 4 in `drafter.md`) and say so in the status block.
39
39
 
40
40
  5. **Update RECORD.md.** After drafting, extract what the new draft establishes on page. Update `.manuscript/RECORD.md` with only durable, reader-visible changes:
41
41
  - established facts, claims, events, definitions, procedures, objects, relationships, or constraints
@@ -51,7 +51,7 @@ Require `.manuscript/plans/{N}-*-PLAN.md` files to exist. If none exist, also ch
51
51
 
52
52
  7. **Update STATE.md:** mark unit as drafted, note word count, flag any voice-check issues.
53
53
 
54
- 8. **Tell the writer:** "Drafted {unit} {N}: X words across Y {atomic_units}. Voice consistency: Z%. Updated RECORD.md with what the draft established. Ready for editor review? Run `/scr:editor-review N` or `/scr:next`."
54
+ 8. **Tell the writer:** "Drafted {unit} {N}: X words across Y {atomic_units}. Voice consistency: Z% (the voice-checker Overall score for this unit; omit this figure if the voice-check could not run). Updated RECORD.md with what the draft established. Ready for editor review? Run `/scr:editor-review N` or `/scr:next`."
55
55
 
56
56
  ## Agent and Automation Status
57
57
 
@@ -341,7 +341,7 @@ title: "[title from config.json]"
341
341
  subtitle: "[subtitle if available]"
342
342
  author:
343
343
  - name: "[author from config.json]"
344
- language: "[language from config.json, default en-US]"
344
+ lang: "[language from config.json, default en-US]"
345
345
  rights: "Copyright [year] [author]. All rights reserved."
346
346
  date: "[current year]"
347
347
  description: "[description if available]"
@@ -34,7 +34,7 @@ You are helping the user navigate Scriveno commands. Load Scriveno's installed/s
34
34
 
35
35
  ## The "getting started" view (no project yet)
36
36
 
37
- Ask the user what they want to do. Don't list 170 commands -- show them this:
37
+ Ask the user what they want to do. Don't list all 113 commands -- show them this:
38
38
 
39
39
  ```
40
40
  Scriveno -- ready to start.
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Perform a line-level prose quality pass with inline annotations.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:line-edit -- Line-Level Prose Quality Pass
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Spawn parallel analysis agents to understand an existing manuscript's voice, structure, characters, and themes.
3
+ argument-hint: "[area]"
3
4
  ---
4
5
 
5
6
  # /scr:map-manuscript -- Analyze Existing Manuscript
@@ -199,7 +199,7 @@ Determine text direction from language code:
199
199
 
200
200
  Set the appropriate direction for Pandoc and Typst output:
201
201
  - Pandoc: `--variable dir=rtl` or `--variable dir=ltr`
202
- - Typst: Uses `text-dir` parameter (already prepared in Phase 5 template)
202
+ - Typst: the book interior template reads the Pandoc `dir` variable set above to orient text
203
203
 
204
204
  #### 5d. Number Formatting
205
205
 
@@ -238,7 +238,7 @@ title: "[translated title]"
238
238
  subtitle: "[translated subtitle]"
239
239
  author:
240
240
  - name: "[author name]"
241
- language: "[lang code]"
241
+ lang: "[lang code]"
242
242
  dir: "[ltr or rtl]"
243
243
  rights: "Copyright [year] [author]. [Translated rights statement]."
244
244
  date: "[current year]"
@@ -274,6 +274,7 @@ pandoc .manuscript/translation/{lang}/assembled-manuscript.md \
274
274
  pandoc .manuscript/translation/{lang}/assembled-manuscript.md \
275
275
  -o .manuscript/output/translations/{lang}/manuscript-{lang}.pdf \
276
276
  --pdf-engine=typst \
277
+ --template=data/export-templates/scriveno-book.typst \
277
278
  --metadata-file=.manuscript/translation/{lang}/metadata.yaml \
278
279
  --toc --toc-depth=1 \
279
280
  -V dir={ltr|rtl}
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Build a complete character profile through guided interactive interview.
3
+ argument-hint: "<name>"
3
4
  ---
4
5
 
5
6
  # /scr:new-character -- Interactive Character Creation
@@ -69,7 +69,7 @@ Always create `RECORD.md` from `templates/RECORD.md` without renaming it. It is
69
69
  Write `.manuscript/config.json` by starting from `templates/config.json` and filling the project-specific values. The generated config must include the shared settings blocks that later commands read:
70
70
  ```json
71
71
  {
72
- "scriveno_version": "2.5.0",
72
+ "scriveno_version": "2.6.0",
73
73
  "work_type": "<chosen>",
74
74
  "group": "<group>",
75
75
  "command_unit": "<unit>",
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Scan drafted prose for AI-generated patterns and unintentional similarity to published works.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:originality-check -- AI Pattern & Similarity Scan
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Generate a structure-aware pacing report analyzing scene tempo and narrative flow.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:pacing-analysis -- Structure-Aware Pacing Report
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Chain line-edit, copy-edit, and voice-check for comprehensive prose polish.
3
+ argument-hint: "[N]"
3
4
  ---
4
5
 
5
6
  # /scr:polish -- Comprehensive Prose Polish
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Write a scene, passage, or chapter outside the full planning workflow.
3
+ argument-hint: "[--discuss] [--research] [--full]"
3
4
  ---
4
5
 
5
6
  # /scr:quick-write -- Ad-Hoc Writing Without Full Planning
@@ -18,7 +19,7 @@ Write a scene, passage, or chapter outside the full planning workflow.
18
19
 
19
20
  ## Instruction
20
21
 
21
- Quick write gives you Scriveno guarantees (continuity tracking, voice consistency, atomic commits) with a faster path.
22
+ Quick write is the fast path. It loads STYLE-GUIDE.md, drafts in the current conversation context (not a fresh per-unit context), and commits atomically. It runs continuity and voice checks only when you pass `--full`. For voice-critical work, prefer `/scr:draft`, which drafts each unit in a fresh context and always runs a voice-check.
22
23
 
23
24
  ### STEP 1: GATHER INTENT
24
25
 
@@ -49,6 +50,8 @@ If the host runtime cannot spawn a focused researcher, run the research pass in
49
50
 
50
51
  Write the passage following all established style guide constraints. Target whatever length feels natural unless the writer specified a target.
51
52
 
53
+ Quick-write drafts in the current conversation context rather than spawning the drafter in a fresh per-unit context; this trades some voice isolation for speed. When fresh-context voice fidelity matters, use `/scr:draft` instead.
54
+
52
55
  ### STEP 4: VERIFY (if --full)
53
56
 
54
57
  Run continuity and voice checks against existing manuscript.
@@ -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
@@ -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.6.0",
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
  ],
@@ -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
@@ -422,7 +423,7 @@ The voice-checker agent (`agents/voice-checker.md`) compares drafted prose again
422
423
  - Specific issues organized by category (structural voice, lexical voice, character voice, AI-slop indicators)
423
424
  - Severity ratings (drift vs critical violation)
424
425
 
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.
426
+ 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
427
 
427
428
  ### Calibration
428
429
 
@@ -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
 
@@ -350,7 +350,7 @@ Import an existing Word document and split it into chapters, scenes, and context
350
350
 
351
351
  **Description:** Spawn parallel analysis agents to understand an existing manuscript's voice, structure, characters, and themes.
352
352
 
353
- **Usage:** `/scr:map-manuscript`
353
+ **Usage:** `/scr:map-manuscript [area]`
354
354
 
355
355
  **Prerequisites:** None
356
356
 
@@ -564,7 +564,7 @@ Visualize your novel's structure mapped to the hero's journey.
564
564
 
565
565
  **Description:** Generate a chronological event timeline from the outline.
566
566
 
567
- **Usage:** `/scr:timeline`
567
+ **Usage:** `/scr:timeline [--story-order] [--chronological]`
568
568
 
569
569
  **Prerequisites:** OUTLINE.md must exist
570
570
 
@@ -584,7 +584,7 @@ See events in chronological order, even if your narrative is non-linear.
584
584
 
585
585
  **Description:** Track thematic threads across the work with auto-detection suggestions.
586
586
 
587
- **Usage:** `/scr:theme-tracker`
587
+ **Usage:** `/scr:theme-tracker [--detect]`
588
588
 
589
589
  **Prerequisites:** THEMES.md must exist
590
590
 
@@ -780,7 +780,7 @@ Commands for creating and managing characters, relationships, and world-building
780
780
 
781
781
  **Description:** Build a complete character profile through guided interactive interview.
782
782
 
783
- **Usage:** `/scr:new-character`
783
+ **Usage:** `/scr:new-character <name>`
784
784
 
785
785
  **Prerequisites:** WORK.md must exist
786
786
 
@@ -962,7 +962,7 @@ Scriveno drafts a sample passage using your voice profile. If it doesn't sound r
962
962
 
963
963
  **Description:** Perform a line-level prose quality pass with inline annotations.
964
964
 
965
- **Usage:** `/scr:line-edit`
965
+ **Usage:** `/scr:line-edit [N]`
966
966
 
967
967
  **Prerequisites:** Draft must exist
968
968
 
@@ -980,7 +980,7 @@ Scriveno reads your prose line by line, flagging weak verbs, passive voice, redu
980
980
 
981
981
  **Description:** Perform a correctness pass for grammar, spelling, punctuation, and consistency.
982
982
 
983
- **Usage:** `/scr:copy-edit`
983
+ **Usage:** `/scr:copy-edit [N]`
984
984
 
985
985
  **Prerequisites:** Draft must exist
986
986
 
@@ -998,7 +998,7 @@ Catch typos, grammar issues, and consistency problems (character name spellings,
998
998
 
999
999
  **Description:** Chain line-edit, copy-edit, and voice-check for comprehensive prose polish.
1000
1000
 
1001
- **Usage:** `/scr:polish`
1001
+ **Usage:** `/scr:polish [N]`
1002
1002
 
1003
1003
  **Prerequisites:** Draft and STYLE-GUIDE.md must exist
1004
1004
 
@@ -1016,7 +1016,7 @@ Run all three quality passes in sequence. The comprehensive final polish before
1016
1016
 
1017
1017
  **Description:** Write a scene, passage, or chapter outside the full planning workflow.
1018
1018
 
1019
- **Usage:** `/scr:quick-write`
1019
+ **Usage:** `/scr:quick-write [--discuss] [--research] [--full]`
1020
1020
 
1021
1021
  **Prerequisites:** None
1022
1022
 
@@ -1038,7 +1038,7 @@ Commands for reviewing your manuscript from different angles -- continuity, voic
1038
1038
 
1039
1039
  **Description:** Automated continuity verification to scan for narrative contradictions across the manuscript.
1040
1040
 
1041
- **Usage:** `/scr:continuity-check`
1041
+ **Usage:** `/scr:continuity-check [N]`
1042
1042
 
1043
1043
  **Prerequisites:** Draft must exist
1044
1044
 
@@ -1059,7 +1059,7 @@ Find contradictions: "In Chapter 3 Maria has brown eyes, but in Chapter 7 they'r
1059
1059
 
1060
1060
  **Description:** Compare drafted prose against STYLE-GUIDE.md to detect voice drift.
1061
1061
 
1062
- **Usage:** `/scr:voice-check`
1062
+ **Usage:** `/scr:voice-check [N]`
1063
1063
 
1064
1064
  **Prerequisites:** Draft and STYLE-GUIDE.md must exist
1065
1065
 
@@ -1080,7 +1080,7 @@ Detect where your drafted prose drifts from your established voice profile.
1080
1080
 
1081
1081
  **Description:** Flag potential sensitivity issues with context, suggest alternatives, and note intentional craft.
1082
1082
 
1083
- **Usage:** `/scr:sensitivity-review`
1083
+ **Usage:** `/scr:sensitivity-review [N]`
1084
1084
 
1085
1085
  **Prerequisites:** Draft must exist
1086
1086
 
@@ -1102,7 +1102,7 @@ Flag content that could be unintentionally harmful, with context-aware suggestio
1102
1102
 
1103
1103
  **Description:** Generate a structure-aware pacing report analyzing scene tempo and narrative flow.
1104
1104
 
1105
- **Usage:** `/scr:pacing-analysis`
1105
+ **Usage:** `/scr:pacing-analysis [N]`
1106
1106
 
1107
1107
  **Prerequisites:** Draft must exist
1108
1108
 
@@ -1120,7 +1120,7 @@ See where your story drags or rushes. Scriveno maps scene length, tension, and t
1120
1120
 
1121
1121
  **Description:** Audit dialogue for character voice differentiation, attribution clarity, and talking-head detection.
1122
1122
 
1123
- **Usage:** `/scr:dialogue-audit`
1123
+ **Usage:** `/scr:dialogue-audit [N]`
1124
1124
 
1125
1125
  **Prerequisites:** Draft must exist with dialogue
1126
1126
 
@@ -1139,9 +1139,9 @@ Check that each character sounds distinct, dialogue tags are clear, and scenes a
1139
1139
 
1140
1140
  ### `/scr:beta-reader`
1141
1141
 
1142
- **Description:** Simulate a beta reader's experience of the manuscript with cross-AI peer review.
1142
+ **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
1143
 
1144
- **Usage:** `/scr:beta-reader`
1144
+ **Usage:** `/scr:beta-reader [N] [--focus <area>]`
1145
1145
 
1146
1146
  **Prerequisites:** Draft must exist
1147
1147
 
@@ -1163,7 +1163,7 @@ Get a simulated reader's reaction: what hooked them, where they got confused, wh
1163
1163
 
1164
1164
  **Description:** Scan drafted prose for AI-generated patterns and unintentional similarity to published works.
1165
1165
 
1166
- **Usage:** `/scr:originality-check`
1166
+ **Usage:** `/scr:originality-check [N]`
1167
1167
 
1168
1168
  **Prerequisites:** Draft must exist
1169
1169
 
@@ -1259,7 +1259,7 @@ Get three blurb variations: punchy (Amazon listing), standard (back cover), exte
1259
1259
 
1260
1260
  **Description:** Generate plot synopsis at specified length for query and submission packages.
1261
1261
 
1262
- **Usage:** `/scr:synopsis`
1262
+ **Usage:** `/scr:synopsis [--length <1p|2p|5p>]`
1263
1263
 
1264
1264
  **Prerequisites:** Complete draft must exist
1265
1265
 
@@ -1313,7 +1313,7 @@ Generate a full book proposal: overview, market analysis, chapter summaries, aut
1313
1313
 
1314
1314
  **Description:** Generate reading group discussion questions exploring themes, characters, and craft.
1315
1315
 
1316
- **Usage:** `/scr:discussion-questions`
1316
+ **Usage:** `/scr:discussion-questions [--count <N>]`
1317
1317
 
1318
1318
  **Prerequisites:** Complete draft must exist
1319
1319
 
@@ -1478,7 +1478,7 @@ Build a poetry-submission DOCX for journal or contest submission using the poetr
1478
1478
 
1479
1479
  **Description:** Run full publishing pipeline unattended with quality gate (voice-check + continuity-check).
1480
1480
 
1481
- **Usage:** `/scr:autopilot-publish --preset <preset>`
1481
+ **Usage:** `/scr:autopilot-publish --preset <preset> [--front-level <minimum|balanced|maximum|skip>] [--back-level <minimum|balanced|maximum|skip>]`
1482
1482
 
1483
1483
  **Prerequisites:** Complete draft must exist
1484
1484
 
@@ -1513,7 +1513,7 @@ Commands for generating cover art, scene illustrations, character references, ma
1513
1513
  - `--trim <size>` -- Preferred trim shorthand for prompt framing
1514
1514
  - `--kdp <trim_size>` -- Legacy alias for `--trim`
1515
1515
  - `--series` -- Generate series-consistent cover
1516
- - `--prompt-only` -- Generate prompts without calling image API
1516
+ - `--prompt-only` -- Generate prompts without packaging reminders
1517
1517
  - `--element` -- Generate specific cover element
1518
1518
 
1519
1519
  **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.6.0",
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
 
@@ -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
 
@@ -104,7 +104,7 @@ Rough guidance for matching settings to model class. The writer's experience wit
104
104
  | Mid-tier (Sonnet 4.x, GPT-4 mini, Haiku 4.x) | Day-to-day drafting, most novels and screenplays | `standard` | `standard` |
105
105
  | Budget (Haiku, GPT-3.5, local 7-13B) | Bulk drafting of short scenes, repetitive structural work | `strict` | `minimal` |
106
106
 
107
- If voice fidelity drops below the writer's `voice.drift_threshold`, the first lever is `rigor: strict`. The second is to step up a model tier. The third is to recalibrate STYLE-GUIDE.md via `/scr:voice-test`.
107
+ If voice fidelity drops below the writer's `voice.drift_threshold` (a voice-checker score below 70 at the default 0.3, where drift is `(100 - score) / 100`), the first lever is `rigor: strict`. The second is to step up a model tier. The third is to recalibrate STYLE-GUIDE.md via `/scr:voice-test`.
108
108
 
109
109
  ## Token economy
110
110
 
@@ -2,6 +2,31 @@
2
2
 
3
3
  This document is the public-facing summary of what changed between package releases. For package history, see the root [CHANGELOG](../CHANGELOG.md).
4
4
 
5
+ ## 2.6.0 - 2026-05-29
6
+
7
+ ### What changed
8
+
9
+ - Fixed a Pandoc-variable mismatch so RTL, CJK, and non-Latin fonts now reach the print and PDF path; added RTL support to the picturebook and stageplay templates (all four interior templates verified with `dir=rtl`).
10
+ - Made the voice-drift gate functional: `agents/voice-checker.md` now defines `drift = (100 - score) / 100`, so the default `voice.drift_threshold` of 0.3 means a re-draft is offered below a voice score of 70.
11
+ - Kept `/scr:autopilot-publish` fully unattended and advisory; a severe voice failure is surfaced loudly rather than halting the run.
12
+ - Corrected `/scr:quick-write` and `/scr:beta-reader` framing to match what they actually do.
13
+ - Marked the translation and illustration API tables as future targets, not shipped behavior.
14
+ - Audited and fixed documentation drift across the suite: command reference usage lines, the configuration baseline, the architecture file tree, voice-dna part numbering, the missing speech work type, and stale counts.
15
+ - Added `lib/track-safety.js` with adversarial tests, and `argument-hint` to 17 commands.
16
+
17
+ ### Why it matters
18
+
19
+ This release closes the gap between what Scriveno documented and what it shipped. The export fix makes RTL and non-Latin print output actually work, the voice gate is now a real computed check instead of a phantom threshold, and the documentation no longer claims integrations or behavior that the prompt system does not provide.
20
+
21
+ ### Affected areas
22
+
23
+ - export and print templates (RTL, CJK, fonts)
24
+ - voice-checker drift mapping and autopilot gates
25
+ - translation and illustration honesty
26
+ - documentation suite (command reference, configuration, architecture, voice-dna, README)
27
+ - track-safety helper and command argument hints
28
+ - package metadata and release-alignment tests
29
+
5
30
  ## 2.5.0 - 2026-05-16
6
31
 
7
32
  ### What changed
@@ -13,7 +13,7 @@ The text report summarizes command count, graph edges, agent-capable routes, loc
13
13
 
14
14
  ## Current Shape
15
15
 
16
- As of `2.5.0`, the route graph contains:
16
+ As of `2.6.0`, the route graph contains:
17
17
 
18
18
  - 113 commands
19
19
  - intent-order edges from `command_intents`
@@ -2,17 +2,13 @@
2
2
 
3
3
  Scriveno translates your manuscript into any language while preserving your voice. The translation pipeline handles glossary management, translation memory, cultural adaptation, quality verification, and multi-language publishing -- from setup to finished translated editions.
4
4
 
5
- This guide covers the full pipeline: choosing a translation engine, translating your manuscript, managing terminology, verifying quality, and publishing in multiple languages.
5
+ This guide covers the full pipeline: how translation works, translating your manuscript, managing terminology, verifying quality, and publishing in multiple languages.
6
6
 
7
- ## Translation Engines
7
+ ## Translation approach
8
8
 
9
- Scriveno uses three translation approaches, each suited to different languages and content types.
9
+ Scriveno translates through the in-context translator agent (`agents/translator.md`), not an external translation API. The agent itself handles literary nuance, sacred-text registers, and cultural adaptation that machine-translation services miss. It applies your voice profile, maintains glossary compliance, and can do formal or dynamic equivalence translation. Every unit is translated by the translator agent in fresh context with your STYLE-GUIDE.md loaded.
10
10
 
11
- **DeepL** -- Primary engine for European languages. Higher quality than alternatives for English, French, German, Spanish, Italian, Portuguese, Dutch, Polish, Japanese, Chinese, and Korean. GDPR-compliant -- your content is not stored or used for training.
12
-
13
- **Google Cloud Translation** -- Broad language coverage with 130+ languages. Required for Arabic, Hebrew, Hindi, Swahili, and other languages DeepL does not cover. Best choice for RTL scripts and languages with limited DeepL support.
14
-
15
- **AI Agent (Claude/GPT)** -- The AI agent itself handles literary nuance, sacred text translation, and cultural adaptation that machine translation APIs miss. It applies your voice profile, maintains glossary compliance, and can do formal/dynamic equivalence translation. This is Scriveno's default for literary content -- every unit is translated by the translator agent with your STYLE-GUIDE.md loaded.
11
+ DeepL and Google Cloud Translation are documented as possible future integration targets, not current behavior. Scriveno does not call either service today; if an automated machine-translation path is added later, this guide will describe how it plugs in.
16
12
 
17
13
  The translator agent works unit by unit in fresh context (just like the drafter), ensuring consistent quality and glossary compliance across the entire manuscript.
18
14
 
@@ -171,7 +167,7 @@ The TMX export produces industry-standard Translation Memory eXchange format com
171
167
 
172
168
  ## Cultural Adaptation
173
169
 
174
- Machine translation handles words. Cultural adaptation handles meaning. Scriveno flags culturally sensitive content that needs human attention beyond what translation APIs catch.
170
+ Translation handles words. Cultural adaptation handles meaning. Scriveno flags culturally sensitive content that needs deliberate attention beyond a faithful unit-by-unit rendering.
175
171
 
176
172
  ```
177
173
  /scr:cultural-adaptation fr
@@ -247,8 +243,8 @@ Scriveno handles right-to-left and CJK (Chinese, Japanese, Korean) scripts throu
247
243
 
248
244
  RTL languages (Arabic, Hebrew, Persian, Urdu) receive special handling:
249
245
 
250
- - **Text direction** -- Export commands automatically set `--variable dir=rtl` for Pandoc and `text-dir` for Typst
251
- - **Template adjustments** -- The Typst book template reverses inside/outside margins for RTL binding
246
+ - **Text direction** -- Export commands pass the Pandoc `dir` variable (`dir=rtl`); the Typst interior templates read that `dir` variable to orient text
247
+ - **Template adjustments** -- The Typst interior templates honor RTL: the book template reverses inside/outside margins for RTL binding, and the stageplay template flips its binding margin and page-number alignment. The chapbook and picturebook templates set text direction from the `dir` variable.
252
248
  - **Font requirements** -- RTL exports need fonts with Arabic/Hebrew glyph support. Scriveno uses system-available fonts by default; specify custom fonts in `.manuscript/config.json`
253
249
  - **Punctuation** -- Quotation marks use the appropriate convention (e.g., French-style guillemets for Arabic)
254
250
 
package/docs/voice-dna.md CHANGED
@@ -138,7 +138,7 @@ This section governs the speed and flow of narrative.
138
138
  - **Between chapters** -- Cliffhangers, echoes, or clean breaks
139
139
  - **Time jumps** -- How they're signaled, how frequent, how handled
140
140
 
141
- ### Part 7: Reference Influences
141
+ ### Part 8: Reference Influences
142
142
 
143
143
  This section captures the authors, works, and passages that anchor your voice.
144
144
 
@@ -210,7 +210,7 @@ The 10 registers are:
210
210
  | **Parabolic** | Allegorical, story-within-story | "The kingdom of heaven is like..." concrete daily-life imagery |
211
211
  | **Didactic** | Instructional, systematic, expository | Topic-by-topic structure, teacher-student dynamic, Q&A format |
212
212
 
213
- Each unit's plan file specifies which register to use. Your STYLE-GUIDE.md Part 8 (Sacred Voice Registers) describes how YOU handle each register -- the drafter always defers to your personalized register style over the generic descriptions.
213
+ Each unit's plan file specifies which register to use. Your STYLE-GUIDE.md "Sacred voice registers" part (Part 8 in the shipped template) describes how YOU handle each register -- the drafter always defers to your personalized register style over the generic descriptions.
214
214
 
215
215
  If no register is specified in a plan file, the drafter defaults to narrative-historical.
216
216
 
@@ -276,7 +276,7 @@ See [docs/drafter-quality.md](drafter-quality.md) for the full system, including
276
276
  ### Too many metaphors / not enough metaphors
277
277
 
278
278
  **Symptom:** Prose is either overwritten or too bare.
279
- **Fix:** Adjust metaphor density in STYLE-GUIDE.md Part 4 (Figurative Language). "Sparse" means one metaphor per page at most. "Dense" means multiple per paragraph. Find your natural density by looking at your existing writing.
279
+ **Fix:** Adjust metaphor density in STYLE-GUIDE.md Part 3 (vocabulary and figurative language). "Sparse" means one metaphor per page at most. "Dense" means multiple per paragraph. Find your natural density by looking at your existing writing.
280
280
 
281
281
  ### AI-sounding hedging
282
282
 
@@ -0,0 +1,72 @@
1
+ // lib/track-safety.js
2
+ // Canonical, dependency-free slug + branch derivation for /scr:track (D-01).
3
+ //
4
+ // The track.md prompt instructs the agent to slugify a writer-provided track
5
+ // label before it ever touches a git or shell command. This module is the
6
+ // single source of truth for that algorithm. The installer copies lib/ into the
7
+ // writer's data dir, so it ships as <data-dir>/lib/track-safety.js and a runtime
8
+ // can derive a guaranteed-safe slug deterministically instead of relying on the
9
+ // model to apply the rules by hand:
10
+ //
11
+ // node <data-dir>/lib/track-safety.js "Editor's Suggestions"
12
+ // -> {"slug":"editors-suggestions","branch":"track/editors-suggestions"}
13
+ //
14
+ // Safety property: a sanitized slug contains only [a-z0-9-]. It can never carry
15
+ // a shell metacharacter, quote, whitespace, path separator, or command
16
+ // substitution, so interpolating `track/<slug>` into a git command line is safe.
17
+
18
+ 'use strict';
19
+
20
+ // A slug is shell-safe iff it is a non-empty run of lowercase alphanumerics and
21
+ // hyphens with no leading/trailing hyphen.
22
+ const SLUG_SAFE = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
23
+ const FALLBACK_SLUG = 'untitled';
24
+
25
+ // Apply the D-01 rules: lowercase, whitespace/underscores to hyphen, strip
26
+ // everything that is not [a-z0-9-], collapse hyphen runs, trim edge hyphens.
27
+ // Returns FALLBACK_SLUG when the label has no usable characters (e.g. "***",
28
+ // "日本", "") so the caller never produces an empty branch name.
29
+ function sanitizeTrackSlug(label) {
30
+ const slug = String(label == null ? '' : label)
31
+ .toLowerCase()
32
+ .replace(/[\s_]+/g, '-')
33
+ .replace(/[^a-z0-9-]+/g, '')
34
+ .replace(/-+/g, '-')
35
+ .replace(/^-+|-+$/g, '');
36
+ return slug.length > 0 ? slug : FALLBACK_SLUG;
37
+ }
38
+
39
+ function isShellSafeSlug(slug) {
40
+ return typeof slug === 'string' && SLUG_SAFE.test(slug);
41
+ }
42
+
43
+ // Resolve a collision-free branch name. `existingBranches` is the set of branch
44
+ // names already present in the repo (e.g. parsed from `git branch`). Mirrors
45
+ // track.md create-step 6: append -2, -3, ... to the slug until the branch name
46
+ // is free.
47
+ function resolveTrackBranch(label, existingBranches = []) {
48
+ const taken = new Set(existingBranches);
49
+ const baseSlug = sanitizeTrackSlug(label);
50
+ let slug = baseSlug;
51
+ let n = 2;
52
+ while (taken.has(`track/${slug}`)) {
53
+ slug = `${baseSlug}-${n}`;
54
+ n += 1;
55
+ }
56
+ return { slug, branch: `track/${slug}` };
57
+ }
58
+
59
+ module.exports = {
60
+ sanitizeTrackSlug,
61
+ isShellSafeSlug,
62
+ resolveTrackBranch,
63
+ FALLBACK_SLUG,
64
+ };
65
+
66
+ if (require.main === module) {
67
+ const label = process.argv[2] || '';
68
+ const existing = process.argv[3]
69
+ ? process.argv[3].split(',').map((s) => s.trim()).filter(Boolean)
70
+ : [];
71
+ process.stdout.write(JSON.stringify(resolveTrackBranch(label, existing)) + '\n');
72
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scriveno",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "description": "Spec-driven creative writing, publishing, and translation pipeline for AI coding agents. From blank page to published book.",
5
5
  "bin": {
6
6
  "scriveno": "bin/install.js"
@@ -1,5 +1,5 @@
1
1
  {
2
- "scriveno_version": "2.5.0",
2
+ "scriveno_version": "2.6.0",
3
3
  "work_type": "",
4
4
  "group": "",
5
5
  "command_unit": "",