Repository navigation
Releases: devarispbrown/idea-harness
Release list
v0.7.2
See CHANGELOG.md
for what changed.
checksums.txt is signed with keyless cosign (checksums.txt.sigstore.json), each
archive carries an SPDX SBOM (*.sbom.json), and each archive has a GitHub build-provenance
attestation. RELEASING.md
has the verification commands.
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.7.1
See CHANGELOG.md
for what changed.
checksums.txt is signed with keyless cosign (checksums.txt.sigstore.json), each
archive carries an SPDX SBOM (*.sbom.json), and each archive has a GitHub build-provenance
attestation. RELEASING.md
has the verification commands.
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.7.0
See CHANGELOG.md
for what changed.
checksums.txt is signed with keyless cosign (checksums.txt.sigstore.json), each
archive carries an SPDX SBOM (*.sbom.json), and each archive has a GitHub build-provenance
attestation. RELEASING.md
has the verification commands.
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.6.0
The ICP round: the secret sweep stops blocking ordinary code, the plan becomes an editable graph, runs can commit and open PRs, and every phase shows what it cost and what changed. Five founder-journey evaluations and three adversarial reviews drove this release; the verdict moved from "trial" to "adopt".
Breaking
- Adding or editing a task now requires naming at least one requirement (
requirement_ids; a task may implement several). A task with no requirement used to be accepted silently. - A vocabulary marker (
password,token,secret,auth) in a patch no longer blocks a change set. It raises a non-blockingsensitive_areafinding; only a real credential value blocks. - Approving a change set whose adversarial review never completed is refused. Run
idea review <id> rerun(a fresh, paid review). A change set created before this release predates review tracking and says so. idea verify --jsonexits non-zero on an unmet gate, like the human-readable form. It always exited 0.- Deleting a task with dependents names them in the error.
- Near-duplicate judgment items merge on a stricter measure, so some items that used to merge now stay distinct.
What's new
- The secret sweep tells you what it found and lets you overrule it. A finding names the file, the line and the kind, with a masked preview. Placeholders and test fixtures no longer block; real provider keys still do. "Not a secret" records a per-project exemption scoped to that value in that file, revocable in Settings. Configured secrets can never be exempted.
- The plan is an editable graph. Merge, split, reorder, set dependencies (cycles refused), and see each task's requirements. Requirements keep their codes across revisions.
- Git-native. Opt-in commits, a branch per idea, and
idea prwith CI status. Guards refuse to commit on your default branch or over uncommitted work, and never commit files the change set didn't produce. - Review rigor scales to the work (
review.rigor: auto), so a small change gets one pass, not five. - Verification from your tests. Passing tests map to requirements, with one action to confirm them. Evidence only counts from an applied, non-reverted change set whose check run exited cleanly.
- You can see where the money and time went: cost and duration per phase, the current step while a run is in progress, and a timeline of what changed per idea.
- A cross-idea "Needs you" queue, triage, "accept all recommendations", and a stale banner when a decision you reopened invalidates work.
- The CLI judgment loop:
idea questions,answer,resolve,reopen-decision,accept-recommendations,triage. - Runs are resumable and legible: live agent output, an optional note when you re-run, "Stopped by you" instead of a raw cancellation, and detected build/test commands for Go, Node, Python and Rust projects.
Notable fixes
- A change set could delete tracked files that matched a
.gitignorepattern, and commit those deletions. - Credential redaction was gated by the detection rules, so some real secrets were persisted unmasked.
- An empty change set could mark its task done and strand every dependent task.
- A revised requirement could stay "verified" for a statement it no longer had.
- Approving used to re-run the paid adversarial review every time and reword findings you had rejected.
- A truncated review could wedge an idea with no way forward that didn't involve editing config.
Known limitations
- Coding-agent spend is not measured;
idea statussays so rather than showing a misleading total. - Plan editing (merge, split, dependencies) has no CLI verb yet — web UI or API only.
- Exemptions granted before this release must be re-granted: fingerprints are now per-project HMACs.
Installing
Download the archive for your platform and put idea on your PATH. The web UI is embedded — no Go or Node toolchain needed.
shasum -a 256 -c checksums.txt
linux/arm64 is built and shipped, but its SQLite driver is compiled per-architecture and is not exercised in CI; see the install section of the README.
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.5.1
Watching, testing and resuming coding-agent runs from the web UI. No breaking changes.
What's new
- Run the smoke test from Settings. Settings → Executor → Run smoke test runs a trivial task through the coding agent with the daemon's own configuration and keys, so it tests what a real run will use (
idea executors setup --smokeruns it in your terminal's environment, which is not always the daemon's). It makes one small real model call. The last result stays on the page for as long as the setup it tested is unchanged. - Live agent output. While the agent runs, the Build page's running card shows its latest output — the last 100 lines, refreshed every couple of seconds, with known secrets redacted. When the run finishes, those lines stay on the change set it produced, under Agent output.
- Stop no longer throws the agent's work away. When a run stops without a change set — Stop, a failure, a timeout, the daemon stopping — the files the agent had written are kept, and the Run button reads Continue TASK-n (N files from the stopped run). Carried files are applied only where your workspace hasn't changed since, and the change set lists what was carried and what was skipped. Start over discards them. Kept files that look like they hold a secret are never kept.
Behaviour change
Running a task again after Stop now continues from the files the agent had written, instead of starting from nothing. Choose Start over (or send {"fresh": true} to POST …/execute) for the old behaviour.
Also fixed
- An auto-started daemon wrote every line of
daemon.logtwice. - The missing-key message now says to restart the daemon, and appears once.
API additions
POST …/executors/smoke, GET …/initiatives/{id}/agent-output, DELETE …/initiatives/{id}/partial-work; status.last_smoke on GET …/executors; partial_work on GET …/guidance; agent_output on change sets; an optional {"fresh": true} body on POST …/execute; the carried_over finding category. See docs/openapi.yaml.
Installing
Download the archive for your platform and put idea on your PATH. The web UI is embedded — no Go or Node toolchain needed.
shasum -a 256 -c checksums.txt
linux/arm64 is built and shipped, but its SQLite driver is compiled per-architecture and is not exercised in CI; see the install section of the README.
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.5.0
The coding agent now writes real code, and the web UI can run the whole loop — from a new idea to an applied change — without the CLI. 7 breaking changes, with Was/Now rows in CHANGELOG.md.
The coding agent works
v0.4.0 shipped a Hermes executor that could not produce a file: its command line was rejected by the pinned image, the hardened container could not create the agent's home, and setup reported the CLI missing from the image it had just downloaded. All three are fixed, and idea executors setup --kind hermes --model <provider/model> --smoke --yes passes for OpenAI, Anthropic, Gemini, DeepSeek, OpenRouter and Ollama, each producing a real file.
The agent is pinned to the provider you configured — base URL and key variable — rather than Hermes's own provider names, which sent an OpenAI key's work to OpenRouter and did not know Ollama at all.
The agent now works on a copy of your project. Its working directory used to start empty, so asked to change server.js it wrote a new one from nothing, and applying it deleted the code that was there. Each run now starts from a fresh copy (git's tracked and untracked, non-ignored files). .env files and anything that looks like a credential are never copied, because the agent has network access; what was left out is listed on the change set. Applying refuses — and writes nothing — if a file was edited after the agent ran, and keeps file permissions.
The web UI runs the loop
- Build has a "Run TASK-n" button, disabled with the reason when a run can't start. A failed run shows the agent's own error. Diffs show only the changed lines; every finding shows on its change set before you approve; a conflict explains which files changed and offers "Reject and re-run".
- Settings shows whether the agent's image is pulled and its key is set, and rejects a model it can't use with the reason.
- Define and Plan show each finding and decision once, on the page where it's decided — including a dependency cycle that blocked plan approval and had shown on no page.
- Demo mode is labelled everywhere; nothing demo-made is called "SHIPPED".
- Works at phone width and in dark mode.
Current models
Defaults are models that answered a real call on 2026-09-17: claude-sonnet-5, gpt-5.6-luna, gemini-3.6-flash, deepseek-v4-pro, anthropic/claude-sonnet-5 on OpenRouter, and qwen3.8 on Ollama. Six ids that now return 404 were removed from the catalog. Every catalog model has a price, so max_cost_usd enforces at real rates — current models had been budgeted at a fraction of theirs.
Read this before upgrading
- Ollama without a
default_modelnow asks forqwen3.8. Runollama pull qwen3.8, or setdefault_model: ollama/llama3.1to keep the old one. - Tasks run one at a time.
POST …/executeis refused while another task's change set in the same initiative is still open, and while the PRD or plan is waiting for review. Apply or reject each change set before running the next task. PUT …/executorsrejects a model the agent can't use with400.GET …/decisionslists each question once (?all=truefor every row), and answering a decision answers its open duplicates.- One daemon per state directory, even on different addresses.
idea daemon stopwaits for running work to be cancelled (up to 30 s) and prints the pid.
Installing
Download the archive for your platform and put idea on your PATH. The web UI is embedded — no Go or Node toolchain needed.
shasum -a 256 -c checksums.txt
linux/arm64 is built and shipped, but its SQLite driver is compiled per-architecture and is not exercised in CI; see the install section of the README.
Trying it
idea init && idea new "<your idea>" runs the whole loop on a built-in demo provider with no API key, and idea init prints the web UI's address. For real code, set up the coding agent — docs/agents.md covers the providers and the security tradeoffs.
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.4.0
The first release since v0.3.0, and the largest so far: 13 breaking changes, 4 additions and 41 fixes, almost all of them found by running the product against its own documentation and a real model rather than by reading the code.
Read this before upgrading
Most of the breaking changes are commands and endpoints that used to report success over a failure. If you have scripts, these are the ones that will change behaviour under them.
idea status exits non-zero when the newest initiative has failed. It printed ● failed with the provider's full error and returned 0, so a script running it as a health check could not tell. Any script that branched on its exit code saw success unconditionally and will now stop. Two deliberate limits: an initiative merely waiting on your judgment is not a failure and still exits 0, and only the newest initiative is considered — scanning all of them made the exit sticky, so one abandoned experiment gated the overview command forever. idea status --json now also carries failure_reason.
Three endpoints reject undeclared body fields. PUT …/providers, PUT …/executors and POST …/change-sets/{id}/review used to accept an unknown field, drop it silently and answer 200. They now answer 400 naming it. This matters most for an inline api_key, which was being discarded rather than rejected — the failure mode that costs money. Neither config endpoint is round-trippable from its own GET: the responses carry fields the writes do not accept, and GET /executors is a catalog of executor kinds rather than a projection of the config.
idea verify can no longer complete a failed initiative, and no longer discards a requirement you named. idea doctor now fails when the daemon lacks the API key your configured model needs, and when the daemon is running a different build than the CLI. Six endpoints answer 404 for an id matching nothing where they previously answered 200 over an empty result.
CHANGELOG.md has all thirteen with Was/Now rows and the reasoning.
What is better
Errors now tell you what to do. idea init against a held port used to print nothing for a code-bound ~51 minutes; it now fails in ~1 second quoting the bind error. A model call that hangs reports elapsed time and how to cancel it, instead of working… for fifteen minutes. idea next prescribes a change-set id that actually resolves. idea retry waits and reports what the retry reached rather than reporting that it started. All three of the recovery scenarios that previously exceeded the five-minute target now complete in seconds.
Installing
Download the archive for your platform and put idea on your PATH. The web UI is embedded — no Go or Node toolchain needed.
shasum -a 256 -c checksums.txt
linux/arm64 is built and shipped, but its SQLite driver is compiled per-architecture and is not exercised in CI; see the install section of the README.
Trying it
idea init && idea new "<your idea>" runs the whole loop on a built-in demo provider with no API key — deterministic, offline, synthetic output labelled as such, and it reaches a completed initiative in under two seconds.
With a real model the shape differs and the README says how: the adversarial reviewer genuinely blocks, so the run stops twice for your judgment before it reaches a change set, and the requirement codes are not REQ-1. The default executor writes a placeholder file rather than real code; wiring a coding agent is a separate opt-in step with security tradeoffs set out in docs/agents.md.
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.3.0
Guards and ergonomics. No P0s — 0.2.0 is safe to stay on. This exists so the published artifact does not drift behind main the way 0.1.0 did, when every P0 four audit rounds fixed stayed live in the only installable binary the whole time.
Added
idea <command> --helpworks, on every command. It was rejected as an unknown flag on all 33 subcommands, so there was no way to learn whatidea verify --waivedoes or what kindsidea exporttakes without openingdocs/cli.md. Rendered from the same command table that drivesidea helpand the docs, so the three cannot disagree.- Provider wire-format goldens, plus an assertion that the token budget a provider emits never exceeds the ceiling it declares. Four rounds of guards compared artifacts to artifacts — routes to specs, docs to code — and nothing compared the request to what a provider accepts, which is how
max_tokens: 32000against a declared16384shipped in 0.1.0 and survived until someone spent a real API key. The cap now also lives inside each provider, so no caller can emit a request the provider will reject.
Changed
Both are the same class 0.2.0 listed under Changed — BREAKING (HTTP API), which is why this is a minor bump rather than a patch — the convention decides the number, not how forgiving the change happens to be. A client that null-checked keeps working; one generated from openapi.yaml now works where it did not.
/doctorand/diffreturn[]rather thannullfor empty arrays. The earlier sweep converted eight fields and missed these two, so the API had become mixed rather than consistent —/diffcould return"added":[{…}],"removed":nullin a single response./doctorwas the worse case: an empty finding list means the graph audit found nothing wrong, so the good outcome was the one returningnull.- Unmatched paths under
/api/answer the documented{"error": …}envelope.openapi.yamlsaid every error has that shape "and nothing else"; ten API paths answered404 page not foundastext/plain, and the CLI surfaced it asidea: 404 Not Found— the only raw HTTP status it prints. The web UI is unaffected.
Still open
The 405 half of the error envelope (Go synthesizes it only when no route pattern matches, and the UI catch-all prevents that) and response-schema checking. Both are recorded in docs/plans/deferred.md with the reason each is still open.
Verify your download
shasum -a 256 -c checksums.txt
idea version # v0.3.0 (62748eb)
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.2.0
Five developer-experience audits and their remediation.
Upgrade from 0.1.0
0.1.0 contains every P0 fixed here. If you installed it, upgrading is preferred to pinning:
- a successful
idea executestranded the initiative inrunningforever — every later command answered "already running", with no way back short of editing the database; - the idea text and modern provider keys (
sk-ant-…,sk-proj-…,sk-svcacct-…) reached the model provider unredacted; - a late panic rewrote a succeeded run as failed;
- the PRD stage asked a token budget no provider accepts, so every real OpenAI run failed with a
400whose explanation the code discarded; idea model setsilently reverted hand-editedharness.yamlat exit 0;- a model id without a provider (
gpt-4o) routed the whole workflow to the synthetic demo stub whilemodel set,config validateanddoctorall reported success.
The documented eight-command quick start also did not work on the no-key path: it did nothing, then reported ✓ initiative complete over an initiative with zero change sets. Measured back-to-back: 0 of 5 runs passed before, 5 of 5 after.
Breaking
Pre-1.0, so these land in a minor release. Each entry in the changelog states its consumer impact.
- Exit codes. Commands that printed a failure and exited 0 now exit non-zero:
idea verifyon an unmet gate,idea doctoron a failed check,idea daemon statuswhen stopped, and every command given an unknown flag or subcommand. Scripts that relied on the old exit 0 will now stop. - HTTP.
POST …/change-sets/{id}/revertandPOST …/executeanswer409instead of202when the precondition fails;advanceandreviseanswer409rather than500; setting a disposition on a finding that does not exist answers404rather than200. - Response shapes. Empty arrays are
[], notnull— a client that null-checked them keeps working, one generated fromopenapi.yamlnow works at all. The review endpoint'sverdictenum is documented as the values the API actually accepts (approved/rejected), not the CLI's short forms.
Also
idea retry exists. idea new waits for the run it starts (--no-wait returns immediately). Provider errors carry the upstream message, bounded and scrubbed for credentials. Truncated model output is detected rather than silently accepted. idea version no longer reports a version that was never tagged.
Seven CI guards now check documentation and spec drift, including two added this cycle: ledger-check (defect ledgers agree with the tree) and enum-check (spec enums match the domain constants).
Full detail, including what each change means for a consumer, is in CHANGELOG.md.
Verify your download
shasum -a 256 -c checksums.txt
idea version # v0.2.0 (e82f9c2)
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.
v0.1.0
See CHANGELOG.md
for what changed.
Pre-1.0: the CLI surface, HTTP API and config schema may change in any release.