# PROJECT_STATUS.md Living status of the Phase 3 implementation. Updated continuously. **Current phase:** Phase 3 — implementation **Branch strategy:** feature branches → PR → `main` (never commit directly to `main`) **Last updated:** 2026-07-03 --- ## Milestones | # | Milestone | Status | |---|---|---| | 0 | Repo, tooling, tracking (git, pnpm, docs moved to `docs/`) | 🟡 in progress | | 1 | Astro base config + token/style layer | ⬜ not started | | 2 | i18n layer (locales, slug map, dictionaries) | ⬜ not started | | 3 | Content collections + schemas + EN/NO data | ⬜ not started | | 4 | UI atoms + core layout (Header, Footer, SEO) | ⬜ not started | | 5 | Home page sections | ⬜ not started | | 6 | Case-study + capability templates | ⬜ not started | | 7 | Remaining pages (about, experience, contact, cv, colophon, 404) | ⬜ not started | | 8 | Behaviour modules (theme, nav, observer, lightbox, form) | ⬜ not started | | 9 | SEO layer (meta, hreflang, JSON-LD, OG, sitemap) | ⬜ not started | | 10 | Contact relay (.NET 9) | ⬜ not started | | 11 | Tests (vitest + playwright) | ⬜ not started | | 12 | Docker + CI | ⬜ not started | | 13 | Verification pass against acceptance criteria | ⬜ not started | Legend: ⬜ not started · 🟡 in progress · ✅ done · ⛔ blocked ## Environment - Node v22.23.1 · pnpm 9.15.9 · .NET SDK 10.0.201 (relay targets `net9.0`) · Docker 29.3.1 - Repo initialised locally; remote `git.cesnimda.uk/cesnimda/ResumeSite.git` (push when instructed). ## Deviations from spec (with rationale) 1. **Content stored as typed TS modules validated by zod, not Astro content-collection entries** (DATA_MODEL / I18N_SPEC §3 described "content collections with per-locale entries"). Rationale: the content is highly structured (not markdown documents) and the nested `{en,no}` single-entry model serves the spec's own stated goal — "facts exist once, prose exists twice" — *better* than Astro's parallel per-locale entries, which can't express author-once invariance natively. All required properties are preserved: zod schema validation at build (`src/lib/schema.ts`), structural EN/NO parity by construction, and CI-testable getters (`src/lib/content.ts`). Same validation guarantee, cleaner authoring, no duplication. 2. **Sitemap hand-rolled from the slug map** instead of `@astrojs/sitemap`. Rationale: the slug map is the single route contract (ARCHITECTURE A5) and localised slugs (prosjekter vs projects) don't fit the integration's parallel-slug assumption. Hand-rolling keeps one source of truth and correct hreflang alternates. ## Prerequisite substitutions in place (interim, non-blocking) - Portrait + project screenshots use a `placeholder:` scheme (styled skeletons) until the seeded-data capture pass and real headshot are provided. Real assets drop straight into the same content refs. - CV download targets are the current PDFs (`public/cv/…`); the ATS-safe rework replaces the files at the same URLs. ## Open questions / blocked-on-user _None yet._ ## Prerequisites carried from Phase 1/2 (not blocking scaffold) - Screenshot capture pass on seeded demo data (JobTrack, InboxIntel) — placeholders used until provided. - ATS-safe CV rework (EN/NO) — current PDFs wired as download targets meanwhile. - Native-Norwegian review pass of NO content — launch gate. - Legacy WordPress URL inventory for redirect/410 map.