4.0 KiB
4.0 KiB
Stage: publish
Purpose
Publish durable run/session state to object storage, then atomically advance remote current state.
Inputs and Outputs
Inputs:
- session manifest and prerequisite stage records
- run root contents under
runs/{run_id}/ - publish output rules with artifact
sourceIDs and publishdestpaths (pipeline.publish.outputs) - effective source-based publish locks from static config and remote session lock store
- session-level
previous/**cache files when present
Outputs:
- uploaded run files under
{session_prefix}/runs/{run_id}/... - uploaded published outputs under
{session_prefix}/... - uploaded session previous-cache files under
{session_prefix}/previous/...when present {session_prefix}/current/manifest.json{session_prefix}/current/run_id.txtwritten last
Boundaries
Owns:
- publish enable/disable gate behavior
- prerequisite stage success enforcement
- run file collection and upload (excluding
audio/) - publish output rule resolution and upload
- publish lock enforcement
- session previous-cache file collection/upload
- commit pointer publish order
Does not own:
- stage execution before publish
- post-publish local cleanup policy execution (handled by app cleanup logic)
Config Fields Used
pipeline.publish.enabledpipeline.publish.upload_runpipeline.publish.outputspipeline.publish.locks{session_prefix}/locks.ymlloaded by app orchestration before publish executionpipeline.storage.s3.bucketpipeline.storage.s3.root_prefixpipeline.workspace.rootsession.campaignsession.session_id
External Adapters Used
- Object storage backend (
env.ObjectStore) for upload/list primitives.
State and Manifest Behavior
- Requires
prepare,transcribe,merge,polish,normalize,trim, andanalyzestatussucceeded. - Resolves bucket/prefix from manifest identity first, then config fallback.
- Uploads session
previous/**files as durable session state when the localprevious/directory exists. - Skips top-level published output uploads for effective locked sources; run-local materialized outputs remain unchanged.
- When selected configured artifact keys are supplied, skips publish rules for unselected
narratio.artifact.<key>sources; built-in transcript and bounds outputs still publish. - Effective locks are the union of
pipeline.publish.locksand remote{session_prefix}/locks.yml; static pipeline locks win on duplicate sources. - Writes metadata including:
- upload counts/paths
previous_files_uploadedandprevious_uploaded_pathspublished_files_uploadedandpublished_pathsskipped_optional_outputsskipped_unselected_outputslocked_output_countandlocked_outputscurrent_manifest_keycurrent_run_id_keycurrent_pointer_written
- On skipped publish path, returns metadata with
skipped=trueand pointer not written.
Skip and Resume Behavior
- Stage may self-skip (metadata skip) when publish disabled or run upload disabled.
- Runner-level skip also applies for previously succeeded stage unless forced.
Failure Behavior
- Fails on missing prerequisite success, missing object store when required, missing run root, missing unlocked required output source, upload failures, or pointer write failures.
- Locked required outputs are intentional skips and do not fail publish.
- Pointer semantics are fail-safe:
current/run_id.txtis not written if prior required uploads fail.
Tests to Inspect Before Changing
internal/stage/archive_test.gointernal/app/post_archive_cleanup_test.go
Architectural Invariants
- Run upload excludes
audio/subtree. - Session
previous/**is publishable durable input/provenance state, not run-local output. - Ordinary
--forcedoes not override publish locks. - Malformed or unreadable remote lock store fails publish-capable execution before output uploads.
current/manifest.jsonuploads beforecurrent/run_id.txt.current/run_id.txtis the remote publish commit marker.