docs: GB10 deployment guide + coverage-enforcing release gate#249
Conversation
run_all_models.py boots each model×quant and writes per-model JSON but never exits non-zero on failure — so "verified iff the matrix passes" was a human reading a table, and a model that crashed at boot (no JSON written) was invisible. A glob-only scorer would report the survivors green: a false ship. - run_all_models.py now writes all_models_results/_manifest.json — the roster it planned to cover, derived from planned_specs() (SSOT for the roster). - gate_results.py reads that manifest and fails any planned model with no passing result. Missing manifest is a hard FAIL unless --allow-missing-manifest is passed (explicit, coverage-unenforced). Exit 0 ships, 1 blocks. - tests/test_gate_results.py (stdlib unittest, no GPU) locks in the bars and the planned-but-absent = FAIL property.
Two contributor-facing deliverables plus the low-risk convergence they exposed. GB10 deployment & compatibility guide (docs/GB10_DEPLOYMENT_GUIDE.md): the one page to read before picking a model — model×quant matrix (single-node + scale-out), goal→recipe picker, weight/KV quant + OOM ladder, consolidated known-issues, EP=2 troubleshooting, and what "verified" means. Routes to the recipes/QUICKSTART/DEPLOYMENT rather than duplicating them; recipe defaults stay the serve-config SSOT. Linked from the README as the welcoming first-read. atlas-release skill (.claude/skills/atlas-release/): the build → verify → image → publish pipeline + upstream-sync PR automation, grounded in the real commands, containers, tags, and gates already in-tree. De-personalized so any contributor can run it. (Under .claude/, which is gitignored — force-added so reviewers see it; drop the path if skills should stay out of the tree.) Convergence the above surfaced, applied where unambiguous: - scripts/check-license-headers.sh — the script AGENTS.md / PR template / book all referenced but that never existed; thin wrapper over the same skywalking-eyes engine CI runs. - docker/gb10/Dockerfile — ARG ATLAS_GIT_SHA + revision LABEL so the image records its commit (release.sh already passed the build-arg into a no-op). - .github/workflows/cla.yml — allowlist maintainer identities so AI-authored maintainer PRs skip the CLA ceremony (external contributors still covered). - AGENTS.md — file-size cap 250→500 to match the CI SSOT; clippy/license lines aligned to CI; model-matrix pointer → the new guide. - Dead docs/EP2-TROUBLESHOOTING.md links (DEPLOYMENT, book, adr/0007) repointed to the guide §7; CONTRIBUTING notes CI-green ≠ shippable; docs/releases/ stub.
SeedSource
left a comment
There was a problem hiding this comment.
Codeowner review — APPROVE. Reviewed the load-bearing surface at head 85544ca (gate logic, CLA workflow, license script, Dockerfile, AGENTS.md); docs skimmed. Docs + tooling only, no engine code, all 20 checks green. For a no-engine-code PR that's the right bar. The gate is well-scoped and the tests lock the property that matters (planned-but-absent = FAIL). Three non-blocking notes.
What's good
gate_results.pycloses a real false-green. The manifest-vs-results coverage check (a planned model that never booted writes no<label>.json→ FAIL, not invisible) is exactly right, andtest_gate_results.py::Coverage::test_missing_model_is_a_failurepins it. Known-gap parsers scoring all-N/Acorrectly pass; a wired parser going all-WARN/FAILcorrectly regresses. Clean separation ofgate_manifest(enforced) vsgate_glob(loud, opt-in only).- Dockerfile
org.opencontainers.image.revisionLABEL — this directly answers the:latestprovenance question that's bitten us downstream (an image with no git-SHA is unshippable to verify against).release.shpassingATLAS_GIT_SHA+ the inspect one-liner is the whole fix. 👍
Non-blocking notes
gate_results.py— an empty section is scored PASS, the same false-green class this PR targets.verdict()guards every bar withif coh and …/if fib and …, and_is_model_result()only checks that thecoherencekey exists, not that it's non-empty. So a result file like{"model":"x","coherence":[]}returns[]→ verified. Ifsingle_gpu_suite.pycan ever emit an empty coherence list (all probes errored before scoring), it slips the gate. Cheap hardening: treat empty/absent coherence as a FAIL (if not coh or coh_pass < COHERENCE_MIN_PASS) — a verified model must have actually run probes. Only matters if that shape is reachable; flagging since it's the exact bug class the gate exists to catch.cla.ymlallowlist omits two owners.allowlist: …,AzeezIsh,tbraun96covers 2 of the human owners but not rsafier (3rd owner) nor @SeedSource (4th global CODEOWNER). Same rationale (already signed, own the copyright) applies to both — either add them or confirm the omission is intentional..claude/skills/atlas-release/is force-added past.gitignore. You already flagged this in the PR body. Codeowner call: keeping contributor/release tooling in-tree is useful, but a force-added path under a gitignored dir will silently drop future edits and reads as inconsistent. If it stays, prefer un-ignoring.claude/skills/explicitly (a scoped!.claude/skills/un-ignore) so it's tracked on purpose rather than by-f.
Nice cleanup on the check-license-headers.sh wrapper (same skywalking-eyes engine as CI — no drift) and the AGENTS.md 250→500 LoC alignment to the CI SSOT. None of the above blocks; approving.
🤖 Generated with Claude Code
|
Nice — this closes a real gap (the "planned but never booted = silent green" failure mode is exactly right to fix). A few things worth flagging on the gate design while it's still easy to adjust the bars, based on
None of these block what's here — the coverage-enforcement mechanism itself is the important fix and it's solid. Flagging in case the bars in |
|
One more gap, orthogonal to the gate itself but adjacent to this PR's scope (deployment guide + release tooling): there's no shared, canonical prompt set for manual/ad-hoc dev testing. Concretely, in the DFlash work this week we ended up with three different prompts in play with no agreed relationship between them: the short factual bench prompt ("What is the capital of France?", This is a different problem from the automated matrix in Might fit naturally as a short section in |
|
Tying the last two comments together with a longer-term framing: right now this whole pipeline — Worth naming explicitly as the target shape: this should end up as a real e2e/integration test suite wired into CI — Not asking for that in this PR — just flagging it as the natural next step so it's tracked somewhere (an issue, or a line in |
|
Follow-through on the three comments above: opened #253 as a concrete draft of the "pipeline as pytest" idea — a One doc suggestion while it's still easy to adjust: |
The gate's tps bar was liveness-only (avg > 0), so a real perf regression
(e.g. tps dropping 40%) passed as long as the number stayed positive. Add a
committed-baseline regression check: tests/baselines/<label>.json records the
blessed tokens/sec, and a run more than TPS_TOLERANCE (10%) below it fails.
- verdict() stays pure — takes the baseline dict as an argument (SBIO).
- No baseline for a label => liveness-only with a loud note, not a silent pass;
--require-baselines makes a missing baseline a hard fail for a milestone (PCND:
the stricter bar is explicit opt-in, mirroring --allow-missing-manifest).
- gate_results.py --update-baselines writes {"tps": avg} per label from the
present results for a deliberate, reviewed refresh (exit 0, no gating).
- Roster stays the single manifest SSOT in run_all_models.py; baselines key to
those labels — no second matrix.
- tests/test_gate_results.py extended to 23 tests (regression / within-tolerance
/ no-baseline / require-baselines / dead-server-first / update round-trip).
Baseline-snapshot approach proposed by @Sujimoshi in #253; folded into the
existing gate to keep one SSOT rather than a parallel pytest suite.
Co-Authored-By: Igor Solomakha <sujimoshi@users.noreply.github.com>
What this is
Two contributor-facing deliverables — a GB10 deployment guide for users and a
release-pipeline skill for maintainers — plus a real serve-matrix release
gate and the low-risk CI/CLA/doc convergence the work exposed. Docs + tooling
only; no engine code changes (so nothing here can regress a model).
Why
Two gaps kept coming up:
picked a model and quant that fit your box.
docs/GB10_DEPLOYMENT_GUIDE.mdisthat missing first-read.
tests/run_all_models.pywrites per-modelJSON but never fails — and a model that crashed at boot writes no JSON at all,
so a glob-only scorer silently reports the survivors green. That's a false ship.
Changes
Release gate (
tests/) —run_all_models.pynow writes_manifest.json(theroster it planned to cover, from
planned_specs()).gate_results.pyreads thatmanifest and fails any planned model with no passing result — coverage is
enforced, not assumed. Exit 0 ships / 1 blocks.
test_gate_results.py(stdlibunittest, no GPU) locks in the per-model bars and the planned-but-absent = FAILproperty. 14/14 green.
Deployment guide (
docs/GB10_DEPLOYMENT_GUIDE.md) — model×quant matrix(single-node + scale-out), goal→recipe picker, weight/KV quant + OOM ladder,
consolidated known-issues, EP=2 troubleshooting, and what "verified" means. Routes
to the recipes / QUICKSTART / DEPLOYMENT instead of duplicating them; the recipe
defaults stay the serve-config SSOT. Linked from the README as the welcoming
first-read.
atlas-releaseskill (.claude/skills/atlas-release/) — the build → verify →image → publish pipeline + upstream-sync PR automation, grounded in the real
commands, containers, tags, and gates already in-tree. De-personalized so any
contributor can run it.
.claude/is gitignored — force-added so reviewers cansee it; drop this path if skills should stay out of the tree.
Convergence (applied where unambiguous):
scripts/check-license-headers.sh— the scriptAGENTS.md/ the PR template /the book all referenced but that never existed; thin wrapper over the same
skywalking-eyes engine CI runs.
docker/gb10/Dockerfile—ARG ATLAS_GIT_SHA+ revisionLABELso an imagerecords its commit (
release.shalready passed the build-arg into a no-op)..github/workflows/cla.yml— allowlist the maintainer identities soAI-authored maintainer PRs skip the CLA ceremony; external contributors stay
covered.
AGENTS.md— file-size cap 250→500 to match the CI SSOT; clippy/license linesaligned to CI; model-matrix pointer → the new guide.
docs/EP2-TROUBLESHOOTING.mdlinks (DEPLOYMENT.md, book,adr/0007)repointed to the guide §7;
CONTRIBUTING.mdnotes CI-green ≠ shippable;docs/releases/shipped-SHA stub.Testing
python3 -m unittest tests.test_gate_results→ 14/14 pass.tests/run_all_models.pyplanner produces a 21-config roster for a full run;the gate enforces every one of them.
to these files; new
.py/.share outside the.licenserc.yamlSPDX paths.Authorship
AI-generated by Atlas's maintainer tooling, per
CONTRIBUTING.md§Authorship.Not included / follow-ups
ssm_qwen35.rs,scripts/package-distro.sh) are deliberately excluded — not part of thischange.
push:[main]workflow thatruns the gate and
docker saves a "ready to publish<sha>" artifact, leavingthe
docker pushhuman — closing the main →:latestdrift. Shape is in.claude/skills/atlas-release/references/pipeline.md§Closing the gap.