{
  "feature_id": "F-141",
  "agent": "qa",
  "stage": "qa_gate",
  "verdict": "APPROVED",
  "reviewed_at": "2026-08-21T20:03:00Z",
  "summary": "La regresión está cubierta: el customer frontend compila con la URL del backend inaccesible, genera el manifest y clasifica las páginas dependientes del API como dinámicas. Las otras aplicaciones y backend siguen verdes.",
  "acceptance_traceability": [
    {"criterion":"No workspace-root warning in frontend build","ok":true,"evidence":"NEXT_PUBLIC_API_URL=http://192.168.18.93:3000 npm run build: no multiple-lockfile warning"},
    {"criterion":"/categories build does not fail on ECONNREFUSED","ok":true,"evidence":"Clean frontend build completed with unreachable 192.168.18.93:3000; /categories listed as ƒ"},
    {"criterion":"No missing prerender manifest after successful build","ok":true,"evidence":"test -f project/frontend/.next/prerender-manifest.json → manifest-present"},
    {"criterion":"Admin regression check","ok":true,"evidence":"rm -rf apps/admin/.next && npm run build → exit 0"},
    {"criterion":"Storefront regression check","ok":true,"evidence":"rm -rf storefront/.next && npm run build → exit 0"},
    {"criterion":"Backend regression check","ok":true,"evidence":"npm run build → exit 0; npm test → 191 passed, 56 skipped"},
    {"criterion":"TypeScript checks","ok":true,"evidence":"frontend npx tsc --noEmit → exit 0; backend build typecheck → exit 0"},
    {"criterion":"Verify harness","ok":true,"evidence":"./scripts/verify.sh → exit 0"}
  ],
  "checks": [],
  "issues": [],
  "notes":"The second prerender-manifest ENOENT was validated as a cascade from the aborted frontend build; a successful clean build recreates the manifest in project/frontend/.next."
}
