13 KiB
Render Command Roadmap
Purpose and scope
This roadmap defines the future implementation plan for a top-level
seriatim render command. The first supported render format will be Markdown.
render should consume an existing normalized seriatim JSON artifact and emit a
human-facing presentation artifact. JSON remains the canonical machine-readable
seriatim artifact. Markdown output is disposable and reproducible from JSON.
This is a roadmap document. Do not update current-behavior docs until render
is implemented. The active architecture policy for this repository is
docs/policy/architecture.md; docs/architecture.md does not exist in this
checkout.
Non-goals
The first implementation must not:
- accept raw WhisperX JSON input;
- run merge, trim, normalize, overlap resolution, coalescing, autocorrect, or other merge-time transformations;
- change existing JSON artifact schemas;
- implement custom templates;
- implement Markdown-to-JSON round-tripping;
- implement paragraph or speaker-turn coalescing;
- implement SRT, VTT, TXT, HTML, or other non-Markdown renderers;
- add render report output;
- expose internal category labels, overlap metadata, or debug provenance by default.
Paragraphing, speaker-turn grouping, additional render formats, custom templates, and render reports may be considered later after the Markdown renderer is stable.
User-facing UX
Initial command:
seriatim render --input-file transcript.json --output-file transcript.md --format markdown
Required flags:
| Flag | Description |
|---|---|
--input-file |
Existing normalized seriatim JSON artifact. |
--output-file |
Rendered output path. |
--format |
Public output format name. Initially only markdown. |
Initial optional flags:
| Flag | Default | Description |
|---|---|---|
--title |
Transcript |
Markdown document title. |
--include-timestamps |
true |
Include segment start/end timestamps. |
--include-segment-ids |
false |
Include segment IDs for reference. |
--include-metadata |
false |
Include artifact metadata block. |
Use public CLI terminology format. Use internal implementation terminology
renderer.
Input and output contracts
Input:
- Must be an existing seriatim JSON output artifact.
- Must validate as one of the current public schemas:
seriatim-minimal,seriatim-intermediate, orseriatim-full. - Must not be interpreted as raw merge input or WhisperX JSON.
- Must not be transformed semantically before rendering.
Output:
- Initial format is Markdown.
- The output file is presentation-oriented, not canonical data.
- Output should be overwritten consistently with existing file-output behavior unless implementation finds a conflicting repository policy.
- Markdown output should be deterministic for identical input and render config.
Render model:
- Normalize all supported input schemas into a small internal render model.
- Segment fields should include ID, start, end, speaker, text, and categories.
- Full-schema-only fields such as source/provenance and overlap groups should not be required by renderers.
Markdown rendering policy
Default Markdown output should optimize for human reading.
Rules:
- Start with
# {title}. - Use stable
HH:MM:SStimestamps with seconds precision. - Use an en dash between start and end timestamps.
- Omit segment IDs by default.
- Omit metadata by default.
- Render speaker names in bold.
- Render segment text as normal prose unless category hints apply.
- Do not expose internal category names by default.
- Do not expose unknown categories by default.
- Do not fail on unknown categories.
- Omit overlap/debug metadata by default.
Category hints:
backgroundtext should be italicized.backchanneltext may be italicized.fillertext may be italicized.- Unknown categories should be ignored.
Example default shape:
# Transcript
[00:00:01-00:00:04] **Eric Rakestraw:** Hello there.
[00:00:05-00:00:08] **Mike Brown:** Welcome back, everyone.
[00:00:09-00:00:10] **Eric Rakestraw:** *Yeah.*
The roadmap uses an ASCII hyphen in the example for source compatibility. Implementation should use an en dash in the rendered Markdown output.
Internal architecture
Add a new internal/render package for render-specific behavior.
Responsibilities:
- read or accept parsed seriatim artifacts through a neutral artifact helper;
- normalize full/intermediate/minimal artifacts into a render model;
- expose a renderer registry keyed by public format names;
- provide the initial
markdownrenderer; - keep renderer code free of CLI, filesystem path, environment variable, and report concerns.
Artifact parsing:
- Do not import
internal/trimonly to parse render input. - Move or generalize artifact parsing into a neutral artifact helper that both
trimandrendercan use. - Keep schema validation through
schema.
Command boundary:
- CLI code should parse flags, construct validated config, and delegate.
- Config validation should live in
internal/config. - Filesystem read/write orchestration should live in
internal/renderor a narrow artifact/render run layer, following thetrimandnormalizeartifact-level command pattern. - Use existing JSON/text file writing conventions where practical.
Report support:
- Do not add
--report-filein the initial implementation. - Rendering is presentation output rather than semantic transformation, so reports are lower priority.
Validation and error handling
Validation should fail fast with contextual errors:
- missing
--input-file,--output-file, or--format; - input path does not exist or is a directory;
- output parent directory does not exist;
- malformed JSON;
- JSON that does not validate as a seriatim minimal/intermediate/full artifact;
- unsupported
--format; - output file write failure.
Important behavior:
- Raw WhisperX-style JSON must fail because it is not a seriatim output artifact.
- Unknown segment categories must not fail rendering.
- Empty transcripts should render deterministically.
- Negative or inverted timing should fail through existing schema validation.
- Commands should return errors to the root command; internal packages should not print.
Testing strategy
Add tests at the package level that owns each behavior:
- artifact parsing/normalization tests for all three public schemas;
- rejection tests for malformed JSON and raw WhisperX-like input;
- registry tests for resolving
markdownand rejecting unknown formats; - Markdown renderer tests for title, timestamps, speaker bolding, italicized category hints, unknown category handling, metadata flags, and segment ID flags;
- config tests for required flags, path validation, and format validation;
- CLI tests for command registration, end-to-end Markdown output, and error behavior;
- full repository test after integration.
Required validation commands after implementation:
go test ./internal/render ./internal/config ./internal/cli ./schema
go test ./...
go run ./cmd/seriatim --help
go run ./cmd/seriatim render --help
Documentation updates required
Do not update current-behavior docs until the command is implemented.
After implementation, update:
README.md: addrenderto the concise command summary if useful.docs/cli.md: add render command reference and workflow.docs/config.md: document render flags only if they belong in config reference.docs/operations.md: add render to the file workflow.docs/internal/artifacts.md: describe artifact parsing/render model internals.examples/: add a small synthetic Markdown render example if practical.
Open decisions
No blocking decisions remain for the initial roadmap.
Defaults chosen for the first implementation:
- initial format:
markdown; - initial title:
Transcript; - timestamps included by default;
- segment IDs omitted by default;
- metadata omitted by default;
- no initial render reports;
- no initial templates;
- no initial paragraph or speaker-turn coalescing.
Staged implementation plan
Stage 1: artifact reader and render model
Objective:
- Add neutral artifact parsing and normalization support for render input.
Likely packages:
internal/artifactinternal/renderschemainternal/trim, only if shared parsing moves out of trim
Implementation details:
- Move or generalize current trim artifact parsing into a neutral artifact helper that accepts minimal, intermediate, and full seriatim artifacts.
- Keep validation through
schema. - Add a render model with normalized segment fields: ID, start, end, speaker, text, categories.
- Preserve source artifact order and existing segment IDs.
- Do not add Markdown rendering in this stage.
Tests:
- Parse and normalize full, intermediate, and minimal artifacts.
- Reject malformed JSON.
- Reject raw WhisperX-like JSON.
- Preserve categories where present and use empty categories where absent.
Acceptance criteria:
- Render model can be produced from all current seriatim output schemas.
- Raw input formats are not accepted.
- Trim remains behavior-compatible if artifact parsing is shared.
Stage 2: renderer registry and Markdown renderer
Objective:
- Add renderer resolution and initial deterministic Markdown rendering.
Likely packages:
internal/render
Implementation details:
- Add renderer interface and registry keyed by public format name.
- Register
markdown. - Add Markdown options for title, timestamps, segment IDs, and metadata.
- Format timestamps as
HH:MM:SSwith seconds precision. - Italicize text for
background,backchannel, andfiller. - Ignore unknown categories.
- Keep renderer independent of CLI/config/filesystem.
Tests:
- Resolve
markdown. - Reject unknown renderer names.
- Render default transcript shape.
- Render without timestamps.
- Render with segment IDs.
- Render metadata only when requested.
- Render category hint italics.
- Ignore unknown categories without error.
Acceptance criteria:
- Markdown output is deterministic and human-readable.
- Renderer package has no Cobra, config, environment, or filesystem-path dependency.
Stage 3: render command configuration and CLI wiring
Objective:
- Add
seriatim renderas a top-level command.
Likely packages:
internal/configinternal/cliinternal/render
Implementation details:
- Add
RenderOptionsandRenderConfig. - Validate required input, output, and format flags.
- Reuse existing single-input and output-path validation helpers.
- Add
newRenderCommand. - Register render in root command.
- Add flags:
--input-file,--output-file,--format,--title,--include-timestamps,--include-segment-ids,--include-metadata. - Add
render.Run(ctx, cfg)for artifact-level orchestration.
Tests:
- Config required flag validation.
- Config format validation.
- CLI command is recognized.
- CLI end-to-end Markdown render from a small artifact.
- Root help includes
render.
Acceptance criteria:
seriatim render --input-file transcript.json --output-file transcript.md --format markdownworks.- CLI code remains thin and delegates to config/render packages.
Stage 4: validation, errors, and schema coverage
Objective:
- Harden user-facing failure behavior and all schema variants.
Likely packages:
internal/renderinternal/configinternal/cli
Implementation details:
- Wrap input read, artifact parse, unsupported format, and output write errors with useful context.
- Verify raw WhisperX-style input fails with an artifact validation error.
- Verify empty transcripts render deterministically.
- Verify output parent directory validation matches other commands.
Tests:
- Unsupported
--format. - Missing or directory input file.
- Malformed JSON.
- Raw WhisperX-like JSON.
- Output parent missing.
- Minimal, intermediate, and full schema CLI coverage.
Acceptance criteria:
- Error behavior matches repository conventions.
- All supported JSON artifact schemas are covered by tests.
Stage 5: documentation updates after implementation
Objective:
- Update current-behavior docs only after render exists.
Likely files:
README.mddocs/cli.mddocs/config.mddocs/operations.mddocs/internal/artifacts.mdexamples/README.md
Implementation details:
- Add concise user-facing render docs.
- Keep full flag reference in
docs/cli.md. - Keep config docs limited to actual render flags and path validation.
- Add a small synthetic render example if practical.
- Do not describe future render formats as implemented.
Tests:
- Run example command if an example is added.
- Run full Go tests after doc/example changes.
Acceptance criteria:
- Non-roadmap docs describe only implemented render behavior.
- README remains concise.
Stage 6: final integration hardening
Objective:
- Verify the feature is complete, deterministic, and aligned with architecture.
Likely packages:
cmd/seriatiminternal/cliinternal/configinternal/renderinternal/artifactschema
Implementation details:
- Run full tests and CLI help checks.
- Review package imports for boundary drift.
- Confirm no merge modules are invoked by render.
- Confirm no report flag slipped into v1.
- Confirm future formats can register without renaming the command.
Tests:
go test ./...go run ./cmd/seriatim --helpgo run ./cmd/seriatim render --help
Acceptance criteria:
- All tests pass.
- Render remains artifact-level and downstream-only.
- Markdown output is reproducible from JSON input and render flags.