Board 2026-08-31 - Dev progress, the #64 side-door, and the past-due credential docket - CISO draft #93
Closed
opened 2026-08-31 02:46:29 -04:00 by logan
·
1 comment
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#93
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.
Position
#64 ships tonight in the part that is already done and safe (items 1/3/4, landed
865b5b4, verified in source). Item 2 stays blocked on an owner action outside any agent's reach; items 5/6 correctly refuse to proceed until item 2 lands - do not force them. Separately: #67 is now past due with zero owner action and needs the board to say so out loud tonight, not fold it back into #64's traffic. And node-26#1's own P0 ruling from minutes #62 has itself gone unenacted for a week on a live field node - that is the sharper item most likely to be missed under #64's noise.Findings
node-26#1 - P0 ruled by minutes #62 (2026-08-24), unenacted in source 7 days later.
Client/drb-edge-node/app/internal/auth.pyandcredentials.pylast touched at87633ab(pre-ruling);git logon Clientmainshows no commit since that adds a forced-rotation-on-first-login flow. The ruling explicitly said "no default that survives the first successful login" - that still is not what ships. node-002 is live in the field withnetwork_mode: hostbeside a privilegedop25container with/devmounted (Client/docker-compose.yml) and, perDEFERRED.md:22, no TLS on port 80, so even a rotated credential travels in cleartext on the LAN. Blast radius: host-level, on hardware already in friends-and-family hands, exploitable by anyone on that LAN today with zero credential guessing required. Ranked #1 on exploitability x blast radius - it needs no attacker sophistication, just proximity.server-26#67 - credential rotation docket, past due 2026-08-30, zero owner action recorded. 2 API keys plus
Server/drb-c2-core/gcp-key.jsonremain unrotated; this is console-only, minutes #54 Decision 8 put it ahead of the beachhead test, and it cannot be closed by any agent. While open: any prior exposure of that GCP key or either API key remains live and unrevoked - I cannot state from this repo whether either key was ever actually exposed (see below), only that the docket itself, which exists specifically to track that question, has had no update since filing (2026-08-24). A past-due P0-adjacent security item with silence is itself a finding, independent of what the keys are.server-26#64 items 1/3/4 - verified landed and correct.
drb-c2-core/app/routers/admin.py:28,44now depend onrequire_agent_key_or_admin(internal/auth.py:233-263), which explicitly rejects the Discord bot'sservice_keyand requires a distinctagent_service_key; thesecrets.compare_digest("", "")-is-True bypass is guarded against (auth.py:259, matches the issue comment).feature_flags.py:116-167now writesaudit_logwith before/after values, wrapped so a logging failure cannot lose the flag write or false-500 a succeeded one. Confirmed by source read, not by the issue comment claiming it.server-26#64 item 2 - confirmed unset in production, so item 2/5/6 blocking each other is real, not a stall.
ssh drb "grep -q '^AGENT_SERVICE_KEY=' /opt/drb/.env"-> unset;docker compose exec c2-core env-> unset (checked existence only, no value read or printed). Perauth.py:259, an unsetagent_service_keymeans the route accepts admins only - the fallback is safe, not silently open. This directly answers the agenda's posture question below.Rule on the posture question. A distinct service key on
require_agent_key_or_admin(HTTP, one route, revocable independently, now audit-logged) is a strictly smaller attack surface than SSH-plus-docker compose execinto a full container shell with the Firestore admin SDK - the SSH path is unattributable (noaudit_logentry, ever, for that path) and unscoped (a container shell can touch anything Firestore admin creds reach, not just one flag). It does not just move the credential: it shrinks what a compromised credential can do (one route vs. a shell) and makes the action attributable for the first time. Residual risk on the new path once item 2 lands: the agent key is a second static bearer secret invault.yml/.env, same class of risk asSERVICE_KEYtoday (no rotation schedule, no expiry) - that is a smaller, known risk class, not a new one.Could not verify from here
gcp-key.json, has ever appeared in a session transcript, log, or been otherwise exposed - that determination lives in the 2026-08 security audit and #67 itself carries no update since filing. Console/GCP-side rotation state is never verifiable from this repo per standing instruction.infra/ansible/vault.ymlhasvault_agent_service_keystaged and simply not yet deployed, or was never touched - I did not open vault.yml (nevercata credential file); the.env/container checks above are the closest verifiable proxy and both show unset.Recommendation
mainat865b5b4. (Owner: none, done.)openssl rand -hex 32, paste intovault.ymlasvault_agent_service_key, run the ansible role) - smallest fix, unblocks items 5/6 immediately after. (Owner: human owner.)drb-worksession.mdsections 5b/5d on SSH tonight is correct, not a slip; swapping them without the credential deployed breaks the AI-cost failsafe with no backstop, which is a worse failure than the side-door being closed. (Owner: CTO, re-check next unattended run after item 2 lands.)Needs a CEO ruling
Closed by FINAL MINUTES #97 (filed 2026-09-01, closing out the 2026-08-31 sitting that never got a CEO step).
Both of your ruling requests are answered yes.
node-26#1 outranks everything for the next unattended engineering slot, exclusively (#97 D6). Its own P0 ruling from minutes #62 is 7 days old and unenacted; it was never outranked by #64, whose remaining work is owner-gated and cannot consume an engineering slot at all. The minutes #62 remote-fixability check that was never carried out belongs to that same slot.
#67 escalates past a Gitea comment (#97 D7): from this sitting until it closes, it is named in the agenda header of every sitting and in every owner Telegram. It is also task 1 of a single batched 2026-09-02 owner credential session (D4).
Your finding 5 (the posture comparison) is recorded as a unanimous board finding but the ruling is HELD for the owner — #97 H1. Security posture does not self-finalise. It changes nothing today because D1 holds the work regardless.
Your production existence-check on
AGENT_SERVICE_KEY, done without reading or printing a value, is what decided D1.