Skip to content

terminate is idempotent on a terminated VM — recorded, and the guess it replaces wedged a real consumer - #85

Merged
lex00 merged 1 commit into
mainfrom
fix/terminate-idempotent
Aug 7, 2026
Merged

terminate is idempotent on a terminated VM — recorded, and the guess it replaces wedged a real consumer#85
lex00 merged 1 commit into
mainfrom
fix/terminate-idempotent

Conversation

@lex00

@lex00 lex00 commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Closes #83, and settles today's #51 investigation with a recording instead of an argument.

The recording (live AWS, 2026-08-06): run → terminate → TERMINATED → terminate again → 200 {}, identical to the first. Suspend-on-terminated re-verified in the same probe as the recorded 400. So the terminated state refuses changes while accepting the request that asks for what is already true — and m80's extrapolated 400 on the double-terminate was wrong in the one place it could hurt: KubeMicroVM v1.0.12's cleanup re-issues the terminate, and the emulator's guess wedged the very fix this harness's bug report produced.

  • Handler: terminate goes idempotent on terminal VMs; suspend/resume keep the recorded 400. The old all-mutations test now drives the 400 with suspend (where the recording lives); a new test pins the terminate exception with the full story.
  • Conformance: errors-conflict grows a terminate-terminated step + fixture — 101/101 locally against the candidate image.
  • The matrix moves with reality, per the gate's own both-directions rule: chart defaults to 1.0.12, expectations re-seeded from a full local run — 52 of 63, QS-08 and RS-06 into the passing column, 99 Final Cleanup reclassified as debris inherited from the endpoint-race group (its account explains why it flips only when that group does). README, landing and the failure account tell the finished story: found by this harness, fixed upstream in v1.0.12, verified here the day after — with the emulator itself the last thing standing between the fix and the passing column, wrong in the correct way: visibly, and once.
  • up.sh states --kubeconfig-update-default --kubeconfig-switch-context explicitly: k3d 5.8.3 observed (twice, two repos) ignoring options.kubeconfig delivered via --config.

The PR's own uat job is the proof-of-record: candidate image, chart 1.0.12, held to the new expectations.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WVmBmk6XERjKxHa4HyezvT

…it replaces wedged a real consumer

Recorded 2026-08-06 against live AWS: a second TerminateMicrovm on a
TERMINATED VM answers 200 with an empty object, exactly like the first.
m80 extrapolated the suspend-on-terminated 400 onto it, and the guess
was load-bearing in the worst way — KubeMicroVM v1.0.12's finalizer fix
(upstream #51, which this harness found) re-issues the terminate on
cleanup, and m80's 400 wedged the loop against behaviour the real
service never exhibits. The same probe re-verified suspend-on-
terminated as the recorded 400: the terminated state refuses changes
while accepting the one request that asks for what is already true.

The terminate handler goes idempotent; the extrapolating test moves to
suspend where the recording actually lives; a new test pins the
exception; the conformance case grows a terminate-terminated step with
its fixture (101 checks now). Chart defaults move to 1.0.12 and the
matrix moves with reality per the gate's own rule: 52 of 63, QS-08 and
RS-06 into the passing column, 99 Final Cleanup reclassified as debris
inherited from the endpoint-race group. And up.sh states the
kubeconfig flags explicitly on create — k3d 5.8.3 was observed twice
ignoring options.kubeconfig delivered via --config.

Closes #83.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WVmBmk6XERjKxHa4HyezvT
@lex00
lex00 merged commit ff5118e into main Aug 7, 2026
7 checks passed
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.

terminate-on-TERMINATED answers a 400 the ledger never lists — record it or own the extrapolation

1 participant