From 0f7c0f67c7584c70e8cb4fa962d4d305174e76a6 Mon Sep 17 00:00:00 2001 From: guigerdts Date: Tue, 25 Aug 2026 10:11:07 +0000 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20honest=20disclaimer=20+=20tra?= =?UTF-8?q?nsparency=20levers=20on=20Mis=20N=C3=BAmeros=20(PM-09/EV-16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace obsolete pipeline description (ml/dl/backtesting/rank/select) with the real stats -> probability F5 -> generate chain - Stronger Spanish disclaimer: F5 + cold-coverage boost, odds unchanged - New Transparencia section: F5, cold boost, and EV note (levers, not odds) - Relabel combo 'Score' -> 'Peso' (coverage weight, not win probability) --- frontend/src/pages/MisNumeros.test.tsx | 8 +++--- frontend/src/pages/MisNumeros.tsx | 36 ++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/frontend/src/pages/MisNumeros.test.tsx b/frontend/src/pages/MisNumeros.test.tsx index a483cba..f5e6a21 100644 --- a/frontend/src/pages/MisNumeros.test.tsx +++ b/frontend/src/pages/MisNumeros.test.tsx @@ -204,7 +204,7 @@ describe("Mis Números page", () => { ).not.toBeInTheDocument(); // Page stays interactive: CTA re-enabled and disclaimer still visible. expect(screen.getByRole("button", { name: /generate numbers/i })).toBeEnabled(); - expect(screen.getByText(/remain/i)).toBeInTheDocument(); + expect(screen.getByText(/completamente aleatorios/i)).toBeInTheDocument(); }); it("labels every ticket as valid for both draws and offers no toggle (R3)", async () => { @@ -255,13 +255,13 @@ describe("Mis Números page", () => { selectLottery(); render(); - expect(screen.getByText(/statistically informed/i)).toBeInTheDocument(); + expect(screen.getByText(/completamente aleatorios/i)).toBeInTheDocument(); fireEvent.click(screen.getByRole("button", { name: /generate numbers/i })); await screen.findByRole("table", { name: /generated combinations/i }); - expect(screen.getByText(/statistically informed/i)).toBeInTheDocument(); - expect(screen.getByText(/random/i)).toBeInTheDocument(); + expect(screen.getByText(/completamente aleatorios/i)).toBeInTheDocument(); + expect(screen.getByText(/aleatorios/i)).toBeInTheDocument(); }); it("prompts to select a lottery with a disabled CTA when none is chosen", async () => { diff --git a/frontend/src/pages/MisNumeros.tsx b/frontend/src/pages/MisNumeros.tsx index bb0f7bc..facd509 100644 --- a/frontend/src/pages/MisNumeros.tsx +++ b/frontend/src/pages/MisNumeros.tsx @@ -16,7 +16,7 @@ const IDLE_HINT = "Click Generate numbers to run the full analysis chain and bui /** Owner decision: every ticket is valid for BOTH draws; no toggle exists. */ const DUAL_DRAW_LABEL = "Un boleto, dos sorteos (Baloto + Revancha)"; const DISCLAIMER_TEXT = - "Combinations are statistically informed by historical draws, but official draws remain completely random: no method improves prediction odds and no outcome is promised."; + "Los números se generan a partir de la frecuencia histórica (F5) y un refuerzo de números fríos para mejorar la cobertura. Los sorteos oficiales son completamente aleatorios: ningún método mejora la probabilidad de acierto y ningún resultado está garantizado."; /** Default combination count sent in the payload (R4/D11). */ const DEFAULT_COUNT = 5; const BUTTON_CLASS = @@ -39,8 +39,12 @@ const combinationColumns: DataColumn[] = [ }, { key: "score", - label: "Score", - render: (row) => row.score?.toFixed(2) ?? "—", + label: "Peso", + render: (row) => ( + + {row.score?.toFixed(2) ?? "—"} + + ), }, ]; @@ -181,8 +185,8 @@ export default function MisNumeros() {

Mis Números

- One request runs stats → features → ml → dl → backtesting → rank → select → generate for - the selected lottery. + Una solicitud calcula la frecuencia histórica (estadísticas + probabilidad F5) y genera + combinaciones con cobertura reforzada para el sorteo seleccionado.