Skip to content

docs(skill): add agent-hub-release skill for publishing sidecar agents#1777

Open
kovtcharov wants to merge 7 commits into
mainfrom
docs/skill-agent-hub-release
Open

docs(skill): add agent-hub-release skill for publishing sidecar agents#1777
kovtcharov wants to merge 7 commits into
mainfrom
docs/skill-agent-hub-release

Conversation

@kovtcharov

Copy link
Copy Markdown
Collaborator

Releasing a sidecar agent to the Agent Hub today means reverse-engineering release_agent_email.yml and its packaging scripts every time — the knowledge lives only in workflow comments. This adds a reusable Claude skill that captures the whole pipeline as a phased checklist, so the next agent's release (and the email agent's own) is a guided process instead of an archaeology session.

The skill generalizes the email agent as the reference implementation: freeze → Agent Hub Worker /publish (immutable, server-checksummed) → regenerate binaries.lock.json with real hashes → fetch-verify → npm publish via OIDC → website redeploy. It documents the per-agent file layout, the gaia-agent.yaml manifest, the three version numbers that must match before tagging, the one-time agent-publish gate + infra setup, and the load-bearing invariants (immutable-per-filename, publish-only-from-main, best-effort Intel, SCHEMA_VERSION MAJOR compat gate, OIDC-tied-to-filename).

Single file: .claude/skills/agent-hub-release/SKILL.md (directory + SKILL.md, matching the existing gaia-release / gaia-testing skills).

Test plan

  • Skill frontmatter (name, description) parses like the sibling skills under .claude/skills/.
  • Every referenced path resolves on main: release_agent_email.yml, gaia-agent.yaml, workers/agent-hub/schemas/manifest.schema.json, the packaging scripts, binaries.lock.json.
  • Claims trace to the source: tag namespace agent-pkg-<id>-*, main-only publish guard, OIDC tied to the workflow filename, 3-required + best-effort-Intel platform matrix.

Generalizes the email agent's release pipeline (freeze -> Agent Hub Worker
/publish -> npm OIDC) into a reusable, phased checklist for shipping any future
sidecar agent. Documents the per-agent layout, manifest, binaries.lock, the
three version numbers that must align, the one-time agent-publish gate + infra
setup, and the immutability/best-effort-Intel/main-only invariants. The email
agent (hub/agents/{python,npm}/...email + release_agent_email.yml) is the
worked reference throughout.
@github-actions

Copy link
Copy Markdown
Contributor

Summary

Solid, genuinely useful skill — it turns the email-agent release pipeline into a guided checklist, and almost every load-bearing claim traces cleanly to the source. I verified the workflow invariants one by one against release_agent_email.yml and the packaging/Worker code, and they hold: the agent-pkg-email-* tag namespace, the main-ancestry publish guard, the agent-publish gate with GAIA_HUB_TOKEN as an environment secret, the three-version match step, the best-effort-Intel drop, the post-publish fetch-verify gate, and the OIDC-tied-to-filename warning are all accurate.

The one thing to fix before merge: the skill describes the npm client package in a shape that doesn't match the reference package on main in two places. Since this skill's entire value proposition (and its own test plan) is "claims trace to the source," these should be corrected so the next author following it literally doesn't hit a wall.

Issues Found

🟡 Important

CHANGELOG.md is referenced as part of the reference package but doesn't exist there (SKILL.md:62,64,84,97,107,191)

The skill states files includes CHANGELOG.md and tells the author to "confirm CHANGELOG.md/README.md ship" via npm pack --dry-run. But hub/agents/npm/agent-email/ has no CHANGELOG.md, and package.json files is ["dist/", "binaries.lock.json", "README.md", "LICENSE"] — no CHANGELOG. Following this literally, the test-plan dry-run check fails and the "add the matching CHANGELOG entry" step has no file to edit. Either add a CHANGELOG.md to the reference package and to files, or soften the skill to "create CHANGELOG.md and add it to package.json files" so it reads as a setup step, not an existing fact.

The ./client second entry point / client-entry.ts don't exist in the reference (SKILL.md:62,65,77-78)

The skill claims the package exposes "Two entry points: . (Node) and ./client (browser/Electron renderer: EmailClient only, zero Node built-ins)" and lists client-entry.ts (browser) in src/. In the reference, package.json exports has only .; there is no client-entry.ts; EmailClient is exported from the single index.ts entry (src/index.ts:20). A new agent mirroring email per this skill would build a browser entry point that the reference doesn't actually have. Recommend correcting to the real single-entry shape (or explicitly marking the browser-safe export as planned, if that's the intent).

🟢 Minor

The illustrative src/ row also omits files that are present (index.ts, logger.ts, platform.ts, url.ts). Fine to leave as illustrative — but dropping the invented client-entry.ts (above) is the part that matters.

Strengths

  • The hard parts are right. Every irreversible/contract claim I spot-checked against the workflow and Worker is accurate — tag namespace, main-only ancestry guard, env-scoped publish token, three-version gate, best-effort-Intel drop-and-ship-3, fetch-verify as the real integrity gate, immutable-per-filename, and the rclonegaia-hub manual fallback. That's the expensive knowledge to capture, and it's captured correctly.
  • Right format and placement. Single SKILL.md under its own directory with name/description frontmatter matching the sibling gaia-release / gaia-testing skills.
  • Teaches the why, not just steps — the OIDC-tied-to-filename warning and the WAF-blocks-uploads rationale for GAIA_HUB_PUBLISH_URL are exactly the gotchas that bite on a first release.

Verdict

Request changes — doc-only, low-risk, but two repeatedly-referenced npm-package facts don't match the reference on main, and one of them breaks a step the skill's own test plan asserts. Fix the CHANGELOG.md and ./client/client-entry.ts descriptions (align the reference package or soften the wording) and this is a clear merge. No security concerns; no prompt-injection content in the diff.

@kovtcharov kovtcharov added the skill Claude Code skill files (.claude/skills/) label Jun 19, 2026
…est-schema claim

Cross-checked against docs/guides/hub-publishing.mdx (the on-main author guide):
- correct the manifest validation claim — gaia-agent.yaml is linted by
  'gaia agent test --lint'; manifest.schema.json is the server-side AGGREGATE
  schema (requires versions/latest_version/security_tier/permissions you never
  hand-write), not what you validate the source manifest against
- position the skill as the sidecar (frozen-binary + npm) extension on top of the
  guide's wheel/PyPI + PR publish; defer manifest/versioning/immutability to it
- use 'gaia agent version' for the version bump + manual npm package.json sync
- mark ./client + CHANGELOG-in-files as landing with #1773/#1776 (not yet on main)
- add the 'pipeline never cut a real release' (#1648 placeholders) + 'verify infra
  exists' caveats, the win-x64/win32-x64 platform-name skew, and a reusable-
  workflow pointer so per-agent copies don't drift
Three-surface verification (cli_agent.py, release_agent_email.yml + packaging
scripts, npm client + agent-hub Worker) confirmed the author guide and the
release code are correct and mutually consistent; corrected the skill where it
drifted from the code:

- gen_binaries_lock.py is generic — only freeze.py (NAME) and publish_to_r2.py
  (executable + email-agent- prefix) hardcode email; HUB_PREFIX is workflow env
- SHA-256 is hashed locally AND server-side and asserted equal before the lock is
  written (not 'server computes, client trusts')
- the Worker 409s per filename (head(), not byte-compare); the publish script
  verifies the stored hash to distinguish idempotent re-upload from a real conflict
- note the GAIA_HUB_TOKEN -> AGENT_HUB_PUBLISH_TOKEN env mapping
- note the CI smoke test passes on 502/timeout (boots the route; no LLM in CI)
@kovtcharov kovtcharov requested review from itomek and itomek-amd June 19, 2026 21:12
itomek
itomek previously approved these changes Jun 19, 2026
…ing file

The agent-email npm package ships no CHANGELOG.md and doesn't list one in
package.json files, so the skill's CHANGELOG references were asserting a
fact that isn't true. Reword each to instruct the releaser to create the
file and add it to the files array when cutting a release.
The email epic (#1771/#1773/#1776) merged to main: the npm package is 0.2.0 with
the ./client browser entry shipping today. Update the skill's 'once #1773 lands'
framing to 'landed in #1773'.
…icit

gaia agent version bumps from the gaia-agent.yaml base and ignores the npm
package.json value, so when the two are already out of sync (the email agent is
live in exactly this state: package.json 0.2.0, gaia-agent.yaml 0.1.0) a blind
patch bumps the yaml, not npm — the manual npm sync is what reconciles them.
Spell that out so a releaser doesn't assume the bump aligns all three.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skill Claude Code skill files (.claude/skills/)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants