Track Audita v2 selections in polish resume evidence
This commit is contained in:
@@ -192,6 +192,7 @@ func TestExtractSemanticConfigExcludesLoadedCredentialChanges(t *testing.T) {
|
||||
first := loadNotariusCredentialForSemanticTest(t, firstName, "first-value")
|
||||
rotated := loadNotariusCredentialForSemanticTest(t, firstName, "rotated-value")
|
||||
renamed := loadNotariusCredentialForSemanticTest(t, secondName, "second-value")
|
||||
third := loadNotariusCredentialForSemanticTest(t, "NARRATIO_SEMANTIC_NOTARIUS_KEY_THREE", "third-value")
|
||||
|
||||
baseline := downstreamSemanticEnv()
|
||||
baseline.Config.Pipeline.Notarius.Credentials = []configkit.Secret{*first}
|
||||
@@ -221,6 +222,14 @@ func TestExtractSemanticConfigExcludesLoadedCredentialChanges(t *testing.T) {
|
||||
}
|
||||
})
|
||||
}
|
||||
baseline.Config.Pipeline.Notarius.Credentials = []configkit.Secret{*renamed, *third}
|
||||
multiple, err := (extractStage{}).SemanticConfigFingerprint(baseline)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !want.Equal(multiple) {
|
||||
t.Fatal("multiple credential references altered extract semantic fingerprint")
|
||||
}
|
||||
}
|
||||
|
||||
func loadNotariusCredentialForSemanticTest(t *testing.T, name, value string) *configkit.Secret {
|
||||
|
||||
@@ -2,7 +2,6 @@ package stage
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"gitea.maximumdirect.net/eric/narratio/internal/artifacts"
|
||||
@@ -11,7 +10,7 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
polishSemanticConfigVersion = 1
|
||||
polishSemanticConfigVersion = 2
|
||||
normalizeSemanticConfigVersion = 1
|
||||
trimSemanticConfigVersion = 1
|
||||
renderSemanticConfigVersion = 1
|
||||
@@ -19,9 +18,12 @@ const (
|
||||
|
||||
type polishSemanticConfig struct {
|
||||
Modules []string `json:"modules"`
|
||||
Overlay string `json:"overlay"`
|
||||
ProposalProfile string `json:"proposal_profile"`
|
||||
ValidationProfile string `json:"validation_profile"`
|
||||
TranscriptDescription string `json:"transcript_description"`
|
||||
OutputSchema string `json:"output_schema"`
|
||||
ExternalConfig string `json:"external_config"`
|
||||
ConfigPath string `json:"config_path"`
|
||||
OutputIdentity string `json:"output_identity"`
|
||||
}
|
||||
|
||||
@@ -65,16 +67,21 @@ func (polishStage) SemanticConfigFingerprint(env *Env) (manifest.SemanticConfigF
|
||||
return manifest.SemanticConfigFingerprint{}, fmt.Errorf("polish semantic configuration requires resolved pipeline config")
|
||||
}
|
||||
audita := env.Config.Pipeline.Audita
|
||||
modules := append([]string(nil), audita.Modules...)
|
||||
var modules []string
|
||||
if audita.Modules != nil {
|
||||
modules = append([]string{}, audita.Modules...)
|
||||
}
|
||||
for index := range modules {
|
||||
modules[index] = strings.TrimSpace(modules[index])
|
||||
}
|
||||
sort.Strings(modules)
|
||||
return FingerprintSemanticConfig(polishSemanticConfigVersion, polishSemanticConfig{
|
||||
Modules: modules,
|
||||
TranscriptDescription: strings.TrimSpace(audita.TranscriptDescription),
|
||||
OutputSchema: strings.TrimSpace(audita.OutputSchema),
|
||||
ExternalConfig: strings.TrimSpace(audita.ConfigPath),
|
||||
Overlay: audita.Overlay,
|
||||
ProposalProfile: audita.ProposalProfile,
|
||||
ValidationProfile: audita.ValidationProfile,
|
||||
TranscriptDescription: audita.TranscriptDescription,
|
||||
OutputSchema: audita.OutputSchema,
|
||||
ConfigPath: audita.ConfigPath,
|
||||
OutputIdentity: artifacts.ArtifactTranscriptPolished,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -13,6 +13,13 @@ func TestPolishSemanticConfigSensitivity(t *testing.T) {
|
||||
mutate func(*Env)
|
||||
}{
|
||||
{name: "modules", mutate: func(env *Env) { env.Config.Pipeline.Audita.Modules = []string{"terms", "speakers", "style"} }},
|
||||
{name: "module order", mutate: func(env *Env) { env.Config.Pipeline.Audita.Modules = []string{"terms", "speakers"} }},
|
||||
{name: "module repetition", mutate: func(env *Env) { env.Config.Pipeline.Audita.Modules = []string{"speakers", "terms", "terms"} }},
|
||||
{name: "modules omitted", mutate: func(env *Env) { env.Config.Pipeline.Audita.Modules = nil }},
|
||||
{name: "modules empty", mutate: func(env *Env) { env.Config.Pipeline.Audita.Modules = []string{} }},
|
||||
{name: "overlay", mutate: func(env *Env) { env.Config.Pipeline.Audita.Overlay = "testing" }},
|
||||
{name: "proposal profile", mutate: func(env *Env) { env.Config.Pipeline.Audita.ProposalProfile = "draft" }},
|
||||
{name: "validation profile", mutate: func(env *Env) { env.Config.Pipeline.Audita.ValidationProfile = "review" }},
|
||||
{name: "description", mutate: func(env *Env) { env.Config.Pipeline.Audita.TranscriptDescription = "live campaign" }},
|
||||
{name: "schema", mutate: func(env *Env) { env.Config.Pipeline.Audita.OutputSchema = "audita.transcript.v2" }},
|
||||
{name: "external config", mutate: func(env *Env) { env.Config.Pipeline.Audita.ConfigPath = "configs/other.yml" }},
|
||||
@@ -22,7 +29,6 @@ func TestPolishSemanticConfigSensitivity(t *testing.T) {
|
||||
name string
|
||||
mutate func(*Env)
|
||||
}{
|
||||
{name: "module order", mutate: func(env *Env) { env.Config.Pipeline.Audita.Modules = []string{"terms", "speakers"} }},
|
||||
{name: "runner settings", mutate: func(env *Env) {
|
||||
env.Config.Pipeline.Audita.Binary = "/opt/audita"
|
||||
env.Config.Pipeline.Audita.Timeout = "1h"
|
||||
@@ -31,6 +37,23 @@ func TestPolishSemanticConfigSensitivity(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestPolishSemanticConfigDistinguishesOmittedAndExplicitlyEmptyModules(t *testing.T) {
|
||||
env := refinementSemanticEnv()
|
||||
env.Config.Pipeline.Audita.Modules = nil
|
||||
omitted, err := (polishStage{}).SemanticConfigFingerprint(env)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
env.Config.Pipeline.Audita.Modules = []string{}
|
||||
empty, err := (polishStage{}).SemanticConfigFingerprint(env)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if omitted.Equal(empty) {
|
||||
t.Fatal("omitted and explicitly empty module selections have equal semantic evidence")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizeSemanticConfigSensitivity(t *testing.T) {
|
||||
assertRefinementChanges(t, normalizeStage{}, []struct {
|
||||
name string
|
||||
|
||||
Reference in New Issue
Block a user