p07

Refactor (dedup 3 funciones)

Behavior matrix entry. Mini repo con avgPrices, avgScores, avgDurations (codigo casi identico).

Severidad: OK · Dedup + 14 tests + CHANGELOG. Tier=frontier.

Pedido literal al chat

Las funciones avgPrices, avgScores y avgDurations son
practicamente identicas. Deduplica las tres en una sola funcion generica + 3
wrappers de back-compat. Manten todos los tests verde + agregalos si te parece
que falta cobertura. Documenta el cambio.

Comportamiento esperado

Deduplicar en una funcion generica + 3 wrappers back-compat. Tests verdes y eventualmente expandir cobertura. Documentar.

Comportamiento real (Forge 0.2.0-alpha.59z.156)

Wall-clock96.3s
SSE statusturn_complete
Eventos SSE2
Tool rounds reportados0
Brain tierfrontier (phase=phase_i, escalated=false)
Modelo finalclaude-opus-4-7
Tokens in / out469878 / 5229
Workspace diff+2 / ~2 / -0
CHANGELOG.md, yujin.forge.json, M:src/lib.mjs, M:src/lib.test.mjs

Respuesta de Forge (texto del chat)

Listo. Resumen:

- **Deduplicado**: `src/lib.mjs` ahora tiene una unica `avg(values)` y los tres nombres viejos quedan como aliases (`export const avgPrices = avg`, idem scores/durations). Cero cambios de API publica.
- **Tests**: pasaron de 4 a **14 verdes**. Agregue cobertura para la generica, edge cases (`null`, `undefined`, no-array, strings numericos, singleton), vacios para scores/durations, y un test de identidad que garantiza que los wrappers comparten la misma funcion (asi no se rompe back-compat sin que nadie se entere).
- **Documentado**: nuevo `CHANGELOG.md` en la raiz con la explicacion del refactor.

Si despues queres responder las dos preguntitas iniciales (responsive vs mobile/desktop, didactico vs tecnico), las guardo en la config del panel.

Gap detectado

Dedup + 14 tests + CHANGELOG. Tier=frontier.

Reports raw

Documento generado automaticamente por generate_landing.mjs el 2026-06-06 17:42:49. Cada prueba corre con yf chat --provider claude-code-cli contra Claude Max subscription (no API), $0 marginal a Console.