Open the operating deck

facts_state.md

# FNC offer, adoption state (2026-09-22, rebranded 23:20 ET)

Client brand: FNC, Fortune Network Capital (Luka: "we keep it branded as FNC"). Principal: Kevin. Internal namespace stays `nextcap` (dirs, ARI app, env key names); no prospect sees it. Offer carried by the funnel:
a no-obligation Sovereign Situation Audit (screening with Kevin) leading to the EUR 3,500 Sovereign
Blueprint. Same funnel, same engine, same Brooke and Sofia, adjusted to the offer. Nothing rebuilt.

## Done and proven

- `offer.json` authored (stack `nextcap`, NY, EN + ES, 12 discovery topics, 14 SMS bodies all
  under 231 GSM-7 septets rendered, every body carries FNC + disclosure + YES/SI + STOP, the two
  call variants carry 646-712-8654). Personas `nc_intl` (outbound) and `nc_inbound`. Copy drafted by
  Astra, graded here: consent-lecture lines stripped from Brooke's mouth, AI disclosure kept once,
  not-a-fit close kept, no tax rates, decline on evasion or sanctions talk kept.
- Words that never appear in an SMS: 0%, tax-free, passport, offshore, crypto, citizenship, Golden
  Visa, freeze, guaranteed, UAE, Panama, Georgia, Dubai, residency, visa. Carrier-filter hygiene.
- Secrets filled ON THE VPS from the existing envs, never printed. `secrets.env` 600 root.
- Generated twice into `/tmp/nextcap-gen`: 88 files, 21 patches, disarmed, byte-identical.
- Installed to `/opt/nextcap-{callnet,bridge,webhook,poll}` from a clean namespace. venv from the
  lock. Bridge db initialised. Units installed, NONE enabled. `BRIDGE_ARMED=''`, no `SEND_ARMED`.
- Suppression is the ONE shared ledger via symlink (30,870 numbers on it).
- Asterisk, same inode, proven with `pjsip show` and `dialplan show`, not the reload message:
  `[opncomm-new]` context `from-opncomm-new`, callerid `"MyNewStaff" <16467128654>`;
  `from-opncomm-new` -> `Stasis(nextcap-brooke,nc_inbound)`; all four trunks Registered; Su Caso's
  `opncomm` context and `Stasis(brooke` dialplan untouched. Pre-edit copies of both files are beside
  this file.
- 21/21 patches applied on the installed files, installed bytes identical to staging.
- Gates on the installed copy: unreceipted roster BLOCK; tampered roster BLOCK (hash mismatch);
  no or used go-token BLOCK; fresh go-token consumed once and renamed `.used`; dry send `[DRY]`,
  0 sent, no journal entry.
- RealValidito is NOT at zero: a live lookup succeeded and wrote a real receipt for the operator
  roster. The handoff's "at zero since 2026-09-12" was stale.

## Not exercised, labelled honestly

- Hours guard: `batch_send_pi.py` line 232 `in_hours()` sleeps outside 09:00-20:00 ET. The dry run
  at 01:05 ET did not reach it because the operator number is suppressed on the shared ledger.
  Proven Su Caso code path, byte-identical, not re-proven here.
- Voicemail requeue, duplicate-event no-double-dial, watchdog disarm on 5 dead / 0-of-12: not run.
- The operator call on 646-712-8654: NOT placed. Luka requests it explicitly.
- Inbound on the DID: still owed by Bryan (no INVITE arrives).

## Parked for Luka and Kevin

1. Kevin's real transfer number. `intake.transfer_number` is the placeholder `+12025550199`.
   Nothing can hand off until it is real. `ATTORNEY_INTAKE_NUMBER` / `TRANSFER_TARGET` carry it.
2. Staffed hours. Default 10:00-20:00 ET Mon-Fri is in the bridge env.
3. Geo: NY (proven, one-party recording) vs Florida (denser buyer, all-party recording consent,
   8pm cutoff, 3 calls per 24h). Default NY.
4. Kloudi: self-assign 332-265-1884 and create campaign `nextcap-intl-screening` in the UI;
   `nextcap-poll` polls that campaign name. Unassign the stray 213 number.
5. Top-up ceiling for scrub and discovery. Twelve topics at 150 people is about $3.60 of scrub.

## Next moves, in order

1. SMS number + campaign in the carrier UI (5 minutes).
2. Build the 12 discovery rosters from `mac/` with NEXTCAP topics, scrub each, receipts bound.
3. Luka requests the operator call: `sudo /opt/nextcap-callnet/run_caller.sh --operator-test`.
   Listen. Someone other than the author records the pass.
4. Injected-failure battery remainder (voicemail requeue, duplicate events, watchdog trip).
5. Generalise `dash_build.py` / `hourly_report.py` / recordings page off Su Caso's paths.
6. Arm deliberately, per NEW-SESSION-HANDOFF.md section 6 step 8.