# Stage: merge ## Purpose Normalize raw transcript inputs and merge into base transcript via Seriatim. ## Inputs - `transcripts/raw/*.json` - `inputs/speakers.yml` - `inputs/autocorrect.yml` ## Outputs - `transcripts/base.json` - optional `artifacts/seriatim.report.json` ## Key Behavior - discovers and validates raw transcript inputs. - normalizes each raw transcript (`seriatim.Normalize`) into run-local scratch output. - merges normalized inputs (`seriatim.Run`) into base transcript. - validates merged transcript and optional report JSON. - materializes canonical outputs and records stage logs/generated configs. ## Invariants - merge always consumes normalized forms of raw inputs. - base transcript must validate before stage success. - report output is config-gated. ## Resume Evidence Merge records a versioned semantic-configuration fingerprint for the Seriatim merge operation, output schema, coalesce gap, and every configured advanced merge transformation. A change reruns merge and stales only its fixed descendants; prepare and transcribe remain reusable. Binary path, timeout, report emission, logs, and diagnostic retention are operational exclusions. Configuration or resources loaded privately inside Seriatim are outside Narratio's observable contract and require `--force` when changed. An existing successful merge record without evidence reruns once when selected. ## Related Contracts And Tests - [Seriatim](../integrations/seriatim.md) owns subprocess and output semantics. - [Configuration](../config.md#pipeline) owns operator-selected Seriatim values. - Implementation and tests: `internal/stage/merge.go`, `internal/stage/merge_test.go`, `internal/stage/semantic_contracts_initial.go`, and `internal/stage/semantic_contracts_initial_test.go`