Guetteur (Team Drift): active perception with receipts
Guetteur is French for "lookout". An agent watches a space through depth only, decides what to look at next using OpenCV 5 evidence, stops at a human gate before anything outward-facing happens, and attaches a re-runnable receipt to every claim it makes.
Status (2026-10-15): submitted to the OpenCV AI Competition powered by AWS. Devpost entry · Narrated demo (3:52) · Submission receipt. AWS judge demo deployed; physical depth capture verified. Try the live dashboard. The published accuracy results remain synthetic-only. Three physical OAK-D depth takes (empty baseline, walkthrough, item removal) each contain 300 integrity-checked 640x400 frames; calibrated replay and real-world accuracy measurement remain open. The AWS demo runs built-in synthetic scenes, not a live camera feed. See current evidence.
Built for the OpenCV AI Competition 2026 (Agentic Vision path). Rules notes with section citations:
docs/RULES_NOTES.md.
What it does
depth frames ──> OpenCV 5 perception ──> evidence (JSON, no pixels) ──> planner ──> action ──> next perception call
inpaint, medianBlur, rule-based recheck_zone / pause_zone /
morphology, connected (LLM slot) compensate_drift / degrade_zone
components, Farneback request_approval (human gate)
│
every claim ──> claim.json ──> receipts ──> prove-it-done verifier
- Ambiguous evidence changes the next tool call. A 25 mm change is ~3.5 sigma in one frame; the planner asks
recheck_zone(n=7)and OpenCV 5 re-runs on the integrated window before anyone is bothered. - Presence is not a change. A person-sized blob nearer than the scene pauses that zone.
- Sensor trouble is not a scene event. Noise bursts degrade the zone, gain drift is compensated, lost depth escalates as a camera fault.
- Default is deny. If no human answers the approval request, nothing is published.
- Claims carry receipts. Each claim is re-checked by two independent estimators (numpy-only, and OpenCV frame statistics) against the pinned input, and the vendored prove-it-done verifier judges the ledger. Claims doctored beyond the tolerance (max(8 mm, 25% of the value)) fail: inflated, pointed at the wrong pixels or time, or re-pointed at another recording. Smaller inflations pass by design.
Quick start (macOS/Linux, Python 3.12, uv)
uv sync # pinned: opencv-python-headless==5.0.0.93, numpy==2.5.4, pytest==9.1.1 (see uv.lock)
uv run pytest # ~2-3 minutes; includes the real verifier and tamper tests
uv run guetteur scenarios # the 11 synthetic scenarios and their ground truth
uv run guetteur demo # narrated demo (the judge demo without a camera)
uv run guetteur run subtle_item_removed --verify # one scenario: trace, alerts, score, receipts
uv run guetteur run person_takes_item --gate timeout # human gate times out -> nothing is published
uv run guetteur run subtle_item_removed --planner naive # the threshold-and-alert baseline misses it
uv run guetteur eval # all scenarios x 3 seeds x 3 planners -> eval/results.json
uv run guetteur bench # per-frame runtime on this machine -> eval/runtime.json
uv run guetteur serve # the judge dashboard + API on http://127.0.0.1:8080/
From PyPI instead of a clone (Python 3.12): pip install guetteur, then the same commands without uv run
(for example guetteur demo). Outputs go under the working directory.
Re-verify any ledger yourself: uv run guetteur verify-ledger runs/<run>/receipts.md (runs the vendored
third_party/prove_it_done/verify_receipts.py, pinned to prove-it-done commit d897534).
Optional physical-camera capture
An opt-in, depth-only native recorder and operator run sheet are available in
docs/REAL_DEPTH_CAPTURE.md. Hardware capture and clean shutdown are verified; calibrated replay remains open. This does not change the synthetic-only status of the accuracy evaluation.
Layout
| Path | What |
|---|---|
src/guetteur/perception.py |
OpenCV 5 pipeline: holes, denoise, change evidence, morphology, blobs, optical flow, coarse grid |
src/guetteur/planner.py |
Planner interface, RulePlanner, NaivePlanner (ablation), LLMPlanner slot + action validation |
src/guetteur/agent.py |
executor: autonomy policy, evidence guardrails, human gate, trace |
src/guetteur/receipts.py, check_numpy.py, check_cv.py |
claims, ledger writer, the two independent re-checks |
src/guetteur/synth.py |
synthetic depth scenes with ground truth (11 scenarios) |
src/guetteur/cloud/ |
the Lambda handler (also served locally), dashboard page, approval/evidence store |
INFRA/ |
AWS SAM template for the deployed judge endpoint; optional phase-2 resources are not deployed |
deploy/ |
credential-free CloudShell deploy kit: cloudshell-deploy.sh, make-artifact.sh, guardrail check |
third_party/prove_it_done/ |
vendored verifier (MIT), provenance in PROVENANCE.md |
tests/ |
unit, scenario, receipt/tamper, and API tests |
docs/ |
RULES_NOTES.md, EVALUATION.md (generated), TRACE_EXAMPLE.md, report/ (technical report, PDF) |
Honest limits
- Accuracy metrics are synthetic-only. Physical depth recordings exist, but calibration, interval labels, and held-out replay are still required before a real-world accuracy claim.
- Depth cannot tell what an object is; claims say "a region became farther by 24 mm", not "a bottle was removed".
- Changes under ~1 sigma after filtering are invisible (documented miss:
subthreshold_item_removed). - The LLM planner is an interface plus tests with a fake model; no model is called.
- The edge/cloud approval path (DynamoDB, S3, authenticated routes) is code plus local tests only; the first AWS deployment is a public synthetic-demo endpoint (
INFRA/README.md). - The deployed AWS scope is API Gateway + Lambda arm64 running OpenCV and receipt checks. DynamoDB, S3, and authenticated real-camera approvals remain phase-2 code with local tests only.
- The dashboard gate selector simulates approve/deny/timeout; it is not a deployed authenticated human-approval workflow.
- The demo has API throttling but no reserved-concurrency cap because the account quota could not support the reservation.
License
MIT (see LICENSE). Vendored third_party/prove_it_done is MIT as well.
Metadata
Release files for guetteur 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| guetteur-0.1.0.tar.gz | 111.2 kB | With provenance | Details for guetteur-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| guetteur-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for guetteur-0.1.0-py3-none-any.whl |
Total release size: 169.1 kB
Release files / guetteur-0.1.0.tar.gz
| Download URL | guetteur-0.1.0.tar.gz |
|---|---|
| Size | 111.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
633671d8a9f46e97c69fc572886e8f293b2c27ceeebc6e0b421af13e8da3e315
|
|
BLAKE2b-256 checksum How to use checksums |
850ab1284bea31f07562b378d9553fa9646be63e3e052a80f7b89d3127787fbc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logRelease files / guetteur-0.1.0-py3-none-any.whl
| Download URL | guetteur-0.1.0-py3-none-any.whl |
|---|---|
| Size | 57.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
32b235ee6b5f89fc949a6bd5a558cf912ad32af8fb585fd29d2b47d7677362ac
|
|
BLAKE2b-256 checksum How to use checksums |
c9ad8db625320e976b1a4bb6d3e88db4b32ae7346fd91d9acaffdff199ffccde
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logSecurity for guetteur 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for guetteur-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.