guetteur 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- guetteur-0.1.0/.github/dependabot.yml +19 -0
- guetteur-0.1.0/.github/workflows/ci.yml +34 -0
- guetteur-0.1.0/.github/workflows/release.yml +101 -0
- guetteur-0.1.0/.github/workflows/scorecard.yml +56 -0
- guetteur-0.1.0/.github/workflows/security.yml +65 -0
- guetteur-0.1.0/.gitignore +15 -0
- guetteur-0.1.0/.python-version +1 -0
- guetteur-0.1.0/CHANGELOG.md +41 -0
- guetteur-0.1.0/CONTRIBUTING.md +9 -0
- guetteur-0.1.0/DESIGN.md +251 -0
- guetteur-0.1.0/INFRA/README.md +52 -0
- guetteur-0.1.0/INFRA/layer/requirements.txt +2 -0
- guetteur-0.1.0/INFRA/template.yaml +201 -0
- guetteur-0.1.0/LICENSE +21 -0
- guetteur-0.1.0/PKG-INFO +118 -0
- guetteur-0.1.0/README.md +91 -0
- guetteur-0.1.0/deploy/README.md +56 -0
- guetteur-0.1.0/deploy/check_guardrails.py +62 -0
- guetteur-0.1.0/deploy/cloudshell-deploy.sh +145 -0
- guetteur-0.1.0/deploy/make-artifact.sh +47 -0
- guetteur-0.1.0/docs/EVALUATION.md +66 -0
- guetteur-0.1.0/docs/REAL_DEPTH_CAPTURE.md +96 -0
- guetteur-0.1.0/docs/RULES_NOTES.md +44 -0
- guetteur-0.1.0/docs/TRACE_EXAMPLE.md +36 -0
- guetteur-0.1.0/pyproject.toml +59 -0
- guetteur-0.1.0/requirements/release.in +4 -0
- guetteur-0.1.0/requirements/release.txt +40 -0
- guetteur-0.1.0/scripts/check_depth_shutdown.py +63 -0
- guetteur-0.1.0/scripts/make_docs.py +86 -0
- guetteur-0.1.0/scripts/record_real_depth.py +227 -0
- guetteur-0.1.0/scripts/record_submission_demo.cjs +62 -0
- guetteur-0.1.0/src/guetteur/__init__.py +3 -0
- guetteur-0.1.0/src/guetteur/agent.py +283 -0
- guetteur-0.1.0/src/guetteur/check_cv.py +74 -0
- guetteur-0.1.0/src/guetteur/check_numpy.py +83 -0
- guetteur-0.1.0/src/guetteur/cli.py +100 -0
- guetteur-0.1.0/src/guetteur/cloud/__init__.py +0 -0
- guetteur-0.1.0/src/guetteur/cloud/dashboard.html +55 -0
- guetteur-0.1.0/src/guetteur/cloud/handler.py +144 -0
- guetteur-0.1.0/src/guetteur/cloud/local.py +34 -0
- guetteur-0.1.0/src/guetteur/cloud/store.py +114 -0
- guetteur-0.1.0/src/guetteur/common.py +80 -0
- guetteur-0.1.0/src/guetteur/demo.py +71 -0
- guetteur-0.1.0/src/guetteur/evalrun.py +153 -0
- guetteur-0.1.0/src/guetteur/perception.py +282 -0
- guetteur-0.1.0/src/guetteur/planner.py +242 -0
- guetteur-0.1.0/src/guetteur/receipts.py +67 -0
- guetteur-0.1.0/src/guetteur/runner.py +147 -0
- guetteur-0.1.0/src/guetteur/synth.py +186 -0
- guetteur-0.1.0/tests/conftest.py +28 -0
- guetteur-0.1.0/tests/test_agent_scenarios.py +130 -0
- guetteur-0.1.0/tests/test_cloud_handler.py +111 -0
- guetteur-0.1.0/tests/test_paths.py +49 -0
- guetteur-0.1.0/tests/test_perception.py +74 -0
- guetteur-0.1.0/tests/test_planner.py +112 -0
- guetteur-0.1.0/tests/test_real_depth_capture.py +124 -0
- guetteur-0.1.0/tests/test_receipts.py +75 -0
- guetteur-0.1.0/tests/test_synth_and_privacy.py +70 -0
- guetteur-0.1.0/third_party/prove_it_done/LICENSE +21 -0
- guetteur-0.1.0/third_party/prove_it_done/PROVENANCE.md +7 -0
- guetteur-0.1.0/third_party/prove_it_done/verify_receipts.py +495 -0
- guetteur-0.1.0/uv.lock +125 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "github-actions"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
groups:
|
|
8
|
+
# codeql-action init/analyze/upload-sarif must run the same version.
|
|
9
|
+
codeql-action:
|
|
10
|
+
patterns:
|
|
11
|
+
- "github/codeql-action*"
|
|
12
|
+
- package-ecosystem: "uv"
|
|
13
|
+
directory: "/"
|
|
14
|
+
schedule:
|
|
15
|
+
interval: "weekly"
|
|
16
|
+
- package-ecosystem: "pip"
|
|
17
|
+
directory: "/INFRA/layer"
|
|
18
|
+
schedule:
|
|
19
|
+
interval: "weekly"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
name: build sdist and wheel
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
17
|
+
with:
|
|
18
|
+
persist-credentials: false
|
|
19
|
+
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
- name: Build
|
|
23
|
+
run: |
|
|
24
|
+
python -m pip install --require-hashes -r requirements/release.txt
|
|
25
|
+
python -m build --no-isolation
|
|
26
|
+
- name: Wheel carries the vendored verifier and the dashboard
|
|
27
|
+
run: |
|
|
28
|
+
python -m zipfile -l dist/*.whl | grep -q 'guetteur/_vendor/prove_it_done/verify_receipts.py'
|
|
29
|
+
python -m zipfile -l dist/*.whl | grep -q 'guetteur/cloud/dashboard.html'
|
|
30
|
+
- name: Console script runs from the wheel
|
|
31
|
+
run: |
|
|
32
|
+
python -m venv /tmp/wheel-venv
|
|
33
|
+
/tmp/wheel-venv/bin/python -m pip install --no-deps dist/*.whl
|
|
34
|
+
/tmp/wheel-venv/bin/guetteur --help
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: build sdist and wheel
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
id-token: write
|
|
17
|
+
attestations: write
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
20
|
+
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.13"
|
|
23
|
+
- name: Build
|
|
24
|
+
run: |
|
|
25
|
+
python -m pip install --require-hashes -r requirements/release.txt
|
|
26
|
+
python -m build --no-isolation
|
|
27
|
+
- name: Attest build provenance
|
|
28
|
+
id: attest
|
|
29
|
+
uses: actions/attest-build-provenance@4d101475d8b20a2381f78447822ac1eab6504dd8 # v4.2.2
|
|
30
|
+
with:
|
|
31
|
+
subject-path: dist/*
|
|
32
|
+
- name: Name provenance bundle
|
|
33
|
+
env:
|
|
34
|
+
BUNDLE: ${{ steps.attest.outputs.bundle-path }}
|
|
35
|
+
run: |
|
|
36
|
+
set -euo pipefail
|
|
37
|
+
version="${GITHUB_REF_NAME#v}"
|
|
38
|
+
mkdir provenance
|
|
39
|
+
jq -c . "$BUNDLE" > "provenance/guetteur-${version}.intoto.jsonl"
|
|
40
|
+
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
41
|
+
with:
|
|
42
|
+
name: dist
|
|
43
|
+
path: dist/
|
|
44
|
+
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
45
|
+
with:
|
|
46
|
+
name: provenance
|
|
47
|
+
path: provenance/
|
|
48
|
+
|
|
49
|
+
publish:
|
|
50
|
+
name: publish to PyPI
|
|
51
|
+
needs: build
|
|
52
|
+
runs-on: ubuntu-latest
|
|
53
|
+
environment: pypi
|
|
54
|
+
permissions:
|
|
55
|
+
id-token: write
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
58
|
+
with:
|
|
59
|
+
name: dist
|
|
60
|
+
path: dist/
|
|
61
|
+
- uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # release/v1
|
|
62
|
+
|
|
63
|
+
github-release:
|
|
64
|
+
name: GitHub release with provenance
|
|
65
|
+
needs: publish
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
permissions:
|
|
68
|
+
contents: write
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
71
|
+
with:
|
|
72
|
+
persist-credentials: false
|
|
73
|
+
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
74
|
+
with:
|
|
75
|
+
name: dist
|
|
76
|
+
path: dist/
|
|
77
|
+
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
78
|
+
with:
|
|
79
|
+
name: provenance
|
|
80
|
+
path: provenance/
|
|
81
|
+
- name: Verify provenance and create GitHub release
|
|
82
|
+
env:
|
|
83
|
+
GH_TOKEN: ${{ github.token }}
|
|
84
|
+
run: |
|
|
85
|
+
set -euo pipefail
|
|
86
|
+
version="${GITHUB_REF_NAME#v}"
|
|
87
|
+
bundle="provenance/guetteur-${version}.intoto.jsonl"
|
|
88
|
+
for f in dist/*; do
|
|
89
|
+
gh attestation verify "$f" \
|
|
90
|
+
--bundle "$bundle" \
|
|
91
|
+
--repo "$GITHUB_REPOSITORY" \
|
|
92
|
+
--signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/release.yml"
|
|
93
|
+
done
|
|
94
|
+
awk -v head="## [${version}]" 'index($0, head) == 1 {p = 1; next} p && /^## / {exit} p' CHANGELOG.md > notes.md
|
|
95
|
+
test -s notes.md || echo "See CHANGELOG.md." > notes.md
|
|
96
|
+
gh release create "$GITHUB_REF_NAME" \
|
|
97
|
+
--repo "$GITHUB_REPOSITORY" \
|
|
98
|
+
--verify-tag \
|
|
99
|
+
--title "guetteur ${version}" \
|
|
100
|
+
--notes-file notes.md \
|
|
101
|
+
dist/* "$bundle"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: Scorecard analysis workflow
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
# Only the default branch is supported.
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
schedule:
|
|
8
|
+
# Weekly on Saturdays.
|
|
9
|
+
- cron: '30 1 * * 6'
|
|
10
|
+
|
|
11
|
+
permissions: read-all
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
analysis:
|
|
15
|
+
name: Scorecard analysis
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
permissions:
|
|
18
|
+
# Needed for Code scanning upload
|
|
19
|
+
security-events: write
|
|
20
|
+
# Needed for GitHub OIDC token if publish_results is true
|
|
21
|
+
id-token: write
|
|
22
|
+
|
|
23
|
+
steps:
|
|
24
|
+
- name: "Checkout code"
|
|
25
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
|
+
with:
|
|
27
|
+
persist-credentials: false
|
|
28
|
+
|
|
29
|
+
- name: "Run analysis"
|
|
30
|
+
uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0
|
|
31
|
+
with:
|
|
32
|
+
results_file: results.sarif
|
|
33
|
+
results_format: sarif
|
|
34
|
+
# Scorecard team runs a weekly scan of public GitHub repos,
|
|
35
|
+
# see https://github.com/ossf/scorecard#public-data.
|
|
36
|
+
# Setting `publish_results: true` helps us scale by leveraging your workflow to
|
|
37
|
+
# extract the results instead of relying on our own infrastructure to run scans.
|
|
38
|
+
# And it's free for you!
|
|
39
|
+
publish_results: true
|
|
40
|
+
|
|
41
|
+
# Upload the results as artifacts (optional). Commenting out will disable
|
|
42
|
+
# uploads of run results in SARIF format to the repository Actions tab.
|
|
43
|
+
# https://docs.github.com/en/actions/advanced-guides/storing-workflow-data-as-artifacts
|
|
44
|
+
- name: "Upload artifact"
|
|
45
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
46
|
+
with:
|
|
47
|
+
name: SARIF file
|
|
48
|
+
path: results.sarif
|
|
49
|
+
retention-days: 5
|
|
50
|
+
|
|
51
|
+
# Upload the results to GitHub's code scanning dashboard (optional).
|
|
52
|
+
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
|
|
53
|
+
- name: "Upload to code-scanning"
|
|
54
|
+
uses: github/codeql-action/upload-sarif@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
|
|
55
|
+
with:
|
|
56
|
+
sarif_file: results.sarif
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
name: Security
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
branches: [main]
|
|
7
|
+
schedule:
|
|
8
|
+
- cron: '41 4 * * 0'
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
permissions: read-all
|
|
11
|
+
jobs:
|
|
12
|
+
codeql:
|
|
13
|
+
name: CodeQL (${{ matrix.language }})
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
permissions:
|
|
16
|
+
security-events: write
|
|
17
|
+
contents: read
|
|
18
|
+
strategy:
|
|
19
|
+
fail-fast: false
|
|
20
|
+
matrix:
|
|
21
|
+
language: [python, javascript-typescript]
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
24
|
+
with:
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
- uses: github/codeql-action/init@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
|
|
27
|
+
with:
|
|
28
|
+
languages: ${{ matrix.language }}
|
|
29
|
+
- uses: github/codeql-action/analyze@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
|
|
30
|
+
with:
|
|
31
|
+
category: /language:${{ matrix.language }}
|
|
32
|
+
osv-scanner:
|
|
33
|
+
name: OSV-Scanner
|
|
34
|
+
permissions:
|
|
35
|
+
actions: read
|
|
36
|
+
contents: read
|
|
37
|
+
security-events: write
|
|
38
|
+
uses: google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@b1d267aea5211fa648d9d442fa64b90dbdcbdd36 # v2.7.0
|
|
39
|
+
with:
|
|
40
|
+
scan-args: |-
|
|
41
|
+
-r
|
|
42
|
+
--allow-no-lockfiles
|
|
43
|
+
./
|
|
44
|
+
gitleaks:
|
|
45
|
+
name: gitleaks
|
|
46
|
+
if: github.event_name != 'schedule'
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
permissions:
|
|
49
|
+
contents: read
|
|
50
|
+
steps:
|
|
51
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
52
|
+
with:
|
|
53
|
+
fetch-depth: 0
|
|
54
|
+
persist-credentials: false
|
|
55
|
+
- name: Install gitleaks (checksum verified)
|
|
56
|
+
env:
|
|
57
|
+
GITLEAKS_VERSION: 8.30.1
|
|
58
|
+
GITLEAKS_SHA256: 551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb
|
|
59
|
+
run: |
|
|
60
|
+
cd "$RUNNER_TEMP"
|
|
61
|
+
curl -sSfL -o gitleaks.tar.gz "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz"
|
|
62
|
+
echo "${GITLEAKS_SHA256} gitleaks.tar.gz" | sha256sum -c -
|
|
63
|
+
tar -xzf gitleaks.tar.gz gitleaks
|
|
64
|
+
- name: Scan git history
|
|
65
|
+
run: '"$RUNNER_TEMP/gitleaks" git --redact --no-banner --verbose .'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.pyc
|
|
4
|
+
.pytest_cache/
|
|
5
|
+
.aws-sam/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
*.egg-info/
|
|
9
|
+
# generated clips are reproducible from seeds; the committed demo clips live in data/
|
|
10
|
+
/tmp/
|
|
11
|
+
/runs/
|
|
12
|
+
/eval/runs/
|
|
13
|
+
/data/
|
|
14
|
+
/logs/*.tmp
|
|
15
|
+
docs/report/report.html
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.1.0]
|
|
11
|
+
|
|
12
|
+
First PyPI release.
|
|
13
|
+
|
|
14
|
+
- `pip install guetteur` installs the `guetteur` command (Python 3.12; pinned `opencv-python-headless==5.0.0.93` and `numpy==2.5.4`).
|
|
15
|
+
- The wheel carries the vendored prove-it-done verifier, so `guetteur verify-ledger`, `run --verify`, `demo` and `eval` work from an install. Outside a git checkout, ledger paths are relative to the working directory.
|
|
16
|
+
- The sdist leaves out run logs, evaluation results and submission material (`logs/`, `eval/`, `docs/submission/`, `docs/report/`).
|
|
17
|
+
- Status unchanged: accuracy results are synthetic-only.
|
|
18
|
+
|
|
19
|
+
## 2026-11-03
|
|
20
|
+
|
|
21
|
+
No versioned release yet. This section records the repository as of 2026-11-03.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- Local prototype of Guetteur (Team Drift): design, tests, evaluation on synthetic scenes and an infrastructure draft (`DESIGN.md`, `docs/EVALUATION.md`, `eval/`, `INFRA/`) (8acbd2b).
|
|
26
|
+
- Technical report draft, PDF and diagrams (`docs/report/`), and a credential-free CloudShell deploy kit (`deploy/`) (a2b9f85).
|
|
27
|
+
- Infrastructure template: reserved-concurrency parameter, 7-day log retention on both log groups, and a `HealthUrl` output (a2b9f85).
|
|
28
|
+
- Opt-in native-depth recording and an operator run sheet (`scripts/record_real_depth.py`, `docs/REAL_DEPTH_CAPTURE.md`) (8c347ea).
|
|
29
|
+
- Depth capture teardown check, `scripts/check_depth_shutdown.py` (3a28344).
|
|
30
|
+
- Submission materials for the OpenCV AI Competition powered by AWS: submission story, evidence files and an updated report (6cc6f25); the narrated AWS demo with its recorded responses (a65bbb5); the submission receipt, captions and hosted demonstration (6b6dd1c).
|
|
31
|
+
- `CONTRIBUTING.md`: contributions are released under the repository's MIT licence, and commits carry a DCO sign-off (#1).
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- Review fixes: a single render endpoint, write routes that fail shut, phase 2 split out in the infrastructure notes, plainer wording, and a note on oak-events integration (a119bca).
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- CloudShell deploy fails on a checksum mismatch, handles `REVIEW_IN_PROGRESS` and validates the concurrency quota (65ed788).
|
|
40
|
+
- The HTTP API access log format includes `$context.requestId`; without it the first real deploy ended in `CREATE_FAILED` (f542531).
|
|
41
|
+
- Depth recording no longer accumulates sampling drift or opens the camera twice (ea55597), and guards camera handoffs (3a28344).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Issues and pull requests are welcome: https://github.com/cloudlabworks/guetteur
|
|
4
|
+
|
|
5
|
+
## Pull requests
|
|
6
|
+
|
|
7
|
+
- One change per pull request.
|
|
8
|
+
- By contributing you agree your work is released under the MIT licence in `LICENSE`.
|
|
9
|
+
- Commits must be signed off (DCO). Use `git commit -s`; see https://developercertificate.org/.
|
guetteur-0.1.0/DESIGN.md
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Guetteur (Team Drift) — design document
|
|
2
|
+
|
|
3
|
+
*OpenCV AI Competition 2026, powered by AWS. Target: Overall entry that also qualifies for the **Agentic Vision Award**.*
|
|
4
|
+
Design baseline of 2026-10-12, status corrected 2026-10-14. ~~Nothing is deployed, registered, submitted or published.~~ The public repository and AWS judge endpoint are live; native physical depth capture is verified. ~~The competition submission is not yet complete.~~ Submitted 2026-10-15; Devpost reports SUBMITTED, 5/5 steps. See `docs/submission/submission-receipt.json`. The day-by-day schedule below is the original plan, not a completion claim. Current evidence is in `docs/submission/` and the technical report.
|
|
5
|
+
Rule citations use the short names defined in `docs/RULES_NOTES.md` (DP-Overview, DP-Rules, OCV).
|
|
6
|
+
|
|
7
|
+
## 0. Read this first: three things that can sink the entry
|
|
8
|
+
|
|
9
|
+
1. **Eligibility is unverified.** OCV says "Registration closes Aug 17, 2026" ("Competition at a Glance"), that the build phase is for "all teams that submitted the required proposal" ("Build Phase Details"), and lists "Submit the cloud compute grant proposal" under "Requirements for Participation". DP-Overview still shows a Join button and says teams without a grant "remain eligible to continue". We have not established that Team Drift is registered and has a proposal on file. Alex must check before more effort is spent. (Section 12, ask #1.)
|
|
10
|
+
2. **Deadline is stated two ways.** Devpost's header and countdown: Oct 26, 2026 @ **11:45pm PDT**; DP-Overview body text and OCV: **11:59 p.m. PT**. We plan to 11:45pm and aim to submit on **Oct 25**.
|
|
11
|
+
3. **Nothing here has touched real hardware or AWS.** All results are synthetic; every artifact says so. Real OAK-D recordings and a deployed endpoint are the two things the schedule in section 11 exists to deliver.
|
|
12
|
+
|
|
13
|
+
## 1. One-paragraph pitch
|
|
14
|
+
|
|
15
|
+
Guetteur is a privacy-first active-perception agent. It watches a space through **depth only** (a Luxonis OAK-D PoE; colour frames never leave the camera), uses **OpenCV 5** to turn depth frames into small, pixel-free evidence (changed regions, people-shaped occupants, sensor health, drift), and lets an agent decide what to do *next* from that evidence: look again with more frames when the signal is ambiguous, pause a zone while someone is standing in it, compensate for sensor drift instead of reporting a phantom change, or stop and ask a human before anything outward-facing happens (default on silence: deny). Every claim it makes ("the shelf item is gone", "the camera lost depth") is a small JSON object with a **receipt**: two independent re-checks against the pinned input, in the [prove-it-done](https://github.com/issaquahd/prove-it-done) format, so a sceptical judge can re-run them and watch a doctored claim fail. A serverless AWS stack (Lambda on Graviton behind API Gateway) runs the same OpenCV 5 loop and receipt checks behind a judge-facing HTTPS endpoint.
|
|
16
|
+
|
|
17
|
+
## 2. Problem, users, impact
|
|
18
|
+
|
|
19
|
+
**Problem.** Camera-based AI usually means shipping pictures to someone else's cloud and trusting the system's summary. Two things go wrong: people's images leave the room, and agents report things nobody can check ("zone clear", "item removed") — including when the sensor itself is broken, drifting, or looking at a person it mistakes for a change.
|
|
20
|
+
|
|
21
|
+
**Users.** (a) Small operators who want to know "did something change on that shelf / in that equipment room / at that door?" without a video archive: stockrooms, labs, makerspaces, server or network closets, community fridges and tool libraries. (b) Homes and care settings where occupancy and "something changed" matter but pictures are unacceptable (always opt-in, with consent; see section 10). (c) Builders of agent systems who need a reference for *verifiable* vision claims.
|
|
22
|
+
|
|
23
|
+
**Impact we can honestly claim.** We make no statistical claims about harm reduced. What the project demonstrates and measures: (1) a vision agent that works from depth only, so there is no image to leak; (2) fewer false alarms and fewer silent failures than a threshold-and-alert pipeline on the same evidence (measured, synthetic, section 9); (3) every published claim is independently re-checkable. Real-world benefit is a hypothesis until real recordings are evaluated (section 9.4).
|
|
24
|
+
|
|
25
|
+
## 3. System at a glance
|
|
26
|
+
|
|
27
|
+
### 3.1 Architecture (OpenCV 5 + agent + AWS)
|
|
28
|
+
|
|
29
|
+
```mermaid
|
|
30
|
+
flowchart LR
|
|
31
|
+
subgraph EDGE["Edge: site network (nothing pictorial leaves)"]
|
|
32
|
+
CAM["OAK-D PoE<br/>colour frames stay on camera<br/>detections + stereo depth only"]
|
|
33
|
+
OE["oak-events (MIT, MCP)<br/>person events + 6x8 depth-cell events<br/>(shipped; never keeps a depth frame)"]
|
|
34
|
+
subgraph LOOP["Guetteur agent loop (Python 3.12)"]
|
|
35
|
+
PERC["OpenCV 5 perception<br/>inpaint / medianBlur / morphology<br/>connectedComponentsWithStats / Farneback"]
|
|
36
|
+
PLAN["Planner interface<br/>RulePlanner now / LLM slot later"]
|
|
37
|
+
EXEC["Executor<br/>autonomy policy + evidence guardrails"]
|
|
38
|
+
GATE{{"Human gate<br/>default on silence: DENY"}}
|
|
39
|
+
end
|
|
40
|
+
CAM -->|"depth frames: new opt-in tap (section 3.3)"| PERC
|
|
41
|
+
CAM --> OE
|
|
42
|
+
PERC -->|"evidence JSON (no pixels)"| PLAN --> EXEC
|
|
43
|
+
EXEC -->|"recheck / pause / compensate / degrade"| PERC
|
|
44
|
+
EXEC -->|"request_approval"| GATE
|
|
45
|
+
EXEC --> CLM["claim.json + receipt ledger"]
|
|
46
|
+
end
|
|
47
|
+
subgraph AWS["AWS (arm64 / Graviton, serverless, pay-per-use)"]
|
|
48
|
+
APIGW["API Gateway HTTP API<br/>throttled, HTTPS"]
|
|
49
|
+
LAM["Lambda arm64<br/>OpenCV 5 loop + both receipt checks<br/>(synthetic scenes for judges)"]
|
|
50
|
+
EV["PHASE 2: evidence intake<br/>x-edge-key, JSON only, pictures rejected"]
|
|
51
|
+
DDB[("PHASE 2: DynamoDB TTL<br/>approvals + evidence")]
|
|
52
|
+
S3[("PHASE 2: S3 7-day<br/>opt-in depth snippets")]
|
|
53
|
+
CW["CloudWatch logs, alarms,<br/>X-Ray, Budget"]
|
|
54
|
+
end
|
|
55
|
+
JUDGE["Judge browser<br/>dashboard + tamper button"] --> APIGW --> LAM
|
|
56
|
+
CLM -->|"evidence bundle (<= 16 KB)"| APIGW
|
|
57
|
+
APIGW --> EV --> DDB
|
|
58
|
+
GATE <-->|"approve / deny"| APIGW
|
|
59
|
+
LAM --- CW
|
|
60
|
+
EV -.->|"after human approval"| S3
|
|
61
|
+
VER["prove-it-done verifier<br/>(vendored, re-runnable by anyone)"] -. re-runs checks .-> CLM
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3.2 Agent workflow (perception → decision → action), as the Agentic Vision evidence requires (OCV "Final Submission Package")
|
|
65
|
+
|
|
66
|
+
```mermaid
|
|
67
|
+
flowchart TD
|
|
68
|
+
F["depth frame t (uint16 mm)"] --> O["PERCEIVE: ZoneObservation<br/>valid_frac, noise_ratio, shift, blobs{snr, dz, size, flow}, persist, 6x8 grid"]
|
|
69
|
+
O --> S{"salient?<br/>(attention gating)"}
|
|
70
|
+
S -- no --> F2["next frame (planner not called)"]
|
|
71
|
+
S -- yes --> P["DECIDE: planner(view) -> Action + rationale + cited numbers"]
|
|
72
|
+
P --> V{"policy: schema, bounds,<br/>budget, evidence preconditions"}
|
|
73
|
+
V -- "rejected" --> TR["trace: rejected_by_policy"]
|
|
74
|
+
V -- "autonomous" --> A1["ACT: recheck_zone(n, k)<br/>pause_zone / degrade_zone<br/>compensate_drift(gain)"]
|
|
75
|
+
V -- "gated" --> H{"ACT: request_approval -> human"}
|
|
76
|
+
A1 -->|"changes the NEXT perception call"| O
|
|
77
|
+
H -- approve --> AL["alert published + baseline adopted"]
|
|
78
|
+
H -- "deny / timeout" --> NO["nothing published, cooldown"]
|
|
79
|
+
AL --> CL["claim + receipt ledger"]
|
|
80
|
+
NO --> CL
|
|
81
|
+
CL --> VF["verify: file sha256 + numpy re-check + OpenCV re-check"]
|
|
82
|
+
VF -->|"FAIL = step reopened"| P
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The loop is closed in two places that matter for the award: `recheck_zone` changes *how OpenCV is called next* (frames integrated, threshold `k`), and the approval request is sized by what OpenCV measured. A fixed-script pipeline cannot do either (ablation in section 9).
|
|
86
|
+
|
|
87
|
+
### 3.3 Integration with oak-events: what exists and what is new
|
|
88
|
+
|
|
89
|
+
`oak-events` (shipped) turns each depth frame into a 6x8 grid of cell medians **in memory and drops the frame**; its privacy claim #2 is that no depth map is stored, and it exposes no frame output. Guetteur's OpenCV 5 pipeline needs full depth frames, so the real-camera input is **new code**, not an existing interface. Two options, to be decided on Day 4 after reading the DepthAI pipeline: (a) a hook inside oak-events' camera layer that hands the frame to Guetteur before it is dropped, or (b) a separate DepthAI pipeline in Guetteur (stereo depth only; colour never linked to a host queue, same privacy environment settings). Either way the **clip recorder is new, opt-in code that deliberately does the one thing oak-events promises not to do (keep depth frames), for evaluation only**, with consent, writing to a local directory, and never enabled in the deployed product. The importer to `.npz` on Day 4 belongs to that recorder. Real stereo frames will not match the synthetic assumptions (320x240, 72° field of view, Gaussian noise): `F_PX`, the noise model and the zone geometry are refit on real frames on Days 4–5 before any real-data number is reported.
|
|
90
|
+
|
|
91
|
+
### 3.4 Data flow, concretely
|
|
92
|
+
|
|
93
|
+
| Step | Data | Where | Leaves the edge? |
|
|
94
|
+
| --- | --- | --- | --- |
|
|
95
|
+
| capture | colour + stereo | camera chip | colour: never; depth only to host |
|
|
96
|
+
| perceive | depth `uint16[240,320]` per frame | host RAM | no; frame discarded after analysis |
|
|
97
|
+
| evidence | JSON: scalars, up to 3 blobs, 6x8 signed-mm grid | host | only on escalation, <= 16 KB, pictures rejected by schema |
|
|
98
|
+
| claim | JSON: region, frame windows, asserted value, input digest | host disk | optional, same bundle |
|
|
99
|
+
| receipt | re-check of the claim against the **pinned input** | wherever the input is | see 3.5 |
|
|
100
|
+
|
|
101
|
+
### 3.5 Privacy model, and exactly what a receipt re-runs against
|
|
102
|
+
|
|
103
|
+
* **Privacy comes from depth-only sensing.** Colour never reaches the host (inherited from `oak-events`: the colour sensor feeds the on-chip detector only). There is no host-side "redaction" step because there is nothing to redact: no code path reads, writes or sends a picture, and a test (`tests/test_synth_and_privacy.py`) scans code, data and run outputs for image/video files and for imaging calls. Depth still reveals occupancy, silhouettes at close range and timing, so event files are treated as sensitive and kept local.
|
|
104
|
+
* **Receipts need an input to re-run against. Two modes, stated plainly:**
|
|
105
|
+
1. *Recorded or synthetic clips* (demo, evaluation, judge endpoint): the claim pins the clip by content digest (SHA-256 over the depth bytes); `file:` and digest checks fix it. Anyone can re-run the checks.
|
|
106
|
+
2. *Live operation*: the raw depth stream is **not retained**. The receipt then re-runs only against the reduced evidence (grid and blob statistics) or against a **short depth snippet kept only after a human approved an escalation** (7-day S3 lifecycle, opt-in). A live claim whose snippet was not kept will be labelled "evidence reduced; not re-derivable from raw" in the ledger and never presented as fully re-checkable. **Planned: not implemented yet** (the prototype only handles pinned clips).
|
|
107
|
+
* **What the judge endpoint serves is synthetic**, labelled in the page and in every API response (`synthetic: true`). The endpoint refuses arbitrary uploads and visitor-chosen paths.
|
|
108
|
+
|
|
109
|
+
## 4. OpenCV 5 usage (substantive, and central)
|
|
110
|
+
|
|
111
|
+
Pinned: `opencv-python-headless==5.0.0.93` (reports `cv2.__version__ == "5.0.0"`). Headless because a manylinux **aarch64** wheel exists, so the same pin runs on Apple Silicon and on Lambda arm64.
|
|
112
|
+
|
|
113
|
+
| Stage | OpenCV 5 call | Purpose |
|
|
114
|
+
| --- | --- | --- |
|
|
115
|
+
| holes | `cv2.inpaint(TELEA)` on 16-bit depth | fill invalid stereo pixels without inventing data when coverage is gone |
|
|
116
|
+
| denoise | `cv2.medianBlur(5)` on 16-bit | speckle; its effect on noise is *measured at calibration* (`filt_gain`), not assumed |
|
|
117
|
+
| change | signed difference to a temporal-median baseline, in units of a fitted range-dependent noise model | per-pixel significance |
|
|
118
|
+
| clean-up | `cv2.morphologyEx` OPEN then CLOSE, elliptical kernel | remove specks, merge fragments |
|
|
119
|
+
| blobs | `cv2.connectedComponentsWithStats` | regions; physical size via the pinhole model |
|
|
120
|
+
| motion | `cv2.calcOpticalFlowFarneback` on 8-bit depth renderings | moving vs static; sway of a person |
|
|
121
|
+
| evidence | `cv2.resize(INTER_AREA)` to 6x8 | the only spatial evidence that may leave the device |
|
|
122
|
+
| receipt #2 | `cv2.mean(mask)`, `cv2.meanStdDev`, `cv2.countNonZero` | independent per-frame region statistics |
|
|
123
|
+
|
|
124
|
+
Per-stage timings on this Mac are in `eval/runtime.json` (`guetteur bench`). OpenCV 5-specific note: results are reproducible with the pinned wheel; we have not benchmarked against OpenCV 4 and make no performance comparison claim.
|
|
125
|
+
|
|
126
|
+
## 5. Agent design (Agentic Vision rubric: orchestration and autonomy)
|
|
127
|
+
|
|
128
|
+
* **Tools the planner can call** (`planner.py`): `continue`, `recheck_zone(n, k)`, `pause_zone(frames)`, `degrade_zone(frames)`, `compensate_drift(gain)` — autonomous; `request_approval(kind)` — gated.
|
|
129
|
+
* **Planner interface**: `plan(PlanView) -> Action`. `RulePlanner` is deterministic and is what evaluation runs. `LLMPlanner` takes any `complete(prompt) -> str` (Bedrock Converse is the intended one), gets the same JSON view (no pixels), must answer in the same schema, and **anything outside policy is rejected and replaced by the rule planner's choice, recorded in the trace**. An LLM can therefore be added without widening what the system is allowed to do.
|
|
130
|
+
* **Autonomy tiers (enforced by the executor, not by the planner):** observe, re-look, re-tune and compensate are autonomous and bounded (recheck n in [3,40], at most 3 rechecks per episode, drift compensation capped at ±20% total); anything that tells a human something happened needs `request_approval`.
|
|
131
|
+
* **Evidence guardrails:** an object claim is refused unless the *current* observation shows a confident, persistent, non-occupant blob in a healthy zone; a sensor claim is refused if coverage and gain look healthy. A planner (or LLM) cannot assert what the pixels do not show.
|
|
132
|
+
* **Attention gating:** the planner is only called when the observation is salient (quiet scenes: ~1% of zone-frames), which is also what makes an LLM planner affordable.
|
|
133
|
+
* **Human control:** `HumanGate.decide()` returns approve, deny, or `None` on no answer; `None` is deny. After a decision there is a cooldown so a persistent condition is not nagged every frame. Approval adopts the new scene as baseline. In the cloud (phase 2, **draft code with local tests only, never run on AWS**), approvals would live in DynamoDB with a TTL and expire to `denied_timeout`; those routes fail shut unless a server-side `EDGE_KEY` is configured and sent, so an anonymous visitor cannot approve anything. The first deploy leaves them out entirely.
|
|
134
|
+
* **Observability:** every planner call writes a trace record (frame, zone, observation summary, action, rationale, cited numbers, outcome, planner ms) to `trace.jsonl`; counters for planner calls, rechecks, pauses, rejections, timeouts; local runs write the JSONL trace and counters today; **planned, not built:** Lambda structured logs and metrics in CloudWatch (the template enables X-Ray tracing and alarms on errors/throttles, untested).
|
|
135
|
+
* **Failure handling:** noise burst → degrade zone and wait; partial depth loss → degrade, then escalate if it persists; total loss → confirm for 3 frames then escalate; drift → compensate, escalate beyond 20%; recheck budget exhausted → drop, do not claim.
|
|
136
|
+
|
|
137
|
+
## 6. Receipts (prove-it-done, vendored)
|
|
138
|
+
|
|
139
|
+
Each claim is a done step in a ledger with three receipts through different instruments: `file:` (SHA-256 of the claim JSON), `cmd:` numpy-only re-check (never imports cv2; tested), `cmd:` OpenCV frame-statistics re-check. `--min-instruments 2` is required. Independence is partial and we say so: the two checks share the raw input and the claimed region/window, but not each other's estimator or the live pipeline's thresholds. Negative tests (`tests/test_receipts.py`): inflating the claimed value 2x, pointing it at the wrong pixels (objects) or wrong time (sensor/drift), re-pointing it at another recording, and editing the claim file each make the verifier exit 1 — including when the attacker recomputes the `file:` hash. **Tolerance, stated plainly:** a claim passes if the re-measured value is within max(8 mm, 25% of the claim) (coverage ±0.08, gain ±0.01), so small inflations pass by design; the receipts prove a claim is *consistent with the pinned input*, not that the input is the right one.
|
|
140
|
+
|
|
141
|
+
## 7. AWS services, free-tier fit, and cost note
|
|
142
|
+
|
|
143
|
+
All serverless, pay-per-use or free-tier eligible; no idle resources (no NAT gateway, VPC, EC2, load balancer, provisioned capacity or Marketplace subscription).
|
|
144
|
+
|
|
145
|
+
| Service | Role | Cost note |
|
|
146
|
+
| --- | --- | --- |
|
|
147
|
+
| Lambda (arm64/Graviton, python3.12, 1769 MB) | judge dashboard, `/api/run` (OpenCV 5 loop), `/api/verify` (both receipt checks); phase 2 adds authenticated evidence intake | within Lambda's always-free monthly allowance at demo volumes (unverified for a new account); reserved concurrency 5 caps it. Locally the slowest scenario takes ~2.6 s end to end; Lambda timing is **unmeasured** (25 s timeout) |
|
|
148
|
+
| API Gateway HTTP API | HTTPS front door, throttled | priced per request; within free-tier allowance for new accounts at demo volumes |
|
|
149
|
+
| *(phase 2)* DynamoDB on-demand + TTL | approvals, evidence bundles | far below free allowance; TTL clears it |
|
|
150
|
+
| *(phase 2)* S3 (private, SSE, 7-day lifecycle) | opt-in depth snippets after human approval | negligible |
|
|
151
|
+
| CloudWatch Logs/Alarms, X-Ray, SNS, Budgets | observability and cost guard | within free allowances at this volume; a budget alert at 50%/80% of a cap the owner sets |
|
|
152
|
+
|
|
153
|
+
* Credits: DP-Overview "FREE AWS CREDITS FOR NEW MEMBERS" describes Free Tier credits at Free Plan sign-up (plus more via activities), subject to current Free Tier terms and expiry; we have not verified current terms, and no account exists yet. The design is meant to stay within those credits with margin; the throttles, reserved concurrency and budget alert are the guard rails.
|
|
154
|
+
* **Graviton:** the Lambda runs on arm64 and the wheel is aarch64, so the same code and pin are used on this Mac and in AWS. We do *not* claim the Best Use of COOL award: COOL (Cloud-Optimized OpenCV Library) is acquired through an AWS Marketplace listing, whose terms and pricing we have not reviewed, and the award requires measured COOL-vs-baseline evidence on Graviton (OCV "Focus Paths"). Optional stretch on Day 12 *only if* the listing is free and takes under an hour; otherwise skip.
|
|
155
|
+
* Template draft: `INFRA/template.yaml` (passes `cfn-lint`; not deployed; `sam validate` and `sam build` not run).
|
|
156
|
+
|
|
157
|
+
## 8. Judge demo (≤ 5 minutes) and the no-camera fallback
|
|
158
|
+
|
|
159
|
+
Requirements for the video: team, application working, architecture, principal results (OCV "Final Submission Package"). A working web endpoint is preferred over a screen-share (OCV "Requirements for Participation").
|
|
160
|
+
|
|
161
|
+
**Primary script (all on the AWS endpoint, ~4:30):**
|
|
162
|
+
|
|
163
|
+
| Time | Shown | Says |
|
|
164
|
+
| --- | --- | --- |
|
|
165
|
+
| 0:00–0:25 | title card, team, one-line pitch | who we are; depth only; receipts |
|
|
166
|
+
| 0:25–0:55 | architecture + agent-workflow diagrams | OpenCV 5, planner, human gate, AWS |
|
|
167
|
+
| 0:55–1:50 | dashboard: scenario `subtle_item_removed`, planner = rule | one frame is ambiguous (3.5σ) → `recheck_zone(n=7)` → OpenCV re-run → approval request; point at the cited numbers |
|
|
168
|
+
| 1:50–2:20 | same scene, planner = naive | misses it: the evidence changed what the agent did |
|
|
169
|
+
| 2:20–3:00 | `person_takes_item`, gate = approve; then `shelf_item_removed`, gate = timeout | zone pauses while occupied; alert only after they leave; silence = nothing published |
|
|
170
|
+
| 3:00–3:30 | `slow_drift`, `noise_burst`, `lens_obstructed` | sensor trouble ≠ scene event; compensate / wait / escalate |
|
|
171
|
+
| 3:30–4:10 | receipts: click "Tamper: double the claim" | both checks FAIL; show `guetteur verify-ledger` PASS on the honest ledger |
|
|
172
|
+
| 4:10–4:40 | results table + failure case (`subthreshold_item_removed`) | what it cannot do |
|
|
173
|
+
| 4:40–5:00 | what is real vs synthetic; thanks | honest labelling |
|
|
174
|
+
|
|
175
|
+
**Live-camera segment (optional, +30 s, only if Alex records it):** the OAK-D PoE clip replayed through the same loop, labelled "recorded real depth". If not recorded, the video says plainly that all scenes are synthetic.
|
|
176
|
+
|
|
177
|
+
**Fallback without the camera or the network:** `uv run guetteur demo` (narrated, deterministic, ~15 s), and `uv run guetteur serve` for the same dashboard at 127.0.0.1. The primary script *is* the no-camera path; the camera is an extra, never a dependency. Every screen shows "SYNTHETIC".
|
|
178
|
+
|
|
179
|
+
## 9. Evaluation plan
|
|
180
|
+
|
|
181
|
+
### 9.1 Metrics (all computed against machine-readable ground truth)
|
|
182
|
+
Event-level precision/recall of approval requests; scenario success (no false alert, no miss, required behaviours present); latency from event to request (frames and seconds at 5 fps); planner calls per frame; receipt verification rate (honest ledgers proven); tamper rejection rate; per-frame runtime (median/p95/p99) and per-stage OpenCV timings; policy rejections and approval outcomes.
|
|
183
|
+
|
|
184
|
+
### 9.2 Scenarios (11, ×3 seeds) and baselines
|
|
185
|
+
Control; obvious item removed; item added; subtle item removed (ambiguous); person walkthrough; person takes item; noise burst; slow gain drift; lens obstructed; partial washout; **sub-noise item removed (expected miss)**. Baselines: *naive* (threshold-and-alert, no executor guardrails), *naive + guardrails*, and the rule agent. Results: `docs/EVALUATION.md` (generated by `guetteur eval`). Snapshot (synthetic, 3 seeds, this Mac): the agent succeeded on 30/30 scenarios that are detectable and missed the 3 documented sub-noise runs (precision 1.00, recall 1.00 excluding that case); the raw threshold baseline succeeded on 12/33 with precision 0.25; 21/21 honest ledgers proven; 24/24 tampered ledgers rejected; median 8.6 ms per frame for both zones (p95 11.6 ms) against a 200 ms budget.
|
|
186
|
+
|
|
187
|
+
### 9.3 Failure cases we report, not hide
|
|
188
|
+
Sub-noise changes are invisible; depth cannot name objects; a person partly outside a zone can be momentarily read as a small change (the persistence rule absorbs it); thresholds were tuned on the same synthetic family they are scored on (an optimistic bias — the reason real recordings matter); noise is Gaussian in the generator but not on a real stereo pipeline.
|
|
189
|
+
|
|
190
|
+
### 9.4 What real data would add (needs Alex, section 12)
|
|
191
|
+
15–20 min recordings of depth only from the OAK-D PoE in three conditions (empty shelf/door, a person walking through, an item removed), labelled by Alex. Run through the identical loop; report the same metrics next to the synthetic ones. Without these the report says "synthetic only".
|
|
192
|
+
|
|
193
|
+
### 9.5 Mapping to the Agentic Vision rubric (DP-Rules "AGENTIC VISION AWARD RUBRIC")
|
|
194
|
+
| Criterion (weight) | Evidence we will point to |
|
|
195
|
+
| --- | --- |
|
|
196
|
+
| Substantive OpenCV 5 + agent integration (30) | section 4 table; traces where OpenCV output sets the next call's arguments |
|
|
197
|
+
| Orchestration and appropriate autonomy (25) | autonomy tiers, bounded rechecks, LLM slot behind policy, human gate |
|
|
198
|
+
| Task effectiveness and evaluation (20) | `docs/EVALUATION.md`, ablation vs naive, failure cases |
|
|
199
|
+
| Failure handling, observability, security, human control (15) | sensor-fault paths, trace + CloudWatch, default-deny gate, JSON-only intake, throttles, tamper tests |
|
|
200
|
+
| UX, documentation, demonstration (10) | dashboard, README, ≤5-min video |
|
|
201
|
+
|
|
202
|
+
## 10. Responsible use
|
|
203
|
+
|
|
204
|
+
* Depth-only by construction; no faces, no images, no video stored or sent (DP-Rules "RESPONSIBLE AND ETHICAL USE": surveillance risk needs "appropriate safeguards").
|
|
205
|
+
* Intended for spaces whose owner controls the camera and where people present know it is there; for homes and care settings only with the informed consent of everyone monitored. Not for workplace productivity monitoring, tracking individuals, or covert use. Stated in the README and the report.
|
|
206
|
+
* No identification: the system cannot, and is not designed to, say who someone is.
|
|
207
|
+
* Human control: alerts require a person's approval; silence means no alert; claims are labelled with their evidence basis; failures and limits are published.
|
|
208
|
+
* Truthful labelling (DP-Rules: entries may be rejected for misrepresenting "capabilities, results, benchmarks, or the role of human review"): synthetic data is marked synthetic everywhere; the LLM planner is described as an interface until a model is actually wired.
|
|
209
|
+
* Disclosure: the entry was built with AI coding assistance, and the agent in the product is deterministic code with an optional LLM slot; this is stated in the report (using an assistant to write the entry does not itself qualify as Agentic Vision: OCV "Focus Paths").
|
|
210
|
+
* Security of the public endpoint: scenario names and small JSON only, no uploads, no visitor-chosen paths, body size limit, API throttling, reserved concurrency, no secrets in the repo.
|
|
211
|
+
|
|
212
|
+
## 11. 14-day schedule (today is Oct 12; Day 1 = Oct 13; deadline Oct 26 11:45pm PDT, submit Oct 25)
|
|
213
|
+
|
|
214
|
+
| Day | Date | Milestone | Done when |
|
|
215
|
+
| --- | --- | --- | --- |
|
|
216
|
+
| 0 | Mon Oct 12 | prototype, tests, design, template draft (this work) | pytest green, eval + bench logs saved |
|
|
217
|
+
| 1 | Tue Oct 13 | **Alex: confirm eligibility/registration; decide go/no-go**; create repo `cloudlabworks/guetteur` after identity scan | answer recorded; repo exists |
|
|
218
|
+
| 2 | Wed Oct 14 | AWS account (Free Plan), budget alert, `sam validate`; `sam build --use-container` | template validates, build ok |
|
|
219
|
+
| 3 | Thu Oct 15 | first deploy = public **read-only** endpoint (no evidence/approval routes); `/healthz` shows `opencv 5.0.0`, `aarch64`; time every scenario on Lambda against the 25 s timeout | curl receipt passes; timings recorded; repo stays private until then |
|
|
220
|
+
| 4 | Fri Oct 16 | decide the depth tap (section 3.3); new opt-in recorder writes depth-only `.npz`; record real clips (Alex + OAK-D, ~1 h) | 3 labelled clips on disk (outside git if large) |
|
|
221
|
+
| 5 | Sat Oct 17 | **refit `F_PX`, noise model and zones on real frames** (they will differ from 320x240 / 72° / Gaussian); run real clips through the loop; tune only on a held-out split; add real-data metrics | numbers in `docs/EVALUATION.md` |
|
|
222
|
+
| 6 | Sun Oct 18 | LLM planner wired to Bedrock behind the same policy (only if account/model access is straightforward; otherwise leave as interface and say so) | rejection tests pass with the real model |
|
|
223
|
+
| 7 | Mon Oct 19 | deploy phase 2: DynamoDB, S3, evidence/approval routes behind `x-edge-key`; **deployed negative test** (no key / wrong key → 403); S3 snippet re-check function | negative tests pass on AWS |
|
|
224
|
+
| 8 | Tue Oct 20 | edge → cloud path end to end with a real clip; approval round trip through the cloud; **replay of Alex's recorded clips on Lambda** | approval round trip in logs; real-clip result from the endpoint |
|
|
225
|
+
| 9 | Wed Oct 21 | technical report draft (from this document + results) | draft in `docs/REPORT.md` |
|
|
226
|
+
| 10 | Thu Oct 22 | architecture + workflow diagrams final; load/abuse test of the endpoint; cost check against credits | throttle and alarm demonstrated |
|
|
227
|
+
| 11 | Fri Oct 23 | video recording (script in section 8); screenshots | raw video |
|
|
228
|
+
| 12 | Sat Oct 24 | video edit; README polish; fresh-clone test of every command; (optional COOL probe) | clean clone passes |
|
|
229
|
+
| 13 | Sun Oct 25 | **submit** (Alex presses the button); endpoint check from outside the network | submission confirmation saved |
|
|
230
|
+
| 14 | Mon Oct 26 | buffer only; no new features; deadline 11:45pm PDT | — |
|
|
231
|
+
|
|
232
|
+
Cut order if time slips: COOL probe → LLM wiring → live-camera segment in the video. **Never cut:** deployed endpoint; receipts + tamper demo; failure cases; honest labelling; an approval round trip through the cloud; replay of the recorded real clips on Lambda (without them AWS only replays synthetic scenes, which weakens "a meaningful component on AWS", OCV "Requirements for Participation").
|
|
233
|
+
|
|
234
|
+
## 12. What needs Alex
|
|
235
|
+
|
|
236
|
+
1. **Eligibility check (blocking).** Is Team Drift registered on Devpost and did it submit the grant proposal? (Section 0, `docs/RULES_NOTES.md` #1.) If no, decide whether to ask `competition@opencv.org` (the contact on OCV "Contact & Questions") — we will not contact anyone on our own.
|
|
237
|
+
2. **AWS account**: create a Free Plan account under Cloud Lab Works (never a personal or employer account); set the budget figure; enable MFA; confirm the owner's alert email. We have no AWS credentials and did not look for any.
|
|
238
|
+
3. **Budget decision**: choose the monthly budget-alert figure (the template deliberately has no default) and confirm that staying within Free Tier/promo credits is the rule; say whether Bedrock model calls (Day 6) are in or out.
|
|
239
|
+
4. **Camera time**: ~1 hour with the OAK-D PoE on Day 4 (depth-only recordings of an empty shelf/door, a walk-through, an item removed) and a few minutes of labelling. No faces or identifiable people in any clip; anyone in frame must consent.
|
|
240
|
+
5. **Press submit** on Oct 25; the team representative handles the Devpost form (DP-Rules "ELIGIBILITY AND FAIR PLAY").
|
|
241
|
+
6. **Repo publication**: create `cloudlabworks/guetteur` as **private** (OCV "Final Submission Package" allows a private, judge-accessible repository), run the identity scan (noreply email, no employer material) before the first push, and make it judge-accessible only at submission.
|
|
242
|
+
|
|
243
|
+
## 13. Risks (ranked)
|
|
244
|
+
|
|
245
|
+
1. Not eligible / no proposal on file (section 0).
|
|
246
|
+
2. Synthetic-only evidence reads as weak "technical execution"; mitigated only by real clips (Day 4–5).
|
|
247
|
+
3. First AWS deployment problems (arm64 layer build needs Docker; Lambda 25 s timeout vs ~2.6 s worst case locally with Lambda timing unmeasured; cold start); Day 2–3 buffer.
|
|
248
|
+
4. Overfit to our own generator: thresholds tuned on the family they are scored on.
|
|
249
|
+
5. "Agentic" read as rules-with-extra-steps: the LLM slot is not wired until Day 6; the award text allows "any framework or model" (OCV "Focus Paths"), and the loop still satisfies "image or video results must influence a subsequent plan, tool call, action, or request for human approval".
|
|
250
|
+
6. Cost or abuse on a public endpoint: throttle, reserved concurrency, budget alert, no uploads.
|
|
251
|
+
7. Devpost/organiser rule drift: the pages defer to an "Official Rules" document we did not find; re-read all pages on Day 12.
|