dsh-novel-write-engine 0.2.2 → 0.2.4

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.
package/lib/index.d.ts CHANGED
@@ -65,9 +65,13 @@ declare const ERROR_CODES: {
65
65
  readonly PROJECT_IDENTITY_MISMATCH: "ENGINE_PROJECT_IDENTITY_MISMATCH";
66
66
  readonly PROJECT_EXISTS: "ENGINE_PROJECT_EXISTS";
67
67
  readonly STAGE_ORDER: "ENGINE_STAGE_ORDER";
68
+ /** The exact same keyed submission already failed in the same context. */
69
+ readonly RETRY_UNCHANGED: "ENGINE_RETRY_UNCHANGED";
68
70
  readonly GATE_BLOCKED: "ENGINE_GATE_BLOCKED";
69
71
  readonly READING_PROOF_INVALID: "ENGINE_READING_PROOF_INVALID";
70
72
  readonly SCORE_MISMATCH: "ENGINE_SCORE_MISMATCH";
73
+ /** A revision tried to rewrite reviewer-owned issue fields. */
74
+ readonly ISSUE_IMMUTABLE: "ENGINE_ISSUE_IMMUTABLE";
71
75
  readonly DELTA_UNVERIFIED: "ENGINE_DELTA_UNVERIFIED";
72
76
  readonly RESOURCE_NEGATIVE_BALANCE: "ENGINE_RESOURCE_NEGATIVE_BALANCE";
73
77
  readonly SCHEMA_TOO_NEW: "ENGINE_SCHEMA_TOO_NEW";
@@ -464,6 +468,8 @@ interface ForeshadowsDocument {
464
468
  resolved_at: number | null;
465
469
  description: string;
466
470
  anchor?: string;
471
+ /** New 0.2.3 writes are distinguishable from pre-0.2.3 rows by this marker. */
472
+ format_version?: 1;
467
473
  advance_log: Array<{
468
474
  chapter: number;
469
475
  note: string;
@@ -786,7 +792,13 @@ interface BookReport {
786
792
  min: number;
787
793
  max: number;
788
794
  last_five: number[];
789
- trend: number;
795
+ /** Null when there are not enough distinct chapter reviews to compare. */
796
+ trend: number | null;
797
+ trend_basis: 'last_five_vs_previous_five' | 'insufficient_samples' | 'insufficient_history';
798
+ /** Number of chapters represented by a final review. */
799
+ samples: number;
800
+ /** Committed review rounds for this report, including history. */
801
+ attempts: number;
790
802
  dimensions: Array<{
791
803
  id: string;
792
804
  average: number;
@@ -1013,6 +1025,8 @@ interface StatusReport {
1013
1025
  chapter: number;
1014
1026
  /** The chapter the pipeline is currently working on. */
1015
1027
  active_chapter: number;
1028
+ /** SHA-256 of the active manuscript, or null when the stage has no draft. */
1029
+ manuscript_hash: string | null;
1016
1030
  stage: Stage;
1017
1031
  rounds: RoundCounters;
1018
1032
  blocking: BlockingItem[];
@@ -1089,6 +1103,10 @@ interface AuditRow {
1089
1103
  /** True when no transaction started: the gate/input refused the call. */
1090
1104
  attempt?: boolean;
1091
1105
  blocking?: BlockingItem[];
1106
+ /** Keyed operation fingerprint; lets an identical failed retry be refused. */
1107
+ retry_key?: string;
1108
+ /** Brief/stage/revision context for `retry_key`. */
1109
+ retry_context?: string;
1092
1110
  }
1093
1111
  /** One diff hunk between two revisions of a chapter. */
1094
1112
  interface DiffReport {
@@ -1278,8 +1296,14 @@ interface OutlineChapterInput {
1278
1296
  interface OutlineInput {
1279
1297
  book?: BookPatch;
1280
1298
  volumes?: VolumeInput[];
1281
- chapters: OutlineChapterInput[];
1299
+ chapters?: OutlineChapterInput[];
1282
1300
  strict?: boolean;
1301
+ /** Explicit deletion list; omitted cards are preserved. */
1302
+ remove?: number[];
1303
+ /** Explicit volume deletion list, keyed by title. */
1304
+ remove_volumes?: string[];
1305
+ /** Preview changes without writing or journaling. */
1306
+ dry_run?: boolean;
1283
1307
  }
1284
1308
  interface WorldbookPatch {
1285
1309
  premise?: string;
@@ -1401,7 +1425,10 @@ interface PanelSnapshot {
1401
1425
  quality?: {
1402
1426
  averageScore: number;
1403
1427
  scores: number[];
1404
- trend: number;
1428
+ trend: number | null;
1429
+ trend_basis?: 'last_five_vs_previous_five' | 'insufficient_samples' | 'insufficient_history';
1430
+ samples?: number;
1431
+ attempts?: number;
1405
1432
  };
1406
1433
  health?: {
1407
1434
  ok: boolean;
@@ -1414,6 +1441,19 @@ interface PanelSnapshot {
1414
1441
  chapter: number;
1415
1442
  status: string;
1416
1443
  }>;
1444
+ /** Unacknowledged machine advisories; never mixed into `blocking`. */
1445
+ advisories?: Array<{
1446
+ code: string;
1447
+ detail: string;
1448
+ hint?: string;
1449
+ }>;
1450
+ /** Number of advisory codes already acknowledged for the current check. */
1451
+ acknowledgedAdvisories?: number;
1452
+ /** Read-only upgrade findings; null when the project needs no explanation. */
1453
+ legacy?: Array<{
1454
+ code: string;
1455
+ detail: string;
1456
+ }>;
1417
1457
  }
1418
1458
  interface PanelBook {
1419
1459
  premise: string;
@@ -1486,7 +1526,10 @@ interface PanelSummaryDto {
1486
1526
  quality?: {
1487
1527
  averageScore: number;
1488
1528
  scores: number[];
1489
- trend: number;
1529
+ trend: number | null;
1530
+ trend_basis?: 'last_five_vs_previous_five' | 'insufficient_samples' | 'insufficient_history';
1531
+ samples?: number;
1532
+ attempts?: number;
1490
1533
  };
1491
1534
  health?: {
1492
1535
  ok: boolean;
@@ -1499,6 +1542,19 @@ interface PanelSummaryDto {
1499
1542
  chapter: number;
1500
1543
  status: string;
1501
1544
  }>;
1545
+ /** Unacknowledged machine advisories; never mixed into `blocking`. */
1546
+ advisories?: Array<{
1547
+ code: string;
1548
+ detail: string;
1549
+ hint?: string;
1550
+ }>;
1551
+ /** Number of advisory codes already acknowledged for the current check. */
1552
+ acknowledgedAdvisories?: number;
1553
+ /** Read-only upgrade findings; null when the project needs no explanation. */
1554
+ legacy?: Array<{
1555
+ code: string;
1556
+ detail: string;
1557
+ }>;
1502
1558
  }
1503
1559
  interface PanelChapterRow {
1504
1560
  num: number;
@@ -1529,7 +1585,9 @@ interface PanelProjectOption {
1529
1585
  title: string;
1530
1586
  active: boolean;
1531
1587
  registered: boolean;
1532
- state: 'ok' | 'damaged' | 'missing' | 'unreadable';
1588
+ state: 'ok' | 'damaged' | 'missing' | 'not-project' | 'unreadable';
1589
+ /** The path now holds a different project identity; writes will fail closed. */
1590
+ identity_changed?: boolean;
1533
1591
  }
1534
1592
  interface PanelSelection {
1535
1593
  root: string | null;
@@ -1538,8 +1596,8 @@ interface PanelSelection {
1538
1596
  interface PanelMissing {
1539
1597
  root: string;
1540
1598
  title: string;
1541
- code: 'ENGINE_PROJECT_MISSING' | 'ENGINE_PROJECT_NOT_FOUND';
1542
- reason: 'missing' | 'not-project' | 'damaged' | 'not_registered' | 'unreadable';
1599
+ code: 'ENGINE_PROJECT_MISSING' | 'ENGINE_PROJECT_NOT_FOUND' | 'ENGINE_TXN_IN_PROGRESS';
1600
+ reason: 'missing' | 'not-project' | 'damaged' | 'not_registered' | 'unreadable' | 'busy';
1543
1601
  hint: string;
1544
1602
  }
1545
1603
  interface PanelBundle {
@@ -1694,6 +1752,16 @@ interface BriefInput {
1694
1752
  chapter?: number;
1695
1753
  root?: string;
1696
1754
  }
1755
+ type BriefPayload = {
1756
+ stage: BriefStage;
1757
+ chapter: number;
1758
+ digest: string;
1759
+ title: string;
1760
+ content: string;
1761
+ content_hash: string;
1762
+ fields: Record<string, unknown>;
1763
+ context: Record<string, unknown>;
1764
+ };
1697
1765
  interface WorldPlanSubmission extends WorldPlanInput {
1698
1766
  root?: string;
1699
1767
  }
@@ -1746,7 +1814,7 @@ interface AmendSubmission {
1746
1814
  interface RestoreSubmission {
1747
1815
  txid: string;
1748
1816
  chapter?: number;
1749
- /** Restrict to these project-relative files; omitted restores every chapter file in the snapshot. */
1817
+ /** Restrict to chapter files, or exactly [outline/outline.yaml] to restore the plan. */
1750
1818
  paths?: string[];
1751
1819
  root?: string;
1752
1820
  }
@@ -1795,8 +1863,27 @@ interface WordCountInput {
1795
1863
  }
1796
1864
  interface BookPlanSubmission extends BookPatch {
1797
1865
  volumes?: VolumeInput[];
1866
+ /** Explicit confirmation when a volume-list replacement drops a volume. */
1867
+ confirm_remove?: boolean;
1798
1868
  root?: string;
1799
1869
  }
1870
+ interface OutlineMutationResult {
1871
+ planned: number;
1872
+ archived: number;
1873
+ total: number;
1874
+ strict: boolean;
1875
+ volumes: number;
1876
+ added: number[];
1877
+ updated: number[];
1878
+ removed: number[];
1879
+ volumes_added: string[];
1880
+ volumes_updated: string[];
1881
+ volumes_removed: string[];
1882
+ dry_run?: boolean;
1883
+ would_add?: number[];
1884
+ would_update?: number[];
1885
+ would_remove?: number[];
1886
+ }
1800
1887
  interface OutlineSubmission extends OutlineInput {
1801
1888
  root?: string;
1802
1889
  }
@@ -1929,13 +2016,8 @@ declare class EngineService {
1929
2016
  volumes: number;
1930
2017
  chapters: number;
1931
2018
  }>>;
1932
- submitOutline(input: OutlineSubmission): Promise<OpResult<{
1933
- planned: number;
1934
- archived: number;
1935
- total: number;
1936
- strict: boolean;
1937
- volumes: number;
1938
- }>>;
2019
+ private outlinePlanChange;
2020
+ submitOutline(input: OutlineSubmission): Promise<OpResult<OutlineMutationResult>>;
1939
2021
  importOutline(input: OutlineImportSubmission): Promise<OpResult<{
1940
2022
  format: string;
1941
2023
  planned: number;
@@ -1971,6 +2053,13 @@ declare class EngineService {
1971
2053
  * the model only learns about the mismatch when that write aborts.
1972
2054
  */
1973
2055
  private journalBlocking;
2056
+ /**
2057
+ * Count review attempts per archived chapter. The journal is authoritative;
2058
+ * history fills any per-chapter gap where it has more distinct historical
2059
+ * reviews than committed journal rows (legacy or a truncated upgrade). A
2060
+ * chapter can never report fewer attempts than readable current reviews.
2061
+ */
2062
+ private reviewAttemptsByChapter;
1974
2063
  /**
1975
2064
  * Count every committed attempt for one chapter, not just the loop since the
1976
2065
  * last rollback. `pipeline.rounds` is deliberately reset by rollback to keep
@@ -1998,20 +2087,18 @@ declare class EngineService {
1998
2087
  state_errors: StateError[];
1999
2088
  }>>;
2000
2089
  search(input: SearchInput): Promise<OpResult<SearchReport>>;
2090
+ /**
2091
+ * Read-only upgrade audit. It never edits a legacy document: the point is to
2092
+ * explain why an old project's numbers look different, not to rewrite history.
2093
+ */
2094
+ private legacyIssues;
2001
2095
  doctor(input?: DoctorInput): Promise<OpResult<DoctorReport>>;
2002
2096
  private recoveryForSafe;
2003
2097
  report(input?: ReportSubmission): Promise<OpResult<BookReport>>;
2004
2098
  guide(input?: GuideInput): Promise<OpResult<GuideReport>>;
2005
- getBrief(input: BriefInput): Promise<OpResult<{
2006
- stage: string;
2007
- chapter: number;
2008
- digest: string;
2009
- title: string;
2010
- content: string;
2011
- content_hash: string;
2012
- fields: Record<string, unknown>;
2013
- context: Record<string, unknown>;
2014
- }>>;
2099
+ getBrief(input: BriefInput): Promise<OpResult<BriefPayload>>;
2100
+ private assertBriefChapter;
2101
+ private briefPayload;
2015
2102
  submitWorldPlan(input: WorldPlanSubmission): Promise<OpResult<{
2016
2103
  chapter: number;
2017
2104
  stage: Stage;
@@ -2120,6 +2207,7 @@ declare class EngineService {
2120
2207
  active: string | null;
2121
2208
  projects: Array<RegistryEntry & {
2122
2209
  state: ProjectState;
2210
+ identity_changed?: boolean;
2123
2211
  }>;
2124
2212
  }>;
2125
2213
  /**
@@ -2147,6 +2235,22 @@ declare class EngineService {
2147
2235
  active: string | null;
2148
2236
  projects: RegistryEntry[];
2149
2237
  }>;
2238
+ /**
2239
+ * Remove only registry rows whose directories are missing, not a project, or
2240
+ * unreadable. The default is a dry run; project files and session bindings are
2241
+ * never touched, and `--yes` is required at the command layer.
2242
+ */
2243
+ pruneProjects(input?: {
2244
+ apply?: boolean;
2245
+ }): Promise<{
2246
+ candidates: Array<{
2247
+ root: string;
2248
+ title: string;
2249
+ state: ProjectState;
2250
+ }>;
2251
+ removed: string[];
2252
+ active: string | null;
2253
+ }>;
2150
2254
  /**
2151
2255
  * Bounded workspace scan. Normal mode is read-only; `register` updates only
2152
2256
  * healthy, newly discovered rows, never active or session bindings.
@@ -2217,10 +2321,8 @@ declare class EngineService {
2217
2321
  */
2218
2322
  private assertPlanningDocumentReadable;
2219
2323
  /**
2220
- * A strict outline cannot silently lose the active chapter's card while the
2221
- * chapter is still being written. Otherwise a late replacement turns a
2222
- * strict project non-strict in effect and archive would auto-create the card
2223
- * the author was required to provide.
2324
+ * An import is a full replacement, unlike novel_outline's keyed upsert. It
2325
+ * must not silently lose the active card while strict mode still requires it.
2224
2326
  */
2225
2327
  private assertActiveCardPreserved;
2226
2328
  /**
@@ -2246,10 +2348,10 @@ declare class EngineService {
2246
2348
  private bookStatus;
2247
2349
  private panelSnapshot;
2248
2350
  /**
2249
- * The archive stage has only one legal operation, so a status/panel that
2250
- * recommends it without checking the same gates as the archive creates a
2251
- * loop. Evaluate the real archive gates through `gateInput`, then add the
2252
- * machine pass and semantic evidence that archive re-checks separately.
2351
+ * The archive stage can be left by a direct revision (the 0.2.3 workflow) or
2352
+ * by rollback. Evaluate the same gates as archive so status/panel do not
2353
+ * recommend an operation that will immediately fail; when the failure is
2354
+ * prose-level, `nextStep` recommends the direct P5 revision instead.
2253
2355
  */
2254
2356
  private archivePreflight;
2255
2357
  private nextStep;
@@ -2275,6 +2377,7 @@ declare class EngineService {
2275
2377
  private stateGateBlock;
2276
2378
  /** Whether the stored brief still signs the current snapshot. */
2277
2379
  private readBriefReceipts;
2380
+ private assertBriefReceiptsWritable;
2278
2381
  private briefIsCurrent;
2279
2382
  /** Arguments valid for the tool `STAGE_NEXT` recommends at this stage. */
2280
2383
  private nextArgs;
@@ -2329,12 +2432,14 @@ declare const PLUGIN_NAME = "dsh-novel-write-engine";
2329
2432
  declare const PANEL_ID = "novel-workshop";
2330
2433
  declare const PANEL_ROUTE = "/api/novel-write-engine/panel";
2331
2434
  declare const SKILL_NAME = "novel-write-engine";
2332
- declare const REMOTE_VERSION = 4;
2435
+ declare const REMOTE_VERSION = 5;
2333
2436
  /** The panel is a recent-history view; the wire payload and UI use one cap. */
2334
2437
  declare const PANEL_CHAPTER_LIMIT = 30;
2335
2438
  /** Project-relative locations. Every write goes through these constants. */
2336
2439
  declare const PROJECT_FILE = "novel.yaml";
2337
2440
  declare const OUTLINE_FILE = "outline/outline.yaml";
2441
+ /** Last outline replaced by a normal planning write; one level is enough for repair. */
2442
+ declare const OUTLINE_DEPRECATED_FILE = "outline/outline.deprecated.yaml";
2338
2443
  declare const WORLDBOOK_FILE = "outline/worldbook.yaml";
2339
2444
  declare const STATE_DIR = "state";
2340
2445
  declare const CHAPTERS_DIR = "chapters";
@@ -2460,4 +2565,4 @@ declare const Config: Schema<Config>;
2460
2565
  * created lazily per project root.
2461
2566
  */
2462
2567
  declare function apply(ctx: Context, config: Config): void;
2463
- export { ARCHIVE_DIGESTS_FILE, AdviceReport, ArchiveHandoff, AuditRow, BACKUP_DIR, BRIEF_RECEIPTS_FILE, BlockingItem, BookPlan, BookReport, BriefDocument, BriefLibrary, BriefReceipt, BriefReceiptsDocument, BriefStage, CHAPTERS_DIR, CHECK_DIR, CORE_TOOLS, ChapterCastMember, ChapterPlanInput, ChapterRecord, ChapterStatusRow, ChapterSummary, ChaptersDocument, CharacterDelta, CharactersDocument, CheckDocument, Config, DEFAULT_GENRE, DEFAULT_PLATFORM, Deduction, DeltaAction, DiffReport, DoctorCheck, DoctorReport, DraftInput, DraftState, ERROR_CODES, EXPORT_DIR, EngineBlockedError, EngineError, EngineFaultError, EngineInputError, EngineService, ErrorCode, ExportChapter, ExportKind, ForeshadowDelta, ForeshadowsDocument, GENRES, GateInput, GateOptions, GateResult, Genre, GuideReport, GuideStep, HISTORY_DIR, HISTORY_KINDS, HandoffDocument, HistoryKind, INITIAL_STAGE, LIMITS, LOCK_FILE, LocksDocument, METADATA_LOCK_FILE, MachineMetrics, NovelProject, OPERATIONS, OUTLINE_DIR, OUTLINE_FILE, OpResult, Operation, OutlineChapter, OutlineDocument, OutlineProgress, OutlineVolume, PANEL_CHAPTER_LIMIT, PANEL_ID, PANEL_ROUTE, PHASE_STRIP, PLAN_DIR, PLATFORMS, PLUGIN_NAME, PROJECT_FILE, PanelBook, PanelBundle, PanelChapterRow, PanelChaptersDto, PanelDraft, PanelGatesDto, PanelMissing, PanelProjectOption, PanelSelection, PanelSnapshot, PanelSummaryDto, PipelineState, Platform, REGISTRY_FILE, REMOTE_VERSION, REVIEW_DIR, ReadingProof, ReadingProofReference, RelationshipDelta, RelationshipsDocument, ResumePromptInput, ReviewDocument, ReviewInput, ReviewIssue, RevisionEdit, RevisionInput, RevisionPatch, RoundCounters, SCENE_TYPES, SCENE_TYPE_DEFAULT, SCHEMA_VERSION, SESSION_BINDINGS_FILE, SKILL_NAME, STAGING_DIR, STATE_DIR, STATE_FILES, SceneType, ScoreDimension, SearchReport, SearchResultItem, Selection, SelectionSource, SemanticItem, Severity, Stage, StateDelta, StateError, StateErrorCode, StatusReport, TOOL_NAMES, TimelineDelta, TimelineDocument, ToolName, Violation, WORLDBOOK_FILE, Warning, WordMetrics, WorldDelta, WorldDocument, WorldPlanInput, WorldbookBackstory, WorldbookCharacter, WorldbookDocument, WorldbookFact, WorldbookFaction, WorldbookGlossary, WorldbookLocation, WorldbookRule, applicableGates, apply, blockedError, briefStageFor, chapterFile, chapterHeading, chapterHistoryFile, checkFile, checkHistoryFile, deprecatedChapterFile, deprecatedHistoryFile, evaluateGates, faultError, formatResumePrompt, gateName, inject, inputError, loadRulepack, name, parseParagraphLocation, phaseStrip, planChapterFile, planHistoryFile, planWorldFile, projectChapter, projectChapters, projectGates, projectSummary, renderBlurb, renderCover, renderEpubChapter, renderMarkdown, renderPlainText, renderProposal, reviewFile, reviewHistoryFile, verifyReference };
2568
+ export { ARCHIVE_DIGESTS_FILE, AdviceReport, ArchiveHandoff, AuditRow, BACKUP_DIR, BRIEF_RECEIPTS_FILE, BlockingItem, BookPlan, BookReport, BriefDocument, BriefLibrary, BriefReceipt, BriefReceiptsDocument, BriefStage, CHAPTERS_DIR, CHECK_DIR, CORE_TOOLS, ChapterCastMember, ChapterPlanInput, ChapterRecord, ChapterStatusRow, ChapterSummary, ChaptersDocument, CharacterDelta, CharactersDocument, CheckDocument, Config, DEFAULT_GENRE, DEFAULT_PLATFORM, Deduction, DeltaAction, DiffReport, DoctorCheck, DoctorReport, DraftInput, DraftState, ERROR_CODES, EXPORT_DIR, EngineBlockedError, EngineError, EngineFaultError, EngineInputError, EngineService, ErrorCode, ExportChapter, ExportKind, ForeshadowDelta, ForeshadowsDocument, GENRES, GateInput, GateOptions, GateResult, Genre, GuideReport, GuideStep, HISTORY_DIR, HISTORY_KINDS, HandoffDocument, HistoryKind, INITIAL_STAGE, LIMITS, LOCK_FILE, LocksDocument, METADATA_LOCK_FILE, MachineMetrics, NovelProject, OPERATIONS, OUTLINE_DEPRECATED_FILE, OUTLINE_DIR, OUTLINE_FILE, OpResult, Operation, OutlineChapter, OutlineDocument, OutlineProgress, OutlineVolume, PANEL_CHAPTER_LIMIT, PANEL_ID, PANEL_ROUTE, PHASE_STRIP, PLAN_DIR, PLATFORMS, PLUGIN_NAME, PROJECT_FILE, PanelBook, PanelBundle, PanelChapterRow, PanelChaptersDto, PanelDraft, PanelGatesDto, PanelMissing, PanelProjectOption, PanelSelection, PanelSnapshot, PanelSummaryDto, PipelineState, Platform, REGISTRY_FILE, REMOTE_VERSION, REVIEW_DIR, ReadingProof, ReadingProofReference, RelationshipDelta, RelationshipsDocument, ResumePromptInput, ReviewDocument, ReviewInput, ReviewIssue, RevisionEdit, RevisionInput, RevisionPatch, RoundCounters, SCENE_TYPES, SCENE_TYPE_DEFAULT, SCHEMA_VERSION, SESSION_BINDINGS_FILE, SKILL_NAME, STAGING_DIR, STATE_DIR, STATE_FILES, SceneType, ScoreDimension, SearchReport, SearchResultItem, Selection, SelectionSource, SemanticItem, Severity, Stage, StateDelta, StateError, StateErrorCode, StatusReport, TOOL_NAMES, TimelineDelta, TimelineDocument, ToolName, Violation, WORLDBOOK_FILE, Warning, WordMetrics, WorldDelta, WorldDocument, WorldPlanInput, WorldbookBackstory, WorldbookCharacter, WorldbookDocument, WorldbookFact, WorldbookFaction, WorldbookGlossary, WorldbookLocation, WorldbookRule, applicableGates, apply, blockedError, briefStageFor, chapterFile, chapterHeading, chapterHistoryFile, checkFile, checkHistoryFile, deprecatedChapterFile, deprecatedHistoryFile, evaluateGates, faultError, formatResumePrompt, gateName, inject, inputError, loadRulepack, name, parseParagraphLocation, phaseStrip, planChapterFile, planHistoryFile, planWorldFile, projectChapter, projectChapters, projectGates, projectSummary, renderBlurb, renderCover, renderEpubChapter, renderMarkdown, renderPlainText, renderProposal, reviewFile, reviewHistoryFile, verifyReference };