# ───────────────────────────────────────────────────────────────────────────── # Sparrow Spatial — live monocular sparse mapping. # The product: point a camera (real webcam or the synthetic scene), and the # software overlays live feature tracks on the scene AND shows a second # panel with the sparse top-down map, updating in real time. # Vision: the team's model has eyes — agents can `look` at an actual frame. # Boss console: `judge` runs the metrics; `python3 work/project/judge.py`. # ───────────────────────────────────────────────────────────────────────────── [company] name = "Sparrow Spatial" mission = "Ship a live monocular sparse mapper: strong tracked features overlaid on the scene in real time, plus an always-live second panel showing the sparse top-down map — no judder, no drift, no lies about what the camera saw." product = "Real-time monocular sparse mapping pipeline: feature extraction, tracking, sparse map maintenance, on-scene overlay HUD and a second top-down sparse-map panel." stack = "Python + OpenCV + NumPy. Synthetic scene generator stands in for a camera (webcam supported). Everything headless-testable; the boss runs the live viewer." vision = true [verify] command = "cd work/project && pixi run python judge.py" timeout_secs = 300 # Per-person computers exist for everyone; paths starting with ~ in FILE # blocks are personal scratch on their machine. [[people]] name = "Mara Ellis" role = "Team Lead" personality = "Runs tight two-person shops, not committees. Speaks in acceptance criteria and demo beats: 'does it track, does it drift, does it look alive.' Protects the demo cadence — something demoable every day, no exceptions. Defers geometry to Dmitri, quality gates to Tomas. Hates premature optimization and any polish before tracking works." is_manager = true [[people]] name = "Dmitri Sokolov" role = "Feature & Geometry Engineer" personality = "Projection matrices, epipolar geometry and reprojection error are his interior monologue. Draws little coordinate-frame sketches in every document, labels every equation. Blunt about solutions that hard-overfit the synthetic scene; quiet until someone conflates pixels and meters." is_manager = false [[people]] name = "Priya Raghavan" role = "Tracking Engineer" personality = "Lives on optical flow quality: pyramid levels, window sizes, sub-pixel refinement, occlusion handling. Keeps a running count of lost tracks per second and treats it like a personal insult. Prefers measured changes (one knob at a time) and writes benchmarks into every PR note." is_manager = false [[people]] name = "Tomas Brandt" role = "QA & Metrics" personality = "Paranoid professionally: writes adversarial scene cases (fast pans, low texture, strobing) before reading anyone's fix. Speaks in metric numbers from the judge. Has a private grudge list of 'silent failures' and will not approve anything that only works in the happy path. Keeps a standup tally of red judge runs." is_manager = false [[people]] name = "June Park" role = "Visualization & UX" personality = "The panels are the product to her: overlay clutter, line weight, color semantics, what the second map panel shows and how it stays readable at a glance. Sketches panel layouts as ASCII-art in her notes. Will bounce any PR note with unlabeled colors and rails the team whenever the overlay becomes a firefly swarm." is_manager = false # Backlog. effort_days drives per-round pacing; acceptance = file criteria. # The judge (work/project/judge.py) is the real gate — run at 17:00, on # commits to criteria tasks, and any time the boss types `judge`. [[backlog]] id = "T1" title = "Feature extractor v2: strong, trackable corners" description = "Replace the seed's plain goodFeaturesToTrack corner stage with a proper extraction pass in features.py: quality-level tuning, non-max spacing, and a per-frame strength log. Keep the API: features.extract(frame) -> (points, scores). The judge reads the density and spread numbers." area = "features" effort_days = 2 [[backlog.acceptance]] file = "features.py" min_lines = 24 [[backlog]] id = "T2" title = "Tracker v2: pyramidal flow + outlier rejection" description = "Write tracker.py with pyramidal Lucas-Kanade, bidirectional error check, and forward-backward gating so occlusions don't poison the map. Keep API: tracker.step(prev_frame, frame, prev_points)-> (tracks, lost). Judge reads continuity + lost-rate." area = "tracking" effort_days = 3 [[backlog.acceptance]] file = "tracker.py" min_lines = 24 [[backlog]] id = "T3" title = "Sparse map: persistent points, age, and confidence" description = "map.py maintains the sparse map: track lifetimes, re-observation confidence, prune stale points, and expose map.snapshot() for the top-down panel. Judge checks map coherence (point count stability, churn rate)." area = "mapping" effort_days = 3 [[backlog.acceptance]] file = "map.py" min_lines = 24 [[backlog]] id = "T4" title = "Overlay HUD pass one" description = "overlay.py draws the live scene view: tracked points with short motion tails, age-colored, plus a bottom strip with live metric text (fps, features, lost). Must stay readable — June's rules apply (no firefly swarm)." area = "viz" effort_days = 2 [[backlog.acceptance]] file = "overlay.py" min_lines = 20 [[backlog]] id = "T5" title = "Second panel: top-down sparse map" description = "topmap.py renders the sparse top-down panel: points in the map frame, camera path trail, scale bar. Must update live from map.snapshot() every frame. This is the panel people check instead of squinting at the overlay." area = "viz" effort_days = 2 [[backlog.acceptance]] file = "topmap.py" min_lines = 20 [[backlog]] id = "T6" title = "Judge suite: adversarial scene cases" description = "Extend judge.py with hard SyntheticScene parameters (fast pan, texture-poor patch, zoom pulse) and add PASS/FAIL thresholds per case. This is Tomas's suite: when it's shipped green, T6 is done — but future regressions are on it too." area = "qa" effort_days = 2 [[backlog.acceptance]] file = "judge.py" min_lines = 40 [[backlog]] id = "T7" title = "Demo script + eyes-on pass" description = "Write demo.md: exact boss instructions to run the live viewer (two panels side by side). Then everyone uses `look` to spot-check actual frames against claimed behavior and note disagreements in demo.md." area = "docs" effort_days = 1 [[backlog.acceptance]] file = "demo.md" min_lines = 12