Generator Offline Review — No Supabase Required
Mission: Run the full generator analysis workflow offline using pre-recorded Prisma fixtures.
Works identically to generator-ai-review but without database access.
Invocation: Skill("generator-offline-review") or user says "offline gen" / "génération offline"
Architecture: Record/Replay Prisma Proxy
RECORD (online) REPLAY (offline)
┌────────────┐ ┌────────────┐
│ Real Prisma │──→ Recording Proxy ──→ │ Replay Proxy │
│ (Supabase) │ saves queries to │ (fixtures) │
└────────────┘ s50-2025.json └──────────────┘
↑ serves from JSON
Files:
src/lib/prisma-offline-proxy.ts — Record/Replay proxy
src/lib/prisma.ts — checks PRISMA_RECORD_PATH / PRISMA_REPLAY_PATH
scripts/offline-fixtures/*.json — fixtures par semaine (s50-2025, s01 à s13-2026, s16-2026)
scripts/generate-offline.ts — standalone offline generation (no HTTP, no dev server)
scripts/extract-offline-fixtures.ts — records fixtures via direct engine (recommended)
scripts/record-offline-fixtures.ts — records fixtures via HTTP generation (legacy)
Semaines disponibles
| Preset | Dates | Mois | Fixtures |
|---|
s50-2025 (défaut) | 2025-12-07 → 2025-12-13 | Déc 2025 | offline-fixtures/s50-2025.json ✅ |
s01-2026 | 2025-12-29 → 2026-01-04 | Janv 2026 | offline-fixtures/s01-2026.json ✅ |
s02-2026 | 2026-01-05 → 2026-01-11 | Janv 2026 | offline-fixtures/s02-2026.json ✅ |
s03-2026 | 2026-01-12 → 2026-01-18 | Janv 2026 | offline-fixtures/s03-2026.json ✅ |
s04-2026 | 2026-01-19 → 2026-01-25 | Janv 2026 | offline-fixtures/s04-2026.json ✅ |
s05-2026 | 2026-01-26 → 2026-02-01 | Janv/Fév 2026 | offline-fixtures/s05-2026.json ✅ |
s06-2026 | 2026-02-02 → 2026-02-08 | Fév 2026 | offline-fixtures/s06-2026.json ✅ |
s07-2026 | 2026-02-09 → 2026-02-15 | Fév 2026 | offline-fixtures/s07-2026.json ✅ |
s08-2026 | 2026-02-16 → 2026-02-22 | Fév 2026 | offline-fixtures/s08-2026.json ✅ |
s09-2026 | 2026-02-23 → 2026-03-01 | Fév/Mar 2026 | offline-fixtures/s09-2026.json ✅ |
s10-2026 | 2026-03-02 → 2026-03-08 | Mar 2026 | offline-fixtures/s10-2026.json ✅ |
s11-2026 | 2026-03-09 → 2026-03-15 | Mar 2026 | offline-fixtures/s11-2026.json ✅ |
s12-2026 | 2026-03-16 → 2026-03-22 | Mar 2026 | offline-fixtures/s12-2026.json ✅ |
s13-2026 | 2026-03-23 → 2026-03-29 | Mar 2026 | offline-fixtures/s13-2026.json |
s16-2026 | 2026-04-13 → 2026-04-19 | Avr 2026 | offline-fixtures/s16-2026.json ✅ |
✅ = fixtures enregistrées (S50 + S01-S12 + S16 = 14 semaines). Seule S13 nécessite un enregistrement.
Tous les scripts acceptent --week=<preset> (ex: --week=s10-2026).
Phase 0: CHECK FIXTURES
Before anything, verify fixtures exist for the target week:
bash
1# Vérifier toutes les fixtures disponibles
2ls -la scripts/offline-fixtures/
3
4# Vérifier une semaine spécifique (ex: S10 mars 2026)
5ls -la scripts/offline-fixtures/s10-2026.json
Semaines déjà enregistrées : s50-2025, s01-2026 à s12-2026, s16-2026 (14 semaines).
Seule s13-2026 doit encore être enregistrée si nécessaire.
If the file does not exist or needs refreshing:
Record fixtures (requires Supabase access):
Method A: Standalone script (recommended, no server restart)
bash
1# Enregistrer une semaine spécifique (ex: S10 mars 2026)
2npx tsx --env-file .env.local scripts/extract-offline-fixtures.ts --week=s10-2026
3
4# Enregistrer plusieurs semaines en séquence
5for week in s02-2026 s06-2026 s10-2026; do
6 npx tsx --env-file .env.local scripts/extract-offline-fixtures.ts --week=$week
7done
This runs the engine directly with the recording proxy. No dev server needed.
Method B: Via dev server (if you need more control)
- Stop any running dev server
- Start with recording:
bash
1PRISMA_RECORD_PATH=scripts/offline-fixtures/s10-2026.json npm run dev
- Run a generation:
bash
1npx tsx --env-file .env.local scripts/generate-via-api.ts --week=s10-2026
- Stop the dev server (Ctrl+C)
Verify the fixtures file was created and has reasonable size (>1MB = ~170 queries).
Phase 1: OFFLINE GENERATE
Two options:
Option A: Direct engine (recommended, no dev server needed)
bash
1# S50 (défaut)
2npx tsx --env-file .env.local scripts/generate-offline.ts
3npx tsx --env-file .env.local scripts/generate-offline.ts --hybrid=false
4npx tsx --env-file .env.local scripts/generate-offline.ts --bestOfN=3
5
6# S16
7npx tsx --env-file .env.local scripts/generate-offline.ts --week=s16-2026
8npx tsx --env-file .env.local scripts/generate-offline.ts --week=s16-2026 --bestOfN=3
This imports the engine directly with PRISMA_REPLAY_PATH set.
No Next.js, no HTTP, no dev server required.
Option B: Via dev server (if you need the UI or HTTP endpoints)
bash
1# S50
2PRISMA_REPLAY_PATH=scripts/offline-fixtures/s50-2025.json npm run dev
3npx tsx --env-file .env.local scripts/generate-via-api.ts
4
5# S16
6PRISMA_REPLAY_PATH=scripts/offline-fixtures/s16-2026.json npm run dev
7npx tsx --env-file .env.local scripts/generate-via-api.ts --week=s16-2026
After generation:
- Read
scripts/debug-exports/runs/<logId>/validation.json (archivé, figé, recommandé depuis 24/04/2026)
OU scripts/debug-exports/latest-validation.json (risque d'écrasement au prochain run)
- Generate the visual grid:
bash
1npm run debug:grid
2# équivalent : npx tsx --env-file .env.local scripts/view-generation-grid.ts --no-open
🆕 Archivage automatique par logId (24/04/2026)
Chaque génération crée automatiquement scripts/debug-exports/runs/<logId>/ contenant :
manifest.json — summary_for_ai (5 lignes), overallScore, topViolations, stats
validation.json, assignments.json, generation-trace.json, r1-analysis.json, surgeon-grid.json, staffing-plan.json
- FIFO 20 runs max (anciens supprimés automatiquement)
Pour comparer 2 runs offline (avant fix vs après fix) :
typescript
1import { DebugAutoExporter } from '@/modules/unified-generator/services/DebugAutoExporter';
2const runs = DebugAutoExporter.listRuns();
3const before = DebugAutoExporter.getRunManifest(runs[1].logId);
4const after = DebugAutoExporter.getRunManifest(runs[0].logId);
5console.log(before.summary_for_ai, '\n→\n', after.summary_for_ai);
Output: Display quickSummary + structuredSummary + manifest.summary_for_ai du run archivé.
Phase 2+3: ANALYSIS (Claude + Codex)
Identical to generator-ai-review Phase 2+3.
Use the same analysis workflow:
- Read
scripts/debug-exports/latest-validation.json
- Perform 2A (integrity check), 2B (causal analysis), 2C (prioritization), 2D (code reading)
- Launch Codex analysis in parallel (if codex CLI available)
Note: In offline mode, Codex may or may not be available.
If no internet → skip Codex, do Claude-only analysis.
If internet available (VPN, hotspot) → use Codex normally.
Source File Mapping (same as generator-ai-review)
| Rules | Source File |
|---|
| R1,R4,R5,R6,R7,R10,R19,R22,R23,R27,R36 | phases/IADEDistributionPhase.ts |
| R9,R11,R12,R13,R18,R48 | phases/MARBlocPhase.ts |
| R8,R14,R15,R28,R30 | phases/SupervisionPhase.ts |
| R12,R26,R41 | phases/GlobalSwapOptimizerPhase.ts |
| R12,R33,R41 | phases/CrossDayOptimizerPhase.ts |
| R21,R32 | phases/OffDistributionPhase.ts |
| R16,R17,R29,R31,R44,R46 | phases/GardePhase.ts |
| R42 | phases/AstreintePhase.ts |
| R20,R25,R43,R47 | phases/ConsultationPhase.ts |
Phase 4: CROSS-VALIDATION
Same as generator-ai-review Phase 4:
- Triple validation (Report + Claude + Codex if available)
- Merge findings
- Filter justified/period-limited violations
Phase 5: JOINT FIX PLAN
Same format as generator-ai-review Phase 5.
Present to user for approval.
Phase 6: EXECUTE FIXES + RE-GENERATE OFFLINE
For each approved fix:
- Read the target file
- Apply the fix via Edit tool
- Re-generate offline:
bash
1npx tsx --env-file .env.local scripts/generate-offline.ts
- Compare before/after scores
- If regression (>2pts): revert
After all fixes:
- Run 3x:
npx tsx --env-file .env.local scripts/generate-offline.ts --bestOfN=1
- Present before/after table
- Update memory files
Guardrails
Same as generator-ai-review:
- Never modify the Prisma schema
- Never change validation rules to mask violations
- Never do mutating requests against localhost:3000
Offline-specific:
- Always verify fixtures exist before generating
- Remember: Fixtures are a snapshot — if DB data changes, re-record with
--week=<preset>
- N=3 validation still works: Each run is stochastic (shuffleRooms), fixtures just provide the input data
- CasePackExporter may partially fail in direct engine mode (some export queries not recorded). The assignments and core validation still work.
Quick Reference
🆕 Scripts npm (depuis 24/04/2026 — préférés pour la simplicité)
bash
1npm run debug:offline # Génération offline S50 (défaut)
2npm run debug:offline -- --week=s16-2026 # Semaine spécifique
3npm run debug:grid # Génère generation-grid.html
4npm run debug:phases # Génère phase-visualizer.html
5npm run debug:latest # Dump des latest-*.json dans le terminal
6npm run debug:trace -- "NOM" "2026-04-13" "MATIN" "Salle 2" # Trace user/slot
Commandes complètes (legacy — équivalentes)
bash
1# Record fixtures (online, requires Supabase) — à faire UNE FOIS par semaine
2npx tsx --env-file .env.local scripts/extract-offline-fixtures.ts # S50 2025 (défaut)
3npx tsx --env-file .env.local scripts/extract-offline-fixtures.ts --week=s02-2026 # Janv 2026
4npx tsx --env-file .env.local scripts/extract-offline-fixtures.ts --week=s06-2026 # Fév 2026
5npx tsx --env-file .env.local scripts/extract-offline-fixtures.ts --week=s10-2026 # Mars 2026
6npx tsx --env-file .env.local scripts/extract-offline-fixtures.ts --week=s16-2026 # Avr 2026
7
8# Generate offline (no server needed) — toutes semaines
9npx tsx --env-file .env.local scripts/generate-offline.ts # S50 (défaut)
10npx tsx --env-file .env.local scripts/generate-offline.ts --week=s02-2026 # Janv
11npx tsx --env-file .env.local scripts/generate-offline.ts --week=s06-2026 # Fév
12npx tsx --env-file .env.local scripts/generate-offline.ts --week=s10-2026 # Mars
13npx tsx --env-file .env.local scripts/generate-offline.ts --week=s16-2026 # Avr
14
15# Generate offline via dev server
16PRISMA_REPLAY_PATH=scripts/offline-fixtures/s50-2025.json npm run dev
17npx tsx --env-file .env.local scripts/generate-via-api.ts
18# Ou pour une semaine spécifique:
19PRISMA_REPLAY_PATH=scripts/offline-fixtures/s10-2026.json npm run dev
20npx tsx --env-file .env.local scripts/generate-via-api.ts --week=s10-2026
21
22# View grid
23npx tsx scripts/view-generation-grid.ts --no-open
24
25# 🆕 Pack IA unifié (nécessite dev server actif, online OU replay mode)
26curl "http://localhost:3000/api/debug-generator/ai-pack?logId=<logId>" > /tmp/ai-pack.json