fix(F08-F10): machine-checkable evidence, honest templates, demoted GPA
F08 - evidence metadata - Only 1 of 26 claims carried structured source/last_verified/ownership, which is why recency and reference checks could not run. Added an evidence_schema block and an evidence block on all 26 claims. - 8 dates were recovered from each claim's OWN recorded text; the other 18 are written as the literal "unrecorded". Nothing was inferred. "unrecorded" means nobody wrote it down, NOT that the claim is unevidenced - most carry evidence in their free-text scope. - Coverage is reported as an advisory warning, never a gate: failing on it would push a future session to invent dates to clear the run. F09 - templates - resume_template.tex asserted "12+ years of production software experience". It does not hold: canonical employment starts 2014-11 (~11y10m) and the VISIBLE chronology starts 2015-05 (~11y4m) because Capgemini is omitted. Now "over ten years", with the arithmetic and the no-date-math rule inline. - cv_template.tex still carries page targets, rendered-line budgets and 2L/3L variants the project dropped. Banner-marked as the ACADEMIC legacy path so it is not reached for whenever a posting says "CV". F10 - US GPA - The modified Bavarian formula converts FOREIGN grades INTO the German system. Inverting it to produce a US GPA is not a recognised method, and the TUM source calls even its forward calculator orientation only. - Fields renamed to final_grade_us_4pt_orientation_only with that caveat. The German grades remain the canonical facts. If a recipient publishes its own conversion, use theirs and record which was used. Validator PASS (1 advisory), 31/31 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
This commit is contained in:
1 parent
ce5b7f511f
commit
3519b2ffe7
5 files changed
+192
-11
No files matched your search
@@ -88,6 +88,21 @@ def canonical_checks(claims: dict, history: dict) -> tuple[list[str], list[str]]
|
||||
if duplicates:
|
||||
errors.append(f"historical output folders classified twice: {', '.join(duplicates)}")
|
||||
|
||||
# F08: evidence-metadata coverage is reported, never gated. "unrecorded" means nobody
|
||||
# wrote it down - it does NOT mean the claim is unevidenced, and failing on it would
|
||||
# push someone to invent dates to get a green run.
|
||||
claim_list = claims.get("claims", [])
|
||||
missing_block = [c.get("id") for c in claim_list if not c.get("evidence")]
|
||||
if missing_block:
|
||||
errors.append("claims without an evidence block: " + ", ".join(map(str, missing_block)))
|
||||
undated = [c.get("id") for c in claim_list
|
||||
if (c.get("evidence") or {}).get("last_verified") == "unrecorded"]
|
||||
if undated:
|
||||
warnings.append(
|
||||
f"{len(undated)} of {len(claim_list)} claims have last_verified 'unrecorded' "
|
||||
f"({', '.join(map(str, undated[:6]))}{', ...' if len(undated) > 6 else ''}). "
|
||||
"Record a real date when one is confirmed; never infer one to clear this hint.")
|
||||
|
||||
if claims["identity"].get("swiss_permit", "").startswith("UNVERIFIED"):
|
||||
warnings.append("Swiss permit type remains unverified; generators must ask before naming it")
|
||||
return errors, warnings
|
||||
|
||||
Reference in new issue
Block a user