bundle-bracket-pr · git:20261022.f58d663 · 2026-10-22 · sha256 3d0c59c7a27e7aec
bundle-bracket-pr git:20261022.f58d663A
Immutable. This exact content never changes and is served at /api/v1/blob/3d0c59c7a27e7aec.
--- description: Bundle, bracket, and live-data invariants before opening a PR globs: packages/core/**/* alwaysApply: false --- # Bundle & bracket PR readiness Before marking a data-heavy feature merge-ready, run **`pnpm -r build && pnpm -r typecheck && pnpm -r test && pnpm lint`** (mirror CI — build first because cli/mcp import `@claudinho/core` from dist; `build` alone does not typecheck). `scripts/gate.sh` runs the same gate with CI's smokes and guards, one verdict per step; it does not run `pnpm release:qa` or replace CI's Node 22 floor, Windows and macOS jobs, which `scripts/push-and-watch.sh` reads on the pushed SHA. ## Adversarial tests (add when touching bracket/schedule) | Scenario | Assert | |----------|--------| | FT level + `winnerCode` | Winner advances | | `fetchWindow` throws, standings OK | Projected groups + `source` set | | Bundle-only bracket | No real flags in R32+ slots | | Group at 0 games played | Slots stay `tbd`, no `(proj.)` | | Group at 2/3 played, standings live | Leaders show flags + `(proj.)` | | Group fully played (round-robin complete) | Winner + runner-up `confirmed`, no `(proj.)` | | `toolGetBracket` `tz: UTC` vs `America/Mexico_City` | Calendar date/time differs on cross-midnight kickoff | | Knockout kickoffs span >1 week | Output includes month + day (not weekday-only) | | `formatShareBracket` social + compact | Same date format as CLI list | | `formatShareBracket` / `toolGetBracket` | Each disclaimer line once | | Statusline and `ambient --json` knockout countdown (cached fixtures) | Real nations or `⚽ —`; never `🏳️` | | Statusline and `ambient --json` stale cache during live KO | `live · syncing…` (on `ambient --json` in the view's `lang`, `en vivo · sincronizando…`; the statusline's stays English) without `🏳️`; resolved pairing when cache has it | | Empty fixtures cache at phase boundary | Re-polls after short TTL (~60s), not 15min | The invariants are `AGENTS.md` "Conventions" (canonical: the bundled schedule, the live pairing, the knockout surfaces). Their narration, and the knockout resolution, topology indexing, live hybrid paths and pre-merge QA this rule carried, are in `guides/conventions/bundle-and-bracket.md`; the adversarial test table stays in this rule, where the PR template cites it.