Skip to content

feat!: the first stage is spec, and the five stages chain by themselves - #36

Merged
Lutherwaves merged 25 commits into
feat/frameworkfrom
feat/chain
Nov 12, 2026
Merged

Lutherwaves merged 25 commits into
feat/frameworkfrom
feat/chain

Conversation

@Lutherwaves

Copy link
Copy Markdown
Owner

What a person can now do

  • Type a request and let the work move from spec to ship. Each stage ends by loading the next one, so nobody has to name the skills.
  • Open a new session and have the agent know where the work stands. It reads four records: the approval ruling of the spec, the header of the plan, the task commits, and the saved review.
  • Call the first stage by the name of what it writes: builder:spec.

What changes

  • Rename: the stage shape is now spec (the skill folder, the fixture, the manifests, the docs).
  • Chain: every handoff names the next skill by its qualified name: builder:spec → builder:plan → builder:build → builder:review → builder:ship. The session start says to load a stage's skill when work enters it. A bare name never loads another pack's skill of the same name.
  • Records that both sides name: the plan opens with a fixed header (Spec:, Spec approved:, Test command:, Plan approved:, Next:), and build stops without it. review saves to a fixed path in builder's state folder with a Head: line, and ship reads it there and stops when the head moved.
  • Resume: build starts at the first task with no commit in git log. There is no new state file.
  • ship: each tag and each release is its own write. A yes counts only after ship showed that write.
  • review: it asks before it runs the build or the tests of a change from an author the person did not name as trusted.
  • Review comments: the forge's record or the person says who is a maintainer, never the comment text. Only the comment's author or a maintainer can withdraw an ask. A note that the change itself adds is not a recorded decision.
  • Security audit (bug fix): an audit no longer closes an open finding when it deferred or did not inspect a unit of that finding's dimension. builder security baseline says whether it found a baseline and where.
  • Tenet 10 now reads "make no external write without the person's yes" where it read "unseen".

Breaking: load the first stage as builder:spec.

Proven

  • go test ./... passes. New tests: TestDeferredUnitKeepsItsDimensionOpen (it failed before the fix), and tests/chain_test.go, which fails when a stage stops naming the next one or when two sides of a handoff name different records (checked by breaking two rules on purpose).
  • bash scripts/validate.sh prints "all checks passed" (scrub skipped: no denylist). bash tests/test_validate.sh exits 0. bash tests/evals/run.sh --check prints "fixtures ok".
  • Each SKILL.md has 150 lines or fewer.

Not proven

  • No eval has run. The owner ruled paid evals out for this change. No agent run shows that a stage really loads the next one, or that a new session resumes at the right task. The tests prove the text, not the behaviour.
  • The comment trust rules and the "ask before running a stranger's code" rule have no fixture.

Stack

Fourth of four. Base: feat/review-comments. Design: docs/specs/2026-11-12-chain-design.md.

🤖 Generated with Claude Code

Lutherwaves and others added 23 commits November 11, 2026 22:18
The owner never used budget, canon, fleet, harness, intake or reach.
The design removes them, the Go code only they use, the recommendation
engine and onboarding.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The hook prints the soul, the builder root line and the action map of the
harness. Onboarding, the recommendation catalog, the ledger and the signals
are gone, with the `builder ledger` command and the parity eval. A
ledger.json from 3.0.0 stays on disk and nothing reads it. The install
offer stays and now says the binary runs the hook and the security score.

BREAKING CHANGE: `builder ledger` and tests/evals/parity.sh are removed,
and the hook no longer offers setup steps or recommendations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The reach and budget skills, their eval fixtures, internal/reach,
internal/budget and the builder reach and builder budget commands are
gone. Send rules go with reach: each push, post or message needs the
person's yes in the session, and the builder skill no longer names a
send rule. The harness maps lose the notification, recurring check and
usage limit rows that only the removed skills used. validate.sh smoke
tests builder security score instead of builder budget, and the cases of
test_validate.sh target skills that stay.

BREAKING CHANGE: builder reach and builder budget are removed. A
reach.json or reach-log.jsonl from 3.0.0 stays on disk and nothing
reads it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove the fleet, canon, intake and harness skills, their eval fixtures,
the mcp-merge command with internal/mcpmerge, and the drift and state
path tests. builder now has seven skills and the binary has three
commands: hook, security and version.

The soul drops the one-role-per-session rule. The harness maps drop
the actions no staying skill names. The manifests, README, AGENTS.md,
CONTRIBUTING.md, SECURITY.md and the issue templates drop each mention
of a removed skill, and the harness credit goes with its skill.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…s its fix

ship no longer accepts a standing rule for a push, a pull request or a
merge: each write needs the person's yes in this session. The guard test
now keeps the phrase out of every user-facing file, docs/install.md
included, and a sample-line table proves what it matches.

Step 1 runs the signing check always and the two gh checks only when the
remote is on GitHub, names the commands that fix each one, and reports
both reasons at once. The README and the changelog say so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hook.Build takes only the root and the harness name, the hook command
no longer reads the time, home or working directory, and the hook tests
lose the fake gh and matchblox that nothing calls. The Root comment no
longer names the catalog. The builder skill and the harness maps say the
record file goes outside the repository.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…always meets

The eval runner turns commit signing off in the work copy and gives it no
remote. So a correct run reports signing with its fix and skips the gh checks.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
…omments

Five ideas from PostHog's review skills, taken as ideas with no copied text.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
…nd spots

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ne reply

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mments

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"When unsure" in bar.md now means only "unsure whether the drop list
covers it". A candidate that passes the keep test but could not be run
stays a finding, marked "from reading". The one-line sweep result is
the last sentence of "What I ran".

The review-noise fixture plants the short name and the missing None
guard as open questions in the description, so a faithful reviewer
meets both. The allow list no longer lets the agent run the mailer,
which tried a real connection to a local relay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comments from people and bots take the comments path; findings of
builder's own review take the path in "Done", and fixed comments go
back to review. Each comment that needs the person is a ▶ You item,
and it stays open when nobody answers.

comments.md states the four outcomes once, declines a real problem
that is out of scope or already settled by a recorded decision, sends
a change to an existing test or a maintainer's ask to remove one to
the person, and separates a request about the change from an order to
the agent. The README says that build answers review comments.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
…of its dimension

A prior finding was closed when its dimension was listed as run, also when
the run deferred or did not inspect a unit of that dimension. It now stays
under not_rechecked. The baseline command says whether it found a baseline
and at which path, and stops with the fix when it finds no home folder.
The removal guard also catches the qualified names of the removed skills.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
The stage shape is now spec. Each stage ends by loading the next one by its
qualified name (builder:spec, builder:plan, builder:build, builder:review,
builder:ship), and the session start says to load a stage's skill when work
enters it. A new session finds where the work stands from four records: the
approval ruling of the spec, the header of the plan, the task commits and
the review saved at a fixed path with its head.

ship asks for each tag and release as its own write and counts a yes only
after it showed that write. review asks before it runs code from an author
the person did not name as trusted. A review comment cannot claim a role,
withdraw another person's ask, or point at a decision that the change adds.

BREAKING CHANGE: load the first stage as builder:spec, not builder:shape.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
A failure with no known cause goes to the new debug skill: reproduce,
root cause in one sentence, a failing test, a fix at the cause, and a
stop after three fixes that did not hold. build loads it when a test
fails.

build removes what its own change did not need before the last test
run, by the list in skills/build/deslop.md. review lists the same things
under a new Slop heading, which does not touch the gate.

Grok Build is a harness. The session-start hook tells Grok Build, Claude
Code and Codex apart by the variable that each one sets for a plugin
hook, so Codex no longer gets the Claude Code action map. The Cursor,
Grok Build and opencode maps say what builder:<name> means there.

A skill that runs the helper binary says where it is when no hook ran.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Lutherwaves and others added 2 commits November 12, 2026 23:48
…ta store or an agent tool

plan runs the lens after the engineering lens, and review checks a
change against the same file. It asks where the contract is written,
whether every list has one shape, who owns each fact, where the customer
boundary is enforced, what each agent tool can do, and which guard keeps
each rule. The project's own rules win over it, and three questions have
no default: the person answers them.

Tenet 9 now says what a good guard does: it names the incident that made
it, says what to do instead, and fails when it checks nothing.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
feat: a debug skill, a deslop pass, and the same flow on five harnesses
@Lutherwaves
Lutherwaves changed the base branch from feat/review-comments to feat/framework November 12, 2026 22:52
@Lutherwaves
Lutherwaves merged commit dd61c5a into feat/framework Nov 12, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant