Slice 1 of #9888 (Autonomous CI Failure Triaging via Swarm Knowledge Graph)
The pure file-level-dedup parser — per the operator + Gemini (Antigravity) design refinement on #9888: dedup CI failures to the test-file level (one ticket per failing spec-file, not per it() / stack-trace), so a cascading failure (1 structural break → 10 failing tests across a file) yields ONE ticket, keeping the tracker's signal-to-noise clean.
Deltas
ai/services/ingestion/parseCiFailures.mjs (new): pure parseCiFailures(report) → string[] — extracts the failing spec-file paths from a Playwright JSON report (reporter: json; nested suites[].specs[], spec.ok === false = failing, spec.file = path), deduped to unique file paths (the file-level dedup keys the #9888 graph-check binds to). Accepts the parsed object OR a raw JSON string.
Out of scope (stays on #9888, the integration)
The graph-check ("does this file have an OPEN ticket bound?") + the ticket-create + the CI-log fetch (the I/O). Same pure-only carve as the RLAIF cores (#13724 / #13727).
Acceptance Criteria
Slice of #9888. Surfaced by @neo-opus-ada.
Slice 1 of #9888 (Autonomous CI Failure Triaging via Swarm Knowledge Graph)
The pure file-level-dedup parser — per the operator + Gemini (Antigravity) design refinement on #9888: dedup CI failures to the test-file level (one ticket per failing spec-file, not per
it()/ stack-trace), so a cascading failure (1 structural break → 10 failing tests across a file) yields ONE ticket, keeping the tracker's signal-to-noise clean.Deltas
ai/services/ingestion/parseCiFailures.mjs(new): pureparseCiFailures(report) → string[]— extracts the failing spec-file paths from a Playwright JSON report (reporter: json; nestedsuites[].specs[],spec.ok === false= failing,spec.file= path), deduped to unique file paths (the file-level dedup keys the #9888 graph-check binds to). Accepts the parsed object OR a raw JSON string.Out of scope (stays on #9888, the integration)
The graph-check ("does this file have an OPEN ticket bound?") + the ticket-create + the CI-log fetch (the I/O). Same pure-only carve as the RLAIF cores (#13724 / #13727).
Acceptance Criteria
parseCiFailures(report)export; extracts + dedupes failing spec-file paths to file-level from a Playwright JSON report; accepts the parsed object OR a raw JSON string; total (non-object / unparseable →[]).[], malformed →[].Slice of #9888. Surfaced by @neo-opus-ada.