diff --git a/README.md b/README.md index 946c39a..cf8d54a 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,8 @@ Trim outputs and diagnostics: - `logs/scriptorium.bounds.render.stderr.log` - `config/scriptorium.bounds.render.generated.yml` +Render-debug files are diagnostics and are not treated as canonical stage output artifact refs. + ## Scriptorium Configuration `pipeline.scriptorium` is optional. When present, Narratio validates and uses it for analyze-stage artifact generation. diff --git a/architecture.md b/architecture.md index 9c45683..0495cbb 100644 --- a/architecture.md +++ b/architecture.md @@ -196,6 +196,8 @@ Expected trim outputs and diagnostics: - `logs/scriptorium.bounds.render.stderr.log` - `config/scriptorium.bounds.render.generated.yml` +Render-debug files are diagnostics. They are recorded in stage metadata/log/config refs and are not treated as canonical stage output artifact refs. + ## 8. Analyze Stage (Current Implementation) The current real analyze implementation supports only `scriptorium.artifacts.session_recap`. diff --git a/internal/adapters/seriatim/runner.go b/internal/adapters/seriatim/runner.go index 17bd295..313ba3d 100644 --- a/internal/adapters/seriatim/runner.go +++ b/internal/adapters/seriatim/runner.go @@ -6,8 +6,6 @@ import ( "time" ) -// TODO: implement a real Seriatim subprocess adapter. - // Runner is the adapter boundary for seriatim merge/trim invocations. type Runner interface { Run(ctx context.Context, req MergeRequest) (MergeResult, error) diff --git a/internal/config/config.go b/internal/config/config.go index e65382d..66db116 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -84,7 +84,7 @@ type AuditaConfig struct { Report *bool `yaml:"report"` } -// TrimConfig configures the future trim stage boundary. +// TrimConfig configures trim-stage transcript boundary behavior. type TrimConfig struct { Enabled bool `yaml:"enabled"` OutputPath string `yaml:"output_path"` diff --git a/internal/stage/trim.go b/internal/stage/trim.go index c02d096..517eaf0 100644 --- a/internal/stage/trim.go +++ b/internal/stage/trim.go @@ -329,14 +329,6 @@ func (trimStage) Run(ctx context.Context, env *Env, m *manifest.Manifest) (*Stag AbsolutePath: finalBoundsOutputPath, }, } - if renderOutputPath != "" { - outputs = append(outputs, artifacts.Ref{ - Kind: "session_bounds_render", - Category: "artifacts", - SessionID: sessionID, - AbsolutePath: renderOutputPath, - }) - } return &StageResult{ Outputs: outputs, diff --git a/internal/stage/trim_test.go b/internal/stage/trim_test.go index 76a025e..dd1e220 100644 --- a/internal/stage/trim_test.go +++ b/internal/stage/trim_test.go @@ -112,6 +112,33 @@ func TestTrimStageRecordsLogAndGeneratedConfigRefs(t *testing.T) { } } +func TestTrimStageRenderDebugDiagnosticsAreNotStageOutputs(t *testing.T) { + env, m, scr, _ := setupTrimEnv(t) + paths := env.ArtifactStore.SessionPaths(m.SessionID) + writeFile(t, filepath.Join(paths.TranscriptsDir, "processed.json"), `{"segments":[{"id":1},{"id":2}]}`) + scr.BoundsBody = `{"trim_action":"trim","start_segment_id":1,"end_segment_id":2}` + + cfg := *env.Config.Pipeline.Trim + cfg.Bounds.RenderDebug = true + env.Config.Pipeline.Trim = &cfg + + result, err := (trimStage{}).Run(context.Background(), env, m) + if err != nil { + t.Fatalf("trim.Run() error = %v", err) + } + if len(scr.RenderRequests) != 1 { + t.Fatalf("scriptorium render requests = %d, want 1", len(scr.RenderRequests)) + } + for _, out := range result.Outputs { + if out.Kind == "session_bounds_render" { + t.Fatalf("render diagnostics should not be stage outputs: %#v", result.Outputs) + } + } + if result.Metadata["bounds_render_output_path"] == nil { + t.Fatalf("bounds_render_output_path metadata missing: %#v", result.Metadata) + } +} + func TestTrimStageFailsWhenProcessedTranscriptMissing(t *testing.T) { env, m, _, _ := setupTrimEnv(t) _, err := (trimStage{}).Run(context.Background(), env, m)