Point 7 of the page-wording review. The pages no longer show their data structure as headings, and they no longer explain their own conventions. - Level 1 is one screen: claim, status badge, three figures, the technology row, and one sentence carrying one link. Measured in headless Chrome at 1440x900: 1404-1845 px tall before, exactly 900 px (no scroll) after, on all six area pages. - DocPage: no kicker line, no visible level label, no "Evidence for this page" heading or instruction note, no "Drill-downs" list, no "Status <word> - sentence" footer. The artefact table starts at level 2, under the heading "Artefacts"; the history timeline is level 2 only. - Landing page: "Start here" link text gone, "How to read this site" panel gone, the footer's status-label explainer gone. - Content, presentation only, no claim softened: the leading H1 that duplicated the page title removed from all 41 documents; level 1 bodies reduced to the constraint as ordinary prose plus the way in; "**Status: ...**" prefixes removed from the artefact stubs; "## Drill-downs" and "## Period and confidence" removed from the level 2 pages, with the cross-area links moved into the prose. - The six level 1 claims are now sentences with a subject, and use commas instead of middots. Same facts, no new ones. Not in this commit: the 35 level 2 and 3 claims still use the compact CV style. That is a voice decision for Sam, not a wording tidy-up. make validate: 41 documents, 0 violations. go test ./...: pass. (cherry picked from commit 03009f80fc7815ad7719412e125df9297a6e653f)
Ai Resume — Paperclip build directory
This is the working directory for the Paperclip project Resume Ai. Paperclip builds here. Everything needed to build is in this folder; nothing outside it is required.
Relationship to the planning folder
| Folder | Holds | Status |
|---|---|---|
/home/sam/paseo/projects/resume_ai_system/ |
The why — research, cull decisions, stack rationale, evidence notes, content drafts | Planning. Not the build. Sam works here |
/home/sam/paseo/projects/resume_ai_system_paperclip_build/ |
The what — build spec, phase documents, reference material, and the site itself | This folder. Paperclip works here |
The planning folder is read-only reference. Do not edit it from here, and do not make the build depend on it — anything needed must be copied in.
Start here
AGENTS.md— the build spec. Constraints, conventions, and the phase list. Read it before anything else.docs/phase-N-*.md— one document per phase: work, Definition of Done, out of scope, risks.reference/— frozen decisions, stack and budgets, content map, acceptance tests.
Phases
| # | Phase | Ships |
|---|---|---|
| 1 | Content source of truth | content/ + validator |
| 2 | Mode A static site | Browsable pre-rendered site, no AI |
| 3 | Public deployment | Live URL behind Caddy |
| 4 | Corpus and retrieval | content/ → Qdrant |
| 5 | Mode B console | Streaming, cited answers |
| 6 | Guardrails, cost, kill switch | Safe to leave public |
| 7 | Polish | Logos, diagrams, code exhibits |
Order is deliberate. Content first (both renderers need it). Deploy at Phase 3, not last — a live half-built URL is worth more than a perfect site that never ships. AI after deployment so it can never block launch.
Repository
This folder is the git working copy of sam/ai-resume. One repo, one product.
Previously held an abandoned Vite/React scaffold. It was replaced by this build spec; the history is retained because it honestly records the false start, and it is referenced in the site's "alternatives considered" content.
Build and run
The site is one Go binary serving pre-rendered HTML. There is no Node, no bundler and no
node_modules; go.sum is the only dependency lock.
nix develop # go, templ, sqlite3, make, curl
make validate # content gate: front-matter against the frozen schema
make test # go test ./... plus the validator self-test
make dist # templ generate → bin/ → pre-rendered dist/
make dev # build, then serve on http://127.0.0.1:8096
bin/resume-build reads content/ and writes dist/ (pages, stage fragments, the fragment
manifest, the SQLite FTS5 index, assets). bin/resume-server serves dist/ and never reads
content/, never calls a model, and never opens a socket to another service — that is what
keeps acceptance test A1 true.
The two things that are not files are /search (FTS5 over page titles and body text) and
/api/stage/stream (the presentation panel driven by an event stream instead of a route).
The retrieval corpus (Phase 4) is built separately, because it writes to a service rather
than to dist/:
docker compose -f deploy/qdrant.yml up -d # on the runtime host, loopback only
make corpus # content/ -> chunks -> Qdrant + SQLite FTS5
make corpus-verify # does the index agree with content/ and with Qdrant?
make corpus-audit # stale documents, index drift, contract drift
make corpus-test # 76 unit tests, no container and no network
The site never calls Qdrant, so acceptance test A1 is unaffected: stopping the corpus
services leaves every page working. Operator manual and measurements:
docs/phase-4-notes.md.
Ground rules
- Do not touch other systems. No stopping containers, no editing other projects, no
nixos-rebuild, no Caddy changes except the single block specified in Phase 3 — and that one Sam applies. - Mode A must work with every AI service stopped. Hard gate.
- Never invent facts about Sam's career. If it is not in
reference/orcontent/, ask. - Secrets live in
~/.config/environment.d/only. - All models go through OmniRoute.
Current state
- Repo prepared, scaffold retired, build spec written
- Phase 1 — content source of truth (40 documents across six areas,
make validate) - Phase 2 — static site (
make dist, 45 pages, 86 stage fragments, FTS5 search) - Phase 3 — public deployment
- Phase 4 — corpus and retrieval (51 chunks, FTS5 + Qdrant, freshness audit)
- Phase 5 — AI overlay
- Phase 6 — guardrails
- Phase 7 — polish