Skip to content

v2026.05.20.1 — AGENT_LOOP lifecycle logs + verify_signature url-safe fix

Choose a tag to compare

@elophanto elophanto released this 20 May 10:05
· 203 commits to main since this release

Patch release on top of v2026.05.20.

What's new

[agent_loop] lifecycle observability

Operator on a second machine reported "browser is being taken multiple times, conflicting actions, it's not waiting." Forensic read of the log showed the scheduled task was correctly BLOCKED on AGENT_LOOP — the misleading [sched-task] starting log fired BEFORE the acquire and made the wait invisible.

Added a single grep-able prefix [agent_loop] that emits at every state transition:

[agent_loop] WAIT  src=SCHEDULED in_use=1 waiters=0 cap=1
[agent_loop] ACQ   src=USER waited=0.00s
[agent_loop] REL   src=USER held=230.99s
[agent_loop] SCHED dispatch in_use=1 waiters=1 head='Run AlphaScala monitor...'

Operators can grep '\[agent_loop\]' logs/latest.log and share the result. The sequence makes overlap impossible to hide — if you ever see two ACQ without a REL between them, that's a real concurrency bug.

New regression test test_scheduled_blocks_while_user_holds_agent_loop explicitly pins the cross-source serialization contract.

core/jobs.py flaky CI fix

base64.b64decode with default validate=False silently drops non-alphabet chars; ~10% of randomly-generated url-safe Ed25519 pubkeys decoded to 30-byte garbage, bypassing the fallback to _b64url_decode. Fix: validate=True. Regression test pins a deterministic seed that triggers the silent-garbage path.

docs/76-MIND-STARVATION-AGING.md

Future-consideration doc captured from real lifecycle traces: under sustained USER + SCHEDULED pressure, MIND (priority 2) can wait 10+ minutes because every release goes to a higher-priority arrival. Doc records why it's not a bug, why we're not fixing it now, triggers that would reopen the question, and the proposed fix when revisited (capped priority aging).

Tests

188 focused green. Ruff + mypy clean.

Causation note

This patch's value is making the system's correctness visible, not changing semantics. The v2026.05.20 gating worked; operators couldn't tell because the logs lied.

Commits

  • eacfe5a Fix verify_signature url-safe pubkey decode
  • 5d9ad1c [agent_loop] lifecycle logs + cross-source serialization regression test
  • c14d7c6 docs: 76-MIND-STARVATION-AGING — future work, not scheduled
  • 35b4e8e Release v2026.05.20.1

Full diff: v2026.05.20...v2026.05.20.1