Files
waggle-os/docs/briefs/2026-04-23-cc-sprint-12-task2-c3-mini-kickoff.md
Oleg Maslov 0c3e2ead3b
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled
moving
2026-09-02 10:10:29 +02:00

209 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CC-1 Brief — Sprint 12 Task 2 (C3 Stage 2 Mini) Kickoff Authorization
**Datum:** 2026-04-23
**Sprint:** 12 · Task 2 · C3 Stage 2 Mini (first live-LLM LoCoMo run on A3 LOCK substrate)
**Authority:** PM (Marko Marković), 2026-04-23 post-Task-1-ratification
**Pre-req gates:** Sprint 12 Task 1 ✅ CLOSED (origin/main HEAD=`ffcfecf`, 9 commits, 265/265 tests green) · A3 LOCK v1 ✅ RATIFIED · B1/B2/B3 LOCK ✅ CLOSED · LiteLLM container UP (verify at kickoff)
**Budget:** $120200 expected · Cap $250 hard · Hard abort @ $325 (130% of cap)
**Inherits from:** `briefs/2026-04-22-cc-c3-stage2-mini-kickoff.md` (original C3 brief, SUPERSEDED by this brief on runtime-dependent sections — §2, §3, §4 of original are now runnable because all 6 substrate blockers shipped in Task 1)
---
## 0. TL;DR
Originalni C3 brief (2026-04-22) je halted mid-pre-flight zbog 6 substrate blokera (vidi `sessions/2026-04-22-c3-blocked-substrate-gap.md`). Task 1 (Sessions 1+2+3 + B2 LOCK remap) je sve blokere zatvorio u 9 commits, $0 LLM spend, 265 tests green. Ovaj brief autorizuje **pravi live C3 mini run** — 4 cell × N=100 = 400 evaluacija, 3-primary judge ensemble (Opus 4.7 + GPT-5.4 + Gemini 3.1-Pro) + Grok 4.20 tie-break reserve, Qwen 35B-A3B kao target, A3 LOCK v1 manifest bindovan, Fleiss κ + Wilson + cluster-bootstrap CI mid-run i post-hoc, failure taxonomy F1-F6+F_other aktivna.
**Pre-kick HALT su 3 carry-over items iz Task 1 Session 3 exit ping (§5 Surprises).** Brief §2 (dole) rešava sva tri pre nego što se bilo kakav budžet potroši.
---
## 1. Što je drugačije vs. originalni C3 brief (2026-04-22)
Originalni brief reference-uj za sekcije koje ostaju nepromijenjene (§1 Authorization context, §6 Abort criteria, §8 After C3 PASS, §9 Sprint close path, §10 Related). Ovaj brief **nadomješta** sljedeće:
| Originalni § | Status na HEAD `ffcfecf` | Akcija |
|---|---|---|
| §4 invocation — `--cell raw,filtered,compressed,full-context` | Valid (Blocker #2 Cell enum rename commit `620f018`) | Invocation shape iz originala radi bez patch-a |
| §4 invocation — `--dataset locomo --limit 100` | Canonical LoCoMo loader live (Blocker #1 commit `a75dd25`) | Nema više synthetic fallback silent path |
| §4 invocation — `--manifest-hash <sha256> --emit-preregistration-event` | Pre-registration CLI surface + `bench.preregistration.manifest_hash` event emitter live (Blocker #3 commit `8466eaf`) | Event fire-uje; §5 exit criterion 7 je sada satisfiable |
| §4 invocation — `--judge-ensemble primary` | **Replace sa concrete ensemble syntax** (vidi §4.3 dolje) — literal `primary` token nije pattern koji runner parsira. Umjesto toga: `--judge-ensemble claude-opus-4-7,gpt-5.4,gemini-3.1-pro` (auto-wires grok-4.20 reserve preko `runner.ts:403-414` B2 LOCK wiring) |
| §4 invocation — `--judge-tiebreak grok-4.20` | Explicit flag još uvijek nije implementiran. Auto-wiring kroz 3-element primary ensemble rule ostaje mehanizam (commit `fa4cbd6` B2 LOCK remap + `b7e52fc` judge registry) |
| §5 exit criterion 4/5 — Wilson CI + κ | Fleiss κ + Wilson CI + cluster-bootstrap live (Blocker #5 commit `fd4b216`, +34 tests) | Mid-run κ HALT logic dostupan; aggregate.json populira `ci { wilson, bootstrap }` per cell |
| §5 exit criterion 6 — Failure distribution F1-F6+F_other | Taxonomy module + rubric + validator + aggregator live (Blocker #6 commit `00157b1`, +33 tests) | **Ali judge-response parser još ne populira `failure_code`/`rationale` u `JsonlRecord`** — vidi §2.1 ispod, blocking pre kickoff |
| §3 manifest generation — per-run manifest v1 | Pre-registration CLI live | §3 iz originala je runnable bez promjene; hash se emituje i verifira protiv YAML twin-a |
---
## 2. PRE-KICK HALT — 3 carry-over items iz Task 1 Session 3 exit ping
Ovi se svi rešavaju u `benchmarks/harness` side pre prvog live invocation-a. Zero budget, zero LLM spend.
### 2.1 JsonlRecord.failure_code / rationale — **LOCKED Opcija C (Namespace Split) 2026-04-23**
**Status:** ✅ PM ratifikovao Opciju C. Decision doc: `decisions/2026-04-23-jsonl-record-taxonomy-split-locked.md`. CC-1 cleared za types.ts implementaciju.
**Šta se implementira:**
- `JsonlRecord` dobija `a3_failure_code: FailureCode` (F1-F6+F_other 8-value space) + `a3_rationale: string | null` (mandatory non-null kad `F_other`)
- Sprint 9 `judge_failure_mode` + `judge_rationale` ostaju kao legacy read-only polja; **ne** populiraju se na A3 run output-u
- Aggregate JSON i svi exit criteria koji referenciraju failure_code koriste `a3_failure_code` kao autoritativni ključ (exit criterion +12 u §6)
- Commit poruka sugerisana: `feat(benchmarks): A3 failure taxonomy namespace split — a3_failure_code + a3_rationale preserving Sprint 9 legacy fields`
**Odbačene alternative (audit trail):**
- Opcija A (Extend — duplikacija schema): odbijena, nema eksplicitni naming contract, otežava forensic grep
- Opcija B (Deprecate — breaking): odbijena, briše C2 stage 1 forensic shape-drift signal neprihvatljivo za proof obligations
**Razlog za C:** Aditivna promjena, $0 breaking risk, grep-friendly `a3_` prefix eksplicitno odvaja A3 taxonomy od Sprint 9 bez brisanja istorije. C2 arhiv ostaje čitljiv starim parserom.
### 2.2 OpenRouter slug verification za 3 judge modela + 1 reserve
**Problem:** Blocker #4 Session 2 Surprise #6 flagovao je da slug-ovi `gpt-5.4`, `gemini-3.1-pro`, `grok-4.20` u `config/models.json` su hipotetski — nije verifikovano da OpenRouter route postoji pod tim imenima. Blocker #5/#6 i Task 1 smoke su svi išli sa mock fixtures, ne protiv live API.
**Deliverable pre kickoff (CC-1 samoautomatic):**
```bash
# Per svaki judge slug, 1 ping-call sa minimalnim tokenima
curl -s https://openrouter.ai/api/v1/models | jq '.data[] | select(.id | contains("gpt-5") or contains("gemini-3.1") or contains("grok-4"))' | jq -r '.id'
```
Očekivani output u neka od tih formata: `openai/gpt-5.4`, `google/gemini-3.1-pro`, `x-ai/grok-4.20`. Ako stvarni slug razlikuje od `models.json` entry, update `config/models.json` + commit `fix(benchmarks): OpenRouter slug verifikacija za C3 mini live ensemble`.
**Abort path:** Ako bilo koji od 4 slug-ova (3 primary + grok reserve) ne postoji na OpenRouter, HALT. Ne padaj u fallback; traži PM odluku o zamjenskoj ruti (mogla bi biti direktan Anthropic/OpenAI/Google API key + LiteLLM route bypass OpenRouter).
### 2.3 Smoke fixture `grok_reserve_vote` → live `resolveTieBreak` swap
**Problem:** Session 3 Surprise #1 — smoke test-ovi u `benchmarks/harness/tests/smoke/` pre-encode-uju `grok_reserve_vote` u fixture row-u umjesto da pozovu `resolveTieBreak` iz `packages/server/src/benchmarks/judge/ensemble-tiebreak.ts`. Bilo je opravdano za smoke (cross-package import), ali live C3 run MORA koristiti real resolver.
**Deliverable:** U `benchmarks/harness/src/runner.ts` judge-pipeline block gdje ensemble vote sakuplja — poziv na `resolveTieBreak` kad 3 primary vote u 1-1-1 split. Import iz `@waggle/server` paketa (ili lokalna kopija resolver-a ako workspace import komplikuje build). B2 LOCK unit tests u `packages/server/tests/benchmarks/ensemble-tiebreak.test.ts` su već zeleni, pa ne trebaju novi testovi — samo wire.
**Verifikacija:** U §5 exit criterion 3 (B2 wire live-verified), tvoja pino log mora pokazati `path: quadri-vendor` + `fourth_vendor_slug: <verified_grok_slug>` + `resolveTieBreak` invocation u bar jednom od 400 instanca. Ako zero fires, isti forensic signal kao originalni brief spominje.
---
## 3. Pre-req gate: Docker / LiteLLM health-check
Isti kao originalni C3 brief §2. `docker ps --filter "name=waggle-os-litellm-1"` mora vratiti `Up <duration>`. Ako ne, restart procedura po C2 brief §2 (Marko handluje Docker Desktop UI restart). Abort sa `sessions/2026-04-23-c3-blocked-litellm-unhealthy.md` ako `/health` ne odgovara 200 u 10s.
---
## 4. Manifest generacija — step one
Per-run manifest pair: `decisions/2026-04-23-stage2-mini-manifest.md` + `.manifest.yaml`. 16 fields iz A3 LOCK §7 (vidi originalni C3 brief §3 za točnu listu). Ključne razlike vs originalna manifestacija:
- **Field 5 `target_model`:** `qwen3.6-35b-a3b-via-openrouter` (LOCKED 2026-04-19, LIVE 2026-04-21) — ne DashScope direktan (B3 addendum carve-out za non-Anthropic providers)
- **Field 7 `judge_primary`:** verifikovane OpenRouter slug verzije iz §2.2 (ne hipotetski tokens)
- **Field 8 `judge_tiebreak`:** verifikovani grok-4.20 OpenRouter slug iz §2.2
- **Field 10 `dataset_version`:** LoCoMo release hash iz canonical loader (Blocker #1) — uzmi iz `benchmarks/harness/src/datasets.ts` loader constant
- **Field 14 `failure_taxonomy_version`:** `F1-F6+other v1` (match Session 3 smoke payload)
Commit manifest pair pre runner invocation sa poruke iz originalnog C3 brief §3 format-a.
---
## 5. Invocation (UPDATED za HEAD `ffcfecf`)
```bash
node benchmarks/harness/src/runner.ts \
--model qwen3.6-35b-a3b-via-openrouter \
--cell raw,filtered,compressed,full-context \
--dataset locomo \
--limit 100 \
--per-cell \
--seed 42 \
--live \
--budget 250 \
--judge-ensemble claude-opus-4-7,gpt-5.4,gemini-3.1-pro \
--manifest-hash <sha256_from_step_3> \
--emit-preregistration-event
```
Promjene vs originalni brief §4:
- `--judge-ensemble primary` → eksplicitni concrete ensemble lista (3 slugs). Grok-4.20 reserve auto-wiruje se preko 3-element rule u `runner.ts:403-414`.
- `--judge-tiebreak grok-4.20` flag **uklonjen** — dok se explicit flag ne implementira u parseArgs, auto-wire path je source of truth.
- `--per-cell` flag verifikacija: ako Blocker #3 commit (`8466eaf`) nije dodao `--per-cell` u parseArgs switch, onda je `--all-cells` alternativa (runs hardcoded 4-tuple). Check with `node benchmarks/harness/src/runner.ts --help | grep -E "(per-cell|all-cells)"` prije kickoff-a; ako fail, zamijeni sa `--all-cells`.
Output putanje:
- `benchmarks/runs/2026-04-23-c3-stage2-mini/<cell>.jsonl` (4 fajla)
- `benchmarks/runs/2026-04-23-c3-stage2-mini/aggregate.json`
---
## 6. Exit criteria (11 total)
Svih 11 iz originalnog C3 brief §5 ostaje **netaknuto**, uz dva dodatka iz Task 1 carry-over:
**+12.** `JsonlRecord` shape u output JSONL mora populirati `a3_failure_code` + `a3_rationale` (ako PM ratifikuje Opciju C; inače odgovarajuća polja iz Opcije A ili B) za svaki row. Grep: `jq '.a3_failure_code' benchmarks/runs/2026-04-23-c3-stage2-mini/*.jsonl | sort | uniq -c` mora vratiti distribuciju koja mapira na `failure_distribution.counts` u `aggregate.json`.
**+13.** Live `resolveTieBreak` invocation count u pino logu mora biti jednak `tie_break_activations` u `aggregate.json`. Smoke fixture pre-encode pattern NE smije se pojaviti u live JSONL.
Ostatak (Wilson CI, Fleiss κ, F-distribution, B2 tie-break wire, manifest hash match, Tier 2 archive bundle) — vidi original §5.
---
## 7. Abort criteria
Isti set od 6 triggera iz originalnog brief §6. Dodatak:
**+7.** Ako `resolveTieBreak` throw-uje ili vrati undefined za bilo koji 1-1-1 split — HALT, forensic preserve JSONL, ne clean up.
---
## 8. Budget ledger & acceptance tabela
| Faza | Očekivana spend | Granica |
|---|---|---|
| Pre-kick §2 (JsonlRecord typechange + slug verify + tie-break wire) | $0 | nezavisno od budžeta |
| Manifest generacija §4 | $0 | — |
| Live run §5 (4 cells × 100 instances × ~5 API calls per) | $120200 | cap $250 |
| Post-run aggregate + archive §5.11 | $0 | — |
| Exit ping §5.10 | $0 | — |
| **Ukupno cap** | | **$250** |
| **Hard abort @ 130%** | | **$325** |
---
## 9. Task 2 kao poveznica sa Week 1 Qwen×LoCoMo plan
Ako C3 mini PASSes (svih 11 + 2 dodata exit criteria zadovoljena, κ PASS, CI width akceptabilan):
- Ovo postaje **proof-of-wire** za A3 LOCK substrate + B1/B2/B3 + Task 1 substrate infrastructure. Pipeline je kompletno validiran uz real traffic, ne samo fixtures.
- H-42a/b (Stage 2 full LoCoMo, N=1540) je tehnički unblocked ali i dalje procedurno gated na PM call o pune budžete ($1300-2300 / cap $2600) — ne ovaj brief.
- Task 3 (C3 full LoCoMo) bi kickoff-ovao sa istim substrate-om + dodanim cost-control (batching, progressive κ monitoring, early HALT threshold).
- Pre-Flight Gate §3 stage 1 ($60-115 checkpoint ispred H-42a/b) — ovo mini run spada u taj gate u suštini, iako je $120-200 a ne $60-115. PM razmišlja da li re-kalibrira Gate stage 1 budžet naspram C3 mini realne cene.
---
## 10. What CC-1 NE radi u ovom kick-u
- Ne piše PM odluku za §2.1 — PM ratifikuje Opciju C (ili A, ili B) prije nego CC krene sa implementacijom types.ts ekstenzije.
- Ne piše H-42a/b full run brief. To je Sprint 12 Task 3 ili 4 pending C3 mini PASS.
- Ne invokira `scripts/check-manifest-sync.mjs` — script još ne postoji; manualna verifikacija pre-hash match kroz commit message ostaje sufficient (originalni brief §7 exception).
---
## 11. Exit ping template
`sessions/2026-04-23-sprint-12-task2-c3-stage2-mini-exit.md`
Struktura iz originalnog C3 brief §5.10, prošireno sa:
- **§3A:** Pre-kick §2 rezultati (PM odluka ID, OpenRouter slug diff, tie-break wire commit SHA)
- **§12:** JsonlRecord shape verification (grep stat per §6 criterion +12)
- **§13:** Live `resolveTieBreak` invocation count vs aggregate (§6 criterion +13)
---
## 12. Related (Task 2 specifični)
- `briefs/2026-04-22-cc-c3-stage2-mini-kickoff.md` — originalni C3 brief (ovaj brief inherits; runtime-dependent sekcije superseded)
- `sessions/2026-04-22-c3-blocked-substrate-gap.md` — 6-blocker diagnoza koju Task 1 closes
- `sessions/2026-04-22-cc-sprint-12-task1-session3-exit.md` — izvor 3 Task 1 carry-over items
- `decisions/2026-04-22-bench-spec-locked.md` + `.manifest.yaml` — A3 LOCK v1 parent manifest (Task 2 per-run manifest inherits)
- `decisions/2026-04-22-tie-break-policy-locked.md` — B2 LOCK (tie-break wire commit `fa4cbd6` implementira)
- `decisions/2026-04-22-b3-lock-dashscope-addendum.md` — B3 addendum (Surface A/B non-Anthropic provider carve-out relevantno za Field 5)
- `project_sprint_12_task1_closed.md` — memory entry za Task 1 close (reference za 9-commit ledger)
- `project_benchmark_alignment_plan.md` — Week 1 Qwen×LoCoMo scope (ovo mini run je first step)
- `project_preflight_gate.md` — 3-stage $60-115 gate (C3 mini je faktički ~stage 1 ekvivalent, budžet kalibracija open)
---
**C3 Stage 2 Mini AUTORIZOVAN — svi pre-kick items ratifikovani (§2.1 LOCKED Opcija C, §2.2 CC slug verify GREEN, §2.3 CC tie-break wire GREEN). Očekivano 4-6h wall-clock, $120-200 spend, cap $250, 4 cells × 100 LoCoMo instanca = 400 evaluations, primary ensemble Opus 4.7 + GPT-5.4 + Gemini 3.1-Pro, tie-break Grok 4.20 reserve, Qwen 35B-A3B target, A3 LOCK v1 manifest bindovan, Fleiss κ + Wilson + cluster-bootstrap CI live, F1-F6+F_other taxonomy live sa `a3_` namespace. CC-1 CLEARED to proceed sa §2 pre-kick sequence (types.ts ekstenzija + OpenRouter slug verify + live resolveTieBreak wire), pa §4 manifest generacija, pa §5 invocation.**