GROWTH CONTROL COMPLETION v1.1 — Step 0 Verify-Before-Build Report

Date: 2026-08-19 · Session: growth-control-completion (w7vg1c) · Branch: claude/growth-control-completion-v1-1-w7vg1c (local; unpushed until in-session APPROVED: MERGE) Base: origin/main @ 8c7a85e (fetched + fast-forwarded 2026-08-19 ~15:4xZ before any build) Method: five parallel read-only inventory subagents over the tree + direct gate executions in this session. Every claim below cites file:line or a command run here. This sandbox has no gcloud/bq (measured: which gcloud bq → not installed), so no live control-plane read was possible; live claims below cite their recorded evidence and date instead of a fresh probe, per docs/architecture/CELL_REGISTRY.md's own method note.


0.1 Registry ground truth

0.2 Standing gates — verified by filename, exact commands, baseline state

Executed on the untouched base (8c7a85e) in this session:

Gate Command (verified real) Baseline
Skill parity (platform-expert, 8 homes) python3 scripts/skills_sync.py --check GREEN
Skill corpus parity python3 scripts/skill_sync.py --check RED — PRE-EXISTING: registry.yaml stale — run --sync (exit 1). In zero workflows (measured), so main CI does not see it. Fix rides this run's skill-version work via the tool's own --sync.
Canon lint python3 scripts/skill_sync.py --audit GREEN (exit 0; fails on HIGH only — scripts/skill_sync.py:222). Pre-existing MEDIUMs: V5 skills/enterprise-virtuoso/SKILL.md:14, V8 lii_* alias mentions, V9a/V9b cell-count prose.
Ontology skill parity python3 scripts/ontology_skills_sync.py --check GREEN
Content truth gate python3 "# MIZ OKI 3.5/scripts/content_qa.py" --self-test then --root "# MIZ OKI 3.5" GREEN (self-test PASS; 57 scoped files clean)
Memory governance python3 scripts/claude_memory.py check --strict GREEN (exit 0)
Legacy model strings bash scripts/check_legacy_model_ids.sh GREEN
Rule-03 pre-merge greps V1/V2/V3 blocks from .claude/rules/03-canonical-architecture.md:120-136 run at every gate of this build
Suites (venv, pydantic 2.13.4 / fastapi 0.141.1 — the CI pins) pytest tests/governance -c tests/governance/pytest.ini · pytest tests/skills -q · MIZOKI_STORE=memory pytest tests/connectors -q · pytest services/service-marketing-connectors -q · pytest services/net-yield -q 237 · 154+2s · 236 · 83 · 83 — all green

FAILED GATE recorded per the prompt's rule: python3 scripts/mizoki_canon.py --check is a no-op false green — the file is a library with no CLI (no argparse/__main__; 333 lines), already documented as such in docs/reports/ORACLE_PRECONV_PROMPT_REVIEW_2026-08-18.md (finding F1) and docs/prompts/CLAUDE_CODE_MASTER_PROMPT_ORACLE_PRECONVERSION_v1.3.md ("never cite it as a gate"). This run's canon-lint gate is skill_sync.py --audit (which imports mizoki_canon), exactly as the ORACLE v1.3 prompt re-bound it. skill_sync.py --check confirmed present as the prompt's skill_sync.py --check confirmed canonical item.

0.3 Intent Engine v2 / ORACLE pre-conversion state — DELTAS ONLY

All four pre-conversion Workstreams A–D are MERGED (plan of record docs/ORACLE_PRECONVERSION_INTENT_v1.1.md; landed 2026-08-18, hardened same day; GATE-2 deploy dispatched — docs/reports/FULL_CLEARANCE_RUN_2026-08-19.md). Verified in-tree:

Genuine deltas for this run's Workstream A (the r2.0 retention bounds as CODE):

Bound Measured state Delta
I-01 raw sequence buffers purged at session end Client buffer only (capture-core.js:147); server-side behavioral payloads persist in intent_signals rows indefinitely; zero session_end/purge machinery in cells 33–35 (repo-wide grep) BUILD: session-termination purge (sweep + post-session-absence test)
I-02 session state active-session only intent_scores_shadow has no expiry (no partition_expiration_days); cell34 holds no in-process session state (rows are caller-supplied) BUILD: strict TTL sweep for shadow forecasts + test
I-03 bounded to creative lifecycle No asset-retirement concept anywhere; creative_vectors DDL declares non-identity-linked by design (creative_vectors_ddl.sql:12-17) BUILD: asset-retirement cascade + test
I-04 strict TTL expiry expires_ts written, zero readers repo-wide BUILD: bridge expiry sweep + test
I-05 feeds ValidationPassport No intent-lane import of any passport type BUILD: rides Workstream B (package carries intent evidence refs when present)
Erasure cascade Covers all 7 identity-linked tables incl. intent_scores_shadow (cell33/ingest_cell/storage.py:493-505) + cell35 graph leg; creative_vectors and LatentBridge nodes excluded by documented design (campaign assets / topic-level, no identity) BUILD: retention-registry + coverage test asserting every IEv2 module store is either erasure-covered or documented-non-identity — extension where a new store appears, never blind extension over designed exclusions

The word "retention" appears zero times in the ORACLE plan of record — the five-module retention contract enters with Growth Control r2.0 §3 ("Session-end purge jobs and retention-bound tests are part of the build, not the documentation"), which is currently false against the code and is exactly what this run makes true.

0.4 Net Yield state — DELTAS ONLY

services/net-yield/ is substantially complete (83 tests green at base): order/refund mapping (order_economics.py:150,293), config/net_yield_costs.yaml + validator with unknown-key rejection and missing-costs exclusion (cost_config.py:152; exclusion compute.py:184,237-241), nightly compute endpoint + documented formula (compute.py:5-28,90-96), expected-returns-after-≥1-cycle gate (compute.py:121-145), /api/v1/yield/order/{id} + /api/v1/yield/cohort/{id} (main.py:152,162), writeback modules (writeback/meta_capi.py, writeback/google_value_rules.py), NET_YIELD_WRITEBACK default "false" (writeback/__init__.py:24), RUNBOOK (docs/net-yield/RUNBOOK.md) + ADR (docs/net-yield/ADR-NY-001.md).

Genuine deltas: (1) no ast/source-literal fail-if-flipped test for NET_YIELD_WRITEBACK (rails has the pattern: services/measurement-rails/test_flags.py:46-55); (2) no no-live-HTTP structural test over services/net-yield/ (property holds — zero HTTP-client imports, transports injected — but nothing asserts it); (3) no dry_run mode on the writeback send paths; (4) truth-drift: main.py:3-5/README.md:3-5 say "no deploy-*.yml" while .github/workflows/deploy-net-yield.yml exists (dispatch-only), README says "59 tests" vs 83, registry row cites the cloudbuild as the deploy path. MEASUREMENT_WRITEBACK ast-pin already exists (test_flags.py:52-55). Cost config still 5 NULLs — operator item 21, untouched.

0.5 Decision-trace state (ValidationPassport packaging substrate)

The eight decision objects live in contracts/mizoki_contracts/decision_objects.py (chain: EvidenceBundle → ReasoningPath → ForecastOrScenario → ValidationPassport → DecisionProof → ActionAuthorization → OutcomeRecord → LearningRecord). The name ValidationPassport is already object #4 and miz_oki_source_of_truth.DECISION_OBJECTS forbids a ninth object or private variant — so the r2.0's "ValidationPassport" (the whole per-decision trace) must be built as a read-model package assembling the existing eight, not a new contract object. Field availability (subagent map, verified spots):

0.6 content_qa + canon-linter ban lists vs ratified vocabulary

Measured exhaustively (both linters executed against all seven ratified terms):

0.7 Frontier substrates (F1/F2/F3/F4/F5)

0.8 Retention / repeat-purchase data availability per tenant (F2 gate)

order_economics at 0 live rows (marketing-commerce-connectors rule 6c); mycocoons order outcomes exist in mizoki_intent (2,877 order outcomes, corpus card) but at conversion grain. No tenant currently has ≥2 observed quarters of cohort economics — the F2 hard guard (data_insufficient) will be the live output for every real tenant today, which is exactly the honest designed behavior. Synthetic fixtures prove the math.

0.9 Coordination ledger check + prior runs

0.10 Plan-premise deltas recorded (registry/tree wins)

  1. scripts/mizoki_canon.py --check is not a gate (library, no CLI) — the real canon gate set is §0.2's.
  2. DR-Learner/DoWhy lineage is cell26, not cell27 (prompt §1 said "cells 26/27/35"); cell27 contributes Bayesian posterior machinery.
  3. matched_geo is not a design type; geo is, and cell36's unit_kind="geo" already exists — F4 needs no holdout-schema migration.
  4. The passport packaging cannot be a ninth contract object (source-of-truth prohibition) — built as a read-model package over the existing eight.
  5. Governance images carry only contracts/ + service dir — shared growth-control governance modules land in contracts/mizoki_contracts/, not src/shared/.
  6. F1's "extend CreativeSemanticProfile" resolves to extending src/shared/creative_aesthetic — the marketing name has no code referent; the ratified name is adopted as the lane's alias, additively.

— End of Step 0 —

← All docsView source on GitHub →