airvzxf / airvzxf/moodle-quiz-extractor
feat(diagnostics): two-tier diagnostic ring buffer + safe report
- Langage dominant
- TypeScript
- Étoiles
- 0
- Forks
- 0
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
## Resumen
Diagnóstico two-tier de solo código, sin contenido del usuario:
- Ring buffer 200 por pestaña en `storage.session` (TTL 30 min),
reusando exactamente el patrón de `PopupSessionStore`/`JobStore`.
- Eventos con schema Zod cerrado: `{ stage, code, questionNumber? }`.
Sin timestamp, sin tabId, sin URL, sin título, sin mensaje, sin jobId.
Sin strings libres (enums cerrados de stage y códigos `MQX-*`).
- Background estampa timestamp y deriva tabId del `sender.tab`.
Mutaciones serializadas por pestaña (cola por tabId).
- Safe report: solo {schemaVersion, generatorVersion, manifestVersion,
counts por stage/código, secuencia {stage, code}} SIN timestamp
exacto, SIN tabId, SIN originHash, SIN título. Doble gate de
canarios antes de serializar.
- Pestaña 'Diagnóstico' del popup habilitada. UI: botón 'Ver reporte
(safe, local)' que llama al background y muestra el snapshot.
- Sin red: el reporte vive solo en el popup (no se envía a ningún
servidor). Cero permisos nuevos, cero telemetría.
## Módulos
### `src/diagnostics/diagnostics-types.ts` (NUEVO)
Enums cerrados para stage y códigos (subset curado de `MQX`).
### `src/diagnostics/logger.ts` (NUEVO)
`RingBufferLogger` puro, ring 200, snapshot inmutable.
### `src/diagnostics/safe-report.ts` (NUEVO)
`buildSafeReport(snapshot, generatorVersion, manifestVersion)`
aplica Zod + canary-gate.
### `src/background/diagnostics-store.ts` (NUEVO)
`DiagnosticsStore` espejado de `PopupSessionStore`, clave
`mqx:diag:`, TTL 30 min.
### `src/messaging/runtime-messages.ts` (extendido)
+3 schemas: `logEvent`, `collectDiagnostics`, `safeReportResult`.
Retro-compatibles (`safeParse`).
### `src/entrypoints/background.ts`
Handlers `logEvent` (background-only, no devuelve nada) y
`collectDiagnostics` (devuelve SafeReport).
### `src/entrypoints/content.ts`
Emite eventos code-only en extract / parse / fill / blocked.
### `src/entrypoints/popup.html`
Habilita `#tab-diagnostics`; sustituye placeholder por UI real.
### `src/popup/main.ts`
`wireDiagnostics()` + botón 'Ver reporte (safe, local)'.
### Tests (NUEVOS)
- `tests/unit/diagnostics-types.spec.ts`
- `tests/unit/logger.spec.ts`
- `tests/unit/safe-report.spec.ts`
- `tests/unit/diagnostics-store.spec.ts`
- `tests/security/diagnostics-redaction.spec.ts`
## Validación
- `pnpm compile`: limpio.
- `pnpm test`: verde.
- `pnpm lint:ext`: solo los 2 warnings `DANGEROUS_EVAL` preexistentes.
- `pnpm redact`: limpio.
- Smoke manual: ver 'Ver reporte' tras un extract; verificar que el
snapshot solo contiene códigos.
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Évaluation
Cette issue n'a pas encore été évaluée.