frameworksoc2-framework-2026-08-12 · v11099:claude-cowork-soc22026-08-12served from databaseAll documents

SOC 2 readiness framework — full estate, all five Trust Services Criteria (2026-08-12)

JBNX LLC / CipherDeck — SOC 2 readiness framework

Prepared: 12 August 2026 · Standard: AICPA TSP Section 100, 2017 Trust Services Criteria with revised 2022 points of focus · Aligned to directive v36

Working copy and full detail: D:\gh\compliance\soc2\ (27 files, including per-project remediation plans, a 14-policy pack, and an 81-control register mapped to all 61 criteria with zero coverage gaps).


Read this first

JBNX is a one-human company whose engineering labour is performed by AI agents under a versioned written directive. That is unusual for SOC 2 and it cuts both ways.

In your favour. The directive, the claim → boot → work → verify → status → release loop, agent_ops.escalations, portal handover history, and the billable work-session ledger already constitute a documented, enforced, evidence-producing operating procedure. Change management and monitoring are the two hardest criteria for a company this size, and the design here is further along than a ten-person team typically manages.

Against you. Two things. First, segregation of duties: one human authors requirements, approves changes, holds every credential, and is the only party who could detect his own error. Second — and this emerged during the engagement — no change gate is actually enforced anywhere in the estate today. See the security review published alongside this document.


JBNX is a one-human company whose engineering labour is performed by AI agents under a versioned written directive. That is unusual for SOC 2, and it cuts both ways:

loop, agent_ops.escalations, the portal handover history, and the billable work-session ledger already constitute a documented, enforced, evidence-producing operating procedure. Most companies your size have nothing like it. Change management (CC8) and monitoring (CC4) are the two hardest criteria for a startup, and you are further along on both than a ten-person team typically is.

approves PRs, holds every credential, administers every vendor console, and is the only person who could detect his own error. There is no "second pair of eyes" available. This must be solved with documented compensating controls, not hand-waved. Section 4 of the control framework does that explicitly.

The single biggest risk to this program is not a missing control. It is scope. Five TSC across 18 repositories, from a standing start, with one human, is a two-year program if attempted literally. Read 02-plan-of-attack.md §1 before you commit budget — it contains a scope pressure-test and a recommended de-scope that gets you a sellable report in ~7 months instead of ~20, with a documented path to the full five later.


Scope and system description

The system description is the part of a SOC 2 report the auditor does not write. You write it; they opine on whether it is fairly presented. A vague boundary here produces an unlimited audit, because anything you failed to exclude is assumed included.

Version: 0.1 (draft) · Date: 11 August 2026 · Owner: Joey Nguyen


1. The entity

FieldValue
Legal entityJBNX LLC
DBA / trading nameCipherDeck
Personnel1 human (Joey Nguyen, CEO). All engineering, operations, and support labour performed by AI agents under the JBNX work directive (https://hi.jbnx.io, currently v35).
Governing operating procedureThe JBNX work directive, versioned, re-fetched at the start of every work session. Supplemented by the jbnx-ops runbook.
Decision authority modelagent_ops.policy on the jbnx Supabase project. CEO escalation thresholds: legally binding, irreversible, or ≥ $500/mo recurring / ≥ $2,000 one-off — and all three critical_test conditions. Everything else decided by agent 02 (Delivery Lead) with a mandatory recorded rationale.
Escalation SLAdecide_by capped at 12 hours; take_default_actions() runs every 10 minutes under pg_cron. Silence resolves to the recorded default.

Why this matters to the audit. An auditor's first instinct on a one-person company is that the control environment (CC1) is unauditable — there is no board, no HR function, no segregation. JBNX has an unusual answer: the control environment is codified in a database with an immutable decision log, not held in one person's head. Lead with that. It is stronger than the org chart most seed-stage companies present.


2. Estate inventory

Eighteen repositories were surveyed at D:\gh on 11 August 2026. Classification below.

2.1 Tier 1 — In scope, highest sensitivity

SystemPublic surfaceDataInfrastructureWhy Tier 1
FedM8 (fedm8-scan)ai.fedm8.com, scan.fedm8.comVeteran PII, CAGE/UEI, federal contracting profiles, Stripe customer + subscription dataSupabase oeohvlajtexuxjfrtcdb, Cloudflare Workers, GitHub PagesHighest-sensitivity personal data in the estate. Paid SaaS. Prior audit (AUDIT.md, 28 Jul 2026) recorded P0 findings including a security model not held in version control.
JBNX Bill (jbnx-bill)bill.jbnx.ioCustomer identities, credentials, work-session records, credit purchases, billing amountsRailway, Postgres (billing.* schema)This is the customer's financial record of what they were charged. Integrity failures here are directly monetary and directly customer-visible.
Projects Portal + Directive (jbnx.ioprojects-portal/)projects.jbnx.io, hi.jbnx.ioAgent claims, handovers, usage/token records, portfolio. and agent_ops. schemasRailway project ai.jbnx.io service projects, Supabase ngjmqdzpnhwpybtssykzNot customer-facing, but maximum blast radius: one service serves both the portal and the directive every agent depends on. Also holds SUPABASE_SERVICE_KEY and ANTHROPIC_API_KEY at the jbnx.io service. A compromise here compromises everything.

2.2 Tier 2 — In scope, customer-facing

SystemPublic surfaceDataInfrastructure
CipherDeck Apps (cipherdeck-apps)app.cipherdeck.comUser accounts, Stripe billing, marketplace/collection data, TCG + PSA ingestRailway project-cipherdeck, Supabase xrlpdsovirwluwhemuwf
NodeDough / Know Dough (nodedough)nodedough.comPersonal financial data — accounts, balances, debt payoff plans, recurring items, household membershipRailway nodedough, Supabase hykjfezeywjvzslowjyf
ai.jbnx.io (ai-portal)ai.jbnx.ioLLM gateway usage, prompts/completions routed via LiteLLM, model spendRailway ai.jbnx.io service web, Supabase ngjmqdzpnhwpybtssykz
nguy.in (nguy.in)nguy.inCalendar/personal data, Supabase edge functions, email routingCloudflare, Supabase, Next.js

2.3 Tier 3 — In scope as supporting infrastructure

SystemRoleNote
mkt.jbnx.ioInternal marketing serviceHolds SQL + skills; Railway-deployed Flask app
mockupsInternal hosting serviceHas an authed deploy API and Supabase Storage backing — this is an application, not a static site. Treat accordingly.
claude-opsAgent command/result storeContains agent instructions and outputs; review for data leakage into results/
deploy-all.ps1 / .cmdDeployment tooling at estate rootAny credential handling here is in scope
cipherdeck (webhook-dispatcher)Outbound webhook engineStatic storefront plus a webhook dispatch engine — the dispatcher is in scope even though the page is not

2.4 Out of scope — static marketing, no customer data, no processing

fedm8 (marketing), demo, scytherdeck, tensuite, cipherdeck-shopify (Shopify-hosted theme).

Caveat that must be written into the description: these are excluded on the basis that they store no customer data and perform no processing. Each has a GitHub Pages deploy workflow, so they remain in scope for change management and repository access control (CC6.1, CC8.1) even while excluded from the data-processing boundary. Do not exclude the repositories; exclude the systems.

3. Subservice organisations — carve-out method

JBNX will use the carve-out method for all subservice organisations. This is the correct choice for a company this size: the inclusive method would require you to describe and be opined on for controls you neither operate nor can evidence.

Subservice orgFunctionReport you must collect annuallyComplementary Subservice Organisation Controls (CSOCs) you rely on
RailwayApplication hosting, container runtime, deploy pipelineSOC 2 Type II (confirm availability; if none, this is a finding requiring a documented compensating assessment)Physical/environmental security, hypervisor isolation, network security
SupabaseManaged Postgres, auth, storage, edge functionsSOC 2 Type IIDatabase host security, backup execution, encryption at rest, physical security
CloudflareDNS, CDN, WAF, Workers, PagesSOC 2 Type IIEdge network security, DDoS mitigation, TLS termination
GitHubSource control, CI/CD (Actions), secrets storeSOC 2 Type IIRepository access enforcement, Actions runner isolation, secret encryption
StripePayment processing (FedM8, CipherDeck Apps)SOC 1 + SOC 2, PCI DSS AoCCardholder data handling — JBNX must never store PAN; confirm this is true in every integration
AnthropicModel inference (via LiteLLM gateway)SOC 2 Type IIModel API security, data handling / no-training commitments — verify contractual terms
ShopifyCipherDeck storefront commerceSOC 2, PCI DSSPayment and order data handling
Email provider (Resend/SES — confirm)Transactional email, auth emailSOC 2Message delivery, content handling

Action (Phase 0): build vendor-register in the control matrix. For each: report obtained, report date, period covered, CSOCs mapped, exceptions noted, next collection date. A vendor whose SOC 2 you have not read is a vendor you have not assessed.


4. Complementary User Entity Controls (CUECs)

These are controls your customers must operate for your controls to be effective. Every SOC 2 report has them; omitting them transfers your customers' failures onto you.

Candidate CUECs for JBNX (to be finalised in Phase 1):

  1. Customers are responsible for the confidentiality of their account credentials and for

enabling MFA where offered.

  1. Customers are responsible for promptly notifying JBNX of personnel changes requiring

access revocation.

  1. Customers are responsible for the accuracy and lawfulness of data they upload

(particularly relevant to FedM8 — veteran PII is uploaded by the customer).

  1. Customers are responsible for reviewing their billing records at bill.jbnx.io and

reporting discrepancies within a defined window.

  1. Customers are responsible for configuring outbound webhook endpoints securely

(CipherDeck webhook dispatcher).


5. Data classification

ClassDefinitionWhere it livesHandling
RestrictedVeteran PII, personal financial account data, authentication secrets, payment tokensFedM8 Supabase, NodeDough Supabase, credential storesEncryption in transit + at rest; RLS enforced and tested; access logged; never in a repository, never in a chat transcript, never in an LLM prompt without a documented decision
ConfidentialCustomer identity, billing records, work sessions, contract/opportunity data, agent handoversbilling., portfolio., agent_ops.*, CipherDeck AppsRLS enforced; least privilege; retention defined
InternalDirective, runbooks, ops docs, non-secret configurationRepos, portal /framework/*Version controlled; no external publication of infrastructure specifics
PublicMarketing content, published frameworks, security.txtStatic sites, portalNo restriction

Standing rule (already in the runbook, elevate to policy): credentials live only in Railway service variables, GitHub Actions secrets, Supabase Edge Function secrets, or Supabase Vault. Reference by name only. Anything read into a chat enters the transcript and is thereafter compromised.


6. System boundary diagram (to produce in Phase 0)

Required for the description. Must show, at minimum:

of error in this estate — the runbook warns explicitly not to guess**)

point for most of this estate — say so explicitly)


7. Known scope hazards

Recorded now so they are not discovered during fieldwork.

  1. NodeDough has two divergent migration lineages. The production database was not built

from the repository's migration series. An auditor testing CC8.1 (change management) will ask you to demonstrate that production schema matches an approved, version-controlled change. Today you cannot for this system. This is a material change-management finding and it is on the critical path.

  1. FedM8's security model is not in version control. Per AUDIT.md P0-5, the paywall,

entitlement logic, free tier, and PII visibility all live as RLS policies and functions that exist only in the hosted database. Same criterion, same problem, higher sensitivity.

  1. www.jbnx.io serves a certificate that does not match the hostname (missing Railway TXT

validation record). A browser TLS warning on a company domain during fieldwork is an avoidable embarrassment and arguably a CC6.7 finding.

  1. The standalone jbnx/projects-portal repository is stale and does not deploy. If an

auditor samples a change from it, the evidence trail will be wrong. Archive it or document it explicitly as non-authoritative.

  1. Secret scanning covers one repository. gitleaks runs in jbnx.io quality-gates only.

Seventeen other repositories have no secret scanning. CC6.1/CC7.1.

  1. Dependabot covers one repository. Same problem for vulnerability management (CC7.1).
  2. One human holds every credential and approves every change. Addressed in

01-control-framework.md §4 — but it must be addressed, not omitted.

  1. There is no enforced change gate anywhere in the estate today. Directive v36 defines a

gated lane (nodedough, fedm8, cipherdeck) and an ungated PROD-IT lane (everything else, including jbnx-bill and projects-portal). The full-stack handover records that the gated lane is not actually enforced: production branches exist, but each Railway service still builds its production environment from main, and repointing is a 2FA-gated dashboard action no API can perform. CC8.1 fails estate-wide until this is corrected. See 01-control-framework.md CC8.1.

  1. The directive renders inconsistently across its own endpoints. Verified 12 August 2026:

/ and /json serve v36; /md and /txt serve v35. Agents are directed to the Raw/Plain/JSON variants, so an agent can operate from a superseded procedure.


Control framework

Standard: AICPA TSP Section 100, 2017 Trust Services Criteria with revised points of focus (2022) — the current version as of 2026. Roughly 61 criteria across five categories, plus several hundred points of focus. Points of focus are not requirements; they are illustrations of how a criterion might be met. Do not build a control for every point of focus. Build a control for every criterion, then use the points of focus to argue completeness.

Version: 0.1 · Owner: Joey Nguyen · Companion artifact: 02-control-matrix.xlsx


1. Criteria structure

CategoryCriteriaRequired?JBNX decision
Security (Common Criteria, CC1–CC9)33AlwaysIn scope
Availability (A1.1–A1.3)3OptionalIn scope
Processing Integrity (PI1.1–PI1.5)5OptionalIn scope — see scope pressure-test
Confidentiality (C1.1–C1.2)2OptionalIn scope
Privacy (P1–P8)18OptionalIn scope — see scope pressure-test

Common Criteria breakdown: CC1 Control Environment (5) · CC2 Communication and Information (3) · CC3 Risk Assessment (4) · CC4 Monitoring Activities (2) · CC5 Control Activities (3) · CC6 Logical and Physical Access (8) · CC7 System Operations (5) · CC8 Change Management (1) · CC9 Risk Mitigation (2).

Note on effort distribution. CC6, CC7, and CC8 are ~14 of 33 Common Criteria but will consume ~60% of the work, because they are the ones that require operating evidence across the whole window rather than a document. CC1–CC5 are mostly documentation. Privacy (P1–P8) is 18 criteria and behaves like a second audit bolted onto the first — it requires notice, choice, consent, data subject access request handling, and disclosure tracking that JBNX does not currently have any of.

2. Control design principles for JBNX

Four principles, derived from what already works here. Controls that violate these will not survive a Type II window.

P1 — If it isn't automated, it won't happen. One human, no ops team. A control that requires Joey to remember something monthly will fail in month three and the failure will appear in the report as an exception. Every recurring control must be a GitHub Action, a pg_cron job, a portal API side-effect, or a Claude scheduled task.

P2 — Evidence is a byproduct, not a task. The best controls in this estate already work this way: security-boundaries.yml re-proves closed holes nightly and leaves a dated run log. That is a perfect Type II artifact — automatic, timestamped, tamper-evident, and it fails loudly. Copy that pattern rather than inventing checklists.

P3 — The database is the control point. For most of this estate, authorisation is the RLS policy. That means control testing is SQL, not screenshots — and it means the runbook's hard-won Postgres traps (column REVOKE is a no-op against a table grant; default privileges grant EXECUTE to anon directly; TRUNCATE ignores RLS; views have no policies) are control design requirements, not trivia.

P4 — Test the positive case. A probe that only tests denials cannot distinguish a correct policy from one that denies everyone. Already learned the hard way here; make it a standard in the test procedure column of every access control.


3. Criterion-by-criterion mapping

Format: criterion → what it asks → the JBNX control → evidence artifact → current status. Status key: ✅ exists · 🟡 partial · 🔴 gap · ⬜ not assessed

CC1 — Control Environment

IDAsksJBNX controlEvidenceStatus
CC1.1Commitment to integrity and ethical valuesCode of Conduct policy; the directive's defect definitions (silent $0 usage, duplicate billables, falsified durations) are literally an ethics statement about not falsifying customer receiptsSigned policy; directive v35 §Billable time🟡
CC1.2Board independence / oversightNo board. Compensating control: documented advisory arrangement (external CPA/counsel) + quarterly written program review by CEO, recorded and datedQuarterly review memo🔴
CC1.3Structures, reporting lines, authoritiesagent_ops.policy — seat register, escalation thresholds, v_needs_ceo / v_needs_manager split, immutable manager_decide() audit trailDB export of policy + decision rows✅ strong
CC1.4Commitment to competenceAgent seat definitions; the directive as the operating standard; the jbnx-ops runbook as institutional knowledge; method-analysis scoring gate (>90)Seat register, analysis-run JSON history🟡
CC1.5AccountabilityOne claim = one billable session = one handover = one release. Every unit of work is attributed, timed, and closed outbilling.work_sessions, pf_project_pages handovers✅ strong

CC2 — Communication and Information

IDAsksJBNX controlEvidenceStatus
CC2.1Quality information for internal controlPortal handover BLUF (state_now/next/traps/done); token usage + health bands; RAD lifecycle readiness barsPortal API exports
CC2.2Internal communication of objectives/responsibilitiesThe directive itself, re-fetched every session and version-pinned; runbook; ceo_actions queueDirective version history, /json endpoint🟡 — strong design, live defect: / and /json serve v36 while /md and /txt serve v35 (verified 12 Aug 2026). Agents are told to use Raw/Plain/JSON, so some read a superseded deploy model
CC2.3External communicationPublished frameworks at /framework/<slug>; security.txt; Terms/Privacy pages; customer-readable --done text requirementLive URLs🟡 — Terms/Privacy exist for FedM8, NodeDough, nguy.in only

CC3 — Risk Assessment

IDAsksJBNX controlEvidenceStatus
CC3.1Objectives specified with sufficient clarityWritten security objectives per system tier; service commitments per productRisk assessment doc🔴
CC3.2Identify and analyse riskAnnual formal risk assessment + quarterly refresh; risk register with likelihood/impact/treatmentRisk register🔴
CC3.3Consider potential for fraudHighest-value criterion for JBNX. Billing integrity is the fraud surface: duplicate billables, inflated durations, credits-unit errors (the v35 factor-of-100 defect class). Controls: one-claim-one-session invariant, >12h auto-close, read-time-only conversionReconciliation job output🟡
CC3.4Identify and assess changeChange risk assessed at claim time; irreversible/legally-binding/spend thresholds route to CEOEscalation records

CC4 — Monitoring Activities

IDAsksJBNX controlEvidenceStatus
CC4.1Ongoing and separate evaluationsNightly security-boundaries.yml (NodeDough); schema-drift.yml; Supabase advisors; to add: monthly dead-grants sweep across all projects, weekly rotating deep reviewActions run history, advisor output🟡 — exists on one project only
CC4.2Evaluate and communicate deficienciesFindings register with severity, owner, due date, acceptance test — the format AUDIT.md already usesFindings register🟡

CC5 — Control Activities

IDAsksJBNX controlEvidenceStatus
CC5.1Select and develop control activitiesThis framework + control matrixControl matrix🟡
CC5.2Technology general controlsCI quality gates, healthchecks, RLS, secret scanning, branch protectionActions config, branch rules🟡
CC5.3Deploy through policies and proceduresPolicy pack (04-policies/) + directive + runbookSigned policies🔴

CC6 — Logical and Physical Access (the heavy one)

IDAsksJBNX controlEvidenceStatus
CC6.1Restrict logical accessSupabase RLS on every table; explicit revoke execute … from anon on every function; no write grants on views; TRUNCATE revoked estate-wide; least-privilege GitHub/Railway/Cloudflare rolesDead-grants query output, grant snapshots🟡 — proven applied on NodeDough, unverified elsewhere
CC6.2Register and authorise new usersDocumented provisioning procedure incl. agent seats; approval recorded before access grantedAccess request log🔴
CC6.3Modify/remove accessMonthly access review across GitHub, Railway, Supabase, Cloudflare, Stripe, Anthropic, email. Removal within defined SLAMonthly review record🔴
CC6.4Restrict physical accessCarved out to Railway/Supabase/Cloudflare. JBNX-side: endpoint (CEO workstation) disk encryption, screen lock, device inventoryDevice attestation🔴
CC6.5Protect against unauthorised disposalData deletion procedure; Supabase project deletion procedure; retention purge (data-retention.yml pattern)Purge job logs🟡
CC6.6Protect against external threatsCloudflare WAF/DDoS; TLS everywhere; fix the www.jbnx.io certificate mismatch; bill.jbnx.io must remain grey-cloud with a documented compensating rationaleTLS scan results🟡
CC6.7Restrict transmission/movement of informationTLS enforced; secrets referenced by name only; no credentials in repos, files, or chat transcripts; migration to sb_publishable_/sb_secret_ keys before the end-2026 legacy deprecationGitleaks results across all repos🟡
CC6.8Prevent/detect unauthorised softwareDependabot on all repos; pinned action SHAs (already done in quality-gates.yml — good practice, extend it); lockfile integrityDependabot alerts, CI config🟡

CC7 — System Operations

IDAsksJBNX controlEvidenceStatus
CC7.1Detect configuration changes / vulnerabilitiesschema-drift.yml pattern extended estate-wide; Supabase advisors; Dependabot; secret scanningDrift + advisor reports🟡
CC7.2Monitor for anomaliesWeakest area. Railway healthchecks are deploy-time only and explicitly not uptime monitoring — the runbook says so. No alerting, no log aggregation, no uptime monitor todayMonitoring dashboards🔴
CC7.3Evaluate security eventsIncident classification + triage procedure; ceo_actions for anything actively costing money or exposing dataIncident register🔴
CC7.4Respond to incidentsIncident Response Plan + at least one tabletop per yearIR plan, tabletop record🔴
CC7.5Recover from incidentsDocumented recovery: Supabase PITR/backups, Railway redeploy-from-source (note: deployments past retention cannot be rolled back, only redeployed), restore test performed and evidencedRestore test record🔴

CC8 — Change Management

IDAsksJBNX controlEvidenceStatus
CC8.1Authorise, design, develop, configure, test, approve, implement changesDirective v36 defines two lanes: gated (nodedough, fedm8, cipherdeck) — PR → test URL → chat approval → promote; ungated (PROD-IT — everything else, including jbnx-bill and projects-portal) — main IS production; a push deploys live with no gatePR history, approval record, Actions runs🔴 Failing — see below
### The CC8 problem, stated plainly — corrected against directive v36 and the live full-stack handover This is the most serious finding in the engagement, and it is worse than it looks on paper. 1. Two of your three Tier 1 systems have no change gate by design. Under v36's PROD-IT lane, jbnx-bill (the customer's financial record) and projects-portal/jbnx.io (the control plane and the directive itself) deploy to production on a push to main. No PR requirement, no approval, no test lane. The directive is explicit that this is intentional — "there is no test gate and none is wanted." That is a defensible engineering position and an indefensible CC8.1 position, because the criterion requires changes to be authorised and approved before implementation. 2. The gated lane is not actually enforced either. The full-stack handover records the trap directly: "Branches alone do not create the gate — each Railway service production environment must be repointed from main to production in the dashboard, which no API can do. Until then the gate in directive v36 is still not enforced." Production branches now exist for NodeDough and both CipherDeck projects, but the Railway services still build from main. So today, in practice, every repository in the estate is push-to-production. CC8.1 currently fails everywhere, not just on the ungated lane. 3. Approval, where it happens, is ephemeral. Chat approval is a sensible design choice, but a chat transcript is not durable, addressable audit evidence. An auditor sampling 25 changes will ask you to produce the approval for each. 4. Production schema that did not come from an approved change. NodeDough's divergent migration lineage and FedM8's unversioned security model are the same criterion failing from the data side. Remediation, in order: | # | Action | Note | |---|---|---| | 1 | Repoint the Railway production environments for nodedough, fedm8, cipherdeck from main to production | Dashboard-only, 2FA-gated — a CEO action, not an agent action. Nothing else on this list matters until this is done, because the gate that exists on paper does not exist in the service | | 2 | Bring jbnx-bill and projects-portal onto the gated lane | This is a scope decision with a cost: PROD-IT exists because it is fast. The honest options are (a) gate them, (b) exclude them from the audit boundary, or (c) accept a CC8.1 exception with compensating detective controls. Option (b) is not available for jbnx-bill — it is the billing system | | 3 | Persist chat approvals to GitHub + a change_approvals row before merge | Converts approval from ephemeral to evidenced | | 4 | Branch protection on all in-scope repos, no admin bypass | Prevents silent gate bypass | | 5 | Reconcile NodeDough lineage; version FedM8's security model | The data-side half of the same criterion | Do not paper over this. A control that is documented but not enforced is worse in an audit than an acknowledged gap, because it calls the accuracy of the whole description into question.

CC9 — Risk Mitigation

IDAsksJBNX controlEvidenceStatus
CC9.1Business disruption risk mitigationBCDR plan; single-service blast radius for portal+directive documented with a failover position; cyber insurance decision recordedBCDR plan🔴
CC9.2Vendor and business partner riskVendor register + annual SOC 2 collection + CSOC mapping (see 00-scope §3)Vendor register🔴

A — Availability

IDAsksJBNX controlStatus
A1.1Capacity managementRailway metrics review; LLM spend/credit budget monitoring at #/credits; documented capacity thresholds🟡
A1.2Environmental protections, backup, recovery infrastructureSupabase automated backups + PITR level per project (verify per project — plan-dependent); Railway redeploy-from-source; documented RPO/RTO per system tier🔴
A1.3Recovery testingAnnual restore test per Tier 1/2 system, evidenced🔴
Availability requires a published commitment. You cannot be audited against an SLA you never stated. Phase 0 must define uptime commitments per product (e.g. 99.5% for Tier 1, best-effort for Tier 3) and publish them. Then you need an uptime monitor to measure against them — this is the single most concrete missing tool in the estate.

PI — Processing Integrity

IDAsksJBNX controlStatus
PI1.1Information about processing objectives is communicatedProduct documentation stating what each system computes and its data sources🔴
PI1.2Inputs are complete, accurate, authorisedFedM8 ingest validation; NodeDough transaction entry validation; billing input controls🔴
PI1.3Processing is complete, accurate, timely, authorisedThe credits calculation is the flagship PI control: seconds stored, converted once at read boundary, CREDITS_PER_HOUR = 6000 consistent across all four locations. Also reconcile-billing.yml🟡
PI1.4Output is complete, accurate, timelyCustomer-visible billing totals reconcile to session records; FedM8 result counts are measured not extrapolated🔴 — AUDIT.md P0-3 documents a headline figure overstated by 8.8% presented as live data
PI1.5Storage is complete, accurate, timely, authorisedRetention + purge jobs; checkpoint/balance-history integrity🟡
Processing Integrity is the criterion FedM8 currently fails hardest. AUDIT.md records hardcoded sample data presented to paying customers as retrieved data, a headline figure extrapolated under a "Live from USAspending.gov" indicator, and a 500-row cap silently truncating results while the counts conceal it. Those are textbook PI1.2/PI1.4 failures. They are also product-quality problems worth fixing regardless of SOC 2 — but including PI in scope makes them audit blockers, not backlog items.

C — Confidentiality

IDAsksJBNX controlStatus
C1.1Identify and maintain confidential informationData classification (see 00-scope §5) applied to every table/bucket; documented per system🔴
C1.2Dispose of confidential informationRetention schedule + automated purge (the data-retention.yml pattern) + deletion-on-request procedure🟡

P — Privacy (P1–P8, 18 criteria)

IDAsksStatus
P1.1Privacy notice communicated🟡 — exists for FedM8, NodeDough, nguy.in; missing elsewhere; none reviewed for accuracy against actual practice
P2.1Choice and consent obtained🔴
P3.1–3.2Collection limited to stated purpose; explicit consent for sensitive data🔴 — veteran PII in FedM8 is the sensitive-data trigger
P4.1–4.3Use, retention, and disposal limited to stated purpose🟡 — 90-day analytics retention is stated and now enforced on NodeDough; nothing comparable elsewhere
P5.1–5.2Data subject access and correction🔴 — no DSAR process exists
P6.1–6.7Disclosure to third parties, tracking, breach notification🔴 — no disclosure log, no breach notification procedure
P7.1Data quality🔴
P8.1Monitoring and enforcement of privacy commitments, complaint handling🔴
Privacy is 18 criteria and roughly zero of them are met today. It also drags in GDPR/CCPA adjacent obligations that a SOC 2 privacy opinion will effectively hold you to. Read the scope pressure-test in 02-plan-of-attack.md §1 before committing.

4. Segregation of duties with one human and N agents

This section exists because it is the first thing a competent auditor will challenge, and because the honest answer is better than a fudged one.

The problem. Joey authors requirements, approves every PR, holds every credential, administers every vendor console, and is the only party who could detect his own error. Agents write the code and could, absent controls, approve and deploy it. Classic SoD is unavailable.

The wrong answers. Hiring a nominal second employee to sign things. Claiming agents provide independence (they don't — they operate under your instruction). Omitting the topic.

The defensible position — compensating controls. Argue that JBNX substitutes structural separation for personnel separation, and evidence each of these:

#Compensating controlWhy it substitutesEvidence
1Automated gates the approver cannot silently bypass — quality-gates, gitleaks, security-boundaries, schema-drift must be green; branch protection enforced with no admin bypassRemoves "approver overrode the check" as an undetectable eventBranch protection config; Actions history showing no force-merges
2Preventive/detective split across independent agents — the agent that writes a change is not the agent that verifies it. Distinct seats, distinct claims, recorded separatelyReintroduces two-party review, even though both parties are non-humanClaim records showing author seat ≠ verifier seat
3Immutable decision logagent_ops.manager_decide() requires a rationale, refuses CEO-class items, and produces immutable rowsYou cannot retroactively rewrite why a decision was madeDB rows with insert triggers, routed_because
4Independent external review — annual third-party penetration test and an external readiness/gap assessment by a party who is not youSupplies the genuine independence the org chart cannotPen test report; readiness assessment
5Tamper-evident, append-only evidence — Actions run logs, immutable billing sessions, append-only analysis runs, portal handover versioningDetection substitutes for prevention where prevention is impossibleThe artifacts themselves
6Formal risk acceptance for residual SoD risk, signed and dated by the CEO, reviewed quarterlyAuditors accept documented, owned residual risk; they do not accept undisclosed riskSigned acceptance in the risk register

Write this into the system description. Do not wait to be asked. A well-argued compensating-control narrative disclosed up front reads as maturity; the same facts discovered during fieldwork read as a finding.


5. Where the agent operating model is a control (and where it is a risk)

AspectControl or riskTreatment
Directive re-fetched, version-pinned, "don't trust a paste"Control — a documented, enforced, versioned procedure with tamper detectionCite in CC2.2. Retain version history as evidence
Claim → one billable session → releaseControl — complete work attribution and time accountingCite in CC1.5, CC3.3
Mandatory usage recording; "silent $0 is a defect"Control — spend accountabilityCite in CC1.1, A1.1
Agents hold write access to production repositoriesRiskScoped tokens per seat, no shared credentials, revocation procedure, quarterly token rotation
Agents can read customer data during troubleshootingRisk — sharpest one for PrivacyDocumented data-access rules for agents; prohibition on restricted data entering prompts; logged and reviewed access
Prompts/completions traverse LiteLLM → AnthropicRiskContractual no-training terms verified; data classification rules for prompt content; documented in the description as a data flow
"Never ask the CEO" / auto-default escalationsRisk if unboundedBounded already by critical_test + 12h decide_by + mandatory default_action; evidence the defaults were reviewed
Chat-based PR approvalRisk — ephemeral evidencePersist approvals to GitHub + a change_approvals table (see CC8.1)
PROD-IT ungated lane (main IS production)Risk — no authorisation step at allGate, exclude from boundary, or accept with compensating detective controls. Applies to jbnx-bill and projects-portal, both Tier 1
Directive served inconsistently across endpointsRisk — agents operate from a stale procedure/ and /json serve v36 while /md and /txt serve v35. The page directs agents to Raw/Plain/JSON, so an agent can read a superseded deploy model. Add the daily directive-integrity check (COM-02)

6. How a control gets marked done

A control moves to Implemented only when all five are true. This is the definition of done for the entire program.

  1. Documented — described in the control matrix with a control ID, objective, and mapped criteria.
  2. Owned — a named owner (CEO, or a specific agent seat).
  3. Operating — actually running, on a stated frequency.
  4. Evidenced — produces a dated, retrievable artifact automatically.
  5. Tested — a written test procedure exists, has been executed once by someone other than

the implementer (a different agent seat qualifies), and passed.

Anything short of five is In Progress. There is no partial credit at fieldwork.


Plan of attack

Program start: 11 August 2026 · Owner: Joey Nguyen · Cadence: phase gates, not sprints


1. Scope pressure-test — read this first

You selected all five Trust Services Criteria across the full estate. Here is what that actually costs, so the decision is made with the number in front of you rather than after.

1.1 The arithmetic

PathCriteriaSystemsRealistic readinessReport issuedFirst-year cost
A. Security only, Tier 1+2 systems337~4 months~Q2 2027~$25–45k
B. Security + Availability + Confidentiality, Tier 1+2387~5–6 months~Q3 2027~$35–55k
C. All five TSC, full estate (as selected)6112+~12–15 months~Q1 2028~$70–120k+

Audit fees alone for a company this size run roughly $20–40k with a boutique or mid-tier CPA firm; some auditors price explicitly by TSC — around $20k for Security only vs $26k for Security + Availability + Confidentiality. The audit invoice is typically only ~40% of true first-year spend once readiness work, tooling, and internal labour are counted.

1.2 The recommendation

Adopt Path B as the audited scope, and keep Path C as the roadmap.

Reasoning:

  1. Nobody is asking you for Privacy. In practice, enterprise buyers ask for "SOC 2" and mean

Security, sometimes plus Availability. Privacy (P1–P8) is 18 criteria, requires notice, consent, DSAR handling, disclosure tracking, and breach notification — none of which exist today — and it effectively holds you to GDPR/CCPA-adjacent obligations under audit. It roughly doubles the program. Add it when a contract requires it, not before.

  1. Processing Integrity is currently a liability, not an asset. FedM8's own audit records

fabricated data shown to paying customers as retrieved, a headline figure overstated by 8.8% under a "live data" indicator, and silent 500-row truncation. Under PI in scope, those are audit blockers. Fix them because they are product-integrity problems worth fixing — then add PI at the next annual audit and it becomes a selling point instead of a gauntlet.

  1. Confidentiality is nearly free given the work Security already requires (2 criteria).

Include it.

  1. Availability is worth the cost because it forces the single most valuable missing thing in

this estate: actual uptime monitoring. Railway healthchecks are deploy-time only and, per your own runbook, will never notice a dependency dying later.

Decision required from you (Phase 0, gate G0): confirm Path B, or confirm Path C with eyes open. Everything below is written for Path B with Path C items marked [C]. If you choose C, the [C] items move from the roadmap into Phase 1 and every date slips roughly two quarters.


2. Phases, gates, and dates

Dates assume Path B and start 11 Aug 2026. Each phase ends at a gate — a decision you make, not a date that passes.

Phase 0  Foundation          11 Aug – 07 Sep 2026   (4 wks)   → G0: scope locked, auditor engaged
Phase 1  Gap closure         08 Sep – 09 Nov 2026   (9 wks)   → G1: all Tier 1/2 controls implemented
Phase 2  Readiness + Type I  10 Nov – 21 Dec 2026   (6 wks)   → G2: Type I report issued
Phase 3  Type II window      01 Jan – 30 Jun 2027   (6 mths)  → G3: window closed, evidence complete
Phase 4  Fieldwork + report  01 Jul – 15 Aug 2027   (6 wks)   → G4: Type II report issued
Phase 5  Steady state        continuous                        → annual re-audit, scope expansion

Phase 0 — Foundation · 11 Aug – 7 Sep 2026

Goal: know exactly what you are auditing, what the risks are, and who is auditing it. No remediation work happens in this phase — resist the urge.

WkWorkDeliverableOwner
1Lock scope (Path B or C). Finalise system boundary from 00-scope. Produce the boundary diagramSigned scope memo + diagramCEO
1Complete the asset inventory: every repo, Railway service, Supabase project, domain, third-party account, and credential location (never the credential)asset-register sheetAgent
2Formal risk assessment. Threat scenarios per system tier, likelihood × impact, treatment decision. Must explicitly cover: single-human key-person risk, portal/directive blast radius, veteran PII exposure, billing integrity/fraud, agent credential compromise, LLM prompt data leakagerisk-register sheet + narrativeAgent → CEO approves
2Vendor register: every subservice org, SOC 2 report obtained and read, CSOCs mapped, exceptions loggedvendor-register sheetAgent
3Adopt the policy pack (04-policies/). Draft → CEO review → sign → date → publish to /framework/14 signed policiesAgent → CEO signs
3Define service commitments: uptime targets per tier, support response times, data retention periods. These become what you are audited against — state them conservativelyService commitments docCEO
4Select and engage auditor. Get 3 quotes from boutique/mid-tier CPA firms with SaaS experience. Ask each: TSC-based pricing, readiness assessment included?, observation window minimum, one-person-company experienceSigned engagement letterCEO
4Build-vs-buy decision (see 05-build-vs-buy.md)Decision recordedCEO

Gate G0: scope memo signed · risk register approved · policies signed · auditor engaged. Do not proceed without an engaged auditor — their readiness assessment shapes Phase 1 and starting remediation blind wastes weeks.


Phase 1 — Gap closure · 8 Sep – 9 Nov 2026

Goal: every control in the matrix reaches Implemented (all five conditions in 01-control-framework.md §6). This is the bulk of the work.

Sequenced by dependency, not by criterion number.

Weeks 1–2 — Access control foundation (CC6.1–6.3, C1.1)

  1. Run the dead-grants query on every Supabase project (oeohvlajtexuxjfrtcdb,

xrlpdsovirwluwhemuwf, hykjfezeywjvzslowjyf, ngjmqdzpnhwpybtssykz). Check relrowsecurity before revoking anything — a table with RLS off means the grant is the access control.

  1. Revoke TRUNCATE from anon/authenticated estate-wide.
  2. Audit every view for write grants; revoke DML on read-only views.
  3. Audit every function for EXECUTE granted directly to anon. Remember: revoke … from public

is not enough, and you cannot revoke EXECUTE on a function used inside an RLS policy — constrain the function instead.

  1. Retest every fix as a real user, in a rolled-back transaction, asserting **effects and

positive cases**, not the absence of an exception.

  1. Migrate off legacy anon/service_role keys to sb_publishable_/sb_secret_ (deprecated

end of 2026 — this has a hard external deadline regardless of SOC 2).

Weeks 2–3 — Change management evidence (CC8.1)highest audit value per hour spent

  1. Persist chat PR approvals: agent posts the approval as a GitHub PR review via API and

writes a change_approvals row (PR URL, approver, timestamp, verification evidence, decision).

  1. Enforce branch protection on all in-scope repos: required status checks, no force push, no

admin bypass.

  1. Reconcile the NodeDough migration lineages — or write a formal scoped exception with a

remediation date. Add the CI drift check already on record as the long-term fix.

  1. Bring the FedM8 security model into version control (AUDIT.md P0-5): RLS policies,

my_plan(), top_opportunities(), the vet_directory view. Until these are in migrations they cannot be reviewed, diffed, tested, or rolled back — and cannot pass CC8.1.

  1. Archive or clearly mark the stale jbnx/projects-portal repository as non-authoritative.

Weeks 3–5 — Detection and monitoring (CC7.1, CC7.2, CC4.1)largest genuine gap

  1. Stand up uptime monitoring for every Tier 1/2 public surface with alerting to a channel you

actually read. Railway healthchecks do not count and your runbook says why.

  1. Extend gitleaks secret scanning from jbnx.io to all 18 repositories.
  2. Extend Dependabot from jbnx.io to all repositories; add CodeQL where the language is supported.
  3. Extend the security-boundaries.yml pattern (nightly, transaction-rolled-back, production

RLS re-proof) to FedM8, CipherDeck Apps, and the portal. This is your best control — replicate it.

  1. Extend schema-drift.yml to all Supabase-backed projects.
  2. Centralise logs sufficiently to answer "who accessed what, when" for restricted data.

Weeks 5–7 — Operations and resilience (CC7.3–7.5, CC9.1, A1.1–A1.3)

  1. Write the Incident Response Plan; define severities; define the notification path and timelines.
  2. Run one tabletop exercise and record it.
  3. Verify backup configuration per Supabase project (PITR is plan-dependent — check each).
  4. Perform a real restore test for each Tier 1 system and evidence it. Document RPO/RTO.
  5. Write the BCDR plan, explicitly addressing the portal/directive single-service blast radius

and key-person risk.

  1. Fix the www.jbnx.io certificate mismatch (TXT record from the Railway dashboard — the API

will not give it to you).

Weeks 7–9 — Governance, remaining criteria, and dry run

  1. Endpoint controls: disk encryption, screen lock, device inventory, EDR decision (CC6.4).
  2. Onboarding/offboarding procedures including agent seat provisioning and token rotation (CC6.2/6.3).
  3. Confidentiality: classify every table and bucket; define retention per class; extend the

data-retention.yml purge pattern beyond NodeDough (C1.1/C1.2).

  1. Engage a third-party penetration test (needed for CC4.1 independence and expected by buyers).
  2. Internal readiness assessment against the full matrix. Every 🔴 must be ✅ or formally accepted.

[C] If Path C: add ~8 weeks here for Privacy (notice rewrite, consent capture, DSAR process, disclosure log, breach notification procedure) and ~4 weeks for Processing Integrity (FedM8 P0-1/P0-3/P0-4 remediation, billing reconciliation controls, output accuracy attestation).

Gate G1: every in-scope control Implemented or formally risk-accepted · pen test complete · readiness assessment clean.


Phase 2 — Readiness and Type I · 10 Nov – 21 Dec 2026

WorkNote
Auditor readiness assessmentTheir findings, not yours. Fix before fieldwork.
Remediate readiness findingsBudget 2 weeks; there will be findings
Type I fieldworkPoint-in-time — design of controls as of a date (target: 1 Dec 2026)
Type I report issuedThis is the artifact you can start selling with in ~4 months

Gate G2: Type I report issued with no qualifications.

Type I is optional. Skip it if budget is tight and you can wait for Type II. Take it if you have a deal blocked on "do you have SOC 2?" — a Type I answers that question honestly today.

Phase 3 — Type II observation window · 1 Jan – 30 Jun 2027

Goal: do nothing new. Operate the controls and let evidence accumulate.

This phase is where programs fail, and they fail quietly. The controls stop running in February, nobody notices until June, and the report comes back with exceptions.

The entire defence is 07-scheduled-tasks.md. During this phase:

evidence chain get investigated this week, not in June.

populations. Avoid unless remediating a real failure — and if you must, document the change and the date.

Gate G3: window closed with a complete, gap-free evidence set for every control.


Phase 4 — Fieldwork and report · 1 Jul – 15 Aug 2027

WorkNote
Evidence package assemblyShould be assembly, not creation. If you are creating, Phase 3 failed
Auditor sampling and testingTypically 25 samples per population; they choose
Management responses to exceptionsEvery exception gets a response; a well-written response materially changes how the report reads
System description finalisedYou write it; they opine on fair presentation
Report issued

Gate G4: Type II report issued.


Phase 5 — Steady state

cycle if a contract requires it. By then the machinery exists and marginal cost is far lower.


3. The critical path

Six items block everything downstream. If a week is going badly, work on these.

  1. Repoint the Railway production environments for nodedough, fedm8, and cipherdeck

from main to production. Production branches exist; the services still build from main, so the change gate described in directive v36 is not enforced anywhere in the estate today. This is dashboard-only and 2FA-gated — a CEO action, not an agent action. It is item zero because CC8.1 fails estate-wide until it is done, and several other controls assume it.

  1. Decide the PROD-IT questionjbnx-bill and projects-portal are Tier 1 systems on the

ungated lane where a push to main is a production deploy. Gate them, exclude them from the boundary, or accept a documented CC8.1 exception. jbnx-bill cannot be excluded; it is the billing system.

  1. Auditor engagement — shapes Phase 1; every week without one is a week of possibly-wrong work.
  2. FedM8 security model into version control — blocks CC8.1 on your highest-sensitivity system.
  3. NodeDough migration lineage reconciliation — same criterion, and it will not get easier.
  4. Durable change-approval evidence — converts approval from ephemeral to evidenced.
  5. Uptime monitoring + alerting — the largest genuine capability gap, and A1 depends on it.

4. What will actually go wrong

Stated in advance so it is recognised rather than rationalised.

Mitigation: the scheduled tasks — the program continues without you.

Mitigation: scope changes require a written decision in the register.

check exists solely to catch this in week 1 rather than month 5.

department and a security committee. Mitigation: the policy pack is written for this company.

disabled. Mitigation: nightly security-boundaries re-proof and monthly dead-grants sweep.


Build vs buy

Decision required: Phase 0, week 4 · Owner: Joey Nguyen


1. What a platform actually does

Compliance automation platforms (Vanta, Drata, Secureframe, Sprinto, Thoropass) do four things:

  1. Control library and framework mapping — a pre-built list of controls mapped to TSC.
  2. Automated evidence collection — agents/integrations that pull configuration state from

AWS/GCP, GitHub, Google Workspace, HR systems, and endpoints, and screenshot it on a schedule.

  1. Continuous monitoring and alerting — tells you when a control drifts.
  2. Auditor workflow — a portal your auditor logs into, which is genuinely faster for them and

often reduces audit fees.

What they do not do: write your system description, run your risk assessment, fix your controls, reconcile your migration lineages, or make your product accurate.

2. The numbers

OptionYear 1 platform costAudit feeInternal effortYear 1 total
Self-managed (this framework + scheduled tasks)$0–2k (uptime monitor, pen test tooling)$20–30kHigh in Phase 0–1, low thereafter~$25–40k
Vanta~$10k/yr at small-company scale, up to $25k+$20–30k (often reduced with platform)Lower in Phase 1, moderate ongoing~$35–55k
Drata~$8–20k/yr by tier and size$20–30kSimilar to Vanta; more evidence customisation~$35–55k
SecureframeStarts ~$7.5k, ranges past $80k$20–30kMore guided implementation~$35–60k

Typical all-in market figures: $45–70k for a small company using a platform; smaller startups land nearer $45–55k. Pen test ($5–15k) is additional in every column and is not optional if you want buyers to take the report seriously.

3. How well the platforms fit this estate — the decisive question

Platform value is proportional to how much of your estate their integrations cover. Score:

Your infrastructurePlatform coverageNotes
Railway❌ Poor / noneNot a first-class integration for any major platform. Your entire compute tier would be manual evidence.
Supabase❌ Poor / noneYour entire data tier, and where most of your access controls actually live, would be manual.
Cloudflare🟡 PartialSome coverage
GitHub✅ StrongGood coverage — repos, branch protection, access
Google Workspace✅ StrongIf used for identity
Endpoint/device✅ StrongAgent-based; covers one laptop
HR / onboarding✅ StrongIrrelevant — one person, no HR system. A large fraction of platform value is personnel controls you do not have
AI agent operating model❌ NoneNo platform models this. Your most distinctive controls are entirely bespoke

This is the crux. Platforms are priced for companies on AWS/GCP with 30 employees, an HRIS, and an IdP. Roughly half of what you pay for is personnel and cloud-provider automation that either does not apply to you or does not cover your stack. Your two most important control surfaces — Supabase RLS and Railway — are the two they cover worst.

4. What you already have that a platform would sell you

Worth pricing honestly, because it is unusual:

Platform featureYour equivalentVerdict
Continuous control monitoringsecurity-boundaries.yml — nightly, against production, transaction-rolled-back, fails loudlyBetter than generic platform checks. Theirs check configuration; yours re-proves an exploit is closed
Evidence collection with timestampsGitHub Actions run historyEquivalent, and tamper-evident
Policy templatesYou need these — a platform provides themReal gap, but 04-policies/ closes it
Auditor portalA folder and a shared drivePlatform is genuinely better; worth something
Access review workflowManual todayReal gap — the scheduled task closes it
Vendor managementManual todayReal gap — the control matrix closes it
Personnel/onboarding automationN/AZero value at one employee
Drift detectionschema-drift.ymlYours is more specific and more useful

5. Recommendation

Self-manage for the first audit cycle. Revisit at the second.

Reasoning:

  1. Coverage is the wrong shape. The two systems that matter most (Railway, Supabase) are the

two least covered. You would pay ~$10k/yr and still collect most evidence manually.

  1. You have no personnel controls to automate. A large share of platform value evaporates at

headcount one.

  1. Your existing CI patterns are better than the generic equivalents for the controls that

matter here. Replicating security-boundaries.yml across four systems buys more assurance than a platform integration would.

  1. The scheduled Claude tasks in 07-scheduled-tasks.md cover the three genuine gaps — access

review, evidence completeness, and vendor management — for the cost of already-owned tooling.

  1. ~$10k/yr is real money against an audit fee of $20–30k. Spend it on the pen test instead,

which buyers actually ask to see and which no platform provides.

Revisit triggers — buy when any of these becomes true

paying for itself.

where platforms are genuinely strong, and FedM8's federal customer base makes this plausible.

three quotes explicitly: "what is your fee with and without a compliance platform?" If the delta approaches the platform cost, buy.

that self-management is failing, and it is better to buy in month 2 than to discover a gap in month 6.

What to buy regardless

ItemCostWhy
Uptime monitoring + alerting~$0–50/moThe single largest capability gap; A1 depends on it
Third-party penetration test$5–15kCC4.1 independence; buyers ask for it; no platform substitutes
Password manager / secrets vault (if not already)~$0–60/yrCC6.1 evidence and basic hygiene
External readiness assessment (from the auditor)Often bundledTheir findings are the ones that count

6. Auditor selection — ask these five questions

  1. Do you price by TSC? What is Security-only vs Security + Availability + Confidentiality?
  2. What is your minimum Type II observation window, and will you accept 3 months for a first report?
  3. Have you audited a company with no employees other than the founder? How did you handle

segregation of duties?

  1. Do you require a compliance platform, and does your fee change without one?
  2. Is a readiness assessment included, and can it run before we start remediation?

Question 3 is the filter. An auditor who has never seen a one-person company will spend your money learning on you.


Evidence model

A Type II opinion is about whether controls operated effectively throughout the period. The report stands or falls on evidence, and evidence is the thing that quietly stops being produced in month three.

1. The governing rule

Evidence is a byproduct of the control operating, never a separate task.

If producing the evidence requires someone to remember to do something, the control will fail in a 6-month window and the failure will appear in the report as an exception. Every control in the matrix must answer: what artifact does this produce automatically, and where does it land?

The estate already has the model right in one place. security-boundaries.yml runs nightly against production, proves specific closed holes are still closed, and leaves a dated, immutable GitHub Actions run record. Nobody has to do anything. That is the pattern.

2. Evidence tiers

TierDescriptionExamplesAuditor confidence
A — System-generated, immutableProduced by a system, timestamped, cannot be edited after the factActions run logs, DB rows with insert triggers, billing.work_sessions, immutable decision rows, cloud audit logsHighest. Prefer this always
B — System-generated, mutableProduced by a system but editableExported CSVs, config snapshots, monitoring dashboardsGood, with a documented generation procedure
C — Human-attestedA person says a thing happenedReview sign-offs, tabletop records, risk acceptancesAcceptable for governance controls only. Never for technical controls
D — ReconstructedAssembled after the factBackfilled screenshots, "we always did this"Worthless, and actively harmful. Auditors are trained to spot it and it undermines everything else

Target: ≥80% of controls evidenced at Tier A. Where a control can only produce Tier C, ask whether it can be redesigned.

3. Where evidence lives

D:\gh\compliance\soc2\
└── evidence\
    ├── ledger.csv                 # the index — every artifact, dated, hashed
    ├── 2027-01\                   # one folder per month of the observation window
    │   ├── access-review\
    │   ├── dead-grants\
    │   ├── control-health\
    │   └── ...
    ├── annual\                    # pen test, restore test, tabletop, risk assessment
    └── vendor\                    # subservice org SOC 2 reports, dated

Primary evidence stays in the system that generated it (GitHub Actions history, Supabase logs, the portal API). The folder holds references plus point-in-time exports, so that:

The ledger

evidence/ledger.csv — one row per artifact:

ColumnPurpose
dateWhen the evidence was produced (not when it was filed)
control_idMaps to the control matrix
criteriaTSC criteria satisfied
artifactPath or URL
tierA / B / C
sourceSystem that generated it
sha256Integrity hash for exported files
resultpass / fail / exception

The ledger is what makes completeness provable. An auditor's real question is not "show me an access review" but "show me every access review for the period." A gapped ledger answers that question badly; a complete one answers it in one file.

4. Evidence completeness — the control that guards the controls

The weekly control-health check exists for one reason: to detect a missing artifact within 7 days rather than at fieldwork.

Its logic:

  1. For each control with a defined frequency, compute the artifacts that should exist since the

last run.

  1. Compare against the ledger.
  2. Any gap is an exception — investigate, record the cause, and record the remediation.
  3. Report: total controls, expected artifacts, present, missing, and a 30-day trend.

A gap found in week 1 is a footnote. The same gap found in month 6 is a qualified opinion.

5. Retention

Evidence typeRetainWhy
Type II window evidence7 yearsReport period + typical customer/contract lookback
Vendor SOC 2 reports7 yearsProve you assessed them at the time
Risk assessments, policies (all versions)7 yearsDemonstrate the control environment evolved
Incident records7 yearsRegulatory and contractual
Routine operational logs12–13 months minimumMust exceed the observation window plus fieldwork

Watch out: GitHub Actions log retention defaults to 90 days. Your observation window is 6 months. Export Actions run summaries monthly or you will lose the first half of your window's evidence before fieldwork begins. This is the single most common self-managed evidence failure and it is entirely avoidable.

6. Sampling — what the auditor will actually do

Expect ~25 samples per population. Design controls so that any sample is easy to produce.

PopulationLikely sampleYou must be able to produce
Changes deployed to production25 PRs across the windowFor each: the PR, the approval record, the CI evidence, the deploy record
Access grantsAll (small population)Request, approval, date, current status
Access removalsAllTrigger, date actioned, elapsed time vs SLA
IncidentsAllDetection, classification, response, resolution, post-incident review
Backups/restoresThe restore testsDate, scope, result, RPO/RTO measured vs stated
Vendor reviewsAllReport obtained, date read, CSOCs mapped, exceptions
Nightly control runs25 datesRun log for each date, plus proof of no gaps between
The change-management sample is where self-managed programs most often fail, because the approval was in a chat. This is exactly why change_approvals persistence is on the critical path.

7. What an auditor treats as a red flag

That last one is worth internalising. A test that cannot fail is not evidence — which is precisely why security-boundaries.yml's own comment ("a test that enforces a hole is worse than no test") is the right instinct, and why every acceptance test in 03-projects/ asks you to break the thing and confirm the check goes red.


Recurring review schedule

This is the part of the program that decides whether you get a clean report. Everything else is a document; this is the machine that keeps the documents true.

Three layers, in order of reliability. Push work down this list wherever possible.

LayerMechanismReliabilityUse for
1CI / cron in the estate (GitHub Actions, pg_cron)Highest — runs without a human or an app openTechnical control re-proof, drift, purge, scans
2Claude scheduled tasksHigh — but only run while the desktop app is openJudgement work: review, correlation, gap analysis, reporting, drafting
3Calendar reminders for the CEOLowestDecisions only. Never for evidence

Design rule: anything that can be a GitHub Action should be a GitHub Action. Claude scheduled tasks are for the work that needs reading, correlating, and writing — the things CI cannot do.


Layer 1 — CI controls to build in Phase 1

These are not Claude tasks; they are the technical backbone. Listed here so the full cadence is visible in one place.

ControlScheduleWhereStatus
Security boundaries re-proof (RLS/entitlement, transaction-rolled-back, against prod)NightlyNodeDough ✅ · FedM8 🔴 · CipherDeck Apps 🔴 · Portal 🔴Extend to all
Schema drift (repo migrations vs live)Per push + nightlyNodeDough ✅ · all others 🔴Extend
Data retention purgeNightlyNodeDough ✅ · all others 🔴Extend
Secret scanning (gitleaks, full history)Per pushjbnx.io ✅ · 17 repos 🔴Extend to all
Dependency scanning (Dependabot / CodeQL)Continuousjbnx.io ✅ · all others 🔴Extend to all
Billing reconciliation (seconds → credits → charged)Daily🔴Build (see jbnx-bill.md)
Change-approval completeness (merges without an approval row)Nightly🔴Build (see projects-portal.md)
Directive integrity (/json, /md, / agree with repo)Daily🔴Build
Uptime + alerting on all Tier 1/2 surfacesContinuous🔴Buy
Actions log export (before 90-day retention expiry)Monthly🔴Build — critical, see 06-evidence-model.md §5

Layer 2 — Claude scheduled tasks

Six tasks. Deliberately six and not sixteen: a cadence you ignore is worse than no cadence, because it produces evidence gaps with your name on them.

1. Daily evidence sweep — weekdays 07:00

Why: catches a broken control the morning after it breaks, not in month six.

Pulls yesterday's state across the estate: GitHub Actions runs for every in-scope repo (pass/fail/ skipped), Supabase advisor output, Railway deploy and service status, uptime incidents. Appends results to evidence/ledger.csv. Reports only what changed or failed — a green day is one line.

Covers: CC4.1, CC7.1, CC7.2, A1.1.

2. Weekly control health check — Mondays 08:00

Why: this is the completeness control from 06-evidence-model.md §4. It is the most important task in the list.

For every control with a defined frequency, computes expected artifacts since the last run, diffs against the ledger, and reports gaps as exceptions with an investigation prompt. Produces a running scorecard: controls implemented / in progress / not started, and the trend.

Covers: CC4.1, CC4.2 — and it is the reason a gap becomes a footnote rather than a finding.

3. Weekly deep security review — Fridays 15:00, one project on rotation

Why: the project files in 03-projects/ are a snapshot of 11 Aug 2026. Systems drift.

Rotates through the ten in-scope systems, roughly one full pass per quarter. Runs the dead-grants query for that project, reviews the week's merged changes for security impact, re-reads the project's plan of attack, and updates status. Raises findings in the AUDIT.md format the estate already uses — stable ID, evidence, impact, fix direction, acceptance test.

Covers: CC4.1, CC6.1, CC7.1, CC3.2.

4. Monthly access review — 1st of the month, 09:00

Why: CC6.2/CC6.3 is a criterion you cannot pass retroactively, and it is pure Tier C evidence unless it is scheduled.

Enumerates every principal with access to GitHub org and repos, Railway projects, Supabase projects, Cloudflare, Stripe, Anthropic/LiteLLM, email, and the bill admin console — including agent seats and service tokens. Flags anything unrecognised, unused for 90 days, or over-privileged. Produces a dated review record requiring CEO confirmation.

Covers: CC6.1, CC6.2, CC6.3, CC1.3.

5. Quarterly vendor and risk review — 1st of Jan/Apr/Jul/Oct, 09:00

Why: CC9.2 and CC3.2 both require periodic, evidenced review, and CC1.2 needs a documented CEO oversight event in the absence of a board.

Checks each subservice org's SOC 2 report is current (report date, period covered, gap between periods, exceptions and their relevance to JBNX). Refreshes the risk register against what actually happened that quarter — incidents, near-misses, changes in the estate. Produces the quarterly CEO program review memo.

Covers: CC9.2, CC3.2, CC3.4, CC1.2.

6. Monthly evidence export and integrity check — last day of month, 18:00

Why: GitHub Actions logs expire at 90 days. Your window is 6 months. Without this, half your evidence is gone before fieldwork.

Exports Actions run summaries for every in-scope repo, portal API handovers and usage, billing reconciliation output, and monitoring history to evidence/YYYY-MM/. Hashes each artifact into the ledger. Verifies the previous month's exports still hash correctly.

Covers: the entire evidence model. Quiet, unglamorous, and the one whose absence is discovered too late.


Layer 3 — CEO calendar items (decisions only)

WhenDecision
Phase 0, week 4Scope: Path B or Path C · auditor selection · build-vs-buy
QuarterlySign the program review memo; confirm the access review; re-sign residual SoD risk acceptance
AnnuallyApprove policies, risk assessment; commission pen test; approve the restore test result
Before the window opensConfirm control design freeze

Cadence at a glance

Daily     07:00 (wkdy)  Evidence sweep                      [Claude #1]
Nightly   ~04:00–05:00  Boundaries · retention · drift       [CI]
Weekly    Mon 08:00     Control health + gap report          [Claude #2]
Weekly    Fri 15:00     Deep review, 1 project on rotation   [Claude #3]
Monthly   1st  09:00    Access review                        [Claude #4]
Monthly   last 18:00    Evidence export + integrity          [Claude #6]
Quarterly 1st  09:00    Vendor + risk + CEO program review   [Claude #5]
Annually                Pen test · restore test · tabletop · policy review

Notes on operating these

runs at next launch. That is fine for weekly and monthly tasks; for the daily sweep it means an occasional late run, which the weekly health check will catch. Anything where a missed run is genuinely unacceptable belongs in Layer 1.

and health band recorded. Compliance work is billable work and there is no ops exemption.

acceptance test; code changes go through the normal claim → PR → chat-approve path.

and the ledger before the window opens — which is exactly when you want them already working.


Per-project plans

One remediation plan per system, each with known findings, applicable criteria, sequenced steps, and an acceptance test per step. Held in D:\gh\compliance\soc2\03-projects\.

TierSystemBlocking findings
1FedM8Security model not in version control; processing-integrity failures; veteran PII
1JBNX BillOn the ungated PROD-IT lane; credits unit defect class; no reconciliation control
1Projects Portal + DirectiveUngated lane; ungated control-plane API; directive render inconsistency
2NodeDoughTwo divergent migration lineages; gate not enforced in the Railway service
2CipherDeck AppsRLS and grant posture unverified; gate not enforced
2ai.jbnx.ioPrompt/completion data flow undocumented; provider terms unverified
2nguy.inEdge function authorisation; DNS automation uncontrolled; boundary decision open
3Supporting servicesmockups authed deploy API; cipherdeck webhook dispatcher

Policy pack

Fourteen policies. Six drafted in full — Information Security, Access Control, Change Management, Data Classification and Handling, AI Agent Operating, and Incident Response. Eight scaffolded for Phase 0 week 3. The AI Agent Operating Policy has no industry template; it is the document an auditor will read most closely.

Prepared by an AI agent under the JBNX work directive. Findings are recorded for remediation; no product code was modified in producing this framework.