swarm / companies/sparrow/company.toml

raw file 6766 bytes
# ─────────────────────────────────────────────────────────────────────────────
# 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