Files
jobtrackingapp/docs/cv-integration-qa/CAREER_PROFILE_MAPPING.md
T

7.7 KiB

CV-QA-01 source-backed mapping and new records

26 October 2026. Entry gap: the old review could only accept/correct fields emitted by extraction. An unmatched extracted record could already be added; a missing record/field could not. This distinction is independently tested rather than treating updates as creation proof.

Implemented contract

Owned review now includes source blocks, an allowlisted field catalog with current contact/list values, and existing-record targets with their actual affected values. The user can create a missing record, select its section/destination, assign literal source values, explicitly mark corrections, add list fields and approve the mapped record. Selecting evidence proposes its literal text only into an empty value; it never overwrites a correction or approves anything. Changing fields/target clears approval. Narrow screens reuse the existing MUI review layout, labels and EN/Bokmål translations.

apply-reviewed accepts optional mappings {clientId,category,targetIndex,fields:[{name,value,sourceBlockId,corrected}]}. Null target deliberately creates an object record; contact updates selected singleton leaves; scalar lists append. Existing targets are validated against the owned canonical snapshot/revision before extracted merge. On 409, local values survive, all confirmations and prior target indices reset, and comparison must be reviewed again. Actual current values are shown before updating an existing target. Caller metadata/IDs/derived dates/arbitrary JSON paths are never accepted.

The same canonical contracts cover contact/labelled links; summary; work title/employer/location/literal dates/current flag/bullets/skills; education qualification/stated level/institution/location/dates/details; certificates name/issuer/location/date/details; project name/role/location/dates/bullets/skills; languages/name/explicit level/notes; skills; interests/awards/publications/organisations/references and custom title/items (including courses). Canonical structured skill categories/proficiency and arbitrary new entities remain unsupported; original source can be retained as custom/detail text.

Every assigned value requires an owned source block. Whole-token boundaries reject Py from Python, SQL from NoSQL, and 2020 from 12020. Explicit corrections may differ and are labelled user-correction; literal user assignments are user-source-mapping, distinct from algorithmic extraction. Block/page/artifact/run/file hash metadata is stamped server-side. Limits:25 mappings,200 total fields,8000 characters/value; unknown categories/fields/targets/evidence, duplicate client IDs/scalar writes and invalid booleans/link pairs fail closed. Existing list values retain their original evidence and unrelated data survives.

Mappings participate in the existing canonical expectedVersion/atomic transaction/history/children/Identity projection and idempotency acknowledgement. Original candidates remain unchanged; actual decisions/mappings are retained in review audit. Old unmapped request hashes remain compatible with historical replay. No schema/storage/profile ownership was duplicated.

Checkpoint evidence

  • mapping-red-01.log: missing mapping contracts reproduced before implementation. mapping-target-red-01.log: missing existing-value comparison/catalog contracts. Whole-token tests were added before implementation.
  • mapping-green-02.log:77 focused backend cases PASS, zero skips, including mapping-only apply, invalid input, current values, date precision, old review/provenance/preservation contracts. Focused counts overlap other suites.
  • mapping-mariadb-01:72/72 actual MariaDB12.2.2 PASS, zero skips, isolated startup/test/cleanup exits0. Two new provider cases exercise17 explicitly mapped groups into an EMPTY canonical profile: two jobs, two education records, two languages, project, certification, contacts/portfolio, skills/summary and long-tail/custom sections. Independent database readback confirms relational child counts, source identity, absent language level, literal year dates and rejected original SQL proposal absent. Identical replay creates one revision only. Injected Identity failure leaves no canonical children/history/acknowledgement and the review stays pending.
  • ui-review-mapping-red.log, ui-target-values-red.log, ui-source-fill-red.log: missing UI flow/comparison/proposal behavior reproduced first. UI review/mapping tests and TypeScript/lint pass; complete browser/mobile/new-user qualification is tracked in later checkpoints.

This is bounded mapping/new-record implementation evidence, not whole-CV acceptance. A separate source audit identified apply/discard/retention lifecycle concurrency risks for real-provider reproduction/remediation at CV-QA-04. No release decision is made here. Missing models/human qualifications remain independent.

Current field coverage addendum — 27 October

The entry matrix in ARCHITECTURE_AND_COVERAGE.md is historical. The following classifications separate canonical mapping from automatic extraction and complete field-specific browser output evidence.

Canonical supported fields Current mapping / database evidence Field-specific connected browser evidence
Contact name/email/phone/headline/location/website/LinkedIn/GitHub/labelled links Source-backed missing-field authoring and selected-leaf updates; service/controller/provider coverage Name/email/phone/location and corrected name through profile/editor/PDF; other contacts retain incomplete individual browser evidence
Jobs title/company/location/start/end/current/bullets/skills Typed allowlist; new and selected existing records, explicit false/current, literal incomplete dates and relational readback New/mapped/repeated jobs, dates, details, CV-only titles and conflict/replay covered; every optional field combination is not independently browser-tested
Education institution/qualification/stated level/location/dates/details New/multiple records and supported field mapping; level never inferred Mapped missing education and extracted multiple qualifications through CV-only edit/PDF; every optional field combination remains incompletely sampled
Skills and languages/name/stated level/notes Canonical lists/language records; missing level remains unknown Extracted skills/languages and retained CV/PDF journey; all language-note combinations not independently sampled
Summary/interests/awards/publications/organisations/references Source-backed scalar-list mapping and conservative append/preservation, provider readback Generic controls and existing editor contracts; incomplete per-field end-to-end import output evidence
Certifications/name/issuer/location/date/details and projects/name/role/location/dates/bullets/skills Supported missing-record mapping and actual provider persistence; ambiguous extraction retained for review Incomplete dedicated per-field import/browser/PDF evidence; no universal auto-extraction claim
Courses/custom title/items Existing supported custom sections, explicit source mapping, provider readback Generic review/editor integration; incomplete per-custom-field connected evidence
Skill categories/proficiency, derived experience duration, caller-authored IDs/metadata Unsupported by design or internal-only: no new canonical entity is invented Not offered as imported canonical fields
Real AI relationships/OCR layouts Blocked by external qualification / OCR disabled Not tested or accepted as model extraction

All rows retain source evidence and explicit approval. Mapping into canonical storage is distinct from a claim that the deterministic parser can discover every field from every layout. The current lifecycle races are remediated and verified in MARIA_DB_AND_RD21.md; historical checkpoint observations above are preserved.