Skip to content

Backlog: backend WS/security hardening + frontend dashboard Wave 1#129

Open
cardosofede wants to merge 28 commits into
mainfrom
improvements/frontend-wave-1
Open

Backlog: backend WS/security hardening + frontend dashboard Wave 1#129
cardosofede wants to merge 28 commits into
mainfrom
improvements/frontend-wave-1

Conversation

@cardosofede

Copy link
Copy Markdown
Contributor

Resumen

Este branch acumula trabajo de backlog auditado y shippeado en varias tandas. Reúne 28 commits en tres bloques:

1. Backend / Telegram bot (ya shippeado, scope improvements/backend/)

Fixes de correctness, seguridad y performance auditados y cerrados:

  • CORR-001 usar _executor_tasks en _on_data_update (AttributeError en runtime)
  • CORR-002 sincronizar dicts _stopping_* con threading.Lock
  • CORR-003 delete_user_preference persiste el borrado
  • SEC-006 validar callback select contra allowed_values en api_keys
  • SEC-007 control de acceso y anti-enumeración en /servers/{name}/status
  • SEC-008 @restricted en handle_all_text_input
  • SEC-009/010 WEB_JWT_SECRET dedicado + hardening del one-time login token
  • PERF-004 batch eviction en candle buffer · PERF-005 asyncio.gather en refresh de historial
  • ARCH-011..014 dedup de helpers (gateway/network/format) · READ-015..018 varios

2. Backlog (organización)

  • Reorganización del backlog por dominio: general → improvements/backend/
  • Auditoría del WS dashboard (condor/web): 8 items SEC-019..READ-026
  • Tracking del backlog improvements/frontend/ (47 items del dashboard React)

3. Frontend dashboard — Wave 1 (9 items, scope improvements/frontend/)

Primera tanda de mejoras del dashboard React, cada una en su propio commit:

Item Cambio
SEC-016 sandbox="allow-scripts allow-popups" en el iframe de reports (ReportBrowser)
SEC-046 mismo sandbox en ReportViewer (segunda instancia del sink same-origin)
SEC-036 encodeURIComponent en URLs de /api/v1/servers/* (lib/api.ts)
CORR-006 alinear el queryKey del WS con ["executors-infinite", server] (la lista no actualizaba en vivo)
CORR-027 SelectField ya no pisa un valor persistido ausente de las opciones actuales
CORR-028 React key de fila de controller usa controller_id (evita colisiones de reconciliación)
PERF-023 React.memo en ChatMessageView (no re-parsear markdown en cada token del stream)
CORR-041 AgentPnlChart actualiza la serie con seriesRef + efecto [data] (antes se congelaba tras el mount)
CORR-045 candle-store evicta LRU saltando colecciones activas (antes abortaba en la primera)

Verificación (Wave 1 frontend)

  • tsc -b — limpio (exit 0)
  • eslint — sin errores nuevos vs. baseline (114 preexistentes, 0 añadidos en archivos tocados)
  • vite build — exit 0

Notas para review

  • SEC-036 es el cambio más amplio (~134 líneas en lib/api.ts): conviene smoke test de páginas de trading/portfolio/bots.
  • CORR-041 removió el guard if (data.length === 0) return null de AgentPnlChart (los consumidores ya gatean el mount con data no trivial; el guard causaba un self-unmount latente).
  • SEC-016/046: confirmar que los reports Plotly/markdown siguen renderizando bajo el sandbox.

🤖 Generated with Claude Code

cardosofede and others added 28 commits June 10, 2026 19:38
El bloque EXECUTORS de WebSocketManager._on_data_update referenciaba
self._executor_ws_tasks, atributo que nunca se define (el __init__ declara
_executor_tasks). Al llegar data de tipo EXECUTORS por el WS se lanzaba
AttributeError, crasheando el procesamiento. Se renombra a _executor_tasks,
que es el dict real de tareas de stream de executors.

Cierra CORR-001 del backlog improvements/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…oso en ws_manager (PERF-004, READ-015, READ-017)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…o en config_manager (CORR-003, READ-016)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… (CORR-002)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…oop del portfolio web (PERF-005)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…006)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(SEC-007)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…EC-009, SEC-010)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ntes de estado del portfolio (ARCH-011, ARCH-014, READ-018)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… en utils/telegram_formatters (ARCH-012, ARCH-013)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Anota los commits de cada item implementado en paralelo y los mueve a
improvements/done/. Items: PERF-004/005, CORR-002/003, SEC-006..010,
ARCH-011..014, READ-015..018.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…EC-019..READ-026

Auditoría multi-agente de condor/web (FastAPI + WebSocket). 18 hallazgos
confirmados deduplicados a 8 items atómicos: SEC-019 (acceso por servidor en
subscribe WS), PERF-020 (broadcast gather), CORR-021/023/024 (tasks huérfanos,
logging de broadcast, snapshot de conexiones), ARCH-025 (dedup lifecycle),
READ-026 (helper has_subscribers). CORR-022 se cierra en el commit siguiente.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
El bare `except Exception: pass` en websocket_endpoint() tragaba en silencio
todo error no-WebSocketDisconnect de handle_message() (subscribe/backfill de
candles, polling REST, SDS, arranque de streams). Se reemplaza por
`log.exception(...)` siguiendo la convención de chat_ws.py, preservando la
semántica de no-crashear (sin re-raise; el finally sigue desconectando).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…provements/backend/

Espeja la estructura de improvements/frontend/: el backlog Python (bot Telegram,
core y API web condor/web) pasa de improvements/{todo,done}/ a
improvements/backend/{todo,done}/. Se preservan los IDs/NNN (001-026) para no
romper la trazabilidad commit↔item: los mensajes de commit referencian IDs como
CORR-022 que no cambian. Añade backend/README.md y actualiza el README raíz para
documentar los scopes por dominio.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
El scope frontend/ (47 items todo + README) existía en disco pero nunca se había
commiteado. Se incorpora para que el backlog por dominios quede completo y
versionado junto al scope backend/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-027)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… (PERF-023)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant