2026-05-25 00:46:27 +00:00
|
|
|
# Stage: render
|
|
|
|
|
|
|
|
|
|
## Purpose
|
2026-08-09 21:50:21 +00:00
|
|
|
|
2026-05-25 00:46:27 +00:00
|
|
|
Render Markdown transcript artifacts from normalized JSON transcripts via Seriatim.
|
2026-08-29 18:00:22 +00:00
|
|
|
It runs after `trim` and before `extract` in the canonical sequence. Render and
|
|
|
|
|
extract are independent sibling consumers: replacing render output does not
|
|
|
|
|
invalidate extraction, but it does invalidate succeeded analysis and delivery
|
|
|
|
|
records that may consume rendered transcripts.
|
2026-05-25 00:46:27 +00:00
|
|
|
|
|
|
|
|
## Inputs
|
2026-08-09 21:50:21 +00:00
|
|
|
|
2026-05-25 00:46:27 +00:00
|
|
|
- `narratio.transcript.final` (`transcripts/final.json`)
|
|
|
|
|
- `narratio.transcript.final_trimmed` (`transcripts/final.trimmed.json`)
|
|
|
|
|
|
|
|
|
|
## Outputs
|
2026-08-09 21:50:21 +00:00
|
|
|
|
2026-05-25 00:46:27 +00:00
|
|
|
- `narratio.transcript.final_markdown` -> `transcripts/final.md`
|
|
|
|
|
- `narratio.transcript.final_trimmed_markdown` -> `transcripts/final.trimmed.md`
|
|
|
|
|
|
|
|
|
|
## Key Behavior
|
2026-08-09 21:50:21 +00:00
|
|
|
|
2026-05-25 00:46:27 +00:00
|
|
|
- uses `pipeline.render` settings (enabled/format/title/booleans).
|
|
|
|
|
- resolves inputs manifest-first, then canonical fallback.
|
|
|
|
|
- writes run-local outputs first, then materializes canonical session outputs.
|
|
|
|
|
- records input provenance, output paths, adapter metadata, logs, and generated config refs.
|
2026-08-10 23:18:29 +00:00
|
|
|
- when `pipeline.render.enabled=false`, completes successfully with no outputs
|
|
|
|
|
and records explanatory metadata. This is not an explicit self-skip: both
|
2026-08-30 13:03:13 +00:00
|
|
|
manifests record success. Because enablement is fingerprinted, enabling
|
|
|
|
|
render later automatically makes the prior result non-resumable.
|
2026-05-25 00:46:27 +00:00
|
|
|
|
|
|
|
|
## Failure Semantics
|
2026-08-09 21:50:21 +00:00
|
|
|
|
2026-05-25 00:46:27 +00:00
|
|
|
- missing normalized input fails with normalize rerun guidance.
|
|
|
|
|
- missing trimmed input fails with trim rerun guidance.
|
|
|
|
|
- adapter/subprocess failure fails stage.
|
|
|
|
|
- empty render output files fail validation.
|
|
|
|
|
|
|
|
|
|
## Invariants
|
2026-08-09 21:50:21 +00:00
|
|
|
|
2026-05-25 00:46:27 +00:00
|
|
|
- only `format: markdown` is supported.
|
|
|
|
|
- render stage owns production of built-in Markdown transcript sources.
|
2026-08-09 21:50:21 +00:00
|
|
|
|
2026-08-30 13:03:13 +00:00
|
|
|
## Resume Semantics
|
|
|
|
|
|
|
|
|
|
The versioned semantic fingerprint covers enablement, final format, resolved
|
|
|
|
|
title (including the session-title fallback), timestamp, segment-ID and
|
|
|
|
|
metadata inclusion, both canonical input identities, and both Markdown output
|
|
|
|
|
identities. Seriatim's executable, timeout, and report behavior are operational
|
|
|
|
|
and do not invalidate rendered transcripts. A render-only change leaves the
|
|
|
|
|
independent `extract` sibling reusable while invalidating their shared
|
|
|
|
|
downstream consumers.
|
|
|
|
|
|
2026-08-09 21:50:21 +00:00
|
|
|
## Related Contracts And Tests
|
|
|
|
|
|
|
|
|
|
- [Seriatim](../integrations/seriatim.md) owns render subprocess behavior.
|
|
|
|
|
- [Configuration](../config.md#pipeline) owns render fields and defaults.
|
|
|
|
|
- Implementation and tests: `internal/stage/render.go`,
|
2026-08-30 13:03:13 +00:00
|
|
|
`internal/stage/render_test.go`,
|
|
|
|
|
`internal/stage/semantic_contracts_refinement.go`
|