fix: stream usa ultimo frame + playground artifact_probe

- streamAnswer: el result final es el ULTIMO answer parseado (frame post-idle,
  limpio) en vez del mas largo, que podia ser un frame intermedio con spinner.
- playground/artifact_probe.go: herramienta de auditoria que corre oneshot +
  stream contra varios prompts, detecta artefactos del render que se cuelan
  (box chars, status bar, spinner, palabras pegadas, prompt echo) y verifica
  consistencia del streaming (concat de deltas == result). Opcional --ref para
  comparar con claude -p real. No se indexa (playground del padre).

El fix del spinner en si vive en parse_claude_tui_go_tui (repo padre): detecta
la linea de carga por estructura (glyph + palabra + ellipsis) y firma
((Ns tokens) / esc to interrupt), no por la palabra, que cambia cada frame.
This commit is contained in:
agent
2026-06-03 23:37:39 +02:00
parent 4574f08a22
commit 22bec25d8d
4 changed files with 335 additions and 3 deletions
+5 -3
View File
@@ -200,9 +200,11 @@ func streamAnswer(ctx context.Context, bin string, inputs []string, warmup, step
}
prev = ans
}
// Keep the longest answer seen as the final, even if a later frame shrank
// (transient reflow / parse noise).
if len(ans) >= len(final) {
// The final result is the LAST non-empty parsed answer. The last snapshot is
// emitted after idle (generation stopped), so it is the cleanest frame — no
// active spinner, fully rendered. Using "longest seen" instead would let a
// noisy mid-generation frame win over the clean final one.
if ans != "" {
final = ans
}
}