diff --git a/docs/config.md b/docs/config.md index c54c0ce..e9f7e5b 100644 --- a/docs/config.md +++ b/docs/config.md @@ -133,95 +133,95 @@ Operational notes: Defaults listed here are effective runtime defaults after load. -| Path | Type | Required | Default | Constraints / Notes | -| --- | --- | --- | --- | --- | -| `pipeline.workspace.root` | string | Yes | none | Must be non-empty. | -| `pipeline.workspace.cleanup_after_archive` | bool | No | `false` | Run-scoped workdir cleanup after successful archive commit. | -| `pipeline.secrets.env_dir` | string | Conditional | none | If `pipeline.secrets` is set, `env_dir` must be non-empty. | -| `pipeline.storage.backend` | string | No | empty | `s3` enables S3 archive decision path checks. | -| `pipeline.storage.bucket` | string | No | empty | Accepted by schema; compatibility field. | -| `pipeline.storage.prefix` | string | No | empty | Accepted by schema; compatibility field. | -| `pipeline.storage.s3.bucket` | string | Conditional | empty | Required when S3 session audio is used or S3 archive upload is enabled. | -| `pipeline.storage.s3.root_prefix` | string | No | `dnd` | Must be relative, non-empty, no `..`. | -| `pipeline.storage.s3.region` | string | No | empty | Optional region hint for backend wiring. | -| `pipeline.storage.s3.endpoint` | string | No | empty | If provided, must not be all-whitespace. | -| `pipeline.storage.s3.force_path_style` | bool | No | `false` | S3-compatible endpoint toggle. | -| `pipeline.storage.s3.access_key_id_env` | string | No | `OBJECT_STORAGE_KEY_ID` | Must be a valid env var name. | -| `pipeline.storage.s3.secret_access_key_env` | string | No | `OBJECT_STORAGE_KEY` | Must be a valid env var name. | -| `pipeline.spool.root` | string | No | `/var/spool/narratio` | Local spool root. | -| `pipeline.spool.delete_audio_after_archive` | bool | No | `false` | Cleanup toggle for run-scoped spool audio. | -| `pipeline.archive.enabled` | bool | No | `true` | Archive stage enablement. | -| `pipeline.archive.upload_run` | bool | No | `true` | Run-record upload toggle when archive enabled. | -| `pipeline.archive.promote_artifacts[]` | list | No | two default rules | Defaults: `transcripts/trimmed.json` and `artifacts/session_recap.md`. | -| `pipeline.archive.promote_artifacts[].from` | string | Yes (per rule) | none | Must be relative, non-empty, no `..`. | -| `pipeline.archive.promote_artifacts[].to` | string | Yes (per rule) | none | Must be relative, non-empty, no `..`. | -| `pipeline.archive.promote_artifacts[].required` | bool | No | `true` | Defaults per rule if omitted. | -| `pipeline.whisperx.transcribe_url` | string | Yes | none | Must be a valid URL. | -| `pipeline.whisperx.language` | string | No | `en` | Passed to WhisperX adapter. | -| `pipeline.whisperx.timeout` | duration string | No | `30m` | Must parse as duration. | -| `pipeline.whisperx.retries` | int | No | `3` | Must be `>= 0`. | -| `pipeline.whisperx.retry_delay` | duration string | No | `2s` | Must parse as duration. | -| `pipeline.whisperx.concurrency` | int | No | `2` | Must be `> 0`. | -| `pipeline.seriatim.binary` | string | No | `seriatim` | Must be non-empty after defaults. | -| `pipeline.seriatim.timeout` | duration string | No | `10m` | Must parse as duration. | -| `pipeline.seriatim.output_schema` | string | No | `seriatim-intermediate` | Allowed: `seriatim-minimal`, `seriatim-intermediate`, `seriatim-full`. | -| `pipeline.seriatim.coalesce_gap` | float | No | `3.0` | Must be `>= 0`. | -| `pipeline.seriatim.report` | bool | No | `true` | Enables report output in Seriatim calls. | -| `pipeline.seriatim.env.overlap_word_run_gap` | float | No | unset | If set, must be `> 0`. | -| `pipeline.seriatim.env.overlap_word_run_reorder_window` | float | No | unset | If set, must be `> 0`. | -| `pipeline.seriatim.env.backchannel_max_duration` | float | No | unset | If set, must be `> 0`. | -| `pipeline.seriatim.env.filler_max_duration` | float | No | unset | If set, must be `> 0`. | -| `pipeline.audita.binary` | string | No | `audita` | Must be non-empty after defaults. | -| `pipeline.audita.timeout` | duration string | No | `3h` | Must parse as duration. | -| `pipeline.audita.llm_api_key_env` | string | No | empty | Name of env var to forward to Audita. | -| `pipeline.audita.modules[]` | list[string] | No | empty | If set, each must be one of `glossary`, `homophones`, `spoken_word`, `grammar`. | -| `pipeline.audita.base_url` | string | No | empty | If non-empty, must be a valid URL. | -| `pipeline.audita.model` | string | No | empty | Optional model override passed to Audita. | -| `pipeline.audita.total_llm_concurrency` | int | No | unset | If set, must be `> 0`. | -| `pipeline.audita.proposal_llm_concurrency` | int | No | unset | If set, must be `> 0`. | -| `pipeline.audita.validation_model` | string | No | empty | Optional validation model override. | -| `pipeline.audita.validation_llm_concurrency` | int | No | unset | If set, must be `> 0`. | -| `pipeline.audita.transcript_description` | string | No | empty | If provided, must not be all-whitespace. | -| `pipeline.audita.config_path` | string | No | empty | If provided, must not be all-whitespace. | -| `pipeline.audita.output_schema` | string | No | empty | Allowed: empty, `bare-segments`, `audita-v1`. | -| `pipeline.audita.work_dir_retention` | string | No | empty | Allowed: empty, `always`, `auto`, `never`. | -| `pipeline.audita.report` | bool | No | `true` | Enables Audita report output. | -| `pipeline.normalize.output_path` | string | No | `transcripts/normalized.json` | Must be non-empty after defaults. | -| `pipeline.normalize.output_schema` | string | No | `seriatim-intermediate` | Allowed: `seriatim-minimal`, `seriatim-intermediate`, `seriatim-full`. | -| `pipeline.normalize.report` | bool | No | `true` | Enables normalize report output. | -| `pipeline.trim.enabled` | bool | No | `false` | When `false`, trim bounds fields are not required. | -| `pipeline.trim.output_path` | string | Conditional | none | Required when `pipeline.trim.enabled=true`. | -| `pipeline.trim.bounds.prompt_id` | string | Conditional | none | Required when `pipeline.trim.enabled=true`. | -| `pipeline.trim.bounds.profile_id` | string | No | empty | Optional profile override. | -| `pipeline.trim.bounds.transcript_input_name` | string | Conditional | none | Required when `pipeline.trim.enabled=true`. | -| `pipeline.trim.bounds.output_path` | string | Conditional | none | Required when `pipeline.trim.enabled=true`. | -| `pipeline.trim.bounds.timeout` | duration string | No | `10m` | Must parse as duration when set. | -| `pipeline.trim.bounds.render_debug` | bool | No | `false` | Enables render-debug output for bounds prompt. | -| `pipeline.trim.bounds.render_output_path` | string | Conditional | none | Required when `render_debug=true`. | -| `pipeline.trim.seriatim.report` | bool | No | `false` | Trim-stage Seriatim report toggle. | -| `pipeline.scriptorium.binary` | string | No | `scriptorium` | Required only when `pipeline.scriptorium` is configured. | -| `pipeline.scriptorium.config_path` | string | No | empty | If provided, must not be all-whitespace. | -| `pipeline.scriptorium.timeout` | duration string | No | `10m` | Must parse as duration when set. | -| `pipeline.scriptorium.render_debug` | bool | No | `false` | Global render-debug toggle for Scriptorium adapter usage. | -| `pipeline.scriptorium.artifacts` | map | No | empty | Artifact-generation map keyed by artifact name. | -| `pipeline.scriptorium.artifacts..enabled` | bool | No | `false` | If `true`, `prompt_id` and `output_path` are required. | -| `pipeline.scriptorium.artifacts..render_debug` | bool | No | unset | Per-artifact render-debug override. | -| `pipeline.scriptorium.artifacts..prompt_id` | string | Conditional | none | Required when artifact is enabled. | -| `pipeline.scriptorium.artifacts..profile_id` | string | No | empty | Optional profile override. | -| `pipeline.scriptorium.artifacts..output_path` | string | Conditional | none | Required when artifact is enabled. | -| `pipeline.scriptorium.artifacts..timeout` | duration string | No | empty | If set, must parse as duration. | -| `pipeline.scriptorium.artifacts..inputs..source` | string | Conditional | none | Required when input is present; allowed values listed below. | -| `pipeline.scriptorium.artifacts..inputs..artifact` | string | No | empty | Used by `previous_session_artifact` source. | -| `pipeline.scriptorium.artifacts..inputs..path` | string | No | empty | Optional explicit path metadata. | -| `pipeline.scriptorium.artifacts..inputs..required` | bool | No | `false` | Input requirement flag for artifact generation. | -| `pipeline.scriptorium.artifacts..vars.` | map value | No | empty | Value must be string or boolean. | -| `pipeline.analyzer.binary_path` | string | No | empty | Optional analyzer binary override. | -| `pipeline.analyzer.timeout` | duration string | No | empty | If set, must parse as duration. | -| `pipeline.analyzer.artifacts.output_dir` | string | No | empty | Optional analyzer output directory hint. | -| `pipeline.analyzer.artifacts.types[]` | list[string] | No | empty | Optional analyzer artifact type list. | -| `pipeline.notification.backend` | string | No | empty | Optional notifier backend selector. | -| `pipeline.notification.recipient` | string | No | empty | Optional notification recipient target. | -| `pipeline.notification.timeout` | duration string | No | empty | If set, must parse as duration. | +| Path | Type | Required | Default | +| --- | --- | --- | --- | +| `pipeline.workspace.root` | string | Yes | none | +| `pipeline.workspace.cleanup_after_archive` | bool | No | `false` | +| `pipeline.secrets.env_dir` | string | Conditional | none | +| `pipeline.storage.backend` | string | No | empty | +| `pipeline.storage.bucket` | string | No | empty | +| `pipeline.storage.prefix` | string | No | empty | +| `pipeline.storage.s3.bucket` | string | Conditional | empty | +| `pipeline.storage.s3.root_prefix` | string | No | `dnd` | +| `pipeline.storage.s3.region` | string | No | empty | +| `pipeline.storage.s3.endpoint` | string | No | empty | +| `pipeline.storage.s3.force_path_style` | bool | No | `false` | +| `pipeline.storage.s3.access_key_id_env` | string | No | `OBJECT_STORAGE_KEY_ID` | +| `pipeline.storage.s3.secret_access_key_env` | string | No | `OBJECT_STORAGE_KEY` | +| `pipeline.spool.root` | string | No | `/var/spool/narratio` | +| `pipeline.spool.delete_audio_after_archive` | bool | No | `false` | +| `pipeline.archive.enabled` | bool | No | `true` | +| `pipeline.archive.upload_run` | bool | No | `true` | +| `pipeline.archive.promote_artifacts[]` | list | No | two default rules | +| `pipeline.archive.promote_artifacts[].from` | string | Yes (per rule) | none | +| `pipeline.archive.promote_artifacts[].to` | string | Yes (per rule) | none | +| `pipeline.archive.promote_artifacts[].required` | bool | No | `true` | +| `pipeline.whisperx.transcribe_url` | string | Yes | none | +| `pipeline.whisperx.language` | string | No | `en` | +| `pipeline.whisperx.timeout` | duration string | No | `30m` | +| `pipeline.whisperx.retries` | int | No | `3` | +| `pipeline.whisperx.retry_delay` | duration string | No | `2s` | +| `pipeline.whisperx.concurrency` | int | No | `2` | +| `pipeline.seriatim.binary` | string | No | `seriatim` | +| `pipeline.seriatim.timeout` | duration string | No | `10m` | +| `pipeline.seriatim.output_schema` | string | No | `seriatim-intermediate` | +| `pipeline.seriatim.coalesce_gap` | float | No | `3.0` | +| `pipeline.seriatim.report` | bool | No | `true` | +| `pipeline.seriatim.env.overlap_word_run_gap` | float | No | unset | +| `pipeline.seriatim.env.overlap_word_run_reorder_window` | float | No | unset | +| `pipeline.seriatim.env.backchannel_max_duration` | float | No | unset | +| `pipeline.seriatim.env.filler_max_duration` | float | No | unset | +| `pipeline.audita.binary` | string | No | `audita` | +| `pipeline.audita.timeout` | duration string | No | `3h` | +| `pipeline.audita.llm_api_key_env` | string | No | empty | +| `pipeline.audita.modules[]` | list[string] | No | empty | +| `pipeline.audita.base_url` | string | No | empty | +| `pipeline.audita.model` | string | No | empty | +| `pipeline.audita.total_llm_concurrency` | int | No | unset | +| `pipeline.audita.proposal_llm_concurrency` | int | No | unset | +| `pipeline.audita.validation_model` | string | No | empty | +| `pipeline.audita.validation_llm_concurrency` | int | No | unset | +| `pipeline.audita.transcript_description` | string | No | empty | +| `pipeline.audita.config_path` | string | No | empty | +| `pipeline.audita.output_schema` | string | No | empty | +| `pipeline.audita.work_dir_retention` | string | No | empty | +| `pipeline.audita.report` | bool | No | `true` | +| `pipeline.normalize.output_path` | string | No | `transcripts/normalized.json` | +| `pipeline.normalize.output_schema` | string | No | `seriatim-intermediate` | +| `pipeline.normalize.report` | bool | No | `true` | +| `pipeline.trim.enabled` | bool | No | `false` | +| `pipeline.trim.output_path` | string | Conditional | none | +| `pipeline.trim.bounds.prompt_id` | string | Conditional | none | +| `pipeline.trim.bounds.profile_id` | string | No | empty | +| `pipeline.trim.bounds.transcript_input_name` | string | Conditional | none | +| `pipeline.trim.bounds.output_path` | string | Conditional | none | +| `pipeline.trim.bounds.timeout` | duration string | No | `10m` | +| `pipeline.trim.bounds.render_debug` | bool | No | `false` | +| `pipeline.trim.bounds.render_output_path` | string | Conditional | none | +| `pipeline.trim.seriatim.report` | bool | No | `false` | +| `pipeline.scriptorium.binary` | string | No | `scriptorium` | +| `pipeline.scriptorium.config_path` | string | No | empty | +| `pipeline.scriptorium.timeout` | duration string | No | `10m` | +| `pipeline.scriptorium.render_debug` | bool | No | `false` | +| `pipeline.scriptorium.artifacts` | map | No | empty | +| `pipeline.scriptorium.artifacts..enabled` | bool | No | `false` | +| `pipeline.scriptorium.artifacts..render_debug` | bool | No | unset | +| `pipeline.scriptorium.artifacts..prompt_id` | string | Conditional | none | +| `pipeline.scriptorium.artifacts..profile_id` | string | No | empty | +| `pipeline.scriptorium.artifacts..output_path` | string | Conditional | none | +| `pipeline.scriptorium.artifacts..timeout` | duration string | No | empty | +| `pipeline.scriptorium.artifacts..inputs..source` | string | Conditional | none | +| `pipeline.scriptorium.artifacts..inputs..artifact` | string | No | empty | +| `pipeline.scriptorium.artifacts..inputs..path` | string | No | empty | +| `pipeline.scriptorium.artifacts..inputs..required` | bool | No | `false` | +| `pipeline.scriptorium.artifacts..vars.` | map value | No | empty | +| `pipeline.analyzer.binary_path` | string | No | empty | +| `pipeline.analyzer.timeout` | duration string | No | empty | +| `pipeline.analyzer.artifacts.output_dir` | string | No | empty | +| `pipeline.analyzer.artifacts.types[]` | list[string] | No | empty | +| `pipeline.notification.backend` | string | No | empty | +| `pipeline.notification.recipient` | string | No | empty | +| `pipeline.notification.timeout` | duration string | No | empty | Allowed `pipeline.scriptorium.artifacts..inputs..source` values: @@ -238,18 +238,18 @@ Allowed `pipeline.scriptorium.artifacts..inputs..source` values: ## 8. Full session reference -| Path | Type | Required | Default | Constraints / Notes | -| --- | --- | --- | --- | --- | -| `session.session_id` | string | Yes | none | Must be non-empty after template rendering. | -| `session.campaign` | string | Yes | none | Must be non-empty. Used in local/remote path modeling. | -| `session.date` | string | No | empty | Optional session metadata for prompts/artifacts. | -| `session.title` | string | No | empty | Optional session metadata for prompts/artifacts. | -| `session.inputs.audio_dir` | string | Conditional | empty | One audio-source option. Mutually exclusive with `audio_s3`. | -| `session.inputs.audio_files[]` | list[string] | Conditional | empty | One audio-source option. At least one entry can satisfy audio-source requirement. Mutually exclusive with `audio_s3`. | -| `session.inputs.audio_s3.prefix` | string | Conditional | none | Required if `audio_s3` object is present; must be relative, non-empty, no `..`. Mutually exclusive with `audio_dir` and `audio_files`. | -| `session.inputs.speakers_file` | string | Yes | none | Must be non-empty. | -| `session.inputs.autocorrect_file` | string | Yes | none | Must be non-empty. | -| `session.inputs.glossary_file` | string | Yes | none | Must be non-empty. | +| Path | Type | Required | Default | +| --- | --- | --- | --- | +| `session.session_id` | string | Yes | none | +| `session.campaign` | string | Yes | none | +| `session.date` | string | No | empty | +| `session.title` | string | No | empty | +| `session.inputs.audio_dir` | string | Conditional | empty | +| `session.inputs.audio_files[]` | list[string] | Conditional | empty | +| `session.inputs.audio_s3.prefix` | string | Conditional | none | +| `session.inputs.speakers_file` | string | Yes | none | +| `session.inputs.autocorrect_file` | string | Yes | none | +| `session.inputs.glossary_file` | string | Yes | none | Audio-source rule: