39 KiB
39 KiB
Progress
2026-04-27
- Created project directory
~/Code/cold_display_guard. - Confirmed standalone project scope and initial project name.
- Started file-based planning files.
- Created core engine, config loader, CLI, README, design doc, implementation plan, and tests.
- First test run failed because
_end_batch()setended_atbefore calculating dwell seconds, causing ended batches to report0seconds. Fixed by calculating dwell before assigningended_at. - Test suite now passes:
PYTHONPATH=src python3 -m unittest discover -s tests -v. - Initialized git repository and created the initial project commit.
- Added RTSP single-frame calibration tool under
tools/calibrator. - Added formal management API on port
19080and Vite frontend on port23000.
2026-05-26 v1.1 优化改造
Session Log
| Time | Batch Workstream | Actor | Action | Result |
|---|---|---|---|---|
| 2026-05-26 | Batch setup and planning | Main Agent | Created active goal for v1.1 优化改造 |
Goal tracks dynamic zones, trash ROI editing, custom alarm threshold, warning escalation |
| 2026-05-26 | Batch setup and planning | Main Agent | Started backend and frontend planning sub-agents | Waiting for role outputs while updating plan files |
| 2026-05-26 | Batch setup and planning | Main Agent | Updated task_plan.md and findings.md with v1.1 scope |
v1.1 优化改造 planning in progress |
| 2026-05-26 | Batch setup and planning | Frontend Agent | Returned frontend planning notes | Added dynamic zones, trash ROI, event display, and validation notes to findings.md |
| 2026-05-26 | Batch setup and planning | Backend Agent | Returned backend event model and test risk notes | Added event flow, summary risk, and compatibility notes to findings.md |
| 2026-05-26 | Batch setup and planning | User | Clarified that all requested work belongs to one v1.1 development batch with different workstreams | Updated task_plan.md and docs/project.md wording |
| 2026-05-26 | Batch setup and planning | User | Asked to remove earlier split-work wording and make it part of one batch | Renamed v1.1 plan table to batch workstreams and replaced split-work wording in progress |
| 2026-05-26 | Batch setup and planning | User | Set the batch name to v1.1 优化改造 |
Updated planning documents to use this name |
| 2026-05-26 | Backend event model | Review Agent | Re-reviewed event model after severity fix | Pass; no blocking issues for Config/API workstream |
| 2026-05-26 | Batch setup and planning | User | Required a standard context header before each subagent task dispatch | Added header convention to task_plan.md and findings.md; future subagent prompts will include project, batch, stage, and role |
| 2026-05-26 | Batch setup and planning | User | Clarified that 项目 in subagent task headers should use the actual project path |
Updated the required header path to /Users/yoilun/Code/cold_display_guard |
| 2026-05-26 | Config and management API | Main Agent | Added 1-10 numeric zone validation, zone_count, label, trash ROI separation, and alarm/warning summary counts |
Target config/API tests and full Python tests passed |
| 2026-05-26 | Config and management API | Review Agent | Reviewed Config/API workstream | No blocking issues; raised two major contract issues, both fixed with regression tests |
| 2026-05-26 | Frontend management console | Main Agent | Added dynamic 1-10 numeric zone editor, independent trash ROI editing, minute-based alarm threshold, and alarm/warning event rendering | Frontend unit test and Vite build passed |
| 2026-05-26 | Frontend management console | Frontend Agent | Reviewed frontend workstream | No blocking issues; raised two major legacy-mapping/label issues, both fixed with regression tests and sent for re-review |
| 2026-05-26 | Documentation and final review | Main Agent | Updated README_zh.md, docs/project.md, and config/example.toml for v1.1 numeric zones and event flow |
Docs now describe one v1.1 优化改造 batch and current configuration/event model |
| 2026-05-26 | Frontend management console | Frontend Agent | Re-reviewed frontend legacy mapping and label normalization fixes | Pass; no blocking, no major, no new minor issues |
| 2026-05-26 | Documentation and final review | Review Agent | Ran final v1.1 review | No blocking; found two major issues in removal-time alarm ordering and partial calibration zone-count preservation, plus one planning-doc minor |
| 2026-05-26 | Documentation and final review | Main Agent | Fixed final review issues | Added tests and fixes for removal-frame time_alarm, partial numeric calibration preserving zone_count, and updated top-level plan wording |
| 2026-05-26 | Documentation and final review | Review Agent | Re-reviewed final fixes | Pass; no blocking, no major, no minor issues |
| 2026-05-26 | Documentation and final review | Main Agent | Completed v1.1 优化改造 batch |
Stop conditions satisfied and final verification recorded |
| 2026-05-26 | Homepage demo runtime display | Main Agent | Cleared old event data and added complete demo runtime homepage | Homepage now defaults to runtime view with demo banner, metrics, dwell progress, and event table when real events are empty |
| 2026-05-26 | Homepage demo runtime display | Frontend Agent | Implemented demo runtime display and tests | Added buildRuntimeDisplayModel, progress rows, demo/real labels, and responsive styles |
| 2026-05-26 | Homepage demo runtime display | Review Agent | Reviewed homepage demo runtime display | Found progress ordering, threshold fallback, and XSS issues; all were fixed with regression tests |
| 2026-05-26 | Homepage demo runtime display | Review Agent | Final re-review | Pass; no blocking or major issues |
| 2026-05-26 | Homepage demo runtime display | Main Agent | Rebuilt Docker web service | http://127.0.0.1:23000 serves nginx container with latest frontend asset |
| 2026-05-26 | Homepage demo runtime display | User | Reported that the runtime demo homepage was still not visible | Reproduced in Chrome; found frontend initialization stopped before tab switching |
| 2026-05-26 | Homepage demo runtime display | Main Agent | Fixed null config runtime display crash | buildRuntimeDisplayModel() now tolerates config: null; Chrome shows runtime page with demo data, metrics, progress, and event table |
| 2026-05-26 | Remote Docker deployment | Main Agent | Probed xiaozheng@192.168.5.206 for Docker availability |
Blocked by SSH authentication failure: Permission denied (publickey,password) |
| 2026-05-26 | Remote Docker deployment | Main Agent | Synced project to xiaozheng@192.168.5.206:/home/xiaozheng/cold_display_guard |
rsync -az --delete completed with .git, local env, node modules, web dist, and logs excluded |
| 2026-05-26 | Remote Docker deployment | Main Agent | Built and started Docker services on 192.168.5.206 |
API and Web are running; runtime was stopped because [stream].rtsp_url is empty |
| 2026-05-26 | Hide demo runtime data | Main Agent | Removed synthetic demo runtime summary/events/progress from the frontend model | Empty or diagnostics-only runtime data now renders empty states and real metrics only |
| 2026-05-26 | Hide demo runtime data | Main Agent | Synced and rebuilt Web on 192.168.5.206 |
Remote Web serves index-D3qCb2DS.js without demo batch/camera or visible demo-data strings |
| 2026-05-27 | Runtime recognition startup | Main Agent | Checked whether recognition had started on 192.168.5.206 |
Runtime was stopped, then started after fixing remote timezone from shanghai to Asia/Shanghai; diagnostics show frame capture and baseline_ready: true |
| 2026-05-27 | Runtime recognition investigation | Main Agent | Investigated why zones 1 and 6 appeared to stop counting after 20 minutes | Evidence shows zones 1 and 6 remain occupied; frontend freezes at the one-time time_alarm event dwell value because no live tick is emitted/rendered |
| 2026-05-28 | Runtime vision small-object detection | Main Agent | Investigated why zones 1/2/5 placements were missed, zone 4 started timing, and zone 2 produced repeated short events | Evidence showed small dark objects were diluted by whole-region mean/texture while zone 4 reflection drove texture false positives |
| 2026-05-28 | Runtime vision small-object detection | Main Agent | Added dark-pixel fraction occupancy and bright-reflection filtering, then deployed to 192.168.5.206 |
Current remote diagnostics show zones 1/2/5 occupied and zone 4 empty |
| 2026-05-29 | Same-frame trash confirmation | Main Agent | Investigated why zone 1 was removed and trash motion was visible but still escalated | Diagnostics showed deposit=true in the same frame as removal, but the engine applied trash deposits before creating pending_disposal |
| 2026-05-29 | Same-frame trash confirmation | Main Agent | Applied remaining trash deposits again after zone transitions and deployed to 192.168.5.206 |
Same-frame removal plus visible trash ROI motion now emits batch_pending_disposal followed by batch_discarded |
| 2026-05-29 | Zone 4 reflection and stale progress | Main Agent | Investigated why zone 4 kept timing and why zone 9/10 progress bars appeared | Zone 4 had high bright reflection plus a small dark edge crossing the dark threshold; zone 9/10 came from historical events outside the current 1-8 config |
| 2026-05-29 | Zone 4 reflection and stale progress | Main Agent | Added high-bright/small-dark reflection suppression and filtered progress rows to current configured zones only | Remote summary now reports zones 1-8 all empty and frontend model returns no progress rows |
| 2026-05-29 | Event table dwell display | Main Agent | Investigated why a zone 1 batch_started row kept counting after the batch was consumed |
Frontend displayed live dwell per row and did not know the same batch had a later terminal event |
| 2026-05-29 | Event table dwell display | Main Agent | Limited event-table live dwell to the latest non-terminal event per batch and deployed the Web container | Removed batch_started rows now keep their recorded dwell value while the terminal row shows final dwell |
Test Results
| Time | Command | Result | Notes |
|---|---|---|---|
| 2026-05-26 | PYTHONPATH=src python3 -m unittest tests/test_engine.py -v |
pass | 11 engine tests passed after v1.1 event model changes |
| 2026-05-26 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 20 full Python tests passed |
| 2026-05-26 | PYTHONPATH=src python3 -m unittest tests/test_config.py -v |
pass | 6 config tests passed after numeric zone validation fixes |
| 2026-05-26 | PYTHONPATH=src python3 -m unittest tests/test_manage_api.py -v |
pass | 7 manage API tests passed after warning summary fixes |
| 2026-05-26 | node --test web/test/zone-state.test.js |
pass | 7 frontend zone-state tests passed |
| 2026-05-26 | cd web && pnpm build |
pass | Vite production build passed |
| 2026-05-26 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 28 full Python tests passed after v1.1 config/API changes |
| 2026-05-26 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 30 full Python tests passed after final review fixes |
| 2026-05-26 | node --test web/test/zone-state.test.js |
pass | 7 frontend zone-state tests passed after final review fixes |
| 2026-05-26 | cd web && pnpm build |
pass | Vite production build passed after final review fixes |
| 2026-05-26 | node --test web/test/zone-state.test.js |
pass | 14 frontend zone-state tests passed after homepage demo runtime and review fixes |
| 2026-05-26 | cd web && pnpm build |
pass | Vite production build passed with latest homepage runtime asset |
| 2026-05-26 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 30 full Python tests passed after homepage runtime changes |
| 2026-05-26 | docker compose --env-file cold-display-guard.env -f docker-compose.yml up -d --build cold-display-guard-web |
pass | Docker web image rebuilt and container restarted |
| 2026-05-26 | node --test web/test/zone-state.test.js |
pass | 15 frontend zone-state tests passed after null-config startup fix |
| 2026-05-26 | cd web && pnpm build |
pass | Vite production build passed after null-config startup fix |
| 2026-05-26 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 30 full Python tests passed after null-config startup fix |
| 2026-05-26 | docker compose build cold-display-guard-api cold-display-guard-web on 192.168.5.206 |
pass | Built cold-display-guard:dev and cold-display-guard-web:dev |
| 2026-05-26 | docker compose up -d on 192.168.5.206 |
pass | API, runtime, and web containers created; runtime exited due missing RTSP |
| 2026-05-26 | curl http://192.168.5.206:19080/api/manage/health |
pass | API returned {"status":"ok"} |
| 2026-05-26 | curl -I http://192.168.5.206:23000/ |
pass | Web returned HTTP/1.1 200 OK |
| 2026-05-26 | node --test web/test/zone-state.test.js |
pass | 16 frontend model tests passed after hiding demo runtime data |
| 2026-05-26 | cd web && pnpm build |
pass | Vite production build passed with index-D3qCb2DS.js |
| 2026-05-26 | docker compose up -d --build cold-display-guard-web on 192.168.5.206 |
pass | Remote Web and API containers restarted; API healthy, Web returned HTTP/1.1 200 OK |
| 2026-05-26 | `rg "演示数据 | DEMO DATA | demo_batch |
| 2026-05-27 | docker ps -a --filter name=cold-display-guard on 192.168.5.206 |
pass | Runtime is Up; API is healthy; Web is up |
| 2026-05-27 | tail -5 logs/runtime_diagnostics.jsonl on 192.168.5.206 |
pass | Runtime is writing fresh diagnostics; baseline became ready and all 10 zones reported counts |
| 2026-05-27 | `grep '"zone_id": "1"' logs/events.jsonl | tail -20on192.168.5.206` |
pass |
| 2026-05-27 | `grep '"zone_id": "6"' logs/events.jsonl | tail -20on192.168.5.206` |
pass |
| 2026-05-27 | tail -5 logs/runtime_diagnostics.jsonl on 192.168.5.206 |
pass | Latest diagnostics still report zones 1 and 6 as occupied: true |
| 2026-05-27 | node --test web/test/zone-state.test.js |
pass | 18 frontend model tests passed after live dwell timer fix |
| 2026-05-27 | PYTHONPATH=src python3 -m unittest tests/test_vision.py -v |
pass | Vision regression tests passed for consecutive occupancy confirmation and raised reflection threshold |
| 2026-05-27 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 32 full Python tests passed after runtime vision changes |
| 2026-05-27 | pnpm build in web/ |
pass | Vite production build passed with index-BkBYO5x5.js |
| 2026-05-27 | rsync -az --delete ... --exclude config/example.toml to 192.168.5.206 |
pass | Code synced while preserving remote RTSP/calibration config |
| 2026-05-27 | Remote config append [runtime] thresholds |
pass | Added occupancy_mean_delta = 45.0, occupancy_confirm_frames = 2, and empty_confirm_frames = 2 without changing RTSP |
| 2026-05-27 | docker compose build cold-display-guard-api cold-display-guard-web on 192.168.5.206 |
pass | Built new API/runtime shared image and web image with live timer code |
| 2026-05-27 | docker compose up -d --no-deps cold-display-guard-api cold-display-guard-web on 192.168.5.206 |
pass | API and Web restarted; runtime intentionally left running to avoid relearning baseline with items still present |
| 2026-05-27 | curl remote health and web index |
pass | API returned healthy and Web serves index-BkBYO5x5.js |
| 2026-05-27 | node --test web/test/zone-state.test.js |
pass | 20 frontend model tests passed after event-table live dwell and current-zone filtering |
| 2026-05-27 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 36 full Python tests passed after runtime state restore and seeded vision baseline |
| 2026-05-27 | docker compose up -d --no-deps cold-display-guard-runtime cold-display-guard-api on 192.168.5.206 |
pass | Runtime restarted on new image while preserving active 1/6/7 timers from event history and prior baseline |
| 2026-05-27 | tail -n 3 logs/runtime_diagnostics.jsonl on 192.168.5.206 |
pass | New diagnostics include raw_occupied/streaks; 1/6/7 occupied, 3/4/5/8 empty |
| 2026-05-27 | Remote summary after 12 seconds | pass | Event count stayed at 579; no new false events after runtime restart |
| 2026-05-28 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 39 full Python tests passed after dark-fraction occupancy and reflection filtering |
| 2026-05-28 | node --test web/test/zone-state.test.js |
pass | 20 frontend model tests passed |
| 2026-05-28 | pnpm build in web/ |
pass | Vite production build passed with index-DFRi3R8X.js |
| 2026-05-28 | rsync -az --delete ... --exclude config/example.toml to 192.168.5.206 |
pass | Code synced while preserving remote RTSP/calibration config |
| 2026-05-28 | Remote config runtime patch | pass | Added dark-fraction and bright-reflection runtime thresholds without printing or changing RTSP |
| 2026-05-28 | docker compose build cold-display-guard-api and up -d --no-deps cold-display-guard-runtime cold-display-guard-api on 192.168.5.206 |
pass | API/runtime rebuilt and restarted on the new image |
| 2026-05-28 | Remote diagnostics/API summary | pass | Current counts show zones 1/2/5 occupied and zones 3/4/6/7/8 empty; zone 4 has reflection texture but dark fraction remains 0.0 |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest tests.test_engine.BatchEngineTests.test_same_observation_removal_and_trash_motion_discards_alerted_batch -v |
red then pass | Reproduced and fixed same-frame trash motion being ignored for a newly pending alerted batch |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest tests.test_main -v |
red then pass | Runtime restart state restore now uses dark-fraction/bright-reflection occupancy rules |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 41 full Python tests passed after same-frame trash confirmation and restore-rule fixes |
| 2026-05-29 | node --test web/test/zone-state.test.js |
pass | 20 frontend model tests still passed |
| 2026-05-29 | rsync -az --delete ... --exclude config/example.toml to 192.168.5.206 |
pass | Code synced while preserving remote RTSP/calibration config |
| 2026-05-29 | docker compose build cold-display-guard-api and up -d --no-deps cold-display-guard-runtime cold-display-guard-api on 192.168.5.206 |
pass | API/runtime rebuilt and restarted on the same-frame trash confirmation fix |
| 2026-05-29 | Remote status and diagnostics check | pass | Runtime/API are up; API healthy; latest diagnostics are being written after restart |
| 2026-05-29 | Targeted reflection/progress tests | red then pass | Added regressions for bright reflection with small dark edge, runtime restore/API recompute using that rule, and hiding historical zone 9/10 progress |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 42 full Python tests passed after zone 4 reflection suppression |
| 2026-05-29 | node --test web/test/zone-state.test.js |
pass | 21 frontend model tests passed after current-zone progress filtering |
| 2026-05-29 | pnpm build in web/ |
pass | Vite production build passed with index-sJMxcaD6.js |
| 2026-05-29 | docker compose build cold-display-guard-api cold-display-guard-web and up -d --no-deps cold-display-guard-runtime cold-display-guard-api cold-display-guard-web on 192.168.5.206 |
pass | Runtime/API/Web rebuilt and restarted with reflection and progress fixes |
| 2026-05-29 | Remote API/diagnostics/frontend model verification | pass | API latest_zone_counts shows zones 1-8 all 0; latest diagnostics show zone 4 occupied: false; model progress rows are empty |
| 2026-05-29 | node --test web/test/zone-state.test.js |
red then pass | Added regression so batch_started rows stop live ticking after the same batch has a terminal event |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 42 Python tests still passed after frontend-only dwell display fix |
| 2026-05-29 | pnpm build in web/ |
pass | Vite production build passed with index-BoXFyXbk.js |
| 2026-05-29 | docker compose build cold-display-guard-web and up -d --no-deps cold-display-guard-web on 192.168.5.206 |
pass | Remote Web rebuilt and serves index-BoXFyXbk.js |
| 2026-05-29 | Remote frontend model verification for batch_000473 |
pass | batch_started displays 0 seconds and batch_consumed displays final 64 seconds |
| 2026-05-29 | API stable-occupancy regression tests | red then pass | latest_zone_counts now uses runtime's debounced occupied state before raw threshold fallback |
| 2026-05-29 | Trash sustained-motion regression test | red then pass | Two consecutive moderate trash motions below the strong threshold now confirm disposal |
| 2026-05-29 | Runtime restore stable-occupancy regression test | red then pass | Restart restore now preserves debounced occupancy for threshold-edge zones |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 45 full Python tests passed |
| 2026-05-29 | node --test web/test/zone-state.test.js |
pass | 22 frontend model tests passed |
| 2026-05-29 | docker compose build cold-display-guard-runtime cold-display-guard-api and up -d --no-deps cold-display-guard-runtime cold-display-guard-api on 192.168.5.206 |
pass | Runtime/API rebuilt and restarted with stable count and sustained trash-motion fixes |
| 2026-05-29 | Remote API/diagnostics verification | pass | API healthy; runtime writes motion_streak/strong_motion/sustained_motion; API summary matches stable zone counts |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest tests.test_vision.VisionTests.test_runtime_vision_defaults_raise_brightness_reflection_threshold -v |
red then pass | Default runtime sampling is now dense enough for small ROIs: sample_stride_pixels = 4 |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 45 full Python tests passed after dense sampling default |
| 2026-05-29 | node --test web/test/zone-state.test.js |
pass | 22 frontend model tests passed |
| 2026-05-29 | Remote runtime/API rebuild and config patch | pass | Remote config now has sample_stride_pixels = 4; runtime/API restarted |
| 2026-05-29 | Remote zone 1 diagnostics verification | pass | Zone 1 stayed occupied for 16 consecutive post-deploy checks; API summary reports zone 1 as occupied |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest tests.test_engine.BatchEngineTests.test_same_observation_trash_motion_discards_multiple_newly_pending_batches -v |
red then pass | Same-frame trash motion now discards multiple alerted batches that clear together |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest tests.test_vision.VisionTests.test_detector_allows_quick_sequential_strong_trash_motions -v |
red then pass | Quick sequential strong trash motions are no longer suppressed by the old 8-second cooldown |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 47 full Python tests passed after multi-zone trash confirmation fix |
| 2026-05-29 | node --test web/test/zone-state.test.js |
pass | 22 frontend model tests passed |
| 2026-05-29 | Remote runtime/API rebuild and config patch | pass | Remote config now has trash_motion_cooldown_seconds = 3; diagnostics include in_cooldown |
Bug Loop
| Batch Workstream | Bug | Fix Attempt | Retest Result |
|---|---|---|---|
| Backend event model | Review agent found severity missing from some events such as batch_started and mixed_batch_violation |
Added regression assertions and made _event() assign default severity by event type |
Resolved; re-review passed |
| Config and management API | Review agent found zone_count could conflict with numeric zone_ids, and pending disposal was counted as an upgraded warning |
Added regression tests; validate zone_count == len(zone_ids) and count only warning_escalated/legacy _violation as warning events |
Resolved; target tests and full Python tests passed |
| Frontend management console | Frontend agent found old rows/cols configs without zone_ids lost legacy polygons, and old labels could be saved back to numeric zones |
Added regression tests; derive legacy rNcM source IDs from rows/cols and normalize labels to 区域 N |
Resolved; re-review passed |
| Documentation and final review | Final review found removal observations at the threshold skipped time_alarm before pending disposal |
Added regression tests and moved time-alarm application before zone-clear transitions | Resolved; Python tests passed |
| Documentation and final review | Final review found partial calibration saves could shrink zone_count to the number of completed polygons |
Added frontend payload layout, backend merge support for target numeric zone IDs, and regression tests preserving existing polygons/count |
Resolved; Python and frontend tests passed |
| Homepage demo runtime display | Review found real progress kept maximum dwell time instead of the latest event | Added latest-event regression tests and selected per-zone progress by timestamp or event order | Resolved; frontend tests passed |
| Homepage demo runtime display | Review found event rows missing threshold values fell back to 1200 instead of config threshold | Added regression test and inherited the configured threshold | Resolved; frontend tests passed |
| Homepage demo runtime display | Review found latest_zone_counts was interpolated into innerHTML without escaping |
Added shared escapeHtml() and escaped each zone-count fragment |
Resolved; final review passed |
| Homepage demo runtime display | Browser showed static calibration page because runtime display read config.thresholds while config was still null |
Added regression test for config: null and normalized missing config to {} before deriving thresholds |
Resolved; Chrome verification shows runtime demo homepage |
| Remote Docker deployment | SSH to xiaozheng@192.168.5.206 failed with Permission denied (publickey,password) |
Tried normal SSH and escalated SSH using the same host/user; local key was not accepted and no interactive password was available | Blocked until credentials are provided or the local public key is authorized on the remote host |
| Remote Docker deployment | Initial docker compose up -d --build attempted to pull cold-display-guard:dev before a local image existed |
Stopped the hanging SSH command, confirmed no existing local image, then explicitly ran docker compose build cold-display-guard-api cold-display-guard-web before up -d |
Resolved; images built and API/Web started |
| Remote Docker deployment | cold-display-guard-runtime restarted repeatedly |
Checked runtime logs; root cause was ValueError: stream.rtsp_url is required because config/example.toml has an empty RTSP URL |
Stopped runtime container until an RTSP URL is configured |
| Hide demo runtime data | Empty runtime data still generated synthetic demo summary/events/progress | Added failing frontend tests, then replaced demo fallback with empty summary, empty events, and empty progress rows | Resolved; frontend tests and build passed |
| Hide demo runtime data | Legacy event.demo rows or cold_display_guard_demo summaries could still surface if old data existed |
Added failing regression test, filtered demo-marked events/summaries, and removed visible demo labels from event rendering | Resolved; remote JS asset has no visible demo-data strings |
| Runtime recognition startup | Runtime restarted after RTSP was configured but exited with ZoneInfoNotFoundError: 'No time zone found with key shanghai' |
Updated remote config and local example config to timezone = "Asia/Shanghai", then restarted runtime |
Resolved; runtime remains up and writes diagnostics |
| Runtime recognition investigation | Frontend dwell display stops near the 20-minute alarm even while the item remains present | Added live dwell computation from started_at for non-ended batches, one-second frontend re-render, five-second runtime-data polling, and broader event fetch limit |
Resolved; Web/API deployed |
| Runtime vision false positives | Reflections in empty zones crossed the old mean-luma threshold and triggered occupancy/alarm | Raised default occupancy_mean_delta to 55.0, added 2-frame occupied/empty confirmation, recomputed current counts in API from diagnostics, restored runtime state from events/diagnostics, and restarted runtime |
Resolved; latest diagnostics show only 1/6/7 occupied |
| Runtime vision small dark objects | Zones 1/2/5 contained compact dark objects that did not always exceed whole-region mean/texture thresholds; zone 4 bright reflection exceeded texture threshold; zone 2 flickered around the old threshold and created repeated short batches | Added dark-fraction metrics, required dark evidence for texture occupancy, ignored bright reflection without dark evidence, and added manage API recomputation with the same rule | Resolved; latest remote diagnostics keep 1/2/5 occupied, 4 empty, and zone 2 no longer produces consume/start flicker after deployment |
| Same-frame trash confirmation | Trash motion in the visible trash ROI could occur in the exact frame where an alerted zone was removed; the engine consumed trash deposits before it created the new pending-disposal batch, so the deposit was lost and the batch later escalated | Added a regression test and reapplied leftover trash deposits after zone transitions; also updated runtime restore to use the dark-fraction rules before restart | Resolved for future events; existing historical warning_escalated rows are not rewritten |
| Zone 4 reflection and stale zone 9/10 progress | Zone 4 reflection produced both bright pixels and a small dark edge above the dark-object threshold; old zone 9/10 events were still eligible for progress rows because missing live counts were treated as occupied | Added a reflection classifier for high-bright/small-dark patterns and required progress rows to belong to current configured food zones with explicit live occupancy when diagnostics are present | Resolved; remote currently shows no occupied zones and no progress rows |
| Event table live dwell after removal | Earlier batch_started rows had no ended_at, so the frontend kept applying live dwell even after a later event in the same batch ended it |
Event rows now compute live dwell only for the latest non-terminal event in each batch | Resolved; removed batches no longer keep counting in their batch_started row |
| Zone 2 progress flicker | API summary recomputed latest zone counts from raw metrics, bypassing runtime's occupied/empty confirmation; threshold-edge zone 2 could flip to 0 while runtime still held stable occupied |
Summary now prefers per-zone stable occupied from diagnostics, then falls back to raw recompute only for older diagnostics |
Resolved; API counts align with runtime stable state |
| Zone 2 disposal escalated after trash drop | The zone 2 batch was removed and entered pending disposal, but trash motion_delta peaked around 10.1, below the one-frame threshold 18, so no trash deposit was counted before the deadline |
Added sustained trash-motion confirmation: two consecutive moderate motions at >= 8.0 count as a deposit, while the strong one-frame threshold remains |
Resolved for future events; historical batch_000474 warning row is not rewritten |
| Runtime restart can drop threshold-edge timers | Runtime restore used raw threshold recompute instead of stable occupied, so a restart during a one-frame raw dip could lose an active timer |
Restore now uses stable occupied when present and keeps raw recompute only as a fallback |
Resolved; regression test covers zone 2-style flicker |
| Zone 1 timer reset | Zone 1's ROI had too few samples with the default stride 8; dark evidence jumped between 0.0714 and 0.0357/0, causing two occupied frames followed by two empty frames and repeated short batches |
Reduced default and remote sample_stride_pixels to 4 so small ROI/object evidence is less quantized |
Resolved in current verification; zone 1 remains continuously occupied after deploy |
| Zone 1/4 disposal missed after zone 2 discard | Zone 2 generated a trash deposit at 14:32:13; zone 1/4 cleared at 14:32:19, but their strong trash motion was inside the old 8-second cooldown, and one same-frame deposit could only discard one newly pending batch |
Reduced trash cooldown to 3 seconds and let one same-frame trash motion discard all newly pending alerted batches from that observation | Resolved for future events; historical zone 1/4 rows are not rewritten |
2026-05-29 v1.2 轨迹识别
Session Log
| Time | Phase | Actor | Action | Result |
|---|---|---|---|---|
| 2026-05-29 | Setup | Main Agent | Created Goal for v1.2 轨迹识别 using /Users/yoilun/Code/cold_display_guard as the real project path |
Active goal tracks lightweight trajectory detection plus YOLO-ready evidence contract |
| 2026-05-29 | Setup | Main Agent | Read /Users/yoilun/Code/goal-subagents-workflow-prompt.md |
Workflow requires task files, stage-based coding/testing agents, bug loop limit, and standard subagent context header |
| 2026-05-29 | Setup | Main Agent | Read existing task_plan.md, findings.md, progress.md, and docs/project.md |
v1.1 state is complete; v1.2 plan can start on branch lightweight-trajectory-tracking |
| 2026-05-29 | Phase 1 | Main Agent | Marked Phase 1 as in_progress |
Preparing coding agent for data contract and engine evidence handling |
| 2026-05-29 | Phase 1 | Coding Agent | Implemented initial disposal_evidence contract and engine handling |
Target engine tests and full Python tests passed in coding agent run, but testing agent found review issues |
| 2026-05-29 | Phase 1 | Testing Agent | Reviewed phase 1 implementation | Verdict fail: evidence/count double consumption, missing target validation, null classifier fields coercion |
| 2026-05-29 | Phase 1 | Coding Agent | Fixed testing-agent findings | Added target validation, nullable optional fields, and evidence/count double-consume guard |
| 2026-05-29 | Phase 1 | Testing Agent | Re-tested phase 1 fixes | Verdict pass; no bugs found |
| 2026-05-29 | Phase 1 | Main Agent | Ran local verification | tests.test_engine passed with 24 tests; full Python suite passed with 55 tests |
| 2026-05-29 | Phase 2 | Main Agent | Marked Phase 2 as in_progress |
Preparing fresh coding/testing agents for lightweight motion trajectory detection |
| 2026-05-29 | Phase 2 | Coding Agent | Implemented initial lightweight TrajectoryTracker |
Target vision tests passed locally, but testing agent found multi-candidate and source-margin risks |
| 2026-05-29 | Phase 2 | Testing Agent | Reviewed initial trajectory tracker | Verdict fail: single blob can confirm multiple candidates, source margin false positive, diagnostics lack per-candidate reasons |
| 2026-05-29 | Phase 2 | Coding Agent | Fixed trajectory tracker findings | Added blob consumption, strict source polygon origin, and per-candidate diagnostics |
| 2026-05-29 | Phase 2 | Testing Agent | Re-tested phase 2 fixes | Verdict pass; no bugs found |
| 2026-05-29 | Phase 2 | Main Agent | Ran local verification | tests.test_vision passed with 20 tests; full Python suite passed with 64 tests; dependency scan had no model/heavy vision matches |
Test Results
| Time | Command | Result | Notes |
|---|---|---|---|
| 2026-05-29 | PYTHONPATH=src python3 -m unittest tests.test_engine -v |
pass | 24 engine tests passed after phase 1 evidence fixes |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 55 full Python tests passed after phase 1 |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest tests.test_vision -v |
pass | 20 vision tests passed after phase 2 trajectory tracker |
| 2026-05-29 | PYTHONPATH=src python3 -m unittest discover -s tests -v |
pass | 64 full Python tests passed after phase 2 |
| 2026-05-29 | `rg -n "ultralytics | torch | onnxruntime |
Bug Loop
| Phase | Bug | Fix Attempt | Retest Result |
|---|---|---|---|
| Phase 1 | disposal_evidence and trash_deposit_count can double-consume the same disposal signal |
Added regression test and suppress generic trash fallback when confirming source-specific evidence exists in the observation | Resolved; testing agent and local full Python suite passed |
| Phase 1 | High-confidence evidence with non-trash target can close pending disposal | Added target whitelist for trash / trash_bin plus regression test |
Resolved; testing agent and local full Python suite passed |
| Phase 1 | item_class: null and detector_score: null lose null semantics |
Changed optional evidence fields to preserve None plus regression test |
Resolved; testing agent and local full Python suite passed |
| Phase 2 | Single motion blob can confirm multiple active candidates | Added frame-local blob IDs and consume each sampled blob once per frame | Resolved; testing agent and local full Python suite passed |
| Phase 2 | Source-zone margin can treat near-outside movement as source-origin movement | Source-origin check now requires strict source polygon containment | Resolved; testing agent and local full Python suite passed |
| Phase 2 | Trajectory diagnostics only expose aggregate counts | Added emitted, rejected, and expired diagnostic lists with source, reason, point count, confidence, and direction score |
Resolved; testing agent and local full Python suite passed |
2026-05-29 Phase Completed: Phase 2 - Lightweight Motion Trajectory Backend
Status: complete
Files Changed:
src/cold_display_guard/vision.pytests/test_vision.pytask_plan.mdprogress.md
Tests:
PYTHONPATH=src python3 -m unittest tests.test_vision -v: passPYTHONPATH=src python3 -m unittest discover -s tests -v: passrg -n "ultralytics|torch|onnxruntime|openvino|opencv|cv2|numpy" src tests pyproject.toml: pass, no matches
Notes:
TrajectoryTrackernow emitsDisposalEvidencewithtarget=trashandmethod=motion.- Tracker uses frame-delta motion blobs, strict source-origin validation, target ROI validation, direction scoring, and per-candidate diagnostics.
- Multiple candidates cannot reuse the same frame-local blob for confirmation.
Risks:
- Tracker is implemented but not yet wired into
main.py; phase 3 will integrate runtime observation, diagnostics, and faster active-candidate sampling.
2026-05-29 Phase Completed: Phase 1 - Data Contract And Engine Evidence Handling
Status: complete
Files Changed:
src/cold_display_guard/models.pysrc/cold_display_guard/engine.pytests/test_engine.pytask_plan.mdprogress.md
Tests:
PYTHONPATH=src python3 -m unittest tests.test_engine -v: passPYTHONPATH=src python3 -m unittest discover -s tests -v: pass
Notes:
Observationnow supportsdisposal_evidence.BatchEngineapplies source-zone evidence before generic trash fallback and again after same-frame zone transitions.- Evidence must meet confidence threshold and target the trash.
Risks:
- Threshold is currently a phase-1 constant; later runtime config integration will make it configurable.