Skip to content

feat(boatstack): plan-approved visual scenarios escalate suggest to require - #256

Merged
bigboateng merged 1 commit into
mainfrom
visual-evidence-3-escalation
Jul 30, 2026
Merged

feat(boatstack): plan-approved visual scenarios escalate suggest to require#256
bigboateng merged 1 commit into
mainfrom
visual-evidence-3-escalation

Conversation

@bigboateng

Copy link
Copy Markdown
Contributor

Why

Even with auto-capture (#255), suggest still legally shipped a NOT_VERIFIED gap — 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

  • New predicate visualEscalationApplies(configured, relevance, scenarioCount) in visual_evidence.go — fires for suggest + plan relevance relevant + ≥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-require
  • resolvePRVisualEvidence computes 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."
  • Escapes unchanged and explicit: off (global), not_relevant + reason (per feature). Manifests keep recording the configured policy verbatim (informational; effective policy is re-derived at every decode).
  • Docs: escalation rule + escapes in references/config-schema.md and CONFIGURATION.md (no new config keys → no new doc markers).

Invariants pinned

  • TestSuggestEscalatesToRequireWhenPlanDeclaresScenarios — end-to-end with no capability registered: BLOCKED, policy require, source plan-escalated, publication denied with the escalation sentence and provisioning ladder (pins the block-always decision).
  • TestVisualEscalationPredicate — full semantics table (off opt-out, not_relevant escape, configured require needs no escalation, zero scenarios never fire).
  • TestNotRelevantPlanKeepsSuggestSemantics — the per-feature escape stays suggest/NOT_APPLICABLE.
  • Updated managed-suggest expectations in existing tests (NOT_VERIFIED → BLOCKED) — the semantic change this PR is.

Upgrade note

Existing suggest previews for features with declared scenarios report a changed context fingerprint once — regenerate with pr-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.

…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
@bigboateng
bigboateng merged commit 146f50c into main Jul 30, 2026
12 checks passed
@bigboateng
bigboateng deleted the visual-evidence-3-escalation branch July 30, 2026 11:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant