Skip to content

feat(boatstack): per-surface visual capture harnesses - #258

Merged
bigboateng merged 1 commit into
mainfrom
visual-evidence-5-surfaces
Jul 31, 2026
Merged

feat(boatstack): per-surface visual capture harnesses#258
bigboateng merged 1 commit into
mainfrom
visual-evidence-5-surfaces

Conversation

@bigboateng

Copy link
Copy Markdown
Contributor

Why

One global visual command 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; omitempty keeps 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 the capability-register --surface fix. 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.
  • Harness contract gains BOATSTACK_CAPTURE_SURFACE (exec runner env + provisioning-guide contract text, kept in lockstep).
  • Docs: key convention in references/config-schema.md (project.commands) and CONFIGURATION.md. project.commands is 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 naming visual:ops, with zero harness runs.
  • TestRegisterCapabilityCommandWithSurface — registration round-trips through resolution; invalid slug rejected.
  • Plan validation: surface slug accepted/rejected cases.

Verification

go build && go vet && go test ./... green; release_notes.py preflight PASS. 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).

Base automatically changed from visual-evidence-4-attach-retry to main July 30, 2026 11:15
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
bigboateng force-pushed the visual-evidence-5-surfaces branch from 67e2942 to a9638b0 Compare July 31, 2026 11:52
@bigboateng
bigboateng merged commit 7bcc7dc into main Jul 31, 2026
12 checks passed
@bigboateng
bigboateng deleted the visual-evidence-5-surfaces branch July 31, 2026 11:57
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