# Tamcoder 0.1.60

Self-healing is the default. A recoverable stall or unsupported tool-call markup no longer ends the
turn with "work is preserved" — the engine keeps ownership and tries another eligible model or
strategy inside the same turn.

- Headless `exec`, the SDK and interactive sessions now default `keepRunning` to on. Previously the
  app-server wrote `false` unless `TAMCODER_KEEP_RUNNING=1` was exported, so recoverable failures
  closed cleanly instead of recovering.
- Explicit opt-out is preserved: `keepRunning: false` in the SDK, `agent.keep_running=false`, or
  `TAMCODER_KEEP_RUNNING=0`. The TUI's autocontinue preference still governs terminal-owned
  continuation turns; engine-internal recovery is a separate, bounded contract.
- Recovery remains bounded by the existing attempt, operation, deadline and spend limits, keeps the
  persisted work record and failed-model exclusions, and does not bypass permission, entitlement or
  supplier budgets.
- Includes 0.1.59: `taskOutcome.resolvedModels` and `model/resolved` expose the physical model behind
  an alias on ordinary turns, so an alias switch is not mistaken for a model change.

Malformed tool markup, stalled announcements and pending verification checks are recovered in the
same turn; a turn still ends when recovery is exhausted or a real external blocker is reached, with a
truthful non-success outcome.

- Multi-command scripts sent as a one-element array now run through bash instead of being spawned as a filename (fixes ENOENT).
- The compaction notice is announced once per turn instead of every round.
