7.9 KiB
Roadmap: Render Stage
Status: Completed
This roadmap defines a post-1.0 feature addition: a new render stage that uses seriatim render to produce human-readable Markdown versions of the final transcript artifacts.
Planned behavior belongs only in this roadmap until implementation lands. Current-behavior docs, examples, and command references must be updated only after the code is implemented and tested.
Goal
Add a first-class stage between trim and analyze:
preparetranscribemergepolishnormalizetrimrenderanalyzepublishnotify
The stage renders Markdown versions of:
narratio.transcript.finalnarratio.transcript.final_trimmed
The stage produces new built-in artifacts:
| Source ID | Canonical path | Output kind |
|---|---|---|
narratio.transcript.final_markdown |
transcripts/final.md |
transcript_final_markdown |
narratio.transcript.final_trimmed_markdown |
transcripts/final.trimmed.md |
transcript_final_trimmed_markdown |
Default publish outputs should include:
narratio.transcript.final_trimmednarratio.transcript.final_markdownnarratio.transcript.final_trimmed_markdown
Public Contract
Add pipeline.render with strict YAML decoding.
Fields:
| Field | Type | Default | Validation |
|---|---|---|---|
enabled |
bool | true |
optional |
format |
string | markdown |
only markdown is supported |
title |
string | empty | optional |
include_timestamps |
bool | true |
optional |
include_segment_ids |
bool | false |
optional |
include_metadata |
bool | false |
optional |
Title behavior:
- if
pipeline.render.titleis non-empty, pass it as--title; - otherwise, if
session.titleis non-empty, passsession.titleas--title; - otherwise, omit
--titleand let Seriatim use its default.
The initial implementation supports only Markdown. Future formats require explicit config validation and artifact naming decisions.
Implementation Stages
Stage 1: Artifact, Config, and Adapter Contracts
- Extend the transcript artifact model with the two Markdown built-ins.
- Register Markdown artifacts as text content in the artifact registry so they work in artifact resolution, publish outputs, locks, status, artifacts list, and Scriptorium inputs.
- Add
RenderConfigunderPipelineConfigand apply defaults in the config loader/defaulting path. - Validate
pipeline.render.formatasmarkdownand keep unknown fields rejected by strict YAML decoding. - Extend the Seriatim adapter interface with
Render(ctx, RenderRequest). - Add subprocess support for
seriatim renderwith:--input-file--output-file--format markdown- optional
--title - explicit boolean behavior for timestamps, segment IDs, and metadata.
- Validate render output as non-empty text, not JSON.
- Write Seriatim render stdout/stderr logs and generated invocation config consistently with existing Seriatim stage calls.
Stage 2: Render Stage Runtime
- Add
renderStageto the stage package. - Insert
renderStage{}intostage.All()aftertrimStage{}and beforeanalyzeStage{}. - Make
run-stage render <session_id>work through the existing stage selection path. - If render is disabled, mark the stage succeeded with metadata and no outputs.
- If enabled, resolve inputs manifest-first using existing artifact resolution:
- final transcript from
narratio.transcript.final; - final trimmed transcript from
narratio.transcript.final_trimmed.
- final transcript from
- Render run-local Markdown outputs first, then materialize canonical outputs:
transcripts/final.mdtranscripts/final.trimmed.md
- Record manifest outputs with the new output kinds and source IDs.
- Record metadata for input paths/provenance, canonical/run-local output paths, format, resolved title, boolean render settings, adapter duration/exit code/binary, and adapter metadata.
- On missing required JSON inputs, fail clearly with guidance to run
normalizeortrimas appropriate.
Stage 3: Publish, Analyze, Docs, and Examples
- Update default publish outputs to include both Markdown artifacts in addition to final trimmed JSON.
- Ensure publish output destination derivation works for Markdown built-ins through the shared artifact policy path.
- Ensure Scriptorium input validation accepts Markdown built-ins as ordinary built-in sources.
- Update analyze missing-input guidance so required Markdown built-in inputs point operators to
run-stage render. - Update user/operator/internal docs only after implementation:
docs/cli.mddocs/config.mddocs/operations.mddocs/internal/README.mddocs/internal/artifacts.md- new
docs/internal/stage-render.md docs/integrations/seriatim.md
- Update examples only where useful; defaults should work without an explicit
pipeline.renderblock.
Seriatim Adapter Contract
Add a narrow render request/result beside the existing merge, normalize, and trim contracts.
Request fields:
- binary
- input transcript path
- output Markdown path
- format
- title
- include timestamps
- include segment IDs
- include metadata
- stdout log path
- stderr log path
- generated config path
- timeout
Result fields:
- output path
- stdout log path
- stderr log path
- generated config path
- exit code
- duration
- invoked binary
- format
- title
- metadata
The adapter owns subprocess command construction and validation of the non-empty output file. Stage logic should express intent in Narratio terms and should not construct subprocess arguments directly.
Testing Guidance
Focused tests:
internal/artifactmodelandinternal/artifacts- new Markdown source IDs, canonical paths, output kinds, producer stage, text validation, catalog ordering;
- resolver fallback from canonical Markdown paths;
- publish destination derivation for Markdown built-ins.
internal/config- render defaults;
- strict decode rejects unknown render fields;
- invalid format fails validation;
- default publish outputs include final trimmed JSON plus both Markdown artifacts.
internal/adapters/seriatim- render command args;
- title omission vs explicit title;
- boolean flag behavior;
- generated config;
- stdout/stderr logs;
- non-empty output validation;
- failure wrapping.
internal/stage- render resolves final and final-trimmed inputs from manifest outputs before canonical fallback;
- render writes run-local outputs and materializes canonical Markdown outputs;
- render records manifest outputs, logs, generated configs, and metadata;
- disabled render succeeds without outputs;
- missing final/final-trimmed inputs fail clearly.
internal/app- full plan order includes
render; run-stage render <session_id>works;- force rerunning render marks analyze, publish, and notify stale;
- status and artifacts list include Markdown built-ins;
- publish defaults include Markdown outputs.
- full plan order includes
Validation commands:
go test ./internal/artifactmodel ./internal/artifacts -vgo test ./internal/config -vgo test ./internal/adapters/seriatim -vgo test ./internal/stage -run Render -vgo test ./internal/app -run 'Plan|RunStage|Publish|Artifacts|Status' -vgo test ./...
Non-Goals
- Do not change existing JSON transcript source IDs, canonical paths, or output kinds.
- Do not make Markdown output paths configurable in the first implementation.
- Do not add additional render formats before the format naming and artifact naming contract is defined.
- Do not move Seriatim subprocess details into stage logic.
- Do not document the render stage as implemented outside this roadmap until implementation lands.
Assumptions
renderis enabled by default.- Markdown canonical paths are fixed built-in artifact paths.
format: markdownis the only supported initial format.- Both Markdown outputs are included in default publish outputs.
- Existing publish layout and current-state commit behavior remain unchanged.