2026-05-18 22:03:59 -05:00
# Operations
This guide describes the implemented operator lifecycle for Narratio.
For field-level configuration, see [docs/config.md ](./config.md ). For full command/flag reference, see [docs/cli.md ](./cli.md ).
## Normal workflow (S3-first path)
2026-05-21 11:50:20 -05:00
1. Create or upload `session.yml` , or pass a local `session.yml` explicitly.
2026-05-20 20:55:13 -05:00
2. Upload session `.flac` files to object storage under the configured session audio prefix.
3. Run Narratio:
2026-05-18 22:03:59 -05:00
```bash
2026-05-22 22:09:17 -05:00
narratio run 2026-04-04
2026-05-18 22:03:59 -05:00
```
2026-05-20 20:55:13 -05:00
4. Read success output:
2026-05-19 19:42:28 -05:00
- `narratio run: session <session_id>; executed=<n> skipped=<n>; manifest=<path>`
2026-05-22 22:09:17 -05:00
- use `narratio session status <session_id>` for inspection.
2026-05-18 22:03:59 -05:00
Notes:
2026-05-22 23:01:27 -05:00
- default pipeline/session discovery checks system config locations; campaign selection uses `pipeline.campaigns.default_campaign_id` unless `--campaign <id>` or `--campaign-file <path>` is passed.
2026-05-22 22:09:17 -05:00
- when local `session.yml` discovery misses, positional `<session_id>` loads remote `session.yml` from `{root_prefix}/campaigns/{campaign}/sessions/{session_id}/session.yml` .
2026-05-19 19:42:28 -05:00
- S3 audio mode requires `session.inputs.audio_s3.prefix` and valid object-store access.
2026-05-18 22:03:59 -05:00
2026-05-21 11:50:20 -05:00
Initialize a remote session skeleton:
```bash
2026-05-22 22:09:17 -05:00
narratio session init 2026-04-04 --remote
2026-05-21 11:50:20 -05:00
```
2026-05-22 23:01:27 -05:00
Remote init uses normal default config discovery and writes `{root_prefix}/campaigns/{campaign}/sessions/{session_id}/session.yml` . If `campaign.yml` sets `session_template_file` , init renders that template from the supplied flags and writes concrete YAML. Pass `--config` , `--campaign <id>` , or `--campaign-file <path>` when testing non-system config files. It fails if the object already exists unless `--force` is passed.
2026-05-21 11:50:20 -05:00
Validate before running:
```bash
2026-05-22 22:09:17 -05:00
narratio session validate 2026-04-04
2026-05-21 11:50:20 -05:00
```
2026-05-19 22:32:55 -05:00
## Restore workflow
Use restore when local durable session state is missing or stale and archive current state is authoritative.
Dry-run (no local writes):
```bash
2026-05-22 22:09:17 -05:00
narratio session restore 2026-04-04 --dry-run
2026-05-19 22:32:55 -05:00
```
Execution:
```bash
2026-05-22 22:09:17 -05:00
narratio session restore 2026-04-04
2026-05-19 22:32:55 -05:00
```
Post-restore analyze rerun pattern:
```bash
2026-05-22 22:09:17 -05:00
narratio analyze 2026-04-04
2026-05-19 22:32:55 -05:00
```
Restore source-of-truth:
- remote commit marker: `current/run_id.txt`
- remote current manifest: `current/manifest.json`
2026-05-21 23:31:01 -05:00
- configured previous-session requirements are reconstructed from the previous session's remote `current/` state, not from archived `previous/**` objects in the current session.
2026-05-19 22:32:55 -05:00
Restore default scope:
2026-05-21 23:31:01 -05:00
- includes `manifest.json` , `transcripts/**` , and `artifacts/**` from the current session archive.
- includes `previous/**` only when configured previous-session artifact inputs require it; restore hydrates those files the same way `prepare` would.
2026-05-19 22:32:55 -05:00
- includes `audio/**` only with `--include-audio`
- excludes `runs/**` , `logs/**` , `reports/**` , `config/**` , `inputs/**` , and `current/**` (except remote `current/manifest.json` as source)
2026-05-21 22:48:18 -05:00
Reset local state before restore testing:
```bash
2026-05-22 22:09:17 -05:00
narratio clean 2026-04-04 --dry-run
narratio clean 2026-04-04
narratio session restore 2026-04-04 --include-audio
2026-05-21 22:48:18 -05:00
```
`clean` removes the local session work directory and session spool directory. It preserves the durable S3 audio cache by default, so repeated restore or forced prepare tests do not re-download large audio files.
2026-05-18 22:03:59 -05:00
## Local filesystem layout and state artifacts
Session root:
- `{workspace.root}/work/{campaign}/{session_id}/`
Primary state:
2026-05-19 19:42:28 -05:00
- `manifest.json` : session-level stage state.
- `runs/{run_id}/manifest.json` : invocation-level state.
2026-05-19 22:32:55 -05:00
- `.lock` : session lock while a modifying command is active.
2026-05-20 20:41:28 -05:00
- `inputs/campaign.yml` , `inputs/session.yml` , and `inputs/pipeline.resolved.yml` : materialized config inputs for the run.
2026-05-18 22:03:59 -05:00
Canonical session directories:
- `inputs/`
- `audio/`
- `transcripts/`
- `artifacts/`
2026-05-20 15:17:04 +00:00
- `previous/`
2026-05-18 22:03:59 -05:00
- `reports/`
- `logs/`
- `config/`
- `current/`
- `runs/`
Run-local stage directories:
2026-05-19 19:42:28 -05:00
- `runs/{run_id}/{stage}/` with stage-local `outputs/` , `logs/` , `reports/` , `config/` , `scratch/` .
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Behavior:
- directory creation is idempotent.
- stage outputs are generally generated run-local first, then promoted to canonical paths on success.
2026-05-19 22:32:55 -05:00
- restore installs downloaded files to canonical session paths and does not recreate historical run sandboxes.
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
## Analyze artifact execution lifecycle
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Analyze executes configured artifacts from `pipeline.scriptorium.artifacts` .
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Execution model:
- executable set = enabled artifacts, filtered by `--artifacts` when provided.
- artifact-to-artifact dependencies are declared via `depends_on` .
- selected artifacts run in deterministic dependency order.
- after each successful artifact run, output is promoted to configured canonical `output_path` .
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Configured artifact source reuse:
- a non-executable configured artifact can satisfy inputs if its configured output file already exists and is valid.
- reused configured artifact provenance is `filesystem.disabled_artifact_output` .
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
`--artifacts` behavior:
2026-05-22 18:01:05 -05:00
- accepted on `run` , `resume` , `run-stage analyze` , `run-stage archive` , `analyze` , and `publish` .
- filters analyze execution and configured artifact promotions.
- built-in transcript and bounds promotions are not filtered.
2026-05-21 23:02:19 -05:00
- does not imply force on `run` , `resume` , or `run-stage` ; `narratio analyze` is force-by-design.
2026-05-22 18:01:05 -05:00
- `publish` is force-by-design and accepts `--artifacts` for configured artifact promotions.
2026-05-18 22:03:59 -05:00
2026-05-20 15:17:04 +00:00
Canonical previous-session input behavior:
- canonical sources use `narratio.previous_session.artifact.<artifact_key>` .
2026-05-21 23:31:01 -05:00
- these inputs are hydrated by `prepare` and by `restore` ; `analyze` expects the local previous cache to already exist.
2026-05-20 15:17:04 +00:00
- if analyze fails due to missing canonical previous cache, rerun:
2026-05-22 22:09:17 -05:00
- `narratio run-stage prepare <id> --force`
- or `narratio session restore <id>` when remote archive current state is authoritative.
2026-05-20 15:17:04 +00:00
2026-05-19 19:42:28 -05:00
## Remote archive layout and publish contract
2026-05-18 22:03:59 -05:00
2026-05-22 11:28:38 -05:00
Preferred manual publish command:
```bash
2026-05-22 22:09:17 -05:00
narratio publish <id>
2026-05-22 11:28:38 -05:00
```
2026-05-22 22:09:17 -05:00
`publish` is equivalent to `narratio run-stage archive <id> --force` ; use `run-stage` when you need the general single-stage command form.
2026-05-22 11:28:38 -05:00
2026-05-19 19:42:28 -05:00
When archive is enabled and run upload is enabled, archive publishes under:
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
- session prefix: `{root_prefix}/campaigns/{campaign}/sessions/{session_id}/`
- run prefix: `{session_prefix}/runs/{run_id}/`
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Archive uploads:
- run record files from run root (excluding `audio/` ).
- promoted files from explicit `archive.promote_artifacts` rules.
2026-05-21 11:50:20 -05:00
- mutable session locks from helper commands live at `{session_prefix}/locks.yml` .
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Publish order:
1. upload `current/manifest.json`
2. upload `current/run_id.txt` last
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
`current/run_id.txt` is the remote commit marker.
2026-05-18 22:03:59 -05:00
2026-05-19 20:05:24 -05:00
Archive promotion is explicit and source-based:
2026-05-19 19:42:28 -05:00
- Narratio does not auto-promote all generated analyze artifacts.
2026-05-19 20:05:24 -05:00
- each rule resolves `source` through the artifact resolver/catalog model, then uploads to `dest` .
2026-05-19 19:42:28 -05:00
- missing required promotion sources fail archive stage.
- missing optional promotion sources are skipped.
2026-05-19 20:05:24 -05:00
- invalid resolved artifacts fail archive stage.
2026-05-20 21:40:09 -05:00
- `archive.locks` skips top-level promotion overwrites for locked sources while run-local uploads still publish.
2026-05-21 11:50:20 -05:00
- remote locks from `{session_prefix}/locks.yml` are merged with static `archive.locks` ; static locks win on duplicate sources.
2026-05-20 21:40:09 -05:00
- locked required promotions are treated as intentional successful skips and are recorded in archive metadata.
2026-05-18 22:03:59 -05:00
2026-05-21 11:50:20 -05:00
Lock helper behavior:
2026-05-22 22:09:17 -05:00
- `narratio session locks <id>` lists effective static and remote locks.
- `narratio session locks add <id> <source> --reason <text>` writes a remote lock.
- `narratio session locks add <id> <source> --force --reason <text>` updates an existing remote lock reason.
- `narratio session locks remove <id> <source>` removes only a remote lock.
2026-05-21 19:36:14 -05:00
- `locks remove` cannot remove static pipeline locks.
2026-05-21 11:50:20 -05:00
- remote lock writes check whether the lock store exists, but are not compare-and-swap atomic.
2026-05-19 22:32:55 -05:00
## Resume, retry, restore, and safe rerun behavior
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Default skip:
- `run` and `run-stage` skip already-succeeded stages unless `--force` is set.
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Resume:
- `resume` starts at first non-succeeded stage.
- `resume --force` runs full stage order.
2026-05-18 22:03:59 -05:00
2026-05-19 22:32:55 -05:00
Restore conflict policy:
- restore classifies local differences as conflicts.
- without `--force` , restore fails when conflicts exist.
- with `--force` , conflicting local files are overwritten by remote archive files.
2026-05-19 19:42:28 -05:00
Forced reruns:
- force-rerunning an upstream succeeded stage marks downstream succeeded stages as `stale` .
2026-05-20 21:40:09 -05:00
- ordinary `--force` does not override archive locks.
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Safe rerun pattern:
1. rerun the changed stage with `--force` .
2. run `resume` to rebuild downstream stages.
2026-05-18 22:03:59 -05:00
## Cleanup behavior
2026-05-21 22:48:18 -05:00
Automatic post-archive cleanup is considered only when archive stage executed and succeeded.
2026-05-18 22:03:59 -05:00
2026-05-21 22:48:18 -05:00
Automatic cleanup toggles:
2026-05-19 19:42:28 -05:00
- `pipeline.spool.delete_audio_after_archive=true` deletes run-scoped spool audio.
- `pipeline.workspace.cleanup_after_archive=true` deletes run-scoped local run directory.
2026-05-18 22:03:59 -05:00
2026-05-21 22:48:18 -05:00
Manual cleanup:
2026-05-22 22:09:17 -05:00
- `narratio clean <id>` deletes `{workspace.root}/work/{campaign}/{session_id}` and `{spool.root}/{campaign}/{session_id}` .
2026-05-21 22:48:18 -05:00
- `narratio clean --all` deletes all local session work under `{workspace.root}/work` and all spool children under `{spool.root}` .
- `--dry-run` prints targets without deleting.
- `--clear-cache` also removes matching S3 audio cache files. Without it, cache is preserved.
The S3 audio cache under `pipeline.cache.root` is durable input cache state, not workspace or spool state. Automatic cleanup and default manual cleanup do not delete it.
2026-05-21 22:22:08 -05:00
2026-05-19 19:42:28 -05:00
Cleanup eligibility gates:
- archive enabled
- archive run upload enabled
- run record upload completed
- current pointer write completed (`current/run_id.txt` written)
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
No cleanup for failed/incomplete/unarchived/archive-skipped runs.
2026-05-18 22:03:59 -05:00
## Failure and recovery playbooks
2026-05-19 22:32:55 -05:00
After run failure, Narratio keeps:
2026-05-19 19:42:28 -05:00
- session manifest
- run manifest
- run-local artifacts/logs/config/reports
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
Failed or incomplete runs remain local-only.
2026-05-18 22:03:59 -05:00
2026-05-19 22:32:55 -05:00
After restore failure:
- already-installed restore files remain in place.
- restore does not roll back prior successful installs.
- existing local manifest is preserved if restored manifest validation/install fails.
2026-05-19 19:42:28 -05:00
Recommended recovery:
2026-05-18 22:03:59 -05:00
2026-05-19 19:42:28 -05:00
1. inspect state:
2026-05-18 22:03:59 -05:00
2026-05-21 11:50:20 -05:00
```bash
2026-05-22 22:09:17 -05:00
narratio session status 2026-04-04
2026-05-21 11:50:20 -05:00
```
2026-05-21 20:49:28 -05:00
This reports local manifest state, committed remote current state, expected remote transcript/artifact availability, and archive locks.
2026-05-22 22:09:17 -05:00
2. for restore-specific checks, run:
2026-05-21 11:50:20 -05:00
2026-05-18 22:03:59 -05:00
```bash
2026-05-22 22:09:17 -05:00
narratio session restore 2026-04-04 --dry-run
2026-05-18 22:03:59 -05:00
```
2026-05-22 22:09:17 -05:00
3. fix root cause (config/input/credentials/storage/service availability).
4. continue with `resume` , or targeted `run-stage <stage> <id> --force` followed by `resume` .
2026-05-19 22:32:55 -05:00
## Restore report
Non-dry-run restore writes a durable report at:
- `reports/restore-latest.json`
Report content includes:
- identity (`campaign` , `session_id` , `run_id` )
- mode flags (`dry_run` , `force` , `include_audio` )
- plan counts and execution counts
- per-action status
Dry-run does not write restore report files.
2026-05-18 22:03:59 -05:00
## Operational caveats
2026-05-22 22:09:17 -05:00
- `session status <session_id>` uses normal config/session loading, including remote session fallback.
- `session status <session_id>` includes the same promoted remote output availability view as `session artifacts <session_id> --remote` when storage is configured.
2026-05-19 19:42:28 -05:00
- local and S3 audio input modes are mutually exclusive.
- archive publish requires upstream stages through `analyze` to be `succeeded` .
2026-05-22 18:01:05 -05:00
- required configured artifact promotions for unselected `--artifacts` keys are skipped intentionally; selected required promotions still fail if their files are missing.
2026-05-19 22:32:55 -05:00
- restore requires configured remote object storage and committed remote current state.