fix: clarify the Bosch 24/7 constraint; tidy build artefacts

BS-1 operating constraint - the F07 open item, resolved by the user
The user clarified what the 24/7 constraint actually is: a defect in the
software could, worst case, halt production - an outcome that must never occur.

That is a FAILURE-CONSEQUENCE constraint, and the submitted NVIDIA cover letter
states something different: "a production line that could not be stopped for a
deployment" describes a scheduling window. The distinction matters in both
directions - the letter is inaccurate, and the truth is the stronger claim.

- BS-1 scope now records the real constraint and how to write it.
- Both variants of the letter's phrasing are added to BS-1 `forbidden`, so the
  scanner catches them. Verified: it now flags the submitted letter.
- BS-1 evidence filled from a real source (this clarification) rather than left
  unrecorded, including ownership - integration and operation, not model work.
- The submitted letter is NOT rewritten (F17). experience_bosch.md records the
  resolution and the wording to use instead.

Scanner false positive fixed: the employer-date check now runs on CVs only. A
cover letter naming an employer in prose is not claiming a date.

Cleanup, authorised by the user
- 136 LaTeX build artefacts removed (already gitignored, regenerable).
- 7 superseded intermediate QA renders removed, 6 of them in NATO_AI_ENGINEER
  which carried nine PDFs for two documents.
- Nothing evidential touched: 36 submitted PDFs, 41 e2e deliverables, 44 sources,
  54 session/critique files and 20 JD files are intact. The Kraken PDF was
  checked before deleting and turned out to be the saved job description, not a
  render.
- output/ 16M -> 13M.

37/37 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
This commit is contained in:
dennisthiessenandClaude Opus 5 committed 2026-09-11 21:14:15 +02:00
1 parent b8c5141279
commit f2a1229701
4 files changed
+24 -22

No files matched your search

+7 -5
View File
@@ -324,11 +324,11 @@
{ {
"id": "BS-1", "id": "BS-1",
"evidence": { "evidence": {
"last_verified": "2026-08-27", "last_verified": "2026-09-11",
"source": "unrecorded", "source": "user clarification 2026-09-11 on the 24/7 operating constraint; Ansible scope user-confirmed 2026-08-27",
"ownership": "unrecorded" "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": [ "allowed_verbs": [
"integrated", "integrated",
"containerized", "containerized",
@@ -337,7 +337,9 @@
], ],
"forbidden": [ "forbidden": [
"trained the image classification model", "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" "metrics": "qualitative reduction in manual classification is source-backed; exact amount unverified"
}, },
@@ -63,7 +63,6 @@
"pdfs": [ "pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf", "Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf", "Dennis_Thiessen_Resume.pdf",
"critique_resume_check.pdf",
"e2e_bis_senior_data_analytics_ai_cover_letter.pdf", "e2e_bis_senior_data_analytics_ai_cover_letter.pdf",
"e2e_bis_senior_data_analytics_ai_resume.pdf" "e2e_bis_senior_data_analytics_ai_resume.pdf"
], ],
@@ -394,13 +393,7 @@
"pdfs": [ "pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf", "Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf", "Dennis_Thiessen_Resume.pdf",
"e2e_nato_ai_engineer_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"
], ],
"uses_today": [], "uses_today": [],
"problems": [ "problems": [
+12 -8
View File
@@ -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) **User's role:** Primary developer / strategy owner ("Erarbeitung und Durchführung" = designed AND executed)
**Status:** Deployed to production **Status:** Deployed to production
> **OPEN ITEM — confirm before reusing (review F07, 2026-09-11).** The NVIDIA and RUAG cover > **RESOLVED 2026-09-11 by the user** (was an open item from review F07). The real constraint is
> letters state that the production line could not be stopped for a deployment. That is a > a FAILURE CONSEQUENCE, not a deployment window: *"Bei einem Fehler (also Defekt in der Software)
> *stronger* claim than the canonical record, which establishes a continuously operating 24/7 fab > kann es zu einem Produktionsstopp im worst-case kommen, was natürlich nie passieren darf."*
> 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 > The submitted NVIDIA cover letter says *"a production line that could not be stopped for a
> preserved). **Before any new package repeats this framing, ask the user to confirm it and record > deployment"* — that is a **different and inaccurate** claim. It describes a scheduling
> the answer in `claims.json`.** Until then write the constraint as "integrated into a continuously > constraint; the truth is about the blast radius of a bug. **That exact phrasing is now
> operating production environment". > `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. **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.
@@ -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 # across employers ("Research Software Engineer" contains "Software Engineer") and that
# produced a false positive on two real resumes. Employers excluded from documents are # produced a false positive on two real resumes. Employers excluded from documents are
# skipped outright - their absence is the point, not a defect. # 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", [])} excluded = {item["term"].lower() for item in claims.get("document_exclusions", [])}
schooling_removed = fold(lowered) schooling_removed = fold(lowered)
for school in claims.get("education", []): 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 "") institution = fold(school.get(key) or "")
if len(institution) > 5: if len(institution) > 5:
schooling_removed = schooling_removed.replace(institution, " ") 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() name = (employer.get("employer") or "").lower()
if not name or any(term in name for term in excluded): if not name or any(term in name for term in excluded):
continue continue