# G5 cutover slice — first 5-loop end-to-end through Bun frontend Companion to `g5_first_slice_live.md`. That report proved the infrastructure (Bun /_go/* → Go gateway → Go upstreams). This report proves the SUBSTRATE'S CORE BEHAVIOR through the same path: playbook learning loop fires correctly, cross-role gate prevents bleed, distance math hits the designed value exactly. ## What was tested Real Bun-frontend traffic (`localhost:3700/_go/v1/...`) through the persistent Go stack on `:4110+:4211-:4219`. Workers corpus = 200 rows from `workers_500k.parquet`. Two tests: 1. **Same-role learning loop** — record a playbook entry on Q1's top-1 result, re-query Q1 with `use_playbook=true`, verify Shape A boost fires. 2. **Cross-role gate** — with the Forklift playbook recorded, query for CNC Operator and verify the Forklift entry does NOT bleed. ## Test 1: same-role boost fires (distance halved exactly) ``` Q1: Need 3 Forklift Operators in Aurora IL for Parallel Machining query_role: "Forklift Operator" corpora: ["workers"] cold (use_playbook=false): rank=0 id=w-43 dist=0.4449 Brian Ramirez (Forklift Operator, Springfield, IL) rank=1 id=w-102 dist=0.4483 Laura Long (Forklift Operator, Cleveland, OH) rank=2 id=w-19 dist=0.4548 Kimberly Williams (Forklift Operator, Peoria, IL) cold_top1_distance = 0.4449 → POST /_go/v1/matrix/playbooks/record: query_text = "Need 3 Forklift Operators in Aurora IL for Parallel Machining" role = "Forklift Operator" answer_id = "w-43" score = 1.0 → playbook_id = "pb-1126c52bd106df6b" warm (use_playbook=true): rank=0 id=w-43 dist=0.2224 ← halved (BoostFactor=0.5 for score=1.0) rank=1 id=w-102 dist=0.4483 (unchanged — not in playbook) rank=2 id=w-19 dist=0.4548 (unchanged) boosted=1, injected=0 warm_top1_distance = 0.2224 ``` **Math check:** `BoostFactor = 1 - 0.5 × score = 1 - 0.5 × 1.0 = 0.5`. Expected warm_dist = 0.4449 × 0.5 = 0.22245. Observed: 0.2224. The substrate fired through 3 HTTP hops (Bun proxy → gateway → matrixd) with the boost math hitting the design value to 4 decimal places. ## Test 2: cross-role gate prevents bleed ``` Q2: Need 1 CNC Operator in Detroit MI for Beacon Freight query_role: "CNC Operator" corpora: ["workers"] use_playbook: true (the Forklift recording from Test 1 is in playbook corpus) result: rank=0 id=w-175 dist=0.4922 Kevin Ruiz (Machine Operator, Detroit, MI) rank=1 id=w-178 dist=0.6177 Christine Jenkins (Maintenance Tech, Grand Rapids, MI) rank=2 id=w-102 dist=0.6432 Laura Long (Forklift Operator, Cleveland, OH) boosted=0, injected=0 ``` **Read:** - `boosted=0, injected=0`: the Forklift playbook entry did NOT fire on this CNC query. The role gate (real_001 fix) rejected it before BoostFactor or judge-gate logic ran. - `w-102` (Forklift Operator) DOES appear at rank 2 — but that's the regular cosine retrieval pulling it in via semantic similarity (Forklift Operator and CNC Operator share some embedder-space proximity). NOT a playbook injection. The cross-role gate's job is surgical: prevent PLAYBOOK-DRIVEN boosts from cross-role recordings, while leaving organic cosine retrieval untouched. Both halves verified. ## What this confirms about the substrate 1. **Learning works**: a single recorded playbook entry produces a measurable, mathematically-exact boost on the same-role re-query. The 5-loop's "matrix learns from outcomes" property is not aspirational — it's executing on persistent daemons through production-shape frontend traffic. 2. **Bleed protection works**: the same recording does NOT contaminate cross-role queries. The role gate (added 2026-04-30, verified via real_002 reality test) holds through the cutover slice. 3. **Math holds across HTTP hops**: cold 0.4449 × 0.5 = 0.2224 warm. Three intermediate hops (Bun frontend → gateway proxy → matrixd retrieve → vectord search) and the score-driven boost factor produces the exact designed value. No silent drift in any layer. 4. **Substrate works through real production-shape framing**: prior reality tests (`real_001..real_005`) ran direct against matrixd. This test ran through Bun's CORS layer, content-type negotiation, request-body forwarding, response-body re-streaming. All transparent. ## What this is NOT - Not a load test (one cold + one record + one warm + one cross-role query, not sustained traffic). - Not a multi-paraphrase test (single verbatim query repeated, not the harder paraphrase-recovery property real_002+ tested). - Not a multi-coordinator test (one synthetic operator, no alice/bob/carol-style namespace separation). ## Repro ```bash # Stack must be up first: ./scripts/cutover/start_go_stack.sh # Workers corpus must be populated: ./bin/staffing_workers -limit 200 -gateway http://127.0.0.1:4110 -drop=true # Bun mcp-server must have GO_LAKEHOUSE_URL set (via systemd # drop-in at /etc/systemd/system/lakehouse-agent.service.d/go-cutover.conf). # Cold: curl -sS -X POST http://localhost:3700/_go/v1/matrix/search \ -H 'content-type: application/json' \ -d '{"query_text":"Need 3 Forklift Operators in Aurora IL for Parallel Machining","query_role":"Forklift Operator","corpora":["workers"],"k":5,"per_corpus_k":5,"use_playbook":false}' | jq # Record: curl -sS -X POST http://localhost:3700/_go/v1/matrix/playbooks/record \ -H 'content-type: application/json' \ -d '{"query_text":"Need 3 Forklift Operators in Aurora IL for Parallel Machining","role":"Forklift Operator","answer_id":"w-43","answer_corpus":"workers","score":1.0,"tags":["g5-cutover-slice"]}' | jq # Warm: curl -sS -X POST http://localhost:3700/_go/v1/matrix/search \ -H 'content-type: application/json' \ -d '{"query_text":"Need 3 Forklift Operators in Aurora IL for Parallel Machining","query_role":"Forklift Operator","corpora":["workers"],"k":5,"per_corpus_k":5,"use_playbook":true}' | jq # Cross-role check: curl -sS -X POST http://localhost:3700/_go/v1/matrix/search \ -H 'content-type: application/json' \ -d '{"query_text":"Need 1 CNC Operator in Detroit MI for Beacon Freight","query_role":"CNC Operator","corpora":["workers"],"k":3,"per_corpus_k":3,"use_playbook":true}' | jq ```