From 7ebda0e87a3d885f6ecc9ce1400fc179f0fd3f06 Mon Sep 17 00:00:00 2001 From: "pulse-triage[bot]" <249995291+pulse-triage[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 20:16:39 +0100 Subject: [PATCH] Migrate committed release visual evidence Carry an explicit model-selection decision in every existing visual sidecar and enforce that invariant for future packets after the visual-plan schema became evidence-bearing. --- .../subsystems/deployment-installability.md | 3 +- ...RELEASE_NOTES_v6.4.0-rc.11.md.visuals.json | 1 + ...RELEASE_NOTES_v6.4.0-rc.12.md.visuals.json | 1 + ...RELEASE_NOTES_v6.4.0-rc.13.md.visuals.json | 1 + .../installtests/build_release_assets_test.go | 28 +++++++++++++++++++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/release-control/v6/internal/subsystems/deployment-installability.md b/docs/release-control/v6/internal/subsystems/deployment-installability.md index 16a4da7f5..1edebb9e2 100644 --- a/docs/release-control/v6/internal/subsystems/deployment-installability.md +++ b/docs/release-control/v6/internal/subsystems/deployment-installability.md @@ -69,7 +69,8 @@ Canonical publish triggers rerun visual evidence discovery and selection for the exact notes and comparison range being dispatched. A committed visual sidecar is review material only and cannot substitute for that run. The model may still select zero captures when its investigation finds that screenshots add no -meaningful customer value. +meaningful customer value. Committed sidecars remain schema-valid review +records and retain the evidence-backed reason for selecting captures or none. Customer-facing notes use one outcome list for features and fixes. Each visible change is described once under `What's improved`; a parallel `Fixes` section is diff --git a/docs/releases/RELEASE_NOTES_v6.4.0-rc.11.md.visuals.json b/docs/releases/RELEASE_NOTES_v6.4.0-rc.11.md.visuals.json index bc7713b0f..c52bb2d9a 100644 --- a/docs/releases/RELEASE_NOTES_v6.4.0-rc.11.md.visuals.json +++ b/docs/releases/RELEASE_NOTES_v6.4.0-rc.11.md.visuals.json @@ -1,5 +1,6 @@ { "schema_version": 1, + "decision": "The inline View preferences and mobile Settings workspace are the clearest static demonstrations of this candidate's visible workflow improvements.", "captures": [ { "id": "inline-view-preferences", diff --git a/docs/releases/RELEASE_NOTES_v6.4.0-rc.12.md.visuals.json b/docs/releases/RELEASE_NOTES_v6.4.0-rc.12.md.visuals.json index 87008c94d..f8440bd3d 100644 --- a/docs/releases/RELEASE_NOTES_v6.4.0-rc.12.md.visuals.json +++ b/docs/releases/RELEASE_NOTES_v6.4.0-rc.12.md.visuals.json @@ -1,4 +1,5 @@ { "schema_version": 1, + "decision": "The updater fallback and provider normalization corrections do not have a meaningful deterministic static UI comparison.", "captures": [] } diff --git a/docs/releases/RELEASE_NOTES_v6.4.0-rc.13.md.visuals.json b/docs/releases/RELEASE_NOTES_v6.4.0-rc.13.md.visuals.json index 87008c94d..af433d790 100644 --- a/docs/releases/RELEASE_NOTES_v6.4.0-rc.13.md.visuals.json +++ b/docs/releases/RELEASE_NOTES_v6.4.0-rc.13.md.visuals.json @@ -1,4 +1,5 @@ { "schema_version": 1, + "decision": "The Docker daemon cadence and host-agent identity corrections do not have a meaningful deterministic static UI comparison.", "captures": [] } diff --git a/scripts/installtests/build_release_assets_test.go b/scripts/installtests/build_release_assets_test.go index be125894e..6148ab6d6 100644 --- a/scripts/installtests/build_release_assets_test.go +++ b/scripts/installtests/build_release_assets_test.go @@ -7,6 +7,7 @@ import ( "crypto/rand" "crypto/sha256" "encoding/base64" + "encoding/json" "os" "os/exec" "path/filepath" @@ -3240,6 +3241,33 @@ func TestReleaseTriggersReevaluateVisualsInsteadOfTrustingSidecars(t *testing.T) } } +func TestCommittedReleaseVisualSidecarsCarrySelectionEvidence(t *testing.T) { + paths, err := filepath.Glob(repoFile("docs", "releases", "*.visuals.json")) + if err != nil { + t.Fatalf("glob release visual sidecars: %v", err) + } + if len(paths) == 0 { + t.Fatal("no committed release visual sidecars found") + } + for _, path := range paths { + content, err := os.ReadFile(path) + if err != nil { + t.Fatalf("read %s: %v", path, err) + } + var plan struct { + SchemaVersion int `json:"schema_version"` + Decision string `json:"decision"` + Captures json.RawMessage `json:"captures"` + } + if err := json.Unmarshal(content, &plan); err != nil { + t.Fatalf("parse %s: %v", path, err) + } + if plan.SchemaVersion != 1 || strings.TrimSpace(plan.Decision) == "" || len(plan.Captures) == 0 { + t.Fatalf("%s must carry schema version, visual selection evidence, and a captures decision", path) + } + } +} + func assertFileContainsAllNormalized(t *testing.T, path string, required ...string) { t.Helper() content, err := os.ReadFile(path)