# 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.
