Skip to content

Zeroshot v13.0.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 20:10
03e44f1

Changes since v12.0.0.

Breaking changes

Send the shell GH_TOKEN to named targets only on opt-in (#1437)

Named-target run, resume and stack submit read GH_TOKEN from the
invoking shell and sent it to the target even when the user never asked
them to. Targets treat a value sent with the request as authoritative,
so an ambient token (for example from export GH_TOKEN="$(gh auth token)", as the local quickstart suggests) silently replaced the GitHub
connection stored on the target.

The token reached the target two ways:

  1. as the legacy GitHub.com token on the run, resume or stack request;
  2. as the value of any declared GH_TOKEN connection field, including
    the delivery binding that --ship adds;
  3. for direct targets, as the credential posted with run --task-from
    review resolution, even under --validate-only.

This PR makes all three opt-in through a new --forward-gh-token flag.

Features

Add OpenCode Go and Zen providers (#1427)

Adds two providers to the contributed OpenCode harness: opencode-go
(OpenCode Go subscription) and opencode (OpenCode Zen). Users with an
OpenCode subscription can now run Zeroshot nodes on it, for example
{"harness": "opencode", "provider": "opencode-go", "model": "glm-5.3-flash"}. Discussed beforehand in Discord #contributors.

Let hosts credit a co-author on delivered commits (#1444)

  • Hosted runs can credit one co-author on delivered commits. The new
    optional field is TargetRunRequest.commitCoAuthor on submission and
    RunResumeParams.commitCoAuthor for a resumed successor. It uses the
    same {name, email} CommitIdentity type and validation as
    commitIdentity.
  • Every commit SystemGit::prepare_revision makes ends with exactly one
    Co-authored-by: Name <email> trailer, and author and committer stay as
    commitIdentity (or the default) chooses. That includes the adapter's
    prepared revisions, the transport's revisions before reconcile and
    target merges, and a conflicted merge it concludes after repair, since
    that merge holds the run's resolution.
  • The credit is added in the same single git commit that commits the
    run's changes. A failed or cancelled commit therefore never leaves an
    uncredited commit for a retry or resume to deliver.
  • Git's own --trailer handling adds the credit with where=end,
    ifexists=addIfDifferent, ifmissing=add and the separator pinned on
    the command line. Workspace trailer defaults therefore cannot move,
    repeat or drop it.
  • No pin sets a trailer key, so trailers already in the run's message
    keep their names and values; Git only normalises the spacing around
    their separators.
  • The credited commit pins Git's default whitespace cleanup. A message
    that cleanup empties (only blank or Signed-off-by: lines) gets no
    trailer, so Git refuses it exactly as it does without a co-author.
  • Merges Git completes itself (reconcile merge --no-edit, target
    integration) and the repository-local identity pinned for conflict
    repair never name the co-author. Neither do run state or agent
    environments.
  • An invalid co-author is rejected the same way as an invalid identity:
    400 request.invalid at admission, and a deserialization error on
    resume. Local resume rejects a co-author just as it rejects an identity.
  • Without the field, delivery runs the same Git commands as before and
    requests serialize byte for byte as before. schema.json,
    openrpc.json and docs/reference/cluster/api.md were regenerated
    through the Rust testkit. AGENTS.md documents the behaviour, including
    that workspace settings for the Co-authored-by trailer itself still
    apply.

Expose built-in profile runtimes and connection requirements (#1473)

Built-in templates now expose their authored runtime and derived
connection requirements, so clients can configure profiles without
duplicating provider rules. A stateless setup API prepares runtimes
through the host-selected harness registry, and the standalone editor
initializes profiles from these defaults, including Code review's mixed
Codex/Claude configuration. Local setup accepts its advertised
contributed harnesses while default and target setup remain core-only.

Distribute shared Zeroshot skills through plugins (#1477)

Install Zeroshot in Codex/ChatGPT or Claude from the repository
marketplace with the run, planning, and graph-design skills plus its
hosted MCP connection. The packages use unchanged copies of the
canonical skills, so CLI and plugin installations share the same
instructions. MCP requests use the connected Platform account; explicit
CLI requests retain native login.

Generate both plugin packages and marketplace catalogs from one metadata
file, enforce package drift and content-version checks in CI, and
document installation, authorization, updates, and review cases. Public
directory submissions remain separate from repository installation.

Fixes

Check lane executables when resume restores a checkpoint (#1469)

A local zeroshot resume that restores a workspace checkpoint now
refuses when a lane's agent executable is not on the captured PATH, as
zeroshot run does. Before this change, a plain resume (which restores
the latest checkpoint) skipped the check, exited 0 and started a
successor. The reporter saw that successor fail at its first provider
spawn with an unexplained kind=NotFound.

  • The local controller now runs the existing check_lane_executables
    first when it composes the run (build_local_process_candidate).

  • Composition happens after the checkpoint restore and before the
    successor is admitted, so the lookup sees the restored workspace.

  • An executable, or a relative PATH entry, that only the checkpoint
    contains still resumes. That case is why the CLI skips its own check
    before the restore.

  • The controller no longer replaces the runtime factory's error with the
    message-less "portable runtime could not be constructed". The new
    PortableControllerError::RuntimeComposition keeps it, so the existing
    redacted, bounded startup-failure report carries it to the CLI:

zeroshot: local controller operation failed: controller exited before
becoming ready: lane codex/openai needs the codex executable on PATH


This also names a delivery `git`/`gh` that is missing after a restore.
The factory already checked those, but reported them without a message.
- A refused resume:
- exits non-zero and prints no receipt;
- creates no run;
- leaves the original run resumable, with no `successorRunId` (existing
successor-claim reconciliation).

Resuming again from a `PATH` that finds the executable works.
- `AGENTS.md` and `docs/reference/runtime-plan.md` now say where
checkpoint resumes check and how the message appears.

### Settle OpenCode 2.x tool turns without a final step ([#1430](https://github.com/the-open-engine/zeroshot/pull/1430))

On OpenCode 2.x (what the official installer ships now), every Zeroshot
node that uses a tool fails with `OpenCode ended without a completed
native step`, even though OpenCode did the work and produced the answer.
This PR settles that case narrowly. OpenCode 1.x behaviour is unchanged.

This is the first of the OpenCode 2.x compatibility fixes discussed in
Discord `#contributors`. It is independent of #1427.

### Name envelope faults and show the expected shape in correction turns ([#1432](https://github.com/the-open-engine/zeroshot/pull/1432))

Final-output correction turns now tell the agent what was wrong with a
rejected envelope and show the expected response as a one-line shape.
Free-text lanes (Pi, OpenCode, Hermes) get a concrete target instead of
only the raw parse error and the full schema, so fewer nodes end as
`malformed` after two corrections. Parsing stays strict.

### Surface merge queue failures for repair ([#1470](https://github.com/the-open-engine/zeroshot/pull/1470))

Return a removed merge-queue candidate and its required-check failures
to the existing repair loop. Polling retains the confirmed admission
instead of repeatedly enqueueing unchanged code after CI ejects it.
Failure evidence binds the exact repository, PR head and queued commit;
confirmed withdrawal still precedes agent repair.

Also fix a pending-start race that could report cancellation after a
failed remote close. Keep external Coveralls publication best effort
while tests, coverage measurement and coverage floors remain required.

### Name the diagnostic path in graph rejection errors ([#1471](https://github.com/the-open-engine/zeroshot/pull/1471))

Graph verification rejections now say where the problem is. Before this
change, `zeroshot run` and `--validate-only` printed only the first
diagnostic's message:

```text
zeroshot: run validation failed: graph verification rejected the graph: control assignment space exceeds 65536

The verifier already attaches a typed path of field, index and node
segments to every diagnostic. The shared VerificationError display
dropped that path, and it never said whether there were more
diagnostics. The same graph now reports:

zeroshot: run validation failed: graph verification rejected the graph at root/`run`/children[1]/`check`/branches: control assignment space exceeds 65536

When the verifier finds more than one problem, (and N more diagnostics) follows the message, as long as it fits within the bound
described below.

Serialize overlapping updates and clean up after interrupted ones (#1472)

zeroshot update now copes with several updates of one installation
running at once, and with an update that was killed part-way.

  • One update at a time. Each update stages and replaces under an
    exclusive lock on .zeroshot-update.lock, a file next to the
    executable. It is an fs2 lock, as the local stores use. The operating
    system releases it if its holder dies, so an interrupted update never
    blocks later ones.
  • A waiting update re-checks the installation. It takes the lock,
    then compares the installed executable and Restic sidecar with the
    release. If both already hold exactly the release's bytes, it reports
    "updated":false and replaces nothing.
  • Before this change, such an update failed on Linux with could not replace this executable: No such file or directory (os error 2),
    although the installation was correct.
  • On Linux, once another update replaces a running executable, the
    process sees its own path with (deleted) appended. The updater strips
    that suffix to find the installation.
  • Leftovers are cleaned up. Before it installs a newer release, an
    update removes what interrupted updates left in the installation
    directory:
    • staged .zeroshot-update-* and .restic-update-* files;
  • copies that self_replace was writing (.zeroshot.__temp__* on Unix,
    .zeroshot.*.__temp__.exe on Windows).
  • Moved-aside Restic is handled safely. When no Restic sidecar is
    installed, the newest moved-aside backup is put back. Otherwise the
    backups are removed.
  • Rollback stays within its own update. While one update holds the
    lock, no other update can stage or replace files. A rollback therefore
    removes only the Restic sidecar its own update installed. It can no
    longer delete a newer one, or restore an older one next to a new
    zeroshot.

Apply required CI policy consistently (#1476)

Apply GitLab’s required-CI policy consistently to --pr readiness,
approval handoff, and --ship merging. Explicitly optional CI remains
NotRequired in every pipeline state. Required CI, identity checks, and
non-CI gates remain enforced.

Validation passed: six permanent regressions, 276 provider tests, 217
delivery tests, 12 delivery-gate tests, and 43 tooling checks. All 12
live GitLab.com cases passed, including genuinely running optional
pipelines, optional failures, required blocking/successful CI, and
absent CI. OpenAI and Anthropic journeys passed with 980/981 npm tests.
Build, Clippy, formatting, and strict docs passed. Protected PR CI
remains pending.

Closes #1382

Co-authored-by: Zeroshot delivery@zeroshot.invalid

Documentation

Revise vulnerability reporting process (#1425)

Updated security reporting instructions and response timeline.

Maintenance

Catch structural failures before the merge queue (#1474)

Run checksum-pinned Opcore Fast in the existing quick PR checks before
Rust setup, so deterministic source problems such as oversized files
reach the normal repair flow before a full merge-queue run. Preserve
README-only handling and all authoritative queue, native-platform and
merge checks.

Upgrade

npm install -g @the-open-engine-company/zeroshot@13.0.0

Versions 10.4.0 through 10.8.0 cannot update themselves: zeroshot update fails with release archive contains unexpected entry restic (restic.exe on Windows). Upgrade those installations once with the npm command above.