131 lines
3.2 KiB
Markdown
131 lines
3.2 KiB
Markdown
# ABE — Output Format Specification
|
|
|
|
Cada anomalía genera DOS archivos en `reports/{anomaly-id}/`:
|
|
|
|
---
|
|
|
|
## 1. report.json — Para consumo por AI y tooling
|
|
```json
|
|
{
|
|
"version": "1.0",
|
|
"generated_at": "2025-01-15T10:30:00.000Z",
|
|
"environment": {
|
|
"target_url": "http://localhost:3000",
|
|
"abe_version": "0.1.0",
|
|
"os": "linux",
|
|
"node_version": "20.x"
|
|
},
|
|
"anomaly": {
|
|
"id": "anom_a1b2c3d4",
|
|
"type": "http_error",
|
|
"severity": "high",
|
|
"description": "Form submission returns HTTP 500 on empty email field",
|
|
"timestamp": 1705312200000
|
|
},
|
|
"reproduction": {
|
|
"seed": 42,
|
|
"steps": [
|
|
{
|
|
"step": 1,
|
|
"action_type": "navigate",
|
|
"url": "http://localhost:3000/register",
|
|
"timestamp": 1705312195000
|
|
},
|
|
{
|
|
"step": 2,
|
|
"action_type": "fill",
|
|
"selector": "input[name='email']",
|
|
"value": "",
|
|
"timestamp": 1705312196000
|
|
},
|
|
{
|
|
"step": 3,
|
|
"action_type": "click",
|
|
"selector": "button[type='submit']",
|
|
"timestamp": 1705312197000
|
|
}
|
|
]
|
|
},
|
|
"evidence": {
|
|
"screenshot": "screenshot.png",
|
|
"dom_snapshot": "dom.html",
|
|
"http_log": [
|
|
{
|
|
"url": "http://localhost:3000/api/register",
|
|
"method": "POST",
|
|
"status": 500,
|
|
"duration_ms": 234
|
|
}
|
|
],
|
|
"console_errors": [],
|
|
"js_exceptions": []
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 2. report.md — Para lectura humana
|
|
|
|
El archivo Markdown debe tener exactamente esta estructura:
|
|
```markdown
|
|
# Bug Report — [tipo de anomalía] — [fecha]
|
|
|
|
## Summary
|
|
[Una frase describiendo qué pasó y dónde]
|
|
|
|
## Severity
|
|
[low | medium | high | critical] — [justificación en una frase]
|
|
|
|
## Reproduction Steps
|
|
|
|
1. Navigate to `[url]`
|
|
2. [acción 2]
|
|
3. [acción 3]
|
|
...
|
|
|
|
**Seed used**: `42`
|
|
**Replay command**: `npm run replay -- --report reports/anom_a1b2c3d4/report.json`
|
|
|
|
## Observed Behavior
|
|
[Qué ocurrió exactamente — errores, respuestas HTTP, mensajes]
|
|
|
|
## Evidence
|
|
- Screenshot: `reports/anom_a1b2c3d4/screenshot.png`
|
|
- DOM Snapshot: `reports/anom_a1b2c3d4/dom.html`
|
|
- HTTP Log: [tabla con las requests relevantes]
|
|
|
|
## Raw Errors
|
|
\`\`\`
|
|
[errores textuales tal cual aparecieron]
|
|
\`\`\`
|
|
```
|
|
|
|
---
|
|
|
|
## Estructura de carpetas de salida
|
|
```
|
|
reports/
|
|
└── anom_a1b2c3d4/
|
|
├── report.json ← estructurado para AI
|
|
├── report.md ← legible para humanos
|
|
├── screenshot.png ← captura en el momento de la anomalía
|
|
└── dom.html ← snapshot completo del DOM
|
|
|
|
logs/
|
|
└── session_20250115_103000.jsonl ← una línea JSON por evento
|
|
```
|
|
|
|
---
|
|
|
|
## Formato del log de sesión (.jsonl)
|
|
|
|
Cada línea es un objeto JSON independiente:
|
|
```jsonl
|
|
{"event":"session_start","timestamp":1705312190000,"seed":42,"target":"http://localhost:3000"}
|
|
{"event":"state_discovered","timestamp":1705312191000,"state_id":"s_abc123","url":"/","title":"Home"}
|
|
{"event":"action_executed","timestamp":1705312196000,"action_id":"act_xyz","type":"fill","selector":"input[name='email']","value":""}
|
|
{"event":"anomaly_detected","timestamp":1705312197000,"anomaly_id":"anom_a1b2c3d4","type":"http_error","severity":"high"}
|
|
{"event":"session_end","timestamp":1705312210000,"states_visited":3,"anomalies_found":1}
|
|
```
|