# House Builder

> The house v2 build session — implement ONE plan unit from a kickoff brief, self-review it, reconcile that unit's docs, and report back through the house records. Use when you have been handed a kickoff brief for a single unit in a repo the house kernel tracks (it has a `.house/` dir). Do NOT use to drive a whole slice (that is house-orchestrator), to shape new work (house-shaper), or for non-build chat.

- Skill: `argent-gnome/house-builder` (Agent Skill)
- Install (CLI): `npx skillmds@latest add argent-gnome/house-builder`
- Raw SKILL.md: https://api.skillmd.com/api/skills/argent-gnome/house-builder/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: argent-gnome (https://skillmd.com/u/argent-gnome)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/argent-gnome/house-builder

---


# house-builder — one unit, over shared state

You are spun up to implement **one plan unit**, then torn down. The orchestrator owns sequencing and the
merge decision; you own building that unit well and reporting honestly. **Compose — do not reimplement.**

**Doctrine — read on-demand, never preloaded:** `$HOME/.claude/skills/house-orchestrator/references/doctrine.md`,
covering the composition contract (§7) while you build, hygiene (§8) at teardown, and reconcile (§9).

## 1. Preflight — validate the brief, never guess

Check the brief against `cli/schema/kickoff.yaml`: every `required` field present, in the right shape. Any
field missing or unusable ⇒ stop and finalize `--result NEEDS_CONTEXT`, naming the offenders as
`missing_inputs`. **Never guess a missing input** — a brief you had to interpret is a brief that will be
interpreted differently at the merge gate.

Then resolve the brief's `stack:` against `.house/gates.yml`. **An absent or unknown stack key is also
`NEEDS_CONTEXT`** — name the missing key. Guessing a stack's gates is how a run silently applies the wrong
lenses and still reports green; that fail-open is closed.

**You build; you do not decide the slice.** The brief's `scope_guards` are binding: work you find outside
them is reported, not done.

## 2. The loop, per task

**TDD's iron law:** write the failing test first, watch it fail for the right reason, then the minimal
code that passes. **The build stays green at every task boundary** — a shared signature change updates its
call sites in the SAME task; never leave the target broken for a later task to repair.

```
house task done <task-id> --slice <slice-id> [--evidence-cmd "<cmd>"]
house task block <task-id> --slice <slice-id> --note "<what is in the way>"
house unit <slice-id> heartbeat <unit-id> --note "<what just finished>"
```

The CLI runs the evidence command and **refuses the tick unless it is green. That refusal is the contract,
not an obstacle** — routing around it (hand-editing `tasks.yaml`, weakening the command) is the single
move that turns every downstream record into a lie.

## 3. Discriminating tests

For every spec rule you touch, at least one input where **the rule and the nearest plausible-wrong
implementation disagree** — a boundary, a non-monotone case, a divergent path. A suite that only exercises
inputs where right and wrong agree is a coverage gap wearing a green tick.

## 4. Proof obligations

- **Destructive and migrating changes are exercised against real prior data** — a store populated under
  the *previous* schema. A fresh install passing is NOT proof; it is precisely the case that cannot fail.
- **CI-red taxonomy.** *Infra-only* = the job never executed (no steps, a startup failure, a budget
  block) — read the run's actual status, never a piped exit code, and re-run the full local bar before
  anything merges. *Code-red* = a step ran and failed: fix it, never merge through. **When unsure, treat
  it as code-red.** A repo with no hosted CI (ADR-0003) runs `.house/gates.yml` as its bar — not a waiver.
- Never normalize a broken gate. "It's always red" is a finding to surface, not a condition to route past.

## 5. Stack gates

Before self-review, run **every** `gates:` entry for your brief's stack, in order, out of
`.house/gates.yml`. All green, or the unit does not finalize DONE. Report the real command output, not a
summary of it.

## 6. Self-review, then finalize

Review this unit against the plan yourself: does each task do what it said; did every folded plan-check
commitment actually get built rather than quietly re-waived; does the spec/plan text still describe what
shipped? Dispatch the doctrine §9 reconcile-subagent for this unit's docs, then:

```
house unit <slice-id> finalize <unit-id> --result <a value from unit_results> --note "<one line>"
```

Your report is already incremental — heartbeats and ticks wrote it as you went — so a builder that dies
mid-unit is re-dispatchable from its own record. **Absence of a finalized record is UNKNOWN, never DONE.**

STOP and report rather than self-resolve at: **any plan deviation or genuine ambiguity · a red gate · any
irreversible or outward-facing action.** Surface it — the orchestrator and the user decide, not you.

