{"chains":[{"name":"Download Area Flow","passed":true,"steps":[{"detail":"Exists","pass":true,"step":"1. download_areas template"},{"detail":"OMAP references found","pass":true,"step":"2. Dashboard loads OMAP system"},{"detail":"Tile calculation wired","pass":true,"step":"3. Dashboard calls tile API"},{"detail":"Route registered","pass":true,"step":"4. /api/tiles/calculate route"},{"detail":"Present","pass":true,"step":"5. Area naming modal"},{"detail":"Done/home nav exists","pass":true,"step":"6. Post-download navigation"},{"detail":"Uses Registry.registerSlot \u2014 keys will match getAllSlots","pass":true,"step":"7. Metadata via registry"},{"detail":"Same name \u2192 same slot \u2192 clears old tiles \u2192 no wasted storage","pass":true,"step":"8. Overwrite reuses slot"}]},{"name":"Slot Selection Flow","passed":false,"steps":[{"detail":"omap_constants.js \u2192 omap_registry.js \u2192 omap_slot_picker.js","pass":true,"step":"1. Script load order"},{"detail":"getAllSlots found","pass":true,"step":"2. Reads all slots from registry"},{"detail":"Matches registry records correctly","pass":true,"step":"3. Slot match on cacheName/slotNumber"},{"detail":"Loop bounded","pass":true,"step":"4. Iterates 1 to MAX_SLOTS"},{"detail":"Wired","pass":true,"step":"5. Calls setActiveSlot"},{"detail":"Found","pass":true,"step":"6. Redirects to /map/offline/"},{"detail":"Route missing from blueprint","pass":false,"step":"7. /map/offline/ route registered"}]},{"name":"Mapping \u2192 Report Flow","passed":true,"steps":[{"detail":"startWalking + stopWalking","pass":true,"step":"1. Walk lifecycle"},{"detail":"takePhoto found","pass":true,"step":"2. Photo capture"},{"detail":"Queue/sync found","pass":true,"step":"3. Sync orchestrator queues"},{"detail":"photos=True, perimeter=True","pass":true,"step":"4. Upload endpoints"},{"detail":"Registered","pass":true,"step":"5. Report route"},{"detail":"All present","pass":true,"step":"6. Report partials"}]},{"name":"SW Cache Integrity","passed":true,"steps":[{"detail":"56 URLs","pass":true,"step":"1. APP_SHELL parsed"},{"detail":"All 13 cached","pass":true,"step":"2. Landing links cached"},{"detail":"All cached","pass":true,"step":"3. Slot picker scripts cached"},{"detail":"All use /sw.js","pass":true,"step":"4. No competing SWs"},{"detail":"v67","pass":true,"step":"5. SW version"}]},{"name":"Phone Slot State","passed":true,"steps":[{"detail":"perimeter 240 \u2192 200","pass":true,"step":"1. Report renders"},{"detail":"https://iverify.nsgia.com/sw.js","pass":true,"step":"2. SW active on phone"},{"detail":"Clean","pass":true,"step":"3. No waiting SW"},{"detail":"gps-mapper-v57: 55 entries","pass":true,"step":"4. APP_SHELL cache"},{"detail":"1 filled, 4 empty of 5","pass":true,"step":"5. Slot count"},{"detail":"All named","pass":true,"step":"6. Filled slots named"},{"detail":"All have tiles","pass":true,"step":"7. Tile counts healthy"},{"detail":"Yes","pass":true,"step":"8. OMAP constants loaded"},{"detail":"6.5 MB (0%)","pass":true,"step":"9. Storage available"}]},{"name":"Offline Network Isolation","passed":true,"steps":[{"detail":"Uses navigator.geolocation only","pass":true,"step":"1. GPS middleware network-free"},{"detail":"Online: fetches from network. Offline: returns 1px PNG.","pass":true,"step":"2. SW tile cache-miss \u2192 fetch or placeholder"},{"detail":"No network fallback in offline handler","pass":true,"step":"3. SW /map/offline/ cache-only"},{"detail":"All 4 OMAP modules clean","pass":true,"step":"4. Offline JS network-free"},{"detail":"Wrapped in online check","pass":true,"step":"5. Nominatim call guarded"},{"detail":"Wrapped in online check or sync queue","pass":true,"step":"6. Save-survey queued/guarded"},{"detail":"OSM + ArcGIS tile requests routed through slot cache","pass":true,"step":"7. SW intercepts tile URLs"}]},{"name":"Flood Mapper Integrity","passed":true,"steps":[{"detail":"667 lines","pass":true,"step":"1. File exists"},{"detail":"node --check passed","pass":true,"step":"2. JS syntax valid"},{"detail":"open=572 close=572 diff=0","pass":true,"step":"3. Brace balance"},{"detail":"All 14 present","pass":true,"step":"4. Required functions"},{"detail":"Subscribes to gps-update events, no direct watchPosition in startWalking","pass":true,"step":"5. GPS via event stream"},{"detail":"start\u2192flag\u2192stop\u2192close polygon\u2192write GeoJSON","pass":true,"step":"6. Walk lifecycle"},{"detail":"Guarded by navigator.onLine, queues via SyncOrchestrator","pass":true,"step":"7. Save offline-safe"},{"detail":"Guarded by navigator.onLine","pass":true,"step":"8. Search offline-safe"},{"detail":"walking-path and satellite layer referenced","pass":true,"step":"9. MapLibre sources"},{"detail":"startWalking + stopWalking exported","pass":true,"step":"10. Window exports"},{"detail":"All 10 element IDs present","pass":true,"step":"11. DOM references"},{"detail":"Found","pass":true,"step":"12. API_BASE defined"}]},{"name":"Navigation Integrity","passed":true,"steps":[{"detail":"fetch() with cache fallback in .catch","pass":true,"step":"1. SW navigate = network-first"},{"detail":"Could not verify \u2014 check manually","pass":true,"step":"2. SW assets strategy"},{"detail":"Checked 8 templates","pass":true,"step":"3. Home links point to /"},{"detail":"No JS calls preventDefault on beforeunload","pass":true,"step":"4. No navigation blockers"},{"detail":"render_template, no redirect","pass":true,"step":"5. / renders directly"},{"detail":"No template loads it \u2014 no unwanted /choose redirect","pass":true,"step":"6. app-shell-loader not active"}]}],"summary":{"failed_steps":1,"passed_chains":7,"passed_steps":59,"total_chains":8,"total_steps":60},"timestamp":"2026-04-22T23:57:49.458754"}
