diff --git a/resume_builder/canonical/claims.json b/resume_builder/canonical/claims.json index bdf818a..2fd3b4d 100644 --- a/resume_builder/canonical/claims.json +++ b/resume_builder/canonical/claims.json @@ -324,11 +324,11 @@ { "id": "BS-1", "evidence": { - "last_verified": "2026-08-27", - "source": "unrecorded", - "ownership": "unrecorded" + "last_verified": "2026-09-11", + "source": "user clarification 2026-09-11 on the 24/7 operating constraint; Ansible scope user-confirmed 2026-08-27", + "ownership": "individual - integration and operation; model development is NOT his" }, - "scope": "Designed and executed integration of containerized ML inference into a 24/7 semiconductor production environment; model-development ownership is not established. Toolchain includes Docker, Kubernetes and Ansible - Ansible use at Bosch was intensive (user-confirmed 2026-08-27) and extended to configuration management and infrastructure automation beyond this single integration, making it standalone Infrastructure-as-Code evidence.", + "scope": "Designed and executed integration of containerized ML inference into a 24/7 semiconductor production environment; model-development ownership is not established. Toolchain includes Docker, Kubernetes and Ansible - Ansible use at Bosch was intensive (user-confirmed 2026-08-27) and extended to configuration management and infrastructure automation beyond this single integration, making it standalone Infrastructure-as-Code evidence. OPERATING CONSTRAINT, user-clarified 2026-09-11: the fab runs continuously, and a defect in the software could in the worst case halt production - an outcome that must never occur. That is a FAILURE-CONSEQUENCE constraint (blast radius of a bug), NOT a deployment-window constraint. Write it as 'a defect could have stopped production' or 'software whose failure would have halted a continuously operating fab'.", "allowed_verbs": [ "integrated", "containerized", @@ -337,7 +337,9 @@ ], "forbidden": [ "trained the image classification model", - "owned the full ML lifecycle" + "owned the full ML lifecycle", + "a production line that could not be stopped for a deployment", + "could not be stopped for a deployment" ], "metrics": "qualitative reduction in manual classification is source-backed; exact amount unverified" }, diff --git a/resume_builder/canonical/package_manifest.json b/resume_builder/canonical/package_manifest.json index 67aa590..92febef 100644 --- a/resume_builder/canonical/package_manifest.json +++ b/resume_builder/canonical/package_manifest.json @@ -63,7 +63,6 @@ "pdfs": [ "Dennis_Thiessen_Cover_Letter.pdf", "Dennis_Thiessen_Resume.pdf", - "critique_resume_check.pdf", "e2e_bis_senior_data_analytics_ai_cover_letter.pdf", "e2e_bis_senior_data_analytics_ai_resume.pdf" ], @@ -394,13 +393,7 @@ "pdfs": [ "Dennis_Thiessen_Cover_Letter.pdf", "Dennis_Thiessen_Resume.pdf", - "e2e_nato_ai_engineer_resume.pdf", - "nato_ai_engineer_check.pdf", - "nato_ai_engineer_final_check.pdf", - "nato_cover_final_check.pdf", - "nato_cover_letter_check.pdf", - "nato_critique_cover.pdf", - "nato_critique_resume.pdf" + "e2e_nato_ai_engineer_resume.pdf" ], "uses_today": [], "problems": [ diff --git a/resume_builder/experience/experience_bosch.md b/resume_builder/experience/experience_bosch.md index 8eef4a8..98b3feb 100644 --- a/resume_builder/experience/experience_bosch.md +++ b/resume_builder/experience/experience_bosch.md @@ -36,14 +36,18 @@ This domain expertise is rare in data engineering candidates and is a strong dif **User's role:** Primary developer / strategy owner ("Erarbeitung und Durchführung" = designed AND executed) **Status:** Deployed to production -> **OPEN ITEM — confirm before reusing (review F07, 2026-09-11).** The NVIDIA and RUAG cover -> letters state that the production line could not be stopped for a deployment. That is a -> *stronger* claim than the canonical record, which establishes a continuously operating 24/7 fab -> but not a no-stop deployment constraint. **It is not declared false** — it is plausible and may -> well be accurate. Both documents are already submitted and are NOT rewritten (F17: archives are -> preserved). **Before any new package repeats this framing, ask the user to confirm it and record -> the answer in `claims.json`.** Until then write the constraint as "integrated into a continuously -> operating production environment". +> **RESOLVED 2026-09-11 by the user** (was an open item from review F07). The real constraint is +> a FAILURE CONSEQUENCE, not a deployment window: *"Bei einem Fehler (also Defekt in der Software) +> kann es zu einem Produktionsstopp im worst-case kommen, was natürlich nie passieren darf."* +> +> The submitted NVIDIA cover letter says *"a production line that could not be stopped for a +> deployment"* — that is a **different and inaccurate** claim. It describes a scheduling +> constraint; the truth is about the blast radius of a bug. **That exact phrasing is now +> `forbidden` on BS-1** and must not be reused. The letter itself is not rewritten (F17). +> +> **Write it as:** "integrated containerized ML inference into a continuously operating +> semiconductor fab, where a software defect could have halted production" — which is a stronger +> statement than the one that was sent, and true. **Context:** 300mm semiconductor fab runs continuously. Manual image classification for wafer defect detection created a bottleneck for line engineers in the Defect Management domain. Dennis designed and implemented the strategy to containerize and orchestrate ML inference into the live production pipeline, automating image-based defect classification and substantially reducing manual inspection work. **Scope limit (canonical BS-1):** the reduction is source-backed but its size is unverified — do not claim elimination, “no manual intervention” or unattended operation, and never claim model development. diff --git a/resume_builder/helpers/validate_resume_system.py b/resume_builder/helpers/validate_resume_system.py index 6b9b9ab..1b68126 100644 --- a/resume_builder/helpers/validate_resume_system.py +++ b/resume_builder/helpers/validate_resume_system.py @@ -285,6 +285,9 @@ def scan_document(path: Path, claims: dict, template: bool = False) -> list[str] # across employers ("Research Software Engineer" contains "Software Engineer") and that # produced a false positive on two real resumes. Employers excluded from documents are # skipped outright - their absence is the point, not a defect. + # Employment dates belong on a CV. A cover letter naming an employer in prose is not + # claiming a date, so requiring one there is a false positive. + is_cv = "resume" in path.name.lower() or "cv" in path.name.lower() or "lebenslauf" in path.name.lower() excluded = {item["term"].lower() for item in claims.get("document_exclusions", [])} schooling_removed = fold(lowered) for school in claims.get("education", []): @@ -292,7 +295,7 @@ def scan_document(path: Path, claims: dict, template: bool = False) -> list[str] institution = fold(school.get(key) or "") if len(institution) > 5: schooling_removed = schooling_removed.replace(institution, " ") - for employer in claims.get("employment", []): + for employer in (claims.get("employment", []) if is_cv else []): name = (employer.get("employer") or "").lower() if not name or any(term in name for term in excluded): continue