Guides/Architecture

Architecture

Components and release boundaries

Career Evidence Core is an independently runnable early-access toolkit; Resume Application is a beta add-on. See releases for ownership, compatibility and quality gates. components/*/component.json declares independent versions and explicit release file lists. build_release.py checks dependencies and builds separate archives; the add-on cannot replace core files or include private data.

career_core.py, career_profile.py, pack_io.py, schema_tools.py and evidence_rules.py own shared maintenance and validation primitives. Resume modules consume them. editorial.py retains output decisions and selection while forwarding its historical core commands for compatibility. Core pack validation no longer imports the application. Clean-install tests exercise this boundary.

The dividing line

Anything decidable from the pack alone is a script. Everything requiring judgement is a skill.

Eligibility filtering, rendering, date arithmetic, and artefact checks are pure functions over data. Written as instructions to a model they get re-derived on every run, inconsistently, and cannot be tested. Written as code they are checked once and hold.

Writing a bullet that preserves the meaning of a Result, deciding whether a claim reads as ownership or team credit, judging whether a document would be shortlisted — those are judgement, and they belong in skills.

The strongest version of this shows up in selection. Generation reads a selection view, not the pack: ineligible evidence never enters context, so the rule "do not cite external_safe: false atoms" cannot be broken by a lapse in attention. You cannot cite what you were never shown. That is strictly stronger than any instruction.

Layout

.claude/skills/     judgement: conversational workflows and reviews
scripts/            decidable work, standard library only
schemas/            contracts: datapack, role profile, evaluation, screen record
tests/              regression, human-review and clean-install checks
data/               your private material, excluded from Git and release archives
  sources/            raw input
  candidates/         proposed changes awaiting human review
  packs/              current and previous versions linked by metadata.supersedes
  roles/              structured role profiles
  briefs/             durable output briefs
  selections/         immutable evidence selections and alternatives
  plans/              pinned application plans and tradeoffs
  capture/            the append-only note log
  private/            pre-schema profiles
outputs/            generated artefacts, evaluations, screens. Git ignored.
                    A screen records its context: "fresh" means it was produced
                    by a context holding only the artefact, the role profile and
                    the skill, never by the context that wrote the document.
reviews/            source answers and review records. Git ignored
  pack-reviews/       proposal snapshots, sessions and immutable decision batches
  decisions/          scoped editorial decisions
  startup/            resumable career/resume setup and private HTML summaries

Scripts

Script Role
career_core.py Core maintenance, candidate strengths queues, private export and review commands
pack_review.py Stages proposals, records human decisions and saves accepted local versions
career_intake.py Authorized source inventory, hash deduplication and cached text extraction
career_review.py / review_server.py Shared save/correction operations and temporary local browser connection
workspace_setup.py New personal workspace from public component allowlists; never copies private data
review_html.py / pack_html.py Grouped proposal review (connected or offline) and read-only current-pack overview
career_page.py Private reading view derived only from recorded pack content
startup.py / career_start.py Immutable, resumable Core intake sessions; no automatic factual acceptance
resume_start.py Targeting wizard and typed brief handoff; consumes shared startup primitives
workspace_tools.py / workspace_backup.py Health, history, reviewed maintenance and verified private backup/restore
resume_workflow.py / resume_employment.py Application plans, evidence tradeoffs and employer/position structure
resume_document.py / export_resume.py / resume_links.py Shared content, PDF/TXT/DOCX output and exact content/link verification
resume_process.py / resume_quality.py / resume_layout.py Durable claim/editorial reviews, omitted-evidence review and final PDF inspection records
check_staged.py Developer hook: reject private paths and test an isolated snapshot of the Git index
current_pack.py Resolves the current pack by supersedes chain, not by mtime. Refuses when ambiguous
select_evidence.py Emits only eligible evidence; --role ranks and shortlists against a profile
render.py Markdown to HTML through one template, so the two cannot drift
answer.py Records a review answer verbatim, at the moment it is given, where the atom can cite it
keyword_coverage.py Which ATS keywords a draft carries, and which confirmed atoms could carry the missing ones
link_evidence.py Proposes, confirms, rejects and migrates requirement-to-evidence links; only subject-confirmed links count in role_fit
entailment.py A cold model judges each bullet against only its cited atom: supported, overstated, unsupported. Reporting only; spends tokens
verify_excerpts.py Re-extracts each cited source and fails on an excerpt it does not contain: the source-to-atom hop
validate_pack.py Structural check on a pack
validate_artifact.py An artefact against the pack that produced it
validate_records.py Evaluation, screen, and role-profile records
quantities.py Magnitudes a bullet asserts that its cited atom does not carry. Warns through validate_artifact.py; never blocks
manifest.py Pack hash and skill hashes, pinned into an evaluation record
save_review.py Attach the exact saved manifest and validate a review before atomic publication
private_facts.py Recorded dates and explicit measurement states for private briefs
capture.py The note log. Never writes to the pack
find.py Recall by term, skill, tag, employer, date, outcome, status
dedupe.py Is this claim already in the pack?
coverage.py Timeline, gaps, undated atoms, stale skills
role_fit.py Coverage against every role profile; corroboration beside it, never gating; names withheld and unresolved evidence
pack_html.py Browsable private view of the whole pack, withheld atoms included. Never sendable
open_questions.py Accuracy questions by default; --optional adds enrichment, --application adds output questions; --delta audits source grounding
corroboration_plan.py Optional: what is worth corroborating
verdict_log.py Screen verdicts over time
artifact_index.py, diff_artifact.py What exists, and what changed between versions
extract_text.sh Source text plus provenance fields
export_resume_json.py Lossy projection to JSON Resume (resume.json)

Workspace operations honor CAREER_WORKSPACE so fixtures do not touch live data. Developer build and component tools use their source checkout. The commit hook clears workspace overrides before testing its isolated staged snapshot.

Versioning and provenance

Packs are never edited in place. A new pack sets metadata.supersedes, and current_pack.py walks that chain, so "which pack is current" has exactly one answer rather than depending on file timestamps.

Every evaluation record carries a run block pinning the pack sha256 and a hash per skill. validate_artifact.py reads that pin and validates against the pack that produced the artefact, reporting staleness when the pack has moved on. Provenance that nothing consumes is worse than none, because it looks like the problem is solved.

Testing

make check runs the original regression suite, editorial and core contracts, human review and workspace-maintenance tests, five complete fictional lifecycle journeys and clean-install/recovery tests. GitHub Actions repeats the deterministic checks on Linux and macOS. See quality benchmarks for model-driven scenarios and the human observation rubric. Prose quality and hiring outcomes are not inferred from successful validation.

The original suite runs against two fictional fixtures, and the second one matters. career.example.json is small and readable. career.complex.example.json has the shape of a real pack: a promotion chain, withheld and unresolved evidence, undated atoms, and an independent source. Everything used to run against the small one only, and three defects shipped behind that gap — a leak scan that failed the private brief on the words it exists to state, a magnitude check that emitted eighty warnings on one document, and a fit score with no eligibility filter. None were visible to the passing checks; all three appeared within one run against real data.

Behavioural claims that need a model in the loop are listed in tests/scenarios.md and run by hand after a material skill edit.

Editorial memory

See editorial-memory.md for the contracts and full workflow. editorial.py validates references, resolves scoped decisions, builds durable selections, filters profile context and detects changed support. Schema 1.4 adds optional strengths and preferences; archived schema 1.3 keeps older packs usable. The three new skills interview for strengths, review selection when requested, and assess representation. Selection reasons and briefs survive deletion of outputs.

The editorial tests additionally cover five fictional career profiles and sequences of shortening, retargeting, correction and regeneration. Model-driven checks in tests/run_editorial_scenarios.py test actual interpretation and writing in an isolated fixture workspace; they are separate from make check.

Human review of career data

See pack review. Proposed packs stay outside the current-pack chain. The review document presents exact values, sources and before/after changes. The optional temporary loopback connection calls the same locked save/correction operations as the CLI, with origin/token checks and exact-state stale-write protection. Literal corrections become person sources and pending proposals; automatic source metadata imports carry separate receipts. The default queue groups achievements by role. Immutable decision batches bind a person’s choices to the proposal fingerprint; only explicitly accepted content and privacy restrictions enter a new pack. Human wording review is separate from evidence confidence and publication rights. Corrections and omissions remain follow-up notes until reviewed as new proposals.

Long-term workspace maintenance

workspace_tools.py composes health, achievement history and candidate-only merge/split/refresh from the core contracts. workspace_backup.py packages private files and the installed runtime, checks relative references and verifies archive hashes before restoring a new workspace. metadata.evidence_maintenance retains original and replacement IDs; dependent strengths are never reassigned silently.

Acceptance checks source excerpts across all career record types, preserves the latest privacy permission and requires a separate sourced decision for upward evidence-status transitions. Accepted writes, review-session creation, decision recording, migrations and backups share a workspace lock. Connected review and a non-mutating preview expose the same decisions before saving. See workspace maintenance.

Resume application planning and delivery

Version-2 output briefs record application settings and their origins. Immutable plans in data/plans pin their selection and authoring policy, map intended impressions to approved evidence and explain section allocation and tradeoffs. Selection review HTML is a private conversational aid. Scoped wording decisions preserve user voice without becoming career facts.

resume_document.py derives a small block structure from the final cited draft. export_resume.py produces PDF, TXT and DOCX with identical content. Submission files live under an export bundle's files/; internal provenance and reports live in review/. PDF is the only export with external rendering prerequisites. Exact plan, policy and export-file hashes join the existing manifest chain. The resume-workflow tests cover these contracts separately from prose quality. See development for staged-source checks and optional browser/PDF tests.