fullseye

v14 — perception-stack completion: motion + robustness

Goal (user, continuing the v13 /goal): keep taking the engine toward being (1) practically usable across other projects, (2) research-complete, (3) the agent’s own skill — advancing the physical-AI perception pipeline the application vectors call for (onocollo video, evis/hillco pose & stereo depth, locomotion terrain, grasp). Everything is local; nothing is pushed (human-gated). The full suite stayed green at each step (2482 → 2497 passed).

The v13 stack measured space (stereo depth), terrain, objects, pose, and registration. v14 adds the missing time / motion axis and hardens the depth, terrain, and registration blocks for real (noisy, partial, tilted) input.

Optical flow — the temporal axis (flow.py, tests/test_flow.py)

Dense two-frame motion, so a rendered physics clip (onocollo) or a moving figure (evis/hillco body language) yields a per-pixel displacement field.

Sub-pixel stereo + left-right consistency (stereo.py)

Terrain obstacle detection (terrain.py)

Robust registration (registration.py)

Motion analysis (motion.py, tests/test_motion.py)

Interprets a flow field into actionable signals (flow estimates motion; motion reads it):

Point-cloud geometry (pointcloud.py, tests/test_pointcloud.py)

The 3-D companion to stereo (builds the cloud) and registration (aligns it):

Wiring & tests

All new functions are re-exported through api.py and the fullseye facade (import fullseye; fullseye.optical_flow_lk / disparity_subpixel / detect_obstacles / register / motion_segments / estimate_normals / colorize_flow …). +26 ground-truth tests across test_flow.py, test_stereo.py, test_terrain.py, test_registration.py, test_motion.py, test_pointcloud.py. Commits a8fe121 (flow), e2feaf8 (stereo/terrain/registration robustness), a5b2516 (motion), 74ed047 (point cloud). Full suite 2508 passed.

Examples (cross-project templates, smoke-tested)

Late additions (tracking + feature-based registration)

Studio perception panel

The HDevelop-style studio.py gains a Perception (v14) row: load a second frame (B), pick a mode — optical flow / motion overlay / stereo depth / stereo terrain — and Run to render a colourised view in the existing zoom/pan image view (Save / hover / histogram reuse the same path). The logic lives in a Qt-free PerceptionModel(frame_b).view(mode, frame_a) → (H,W,3) RGB, unit-tested independently of the GUI; win._perception exposes it for headless driving.

Adversarial hardening (6-agent review → 15 fixes)

After the v14 build a 6-agent adversarial review (one reviewer per new module) hunted for correctness bugs the ground-truth tests missed — because those tests used contrast 1.0, few iterations, cropped borders, and only well-formed inputs. It surfaced 15 real findings, every one reproduced against the actual code before fixing (commit ae0433d, +14 regression tests, suite 2525 passed):

Second-opinion review (external model, Codex). Running Codex read-only over flow/motion/registration surfaced 6 findings — 5 real, 1 false positive (it claimed register crashes on 2 points, which a test disproves; Codex can’t execute in its read-only sandbox and reasoned statically). Notably it caught a regression the first round introducedmotion_segments’ morphological closing eroded a moving region touching the frame border → pad by edge-replication then crop. Also: optical_flow_hs alpha=0 → 0/0 NaN (floored the denominator); optical_flow_lk/hs now reject a <2-px dimension with a clear error; point_to_plane_icp max_iter=0 returned rmse=inf (now recomputes the residual for the returned pose); kabsch rejects empty inputs. +5 regression tests (commit d7be5bf). Full suite 2532 passed. Lesson: an external model’s independent view catches blind spots — and self-introduced regressions — that same-family review misses; verify every finding against real code (sandbox limits make false positives normal).

honest limits