Problem
Tutorials that fail pre-publish validation are quarantined by scripts/validate-tutorials.ts, which renameSyncs the offending .md into .tutorial-cache/quarantine/ and writes errors.json, then exits 0. This directory lives only on the ephemeral GitHub Actions runner for rebuild-content.yml and is discarded when the run ends. Nothing consumes errors.json; there is no alert and no Admin UI surface. The quarantine is effectively write-only garbage.
Consequence: a tutorial can silently drop out of the ACTIVE content snapshot (and 404 on PROD) with no durable record of why. Confirmed live for btp-transport-management-cpi-01-use-case (0 steps after sap-tutorials/Tutorials#24233) and private-link-gcp (0 steps), among others.
Ask
Store quarantine results centrally in the DB and expose them in the Admin UI so they aren't lost.
Acceptance criteria
Context / pointers
scripts/validate-tutorials.ts — the gate (never exits non-zero; writes errors.json at .tutorial-cache/quarantine/).
.github/workflows/rebuild-content.yml — runs npm run validate-tutorials.
- Carry-forward of unchanged slugs between content versions masks these failures until a full rebuild drops the quarantined slug (see also the "pre-publish validators silently broken, hidden by carry-forward" known failure mode).
Related: #2 (Admin Rebuild loses these errors silently), #3 (PROD serve-time 404s).
Problem
Tutorials that fail pre-publish validation are quarantined by
scripts/validate-tutorials.ts, whichrenameSyncs the offending.mdinto.tutorial-cache/quarantine/and writeserrors.json, then exits 0. This directory lives only on the ephemeral GitHub Actions runner forrebuild-content.ymland is discarded when the run ends. Nothing consumeserrors.json; there is no alert and no Admin UI surface. The quarantine is effectively write-only garbage.Consequence: a tutorial can silently drop out of the ACTIVE content snapshot (and 404 on PROD) with no durable record of why. Confirmed live for
btp-transport-management-cpi-01-use-case(0 steps after sap-tutorials/Tutorials#24233) andprivate-link-gcp(0 steps), among others.Ask
Store quarantine results centrally in the DB and expose them in the Admin UI so they aren't lost.
Acceptance criteria
QuarantineEventsentity) capturing, per quarantined slug per build:slug,reason,sourceRepo,contentVersion/manifestVersion,runId/workflowUrl,createdAt.validate-tutorials.ts(or the workflow step) writes these rows to HANA via an authenticated endpoint instead of (or in addition to) the throwawayerrors.json.Context / pointers
scripts/validate-tutorials.ts— the gate (never exits non-zero; writeserrors.jsonat.tutorial-cache/quarantine/)..github/workflows/rebuild-content.yml— runsnpm run validate-tutorials.Related: #2 (Admin Rebuild loses these errors silently), #3 (PROD serve-time 404s).