2026-05-09 - 2026-11-09
Overview
1 Release published by 1 user
Published
v1.1.0
83 Pull requests merged by 1 user
Merged
#306 Frontend: finish Iris — accent-role blue/sky to indigo
Merged
#305 Frontend: Iris palette + map load/legend fixes
Merged
#295 Nodes: store and show host disk free, warn when low (node-26#41)
Merged
#294 Frontend: fixes from the 10-25 Chrome sweep
Merged
#291 Frontend: hide admin-only node/system controls from non-admins (#222, #283) + popup contrast
Merged
#290 Frontend: readable API errors, no silent action failures (#284, #286)
Merged
#282 Frontend: finish the token migration — raw greys to AA theme tokens
Merged
#281 Map: readable incident rail — dark basemap, opaque cards, AA colours (#136)
Merged
#280 Live map follow-ups: stable pin icons, resolved IncidentPanel, filtered rail, weather vs camera dock (#279 #275 #268 #278)
Merged
#276 Live wall attention cues: NEW lane, pin pulse, opt-in tone and notifications (#238)
Merged
#277 Weather map layers: NWS warning polygons, n0q radar with valid time/legend/loop, wind at incident (#237)
Merged
#272 Live wall: selected incident loads its own calls, resolved deep links, scrubber marks unloaded time (#239)
Merged
#274 Honest pins and paths: geocode precision, type-gated paths, impossible-speed stops (#236)
Merged
#271 Discord: main DRB bot optional end to end + owner-flow integration tests (#225 S8)
Merged
#270 Power Outages map layer + wires-down cross-match on the live wall (#184)
Merged
#267 Live wall: filter bar, discipline presets and text search (#235)
Merged
#259 Discord: Connect a Discord server — OAuth UI (#225 S7) — merge after S6
Merged
#263 Weather backend: NWS active alerts + nearest-METAR wind, cached (Refs #237)
Merged
#265 Live wall: saved views in the URL hash, per-viewer memory, kiosk mode (#234)
Merged
#260 Discord: per-bot OAuth "Connect a Discord server" backend (#225 S6)
Merged
#262 Discord: channel list and presence without the main bot (#225 S5, fixes #251)
Merged
#255 Outage providers: licence-gated registry, ODIN adapter, /outages API, admin tab (Refs #184)
Merged
#253 Click-to-listen on the live wall + HTTP Range on /media (#233)
Merged
#252 Live wall: truth strip keyed to the pipeline, not node heartbeats (#232)
Merged
#250 Discord picker: per-bot permission status + owner's preferred bot (#225 S4) — merge after S3
Merged
#249 Discord: check bot permissions before handing a token to a node (#225 S3)
Merged
#231 Discord REST client, cache and #225 settings (server-26#225 S2)
Merged
#230 Discord: channel permission math for radio bots (#225 S1)
Merged
#227 Discord: several radio streams per voice channel; adding never overwrites (#213)
Merged
#226 Nodes: Update All Nodes button (fleet-wide update request)
Merged
#224 Discord: log node-reported stream state; remove a radio channel or a server (#213, #221)
Merged
#220 Node page Discord picker: org's servers + voice channels, not raw IDs (#213 item 3)
Merged
#219 Discord admin page + hide admin-only bot pool from operators (#213 items 2, 4)
Merged
#218 Discord: self-serve server→org linking with /drb link (#213 item 1)
Merged
#217 deploy.yml: a superseded run is a skip, not a failure (#167)
Merged
#216 Discord radio channels: transactional token leases + desired-state streams (#203, #204)
Merged
#210 deploy.yml: serialise prod deploys and skip superseded runs (#167)
Merged
#209 Explicit timeouts on every OpenAI and Gemini request (#153)
Merged
#208 Live ops wall + pluggable camera providers with licence gating (server-26#198)
Merged
#206 Reject revokes the node's MQTT login and API key (#195)
Merged
#205 Systems: P25 trunked / conventional / analog mode + channel editor (node-26#24)
Merged
#194 approve_node never rotates an existing key; node update-check endpoint; real Update Node button (node-26#14, #15)
Merged
#191 Correlator prompt: incident age/size + new-event rule (#189)
Merged
#188 fix(frontend): readability in both themes
Merged
#182 correlator: a radio code is not a location
Merged
#181 intelligence: a plate read on a patrol channel is a traffic stop
Merged
#180 gemini: minimal thinking on correlation, token accounting per call
Merged
#179 stops review + provisional LLM closure
Merged
#178 intelligence: traffic stops and self-initiated activity open incidents
Merged
#177 reopen: act on drb-correlation-review of e972cac
Merged
#176 incidents: severity-scaled quiet timer, reopen-on-link, thin calls do not fill the cap
Merged
#175 clearance: act on drb-correlation-review of f0a88d4
Merged
#174 correlator/intelligence: let 10-8s actually close incidents
Merged
#173 correlation: smart tiebreak model gemini-2.5-pro is gone; use gemini-3.8-flash
Merged
#172 Replay: fail fast on a dead AI account; extraction reports to ai_health
Merged
#171 Admin Replay: re-run the pipeline over past calls in a sandbox
Merged
#168 Incident date filter matched nothing
Merged
#166 Archive Load more skipped 150 of every 200 calls
Merged
#165 Date range picker on Incidents and Archive; fix Archive Load more
Merged
#164 Incidents search/filter/load-more; Archive viewable by viewers
Merged
#154 correlator: stop the re-correlation sweep racing an in-flight upload (#131)
Merged
#152 correlator/admin: capture per-scene incident_type + severity (#139)
Merged
#135 correlator: remove is_dispatch and the tactical fit path entirely (#134)
Merged
#133 correlator: drop the dispatch/tactical name-guess from the escape hatch (#115)
Merged
#132 correlator+summarizer: per-scene call-doc storage, fixes #96 and #114's real fix
Merged
#128 intelligence: shadow-mode upstream dispatch-vs-chatter classifier (#127)
Merged
#130 ci: prune docker images before AND after deploy, not only on pull failure (#129)
Merged
#126 correlator: shrink the same-talkgroup escape hatch from 2h to a few minutes (#115)
Merged
#125 correlator: gate LLM-orphan against rules-new instead of escalating to tiebreak (#115)
Merged
#124 ci: deploy Firestore rules + indexes on every push to main (#51)
Merged
#123 frontend: #109 punch-list P2 — RulesTab effect, node recent-calls window
Merged
#122 map: remove stray clock, unstack incident rail, OSM tile fallback (#118)
Merged
#121 firestore: declare the alert_events composite index (#51)
Merged
#120 c2-core: fix CORS so the browser can call the REST API (#110)
Merged
#119 ci: bake NEXT_PUBLIC_MAP_TILE_URL into the frontend build (#117)
Merged
#116 correlator: give the LLM tier what it needs to link, stop it defaulting to "new" (#115)
Merged
#112 correlator: LLM tier reads the scene transcript, not the whole call (#102)
Merged
#113 frontend: safe fixes from the #109 punch-list
Merged
#108 frontend: fix map stacking + honest infra error states
Merged
#107 frontend: install command uses the node id from the mint form (node-26#4)
Merged
#106 frontend: mint panel shows the full one-shot install command (node-26#4)
Merged
#105 correlator: judge each scene on its own embedding + severity (#80, #95)
Merged
#1 Infrastructure builds
138 Issues closed from 1 user
Closed
#302 /upload has no idempotency: a retried upload re-runs Whisper/Gemini/correlation on the same call_id
Closed
#301 /upload: a late (spooled) upload is correlated against now, not the call's started_at
Closed
#300 Alerts: confidence gate before any push alert (Discord/webhook) — avoid the CrimeRadar false shots-fired failure
Closed
#104 Reprocess with stale call-doc severity: not-thin call re-extracted to zero scenes attaches with no fit check
Closed
#162 transcript_correction.py accepted the model's rewrite verbatim — a real ten-code got swapped for a different real ten-code
Closed
#160 place_verifier.verify() has the same no-anchor gap #159 fixed in intelligence.py's geocoder — never ported over
Closed
#297 Transcription: move to an OpenAI-compatible cheaper provider (Groq whisper-large-v3-turbo) with a domain vocabulary prompt
Closed
#298 Extraction: one cheap call per transcript, skip chatter before any LLM, config-driven model, cache geocodes
Closed
#88 resolved and reassignment are prompt-only invariants with no validator, so a string "false" resolves an incident
Closed
#83 transcript_correction_enabled is not a pure cost lever: turning it off disables the noise gate and pushes over-merging
Closed
#138 LLM-orphan gate's "type" veto fires on visibly content-free chatter (18/22 this window)
Closed
#91 LLM correlation tier sees the whole-call transcript for every scene, so it cannot separate scenes and pays N times for one prompt
Closed
#134 incident_correlator fast/thin path has the same dispatch/tactical name-guess as the #115 escape hatch, but it changes link decisions
Closed
#151 Board 2026-09-13 — Autonomous email SOP — FINAL MINUTES
Closed
#99 Board process defect: the 2026-08-31 sitting filed four drafts and no final minutes for 24h
Closed
#146 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — FINAL MINUTES
Closed
#49 Board skill: CTO draft #40 was filed with the CISO draft body byte-for-byte, losing the CTO record
Closed
#193 Unattended runner is dead since the Linux move — Task Scheduler/run-session.ps1/drb-tg have no Linux equivalent
Closed
#56 Telegram control plane: owner-to-agent commands — built as drb-telegram-ops (WSL), pending live verification
Closed
#57 P0: standing correlation-quality evaluation procedure (scheduled AI window)
Closed
#66 TRACKER: 12 discovery conversations by 2026-09-22 (GOALS.md kill criterion) - checkpoint 2026-09-05
Closed
#196 Prod AI dark since 09-29/09-30: Gemini and OpenAI credits exhausted (billing, not a bug)
Closed
#222 Node page shows admin-only buttons to non-admins (Restart OP25, override Ack/Force Revert): dead CTAs
Closed
#283 Systems page offers create/edit/delete and AI panels to operators; every backend route is admin-only, and Delete fails silently
Closed
#286 Raw 'C2 API error 403: {"detail":...}' shown to users across most screens
Closed
#136 Map Incident Tiles are Unreadable
Closed
#278 Map: open camera tiles cover the weather status chip and radar STALE badge (bottom centre)
Closed
#268 Map rail header doesn't say 'filtered' when the wall filter is on (follow-up to #235)
Closed
#275 Live wall: IncidentPanel says "active" and a running elapsed clock for a resolved incident opened by link
Closed
#279 Map: incident pins rebuilt every second (clock re-render) — pin pulse restarts before it completes
Closed
#238 Map: nothing on the wall grabs attention — NEW lane, audible cue and in-tab notifications for new Majors/path growth
Closed
#237 Map: weather context — NWS warning polygons, radar with valid time/legend/loop, wind at the incident
Closed
#239 Map: 500-call window silently truncates incident paths, call spine and the 7d scrubber; #inc= deep links only resolve active incidents
Closed
#236 Map: pins and paths look exact when they aren't — confidence styling, type-gated paths, impossible-speed stops
Closed
#225 Discord: customers shouldn't need the main DRB bot in their server — radio bots (via C2) should cover linking, channel directory and permission checks
Closed
#184 OSINT layer: utility power outages (Con Ed / NYSEG) on the map
Closed
#235 Map: no filtering or search on the map — filter bar, discipline presets, text search
Closed
#258 S4 UI copy: wrong Start tooltip for 'Not a voice channel', 'platform admin' jargon, 'ask DRB support' with no way to reach support
Closed
#257 Voice-check: a bot whose token Discord rejected is summed up as 'No radio bot in this server' (and offers an invite to a bot that is already there)
Closed
#256 Discord picker: 'Needs fix' text says 'then try again' but Start stays disabled until the small footer Re-check is clicked
Closed
#137 Map should zoom back to original when closing an incident popup
Closed
#234 Map: wall forgets layers and view on every reload — saved views in the URL hash, per-viewer memory, kiosk mode
Closed
#251 Discord: after fixing a permission, /join keeps refusing for up to 2 min (cached snapshot, 'then try again' text)
Closed
#233 Map: no audio anywhere on the live wall — click-to-listen on spine, path stops and rail (plus media.py Range)
Closed
#232 Map: 'Live' pill is driven by node heartbeats, so the wall reads live while transcription/correlation are dead
Closed
#204 Bot-token pool leaks and races: preferred_token_id silently dropped, re-join double-assigns, failed MQTT send never releases
Closed
#203 Discord bot /leave kills every node's stream fleet-wide; /join hijacks a node already streaming elsewhere (no guild/org scoping)
Closed
#167 deploy.yml has no concurrency guard — two pushes to main deploy to the VM at once, last-finisher wins
Closed
#153 OpenAI/Gemini clients have no request timeout -- sweep hold-back constants are guessed, not derived
Closed
#195 reject_node leaves the node's dynsec login and node_keys in place — a rejected node can still use MQTT and /upload
Closed
#183 OSINT layer: 511NY DOT cameras + road closures/construction on the map
Closed
#187 Secondary SDR priority: row state shows "Waiting for SDR" instead of an error when the container/checkin is unreachable
Closed
#185 Map legend does not explain the aircraft altitude colour ramp
Closed
#186 Vessel layer renders AIS aids-to-navigation (MMSI 99xxxxxxx buoys) as vessels
Closed
#51 No automated deploy path for Firestore rules — they can regress silently after every fix
Closed
#6 geocode_max_km=40 may be rejecting legitimate MTA locations
Closed
#156 deploy.yml: /opt/drb/.last_good_tag reads empty (not missing), so PREV_TAG is blank and every deploy's Main Deploy step fails — rollback safety net has been dead since at least run #602
Closed
#159 Citywide/large systems (e.g. NYPD Citywide) never get a location anchor, so location_proximity never fires and duplicate incidents get created for the same event at nearby addresses
Closed
#158 fast/thin correlation path never uses srcaddr for disambiguation, even though every call already carries it
Closed
#114 summarizer reads the whole-call transcript per incident — next leg of the #80/#95/#102 scene-context leak
Closed
#131 Same call_id linked into 2 incident records with identical extracted data (~2% of linked calls)
Closed
#139 Per-scene scenes map (#96/#114) doesn't capture incident_type -- can't audit the gate's "type" veto per scene
Closed
#149 Board 2026-09-13 — Autonomous email SOP — CTO draft
Closed
#150 Board 2026-09-13 — Autonomous email SOP — CISO draft
Closed
#148 Board 2026-09-13 — Autonomous email SOP — CIO draft
Closed
#79 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — FINAL MINUTES
Closed
#97 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - FINAL MINUTES
Closed
#62 Board 2026-08-24 - Unattended operating cadence and GOALS tracking - FINAL MINUTES
Closed
#54 Board 2026-08-23 — Owner goals — FINAL MINUTES
Closed
#53 Board 2026-08-23 — Operating cadence — FINAL MINUTES
Closed
#42 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — FINAL MINUTES
Closed
#140 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CFO draft
Closed
#142 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CMO draft
Closed
#145 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CISO draft
Closed
#144 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CIO draft
Closed
#141 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CTO draft
Closed
#143 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — COO draft
Closed
#96 corr_debug is overwritten per scene on the shared call doc, so #35's "LLM tier decides 3.5% of links" is a per-call blend and cannot answer whether the tier works
Closed
#5 Scene over-splitting: one radio conversation becomes two incidents
Closed
#127 Upstream dispatch-vs-chatter classifier — shadow mode
Closed
#129 Deploy failed with VM disk full — git pull could not write objects; prune ran too late to prevent it
Closed
#118 Stray unstyled clock overlay + incident-card/zoom-control collision on the Leaflet map
Closed
#110 /archive (Archive tab) reported failing with a CORS error — needs the console line to root-cause
Closed
#117 Map tiles broken in prod: NEXT_PUBLIC_MAP_TILE_URL build-arg never set in CI
Closed
#102 llm_correlator._call_block reads the whole-call transcript per scene — remaining leg of #80/#95
Closed
#80 Scene correlation is judged on the call-level (primary-scene) embedding and severity, not the scene it is correlating
Closed
#95 Non-primary scenes inherit the primary scene's severity from the call doc, so bdb57ae closed one of three leaks and the other two now carry the weight alone
Closed
#94 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - CTO draft
Closed
#93 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - CISO draft
Closed
#92 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - CMO draft
Closed
#90 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - COO draft
Closed
#81 Any signed-in viewer can trigger OpenAI summary spend: incident summary routes use require_service_or_firebase_token, not require_admin_token
Closed
#87 The primary scene's geocode leaks into every other scene's correlation, fabricating a location match
Closed
#78 HIRING: growth-ops (outreach preparation persona)
Closed
#89 AI-window failsafe arming check self-matches: pgrep -f 'sleep 4200' reports armed when nothing is armed
Closed
#63 Runner must never hold a secret in its context - replace every token read with a WSL wrapper
Closed
#68 Encode the runner authorisation boundary and credential-escalation rule into drb-worksession.md
Closed
#85 Alert webhooks POST a raw unredacted transcript snippet to a third-party Discord channel
Closed
#74 _call_fits_incident still uses signed idle, so the sweep path skips both over-merge vetoes on back-dated calls
Closed
#84 Call dedup is failing on every call in production: missing calls (system_id, started_at) composite index
Closed
#82 Unattended runs died silently on usage limits for 3 cycles - Task Scheduler reported success
Closed
#76 Two AI spend paths escape config/ai_features entirely, so "AI is off" is not true and #45 cannot measure spend
Closed
#75 Per-system correlation_enabled=false is ignored: the call still correlates, with empty tags, down the thin/recency path
Closed
#77 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — CISO draft
Closed
#73 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — CMO draft
Closed
#72 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — CTO draft
Closed
#70 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — COO draft
Closed
#65 deploy.yml runs compose up -d before the health check with no rollback - blocks unattended pushes to the AI pipeline
Closed
#71 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — COO draft
Closed
#30 /dashboard does not exist, so every post-login and guard redirect lands on a 404
Closed
#31 Admin page redirects away before auth claims resolve, so /admin is unreachable on a cold load
Closed
#60 Board 2026-08-24 — Unattended operating cadence and GOALS tracking — CTO draft
Closed
#61 Board 2026-08-24 — Unattended operating cadence and GOALS tracking — CISO draft
Closed
#58 Board 2026-08-24 — Unattended operating cadence and GOALS tracking — COO draft
Closed
#59 Board 2026-08-24 — Unattended operating cadence and GOALS tracking — CMO draft
Closed
#52 Place verification geocodes unit call-signs: "Post 1-2" became a real map pin
Closed
#41 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — CMO draft
Closed
#39 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — CISO draft
Closed
#40 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — CTO draft
Closed
#38 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — COO draft
Closed
#34 84 of 100 incidents are titled "Ems — TGID 9048" because /upload never resolves the talkgroup name
Closed
#32 React error #310 white-screens /systems and /nodes
Closed
#23 Incident map pin and incident label disagree in 5 of 6 incidents
Closed
#26 Incident title is re-derived from the newest call, so incidents are named after their last event
Closed
#16 unit-continuity correlation path never writes corr_matched_units, so the debug view can't show why it matched
Closed
#24 Correlation debug endpoint hides the LLM fields, so LLM activity cannot be audited
Closed
#20 CORS defaults to "*" while allow_credentials is True
Closed
#21 Deploy failed silently on 15 consecutive pushes — production ran 08-18 code until 08-20
Closed
#25 Incident title is re-derived from the newest call, so incidents are named after their last event
Closed
#22 Thin-call auto-attach has no fit check, merging unrelated events into one incident
Closed
#14 No alerting when an AI provider account runs dry or a model is retired
Closed
#12 upload.py compares node API keys with != instead of secrets.compare_digest
Closed
#10 10 pre-existing test failures in test_mqtt_handler and test_node_sweeper
Closed
#8 POST /calls/{id}/reprocess is unmetered spend for any authenticated user
Closed
#11 Unpinned base images: Python major version can change on rebuild
Closed
#18 Incidents never record resolved_at, blocking history scrub
Closed
#17 Incident severity is stamped once at creation and never re-evaluated
Closed
#15 Correlation has no non-AI fallback: a full AI outage produces a 100% orphan rate for its whole duration
222 Issues created by 1 user
Opened
#2 Google sign-in fails: auth handler is cross-site under Chrome storage partitioning
Opened
#3 Billing UI is mock data and shows every org a fabricated trial
Opened
#4 /admin reads are not org-scoped, leaking data across tenants
Opened
#5 Scene over-splitting: one radio conversation becomes two incidents
Opened
#6 geocode_max_km=40 may be rejecting legitimate MTA locations
Opened
#7 Bulk reprocess calls stored without a transcript
Opened
#8 POST /calls/{id}/reprocess is unmetered spend for any authenticated user
Opened
#9 Member and node write endpoints are platform-admin-only, blocking org owners
Opened
#10 10 pre-existing test failures in test_mqtt_handler and test_node_sweeper
Opened
#11 Unpinned base images: Python major version can change on rebuild
Opened
#12 upload.py compares node API keys with != instead of secrets.compare_digest
Opened
#13 Firestore rules and indexes are in source control but never deployed
Opened
#14 No alerting when an AI provider account runs dry or a model is retired
Opened
#15 Correlation has no non-AI fallback: a full AI outage produces a 100% orphan rate for its whole duration
Opened
#16 unit-continuity correlation path never writes corr_matched_units, so the debug view can't show why it matched
Opened
#17 Incident severity is stamped once at creation and never re-evaluated
Opened
#18 Incidents never record resolved_at, blocking history scrub
Opened
#19 Marketing landing and the Live map both claim / — move the app under /app
Opened
#20 CORS defaults to "*" while allow_credentials is True
Opened
#21 Deploy failed silently on 15 consecutive pushes — production ran 08-18 code until 08-20
Opened
#22 Thin-call auto-attach has no fit check, merging unrelated events into one incident
Opened
#23 Incident map pin and incident label disagree in 5 of 6 incidents
Opened
#24 Correlation debug endpoint hides the LLM fields, so LLM activity cannot be audited
Opened
#25 Incident title is re-derived from the newest call, so incidents are named after their last event
Opened
#26 Incident title is re-derived from the newest call, so incidents are named after their last event
Opened
#27 Sweep retry budget can expire before the incident the orphan belongs to exists
Opened
#28 Pre-existing incidents keep an unverifiable map pin until a call links to them
Opened
#29 models.py types incident location as coordinates, so PUT /incidents/{id} cannot set one
Opened
#30 /dashboard does not exist, so every post-login and guard redirect lands on a 404
Opened
#31 Admin page redirects away before auth claims resolve, so /admin is unreachable on a cold load
Opened
#32 React error #310 white-screens /systems and /nodes
Opened
#33 firestore.indexes.json has drifted from the live database and now duplicates two of its indexes
Opened
#34 84 of 100 incidents are titled "Ems — TGID 9048" because /upload never resolves the talkgroup name
Opened
#35 LLM correlation tier decides only 3.5% of links, and the dominant fast/thin path records no fit signal
Opened
#36 Move transcript correction into transcription, with per-talkgroup vocabulary and area context
Opened
#37 Use Maps to verify corrected place names against the talkgroup anchor, and point the induction loop at talkgroups
Opened
#38 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — COO draft
Opened
#39 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — CISO draft
Opened
#40 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — CTO draft
Opened
#41 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — CMO draft
Opened
#42 Board 2026-08-23 — Ratify BUSINESS_MODEL.md — FINAL MINUTES
Opened
#43 Gate B3: EMS/medical talkgroup exclusion default and person-name redaction are not implemented
Opened
#44 Gate B4: lib/billing.ts publicly promises 7/90/365-day retention with no enforcement anywhere
Opened
#45 Gate B5: no per-call/system/org AI cost accounting exists, so no BUSINESS_MODEL.md section 4 figure has ever been checked against a bill
Opened
#46 Gate A: awaiting owner sign-off to close - public price (a1bdccf) and the A2 disclaimer (b722223) are both shipped and live
Opened
#47 Owner-only pre-revenue gates: ToS/Privacy/AUP, business entity + E&O, delay policy, agency takedown contact
Opened
#48 Gate B8: transcript entity-name accuracy has never been measured, yet names are being published
Opened
#49 Board skill: CTO draft #40 was filed with the CISO draft body byte-for-byte, losing the CTO record
Opened
#50 Comped friends-and-family tier is uncapped AI spend: no entitlement flag, no per-org attribution, no cap
Opened
#51 No automated deploy path for Firestore rules — they can regress silently after every fix
Opened
#52 Place verification geocodes unit call-signs: "Post 1-2" became a real map pin
Opened
#53 Board 2026-08-23 — Operating cadence — FINAL MINUTES
Opened
#54 Board 2026-08-23 — Owner goals — FINAL MINUTES
Opened
#55 Platform admin cannot see or change which org a user belongs to — user management is org-blind
Opened
#56 Telegram control plane: owner-to-agent commands — built as drb-telegram-ops (WSL), pending live verification
Opened
#57 P0: standing correlation-quality evaluation procedure (scheduled AI window)
Opened
#58 Board 2026-08-24 — Unattended operating cadence and GOALS tracking — COO draft
Opened
#59 Board 2026-08-24 — Unattended operating cadence and GOALS tracking — CMO draft
Opened
#60 Board 2026-08-24 — Unattended operating cadence and GOALS tracking — CTO draft
Opened
#61 Board 2026-08-24 — Unattended operating cadence and GOALS tracking — CISO draft
Opened
#62 Board 2026-08-24 - Unattended operating cadence and GOALS tracking - FINAL MINUTES
Opened
#63 Runner must never hold a secret in its context - replace every token read with a WSL wrapper
Opened
#64 Close the /admin/features Firestore SSH side-door: require_service_key_or_admin + distinct agent credential
Opened
#65 deploy.yml runs compose up -d before the health check with no rollback - blocks unattended pushes to the AI pipeline
Opened
#66 TRACKER: 12 discovery conversations by 2026-09-22 (GOALS.md kill criterion) - checkpoint 2026-09-05
Opened
#67 Credential rotation docket: 2 outstanding API keys + gcp-key.json (founding agenda item 2)
Opened
#68 Encode the runner authorisation boundary and credential-escalation rule into drb-worksession.md
Opened
#69 OWNER AGENDA: who do we hire to generate interest? The owner is not the growth engine
Opened
#70 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — COO draft
Opened
#71 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — COO draft
Opened
#72 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — CTO draft
Opened
#73 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — CMO draft
Opened
#74 _call_fits_incident still uses signed idle, so the sweep path skips both over-merge vetoes on back-dated calls
Opened
#75 Per-system correlation_enabled=false is ignored: the call still correlates, with empty tags, down the thin/recency path
Opened
#76 Two AI spend paths escape config/ai_features entirely, so "AI is off" is not true and #45 cannot measure spend
Opened
#77 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — CISO draft
Opened
#78 HIRING: growth-ops (outreach preparation persona)
Opened
#79 Board 2026-08-25 — Growth function ownership and the qualifying-conversation definition — FINAL MINUTES
Opened
#80 Scene correlation is judged on the call-level (primary-scene) embedding and severity, not the scene it is correlating
Opened
#81 Any signed-in viewer can trigger OpenAI summary spend: incident summary routes use require_service_or_firebase_token, not require_admin_token
Opened
#82 Unattended runs died silently on usage limits for 3 cycles - Task Scheduler reported success
Opened
#83 transcript_correction_enabled is not a pure cost lever: turning it off disables the noise gate and pushes over-merging
Opened
#84 Call dedup is failing on every call in production: missing calls (system_id, started_at) composite index
Opened
#85 Alert webhooks POST a raw unredacted transcript snippet to a third-party Discord channel
Opened
#86 Correlation over-merge veto uses a bare 0.82 literal, looser than the 0.93 match bar it sits beside
Opened
#87 The primary scene's geocode leaks into every other scene's correlation, fabricating a location match
Opened
#88 resolved and reassignment are prompt-only invariants with no validator, so a string "false" resolves an incident
Opened
#89 AI-window failsafe arming check self-matches: pgrep -f 'sleep 4200' reports armed when nothing is armed
Opened
#90 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - COO draft
Opened
#91 LLM correlation tier sees the whole-call transcript for every scene, so it cannot separate scenes and pays N times for one prompt
Opened
#92 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - CMO draft
Opened
#93 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - CISO draft
Opened
#94 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - CTO draft
Opened
#95 Non-primary scenes inherit the primary scene's severity from the call doc, so bdb57ae closed one of three leaks and the other two now carry the weight alone
Opened
#96 corr_debug is overwritten per scene on the shared call doc, so #35's "LLM tier decides 3.5% of links" is a per-call blend and cannot answer whether the tier works
Opened
#97 Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - FINAL MINUTES
Opened
#98 trip_chat spend gate relies solely on per-caller rate limit, not a role check (found during #81)
Opened
#99 Board process defect: the 2026-08-31 sitting filed four drafts and no final minutes for 24h
Opened
#100 Registry credential expires mid-build, so a deploy fails after some images have already pushed — cost us a night's deploy on 2026-09-01
Opened
#101 The correlation evaluation tooling runs against a stale image, so every dump taken via docker compose run silently measures old code — it broke outright on 2026-09-01
Opened
#102 llm_correlator._call_block reads the whole-call transcript per scene — remaining leg of #80/#95
Opened
#103 content_divergence veto goes dark when the scene embedding is legitimately None (post-#80/#95)
Opened
#104 Reprocess with stale call-doc severity: not-thin call re-extracted to zero scenes attaches with no fit check
Opened
#109 Frontend punch-list (drb.cusano.net live review, 2026-09-07)
Opened
#110 /archive (Archive tab) reported failing with a CORS error — needs the console line to root-cause
Opened
#111 SDR tuning (PPM / preset) is coupled to system assignment and silently wiped on reassign
Opened
#114 summarizer reads the whole-call transcript per incident — next leg of the #80/#95/#102 scene-context leak
Opened
#115 Consensus tiebreaker manufactures incidents — resolves ~all disagreements as "new", overriding the LLM's "link"
Opened
#117 Map tiles broken in prod: NEXT_PUBLIC_MAP_TILE_URL build-arg never set in CI
Opened
#118 Stray unstyled clock overlay + incident-card/zoom-control collision on the Leaflet map
Opened
#127 Upstream dispatch-vs-chatter classifier — shadow mode
Opened
#129 Deploy failed with VM disk full — git pull could not write objects; prune ran too late to prevent it
Opened
#131 Same call_id linked into 2 incident records with identical extracted data (~2% of linked calls)
Opened
#134 incident_correlator fast/thin path has the same dispatch/tactical name-guess as the #115 escape hatch, but it changes link decisions
Opened
#136 Map Incident Tiles are Unreadable
Opened
#137 Map should zoom back to original when closing an incident popup
Opened
#138 LLM-orphan gate's "type" veto fires on visibly content-free chatter (18/22 this window)
Opened
#139 Per-scene scenes map (#96/#114) doesn't capture incident_type -- can't audit the gate's "type" veto per scene
Opened
#140 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CFO draft
Opened
#141 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CTO draft
Opened
#142 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CMO draft
Opened
#143 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — COO draft
Opened
#144 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CIO draft
Opened
#145 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — CISO draft
Opened
#146 Board 2026-09-13 — Beachhead checkpoint miss and dev-progress review — FINAL MINUTES
Opened
#147 CAN-SPAM/TCPA/state-UDAP review for growth-ops cold-email channel (minutes #79 decision 3 gate)
Opened
#148 Board 2026-09-13 — Autonomous email SOP — CIO draft
Opened
#149 Board 2026-09-13 — Autonomous email SOP — CTO draft
Opened
#150 Board 2026-09-13 — Autonomous email SOP — CISO draft
Opened
#151 Board 2026-09-13 — Autonomous email SOP — FINAL MINUTES
Opened
#153 OpenAI/Gemini clients have no request timeout -- sweep hold-back constants are guessed, not derived
Opened
#155 Incidents never actually clear — units_cleared almost never populates, 90-min idle sweep does the resolving instead
Opened
#156 deploy.yml: /opt/drb/.last_good_tag reads empty (not missing), so PREV_TAG is blank and every deploy's Main Deploy step fails — rollback safety net has been dead since at least run #602
Opened
#158 fast/thin correlation path never uses srcaddr for disambiguation, even though every call already carries it
Opened
#159 Citywide/large systems (e.g. NYPD Citywide) never get a location anchor, so location_proximity never fires and duplicate incidents get created for the same event at nearby addresses
Opened
#160 place_verifier.verify() has the same no-anchor gap #159 fixed in intelligence.py's geocoder — never ported over
Opened
#161 New "Deploy Firestore rules & indexes" CI job fails every run — FIREBASE_TOKEN secret not set
Opened
#162 transcript_correction.py accepted the model's rewrite verbatim — a real ten-code got swapped for a different real ten-code
Opened
#163 STT quality initiative: raw transcription accuracy is the ceiling every downstream fix (correction, extraction, correlation) is hostage to — research + candidate angles
Opened
#167 deploy.yml has no concurrency guard — two pushes to main deploy to the VM at once, last-finisher wins
Opened
#169 Gemini correlation tier returned nothing for the whole 09-20→09-22 AI run — 377/377 decisions rules-only
Opened
#170 Admin Replay: re-run the pipeline over past calls in a sandbox, so correlation changes are measured without live AI windows
Opened
#183 OSINT layer: 511NY DOT cameras + road closures/construction on the map
Opened
#184 OSINT layer: utility power outages (Con Ed / NYSEG) on the map
Opened
#185 Map legend does not explain the aircraft altitude colour ramp
Opened
#186 Vessel layer renders AIS aids-to-navigation (MMSI 99xxxxxxx buoys) as vessels
Opened
#187 Secondary SDR priority: row state shows "Waiting for SDR" instead of an error when the container/checkin is unreachable
Opened
#189 Long-lived Major incident becomes a sink: 'Rollover Entrapment at TSP' absorbed 40 calls / 2h34m / 37 km path on Ch1
Opened
#190 Severity never de-escalates on stand-down: 'Flames at the house' stays Major/active after units report a fireplace
Opened
#192 Mesh ingest: nodes/+/mesh -> mesh_messages, mesh alert sink, mesh as correlator source
Opened
#193 Unattended runner is dead since the Linux move — Task Scheduler/run-session.ps1/drb-tg have no Linux equivalent
Opened
#195 reject_node leaves the node's dynsec login and node_keys in place — a rejected node can still use MQTT and /upload
Opened
#196 Prod AI dark since 09-29/09-30: Gemini and OpenAI credits exhausted (billing, not a bug)
Opened
#197 Correlation measurement can't reach a multi-day live window: debug/correlation caps at 100 incidents, GET /incidents times out
Opened
#198 511NY: legacy API dead after 511x cutover, and DRB has no DAA grant for the new feed (+ timestamp/disclaimer gaps)
Opened
#199 Ask NYSDOT in writing: does the 511NY DAA cover overlays, detection counts and frame retention on camera imagery?
Opened
#200 CISO ruling: frame retention / camera-derived data — archiving frames that show people and plates
Opened
#201 NYC DOT cameras (webcams.nyctmc.org): decide whether to request a data-sharing agreement
Opened
#202 Westchester County DPW cameras: ask for written permission — and treat the county as a sales prospect
Opened
#203 Discord bot /leave kills every node's stream fleet-wide; /join hijacks a node already streaming elsewhere (no guild/org scoping)
Opened
#204 Bot-token pool leaks and races: preferred_token_id silently dropped, re-join double-assigns, failed MQTT send never releases
Opened
#207 No pre-merge frontend typecheck: no Node on the authoring box, no lockfile, CI only on main
Opened
#211 Node revoke follow-ups: /systems node auth ignores approval_status; no UI to reject an approved node
Opened
#212 Live wall: minor UI follow-ups from #208 review (nested link in button, unclamped 511 bbox, no-CORS origin latch)
Opened
#213 Discord: no self-serve guild->org link and no admin UI for radio channels/bots (follow-up to #203/#204)
Opened
#214 Discord ad-hoc radio streams never auto-dismiss when the voice channel empties
Opened
#215 Mint panel install command still puts the enrollment token on the command line (node-26#18 server half)
Opened
#221 Discord settings: no way to unlink a server, and org owners have no Discord view (all routes platform-admin only)
Opened
#222 Node page shows admin-only buttons to non-admins (Restart OP25, override Ack/Force Revert): dead CTAs
Opened
#223 Discord stream caps are check-then-write: concurrent starts can exceed the per-server and per-node limits
Opened
#225 Discord: customers shouldn't need the main DRB bot in their server — radio bots (via C2) should cover linking, channel directory and permission checks
Opened
#228 Discord: no edit path for a running radio stream (label/bot/mode); re-add and node-page move keep the old mode
Opened
#229 Discord multi-stream follow-ups: /leave stream: rough edges; find_channel_stream ignores org_id
Opened
#232 Map: 'Live' pill is driven by node heartbeats, so the wall reads live while transcription/correlation are dead
Opened
#233 Map: no audio anywhere on the live wall — click-to-listen on spine, path stops and rail (plus media.py Range)
Opened
#234 Map: wall forgets layers and view on every reload — saved views in the URL hash, per-viewer memory, kiosk mode
Opened
#235 Map: no filtering or search on the map — filter bar, discipline presets, text search
Opened
#236 Map: pins and paths look exact when they aren't — confidence styling, type-gated paths, impossible-speed stops
Opened
#237 Map: weather context — NWS warning polygons, radar with valid time/legend/loop, wind at the incident
Opened
#238 Map: nothing on the wall grabs attention — NEW lane, audible cue and in-tab notifications for new Majors/path growth
Opened
#239 Map: 500-call window silently truncates incident paths, call spine and the 7d scrubber; #inc= deep links only resolve active incidents
Opened
#240 Map: history mode — make the TimeScrubber playhead move (resolved_at already exists; #18 closed)
Opened
#241 Map: geofenced watch zones / protected sites — alert rules with geometry, evaluated on incidents
Opened
#242 Map: storm/utility hazards land as 'other' (?) — hazard subtype for wires down, manhole fire, flooded road, tree down, road closed
Opened
#243 Map: incident notes, disposition and export/handoff (GeoJSON/CSV/CAP, signed webhook, Teams/Slack)
Opened
#244 Map: aircraft context — squawk and emitter category, rotorcraft icon, orbit detection, FAA TFRs
Opened
#245 Map: transit layer — MTA GTFS lines/stations plus GTFS-rt service alerts, with incident-to-ROW distance
Opened
#246 Map: keyboard command layer and mobile field mode
Opened
#247 Map roadmap — persona panel 2026-10-05
Opened
#248 Plates as an internal correlation key only: HMAC match key from spoken plates, 2h TTL, no search/watchlist/display (CISO ruled)
Opened
#251 Discord: after fixing a permission, /join keeps refusing for up to 2 min (cached snapshot, 'then try again' text)
Opened
#254 Truth strip (#232) follow-ups: dedup undercount, stale-min build arg, sticky tier, per-system STT
Opened
#256 Discord picker: 'Needs fix' text says 'then try again' but Start stays disabled until the small footer Re-check is clicked
Opened
#257 Voice-check: a bot whose token Discord rejected is summed up as 'No radio bot in this server' (and offers an invite to a bot that is already there)
Opened
#258 S4 UI copy: wrong Start tooltip for 'Not a voice channel', 'platform admin' jargon, 'ask DRB support' with no way to reach support
Opened
#261 Discord bot tokens and OAuth client secrets are stored in plaintext Firestore fields (no app-level encryption)
Opened
#264 Weather alerts: simplify zone-resolved NWS polygons (payload ~2 MB for 3 states)
Opened
#266 Expired Discord link codes and OAuth states are never deleted (discord_link_codes, discord_oauth_states)
Opened
#268 Map rail header doesn't say 'filtered' when the wall filter is on (follow-up to #235)
Opened
#269 Live wall: persist the Power Outages overlay in the saved-view hash (#184 follow-up)
Opened
#273 Discord: org owners can't register their own (BYO) radio bot or its OAuth secret — platform-admin only
Opened
#275 Live wall: IncidentPanel says "active" and a running elapsed clock for a resolved incident opened by link
Opened
#278 Map: open camera tiles cover the weather status chip and radar STALE badge (bottom centre)
Opened
#279 Map: incident pins rebuilt every second (clock re-render) — pin pulse restarts before it completes
Opened
#283 Systems page offers create/edit/delete and AI panels to operators; every backend route is admin-only, and Delete fails silently
Opened
#284 Admin actions swallow failures (console.error only): Resolve, Summarize, alert rules, Ack, Restart OP25; empty states lie on load failure
Opened
#285 Marketing CTAs contradict each other: 'Get started' -> /login, waitlist says signup closed, /signup is live
Opened
#286 Raw 'C2 API error 403: {"detail":...}' shown to users across most screens
Opened
#287 Settings > API Keys is an in-memory mock shown to customers; empty state claims it authenticates integrations
Opened
#288 Node page: missing/denied node spins 'Loading node…' forever; 'No calls recorded' is wrong for quiet nodes
Opened
#289 Stale or false copy: bot /link points to a nonexistent Settings tab; FAQ/features claim operator management and tuning persistence
Opened
#292 Live map: stale-state dim greys out popups and legend; node pins nearly invisible on the dark basemap
Opened
#293 Expired session renders pages signed-out instead of redirecting to login
Opened
#296 Cut AI pipeline cost: evaluate cheaper / alternative models for STT, scene extraction, correlation
Opened
#297 Transcription: move to an OpenAI-compatible cheaper provider (Groq whisper-large-v3-turbo) with a domain vocabulary prompt
Opened
#298 Extraction: one cheap call per transcript, skip chatter before any LLM, config-driven model, cache geocodes
Opened
#299 Correlation: rules first, one cheap LLM call only when ambiguous; remove the cheap/smart consensus tiebreak
Opened
#300 Alerts: confidence gate before any push alert (Discord/webhook) — avoid the CrimeRadar false shots-fired failure
Opened
#301 /upload: a late (spooled) upload is correlated against now, not the call's started_at
Opened
#302 /upload has no idempotency: a retried upload re-runs Whisper/Gemini/correlation on the same call_id
Opened
#303 call_start overwrites the call doc (merge=False) and can erase audio_gcs_uri when it lands after /upload
Opened
#304 Correlation: make the P25 radio ID (srcaddr) a first-class link, and measure how often calls carry it