feat: capture native structural observations - #96
Merged
Conversation
abrichr
force-pushed
the
codex/capture-structural-post-94
branch
from
August 27, 2026 17:22
4a9293f to
78c0be9
Compare
abrichr
force-pushed
the
codex/capture-structural-post-94
branch
from
August 27, 2026 21:30
78c0be9 to
ba98574
Compare
The linux extra adds a platform-gated PyGObject dependency. Lock it so the committed uv.lock describes the project's optional dependency groups. uv resolves this to two Linux-only wheels, pygobject and pycairo, and changes no already-resolved version. It also rewrites the lock in the current file format, which accounts for the bulk of the diff. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
abrichr
force-pushed
the
codex/capture-structural-post-94
branch
from
August 27, 2026 22:18
ba98574 to
96a1b35
Compare
abrichr
marked this pull request as ready for review
August 27, 2026 22: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.
What this changes
Capture now records live macOS Accessibility and Linux AT-SPI evidence beside the action event. Provider failures stay nonfatal and keep an explicit unavailable result.
The macOS provider first asks the system-wide Accessibility object for the focused element. It falls back to the frontmost application when macOS does not return that value. The Linux extra keeps PyGObject below 3.50 so it remains compatible with the documented GLib 2.64 baseline.
Stack
This PR is stacked on #94 and must merge after it. The remote #94 branch currently lacks its local frame-interval fix at
fba6c745, so this draft temporarily includes that commit. The diff will narrow when #94 updates.This change does not add the terminal manifest or sealed-load contract. That work touches #94-owned capture files and belongs in the next stack layer.
Verification
ruff check openadapt_capturescripts/verify_distribution.pygit diff --checkpassedTwo things a later reader needs
Adding an extra to
pyproject.tomlbreaks the sealed fixtures unlessuv.lockmoves with it. This PR adds thelinuxextra. CI runsuv sync --extra dev; onmainthe committed lock already satisfiespyproject.toml, so nothing is rewritten and the fixtures' pinnedbuilder.lock_sha256still matches. With a new extra the lock goes stale,uv syncre-locks,sha256(uv.lock)changes, andtests/test_synthetic_fixtures.pyfails on both fixtures for every Python version. Measured in one worktree with one uv: main's pair produced a stable lockfb9a77ab..., this branch'spyproject.tomlproduced a rewritten8758039f.... #107 later narrowed the recorded provenance to the determinants that actually decide the fixture bytes, which is what resolved this. The narrowing was established by experiment: re-locking and regenerating with the old hash held produced byte-identical artifacts, so the lock's contents were causally inert and only its recorded hash was not.A pre-rebase commit is preserved at
rescue/capture-96-pre-forcepush-c61d17a. Two files live only there and are referenced by nothing onmainor on this head:scripts/read_structural_fixture_output.pyand its testtests/test_structural_fixture_output.py. They look like a fixture-output reader someone wrote and then lost. Take them from the rescue branch if you want them.