Frontend punch-list (drb.cusano.net live review, 2026-09-07) #109
Open
opened 2026-09-06 23:44:02 -04:00 by logan
·
5 comments
No Branch/Tag Specified
Labels
Clear labels
area/ai-pipeline
area/auth
area/billing
area/correlation
area/discord
area/frontend
area/governance
area/growth
area/infra-deploy
area/legal
area/map
area/mqtt
area/node-ota
area/osint
area/recording-audio
area/sdr-radio
area/transcription
board
board:agenda
minutes:draft
minutes:final
role:ceo
role:cfo
role:cio
role:ciso
role:cmo
role:coo
role:cto
Scene/entity extraction, summarizer, AI providers, embeddings
AuthN/Z, roles, tenancy/org scoping, API keys, credentials
Plans, entitlements, AI spend accounting and caps
Incident correlation, linking, lifecycle, severity, corr_debug
Discord bot, radio bots, voice streams, bot tokens, webhooks
Web UI: Next.js app and the edge-node local dashboard
Board process, minutes, unattended runner, agent tooling
Go-to-market, outreach, cold email, discovery conversations
CI/CD, VM, registry, Firestore rules/indexes deploy, Terraform/Caddy
ToS, retention, licences/DAAs, CAN-SPAM, E&O, name suppression
Live map: pins, paths, tiles, legend, geocoding
Node-C2 MQTT, checkins, commands, node sweeper, dynsec
Node install, enrollment, OTA updater, image skew
External feeds: cameras, 511, ADS-B, AIS, outages, and their licences
Call capture, boundaries, PulseAudio, ring buffer, trimming, attribution
OP25 decode, SDR hardware/tuning, conventional, second SDR, mesh radio
STT, transcript correction, place verification, name accuracy
Board process: minutes and board-filed items
Needs board scoping at the next sitting; CEO removes the label once scoped
One exec pre-read, closed by CEO
CEO ruling; open until enacted
Filed by the CEO
Filed by the CFO
Filed by the CIO
Filed by the CISO
Filed by the CMO
Filed by the COO
Filed by the CTO
kind
behavior-bug
Wrong product behavior; the instrument reads it correctly
kind
measurement-bug
Corrupts the recording/instrument (debug data, evals, health checks), not behavior
priority
p0
Drop everything: prod broken, live exposure, or owner-ruled P0
priority
p1
Next up: blocks a gate, a customer, or core incident quality
priority
p2
Normal: real defect or planned work, schedule in turn
priority
p3
Low: minor, cosmetic, or someday
status
blocked
Waiting on an external party, spend, or another issue
status
in-progress
Branch or PR open against it
status
needs-decision
Waiting on an owner or board ruling before work
status
needs-info
Root cause or repro unknown; needs a reading first
type
bug
Something built is wrong: code, data, or a measurement
type
chore
Maintenance, refactor, tests, pinning, cleanup: no user-visible change
type
decision
A ruling to make or record: board minutes, owner calls, legal reviews
type
docs
Docs, runbooks, CLAUDE.md, skills, SOPs
type
feature
New capability or an extension of an existing one
type
security
Security, privacy, credential or tenant-isolation exposure
type
tracking
Tracker, checklist, initiative or punch-list spanning several changes
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: logan/server-26#109
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
From a full route audit of
drb-frontend(allapp/routes except the fenced/,/features,/pricing,/faq,/settings/billing, and the map internals). P1/P2 items in this list are NOT yet fixed unless noted; the honest-error-state items for/incidentsand/watchshipped in thefix/frontend-map-and-error-statesPR.P1 — broken / crash-risk
app/page.tsx:147renders<LiveView/>for anyuser && orgId;LiveView.tsx:37only has a "configured but quiet" empty state. TheUI_REDESIGN.mdActivation screen (chunk 10) was never built — nocomponents/Activation.tsx. A new customer sees an empty map with no "mint a token" path.components/CallSpineEntry.tsxInlinePlayer— conditional hook.if (!hasAudio) return null(~line 33) sits betweenuseState/useRefcalls and a lateruseEffect→ React error #310 if ever mounted withhasAudio={false}. Masked only because the parent mounts it exclusively whenhasAudiois true (dead guard). Fix: delete the deadhasAudioprop+guard, or hoist the return above all hooks./incidentsraw Firestore index error — FIXED infix/frontend-map-and-error-states(friendlyIncidentsError). Root cause still server-26 #13/#51.P2 — misleading state / wrong data
/watchalerts events tab swallowed query failures → false "No alerts triggered yet." — FIXED in the same PR. Also:RulesTab(~line 36) callsload()from the render body — move touseEffect.app/nodes/[id]/page.tsx:123"Recent Calls" usually wrongly empty.useCalls(20)fetches 20 most-recent org-wide then filtersc.node_id === idclient-side. Busy multi-node org → "No calls recorded from this node" for nodes that have plenty. Needs a server-sidenode_idfilter.app/nodes/page.tsx:44pending-node card double-fires.<NodeCard>is a<Link>; the pending branch wraps it in a<div onClick={setConfigNode}>. Click → navigates AND tries to open the config modal; navigation wins, modal never shows. Fix: pending card not a Link, or stopPropagation.app/trips/page.tsxupcoming/past mismatch. List buckets onend_date >= today(line 176);TripCardbadge usesstart_date >= today(line 25). In-progress trip shows under "Upcoming" with a "Past" badge. Align both onend_date.settings/organization. DEFERRED says the org-name Save button is disabled/no backend, butc2api.getOrg/updateOrgare wired and the button is live (page.tsx:80). ConfirmPATCH /orgexists on c2-core; update DEFERRED or the button 403s raw.app/calls/page.tsx(Archive) ahead of its doc. Built againstGET /calls/search;UI_REDESIGN.mdlists the route as BLOCKED on backend. If/calls/searchisn't deployed → "Couldn't load calls: C2 API error 404". Verify the endpoint. (Possibly the user's reported/archiveCORS symptom.)P3 — visual / polish
bg-gray-*, depend on theglobals.css!importantblock):/nodes,/systems,/alertsbody,/admin,/profile,/settings/*,/trips,/onboarding,/login,/signup,/waitlist. Known (DEFERRED globals.css row) but jars visibly. This is the remaining migration backlog.app/network/page.tsxis a 3-card hub, notUI_REDESIGN.md§5.6 (no Enrollment tab, still at/settings/nodes; "Bot Tokens" shows—). Scope decision.components/StatusBadge.tsx:6offline state +adminToggleoff-state → pale-gray-on-near-white in light mode. Borderline contrast; off-toggle reads as "no control".app/trips/page.tsx:100CreateModal has nop-4/ no inner scroll → clips on short viewports. Same forNodeConfigModal,DiscordJoinModal. Addp-4overlay +max-h-[90vh] overflow-y-autopanel (incidents CreateModal already does).lib/types.ts—IncidentRecord.units/vehiclesnon-optional but Firestore omits them on older docs;incidents/[id]/page.tsx:216already?.-guards, contradicting the type. Make them optional./settings/members+/settings/nodes403 for a pure org-owner (both call/admin/users,require_admin_token; B7 gate lets them reach the page). Known (SAAS_PLAN B7); error surface is at least honest.Generated by a frontend-audit agent.
Live re-walk 2026-09-07 ~18:38 ET. Items 1/2/3 in this list confirmed still broken in prod — all three are backend/infra deploys, no frontend PR closed them:
/,/incidents/[id]) renders full-screenAPI KEY REQUIREDCarto watermarks.MAP_TILE_URLoverride merged in code butNEXT_PUBLIC_MAP_TILE_URLwas never set in the CI build env, so prod still uses the dead Carto URL. Filed separately.alert_eventscomposite index (acknowledged,org_id,triggered_atdesc) never deployed. Same index throwsuseUnacknowledgedAlerts: FirebaseError: The query requires an indexinlayout.jsconsole on every page. Blocks the whole tab + the site-wide alert bell. -> #51.TypeError: Failed to fetch— CORS preflight failure, root-caused in #110.New, lower severity (added to
Version 5C/UI_AUDIT_0907b.md):18:37:23) bottom-left of the Leaflet map on/and/incidents/[id]— no label, no styling. Leftover debug element.4d49e09ccall transcript shows1. ... 2. 10-4. 3. 5, I'm out. 4. 10-4.— looks like_build_transcript_block's{i}.segment numbering bleeding into the user-visible corrected transcript. Unconfirmed (could be Whisper). Worth checking the#1020-based change.Item 2 (
CallSpineEntryconditional hook) and item 14 (IncidentRecord.unitsoptional) from this list were fixed in the punch-list PRs this session.P2 punch-list pass on branch
fix/109-punchlist-p2(local commit only, not pushed).Item 4 — FIXED.
RulesTabinapp/alerts/page.tsx(not/watch) calledload()from the render body. Moved touseEffect(() => { load(); }, []);load()already self-guards on itsloadedstate flag, so[]deps are honest. AddeduseEffectto the react import.Item 6 — ALREADY FIXED (verified).
components/NodeCard.tsxalready has alinkToDetail?: booleanprop (defaults true) that drops the<Link>wrapper when false, andapp/nodes/page.tsx:45already passeslinkToDetail={false}on the pending branch. The wrapping<div onClick={() => setConfigNode(n)}>now opens the config modal without navigating. No change needed.Item 8 — ENDPOINT EXISTS; button is correctly wired.
drb-c2-core/app/routers/org.py:48@router.patch("")on prefix/org→update_org(OrgUpdateBody, Depends(require_org_owner_token)). Frontendc2api.updateOrg(lib/c2api.ts:306) doesPATCH /orgwith{name}.app/settings/organization/page.tsxSave button is live and guarded (!canEdit/ empty / unchanged disable it). No frontend change made. The stale entry isDEFERRED.md:35("no backend to save to — save button is disabled"), which lives at the Version 5C root, outside the Server repo and this worktree — cannot commit it here. Flagging for someone with repo-root access to correct that row.Item 5 — deferred with TODO (limit raised).
useCallsinlib/useCalls.tsis a direct Firestore query (where org_id ==, optionalstarted_atrange,orderBy started_at desc,limit). Addingwhere('node_id','==', id)alongside the existingorg_idequality +started_atorderBy would require a brand-new composite index, so took the safe path:app/nodes/[id]/page.tsx:123now callsuseCalls(200)(was 20) and keeps the client-sidec.node_id === idfilter, with a// TODO(server-26#109 item5)comment. Proper fix is a server-side node_id filter.Item 7 — ALREADY FIXED (verify only).
app/trips/page.tsx:TripCardbadge (line 27) usestrip.end_date >= today; list buckets (lines 178-179) useend_date. Consistent. No change.Items 1-3, 9-15 out of scope for this pass. Files changed:
drb-frontend/app/alerts/page.tsx,drb-frontend/app/nodes/[id]/page.tsx.Item 13,
DiscordJoinModalpart: PR #220 removes that modal. The new picker modal hasp-4on the overlay and amax-h-[90vh]panel with an inner scroll. The trips CreateModal and NodeConfigModal parts of item 13 are not touched.Item 2 (the
InlinePlayerconditional hook) was already fixed on main before PR #253. Ata75149b,InlinePlayerhad nohasAudioprop or guard, and its only early return (if (error)) came after every hook. PR #253 moves it tocomponents/InlinePlayer.tsxand keeps all hooks above any return. No separate fix was needed.UX pass 2026-10-25 status: item 1 (Activation screen) still unbuilt -- components/Activation.tsx absent; LiveView.tsx:592 comment still refers to it. Item 5 only mitigated (window now 200, still client-side filter) -> filed as #288 with the node-page loading bug. Items 2, 6, 7 verified fixed. New from this pass: #283-#289.