Rename archive config and stage contract to publish

This commit is contained in:
2026-05-23 04:30:45 +00:00
parent f050b9dd54
commit df2c765b7f
24 changed files with 273 additions and 257 deletions

View File

@@ -164,33 +164,33 @@ func TestSpoolAndArchiveDefaults(t *testing.T) {
if cfg.Pipeline.Spool.Root != "/var/spool/narratio" {
t.Fatalf("spool.root = %q, want /var/spool/narratio", cfg.Pipeline.Spool.Root)
}
if cfg.Pipeline.Spool.DeleteAudioAfterArchive {
t.Fatalf("spool.delete_audio_after_archive = true, want false")
if cfg.Pipeline.Spool.DeleteAudioAfterPublish {
t.Fatalf("spool.delete_audio_after_publish = true, want false")
}
if cfg.Pipeline.Workspace.CleanupAfterArchive {
t.Fatalf("workspace.cleanup_after_archive = true, want false")
if cfg.Pipeline.Workspace.CleanupAfterPublish {
t.Fatalf("workspace.cleanup_after_publish = true, want false")
}
if cfg.Pipeline.Archive == nil {
if cfg.Pipeline.Publish == nil {
t.Fatal("archive should be initialized by defaults")
}
if cfg.Pipeline.Archive.Enabled == nil || !*cfg.Pipeline.Archive.Enabled {
t.Fatalf("archive.enabled = %#v, want true", cfg.Pipeline.Archive.Enabled)
if cfg.Pipeline.Publish.Enabled == nil || !*cfg.Pipeline.Publish.Enabled {
t.Fatalf("archive.enabled = %#v, want true", cfg.Pipeline.Publish.Enabled)
}
if cfg.Pipeline.Archive.UploadRun == nil || !*cfg.Pipeline.Archive.UploadRun {
t.Fatalf("archive.upload_run = %#v, want true", cfg.Pipeline.Archive.UploadRun)
if cfg.Pipeline.Publish.UploadRun == nil || !*cfg.Pipeline.Publish.UploadRun {
t.Fatalf("archive.upload_run = %#v, want true", cfg.Pipeline.Publish.UploadRun)
}
if len(cfg.Pipeline.Archive.PromoteArtifacts) != 1 {
t.Fatalf("archive.promote_artifacts len = %d, want 1 default", len(cfg.Pipeline.Archive.PromoteArtifacts))
if len(cfg.Pipeline.Publish.PromoteArtifacts) != 1 {
t.Fatalf("publish.outputs len = %d, want 1 default", len(cfg.Pipeline.Publish.PromoteArtifacts))
}
item := cfg.Pipeline.Archive.PromoteArtifacts[0]
item := cfg.Pipeline.Publish.PromoteArtifacts[0]
if item.Required == nil || !*item.Required {
t.Fatalf("archive.promote_artifacts[0].required = %#v, want true", item.Required)
t.Fatalf("publish.outputs[0].required = %#v, want true", item.Required)
}
if item.Source != "narratio.transcript.final_trimmed" {
t.Fatalf("archive.promote_artifacts[0].source = %q, want narratio.transcript.final_trimmed", item.Source)
t.Fatalf("publish.outputs[0].source = %q, want narratio.transcript.final_trimmed", item.Source)
}
if item.Dest != "transcripts/final.trimmed.json" {
t.Fatalf("archive.promote_artifacts[0].dest = %q, want transcripts/final.trimmed.json", item.Dest)
t.Fatalf("publish.outputs[0].dest = %q, want transcripts/final.trimmed.json", item.Dest)
}
}
@@ -202,8 +202,8 @@ func TestArchivePromotionValidation(t *testing.T) {
}{
{
name: "absolute dest path rejected",
ruleYML: `archive:
promote_artifacts:
ruleYML: `publish:
outputs:
- source: "narratio.transcript.final_trimmed"
dest: "/transcripts/final.trimmed.json"
`,
@@ -211,8 +211,8 @@ func TestArchivePromotionValidation(t *testing.T) {
},
{
name: "traversal dest path rejected",
ruleYML: `archive:
promote_artifacts:
ruleYML: `publish:
outputs:
- source: "narratio.transcript.final_trimmed"
dest: "../trimmed.json"
`,
@@ -220,8 +220,8 @@ func TestArchivePromotionValidation(t *testing.T) {
},
{
name: "invalid source rejected",
ruleYML: `archive:
promote_artifacts:
ruleYML: `publish:
outputs:
- source: "narratio.unknown"
dest: "transcripts/final.trimmed.json"
`,
@@ -229,8 +229,8 @@ func TestArchivePromotionValidation(t *testing.T) {
},
{
name: "duplicate destination rejected",
ruleYML: `archive:
promote_artifacts:
ruleYML: `publish:
outputs:
- source: "narratio.transcript.final_trimmed"
dest: "artifacts/shared.md"
- source: "narratio.transcript.final"
@@ -240,8 +240,8 @@ func TestArchivePromotionValidation(t *testing.T) {
},
{
name: "configured source requires configured artifact key",
ruleYML: `archive:
promote_artifacts:
ruleYML: `publish:
outputs:
- source: "narratio.artifact.session_recap"
dest: "artifacts/session_recap.md"
`,
@@ -253,8 +253,8 @@ func TestArchivePromotionValidation(t *testing.T) {
artifacts:
session_recap:
enabled: false
archive:
promote_artifacts:
publish:
outputs:
- source: "narratio.artifact.session_recap"
`,
wantErr: "destination cannot be derived",
@@ -288,8 +288,8 @@ func TestArchivePromotionLegacyTranscriptSourcesRejected(t *testing.T) {
for _, source := range legacyTranscriptSources {
t.Run(source, func(t *testing.T) {
pipelineYAML := testPipelineBaseYAML + `
archive:
promote_artifacts:
publish:
outputs:
- source: ` + source + `
dest: transcripts/final.trimmed.json
`
@@ -316,8 +316,8 @@ func TestArchivePromotionDerivesDestinationWhenOmitted(t *testing.T) {
{
name: "built in source derives canonical destination",
pipelineYML: testPipelineBaseYAML + `
archive:
promote_artifacts:
publish:
outputs:
- source: narratio.transcript.final
`,
wantDest: "transcripts/final.json",
@@ -331,8 +331,8 @@ scriptorium:
enabled: true
prompt_id: dnd.session_recap
output_path: artifacts/session_recap.md
archive:
promote_artifacts:
publish:
outputs:
- source: narratio.artifact.session_recap
`,
wantDest: "artifacts/session_recap.md",
@@ -349,11 +349,11 @@ archive:
if err := Validate(cfg); err != nil {
t.Fatalf("Validate() error = %v", err)
}
if len(cfg.Pipeline.Archive.PromoteArtifacts) != 1 {
t.Fatalf("archive.promote_artifacts len = %d, want 1", len(cfg.Pipeline.Archive.PromoteArtifacts))
if len(cfg.Pipeline.Publish.PromoteArtifacts) != 1 {
t.Fatalf("publish.outputs len = %d, want 1", len(cfg.Pipeline.Publish.PromoteArtifacts))
}
if cfg.Pipeline.Archive.PromoteArtifacts[0].Dest != tt.wantDest {
t.Fatalf("archive.promote_artifacts[0].dest = %q, want %q", cfg.Pipeline.Archive.PromoteArtifacts[0].Dest, tt.wantDest)
if cfg.Pipeline.Publish.PromoteArtifacts[0].Dest != tt.wantDest {
t.Fatalf("publish.outputs[0].dest = %q, want %q", cfg.Pipeline.Publish.PromoteArtifacts[0].Dest, tt.wantDest)
}
})
}
@@ -368,7 +368,7 @@ func TestArchiveLockValidation(t *testing.T) {
{
name: "valid built in source",
pipelineYML: testPipelineBaseYAML + `
archive:
publish:
locks:
- source: narratio.transcript.final_trimmed
reason: reviewed transcript
@@ -383,7 +383,7 @@ scriptorium:
enabled: true
prompt_id: dnd.session_recap
output_path: artifacts/session_recap.md
archive:
publish:
locks:
- source: narratio.artifact.session_recap
`,
@@ -391,25 +391,25 @@ archive:
{
name: "missing source rejected",
pipelineYML: testPipelineBaseYAML + `
archive:
publish:
locks:
- reason: no source
`,
wantErr: "pipeline.archive.locks[0].source is required",
wantErr: "pipeline.publish.locks[0].source is required",
},
{
name: "invalid source rejected",
pipelineYML: testPipelineBaseYAML + `
archive:
publish:
locks:
- source: narratio.unknown
`,
wantErr: "pipeline.archive.locks[0].source \"narratio.unknown\" is unsupported",
wantErr: "pipeline.publish.locks[0].source \"narratio.unknown\" is unsupported",
},
{
name: "duplicate source rejected",
pipelineYML: testPipelineBaseYAML + `
archive:
publish:
locks:
- source: narratio.transcript.final_trimmed
- source: " narratio.transcript.final_trimmed "
@@ -449,7 +449,7 @@ func TestArchiveLockLegacyTranscriptSourcesRejected(t *testing.T) {
for _, source := range legacyTranscriptSources {
t.Run(source, func(t *testing.T) {
pipelineYAML := testPipelineBaseYAML + `
archive:
publish:
locks:
- source: ` + source + `
`
@@ -469,7 +469,7 @@ archive:
func TestArchiveLockUnknownFieldFailsStrictDecode(t *testing.T) {
pipelineYAML := testPipelineBaseYAML + `
archive:
publish:
locks:
- source: narratio.transcript.final_trimmed
dest: transcripts/final.trimmed.json
@@ -483,8 +483,8 @@ archive:
func TestArchiveLegacyFromToFailsStrictDecode(t *testing.T) {
pipelineYAML := testPipelineBaseYAML + `
archive:
promote_artifacts:
publish:
outputs:
- from: transcripts/final.trimmed.json
to: transcripts/final.trimmed.json
`