Files
correx/HANDOFF-sonnet.md
T
kami ae0b23df3f chore: sprint handoffs + Lsp4j runner live-proof
Add per-agent sprint handoff docs (Sonnet/Codex/opencode) mapping the
1-week sprint's two goals to concrete Vikunja tasks. Kept in repo root
(docs/ is gitignored). Includes hanging Lsp4jDiagnosticsRunner change +
its live-proof test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rdo9fe7SujNVeyZA8YkpkD
2026-07-21 00:36:25 +04:00

37 lines
3.5 KiB
Markdown

# Handoff — Sonnet
**Sprint goal focus:** Freestyle runs survive & gates bite (Goal 1) + one hard resilience feature (Goal 2).
You get the router/orchestrator brain-surgery — cross-module, judgement-heavy, easy to get subtly wrong.
Read the full task body in Vikunja (project 4) before starting each — `mcp__vikunja__get_task_details <id>`.
Mark each **Doing** on start, and **commit green work referencing the task #** when done.
## Tasks
### #299 — Single provider death → unrecoverable session kill
A retryable provider connection drop collapses into a hard `NoEligibleProvider` abort that fails the WHOLE session.
On a retryable inference failure, tolerate a briefly-absent provider (bounded wait/backoff for the capability) before declaring terminal. Distinguish "provider temporarily down" from "capability never configured".
Files: `CapabilityAwareRoutingStrategy.kt:31`, `DefaultInferenceRouter.kt:54`, `ServerModule.runSession` (the catch that fails the session), SessionOrchestrator retry path.
### #300 — HealthMonitor detects provider loss ~18s too late
Same incident as #299. Health status must GATE routing/retry, not just log reactively. Mark a provider unhealthy immediately on the connection drop (event-driven), and have the retry consult health + wait for recovery.
**Do #299 first — #300 completes the health-gating half.**
### #297 — Analyst CoT indecision loop burns full budget, emits nothing
Analyst maxed 16384 reasoning tokens and emitted an empty artifact because the request maps to a PARENT epic, not a single task, and the DoD prompt says "the single task this run owns" → endless oscillation.
Primary fix: pre-resolve which task the run owns before the analyst, OR make the DoD prompt explicit ("define the DoD for the epic as a whole; do NOT pick a child"). Optional backstop (can be a separate task): reasoning-token soft cap.
### #263 + #267 — Auto build-gate never fires on real freestyle scaffold
The terminal build gate produced ZERO `StaticAnalysisCompleted` events across a 60-file run. Root cause traced in the ticket: writes-based terminal-stage selection can't pick a non-writing REVIEW terminal stage, and the last writing stage's build gate is shadowed by its own contract gate short-circuiting.
Fix direction: attach the auto build-gate to the last WRITING stage, or run it as a workflow-terminal check on the `done` transition independent of per-stage autoBuildGate. Reconcile code (per-stage writes filter) vs comment (terminal-only) — they disagree today.
**#267 is the settle-it-live half: one live run confirms the gate fires. Do them together.**
**Depends on #191 (Codex) landing** — the gate fires into missing `node_modules` without `setup=npm ci`. Coordinate so your live run goes green.
### #301 — Escalate repeated scope/manifest write-block to user approval (Goal 2)
After N same-path scope/manifest rejections (config `escalate_scope_after_n`, default 3), stop rejecting: reach back to the FIRST rejected invocation's pristine write args in the event log, present via the existing approval/pause flow, approve→widen scope + execute, reject→continue. No branching/replay-engine — plain forward event-log read.
Wiring pointers in the ticket: `SessionOrchestratorToolExec.kt` ~234-282 (BLOCK branch) and ~284-422 (existing approval flow + `OutsidePathAccessGrantedEvent` widen-and-execute template).
**This is the natural carry-over if the lane is over-full — it's a feature, not a run-killer.**
## Sequencing
299 → 300 (same owner). 263/267 needs 191 (Codex) landed first.