82 lines
3.5 KiB
Markdown
82 lines
3.5 KiB
Markdown
# Internal: Manifest
|
|
|
|
## Purpose
|
|
Describe Narratio's durable execution state model for session-level and run-level manifests, including lifecycle transitions and persistence behavior.
|
|
|
|
## Inputs and outputs
|
|
Inputs:
|
|
- Session identity and run identity from app orchestration.
|
|
- Stage transition events and stage result payloads.
|
|
|
|
Outputs:
|
|
- Session manifest at `{workspace.root}/work/{campaign}/{session_id}/manifest.json`.
|
|
- Run manifest at `{workspace.root}/work/{campaign}/{session_id}/runs/{run_id}/manifest.json`.
|
|
|
|
## Boundaries
|
|
Owns:
|
|
- Manifest schemas (`Manifest`, `RunManifest`, stage records, error records, input/artifact records).
|
|
- Stage status/action transition methods.
|
|
- Persistent store contract (`manifest.Store`) and local JSON store implementation.
|
|
|
|
Does not own:
|
|
- Stage implementation details.
|
|
- Path construction policy outside manifest file persistence calls.
|
|
- CLI command behavior.
|
|
|
|
## Config fields used
|
|
Manifest package itself does not read config directly.
|
|
|
|
Manifest identity fields are populated by app/stage orchestration from:
|
|
- `session.session_id`
|
|
- `session.campaign`
|
|
- `pipeline.workspace.root`
|
|
- `pipeline.storage.s3.*` (when archive/S3 identity is set)
|
|
|
|
## External adapters used
|
|
- No external service adapters.
|
|
- Uses local filesystem for persistence via `manifest.LocalStore`.
|
|
|
|
## State and manifest behavior
|
|
Session manifest model:
|
|
- Tracks durable per-session stage state and provenance (`pending`, `running`, `succeeded`, `failed`, `skipped`, `stale`, `interrupted`).
|
|
- Stores resolved inputs, durable artifacts, stage logs/config refs, and stage metadata.
|
|
|
|
Run manifest model:
|
|
- Tracks one invocation (`run_id`) with requested stages and force mode.
|
|
- Tracks per-stage action (`run` or `skip`) and per-stage status.
|
|
- Tracks overall run status (`running`, `succeeded`, `failed`).
|
|
|
|
Persistence behavior:
|
|
- Load validates required identity/timestamp fields and normalizes maps/records.
|
|
- Save updates `updated_at` and writes JSON atomically (temp file + rename).
|
|
- Session and run manifests are saved incrementally before/after stage transitions.
|
|
|
|
Relationship during execution:
|
|
- Runner updates both manifests for every stage transition.
|
|
- Session manifest is the durable pipeline-progress ledger.
|
|
- Run manifest is invocation history and audit record.
|
|
- Analyze stage outputs are persisted as `kind=scriptorium_artifact` with `source_id=narratio.artifact.<name>` for configured artifact identity.
|
|
|
|
## Skip and resume behavior
|
|
- Resume and skip decisions are based on session-manifest stage statuses.
|
|
- `--force` reruns selected stages and marks downstream succeeded stages as `stale` in session manifest.
|
|
- Run manifest records whether each stage was executed or skipped in that invocation.
|
|
|
|
## Failure behavior
|
|
- Stage failure marks both manifests failed for that stage and records error messages/timestamps.
|
|
- Save failures are returned immediately and fail the command.
|
|
- Invalid/malformed manifest files fail load with explicit validation/decode errors.
|
|
|
|
## Tests to inspect before changing
|
|
- `internal/manifest/manifest_test.go`
|
|
- `internal/manifest/run_manifest_test.go`
|
|
- `internal/manifest/store_test.go`
|
|
- `internal/app/runner_test.go`
|
|
- `internal/app/run_control_test.go`
|
|
- `internal/app/resume_run_stage_test.go`
|
|
|
|
## Architectural invariants
|
|
- Session manifest is authoritative for stage progression across invocations.
|
|
- Run manifest is invocation-scoped and never replaces session manifest as progress authority.
|
|
- Manifest writes are atomic and deterministic (JSON + newline, temp rename pattern).
|