Skip to content

v0.32.0

Choose a tag to compare

@anthonyrisinger anthonyrisinger released this 07 Aug 19:11
· 115 commits to main since this release

Highlights

  • The reference-transaction guard now protects work that is genuinely published rather than work that merely looks published: it resolves each branch's true upstream from that branch's own local remote/merge pairing instead of @{upstream}, which an agent lane deliberately aims back at the branch itself. Ordinary amends, rebases, and soft resets of unpublished commits are no longer refused, while a rewind that would discard upstream-merged commits now is.
  • The same guard stops trusting the old value git reports on the hook's stdin. Git reports the value the caller declared, and git update-ref <ref> <new> declares none, so that field arrives as the zero OID and a rewind read as a branch creation; the guard now reads the branch tip from the ref itself during the prepared state, closing a path that silently moved a branch backwards over published history with no diagnostic.
  • A declared upstream that cannot be resolved — an unfetched remote, a renamed or pruned remote, a bare URL in branch.<name>.remote — is now told apart from a branch that tracks nothing at all. Appends still pass, because they abandon nothing whatever the upstream holds, so an unfetched lane is never stranded; a rewind is refused with a message naming the unresolvable ref, so an unreachable remote can no longer read as a clean bill of health.
  • Images produced by Codex tools render in Serve again. When Codex moved its shell tool from function_call_output to custom_tool_call_output, every screenshot it produced was reclassified as a picture the assistant had sent, and Serve minted an embedded URL its own fetcher then refused — a broken picture sitting in the operator's lane. The presenter and the fetcher now consult one shared addressability rule, so the two answers cannot disagree.
  • A Drain lane that stops while still holding a claim is restarted onto that same task, so a lane that ices mid-task recovers the row it was working instead of idling until an operator notices.
  • An empty task board now reads as a completed drain that names each parked category and why it is parked, instead of reading as a lookup failure or as work the agent failed to pick up.
  • spice release composes the generated sections of the release notes at publication against the real release commit, and refuses a candidate file that still carries the draft banner, still holds the generated Highlights placeholder, or whose curated region contains nothing but banner and headings — an uncurated release can no longer ship.
  • policy.admission is now admitted into the typed configuration registry, so it is resolved, validated, and reported like every other typed configuration key.
  • spice agent activation no longer advances the git tree as a side effect of delivering its packet, and the post-tool hook keeps inline ACK keys out of the durable transcript.
Task-level changes

Changes by project

Lifecycle Release

  • Cut the 0.31.2 patch release. (b2f3673)
  • Compose generated release-notes sections at publish time, not curation time. (e1a49e4)
  • Refuse curated release notes that carry no Highlights. (508aad0)
  • Updated docs/release.md for publish-time note composition. (5eb86e7)

Lifecycle Config

  • Admit policy.admission into the typed configuration registry. (79edd5b)

Serve Agent

  • Retire inline ACK keys from the durable transcript in the post-tool hook. (2127f7c)

Serve Images

  • Serve cannot fetch back Codex images delivered through custom_tool_call_output. (c00d8c0)

Lifecycle Activation

  • Stop the activation packet from advancing the git tree. (49e4f2a)

Lifecycle Contract

  • Teach agents that backgrounding a command and yielding ices the lane. (a2b64ef)

Lifecycle Restart

  • Restart a stopped Drain lane onto the task it still holds. (2b76869)

Task Drain

  • Made an empty board read as done rather than as a mistake. (4481fee)

Hooks Refguard

  • Resolve the reference-transaction guard against the true upstream. (ea449bf)
  • Refuse a rewind git reports with a zero old-value. (ccb2ace)
  • Distinguish an unresolvable upstream pairing from no pairing at all. (41fc70a)

Package Notes

  • PyPI release: spice-harness==0.32.0
  • Release commit: 6af111b4
  • Commit range: v0.31.2..6af111b4
  • Commit source: first-parent history grouped by Task-Project metadata
  • Release tag: v0.32.0