fix: ревьюер не извлекал вердикт из NDJSON-потока → всегда двойной запуск и failed
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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user