## [2026-05-15T17:44:39.950Z]
Phase 2: split cli-base.ts from cli/llm/providers into standalone node. Type: llm-subprocess-base (base class for subprocess-based LLM providers).
## [2026-05-26T08:03:07.256Z]
Migrate cli-base.ts to errorSource enum mirroring sibling provider files.
## [2026-05-29T20:38:46.544Z]
The CLI reviewer provider now drains the child process's stderr stream (an unread stderr pipe can deadlock the child once its buffer fills on verbose output), and the default per-call subprocess timeout was raised from 120s to 300s. A large node's per-aspect prompt — many source files plus references — can legitimately take roughly 100 to 300 seconds to review through a CLI-spawned model; the old 120s ceiling sat right at that boundary, so big-node reviews intermittently exceeded it and surfaced as a spurious 'Reviewer unavailable'. Keeping nodes small is the durable fix; the higher default just removes the boundary flakiness, and the timeout remains tunable per tier.
## [2026-05-31T11:21:39.355Z]
A reviewer reply that cannot be parsed into a structured verdict must not be guessed at. The earlier behavior fell back to a natural-language heuristic: if an unparseable reply happened to contain the word that signals approval, it was treated as a passing code verdict — so a garbled or truncated response could silently approve unverified code. An unparseable response is now classified as a provider (infrastructure) error rather than a code verdict, so the approval fails closed instead of passing on noise.
## [2026-05-31T11:37:24.353Z]
The parsing of a reviewer's reply into a structured verdict was strengthened in two complementary ways. First, an unparseable reply is no longer guessed at with a natural-language heuristic — a garbled response that merely contains the word signalling approval must not become a passing code verdict, so it is classified as a provider (infrastructure) error and the approval fails closed. Second, extracting the JSON verdict from a reply that wraps it in prose must not greedily span unrelated brace characters: a verbose reviewer may precede its verdict with markdown analysis and code snippets that themselves contain braces, so the extractor now locates the balanced object that carries a boolean approval field, scanning for the actual verdict rather than the outermost braces. A reply with brace-laden prose but no real verdict object still yields nothing and fails closed, preserving the no-false-pass guarantee.
## [2026-06-03T07:05:36.403Z]
The subprocess provider base no longer passes a max-tokens output limit to the underlying CLI. That limit was part of the retired truncation path and would otherwise risk clipping a reviewer response now that nodes are reviewed in one piece.
