| 1 | # Verification log |
1 | # Verification log |
| 2 | |
2 | |
| 3 | Filled at each release. See the bottom of this file for the latest run. |
3 | Filled at each release. See the bottom of this file for the latest run. |
| |
4 | + |
| |
5 | +## 2026-11-02 — initial release (commit 734affb and later), https://wp.spboucher.ai on M3U96b |
| |
6 | + |
| |
7 | +| Check | Result | |
| |
8 | +|---|---| |
| |
9 | +| Unit tests (`pnpm test`, vitest) | 23/23 passed (identifiers, citations APA/Chicago/BibTeX/RIS, extraction heuristics, chunking, lexical vectors, i18n key parity and date precision) | |
| |
10 | +| End-to-end (`pnpm test:e2e`, Playwright, desktop Chrome + iPhone 14 viewport, against production) | 19 passed, 1 skipped (mobile-only test on desktop): home statistics = API stats, library filters/sort/display modes, paper page (Scholar meta, JSON-LD, cite dialog, versions, related, PDF HEAD 200), identifier aliases 308, unknown/reserved 404, French locale, search highlights, all discovery pages, machine endpoints (BibTeX, OAI, RSS, sitemap, graph, health), mobile menu, admin unauthenticated refusal, admin login → forced password change page | |
| |
11 | +| Security audit (`pnpm test:security https://wp.spboucher.ai`) | 27/27 passed: CSP/HSTS/XFO/nosniff/referrer/permissions headers, no `x-powered-by`, admin redirects + noindex + no-store, upload/preview 401 without session, cross-origin POST rejected, event input validation, SQL-injection attempt harmless, unknown file 404, path traversal blocked, reserved identifiers hidden (pages, API, OAI), search rate limit 60/min, robots disallow /admin, no secrets in HTML | |
| |
12 | +| Deployment verification (`pnpm verify:deploy https://wp.spboucher.ai`) | 38/38 passed: TLS + health < 2 s, stats = health = list total = OAI record count (39), manuscript download with SHA-256 header, 21 routes 200, Scholar/DC/JSON-LD/hreflang, FR render distinct, 308 alias, 404s, admin protected | |
| |
13 | +| Worker pipeline | 39/39 manuscripts: integrity OK, 5,139 full-text chunks, previews, lexical vectors; 39/39 paper embeddings and 5,139/5,139 chunk embeddings (OpenAI `text-embedding-3-small`, model verified via API); relations: 498 topic, 396 method, 28 dataset, 2 author, 156 lexical (inferred), 151 semantic (inferred) | |
| |
14 | +| Backup + restore drill | Nightly job ran (pg_dump + manuscripts, AES-256, rsync to M3U96a OK); `pnpm restore:drill` restored the encrypted dump into a scratch DB: papers 41/41, versions 39/39, files 39/39, authors 3/3, topics 36/36, chunks 5,139/5,139 | |
| |
15 | +| Infrastructure | DNS unchanged (pre-existing A record), Caddy route added by `mld deploy`, Let's Encrypt certificate issued, PM2 `wp-web` + `wp-worker` online, registry updated, `mld adopt` done (node clone = source of truth) | |