fix: ревьюер не извлекал вердикт из NDJSON-потока → всегда двойной запуск и failed
All checks were successful
CI / test (push) Successful in 47s
CI / build-and-package (amd64, linux) (push) Successful in 41s
CI / build-and-package (amd64, windows) (push) Successful in 53s

parseReviewVerdict брал первую { и последнюю } из всего stdout и парсил
как один JSON, а stdout ревьювера — это NDJSON-поток opencode (несколько
событий). JSON никогда не парсился → v==nil → reviewWithRetry делал
повтор (вторая сессия ревьюера) → verdict nil → StatusFailed.

Приведено к пути аналитика: opencode.ExtractVerdict достаёт текст
вердикта из NDJSON, затем parseReviewVerdict парсит чистый JSON.
+ регрессионный тест TestWorkerReviewNDJSONPass (verdict внутри
text-парта, проверка single run без retry).
This commit is contained in:
Hermes
2026-08-17 14:54:55 +05:00
parent 262c3a0c1c
commit bb9f0bdc43
2 changed files with 63 additions and 1 deletions

View File

@@ -7,6 +7,7 @@ import (
"path/filepath"
"strings"
"github.com/kamelion/ratatoskr-go/internal/opencode"
"github.com/kamelion/ratatoskr-go/internal/storage"
)
@@ -80,7 +81,10 @@ func (w *Worker) runReviewer(ctx context.Context, taskID int64, cwd, prompt stri
output := res.Stdout
var v *reviewVerdict
if res.RC == 0 {
pv, perr := parseReviewVerdict(output)
// Как у аналитика: сначала достаём текст вердикта из NDJSON-потока opencode
// (ExtractVerdict), затем парсим уже чистый JSON-объект.
verdict := opencode.ExtractVerdict(output)
pv, perr := parseReviewVerdict(verdict)
if perr == nil {
v = pv
}