feat(boatstack): per-surface visual capture harnesses - #258
Merged
Conversation
A repository with more than one product surface (web app + ops console) can register one capture command per surface: - plan scenarios gain an optional surface field (lowercase kebab; omitempty keeps existing manifest fingerprints byte-stable) - project.commands["visual:<surface>"] outranks the global alias ladder; absence falls back to it exactly (zero-value invariant) - capability-register --surface writes the surface-scoped key through the same source-config → export path - capture resolves every scenario's command before any harness runs; an unresolvable surface is refused naming the exact missing key - harness contract gains BOATSTACK_CAPTURE_SURFACE (runner env + provisioning guide) - auto-capture (ensureCurrentPRVisualEvidence) treats the capability as resolvable iff every declared surface resolves Disclosure-Reviewed: reviewed — public-safe only, private facet kept out of this commit
bigboateng
force-pushed
the
visual-evidence-5-surfaces
branch
from
July 31, 2026 11:52
67e2942 to
a9638b0
Compare
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
One global
visualcommand forces a repository with several product surfaces (web app, ops console, admin) to fake a single harness that dispatches internally. Per-surface registration makes the harness selection declarative and lets the auto-capture pipeline (#255) serve multi-surface plans.What changed
PRVisualScenario.Surface(optional, lowercase kebab, validated in plan validation;omitemptykeeps existing manifest fingerprints byte-stable).ResolveCapabilityForSurface:project.commands["visual:<surface>"]outranks the global alias ladder; an empty or unregistered surface falls back to it exactly — one global harness keeps serving every surface (zero-value invariant).resolveScenarioCaptureCommands: capture resolves every scenario's command before any harness runs; an unresolvable surface is refused naming the exact missing key and thecapability-register --surfacefix. Auto-capture treats the capability as resolvable iff every declared surface resolves.capability-register --surface <s>writes the surface-scoped key through the same source-config → export path; slug-validated.BOATSTACK_CAPTURE_SURFACE(exec runner env + provisioning-guide contract text, kept in lockstep).references/config-schema.md(project.commands) andCONFIGURATION.md.project.commandsis a free map, so no new doc-parity markers are owed.Invariants pinned
TestResolveCapabilityForSurfacePrefersSurfaceScopedCommand— outranking + exact fallback + unavailable.TestCaptureEvidenceResolvesPerSurfaceCommands— two surfaced scenarios run their own commands with the surface visible to the runner; removing the global fallback refuses up front namingvisual:ops, with zero harness runs.TestRegisterCapabilityCommandWithSurface— registration round-trips through resolution; invalid slug rejected.Verification
go build && go vet && go test ./...green;release_notes.py preflightPASS. Release note:2026-07-30-per-surface-capture-harnesses.md.Slice 5 of 5 — completes the program (staleness fixpoint #254, auto-capture #255, escalation #256, attach retry #257).