feat: capture native structural observations - #96
Conversation
4a9293f to
78c0be9
Compare
78c0be9 to
ba98574
Compare
|
Rebased onto merged #94 and force-pushed. The conflict is gone. Before: The six lower commits were #94's work. #94 squash-merged, so they could never replay cleanly — I rebased with Local suite on the rebased branch: 643 passed, 20 skipped, 13 deselected. What still fails, and why
The cause is one line in this PR: it adds the I measured it rather than guessing, same worktree, same uv: CI runs The fix, and why I am not applying it
I stopped short of doing this because step 1 is not small. This repo's committed lock predates the current uv, so the moment Bundling a lock-format migration and regenerated sealed fixtures into someone else's feature PR, during the freeze, without the fixture owner's input, is not mine to decide. The diagnosis is exact and the two steps are mechanical — whoever owns the synthetic-fixture contract should run them. Left open rather than closed: the rebase was the assigned action, it succeeded, and the code is now reviewable at 1,467 lines instead of 9,440. |
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>
ba98574 to
96a1b35
Compare
|
Merging after confirming the force-push at 17:29 dropped nothing that is still needed. The pre-force-push commit Comparing that commit's content against this PR's current head, by content rather than ancestry (a squash merge makes a new SHA, so ancestry lies here):
The first two were #94 content that arrived on main by squash merge, so dropping them from this branch was correct — that is exactly what the The last two exist only in The fixture-provenance blocker was resolved separately in #107 (merged), which narrowed the provenance to the determinants that actually decide the fixture bytes. That 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. |
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 --checkpassed