fix(F17): a PDF in a folder is not proof the package can be rebuilt

Build sweep run this session: 48 sources, 46 built, 2 failed. Infineon_AI_Engineer's
cover letter fails on font expansion (the font is not scalable); cv_template.tex
fails on unfilled placeholders, which is expected for the academic legacy path.
Overfull boxes: Microsoft ISE 25.33pt, Isovalent 0.88pt. All historical, all
left alone.

New: resume_builder/helpers/package_manifest.py records, per application
package, what a rebuild would ACTUALLY do - sources, class-file hashes, PDFs
present, and the reasons a rebuild would not reproduce the submitted document.
It is descriptive; nothing in it authorises rewriting a submitted file.

What it found across 21 packages:
- 17 are DATE-DEPENDENT. The cover letters use 	oday, so recompiling a
  historical package silently restamps it with today's date.
- 1 has an INCOMPLETE SOURCE DISTRIBUTION: output/NATO_AI_ENGINEER ships no
  resume.cls. It builds on this machine only because a copy exists elsewhere,
  and the shipped PDF hid that. Not repaired by copying the newest class in -
  the repo carries THREE different resume.cls variants (13/7/1 copies) and older
  macros differ, so that "fix" could silently change a historical document.
- 1 has no PDF at all, so nothing is reviewable without a build.

Classification: 7 application packages were in no reuse category. Added to
historical_revalidate, and the register now records the default explicitly -
anything unlisted is treated as revalidate-before-reuse. Being recent is not the
same as being verified; none of the seven was re-read for this.

Prevention rather than repair: 	oday removed from the cover-letter template so
new packages stop adding to the pile. A test now fails if it comes back, if the
manifest goes stale, or if a package is left unclassified.

Also: scan_document gained a template mode. A placeholder in a TEMPLATE is what
makes it a template; the defect is one surviving into a generated document.

37/37 tests pass; counter-proof still catches all 9.

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 20:48:52 +02:00
1 parent c7e8d4e058
commit eecdbdade6
7 files changed
+797 -24

No files matched your search

@@ -0,0 +1,534 @@
{
"schema_version": 1,
"generated_note": "Generated by package_manifest.py (review finding F17). A PDF in a folder is not evidence that the package is reproducible. This file records what would actually happen on a rebuild. It is descriptive: nothing here authorises rewriting a submitted document.",
"packages": {
"AkerBP_Data_Product_Architect": {
"sources": [
"e2e_akerbp_data_product_architect_cover_letter.tex",
"e2e_akerbp_data_product_architect_resume.tex"
],
"class_files": {
"resume.cls": "b3a032a850cd0d6d"
},
"requires_class": [
"article",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_akerbp_data_product_architect_cover_letter.pdf",
"e2e_akerbp_data_product_architect_resume.pdf"
],
"uses_today": [],
"problems": [],
"reuse_classification": "recorded"
},
"Apple_Data_Engineer": {
"sources": [
"e2e_apple_data_engineer_cover_letter.tex",
"e2e_apple_data_engineer_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"e2e_apple_data_engineer_cover_letter.pdf",
"e2e_apple_data_engineer_resume.pdf"
],
"uses_today": [
"e2e_apple_data_engineer_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_apple_data_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"BIS": {
"sources": [
"e2e_bis_senior_data_analytics_ai_cover_letter.tex",
"e2e_bis_senior_data_analytics_ai_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"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"
],
"uses_today": [
"e2e_bis_senior_data_analytics_ai_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_bis_senior_data_analytics_ai_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"CitadelSecurities_PlatformEngineer": {
"sources": [
"e2e_citadel_securities_platform_engineer_cover_letter.tex",
"e2e_citadel_securities_platform_engineer_resume.tex"
],
"class_files": {
"resume.cls": "b3a032a850cd0d6d"
},
"requires_class": [
"article",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_citadel_securities_platform_engineer_cover_letter.pdf",
"e2e_citadel_securities_platform_engineer_resume.pdf"
],
"uses_today": [],
"problems": [],
"reuse_classification": "recorded"
},
"Equinor_AI_Manager": {
"sources": [
"e2e_equinor_ai_manager_cover_letter.tex",
"e2e_equinor_ai_manager_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_equinor_ai_manager_cover_letter.pdf",
"e2e_equinor_ai_manager_resume.pdf"
],
"uses_today": [
"e2e_equinor_ai_manager_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_equinor_ai_manager_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"Google_Business_Home": {
"sources": [
"e2e_google_software_engineer_iii_business_home_cover_letter.tex",
"e2e_google_software_engineer_iii_business_home_cover_letter_v2.tex",
"e2e_google_software_engineer_iii_business_home_resume.tex",
"e2e_google_software_engineer_iii_business_home_resume_v2.tex"
],
"class_files": {
"resume.cls": "b3a032a850cd0d6d"
},
"requires_class": [
"article",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_google_software_engineer_iii_business_home_cover_letter.pdf",
"e2e_google_software_engineer_iii_business_home_cover_letter_v2.pdf",
"e2e_google_software_engineer_iii_business_home_resume.pdf",
"e2e_google_software_engineer_iii_business_home_resume_v2.pdf"
],
"uses_today": [],
"problems": [],
"reuse_classification": "recorded"
},
"Google_Senior_Data_Engineer": {
"sources": [
"e2e_google_senior_data_engineer_cover_letter.tex",
"e2e_google_senior_data_engineer_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_google_senior_data_engineer_cover_letter.pdf",
"e2e_google_senior_data_engineer_resume.pdf"
],
"uses_today": [
"e2e_google_senior_data_engineer_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_google_senior_data_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"Infineon": {
"sources": [
"e2e_infineon_doctoral_cover_letter.tex",
"e2e_infineon_doctoral_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_infineon_doctoral_cover_letter.pdf",
"e2e_infineon_doctoral_resume.pdf"
],
"uses_today": [
"e2e_infineon_doctoral_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_infineon_doctoral_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"Infineon_AI_Engineer": {
"sources": [
"e2e_infineon_ai_engineer_cover_letter.tex",
"e2e_infineon_ai_engineer_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"e2e_infineon_ai_engineer_resume.pdf"
],
"uses_today": [
"e2e_infineon_ai_engineer_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_infineon_ai_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"Isovalent_DataEngineer": {
"sources": [
"e2e_isovalent_data_engineer_cover_letter.tex",
"e2e_isovalent_data_engineer_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_isovalent_data_engineer_cover_letter.pdf",
"e2e_isovalent_data_engineer_resume.pdf"
],
"uses_today": [
"e2e_isovalent_data_engineer_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_isovalent_data_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"KdoCy_DevOps_Data_Platform": {
"sources": [
"e2e_kdocy_devops_data_platform_cover_letter.tex",
"e2e_kdocy_devops_data_platform_resume.tex"
],
"class_files": {
"resume.cls": "b3a032a850cd0d6d"
},
"requires_class": [
"article",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Lebenslauf.pdf",
"Dennis_Thiessen_Motivationsschreiben.pdf",
"e2e_kdocy_devops_data_platform_cover_letter.pdf",
"e2e_kdocy_devops_data_platform_resume.pdf"
],
"uses_today": [
"e2e_kdocy_devops_data_platform_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_kdocy_devops_data_platform_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"Kraken_AI_Infrastructure": {
"sources": [
"e2e_kraken_ai_infra_cover_letter.tex",
"e2e_kraken_ai_infra_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"Senior Software Engineer – AI Infrastructure @ Kraken.pdf",
"e2e_kraken_ai_infra_cover_letter.pdf",
"e2e_kraken_ai_infra_resume.pdf"
],
"uses_today": [
"e2e_kraken_ai_infra_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_kraken_ai_infra_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"Kraken_SRE_AI_Agents": {
"sources": [
"e2e_kraken_sre_ai_agents_cover_letter.tex",
"e2e_kraken_sre_ai_agents_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_kraken_sre_ai_agents_cover_letter.pdf",
"e2e_kraken_sre_ai_agents_resume.pdf"
],
"uses_today": [
"e2e_kraken_sre_ai_agents_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_kraken_sre_ai_agents_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"Microsoft_ISE_Senior_SWE": {
"sources": [
"e2e_microsoft_ise_cover_letter.tex",
"e2e_microsoft_ise_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_microsoft_ise_cover_letter.pdf",
"e2e_microsoft_ise_resume.pdf"
],
"uses_today": [
"e2e_microsoft_ise_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_microsoft_ise_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"Microsoft_Principal_FDE_SWE": {
"sources": [
"e2e_microsoft_principal_fde_swe_cover_letter.tex",
"e2e_microsoft_principal_fde_swe_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_microsoft_principal_fde_swe_cover_letter.pdf",
"e2e_microsoft_principal_fde_swe_resume.pdf"
],
"uses_today": [
"e2e_microsoft_principal_fde_swe_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_microsoft_principal_fde_swe_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"NATO_AI_ENGINEER": {
"sources": [
"e2e_nato_ai_engineer_cover_letter.tex",
"e2e_nato_ai_engineer_resume.tex"
],
"class_files": {},
"requires_class": [
"moderncv",
"resume"
],
"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"
],
"uses_today": [],
"problems": [
"source distribution incomplete: requires resume.cls, which is not in the folder. A build here only succeeds if a copy happens to exist elsewhere on the machine. Do NOT repair by copying the newest class in - the repo carries several class variants and older macros differ."
],
"reuse_classification": "recorded"
},
"NVIDIA_SrDevOps_Zurich": {
"sources": [
"e2e_nvidia_sr_devops_cover_letter.tex",
"e2e_nvidia_sr_devops_resume.tex"
],
"class_files": {
"resume.cls": "b3a032a850cd0d6d"
},
"requires_class": [
"article",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_nvidia_sr_devops_cover_letter.pdf",
"e2e_nvidia_sr_devops_resume.pdf"
],
"uses_today": [
"e2e_nvidia_sr_devops_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_nvidia_sr_devops_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"QuantCo_Cloud_Engineer": {
"sources": [
"e2e_quantco_cloud_engineer_cover_letter.tex",
"e2e_quantco_cloud_engineer_resume.tex"
],
"class_files": {
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_quantco_cloud_engineer_cover_letter.pdf",
"e2e_quantco_cloud_engineer_resume.pdf"
],
"uses_today": [
"e2e_quantco_cloud_engineer_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_quantco_cloud_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"RUAG_AI_Engineer_C5I": {
"sources": [
"e2e_ruag_ai_engineer_c5i_cover_letter.tex",
"e2e_ruag_ai_engineer_c5i_resume.tex"
],
"class_files": {
"resume.cls": "b52a6f7123ae9067"
},
"requires_class": [
"article",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Lebenslauf.pdf",
"Dennis_Thiessen_Motivationsschreiben.pdf",
"e2e_ruag_ai_engineer_c5i_cover_letter.pdf",
"e2e_ruag_ai_engineer_c5i_resume.pdf"
],
"uses_today": [
"e2e_ruag_ai_engineer_c5i_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_ruag_ai_engineer_c5i_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
},
"SBB_DataEngineer_AssetMgmt": {
"sources": [
"e2e_sbb_data_engineer_asset_mgmt_resume.tex"
],
"class_files": {
"resume.cls": "b3a032a850cd0d6d"
},
"requires_class": [
"resume"
],
"pdfs": [
"e2e_sbb_data_engineer_asset_mgmt_resume.pdf"
],
"uses_today": [],
"problems": [],
"reuse_classification": "recorded"
},
"Snowflake_Observe_Enterprise": {
"sources": [
"e2e_snowflake_observe_enterprise_cover_letter.tex",
"e2e_snowflake_observe_enterprise_resume.tex"
],
"class_files": {
"cv.cls": "a623d286e808b27e",
"resume.cls": "b26f882a42d30d90"
},
"requires_class": [
"moderncv",
"resume"
],
"pdfs": [
"Dennis_Thiessen_Cover_Letter.pdf",
"Dennis_Thiessen_Resume.pdf",
"e2e_snowflake_observe_enterprise_cover_letter.pdf",
"e2e_snowflake_observe_enterprise_resume.pdf"
],
"uses_today": [
"e2e_snowflake_observe_enterprise_cover_letter.tex"
],
"problems": [
"rebuild is date-dependent: e2e_snowflake_observe_enterprise_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
],
"reuse_classification": "recorded"
}
}
}