[AAASM-5048] ✨ (ci): Add modules.json ref-drift CI gate#133
Conversation
agent-assembly's default branch was renamed master→main; the docs aggregation
registry still pinned core `ref: master`, so `git clone -b master` failed
("pathspec 'master' did not match") and broke the Aggregate job on every docs
PR + scheduled main run. Point core at `main`. All modules now on main.
Guards against the failure class that broke modules.json three times in one week (node-sdk, go-sdk, core / AAASM-5047): a referenced repo renames its default branch and the stale pinned ref then fails git clone -b in aggregate.yml. The gate resolves each repo's live default branch via git ls-remote --symref and fails loudly on any drift. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
🔎 Claude Code review — evidence for maintainerCI state: Green. SonarCloud (pass), Aggregate all module docs (pass), hub component metadata (pass), and the new "Verify modules.json refs match live default branches" gate (pass, 8s) — i.e. the gate this PR adds ran against real remotes in CI and passed. Scope vs ticket (AAASM-5048): Exactly as scoped. Adds one file, Stacking: Depends on #132 (AAASM-5047). This branch is cut from #132's branch so the gate sees the corrected Side-effects: None beyond intended. No product/docs content changed; the workflow is path-filtered to Two-party review: evidence only. Not an approval; not self-merged. |
✅ Claude Code review — READY (maintainer evidence)
Verdict: scope-complete, MERGEABLE. Stacked on #132 — merge #132 first. Evidence only — not an approval, not self-merged. |



What
Adds a dedicated CI workflow
.github/workflows/modules-ref-check.ymlthat, for every entry inmodules.json, resolves the referenced repo's live default branch viagit ls-remote --symref <url> HEADand fails the build if the pinnedrefdoesn't match.Triggers:
pull_requestandpushtomainscoped tomodules.json(and the workflow file itself), plusworkflow_dispatch. Uses the repo's existing pinnedactions/checkoutSHA;gitandpython3are preinstalled on the runner, so no other actions are needed.Why
Nothing validated
modules.jsonrefvalues against reality. This exact failure class — a referenced repo renames its default branch (e.g.master→main), the stale pin then makesgit clone -b <ref>fail inaggregate.yml, breaking the Aggregate job on every docs PR and scheduled run — broke the file three times in one week (node-sdk, go-sdk, and core / AAASM-5047). This gate catches the drift at PR time instead of in the aggregation job.How verified
ruby -ryaml -e "YAML.load_file(...)"→ parsesactionlint→ cleanmodules.json: all 5 modules (core, python-sdk, node-sdk, go-sdk, arena) resolve to live defaultmain, exit 0. Against the pre-fix file (core=master, live default=main) it would exit 1 — confirming it genuinely catches the drift.Jira
https://lightning-dust-mite.atlassian.net/browse/AAASM-5048