feat: qualify resilient native capture - #78
Merged
Conversation
This was referenced Aug 18, 2026
abrichr
added a commit
that referenced
this pull request
Aug 19, 2026
PR #78 targets codex/promote-capture-beta, so the branches: [main] filter on pull_request matched almost nothing. The pull request reports mergeStateStatus CLEAN with 1 check instead of the full set, which makes an unverified change look the same as a passing one. Remove the base-branch filter from the three pull_request triggers. The push trigger keeps branches: [main]. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
abrichr
force-pushed
the
codex/promote-capture-beta
branch
from
August 20, 2026 01:16
c937787 to
0848cf9
Compare
Make the native Capture path resilient to window movement, window resize, and stable multiple-monitor desktops, and add fail-closed release evidence. Capture behavior: - keep one encoded viewport for a window recording while the source window moves and resizes; scale each changed source frame to fit and letterbox it instead of dropping the frame - retain the fixed output viewport, current source viewport, exact content rectangle, and x/y coordinate scales, and translate input with the same current geometry - bind the session to one exact native window identity, and terminate the session on a lost window, capture failure, identity change, or unexpected output frame instead of retrying across an evidence gap - commit new window geometry only after its matching frame is captured - persist the MSS virtual-desktop origin and monitor rectangles, translate negative-origin and secondary-monitor input, and reject hot-plug, rotation, resolution, scale, and same-size layout changes as a new-recording boundary Browser boundary: - keep the passive browser-event schemas so old local captures stay readable - remove BrowserBridge, BrowserMode, run_browser_bridge, and direct replay from the published package API - exclude openadapt_capture/browser_bridge.py and chrome_extension/ from the wheel and the source archive, and drop websockets from runtime dependencies - make the former browser_events opt-in fail before any listener bind, encoder check, display access, or database creation Release gate: - add a manual production-qualification workflow bound to one exact protected-main SHA, with hosted install checks and live native tests - require successful exact-SHA test.yml and manually dispatched qualification evidence before release; missing, stale, partial, skipped, or failed evidence blocks publication - add CHANGELOG.md with the published v1.0.0 through v1.2.2 history and require a two-way match between stable tags and changelog sections The repository stays at the published v1.2.2 version. This change publishes nothing: both the release and the qualification workflows are workflow_dispatch only. This change carries no lifecycle label movement. The package stays Experimental in README.md and stays "Development Status :: 2 - Pre-Alpha" in pyproject.toml. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
abrichr
force-pushed
the
codex/capture-production-release-gates
branch
from
August 20, 2026 01:24
4595c87 to
7ecd665
Compare
abrichr
marked this pull request as ready for review
August 20, 2026 01:26
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.
Outcome
This pull request makes the native Capture path resilient to window movement,
window resize, and stable multiple-monitor desktops. It also adds fail-closed
production qualification and release evidence.
It was stacked on #76. #76 merged as
07990886b1e206bcc807ba95f822ef859e9b7325,and this branch is rebased onto that
main.Lifecycle labels held back
Capture moves from Experimental to Production in one visible change, at the
end, once its qualification evidence exists. There is no interim Beta step.
The rebase removed every Beta relabel this branch carried:
README.md**Status: Beta.**in the status banner (inherited from #76)README.md**Status: Beta.**for the window-scoped recording section (this branch's own). Replaced with the factual "implemented, with display-free unit coverage on every supported operating system", which keeps the release-gate wording.docs/DESIGN.mdREADME.md.pyproject.tomlDevelopment Status :: 4 - Beta(inherited from #76)CLAUDE.md,chrome_extension/README.mdThe pre-rebase head
4595c872b9d5c10e2207fe23314eb8b56c4aebf3is preserved onbranch
codex/capture-production-release-gates-original.Capture behavior
Flow PR #366 consumes these contracts.
Browser security boundary
The package shipped an unauthenticated Chrome-extension WebSocket and a legacy
direct replay API. That path contradicted the supported Playwright-only
governed browser boundary. This pull request:
BrowserBridge,BrowserMode,run_browser_bridge, and direct replay from the published package APIopenadapt_capture/browser_bridge.pyandchrome_extension/from wheel and source archiveswebsocketsfrom runtime dependenciesbrowser_events=Trueopt-in fail before any listener bind, encoder check, display access, or database creationNo repository in the organization imports
BrowserBridge,BrowserMode,run_browser_bridge, oropenadapt_capture.browser_bridge, so the removal hasno known downstream consumer.
Production release gate
The manual
production-qualification.ymlworkflow binds a request to one exactprotected-main SHA, builds and validates one wheel and source archive, runs
exact-wheel install/import/CLI/uninstall checks on hosted Ubuntu, macOS, and
Windows, runs live native tests on controlled hosts, requires at least two
stable physical monitors on each interactive host, and requires no skipped,
failed, missing, duplicate, or extra qualification jobs.
Both
release.ymlandproduction-qualification.ymlareworkflow_dispatchonly. Merging this pull request publishes nothing.
Version contract
The repository stays at the published v1.2.2 version.
CHANGELOG.mdcarriesthe published v1.0.0 through v1.2.2 history only. There is no untagged v1.3.0
section, and no downstream dependency floor moves.
No production-acceptance claim
Nothing in this change states that a customer accepted this software, that a
signed acceptance record exists, or that any deployment is qualified. The two
customer mentions are caveats: a customer RDP or Citrix deployment still needs
its own task- and environment-specific qualification.
Validation on the rebased head
openadapt_capture/python scripts/check_changelog.pypassedscripts/verify_distribution.pypython scripts/check_source_boundary.py --require-distpassedThe live production-qualification workflow has not run. It must run on an exact
merged main commit before any 1.3.0 release.
External setup still required before a release
Create a protected GitHub environment named
production-qualification,restricted to
mainand requiring a reviewer. It needs no secret. Provideself-hosted runner labels
self-hosted, Linux, X64, openadapt-capture-qualified,self-hosted, macOS, ARM64, openadapt-capture-qualified, andself-hosted, Windows, X64, openadapt-capture-qualified. Each runner needs avisible signed-in desktop, two physical monitors, native screen and input
permissions, reviewed
ffmpegandffprobeonPATH, and permission to injectqualification input.
🤖 Generated with Claude Code