F4 Go-Live — 2026-08-24
Lane: Growth Control / F4 continuous calibration (geo-SCM), tenant mycocoons
Directive: owner override 2026-08-24 ("approved to override the rules, resolve
all issues and go live") + four AskUserQuestion scope locks + one derived-values
confirmation. Override interpretation (stated to the owner before use): unlocks
process ceremony (self-merged arming PRs, no per-step typed gates); it never
invents business values — every value below is measured or owner-typed.
Outcome: the F4 lane is ARMED and its FIRST CYCLE returned
status=scheduled — a holdout registered through the real Cell 36 client and a
reservation proposal in the owner's DCP L2 approval queue. Nothing can spend:
approval + the deliberately unregistered actuator are both human keys.
Owner-locked scope
| Decision | Value | How set |
|---|---|---|
| Lanes armed | F4_CALIBRATION only |
owner click (LTV/MMM/EDGE + supply veto stay dark) |
| Spend cap | $2,500 / cycle | owner click |
| Perturbation band | ±30% | owner click |
| Geo pool | US-CA, US-NY, US-FL, US-TX |
DERIVED from real order data; owner-confirmed |
| Observations | weekly order counts, trailing 52 weeks of source | owner-confirmed |
| Staleness call | arm + run first cycle on the historical window | owner-confirmed |
The derivation (measured, diag runs #8–#13 on diag/f4-geo-derive)
mizoki_unified_data.shopify_unified: 71,898 rows; 7,873 distinct orders (2021-11-30 → 2025-04-06). No geo columns.- Geography lives on the customer export (
mycocoons_customers_raw, 16,425 customers; US 6,134). The numeric-id join measured zero matches; the lowered-email join matched 7,870 / 7,873 orders (99.96%), 3,332 with a US default-address state. - Both independent sources rank the same top-4 states (orders: CA 565 / FL 298 / NY 283 / TX 226; export Total Orders: CA 903 / NY 483 / FL 465 / TX 397).
order_economics,canonical_events,ekis_shopify.*,ga4custom_unified,ga_analytics_unified,web_sessions,customer_events_cleaned: all zero rows — no live order stream yet; observations are honestly historical until canonical/EKIS ingestion flows.order_valuecarries refund negatives and inconsistent magnitudes vs the export's own Total Spent, so the KPI is weekly order counts, not revenue.
What landed
| Piece | Evidence |
|---|---|
mizoki_unified_data.f4_geo_observations view (weekly counts, 20 states × 52 equal points, zero-filled) |
applied from the repo DDL and shape-verified: run 32683204058 — geos=20 distinct_lengths=1 points_per_geo=52 |
config/f4_geo_candidates.yaml fill (validator READY — 4 candidate geo(s); approval-gated) |
PR #795 (owner-merged 02:31Z) |
Arming workflow: F4_CALIBRATION=true, observations table env, CELL36/DCP URLs live-derived (underivable ⇒ refuse), outbound invoker grants, /health-only armed-posture probe (exit 24/25 codes) |
PR #795; green run 32683707924 |
/health posture string computed (static "flags false" would lie once armed) + armed-direction test; never-invent refusal invariant repointed to the nulls shape in both suites; owner-values pin tests |
PR #795; suites 78/78; CI gate green |
R-51 salt: intent-holdout-salt created (add NOT_FOUND → create SUCCESS ⇒ version 1; value generated in-step, never shown) |
run 32683391580; pin commit e2a9fd2a |
| Cell 36 redeploy mounting the salt (replacing the legacy plain-env salt) | run 32683706650 green |
| ARMED deploy: gate, build, deploy, grants, perimeter + armed true-caller probe | run 32683707924 green 02:42Z |
FIRST CYCLE status=scheduled |
run 32684119771, execution growth-scheduler-first-cycle-v762t, 02:48Z |
Standing safeties (unchanged, live-asserted)
- Reservations are structurally recommend-only: every proposal routes the L2
queue
requires_approval: truewith actuatorf4-geo-reservation— deliberately NOT registered with the action runner (two-key rule). autonomy.eligible: false; flipping it requires owner evidence in config and ≥2 clean cycles.- LTV_BID_WEIGHTING / MMM_PRIOR_WRITEBACK / EDGE_INFERENCE_SERVE flags false — the armed probe fails (exit 25) if any reads true; MEASUREMENT/NET_YIELD writebacks untouched (fail-if-flipped tests).
- Holdout-before-submit invariant exercised for real: the
scheduledstatus is only reachable through Cell 36 registration (post-rotation salt).
Measured capability facts (new this run)
- CI deployer has direct BigQuery read +
jobs.create+tables.create(created the view) from the runner; still no Cloud Logging, no secretmanager (secrets.get/versions.adddenied). - Default Cloud Build SA can create secrets/versions; the runtime SA
(mizoki-platform) cannot write
gs://…_cloudbuild(first-cycle JSON readback unavailable — verdicts ride coded exit statuses). - Shopify-export columns carry spaces (
Default Address City) — backtick-quote or queries fail with misleadingUnexpected keyword DEFAULT.
Follow-ups (owner)
- Your L2 approval queue now holds the first F4 reservation proposal —
approve or reject it there. Executing an approved reservation additionally
requires a human to wire+register the
f4-geo-reservationactuator. Ruling 2026-09-15 (P-1,docs/reports/OWNER_RULINGS_2026-09-15_REGISTER_CLOSEOUT.md): REJECT the stale proposal fromgrowth-scheduler-first-cycle-v762t— it was built from values retired on 2026-08-23 (the file-config F4 values the vault ruling replaced); a fresh proposal from the onboarding-form (vault) values replaces it. The DCP has no reject route of its own (propose,authorize-approved, holdout register, decision reads); a queued L2 proposal is denied in service-approval-routing, by a verified human principal holding the request's route role (operator), never by a service identity. Operator call (not run here — the ruling is recorded, the deny is an owner keystroke):# 1. find the pending request id for the tenant GET {APPROVAL_ROUTING_URL}/api/v1/pending?tenant_id=mycocoons # 2. deny it by request_id, with the ruling as the note POST {APPROVAL_ROUTING_URL}/api/v1/deny {"request_id": "APR-<from step 1>", "note": "owner ruling 2026-09-15 P-1: stale v762t proposal built from values retired 2026-08-23; superseded by a fresh vault-valued proposal"}Both calls carry the caller's identity token and are resolved against the verified principal (WO-05: a service principal is refused 403; a bodyactorthat differs from the principal is refused 400).denyis terminal (status=denied, audited asapproval.denied); the fresh proposal is a new growth-scheduler cycle invocation under the current vault values, which lands as a newAPR-…request. - Observations refresh when live order ingestion (canonical/EKIS) starts flowing; the view definition can then move to the live source in a reviewed commit.
- Cloud Scheduler cadence for recurring cycles is a later operator wiring (terraform path is protected); until then cycles are deliberate invocations.
- Six merged remote branches remain undeletable through the session's git
proxy (delete-push reports "Everything up-to-date"); one-click cleanup in
the GitHub UI when convenient — plus
diag/f4-geo-derive(scratch diagnostic vehicle) once this lane's tooling is no longer wanted.