feat(boatstack): plan-approved visual scenarios escalate suggest to require - #256
Merged
Conversation
…equire A plan that promises pixels cannot ship without them. When the approved plan declares pr_visual_evidence relevance relevant with scenarios, the configured suggest policy now ships with require semantics for that feature: publication blocks until current PASS evidence exists — deliberately even when no capture capability is registered (a missing harness is a provisioning gap the denial names, never a license to ship unverified). control-law: plan-approved-scenarios-imply-require - one predicate (visualEscalationApplies) decides escalation; everything downstream reads only the effective policy - context carries pr_visual_evidence_policy_source (configured|plan-escalated); the publication denial says why suggest blocked - escapes stay explicit: off globally, not_relevant + reason per feature - one-time effect: existing suggest+relevant previews report a changed context fingerprint after upgrade (release-noted) Disclosure-Reviewed: reviewed — public-safe only, private facet kept out of this commit
This was referenced Jul 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Even with auto-capture (#255),
suggeststill legally shipped aNOT_VERIFIEDgap — the exact loophole that let deliveries with approved visual scenarios reach review without screenshots until the operator prompted manually. This slice closes it: a plan that promises pixels cannot ship without them.What changed
visualEscalationApplies(configured, relevance, scenarioCount)invisual_evidence.go— fires forsuggest+ plan relevancerelevant+ ≥1 scenario. Deliberately independent of capture-capability availability (operator decision: block always; a missing harness is a provisioning gap the denial names).control-law: plan-approved-scenarios-imply-requireresolvePRVisualEvidencecomputes the effective policy at its single composition point, before any manifest override; everything downstream (BLOCKED coercion, preview frontmatter, the publish block,publishPRVisualEvidence's manual-required path) reads only the effective policy."require"was already legal frontmatter, so preview equality holds with no schema bump.PRContext.PRVisualEvidencePolicySource(configured|plan-escalated, JSON-only) +SafetyFinding.PolicySource— the publication denial explains: "The approved plan declares visual scenarios, so the configured suggest policy ships with require semantics for this feature."off(global),not_relevant+ reason (per feature). Manifests keep recording the configured policy verbatim (informational; effective policy is re-derived at every decode).references/config-schema.mdandCONFIGURATION.md(no new config keys → no new doc markers).Invariants pinned
TestSuggestEscalatesToRequireWhenPlanDeclaresScenarios— end-to-end with no capability registered: BLOCKED, policyrequire, sourceplan-escalated, publication denied with the escalation sentence and provisioning ladder (pins the block-always decision).TestVisualEscalationPredicate— full semantics table (offopt-out,not_relevantescape, configuredrequireneeds no escalation, zero scenarios never fire).TestNotRelevantPlanKeepsSuggestSemantics— the per-feature escape stayssuggest/NOT_APPLICABLE.Upgrade note
Existing
suggestpreviews for features with declared scenarios report a changed context fingerprint once — regenerate withpr-context. In the release note.Verification
go build && go vet && go test ./...green. Release note:2026-07-30-plan-approved-scenarios-escalate-to-require.md.Slice 3 of 5 (program: visual evidence as a deterministic delivery requirement); follows #254, #255.