Repository navigation
feat!: builder runs on one Go binary that the session installs, and a merge releases it (Go port) - #30
Merged
Conversation
* docs: plan for Go port milestone 2 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(shim): bin/builder runs with a broken PATH Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(mcpmerge): keep a .mcp.json's key order and numbers Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * feat(hook): the session hook and the opencode plugin run bin/builder Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * feat(harness): setup.sh merges .mcp.json with jq or the builder binary Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * feat(skills): budget, reach and security run bin/builder Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * test(templates): the template and report checks in Go Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * feat(evals): the eval runner and parity setup without Python Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * refactor!: builder runs without Python BREAKING CHANGE: the builder binary is required; milestone 3 adds its installer. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(validate): exclude the template test from the old-name guard Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * fix(validate): a failed build is one error, and the budget README pastes Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…nary is off Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…broken PATH Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…y --version Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…it fails the subject check Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…alled or is off reach matchblox-notify exits 3 on its normal no-route path, so the rule now keys on the shim's message too.Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…the release Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…at to do if it stalls Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ar is a symlink Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… says how to stop retrying The shim exits 4, not 3, when it cannot read the plugin version, so the hook shows the soul and the root line without an install block that could never succeed. The yes block names install-answer later for a failed install. The snooze has a named constant. Tests cover a plugin with no version and a binary that prints and fails. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…any other source curl takes https only, also on a redirect, and gives up after a 10 s connect or 300 s in all. A BUILDER_RELEASE_URL may also be file://; the result line names it, and it writes no yes to install.answer. A signed-in gh with no attestation command reports the provenance as not checked, with the reason. A missing manifest and an unwritable install.answer each print only the clean line on stderr. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… the last bump, and fail loudly Publish refuses a tag whose commit is not on main. The release job pushes the tag through push-tag.sh, which refuses a tag that exists on another commit, lightweight or annotated. check-bump-merged.sh stops a release while the previous release's bump pull request is open. The publish wait, a failed auto-merge, a closed pull request and the 40-minute wait now fail the job, and merging=true is set only once auto-merge is on. bump-version.sh takes the same versions as release.yml. RELEASING.md adds the tag ruleset step and a row for each new refusal. Tests cover the new scripts and the negative paths of promote-changelog and check-next-version. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ter 10 minutes actionlint v1.7.12 installs through the Go checksum database, so validate.sh lints the workflows instead of skipping them. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…and a foreign tag stops the job before a draft check-bump-merged.sh compares the plugin with the newest tag whose release is published and verified, and skips a tag whose release is a draft, a pre-release or missing. A broken release no longer blocks the fixed one. push-tag.sh --check runs before gh release create, so a tag on another commit leaves no draft for publish.yml to adopt. The publish main check uses the origin/main of the full checkout. RELEASING.md says how to clear a foreign tag and what to do when no bump pull request exists. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Lutherwaves
force-pushed
the
feat/go-m3
branch
from
October 27, 2026 20:44
d04e515 to
b1fb7f6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Milestone 3 of the Go port, into
feat/go. After this merges,feat/gomerges tomainonce, and that merge is released as builder 3.What a person can now do
scripts/install.shand reports it under ↗ Outside. The hook stays offline.scripts/install.shdownloads the binary of the plugin's version and checks its.sha256. With a signed-ingh, it also checks the build provenance. It then checks thatbuilder versionprints the tag. Only then does it install to~/.config/builder/bin/builder-<v>. A failed check leaves nothing behind. It keeps three versions, so other harnesses keep theirs.release.ymlandpublish.ymlare adapted from matchblox's:Carried from the milestone 2 review
scripts/install.shships at the path that the shim's "not installed" line names, with that text unchanged.README.md:55anddocs/install.md:3no longer say Python 3.bash:3.2container. A newmacosCI job runs them under/bin/bash.Before the
feat/go→mainmerge (owner)RELEASING.md→ "Before the first release":RELEASE_TOKEN.v2.1.0. Without it, go-semantic-release cannot see the oldbuilder-v*tags, andcheck-next-version.shrefuses the release.RELEASE_ENABLED=true.Then squash-merge
feat/gowith afeat!:title, so that the release is 3.0.0.Calls made without the owner
install.answer(<verdict> <epoch>) belongs to the shim and the installer.ledger.jsonis unchanged.install-answertakeslaterandneveronly. Yes is the install itself.hooks/session-start, so one script owns the no-binary text.reach matchblox-notifyexits 3 on its normal no-route path, and the spec keeps that code.BUILDER_RELEASE_URL, for tests and a local release. The checksum and provenance checks still apply.latest, Homebrew, docs and site steps are dropped.Proof
bash scripts/validate.sh: ✓ all checks passed.bash tests/test_validate.sh: rc 0.go test -count=1 ./...: ok.actionlint: clean.test_shim,test_offer,test_install: rc 0 under Bash 3.2.57.-X main.version=v2.1.0and its.sha256installs withghsigned out.ghsigned in, the installer correctly refuses the build, because it has no attestation.install-answer later, it shows no offer.🤖 Generated with Claude Code