You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: batch 2 — resolve 9 more verified bugs (RED/GREEN)
Validated with failing RED tests (previous commit) that now pass. Full
suite, -race on changed packages, golangci-lint all green.
cmd/odek:
- shell: the sandbox kill follow-up now runs under a 10s deadline — a hung
Docker daemon can no longer wedge the tool call forever after its own
timeout fired
- serve_api: /api/sessions search scans the whole index before paginating;
matches deeper in recency order than limit+offset were silently dropped
- serve: prompt-cancel registrations are generation-guarded — when two
prompts run on one session, the first finisher no longer deletes the
live prompt's cancel func (registerPromptCancel returns an unregister
closure; legacy helper kept)
- repl: tab-completion list is now the single source of truth synced with
handleREPLCommand (/sandbox /model /session were advertised but unknown)
- subagent: task errors exit 1 and timeouts exit 2 per docs/EXTENSIONS.md;
previously every outcome exited 0 after startup succeeded (typed
subagentRunError mapped in dispatch; failure line replaces the ✅ banner)
internal/loop:
- skill/episode/extended-memory blocks are injected right BEFORE the
latest user message as documented; the old scan skipped index 0 and
appended after it. headLen gains ctxLeadDroppableFrom so injected blocks
stay trimmable (oversized injection still dropped pre-call, pinned by
TestTrimContext_PostInjectionBudget) while base system + memory remain
protected for prompt caching
- emitSignal serializes handler invocation: parallel tool heartbeats fire
from separate goroutines, and SignalHandler consumers are only promised
non-blocking, never concurrent-safe
internal/render:
- FirstSentence picks the EARLIEST sentence boundary instead of iterating
separator types ('Done! Next step.' returned the second sentence)
internal/telegram:
- GetOrCreate evicts an expired cache entry before Load; TTL expiry was
dead code because Load returned the same stale pointer unchecked
Hardening (no dedicated RED):
- events/jsonl: OpenJSONLSink opens with O_NOFOLLOW, closing the
Lstat-then-open symlink swap race
- mcpclient: child stderr is actually inherited (os.Stderr); nil connects
to /dev/null, contradicting the comment and hiding server diagnostics
Investigated and rejected: base64 decode-of-inline-string returning
unwrapped content — decode input is model-supplied tool args, not fresh
external data; there is also no decode-from-path feature to wrap.
0 commit comments