Lock files like bun.lock and Cargo.lock contain auto-generated content
that Claude cannot meaningfully merge. Remove them during conflict
resolution so they get regenerated cleanly.
The config command already parsed the key but ignored it when calling
set() and printing the result. Also clarify sync vs async convention
in CLAUDE.md and log invalid memory config instead of silently falling
back.
The config command previously maintained a separate key list and used a
switch statement that would need updating for each new key. Deriving
VALID_KEYS from config.DEFAULTS keeps them in sync automatically.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The validator is now reusable by both the CLI config command and
the VM startup path, which falls back to the default if the stored
value is invalid. Also lowers the default memory limit to 16G and
makes config.load() resilient to malformed JSON.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Eliminates duplicated default values and simplifies the config
command by replacing the generic key metadata registry with
direct validation functions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move defaults and normalization into KEYS metadata, validate config
file shape on load, and lower default container memory from 32G to 16G.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allow users to configure container memory limit (default 32G) via
`sandlot config memory <value>` instead of hardcoding it.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Speeds up repeated cargo builds across sessions by caching
compilation artifacts on the persistent mount.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Collapse redundant empty-session branch so --json falls through to the
normal serialization path instead of printing "[]" separately. Replace
per-branch load/save loop with a single state cycle to avoid racing
concurrent writes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Batch-clearing stale flags in list and blindly writing back the session
in review could clobbер concurrent changes. Use per-session get/set
instead of whole-state load/save, and re-read before clearing in_review.
The fire-and-forget patchSession calls in list could race with each
other, each reading stale state before writing. Collecting stale
branches and doing a single load-modify-save eliminates the race.
Also emits valid JSON (`[]`) when listing with --json and no sessions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The mkdir-based lock was unreliable (stale lock recovery was racy) and
added latency. The atomic rename in save() already prevents corruption,
and concurrent writes to different keys are rare enough to not warrant
the complexity. Also inlines stale review self-healing into the map
callback and collapses the review try/catch/finally into just finally.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Parallel operations (e.g. stale review cleanup in `list`) could
clobber each other via read-modify-write on the shared state file.
Also fix spinner lifecycle in `review` and simplify empty-list output.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The load-modify-save pattern could overwrite concurrent state changes.
patchSession does an atomic read-patch-write, and the list command now
re-checks activity before clearing stale flags to avoid racing with a
review that just started.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reload fresh state before saving to avoid overwriting concurrent changes
from other processes between the initial load and the heal write.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use already-loaded state in list command instead of re-reading. In review
command, patch in_review on fresh state to avoid clobbering concurrent
changes, and skip worktree save in print mode. Remove unused white import
and unnecessary nullish coalescing fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move in_review flag set before try block so it is always visible,
and consolidate per-session state writes into a single batch to
avoid repeated disk I/O during list. Also guard against missing
status entries with fallback defaults.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move in_review flag set inside try block so finally always clears it,
and actively clear stale flags in list when Claude is no longer active.
Previously a crash between setting the flag and entering try would
leave the session stuck in review state.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Review status now requires Claude to be active, preventing stale flags
from showing after a crash. Consolidates icon/color maps into a single
styles record and defers setting in_review until the container is up.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The list command needs to show when a session is under active
review so users don't interrupt it. Wrapping the review body in
try/finally ensures the flag is always cleared on exit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PostToolUseFailure incorrectly marked the session idle on transient tool
errors. PreToolUse keeps the active signal fresh throughout tool execution,
while Stop alone handles the transition to idle.