Repository navigation
v0.8.0
Added
-
docs/getting-started.md: zero to a first useful session for someone who has not used a coding
agent before. What the harness is and is not, the prerequisites as a table with a way to check
each, install,init, a first session with three things to actually type, what changed about the
answers, the five commands with which of them need a code project, what a session costs, and the
three commands that diagnose a broken install. The README links it above the install block and
from the docs list;SUPPORT.mdnow opens with it and says plainly that everything else there
needs a GitHub account and is public. (#82) -
A Before you start block on the README's first screen: a Claude account on a plan that
includes Claude Code — stated, rather than discovered afterinstallhas already run — the
supported platforms,gitand Python 3.9, and which of the rest are optional. (#82) -
A What a session costs section in
docs/preferences.md, naming the rate-limit window, the
commands that fan out, and thecoststance as the dial. Nothing previously said that a
/researchrun costs several times a plain turn. (#82) -
identity.expertise,expertorbeginner, selecting one paragraph of the personal file. The
line telling the agent to communicate at expert level and skip fundamentals was hardcoded in
CLAUDE.personal.template.mdand reached every user, including one who had never written code —
instructing the agent to withhold exactly the explanation they needed.expertis the default,
so a config predating the field resolves to the behaviour it had. (#83) -
Stance presets, asked by
init:softwareis the shipped defaults,generalturns off the
commit, test, licensing and build-vs-buy ceremony and lightens plans, for work that is not
shipping software. Escaping the professional-SDLC defaults previously meant discovering five
separate opt-outs. A preset only supplies the defaults for the questions that follow, so every
stance is still asked.delegation,autonomyandcostare untouched by either: how work is
spread, how far it runs unattended and what it costs are the same questions whatever the work
is. (#83) -
A
voicestance dimension, closing the last always-loaded rule that was a pure preference (#68).
scannabledefers to the output style as before and is the default, so nothing changes for an
existing install.answer-cardis for reading on a phone: the answer in the first line, then why,
the catch, and the alternatives, about 150 words, no tables, with the reasoning left in the file
it links rather than re-argued in the message.offimposes no shape at all. The twovoice/
detectors are gated on the dimension, so a voice nobody selected is not measured as a violation.
Changed
-
The three rules written entirely about code work say so in their headings —
verification,
secretsandconciseness— and one line of the always-loaded preamble states that a rule
about repositories, tests or pull requests does not apply elsewhere. Rules link as a directory
rather than per file, so they cannot be deselected; the fix is for them to read as inapplicable
instead of as instructions about work the reader is not doing. Length-neutral apart from that
one line. (#83) -
voice-and-format.mddrops from thirteen lines to six, keeping only what no variant changes:
a subagent inherits no voice, so its brief has to carry the output shape itself. Always-loaded
context moves 193 to 195 of the 196-line budget. -
A
decisions/no-alternativesdetector, anddecisions-and-plansleavesOPT_OUT. The rule
asks for "the alternatives with their honest case", and nothing measured whether a decision
block carried one: the opt-out reasoned from the Review Card and the chooser, and left the
clause that does the work unobserved. The detector fires on a final message whose batched
Decisionsblock or recommendation line names no other course, reading the markers out of the
raw text so an alternative named inside a quote still counts. A recommendation in running prose is not a
decision block and does not fire. (#78) -
harness init: a first-run wizard that writesconfig.jsonby asking for identity one field
at a time and offering each stance's variants with the default in brackets, so configuring the
harness no longer means hand-editing JSON. It detects the timezone from/etc/localtimeand the
GitHub handle fromghwhen it is logged in, refuses to clobber an existing config without
--force, and namesconfig setwhen there is no terminal to ask in. (#81) -
harness config set KEY VALUE, which validates before it writes: an unknown stance variant,
stance, identity field, permission posture or top-level key is refused with the options named,
rather than being written and failing at the next sync. (#81) -
syncanddoctorreport identity fields still carrying the example file's value.load_config
backfills fromconfig.example.jsonandrender_personalwrites the result into always-loaded
context, so an unedited config had the agent address you as the placeholder name with nothing on
screen to say so. Reported, never fatal: a dry-run sync against the example config still
succeeds. (#81)
Fixed
-
installandsyncrefuse to run on Windows and name WSL2, rather than half-working: the
harness links into~/.claudewith symlinks and every hook is a POSIX command. Nothing in the
README or the docs had ever said which platforms are supported._runalso treats an absolute
path that does not exist as a missing tool, so/bin/bashbeing absent reports rather than
raises. (#82) -
doctornow reports whether each registered hook can actually run, instead of printing an
executable bit that never mattered. It resolves the interpreter and the script path of every
hook command in the live settings and names what is missing. Claude Code treats a hook that
fails to start as non-blocking, so a machine withoutpython3on PATH, or an install that was
never synced, turned all eleven hooks into silent no-ops — the command grader that asks before
something irreversible and the stop gate that runs the repository's checks among them. Both
guards disappeared with nothing on screen to say so. (#85) -
The two hook messages a user actually sees are written for a reader now. The grade-bash denial
said "No prompt exists in this mode" and told them to re-run with a marker; it now says the
command was refused because nothing can prompt, and what to say before running it again. Every
grade carries its meaning in words — "this cannot be undone" — alongside the label. The stop
gate says where the failing command came from, and the untrusted-folder notice names the command
that fixes it. (#85) -
The four commands that assume a git repository now check for one before they start, and name a
fallback instead of stopping dead./buildsays up front that it needs a repository, a remote
andgh, offers to make the change in place when there is no repository, and stops at the local
commit when there is no remote — rather than failing atgh pr createwith the work already
done./reviewsays there is no diff to review outside a repository, before it spawns either
pass, and offers named files or a pasted patch./planand/handoffwrite beside the work in
the current directory when there is no repository root, and/plannow says outright that it
needs neither a repository nor code. (#84) -
bin/harness installno longer ends in a traceback on a machine that lacksghornpm.
subprocess.runraisesFileNotFoundErrorwhen argv[0] does not exist andcheck=False
suppresses only a non-zero exit, so the unguardedgh auth statusat the end of every install
and thenpm install -g @openai/codexstep both crashed rather than reported — reachable with
--no-brewon macOS and on every Linux run. Every external call now goes through one helper
that resolves the executable first, names it when it is missing, and carries on. The lookup also
searches the keg-onlynode@22bin directory, which Homebrew does not link into its prefix, so
npmis found after a plainbrew installon a machine with no other node. (#80)