Two related issues from the v1.0.177 review:
1. Daemon adoption / osa stop can cross workspaces. bin/osa:239-257 decides adoption purely on _http_ok "http://localhost:${_ws_port}/health". A healthy daemon belonging to a different workspace can be adopted, and osa stop can kill it. The health probe does not verify the responding daemon's working directory.
Fix: have /health report the daemon's working directory and require it to match before adopting or stopping.
2. Ungated triage LLM call in goal sessions. goal_verifier.ex:384 maybe_wait_for_user/2 runs a triage LLM call on every text answer in a goal session. Unlike maybe_gate/1 — which is guarded by activated?, skip_reason (run cap, stalled, no work, trivial turn) and GoalTracker.reverify_due? — this path fires whenever enabled? and goal_loop? and continue?. Every zero-tool-call generation during a goal pays an extra provider round-trip, bounded by @default_triage_timeout_ms 30_000.
Combined with #241, a single misclassification by the cheap triage model ends the turn, hides the answer, and loses it from history.
Shipped knowingly in v1.0.177.
Two related issues from the v1.0.177 review:
1. Daemon adoption /
osa stopcan cross workspaces.bin/osa:239-257decides adoption purely on_http_ok "http://localhost:${_ws_port}/health". A healthy daemon belonging to a different workspace can be adopted, andosa stopcan kill it. The health probe does not verify the responding daemon's working directory.Fix: have
/healthreport the daemon's working directory and require it to match before adopting or stopping.2. Ungated triage LLM call in goal sessions.
goal_verifier.ex:384maybe_wait_for_user/2runs a triage LLM call on every text answer in a goal session. Unlikemaybe_gate/1— which is guarded byactivated?,skip_reason(run cap, stalled, no work, trivial turn) andGoalTracker.reverify_due?— this path fires wheneverenabled? and goal_loop? and continue?. Every zero-tool-call generation during a goal pays an extra provider round-trip, bounded by@default_triage_timeout_ms 30_000.Combined with #241, a single misclassification by the cheap triage model ends the turn, hides the answer, and loses it from history.
Shipped knowingly in v1.0.177.