diff --git a/docs/integrations/README.md b/docs/integrations/README.md index ac3b456..a2192aa 100644 --- a/docs/integrations/README.md +++ b/docs/integrations/README.md @@ -1,15 +1,19 @@ -# Integration Documentation Index +# Integrations Index ## Audience -Developers and LLM coding agents changing Narratio's external integration contracts. +Developers and coding agents changing Narratio's external integration boundaries. ## Scope -Implemented-only reference notes for the external systems Narratio currently integrates with. +`docs/integrations/` is the implementation-level reference for downstream tool adapter contracts. -## Integration Docs -- `audita.md`: Audita adapter invocation and validation contract. -- `seriatim.md`: Seriatim normalize/merge/trim adapter contract. -- `scriptorium.md`: Scriptorium run/render adapter contract. +These docs cover what Narratio expects from external tools and what each adapter guarantees back to stage code. -## Canonical Owner -`docs/integrations/` is the canonical home for external integration reference notes per `docs/policy/documentation.md`. +## Integration Contracts +- `audita.md`: transcript polishing adapter (`audita process`). +- `seriatim.md`: merge/normalize/trim adapter (`seriatim`). +- `scriptorium.md`: artifact run/render adapter (`scriptorium run|render`). + +## Related Canonical Docs +- `docs/config.md`: operator-facing configuration reference. +- `docs/internal/adapters.md`: shared adapter boundary and runner wiring. +- `docs/internal/stage-*.md`: stage-specific integration usage. diff --git a/docs/integrations/audita.md b/docs/integrations/audita.md index cbc4e13..6d57410 100644 --- a/docs/integrations/audita.md +++ b/docs/integrations/audita.md @@ -1,66 +1,60 @@ -# Integration: audita +# Integration: Audita ## Purpose -Define Narratio's adapter contract for transcript polishing via Audita CLI subprocess execution. +Define the Audita adapter contract used by the `polish` stage. -## Inputs and Outputs -Inputs (`audita.PolishRequest`): -- base transcript path -- glossary path -- output polished transcript path -- optional report path (required when report enabled) -- work dir -- generated config path -- stdout/stderr log paths -- optional module/model/base URL and concurrency knobs +## Adapter Boundary +Interface: +- `audita.Runner` +- method: `Run(ctx, PolishRequest) (PolishResult, error)` -Outputs (`audita.PolishResult`): -- polished transcript path -- optional report path -- generated config path -- stdout/stderr log paths -- exit code, duration, invoked binary -- adapter metadata +Primary implementation: +- `internal/adapters/audita/SubprocessRunner` -## Boundaries -Owns: -- Deterministic CLI argument construction for `audita process` -- Environment bridging for API credentials -- Invocation config emission -- Output validation for polished transcript and report +Execution mode: +- subprocess invocation of `audita process` -Does not own: -- Upstream/downstream stage orchestration -- Credential sourcing policy beyond required env-var presence check +## Request Contract +`PolishRequest` carries: +- required transcript/glossary/output/work-dir paths; +- optional report path (required when report mode is enabled); +- generated config and stdout/stderr log paths; +- optional module/model/base-url/config/output-schema/concurrency settings. -## Config Fields Used -Via `pipeline.audita.*` mapped in app/stage wiring: -- `binary`, `timeout`, `llm_api_key_env`, `modules`, `base_url`, `model` -- `transcript_description`, `config_path`, `output_schema`, `work_dir_retention` -- `total_llm_concurrency`, `proposal_llm_concurrency`, `validation_model`, `validation_llm_concurrency`, `report` +## Result Contract +`PolishResult` returns: +- processed transcript path; +- optional report path; +- work dir and generated-config/log paths; +- exit code, duration, binary provenance; +- adapter metadata map. -## External Adapters Used -- Shared subprocess helper (`internal/adapters/subprocess`) to run CLI and capture logs. +## Validation and Failure Semantics +Construction fails for invalid static config values, including: +- empty binary; +- non-positive timeout; +- invalid base URL; +- invalid output schema; +- invalid work-dir retention value; +- invalid concurrency values. -## State and Manifest Behavior -- No direct manifest writes. -- Stage-level metadata records adapter provenance and credential-present signal. -- Generated invocation YAML is written when `GeneratedConfigPath` is provided. +Run fails for: +- missing required request paths; +- missing required credential env var when configured (`llm_api_key_env`); +- subprocess execution failure; +- invalid processed transcript JSON (`segments` array required); +- invalid report JSON when reporting is enabled. -## Skip and Resume Behavior -- Adapter has no skip/resume logic. Stage/runner controls this. +Failure results still include output/log/config/exit metadata for diagnostics. -## Failure Behavior -- Constructor validation fails on invalid binary/timeout/schema/concurrency/URL values. -- Run fails on missing required paths, missing required credential env var, subprocess errors, invalid polished JSON shape, or invalid report JSON. -- Failures preserve stdout/stderr paths in returned result metadata. +## Deterministic Behavior +- CLI args are built from runner config + request in a fixed order. +- Generated invocation YAML (`audita.generated.v1`) is emitted when requested. +- Manifest writes are stage-owned; adapter itself is stateless. -## Tests to Inspect Before Changing -- `internal/adapters/audita/subprocess_test.go` -- `internal/adapters/audita/fake_test.go` -- `internal/stage/polish_test.go` +## Config Mapping +Config fields consumed through runner/stage wiring are under `pipeline.audita.*`. -## Architectural Invariants -- Polished output must be valid JSON with top-level `segments` array. -- When report is enabled, report output must be valid JSON. -- If `llm_api_key_env` is configured, credential must be present in environment. +Maintained example with Audita config: +- `examples/pipeline.full.annotated.yml` +- `examples/pipeline.production.yml` diff --git a/docs/integrations/scriptorium.md b/docs/integrations/scriptorium.md index 76b16d6..599245b 100644 --- a/docs/integrations/scriptorium.md +++ b/docs/integrations/scriptorium.md @@ -1,64 +1,66 @@ -# Integration: scriptorium +# Integration: Scriptorium ## Purpose -Define Narratio's adapter contract for Scriptorium artifact generation and render-debug subprocess invocations. +Define the Scriptorium adapter contract used by `analyze` and trim-bounds generation in `trim`. -## Inputs and Outputs -Inputs: -- `RunArtifactRequest`: binary, config path, prompt/profile IDs, input map, vars map, timeout, output path, logs/config paths, optional API env and working dir -- `RenderArtifactRequest`: same core fields for render mode +## Adapter Boundary +Interface: +- `scriptorium.Runner` +- methods: + - `RunArtifact(ctx, RunArtifactRequest)` + - `RenderArtifact(ctx, RenderArtifactRequest)` -Outputs (`ArtifactResult`): -- output path -- stdout/stderr log paths -- generated config path -- exit code and duration -- command mode (`run` or `render`) -- prompt/profile provenance -- validation failure signal -- adapter metadata +Primary implementation: +- `internal/adapters/scriptorium/SubprocessRunner` -## Boundaries -Owns: -- Deterministic CLI arg construction for `scriptorium run` and `scriptorium render` -- Common request validation -- Invocation config emission -- Output existence/non-empty checks -- Validation-failure mapping for run exit code 2 +Execution modes: +- `scriptorium run` +- `scriptorium render` -Does not own: -- Artifact selection policy (`analyze` stage) -- Bounds semantic validation (`trim` stage) +## Request Contract +Both request types carry: +- binary/config/prompt/profile IDs; +- input map and vars map; +- output path; +- timeout; +- generated config + stdout/stderr log paths; +- optional API-key env var name; +- optional working directory. -## Config Fields Used -Via `pipeline.scriptorium.*` and stage-level artifact config: -- `binary`, `config_path`, `timeout`, `render_debug` -- artifact-level `prompt_id`, `profile_id`, `timeout`, `inputs`, `vars`, `output_path` +## Result Contract +`ArtifactResult` returns: +- output/log/generated-config paths; +- exit code and duration; +- command mode (`run` or `render`); +- prompt/profile provenance; +- `ValidationFailed` marker; +- metadata map. -## External Adapters Used -- Shared subprocess helper (`internal/adapters/subprocess`). +## Validation and Failure Semantics +Request validation fails for: +- missing binary, prompt id, or output path; +- non-positive timeout; +- empty input/var names; +- empty input path values; +- missing required credential env var when `APIKeyEnv` is set. -## State and Manifest Behavior -- No direct manifest writes. -- Stage metadata records adapter outputs and command mode. -- Generated invocation YAML is written when requested. +Run behavior: +- subprocess errors propagate with context; +- `run` exit code `2` is mapped to `ValidationFailed=true`; +- successful subprocess still fails if output file is missing or empty. -## Skip and Resume Behavior -- Adapter has no skip/resume logic. Stage/runner controls execution. +Render behavior: +- subprocess errors propagate; +- output file must exist and be non-empty. -## Failure Behavior -- Request validation fails for missing binary/prompt/output, invalid timeout, invalid input/var names, or missing required API env var. -- Subprocess errors bubble with command context. -- `run` exit code 2 is treated as `ValidationFailed=true` and surfaced as error by calling stage. -- Successful subprocess still fails if output file is missing/empty. +## Deterministic Behavior +- input and var maps are sorted into deterministic `--input` and `--var` CLI args. +- generated invocation YAML (`scriptorium.generated.v1`) is emitted when requested. +- adapter is stateless and does not own artifact-selection policy. -## Tests to Inspect Before Changing -- `internal/adapters/scriptorium/subprocess_test.go` -- `internal/adapters/scriptorium/fake_test.go` -- `internal/stage/analyze_test.go` -- `internal/stage/trim_test.go` +## Config Mapping +Config fields consumed through runner/stage wiring are under `pipeline.scriptorium.*` plus per-artifact settings under `pipeline.scriptorium.artifacts.*`. -## Architectural Invariants -- Both modes require explicit timeout > 0. -- Input/var maps are sorted into deterministic CLI argument order. -- Run-mode validation failures are represented explicitly, not silently skipped. +Maintained examples with Scriptorium config: +- `examples/pipeline.full.annotated.yml` +- `examples/pipeline.production.yml` diff --git a/docs/integrations/seriatim.md b/docs/integrations/seriatim.md index 279b98a..491c341 100644 --- a/docs/integrations/seriatim.md +++ b/docs/integrations/seriatim.md @@ -1,60 +1,56 @@ -# Integration: seriatim +# Integration: Seriatim ## Purpose -Define Narratio's adapter contract for merge, normalize, and trim subprocess invocations of Seriatim. +Define the Seriatim adapter contract used by `merge`, `normalize`, and `trim`. -## Inputs and Outputs -Inputs: -- `MergeRequest`: raw/per-speaker normalized transcript inputs, base output path, optional report, speaker/autocorrect paths, logs/config -- `NormalizeRequest`: input transcript, output path, schema, optional report, timeout/log/config -- `TrimRequest`: input transcript, output path, keep selector, timeout/log/config +## Adapter Boundary +Interface: +- `seriatim.Runner` +- methods: + - `Run(ctx, MergeRequest)` + - `Normalize(ctx, NormalizeRequest)` + - `Trim(ctx, TrimRequest)` -Outputs: -- `MergeResult`, `NormalizeResult`, `TrimResult` with output paths, logs/config paths, exit code, duration, binary provenance, and metadata. +Primary implementation: +- `internal/adapters/seriatim/SubprocessRunner` -## Boundaries -Owns: -- Validated deterministic CLI invocation construction -- Optional env tuning propagation for merge -- Invocation config file emission -- JSON output validation +Execution modes: +- `seriatim merge` +- `seriatim normalize` +- `seriatim trim` -Does not own: -- Transcript input selection/materialization logic (stage-owned) -- Bounds computation (scriptorium/trim-stage-owned) +## Request/Result Contracts +- `MergeRequest`/`MergeResult`: multi-input merge to base transcript, optional report. +- `NormalizeRequest`/`NormalizeResult`: transcript normalization with explicit schema. +- `TrimRequest`/`TrimResult`: transcript trimming with required keep selector. -## Config Fields Used -Via `pipeline.seriatim.*` mapped in app/stage wiring: -- `binary`, `timeout`, `output_schema`, `coalesce_gap`, `report` -- `env.overlap_word_run_gap` -- `env.overlap_word_run_reorder_window` -- `env.backchannel_max_duration` -- `env.filler_max_duration` +Results include output/log/config paths, timing, exit code, and metadata. -## External Adapters Used -- Shared subprocess helper (`internal/adapters/subprocess`). +## Validation and Failure Semantics +Runner construction validates: +- binary presence; +- timeout > 0; +- supported output schema (`seriatim-minimal|seriatim-intermediate|seriatim-full`); +- non-negative coalesce gap. -## State and Manifest Behavior -- No direct manifest writes. -- Stage metadata consumes adapter result fields and preserves generated config/log references. +Invocation fails on: +- missing required request paths/inputs; +- invalid normalize schema override; +- subprocess failure; +- invalid JSON outputs; +- missing `segments` array for normalize/trim transcript outputs. -## Skip and Resume Behavior -- Adapter has no skip/resume logic. Runner controls stage execution. +When report paths are provided/enabled, report files must parse as JSON. -## Failure Behavior -- Constructor fails for invalid binary/timeout/output-schema/coalesce-gap. -- Merge fails on missing output path/inputs/report path (if enabled), subprocess errors, invalid merged output JSON, invalid report JSON. -- Normalize fails on missing input/output, invalid schema, subprocess errors, invalid final output JSON shape, invalid report JSON. -- Trim fails on missing input/output/keep selector, subprocess errors, invalid final-trimmed output JSON shape. +## Deterministic Behavior +- argument ordering is deterministic per command construction. +- merge env overrides are explicit (`SERIATIM_*`) and only emitted when configured. +- generated invocation YAML (`seriatim.generated.v1`) is emitted when requested. +- adapter does not write manifests or choose stage inputs. -## Tests to Inspect Before Changing -- `internal/adapters/seriatim/subprocess_test.go` -- `internal/adapters/seriatim/fake_test.go` -- `internal/stage/merge_test.go` -- `internal/stage/normalize_test.go` -- `internal/stage/trim_test.go` +## Config Mapping +Config fields consumed through runner/stage wiring are under `pipeline.seriatim.*`. -## Architectural Invariants -- Supported output schemas are limited to `seriatim-minimal`, `seriatim-intermediate`, `seriatim-full`. -- Final and final-trimmed outputs must include `segments` arrays. -- Merge/normalize/trim all route through deterministic subprocess invocation. +Maintained examples with Seriatim config: +- `examples/pipeline.full.annotated.yml` +- `examples/pipeline.production.yml`