Skip to content
Agentmart
Submit a tool

build-part

Run the next part of a decomposed task file through the builder-critic loop.

Skill by michakraus

IndexedMIT★ 2
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/michakraus-build-part

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Run the next part of a decomposed task file through the builder-critic loop. Triggers on: work on this task file, build the next part, take the next open part, build part D, what is next in this task file, which parts can run now, run the open parts. Dispatches julia-builder to build, and critics beside a full-suite run: in round 1 two critics judge the whole part blind, and in each verify round one critic judges only the fix. After each round a new builder on the same worktree fixes the blocking defects and the defects that the branch causes, and records the rest in KNOWN_ISSUES.md, until a critic passes the part on a green suite; then a builder opens the pull request. A question inside the loop goes to the advisor agent, not to the user. A loop that does not converge goes to the arbitrator agent: the second critic FAIL, a code change after a PASS, or a defect that turns on a rule outside the part. Use the plan-parts skill to write the table, and the julia-pr-shepherd agent to take a pull request to green.

Use cases: backend, writing, productivity, agent-building

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/build-part

What's inside

Skill name
build-part
Description
Run the next part of a decomposed task file through the builder-critic loop. Triggers on: work on this task file, build the next part, take the next open part, build part D, what is next in this task file, which parts can run now, run the open parts. Dispatches julia-builder to build, and critics beside a full-suite run: in round 1 two critics judge the whole part blind, and in each verify round one critic judges only the fix. After each round a new builder on the same worktree fixes the blocking defects and the defects that the branch causes, and records the rest in KNOWN_ISSUES.md, until a critic passes the part on a green suite; then a builder opens the pull request. A question inside the loop goes to the advisor agent, not to the user. A loop that does not converge goes to the arbitrator agent: the second critic FAIL, a code change after a PASS, or a defect that turns on a rule outside the part. Use the plan-parts skill to write the table, and the julia-pr-shepherd agent to take a pull request to green.
License
MIT
Instructions
414 lines in SKILL.md · view on GitHub

Files (3)

  • SKILL.md
  • edges.md
  • evidence.md

SKILL.md (first lines)

# Running a part through the builder-critic loop

A parts table lists the parts of a plan. This skill starts each available part in the
**builder-critic loop**: a specialist builder makes the work, and a separate critic with a fresh
context judges it blind against the part's benchmark. The loop repeats until a critic passes the
work.

**The `model: medium` of this skill does not apply**, typed as `/build-part` or invoked through
the Skill tool: the turn stays on the session's model. Dispatching is table reading, and it is not worth an opus turn: run
the loop in a session on sonnet. **When this session runs on another model, say so to the user in
one line before the first spawn**, and go on.

**Spawn `julia-test-runner` without a `model` parameter.** A `model` passed to the `Agent` tool
replaces the agent's own, so a runner spawned with `model: opus` runs on Opus, not on Haiku.

**Contents**

- [Never read the task file](#never-read-the-task-file)
- [Choose the part](#choose-the-part)
- [The tier cell decides whether the loop starts now](#the-tier-cell-decides-whether-the-loop-starts-now)
- [The spec gate](#the-spec-gate)
- [The loop](#the-loop)
- [A question inside the loop goes to the advisor](#a-question-inside-the-loop-goes-to-the-advisor)
- [Hold the state cell yourself](#hold-the-state-cell-yourself)
- [Several parts at once](#several-parts-at-once)
- [Stop, and say why](#stop-and-say-why)
- [What this skill does not do](#what-this-skill-does-not-do)

## Never read the task file

Run the extractor. The largest task file is about 33 000 tokens; this output is about 200.

```bash
cd ~/Research && awk -f Harness/scripts/parts-table.awk "Tasks/<file>.md"
```

```
PART       part  repository  sections  tier  state
COLLISION  repository  file  parts
```

Empty output means the file carries no parts table. Say so, and offer the `plan-parts`
skill. Do not decompose it here.

**Every builder and critic reads the part's spec bundle, not the task file.** Write it with
`spec-bundle.py`, which copies the part's rows, its sections, §V, §L and every section that §L's
*also reads* lines name into one file:

```bash
cd ~/Research && python3 Harness/scripts/spec-bundle.py "Tasks/<file>.md" <part> --out ~/Research/.scratch/spec-bundles/<file>/<part>.md
```

It prints the path, the line count and the body's hash, and one `unresolved: <name>` line on
stderr for each name of the cell or of §L that matches no heading and no table row; then it exits 1.
**Write the bundle again before every spawn of a builder or a critic**, so that a decision written
into the task file since the last spawn is in it. Pass its path on the spawn.

**A part whose `sections` cell names `spec` has its spec in the spec-delta format**, at
`Tasks/Evidence/<file>/<part>/spec.md`, and the bundle holds it whole. For such a part, *the part's
section* in this skill is that spec's `## Decisions`, below its four sections: write every decision
and the loop's record there, and commit it with the task file. The state cell stays in the task
file. Its gate adds the spec's checks and CI (*The gate of a spec-delta part*, in the loop).

## Choose the part

**Check every cell that names a pull request against GitHub first.** The user merges in silence,
so a `PR #NN in review` cell can be stale for days, and every part `blocked by` it reads as blocked.
For each such cell, run `gh pr view <NN> -R <owner>/<repo> --json state,mergedAt` as a Bash call of
its own, with the repository from the part's `git remote get-url origin`. Write a merged one as
`merged — PR #NN, <date>`, and a closed one as `declined — PR #NN closed`. Then a `blocked by` cell
whose parts have all merged becomes `open — <part> merged`. Commit the task file before you go on.

Where the user names a part, use it. Otherwise take the first part that passes all three:

1. the state is `open`;
2. no `blocked by` part of it is still unmerged;
3. its files collide with no part you are about to start, and with none that is `in progress`.

`state` is one of `open · in progress · waiting for the user · PR #NN in review · merged ·
declined`. Anything else is prose that a person wrote — read it, and treat an unclear state as *not
available*. A part `waiting for the user` is not available until the user writes its decision.

## The tier cell decides whether the loop starts now

| `tier` cell | do |
|:--|:--|
| `build` | start the loop, once the part passes the spec gate below |
| `reviewed` | not this loop: the `build-reviewed` skill builds it, with one builder and one critic |
| `direct` | not a loop: the main session makes the change, or a workflow for a change across many repositories, and checks it with the commands of its *Done when*. Report the part |
| `decision` | **do not start it unprompted.** Report the part: it holds a decision. Start the loop when the user names the part and says its decisions are recorded |
| empty, or anything else | treat as `decision`, and name the cell so the user can fix it |

**The roles have fixed tiers.** The builder is `julia-builder` at `opus-medium`; every critic is
`julia-critic`, at `opus-high` in round 1 and at `opus-medium` in a verify round; the advisor is
`advisor` and the arbitrator is `arbitrator`, both at `opus-high`. Their frontmatter sets the
effort, except for a round-1 critic: its `Agent` call passes `effort: "high"` over the frontmatter's
`medium`. Pass `model: opus` on every spawn of these four, and never spawn one of them on sonnet or
haiku.

**A decision part is the user's.** Name the part, its repository and its `Done when`, and say it
waits for the user's decisions. Where its section holds no recommendation yet, spawn the `advisor`
once with the part's open questions, and write its answer into the section as
`**Recommendation (advisor, <date>):** <decision>` — the user then decides with the work done.

Then carry on to the next available part. Reporting a decision part is not a reason to stop; only
**substituting** one part for another in silence is. Your report names every part you started, and
every part you did not, with the reason.

## The spec gate

A `build` part in `Packages/` or `Experiments/` starts only when its sections hold a
`**Decided at the edges**` and a `**Tests catch**`. Run the check for the part:

```bash
cd ~/Research && python3 Harness/scripts/spec-gate.py "Tasks/<file>.md" <part>
```

It prints `PASS`, `EXEMPT`, `MISSING <labels>`, `INVALID <n> errors`, `UNMEASURED <devices>` or
`SPANS <repositories>`, and exits 0, 0, 1, 1, 2 or 1. **`UNMEASURED` is no pass**: a premise needs a

From michakraus/ResearchHarness, MIT.

More from michakraus/ResearchHarness

Signals

Stars
2
Forks
0
Open issues
0
Last commit (this folder)
Oct 24, 2026 (3 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from michakraus

Cite this page

build-part skill. Agent Mart. https://agentmart.dev/skills/michakraus-build-part (last updated 2026-10-24)