Agent skill

Ship Release

by ibuilder in ibuilder/massing

The Massing release discipline — how to ship a verified, CI-green version-numbered release direct to main.

MITAuto-check passedDevelopment

Install Ship Release

skills CLI
$ npx skills add ibuilder/massing --skill ship-release -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ibuilder/massing ship-release --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ibuilder/massing.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/ship-release .claude/skills/ship-release && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
ship-release
GitHub stars
121
Token cost
~2.3k tokens
SKILL.md length
1,162 words
Files
1
Skills in repo
6
Repo updated
First seen
Licence
MIT

At a glance

The Massing release discipline — how to ship a verified, CI-green version-numbered release direct to main.

  • Works in 5 steps: Verify before you ship → Bump the version — THREE files, and the… → CHANGELOG + roadmap → …
  • Tasks that involve Linting and formatting
  • SKILL.md covers 1. Verify before you ship, 2. Bump the version — THREE…, 3. CHANGELOG + roadmap and 4. Commit, push, tag — but…, plus 1 more section
  • Calls git, npm and gh

What it does

Ship Release is an agent skill from ibuilder/massing. The Massing release discipline — how to ship a verified, CI-green version-numbered release direct to main. Invoke whenever finishing a shippable change (feature, fix, doc). Covers version bump (both files), CHANGELOG/roadmap notes, the ruff/lint CI gotchas, tag, push, and CI/CodeQL verification.

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Linting and formatting, Changelog and release notes and Static analysis and SAST. It works with Ruff and npm. The repository describes itself as: Open, self-hosted, IFC-native AEC platform: web BIM viewer + modeling, a ~100-module GC portal (RFIs, pay apps, CPM, construction accounting — double-entry GL/WIP → QuickBooks… The licence is MIT.

When your agent uses it

  • Tasks that involve Linting and formatting
  • Tasks that involve Changelog and release notes
  • Tasks that involve Static analysis and SAST

Example prompts

  • “/ship-release”

Requirements

  • Python 3
  • Node.js

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Verify before you ship
  2. Bump the version — THREE files, and the third is not edited by hand
  3. CHANGELOG + roadmap
  4. Commit, push, tag — but never onto a red main
  5. Verify CI + CodeQL

What it can do on your machine

Read from SKILL.md and the folder at commit 523e5b3. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • npm
    • gh
    • ruff
    • python
    • node
    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, npm, gh and npx, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Ship Release loads about 2.3k tokens when it runs. Until then it costs about 77 tokens; SKILL.md has 1,162 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~77
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from ibuilder/massing at commit 523e5b3, republished under its MIT licence (© ibuilder). 1,162 words, ~2,251 tokens.

Download SKILL.mdSave it as .claude/skills/ship-release/SKILL.md (or your agent's skills folder).
name
ship-release
description
The Massing release discipline — how to ship a verified, CI-green version-numbered release direct to main. Invoke whenever finishing a shippable change (feature, fix, doc). Covers version bump (both files), CHANGELOG/roadmap notes, the ruff/lint CI gotchas, tag, push, and CI/CodeQL verification.

Ship a Massing release

Standing directions for this repo: docs/roadmap-directions.md. Read those first.

main is unprotected and ships version-numbered releases via direct commits (no PR gate). Each shippable change is its own release. Follow this exactly.

1. Verify before you ship

  • Backend (services/api, services/data): run the affected test_*.py (see the backend-tests skill) and ruff exactly as CI does:
    cd services/api && python -m ruff check src/ ../data/src/
    A file-level ruff check <file> from elsewhere does NOT pick up services/api/ruff.toml (isort/I001) and gives false "passed". Prefer ruff check --fix to auto-sort imports; put third-party imports in their own group after stdlib.
  • Web (apps/web): export PATH="/c/Program Files/nodejs:$PATH" then npm run typecheck && npm run lint && npm run build (Node 24; Node 18 breaks the build). Run npx vitest run <path> if unit tests cover the change.
  • Frontend UI: the dev-preview geometry loader stalls at "preparing geometry", so verify rail UI via the verify-frontend skill (force buildToolsPanel by dispatching aec:persona), and flag any flow you couldn't exercise end-to-end.

2. Bump the version — THREE files, and the third is not edited by hand

git fetch origin --quiet          # avoid the version race (a background release may have taken the next number)
sed -i 's/"version": "0.3.X"/"version": "0.3.Y"/' apps/web/package.json apps/web/src-tauri/tauri.conf.json
cd apps/web && npm install --package-lock-only --ignore-scripts && cd -   # re-syncs package-lock.json

package-lock.json carries the version too — twice, at the root and under packages["apps/web"] — and versionConsistency.test.ts asserts all of them agree. This step said "BOTH files" until 2026-07-29, when a release ran the two seds and went red on a lock nobody had mentioned. Regenerating the lock is the fix rather than a third sed: hand-editing it would sync the number while leaving whatever else the bump touched stale.

Nothing else notices this drift, which is why it needs a gate rather than care — npm ci compares dependency edges, not version fields; the build never reads the lock's version; and a regenerated lock silently re-syncs, so the mismatch exists only in the window where it can ship.

Confirm origin/main is where you branched (git log origin/main --oneline -1). If it advanced, rebase and bump to the next free number.

3. CHANGELOG + roadmap

  • Prepend a ## vX.Y.Z — <title> entry to CHANGELOG.md (newest at top).
  • Add a ✅ … SHIPPED vX.Y.Z note to the relevant docs/roadmap.md item.
  • Keep competitor names OUT of shipped docs; interop names (Revit, Bonsai, Procore) are fine.

4. Commit, push, tag — but never onto a red main

Commit with the trailer Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>.

First check that main is green. Step 1 verifies your commit; it says nothing about the state of main you are appending to. On 2026-07-31 main went red at 06:12 from an unindexed docs/internal/ file, and over the next hour three further commits landed on top — including a cut and tagged release — because each session had verified its own work and none asked about the build. The gate fired correctly within three minutes. Nobody looked. There is a standing directive to query the CodeQL alerts API after every push and it was followed every time; there was no equivalent for CI, so the security scan got checked and the build did not.

gh run list --branch main --limit 3 --json headSha,status,conclusion   --jq '.[]|"[\(if .status != "completed" then "RUNNING" else .conclusion end)]  \(.headSha[0:8])"'

Branch on status, never on whether conclusion looks empty. A running job has conclusion as the empty string — truthy in jq — so the obvious .conclusion // "pending" never fires and the field prints blank. A blank reads as "nothing to worry about", so a pending gate becomes an invisible one. status is the field that actually states whether the run finished; read that.

Two sessions wrote the // form independently the day this section was added, one of them into memory as the fix, and it had already printed blank rows that were read as "still running" from context rather than noticed as a filter failure.

Related trap, same shape: gh --jq does not accept --arg — it exits with unknown flag: --arg on stderr and prints nothing on stdout. Under a habit of skimming stdout that reads as a clean result. Probe any filter before you loop on it, and prefer piping the JSON to a real interpreter that can be made to print "not a verdict" rather than falling through to a reassuring default.

A red or pending main is not automatically a blocker — read it and decide. But do not tag onto one: a tag is the thing that gets published, downloaded and rolled back, and it is the one step here that is awkward to undo. If main is red, fix or wait; if it is pending, either wait for it or push without tagging and tag once it lands.

Show full SKILL.md (447 more words)Show less

And tag the commit you actually verified. The green-main check above answers "is the trunk healthy"; this one answers "is the thing I am about to publish the thing I tested". They are different questions and a release can fail the second while passing the first.

Concretely, v0.3.813: the release commit was prepared at 06:55 and three commits landed behind it over the next four minutes — two of them money fixes (a fractional renovation pace that renovated nothing; a half-month downtime rounded to zero). Tagging the release commit would have shipped a version missing them. Tagging main would have shipped a CHANGELOG that did not mention them; the entry was grepped for "fractional", "rounding" and "0.5" and returned zero hits. Neither option was correct without editing first — the entry was amended, then main was tagged.

So immediately before git tag:

git fetch origin --quiet
git rev-parse HEAD origin/main            # must match — if not, you are tagging a stale commit
git log --oneline <release-commit>..origin/main   # must be EMPTY, or the CHANGELOG is already wrong

If commits have landed, do not tag either end. Amend the entry to cover them, commit that, and tag the result. A tag is the one artefact here that gets published and downloaded, so it is the one place where "close enough to what I verified" is not close enough.

Then, guarding against a race:

if [ "$(git rev-parse origin/main)" = "$(git rev-parse HEAD~1)" ]; then
  git push origin HEAD:main && git tag vX.Y.Z && git push origin vX.Y.Z
else echo "RACE — rebase + rebump"; fi

Never merge or rebase inside the commit command, and re-check the triple after any that you do. The RACE branch above rebases onto whatever landed first — which is how v0.3.791 shipped red. Two sessions released concurrently; the merge took the manifest from one and the lock from the other, and git merged it cleanly because they are different files. No single edit was wrong, and the session had run a green suite — on the tree before the merge. versionConsistency.test.ts caught it in CI, one release later.

So after any rebase/merge, and always immediately before pushing:

node -e 'const a=require("./apps/web/package.json").version,
 b=require("./package-lock.json").packages["apps/web"].version,
 c=require("./apps/web/src-tauri/tauri.conf.json").version;
 console.log(a,b,c); if(new Set([a,b,c]).size>1){console.error("VERSION TRIPLE DISAGREES");process.exit(1)}'

The lock is the root workspace lock (./package-lock.json, keyed packages["apps/web"]) — there is no apps/web/package-lock.json, and a check that reads that path returns empty and "passes".

The general rule this is one instance of: verify what you are shipping, not what you happen to have. A suite run before a merge, or a typecheck against a working tree that still holds unstaged fixes, measures a tree that is not the commit. To verify a commit, verify the commit.

5. Verify CI + CodeQL

  • A "CI" workflow run showing success does NOT mean the API test gate ruff step passed, or that CodeQL is clean. Check both.
  • After each push run the security-monitoring skill's CodeQL check (open alerts, not run status).
  • The API test gate is slow (~15–20 min); each commit is independently verified locally, so keep shipping. Watch the first release carrying a new test file to confirm it's green in CI.

See memory: main-fast-release-cadence, ruff-ci-config-gotcha, backend-test-runner, codeql-monitoring, web-build-needs-node-20.

© ibuilder, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/ship-release of ibuilder/massing.

Open the folder on GitHubat commit 523e5b3

Compare with similar skills

Ship Release next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Ship Release compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Ship Release this skillibuilder/massing121—~2.3kAutomated safety check: PassMIT
Lintethereum/execution-specs1.2k—~286Automated safety check: PassCC0-1.0
Releasehyhmrright/brooks-lint1.5k—~1.2kAutomated safety check: PassMIT
Leanspec Developmentcodervisor/leanspec296—~2.5kAutomated safety check: PassMIT
Django Verification Loopaffaan-m/ECC274k7 repos~2.9kAutomated safety check: PassMIT
Plankton Code Qualityaffaan-m/ECC274k2 repos~1.3kAutomated safety check: PassMIT

Similar skills

  • Lint

    ethereum/execution-specs

    Run and fix the repository static analysis suite. An agent skill from ethereum/execution-specs.

    1.2k GitHub stars~286 tokensUpdated today
    DevelopmentAuto-check passed
  • Release

    hyhmrright/brooks-lint

    Cut a brooks-lint release: set the version in package.json, propagate it across all four plugin manifests and every version-bearing text file (README badges, docs site metadata), write the CHANGELOG…

    1.5k GitHub stars~1.2k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Leanspec Development

    codervisor/leanspec

    Development workflows, commands, publishing, CI/CD, changelog management, and contribution guidelines for LeanSpec.

    296 GitHub stars~2.5k tokensUpdated 4 mo ago
    DevelopmentAuto-check passed
  • Runs a phased pre-PR and pre-deploy check on a Django project: environment, linting, migrations, tests with coverage, security scans and settings review.

    274k GitHub starsUsed in 7 repos~2.9k tokens
    DevelopmentAuto-check passed
  • 使用Plankton进行编写时代码质量强制执行——通过钩子在每次文件编辑时自动格式化、代码检查和Claude驱动的修复。

    274k GitHub starsUsed in 2 repos~1.3k tokens
    DevelopmentAuto-check passed
  • Plankton Code Quality

    xu-xiang/everything-claude-code-zh

    使用 Plankton 实现编写时代码质量强制执行 —— 通过钩子在每次文件编辑时进行自动格式化、代码检查,并由 Claude 驱动自动修复。

    2k GitHub stars~1.2k tokensUpdated 7 mo ago
    DevelopmentAuto-check passed

More from ibuilder/massing

  • Backend Tests

    ibuilder/massing

    How to run and add Python tests in the Massing API/data services.

    121 GitHub stars~836 tokensUpdated 5 days ago
    Auto-check passed
  • Massing Bim

    ibuilder/massing

    Drive a Massing BIM/AEC project from an AI agent over MCP — read a project's status, records, CDE, KPI and model-quality checks; run standards-compliance, schedule-risk, embodied-carbon, permit-…

    121 GitHub stars~1.1k tokensUpdated 5 days ago
    Auto-check passed
  • Verify Frontend

    ibuilder/massing

    How to verify Massing web/viewer UI changes LIVE — full verification works; two historic "stalls" are fixed and neither was the geometry loader.

    121 GitHub stars~1k tokensUpdated 5 days ago
    Auto-check passed
  • Master Builder

    ibuilder/massing

    Reason like a master builder — one mind holding an entire built-asset project from raw land through design, construction, handover, operations, and disposition, anywhere in the world.

    121 GitHub stars~2.6k tokensUpdated 5 days ago
    Auto-check passed
  • Security Monitoring

    ibuilder/massing

    How to monitor and fix security issues in Massing — CodeQL alerts, dependency audits, secret scanning, and ReDoS/XXE fixes.

    121 GitHub stars~1.7k tokensUpdated 5 days ago
    Auto-check passed

Works with

Questions about Ship Release

What does Ship Release do?

The Massing release discipline — how to ship a verified, CI-green version-numbered release direct to main. Ship Release is an agent skill from ibuilder/massing. The Massing release discipline — how to ship a verified, CI-green version-numbered release direct to main.

When should I use Ship Release?

Ship Release fits situations like: tasks that involve Linting and formatting; tasks that involve Changelog and release notes; tasks that involve Static analysis and SAST.

How do I install Ship Release in Claude Code?

Run `npx skills add ibuilder/massing --skill ship-release -a claude-code`. Or copy the skill folder (.claude/skills/ship-release in ibuilder/massing) into .claude/skills/ship-release in your project. Claude Code loads it when a task matches its description.

How do I install Ship Release in Codex?

Run `npx skills add ibuilder/massing --skill ship-release -a codex`. Or copy the skill folder (.claude/skills/ship-release in ibuilder/massing) into .agents/skills/ship-release in your project. Codex loads it when a task matches its description.

Can I use Ship Release in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ibuilder/massing --skill ship-release -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ship-release, .gemini/skills/ship-release, .github/skills/ship-release and .opencode/skills/ship-release in your project.

What does Ship Release need to run?

Going by SKILL.md and its folder, Ship Release needs the command-line tools its instructions call (git, npm, gh, ruff, python and node). Our summary lists: Python 3; Node.js.

Does Ship Release access the network?

SKILL.md contains no URLs. Its commands use git, npm, gh and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Ship Release safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Ship Release use?

Ship Release is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Ship Release use?

About 2.3k tokens (SKILL.md is roughly 9k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Ship Release?

Skills that share tags, products or a category with Ship Release: Lint (ethereum/execution-specs, 1.2k stars), Release (hyhmrright/brooks-lint, 1.5k stars), Leanspec Development (codervisor/leanspec, 296 stars) and Django Verification Loop (affaan-m/ECC, 274k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Ship Release?

ibuilder (a GitHub user) maintains it in ibuilder/massing, which has 121 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 2, 2026.

Source: ibuilder/massing on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.