Files
ResumeSite/PROJECT_STATUS.md
T
cesnimda 2184a1892f feat: content layer — zod schemas, validated bilingual data, locale view models
- schema.ts: zod schemas per DATA_MODEL (profile, projects, experience, skills, meta)
- nested {en,no} model: invariant facts once, prose twice; validated at build
- content: profile, skills, experience (with apprentice->developer progression),
  JobTrack + InboxIntel case studies with data-driven arch diagrams, homelab capability page
- per-page SEO meta (EN/NO)
- content.ts: locale-resolved view models; CV PDFs wired
- deviation from literal Astro-collections logged in PROJECT_STATUS with rationale

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 01:05:21 +02:00

71 lines
3.4 KiB
Markdown

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