diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 3257c18..9c3e132 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -6,8 +6,8 @@ file at the **end of every step** so we never jump ahead on a deferred item or skip a main phase. - **Last updated:** 2026-07-23 - see [PROGRESS §7 Changelog](#7-changelog). This field carries the date only; the narrative lives in §7. -- **Active branch:** `fix/remove-duplicate-vercel-ingestion-service` - this PR removes the vestigial `experimentalServices.ingestion` sub-key from `vercel.json` that was serving a LIVE DUPLICATE of the ingestion service at `/_/ingestion` (confirmed 200 on `/health`), and logs the incident as register **#45**. Touches **only** `vercel.json` and this file (the #45 row, this §7 block, and these three header fields). **No code, no other register row, no §1-§6 content, no B5b row, `PIVOT_PLAN.md` untouched.** Register **#45** stays OPEN until production `/_/ingestion/health` is confirmed 404 AND `INGESTION_TOKEN` is rotated. -- **Main tip:** `2d0856d` (PR **#66** merge - the changelog migration off the line-8 header field into the append-only §7, all 17 entry bodies byte-identical), on top of `c119f6b` (PR **#65** - register #17 WIP preservation snapshot) and `0a0557f` (PR **#64** - the gate-integrity arc log). Both required checks green on `2d0856d` (`tsc`, `db-types`). +- **Active branch:** `docs/close-45-and-log-design-items` - this docs-only PR CLOSES register **#45** (the live duplicate Vercel ingestion service is gone and `INGESTION_TOKEN` was rotated) by converting its row in place (🔴→✅, original lead preserved after "Was:"), and logs four new product-design items as registers **#46-#49** (settings-page premium polish, per-material actions, landing-page nav menu, animated terminal demo). Touches **only** this file (the #45 row, four new register rows, one new §7 block, and these three header fields). **No code, no other register row's substance, no §1-§6 phase content, no B5b row, `PIVOT_PLAN.md` untouched.** Register **#17** stays OPEN. +- **Main tip:** `ecb1ed5` (PR **#67** merge - the duplicate-ingestion-service removal: the `experimentalServices.ingestion` sub-key dropped from `vercel.json`, keeping `frontend`), on top of `2d0856d` (PR **#66** - the §7 changelog migration off the line-8 header field, all 17 entry bodies byte-identical) and `c119f6b` (PR **#65** - register #17 WIP preservation snapshot). Both required checks green on `ecb1ed5` (`tsc`, `db-types`). > ✅ **RESOLVED 2026-07-04 — Supabase project back online (register #21).** The > project **auto-paused** (free-tier inactivity) and then hit Supabase's free @@ -141,7 +141,11 @@ project memory, and per-step review debates. "Where" is the target phase/trigger | 42 🔎 **SURFACED 2026-07-17 (P4 wiring session) — the class behind #3 stays open. `file_type` sub-class ROOT-closed 2026-07-18 (PR #56); `language` sub-class app-closed 2026-07-18 (PR #58); `Tier` inline copy deduped 2026-07-20 (PR #60); CLASS STILL OPEN — `Message.role` primary.** | **Nothing prevents the NEXT drifted hand-written type.** `db-types` proves `database.types.ts` matches the migrations; `tsc` (post-``) proves app **code** matches those generated types. **Neither checks that the hand-written types in `src/types/index.ts` match the generated `Row` types.** Under `strict:false` (see #41) a wider DB row assigns cleanly to a narrower/wrong hand-written interface, so a stale union or a missing column drifts **silently** — exactly how #3's `file_type` was wrong on `main` for months, and why `Quiz` was missing `lang`. Adding `lang` to `Quiz` (PR #53) closed **today's instance**; the **class stays open.** **UPDATE 2026-07-18 (PR #56, merge `77ffdd3`) — the MOST HARMFUL sub-class is now closed AT ITS ROOT for `file_type`, not merely corrected.** The sub-class is: **a narrowed, app-enforced string column whose union can rot apart from a SECOND declaration** (the write-path validator). PR #56 hoisted `ALLOWED_FILE_TYPES` (an `as const` array) into `src/types/index.ts` as the SINGLE SOURCE OF TRUTH; `Document.file_type = FileType | null` DERIVES from it, and the ingest route's upload validator IMPORTS the same array (MIME map typed `Record`; runtime allowlist tests membership against that array) — so the compile-time domain and the write-path allowlist are LITERALLY the same declaration, and a drift is a `tsc` error instead of the silent 415/type-lie that made #3's `file_type` wrong for months. **Type-level dedup only — ingestion behaviour UNCHANGED** (same accepted set, same 415 + message, same MIME cross-check, same `ext` written). **#42 STAYS OPEN — this is ONE column at its root, NOT the class.** The same rot-capable second declaration still exists for **`KnowledgeBase.language`** (`useState<'ar'|'en'|'both'>` + a lying `as 'ar'|'en'|'both'` cast on the ``'s `