Repository navigation
Conversation
|
Hi @avgbob, thanks for keeping this separate from #87. I reviewed The main idea checks out: in a synthetic full-pipeline pinch sequence, two established contacts converging to four grid cells apart collapse to one on the base revision, while this PR keeps both. That is a useful improvement. I did find two regressions that I would like us to address before merge, plus some test/documentation follow-ups. 1. P2 — Coalescing can discard provisional continuity and indefinitely restart debounceLocation: A reachable sequence is:
This is not a request to preserve two newly born close fingers. The regression is losing the history of the single surviving contact. Full-pipeline reproductionThe host probe uses the actual
Both blobs pass the production gates, with measured raw weights 46680 and 33360. The surviving strong candidate remains within the ordinary three-cell association radius of its preceding provisional position. Observed comparison:
A separate real-stage-chain probe with weights 6000/5000, separation 300 and movement 200 (grid ×100) reproduces the same loss of provisional continuity. Both the base/head normal and fully ASan/UBSan-instrumented probe builds complete with their expected differential assertions. The minimal direction seems to be reconciling survivor assignments before slot update: when a winner on an empty slot suppresses a candidate assigned to a state-1 slot, preserve that provisional association if the winner is validly in range. We should keep the intended protection of two established contacts rather than restore destructive pre-association merging. A multi-frame sample-to-MT regression would be valuable here. 2. P2 — The optional real-frame replay target no longer compiles
The target exits 2 on HEAD, while the same replay source compiles against the exact staged base tracker. Could we migrate Test coverage and smaller follow-upsThe new helper tests are useful as isolated coalescer tests, but their handwritten Other useful cases are the winner-at- Minor cleanup:
What passed, and what remains unproven
I considered the lift-pending/state-3 reacquisition case too, but am not reporting it as a proven phantom-contact bug. State 3 is intentionally still published during the lift window, and a strong close blob can represent either a genuine returning finger or an artifact. A synthetic ambiguity alone is not enough reason to remove that continuity rule. Similarly, capacity stress with artificially pre-filled slots has not established real input-history reachability, so I have not promoted it to another production finding. These are synthetic host results, not physical qualification or a replay of the unavailable private corpus. After the two regressions are fixed, the exact resulting revision still needs CI execution and hardware checks, including pinch/close contacts, contact birth, motion, lift and re-touch. At review time the GitHub CI run was waiting for approval ( Overall: the fix addresses a real weakness in the old ordering, and I would like to retain that improvement. Preserving provisional continuity and updating the replay caller should let us move forward without trading away new-contact recognition or the existing diagnostic tool. Thanks again for the focused contribution. |
|
Thanks — the state-1 case was a real miss in my first extraction. I reproduced the logic from your sequence and pushed a narrower continuity fix plus the rest of the requested audit cleanup. Current head: The fix does not exempt two close new contacts from coalescing. Instead, after coalescing has already selected one survivor, if:
then the survivor inherits that provisional slot before the loser is discarded. That preserves debounce/history for the one surviving contact rather than restarting it every frame. I added the reachable full-pipeline regression using the exact shape from your review: 30 flat 72x48 baseline frames at raw 220, then six frames of disconnected 3x5 rectangles at raw 40/80, four cells apart, moving three cells/frame. The test requires the contact to publish from frame 2 onward and the provisional duration not to restart. I also added the requested branch cases:
The stale diagnostic/tooling pieces are cleaned up too:
I left the state-3 and capacity behaviors alone, per your review. What is still pending is exactly what you called out: CI is |
|
Thanks — re-verification of Two test/diagnostic follow-ups remain: Medium: the new pipeline fixture leaks 3456 bytes under LSan
make -C tests clean
make -C tests SANITIZE=1 testThe tracker test fails with LeakSanitizer reporting 3456 bytes in one allocation, aggregate exit 2. A clean fully C-instrumented run reproduces it; the ordinary host suite passes. Please free the fixture-owned buffer using the existing neighboring teardown pattern (e.g. Low: replay attribution displays an unscaled ghost radius
The actual coalescing decision calls production code, so this affects the explanation/attribution rather than the real tracker decision. Please reuse the effective scaling for the displayed diagnostic too. Further checks: re-home/range/raw-weight/established-preservation/radius mutations are rejected when the known fixture leak is isolated in a generated probe. That probe is separate from the unchanged failing suite. Full-pipeline movement, established convergence, sibling helper cases, explicit replay build, and replay of the locally available 537-frame Windows corpus passed. Both kernel modules compile against Debian 6.12.111 headers with BTF disabled; none loaded. Coverage note: the committed established-slot cases are mostly handcrafted assignments; retaining a reachable multi-frame convergence regression would strengthen them. Fork/history Gate5/mode3 wording in PIPELINE should not imply this isolated upstream PR provides that installer mode. No speculative state-3/capacity changes are requested. Historical corpus success is not exact-head hardware qualification; physical pinch/birth/motion/lift/re-touch and CI remain pending (workflow action_required). No source edits made. |
|
@Syax89 I addressed both remaining test/diagnostic findings in the isolated tracker branch. Fork CI run 38925926108 passes the normal and ASan/UBSan host gates, whitespace and both kernel builds. No new real-device tracker qualification is implied; PR remains draft pending physical close-contact/pinch/lift/recontact data and your re-review. |
|
Thanks again for the fixes. Here is the focused follow-up verification. At exact head The retained evidence is executable rather than token-only: explicit leak-detection ASan/UBSan passes with the current fixture and fails with the original teardown; the actual diagnostic helper matches the production function in 3120 bounded comparisons; the real establish→converge raster control and moving-birth/rehome control retain the intended behavior. The existing 537-frame corpus replay ran (not SKIP), with four assertions passing. Exact-head CI remains green. These detailed artifacts are in the prior final-check report; this focused follow-up did not repeat the full campaign or change source. I would resolve the original software review concerns. A committed establish→converge raster regression remains a useful nonblocking coverage follow-up, distinct from a production defect. Physical close-contact/pinch, birth/motion/lift/recontact, lifecycle stability and drop/reset qualification are still pending on this exact pin. Test PR88 separately on its raw profile; no PR87+88 combined build has been qualified and no merge is implied by this note. |
|
Merged into |
Summary
Focused tracker fix extracted independently from the Gate5 fork and based directly on current upstream
main/ v1.7.1 (72b3492).This changes close-contact handling from:
to:
The reason is simple: proximity suppression cannot know whether two close blobs represent two persistent fingers until association has been performed.
Behavior
The post-association policy is intentionally small:
raw_wwins, preserving the previous duplicate-rejection behavior;ghost_distboundary is preserved;This does not include the later Gate5 birth-grace, sequential-close-birth, or occlusion heuristics. Those remain out of scope.
Why
A physical MSHW0231 pinch capture showed the failure mode: legitimate nearby contacts could both exist as detector candidates, but the pre-association ghost merge destroyed one before Hungarian matching had a chance to associate the pair with two already-established tracks.
The key property this PR pins is therefore:
Regression coverage
tracker_coalescing_host_test.cincludes the staged realmshw0231-raw.cand directly exercises the policy:ghost_distremains outside the strict suppression boundary.tracker_coalescing_source_test.pyadditionally pins the pipeline order:Both are wired into
make -C tests test.Scope
This PR is independent of #87 and does not include:
The exact clean branch has not yet been physically re-tested after extraction, so I am opening it as a draft rather than extending the prior hardware result beyond what was actually tested.
Windows reverse-engineering provenance
The tracker work is also downstream of the Windows analysis rather than an isolated Linux heuristic exercise:
TouchPenProcessor0C19.dllas the software Heat processor bound toMSHW0231&Col02.0x0cHeat path Windows uses.This PR intentionally extracts only the conservative association-before-coalescing result; the broader Windows-vs-Linux detector reconstruction remains documented in the linked analysis.
Review follow-up
The first review found a real state-1 provisional-contact regression. The branch now preserves the chosen survivor's provisional history when:
This preserves continuity for the one contact coalescing already chose; it does not create a two-close-new-contact exception.
The host suite now includes the review's reachable full-pipeline reproduction: 30 flat 72x48 baseline frames at raw 220, then six moving frames with disconnected 3x5 strong/weak rectangles (40/80), four cells apart and moving three cells/frame. It also covers winner-at-B/loser-at-A, rejected
0xffassignments, raw-vs-edge-penalized weight, 3+ slot ghost-radius scaling, direct provisional re-home, and an out-of-range negative control.real_frame_replay_test.chas been migrated to Hungarian -> post-association coalescing, is compiled by the aggregate host gate even without the private corpus, and staleraw_ghost_merge/pre-merge terminology was removed from the driver stage list, pipeline docs, replay diagnostics, and raw-replay fixture docs.Exact-head CI and physical pinch/contact-birth/motion/lift-re-touch checks remain pending; the PR stays draft until those are available.