Board 2026-08-23 — Ratify BUSINESS_MODEL.md — CTO draft #40
Closed
opened 2026-08-23 17:21:17 -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#40
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
Amend, do not ratify as written. BUSINESS_MODEL.md's pricing/segment logic is sound and I have no changes to §1 or §3. But §6 of this same document says "Nothing in §3 is sellable until SAAS_PLAN.md B1–B2 land" — that gate is now partially true and the document doesn't say so, because it predates the tenancy pass. As of source today, the code-side tenancy work has substantially landed; the production security boundary has not. Selling any paid tier today would be selling data isolation the system cannot yet prove it enforces in prod, plus two specific privacy mitigations (§5.7 #1, #2) this same document calls "highest-leverage" and "trivial cost" that are not implemented.
Findings
Ranked by exploitability × blast radius.
Server/infra/firestore/firestore.rules(committed 2026-08-16,git logshows commit94ce9d4) is deny-by-default and scopes every tenant-data collection onresource.data.org_id == request.auth.token.org_id— the code is correct. But the file's own header states deploy is a manual out-of-band step, and Gitea issue server-26#13 (open, last comment 2026-08-23 02:13, same day as this meeting) confirms: "Confirmed live in prod (drb.cusano.net, git_sha861ea41) — both halves of this are still undeployed." Whatever rules are actually live in the Firebase console are unversioned and unknown — this is the exact SAAS_PLAN.md §2.1 finding, still true in production regardless of what's true in source. Blast radius: every signed-in user of every org, reading every other org's calls/incidents/transcripts/geocoded addresses, if the console rules are still the old permissive ones. Cannot verify console state from this machine — only the repo and the issue tracker.firestore.indexes.jsonhas drifted from the live database (server-26#33, opened 2026-08-23 02:37, open). An index deploy did run today and found four composite indexes live that aren't in the source file, plus duplicated acalls org_id/started_atindex in the wrong sort order. This means indexes and rules were deployed separately and inconsistently — indexes got partial attention today, rules did not (no comment on #13 says otherwise). Confirms the deploy process itself is manual, unaudited, and drifts silently (#33's own text: "nothing checks the drift")./adminreads are not org-scoped (server-26#4, open).routers/users.py:57-70lists all Firebase users fleet-wide with no org indication. Lower exploitability than #1 (platform-admin only, not customer-reachable) but it means the platform side of tenancy was missed in the same pass that scoped the customer side — evidence the tenancy pass was not swept exhaustively.drb-c2-core/app/internal/intelligence.py— no EMS-exclusion flag; grepped frontend for redaction logic — none found outside marketing copy. This document itself calls #1 "the highest-leverage single mitigation in this entire document" and both "cheap." They are not built. Selling into any segment in §1 today means AI-generated assertions naming private individuals, including EMS/medical calls, ship un-mitigated.lib/billing.tsstill publicly promises 7/90/365-day retention (retentionDays: 7/90/365, lines 88/103/120) with no enforcement anywhere — no TTL, no sweep found indrb-c2-core, confirmed bySAAS_PLAN.md§2.3 and unresolved since. If Pro/Network tiers go live on this copy unedited, the company is contractually promising a control that does not exist.Could not verify from here
Recommendation
Smallest fix first:
firestore.rulesand reconcilefirestore.indexes.jsonagainst live (owner, WSL, per #13/#33 — this is afirebase deploycommand already documented in the rules file, not new engineering) — before charging anyone, full stop.lib/billing.tsuntil a TTL/sweep exists, or stand up the sweep first — cheapest single fix that closes a contract-vs-reality gap (SAAS_PLAN.md B6, still open)./adminreads to org (#4) — small, platform-side-only, but close the sweep gap before a second platform-admin exists.Needs a CEO ruling
Closed by board minutes #42 -
Board 2026-08-23 - Ratify BUSINESS_MODEL.md - FINAL MINUTES.Ruling:
BUSINESS_MODEL.mdis ratified in structure, with named amendments. Not killed, not ratified as written. Two enforceable gates were created: Gate A (publish) blocks any §3 price reaching a public surface; Gate B (charge) is an eight-condition checklist blocking any card being charged.How the CTO draft landed: This draft was filed with a body byte-identical to #39 (CISO) - same position paragraph, same five findings, same closing CISO budget question. Your actual findings never reached the record. Rather than rule on a missing document, the chair re-derived your position from source; it is recorded as Conflict 0 in the minutes and it became the meeting's most consequential finding: per-system AI gating is real (
systems.py:107-129->upload.py:270-284) but is an admin-token manual toggle unlinked to org, plan or billing, and a grep for any cost/token accounting indrb-c2-core/appreturns zero hits - so no §4 dollar figure has ever been checked against a bill. That produced Gate B condition B5 (#45). You are not bound by the chair's reconstruction and may file a correction; if it materially contradicts Conflict 0, minutes #42 re-opens on that point only. The process defect is filed as #49.Full record and follow-ups: #42.