[AAASM-3757] 👷 (aggregate): Harden version-set verify gate, hermetic channel seed, shared go TOML#43
Conversation
The verify gate asserted only >=1 archived dir per module, so a partial multi-tag rebuild could silently ship a truncated version dropdown. Record every tag that must produce a snapshot (core: release tags shipping docs; go-sdk: every valid semver tag) in expected-archived.txt and fail the build if any expected tag's /<tag>/index.html is missing. Refs AAASM-3757 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Cc1vBBiNxp9qLKQ5Gq85w8
build_core seeded the moving pre-release/stable channel pointers via a live curl of the deployed versions.json — non-hermetic and silently non-fatal, so a failed fetch shipped stale or empty pointers. Derive them from the rebuilt git tags using core's own semver logic (docs/ci/channels.py) instead; no build-time network dependency, and a channel can only point at a tag that was actually rebuilt. build_versions.py still applies the pre-release gate. Refs AAASM-3757 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Cc1vBBiNxp9qLKQ5Gq85w8
…r mirror build_go inlines the versions.toml serializer because go-sdk exposes its channel logic (versions_channels.py, already reused) but not its TOML serializer, which lives only inside docs-site.yml. Document that the emit step is a hand-kept mirror of that workflow and add a tomllib parse check so a serializer drift into malformed TOML fails the build loudly instead of shipping a broken version selector. Refs AAASM-3757 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Cc1vBBiNxp9qLKQ5Gq85w8
…er guard Reflect the AAASM-3757 hardening: the verify gate now asserts the full expected archived set (count-floor, catches partial dropdowns); core channel pointers are derived hermetically from git tags (no network curl); and the go versions.toml serializer is documented as a docs-site.yml mirror that is parse-checked with tomllib. Refs AAASM-3757 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Cc1vBBiNxp9qLKQ5Gq85w8
🔎 Claude Code review — aggregator hardening (AAASM-3757)CI: Green. Scope vs AAASM-3757: All 3 items delivered. (1) Count-floor verify gate: Side-effects / regression: NONE.
Readiness: Ready to approve & merge. Purely additive hardening — tighter gate + removed network dependency, no behavior change for the current tag set. — Claude Code (automated PR review, 2026-06-26) |
|



Description
Three non-blocking hardening fixes to the docs-hub aggregator
(
docs/scripts/aggregate.sh), surfaced while reviewing #42. No change to theaggregated output for the current tag set; all three close silent-failure gaps
that could ship a partial/stale/broken version switcher.
≥1dir permodule, so a partial multi-tag rebuild (some tags built, others silently
dropped) still shipped a truncated dropdown. Each build now records the tags
that must produce a snapshot in
expected-archived.txt(core: everyrelease tag that ships docs; go-sdk: every valid semver tag, identical to
archived[]inversions.toml) and the gate fails the build if any expectedtag's
/<tag>/index.htmlis missing.build_coreseeded the movingpre-release/stable pointers via a live
curlof the deployedversions.json— non-hermetic and silently non-fatal (could ship stale/empty pointers). They
are now derived from the rebuilt git tags using core's own semver logic
(
docs/ci/channels.py); no build-time network dependency, and a channel canonly point at a tag actually rebuilt.
build_versions.pystill applies thepre-release gate.
versions.tomlserializer guard. go-sdk reuses its channel logic(
versions_channels.py, already imported) but exposes no reusable TOMLserializer — it lives inline in
docs-site.yml, sobuild_go's emit stepis a hand-kept mirror. Documented as such and added a
tomllibparse checkso a serializer drift into malformed output fails the build loudly.
AGGREGATION.mdupdated to reflect all three.Type of Change
Related Issues
Documentation Checklist
AGGREGATION.mdupdated to match the hardened behaviorHow to verify
Ran the edited functions against fresh full clones of
agent-assembly(13 tags)and
go-sdk(8 tags):build_core→/core/{latest,<13 tags>}/+versions.jsonwith channelslatest+pre-release (v0.0.1-beta.4)derived without anycurl;archived[]= 13. Gateverify_archived_set core→13/13PASS.Partial archived set for core/: 12/13 ... missing: v0.0.1-beta.2. Restored → PASS.build_go→ 8 archived tag dirs +latest+pre-release; recomputedversions.tomlparses viatomllib(10 entries); gateverify_archived_set go-sdk→8/8PASS.public/and confirmed HTTP 200 for/core/latest/,/core/versions.json,/go-sdk/latest/,/go-sdk/<tag>/,/go-sdk/pre-release/;core manifest lists all 13 archived tags, go selector lists all 8 — no
regression to [AAASM-3753] ✨ (aggregate): Mirror core & go-sdk archived versions into hub switcher #42.
Closes AAASM-3757
🤖 Generated with Claude Code
https://claude.ai/code/session_01Cc1vBBiNxp9qLKQ5Gq85w8