Skip to content

release: v0.18.2 - #274

Merged
yetone merged 1 commit into
mainfrom
release/v0.18.2
Sep 13, 2026
Merged

yetone merged 1 commit into
mainfrom
release/v0.18.2

Conversation

@yetone

@yetone yetone commented Sep 13, 2026

Copy link
Copy Markdown
Owner

Patch release. Three fixes, one of which unblocks the production deploy.

What is in it

#271 — fix(deploy): resolve the proxy probe's named port so the migration can start

This is the one that matters operationally. The migration Job copies the Deployment's cloud-sql-proxy container, whose startupProbe targets the named port pg-health — but cleanContainerForJob strips ports, so the name had nothing to resolve against and kubelet parsed it as an integer forever (strconv.Atoi: parsing "pg-health": invalid syntax). The proxy is a native sidecar (restartPolicy: Always), so never reporting started means the migrate container is never launched at all. The Job then burned its entire deadline having run nothing, and its pod was reaped, so there were no logs to say so.

Verified against the code: cleanContainerForJob (recovery.ts:481) deletes both ports and startupProbe, and buildMigrationJob (:541) re-attaches the copied probe to the sidecar. Confirmed in production: run 34531956583 ran 30 minutes against MIGRATION_DEADLINE_SECONDS: 1800 and reported deploy-release: job_failed, with preflight passing cleanly beforehand.

#272 — fix(agent): compaction must not hoist an answered steer to the newest-input slot

Stage-2 compaction partitioned history by item type and re-appended every mid-history non-tool item after all surviving pairs, so it reordered rather than only deleting. The only non-tool items that appear mid-history are the three role:'user' items the runtime injects itself, and all three are imperatives ("Re-assess your current plan … and continue", "Continue this same turn"). An already-answered steer therefore reappeared in the newest-input slot and was obeyed again — including anything side-effecting it asked for — on every remaining hop.

Verified the new tests are not tautological: they fail on unmodified main (not ok 41/42/43, # pass 40 # fail 3) and pass with the fix (# pass 43 # fail 0), with the 40 pre-existing tests unchanged in both.

#266 — fix(agent): "No result was produced" has to be true where it is posted

The failure notice now checks, per conversation, whether the turn actually posted a message.posted side effect there, and drops only the No result was produced. clause when it did — keeping the Agent run failed… sentence, which is what the announce-then-die case needs. A HELD auto-relay (exit 2) now ends the turn as skipped instead of being reported as a crash, and records turn.auto_relay_held. Confirmed the exit code survives the tool boundary: tBash sets ok = code === 0 and puts exitCode in output (tools-shared.ts:566-568).

Schema

No migration added. MIN_SUPPORTED_SCHEMA_VERSION and MAX_SUPPORTED_SCHEMA_VERSION both stay at 9.

Note for the deploy: production has not yet reached schema 9, so the candidate migration is still the full 0002..0009 catch-up — which is exactly what #271 makes possible for the first time.

Verification

All three PRs were green in CI before merge. On the merged tip (8e80f3c) locally: lint, typecheck, server:typecheck, and all three guards (big-brain, llm-tracked, engine-registry) pass. Unit suite: 1368 pass, 2 fail, both environmental in this sandbox and green in CI — one needs a real Postgres, the other needs workers/email-gate's own npm install for postal-mime (it is not a root dependency and there are no npm workspaces).

https://claude.ai/code/session_01Tw4EygpE4o73TMLzyPFWEv

Three fixes, one of which unblocks the production deploy.

- #271 fix(deploy): resolve the proxy probe's named port so the migration
  can start. The migration Job's cloud-sql-proxy sidecar inherited a
  startupProbe targeting the named port `pg-health` while
  cleanContainerForJob strips `ports`, so kubelet parsed the name as an
  integer forever. A native sidecar that never reports `started` never
  launches the migrate container, so the Job burned its whole deadline
  having run nothing.
- #272 fix(agent): compaction must not hoist an answered steer to the
  newest-input slot. Stage-2 compaction partitioned by item type and
  re-appended every mid-history non-tool item after the surviving pairs,
  so an already-answered mid-turn steer reappeared as the newest input
  and was obeyed a second time, on every remaining hop.
- #266 fix(agent): "No result was produced" has to be true where it is
  posted. The failure notice now consults the turn's own side effects per
  conversation, and a HELD auto-relay ends the turn as `skipped` rather
  than being reported as a crash.

No schema change: MIN/MAX_SUPPORTED_SCHEMA_VERSION stay at 9.

Claude-Session: https://claude.ai/code/session_01Tw4EygpE4o73TMLzyPFWEv
@yetone
yetone merged commit a030961 into main Sep 13, 2026
9 checks passed
@yetone
yetone deleted the release/v0.18.2 branch September 13, 2026 22:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant