AUTONOMY FOUNDATIONS v1.0 — BUILD REPORT

Date: 2026-08-27 Session: v5lkfj · branch claude/autonomy-foundations-v1.0-v5lkfj (LANDED on main 2026-08-27 — §9) Step 0 report: docs/reports/AUTONOMY_FOUNDATIONS_STEP0_2026-08-27.md (KEEP/DROP evidence lives there) Charter compliance: every DROP is prior art verified on main; every KEEP extends the tree's canonical homes; zero protected paths; zero site-visible files (both measured against the diff).

1. KEEP/DROP outcomes

WS Verdict Outcome
W1 exec-reliability DROPPED D6-2 closed 2026-08-19 (execution_adapters/reconciliation.py + EXEC-1 lifecycle). Delta surfaced as owner note only.
W2 portfolio-risk DROPPED D6-1 closed 2026-08-21 (execution_adapters/portfolio.py, dark until PORTFOLIO_RISK_POLICY). Cap values = owner item.
W3 incident-recovery BUILT (platform half) scripts/incident/ ×5 tools + docs/runbooks/INCIDENT_RECOVERY.md; references, never duplicates, the landed D6-3 action-classes runbook.
W4 metric contracts BUILT (narrow extension) spend + ncm contracts added to contracts/mizoki_contracts/metric_contracts.py (the D6-4 ratchet grows; no parallel registry).
W5 L5 certification BUILT src/shared/l5_certification/ — the L5-CERT-1 measurement machinery, observe-only.
W6 benchmark harness BUILT eval/harness/ — role-keyed model benchmarks, the DIST-4 prerequisite.
W7 Klaviyo + TTD BUILT (webhook half only) klaviyo_webhook.py flag-off on the gateway; pull half / value rail / mapper untouched. TTD DROPPED (TTD-1 row + REDS intake exist; no seat).
W8 doc deltas SKIPPED (both halves, measured) r3.5.2 amendment already on main. No “Growth Control r2.1” exists — Drive board search (title + fullText) finds the Growth Control doc at r2.0 (matching the repo); the only r2.1-titled board docs are the executed Activation v2.1 prompt and FEATURE_CATALOG_AND_DEMO_PLAN_r2.1.md, which the v5.3 lane already landed with grounding corrections (eacccbe, 2026-08-26 — see LAUNCH_RECONCILIATION_CLAUDE_2026-08-26.md). Nothing to land.

2. What landed, per workstream

W4 — Metric contracts (commit d0b5c8797)

REQUIRED_METRICS += {spend, ncm}. spend normalizes per the D6-1 SPEND_ACTIONS unit table and is defined as an operand, never an incrementality signal (iROAS keeps that role). ncm mirrors the shipped NCM-v1 subtraction chain byte-for-concept from bigquery/schemas/net_contribution.sql / net-yield compute.py, with economics_complete=FALSE exclusion and the NET_YIELD_WRITEBACK stays false citation. Both fingerprint and invalidate exactly like the originals. The exact-set baseline pin in the test moved with its reason (rule 01). The standing gate was already real: tests/governance runs in the CI governance-spine step.

W5 — L5 certification machinery (commit b92054c76)

src/shared/l5_certification/ (+ cross-pin in da132d5e3): - gates.py — the FIRST executable pins of CONSTITUTION III.6 (Brier ≤ 0.20, AUC ≥ 0.72, ≥ 2 stable cycles; gap G-20's build half). Values are read-only, test-asserted both directions, and cross-pinned against scripts/mizoki_canon.py PROMOTION_GATES so the two homes cannot drift. - evaluator.py — pure-Python (numpy-free) Brier / tie-aware rank AUC / consecutive-latest-cycle stability over ADMISSIBLE realized pairs only (score strictly precedes outcome; malformed rows excluded and counted). Purchase-cycle membership is a protocol input, never inferred. Single-class AUC is None, never invented. - policy.py — the one-way rule: metric breach at an elevated level ⇒ downgrade recorded to L0 with every breached gate named; gates cleared ⇒ at most eligible-for-owner-review (a recorded FACT — no code path raises a level, proven exhaustively); no registered holdout ⇒ observe-only (CONSTITUTION II.10); insufficiency flags evidence-stale at elevated levels but never auto-demotes. headline_autonomy = MIN across a domain's classes, read-only. - records.py / store.py — unified.autonomy_certifications rows carrying D6-4 contract_fingerprint pins + pins_check_valid, the D6-1 blast_radius_cap_ref, reversibility and holdout flags. Store is dark until L5_CERT_BQ_PROJECT (not_configured, writes refuse loudly) with a structural never-upgrade guard. - cli.py + shipped fixture — the GATE-2 smoke (python3 -m l5_certification.cli --fixture … — exercised in-session: per-cycle metrics, exclusion counter, holdout rule, dark store all correct). - Premise corrections recorded: the realized loop is mizoki_intent.intent_scores + intent_outcomes (the tables the brier/auc contracts pin); unified.intent_predictions exists nowhere. This run certifies nothing and changes no autonomy level; L5-CERT-1's flip (owner program doc + first pack) stays open, and the row says so.

W6 — Model benchmark harness (commit 704252de8)

eval/harness/ — frozen role-keyed fixture sets (6 items × 4 roles, sha-versioned), deterministic scorers (exact/contains/regex/numeric_tolerance), a runner whose ONLY live transport is virtuoso_call (zero model strings in the harness — scan-tested; model_version read from the response; fallback service recorded, never silent), unified.model_benchmarks rows + dark-until-configured store, and a regression comparator that refuses fake-transport baselines and moved instruments. README states the hard distinction from ops/remediation/benchmark_harness.py (Stage-2 DOMAIN harness). Distillation itself stays RESEARCH; DIST-4 flips only on a recorded run (owner go).

W3 — Incident recovery, platform half (commit fca18cff0)

scripts/incident/: rollback_revision.py (registry-derived fleet, recorded-evidence service names, placeholder lines marked not-runnable, --apply refuses without gcloud), list_kill_switches.py (12-entry inventory grep-verified against the tree on every run — exits 1 on rot; seeded-rot proven both directions; NET_YIELD_WRITEBACK's real home measured to services/net-yield/writeback/), pause_schedulers.py (9 terraform-declared jobs parsed from deployment/terraform/**, plus the outside-terraform completeness check), drain_status.py (read-only, carries AGENTS 7.7), deploy_freeze.py (owner-action procedure; advisory-vs-ruleset stated). docs/runbooks/INCIDENT_RECOVERY.md = the platform runbook with the quarterly dry-run drill checklist; the live drill stays EXEC-1-gated exactly as the D6-3 row records. claim_label: built, pre-drill.

W7 — Klaviyo webhook half (commit c8cef6e4a)

The design pass KLV-1 deferred, executed on the module memory's settled canon: ONE receiver on the gateway (POST /webhooks/klaviyo/{tenant_id}), flag-off (KLAVIYO_WEBHOOK_ENABLED unset ⇒ 404; public surface byte-identical — pixel-door precedent). Per-tenant HMAC-SHA256 over the raw body (webhook_secret collected beside the api_key in the Connectors catalog — tenant-onboarding compliant), hex/base64, constant-time, uniform 401 (never a tenant oracle), store failure = loud 503. Pipeline: size caps → auth → replay → fail-closed consent gate (redaction via the shared redact_person_fields, counted in connector_consent_drops_total{topic=klaviyo}; the stable profile id survives as the erasure join key — raw email never a join key) → canonical door authoritative (502 ⇒ Klaviyo retries) → journey forward toward MAPPERS["klaviyo"] via the journey door, dark behind KLAVIYO_JOURNEY_FORWARD_URL. Replay posture — deliberately better than pre-mark: ReplayCache gains a read-only peek() (additive); peek sheds storms, seen() marks only after the authoritative leg holds, so a 502'd batch is NEVER pre-marked — at-least-once is test-pinned (test_failed_batch_is_never_marked_so_retry_reprocesses). Erasure matrix extended: canonical entity_ids carry profile/message ids; a new governance case proves POST /api/v1/subjects/erase by profile id redacts the envelope (bystander untouched). Source registered in ontology/sources/klaviyo.yaml with license: PENDING_BOSS. Kill-switch inventory gained the flag. The live Klaviyo signature wire format is the arming precondition — LIVE-VERIFY against a real delivery before the flag ever flips; until then every claim here is implemented.

Register truth-ups (commit da132d5e3)

BUILD_DEBT L5-CERT-1 / DIST-4 / KLV-1 gained dated built-notes (rows stay OPEN — no flip condition was met); coverage-matrix rows 4.6/5.5 and gap G-20 narrowed to match. Prevents the next session from rebuilding this work — the Step-0 failure mode in reverse.

3. Tests (all fresh runs, core-pinned venv per ci.yaml; python 3.13 / pytest 9.1.1)

Suite Baseline (Step 0) Final Delta
tests/governance (pytest.ini) 701 passed, 1s 770 passed, 1s, 18 subtests +69 (W3 18, W4 +3, W5 28, W6 19, erasure +1)
tests/connectors 340 356 +16 (W7 webhook suite)
gateway in-service 162 162 0 (mount imports clean)
remediation exec+portfolio+inventory 166 166 0
tests/shared virtuoso 43 43 0
tests/market_signal 292 292 0
memory trio 22 + 21 subtests 22 + 21 0
tests/skills 179, 2s 179, 2s 0
rails flags (fail-if-flipped) — 20 writebacks still hard-false
net-yield flags (fail-if-flipped) — 13 writebacks still hard-false
Total 2,023 passed / 0 failed

Standing gates: check_canon_docs.py self-test + scan OK (my docs/product edits in scope, no new findings); skills_sync.py --check OK; ontology_skills_sync.py --check OK; V1/V2/V3 hygiene greps clean over the diff; zero hardcoded model strings in the diff; claude_memory.py check --strict valid. Gate correction recorded (per the Activation v2.1 finding): scripts/mizoki_canon.py has no --check CLI — the real canon gates are the governance suite + check_canon_docs.py + the parity scripts, which is what ran.

4. Merge consequence map (measured, not inferred)

A push = merge = Deploy Router dispatch for matching paths. This diff matches exactly four deploy workflows:

Workflow Matching files Consequence
deploy-service-marketing-connectors the 4 gateway files (W7) Redeploys the gateway through its own suites gate + live verify step. New route is flag-off ⇒ serving behavior byte-identical (404).
deploy-boss-agent-core src/shared/l5_certification/** (rides the image's src/shared COPY) Pure additive library; imported by nothing in the boss — inert in the image.
deploy-service-action-runner contracts/mizoki_contracts/metric_contracts.py Additive registry entries (existing 166 adapter tests green).
deploy-service-canonical-ingestion same contracts file Same additive change; governance family green.

No other workflow matches (eval/, scripts/incident/, bigquery/schemas/, ontology/sources/, docs/, tests/ are unwatched paths). deploy-homepage.yml is dispatch-only and untouched.

5. Rollback plan (verified)

6. Owner-decision list this run surfaces

  1. W2 cap values: PORTFOLIO_RISK_POLICY per (tenant, currency, channel-group) — the landed D6-1 layer stays unarmed until declared.
  2. W5 first certification candidates + the owner-approved certification-program document (L5-CERT-1's flip condition). Real evaluations additionally wait on real forward labels (register 17/6c/23).
  3. Klaviyo license review (ontology/sources/klaviyo.yaml ships PENDING_BOSS) + per-tenant webhook secrets/credentials (register item 6) + live signature verification before any flag flip.
  4. TTD seat (TTD-1 unchanged; no build).
  5. Capital/Risk/Estate go/no-go (CELL-CRE-1 unchanged).
  6. Distillation go once W6 baselines exist against live models (DIST-4 flip = a recorded run).
  7. W1/W2 residual deltas (deliberately not built): per-cycle BQ reconciliation job + unified.execution_reconciliation; correlation-aware concentration warning; log-based alert policies on the D6-1/D6-2 markers (GATE-2 protected-path terraform).
  8. GC r2.1: does not exist as a Growth Control revision — if the owner intended a different board document, name it and it lands byte-identical with sha256.

7. Artifact hashes (sha256[:16])

Artifact Hash
services/service-marketing-connectors/klaviyo_webhook.py a15ca38c5a75da26
src/shared/l5_certification/evaluator.py 2b69e378de166f14
src/shared/l5_certification/policy.py eb70b5156a48c1ab
eval/harness/model_bench.py 8edaa5457f48e646
scripts/incident/list_kill_switches.py 5f224e16710412eb
docs/runbooks/INCIDENT_RECOVERY.md b5b37b617e34661a
bigquery/schemas/autonomy_certifications.sql 754cf89443062ed4
bigquery/schemas/model_benchmarks.sql 0fb2e87a7ce2764a

Branch commits (local, atop the landed claim 7deba3f91): d0b5c8797 (W4) → b92054c76 (W5) → 704252de8 (W6) → fca18cff0 (W3) → c8cef6e4a (W7) → da132d5e3 (truth-ups). Diff: 38 files, +3,622 / −11.

8. Gate status

GATE 1 — EXECUTED 2026-08-27. Owner released it in-session (typed Approved:merge; recorded on the ledger as merge-only authority, per the standing loose-phrasing precedent). The prescribed sequence ran in full — sync, re-gate on the push tip, one push, ancestry verification, router confirmation, ledger completion record 37aa6b352. Evidence in §9. GATE 2 — EXECUTED 2026-08-27 by the deploy lane under the owner's separate Approved:deploy (ledger record de379711c): both additive DDLs applied, smokes run. The certification smoke surfaced and fixed a real W5 CLI defect (30bc730cb — §9). All flags remain OFF; certification and activation decisions stay with the owner.

9. Landing and close-out (appended 2026-08-28; every row measured)

service run outcome
boss-agent-core #248 · 33106775109 SUCCESS, first attempt (19:15:48Z)
mizoki-action-runner 33106776888 SUCCESS, first attempt
service-canonical-ingestion 33106779121 SUCCESS, first attempt
service-marketing-connectors #49 · 33106781210 attempt 1 FAILURE → attempt 2 SUCCESS (19:13:24Z)
← All docsView source on GitHub →