Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions evidence/pilot-pointer-ingress-20261006/QUALIFIED.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"scope": "Native source App/Pilot/driver/capture final-delivery contract, including real run_async. Not Batch05 causal identification, installed Toad, physical motion or latency.",
"sources": {
"src/textual/app.py": "0bb5b50ff4260453c72b2e189cd10ef1c8152c9cbf2eeb97dd42aba9b1e50ca9",
"src/textual/events.py": "dd039e7a82fa34b8e2057f624d800dda03d0271f631e56339ac177083448c6ce",
"src/textual/message.py": "e140b2018efa08c02d75aeddb29ab7d315d8ab2a48ad98a9db84cb21279653c6",
"src/textual/message_pump.py": "b4c732994a8203e7d6b274f60ecf073c1e0219d6fd3401275baa06c3da9ad089",
"src/textual/pilot.py": "b2054a216c3c6954dda68855171e2c047d23102e837d52be1ffea7f85e88d585",
"src/textual/screen.py": "8672e6e6c451148b7dcf724138389ce96b8824c2d72f5e121bde3a91b752d86f",
"tests/test_app.py": "b8abd10603eac0f6d0c16eb80bfaedc2821fb48f30cba27cbd563307a9b74c64",
"tests/test_selection.py": "9c808b55c2011bd87b96ab4c205eb28d9c0b72ed6996fb4c9ba11ab54ece57a6",
"tests/test_pilot_pointer_ingress.py": "5274eb5529df68d21d6f4c68a63b8e19cac618b1a5ac668e2ecd6bd4f9c8f5a9"
},
"keepers": {
"changed-path.log": "3ee2aa2b4c711d2da6cf28d1d0b397ca39bb4332b6abbca695712d823c5693ad",
"changed-path-final.log": "77ae39be709a48e9bfcae4df8ecbf81cd93293bc06ed5db6bdd054b90218db21",
"background-final.log": "2826a5e72c9f873a0370a41fe46a67989c4a682af951a8514eeb48dfd0b0e61b",
"overridden-consumer.log": "1d4a11fc90a7086c182cc06bc43bebeb59a36928082944ef103c86041aa4cf49",
"before.json": "26a0c05b07868e2f4f865463d871f1015c97c4c9e07ce19579a1db513e0659be",
"after.json": "3b8d68f02c9a132d49ceaeb9be89e68ec9afef754f9f3fbc4ab2a66f74f5e550"
},
"checks": {
"initial_batch": "160 passed, 1 fixture failure, 22 deselected in 27.62s",
"final_changed_paths": "5 passed, 1 Screen-id fixture failure in 1.31s",
"corrected_screen": "1 passed in .71s",
"overridden_consumer": "1 passed in .83s"
},
"provider_inputs": 0,
"physical_runs": 0,
"installed_changes": 0,
"competing_native_writer": "none; only this PR open at source completion"
}
19 changes: 19 additions & 0 deletions evidence/pilot-pointer-ingress-20261006/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Pilot pointer delivery

Pilot now queues raw pointer packets on App and borrows the existing dispatch completion. App alone matches a press/release and supplies the final Click receipt and chain. Screen fills the original MouseEvent recipient when it actually routes through capture/current geometry; Pilot no longer keeps the first hit or authors Clicks. The gesture's screen coordinates are acquired after initial layout settlement and stay fixed across the press/release.

The existing completion future now carries the final message. Its release still occurs after dispatch and call-next work on the owning pump. Screen uses an offset event for its own delivery as it already does for child delivery, retaining the raw App packet's completion. A release consumes its press even if no click is admitted.

Current consumer/source evidence is in before.json (native production/tests and read-only Toad production/tests/tools; zero parse omissions). Arbitrary external subclasses/dynamic getattr are not resolved by lexical AST. The existing overridden test on_event now returns the original owner's result.

Changed-path source Apps are qualified, including the actual run_async/HeadlessDriver entrypoint:

- Driver + Pilot share one click chain/modifiers; an unmatched second release produces no click.
- A target moved by press or hover is not reported as the final recipient.
- Capture governs release delivery even when another widget is under the pointer.
- A completed click retains its recipient if that handler removes the widget.
- Blank Screen delivery retains the raw App completion, and the changed inherited on_event/copy/drag consumer passes.

The initial batch passed 160 checks (155 existing Pilot/click-chain checks and five new ones); one new Screen fixture assertion failed because its Horizontal covered the chosen point. The final five changed-path checks passed after moving the existing pause before coordinate acquisition rather than adding a delay. Its corrected blank-Screen fixture then failed only on an invented null Screen id; the original default Screen id is _default. The exact Screen-identity assertion passes separately (.71s), as does the changed inherited consumer (.83s). All three raw logs, both fixture negatives, and the original Batch05 evidence remain distinct. No production repair was needed for either fixture assertion.

before.json/after.json include the actual MouseEvent.widget declaration/reads/writes. Native 249 production, 465 -> 466 tests; dependency Toad 288 production/403 tests/40 tools, zero omissions. Static Toad event.widget consumers were read: GridSelect walks recipient ancestors; Store and Conversation use the original Click recipient; no on_event override requires migration. Driver coroutine/thread delivery remains unchanged. Batch05 is preserved: its Shift click reported true but selected only batch-a. No click-time geometry was retained, so this source defect does not identify its sole cause. No Batch05 replay, installed pin change, provider or physical run.
Loading
Loading