Skip to content

v0.8.0

Choose a tag to compare

@JakeSelby JakeSelby released this 18 Sep 02:27
· 490 commits to main since this release
f9591ba

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.md now 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 after install has already run — the
    supported platforms, git and 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 the cost stance as the dial. Nothing previously said that a
    /research run costs several times a plain turn. (#82)

  • identity.expertise, expert or beginner, 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.md and reached every user, including one who had never written code —
    instructing the agent to withhold exactly the explanation they needed. expert is the default,
    so a config predating the field resolves to the behaviour it had. (#83)

  • Stance presets, asked by init: software is the shipped defaults, general turns 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, autonomy and cost are 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 voice stance dimension, closing the last always-loaded rule that was a pure preference (#68).
    scannable defers to the output style as before and is the default, so nothing changes for an
    existing install. answer-card is 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. off imposes no shape at all. The two voice/
    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,
    secrets and conciseness — 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.md drops 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-alternatives detector, and decisions-and-plans leaves OPT_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
    Decisions block 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 writes config.json by 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/localtime and the
    GitHub handle from gh when it is logged in, refuses to clobber an existing config without
    --force, and names config set when 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)

  • sync and doctor report identity fields still carrying the example file's value. load_config
    backfills from config.example.json and render_personal writes 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

  • install and sync refuse to run on Windows and name WSL2, rather than half-working: the
    harness links into ~/.claude with symlinks and every hook is a POSIX command. Nothing in the
    README or the docs had ever said which platforms are supported. _run also treats an absolute
    path that does not exist as a missing tool, so /bin/bash being absent reports rather than
    raises. (#82)

  • doctor now 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 without python3 on 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. /build says up front that it needs a repository, a remote
    and gh, 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 at gh pr create with the work already
    done. /review says there is no diff to review outside a repository, before it spawns either
    pass, and offers named files or a pasted patch. /plan and /handoff write beside the work in
    the current directory when there is no repository root, and /plan now says outright that it
    needs neither a repository nor code. (#84)

  • bin/harness install no longer ends in a traceback on a machine that lacks gh or npm.
    subprocess.run raises FileNotFoundError when argv[0] does not exist and check=False
    suppresses only a non-zero exit, so the unguarded gh auth status at the end of every install
    and the npm install -g @openai/codex step both crashed rather than reported — reachable with
    --no-brew on 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-only node@22 bin directory, which Homebrew does not link into its prefix, so
    npm is found after a plain brew install on a machine with no other node. (#80)