Classification
NECESSARY / V0.1 closure blocker.
Trigger
PR #98 / WO-024-P, exact HEAD 71776ca70bc3808a07e3c4bede43b5570cfdae4b, hosted CI run 35246912961.
Validate and Integration health PASS. Review Evidence FAILS while generating the manifest with:
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'
at verify_wo024_approved_lineage() when reading closure.get("dod_pass_count") / dod_total_count.
Root cause
integration_evidence() intentionally does not publish v01_closure_sprint into the schema-bound Review Evidence manifest. This is deliberate and covered by test_wo024_manifest_stays_schema_valid_without_closure_property().
However, build_manifest() currently invokes:
fetch_wo024_approved_lineage(repository, integration.get("v01_closure_sprint", {}))
Since that key is intentionally absent, the lineage verifier receives {}. The actual v01-closure-sprint-v1 artifact exists in the same run and is PASS with DoD 46/46; the defect is the wrong data-source seam, not closure evidence itself.
Required correction
Create a separate bounded governance/test-only corrective increment WO-024-P-G1-C3 from protected main 0df7bb1079fe2a5bdc5ec55fcc76941ca31b8d2c.
The final promotion PR #98 must remain exactly two canonical files and must not absorb this correction.
Expected implementation outcome:
- keep
v01_closure_sprint OUT of the schema-bound integration_evidence() manifest;
- make the WO-024-P approved-lineage path consume the already validated
closure_sprint_evidence() payload, or an equivalent explicit validated closure payload, rather than integration.get("v01_closure_sprint", {});
- preserve all fail-closed closure validation and immutable WO-024 lineage checks;
- add behavioral regression coverage proving the final-promotion path receives complete closure counts while the integration manifest still omits the undeclared closure property;
- add a negative proving missing/incomplete closure still fails closed.
Suggested exact scope
scripts/review_evidence.py
backend/tests/test_review_evidence.py
Generated deterministic maps only if the existing repository tooling proves they must change. No Project Brain/canonical files, product code, migrations, dependencies, workflows, ruleset or release assets.
Acceptance
Exact-head Validate, Integration health, and Review Evidence PASS; Ready/mergeable; zero unresolved threads; auto-merge UNARMED; executor stops before merge. After Sol merge + post-merge push CI, refresh same PR #98 onto new main and rerun its three gates.
Classification
NECESSARY / V0.1 closure blocker.
Trigger
PR #98 / WO-024-P, exact HEAD
71776ca70bc3808a07e3c4bede43b5570cfdae4b, hosted CI run35246912961.Validate and Integration health PASS. Review Evidence FAILS while generating the manifest with:
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'at
verify_wo024_approved_lineage()when readingclosure.get("dod_pass_count")/dod_total_count.Root cause
integration_evidence()intentionally does not publishv01_closure_sprintinto the schema-bound Review Evidence manifest. This is deliberate and covered bytest_wo024_manifest_stays_schema_valid_without_closure_property().However,
build_manifest()currently invokes:fetch_wo024_approved_lineage(repository, integration.get("v01_closure_sprint", {}))Since that key is intentionally absent, the lineage verifier receives
{}. The actualv01-closure-sprint-v1artifact exists in the same run and is PASS with DoD 46/46; the defect is the wrong data-source seam, not closure evidence itself.Required correction
Create a separate bounded governance/test-only corrective increment
WO-024-P-G1-C3from protected main0df7bb1079fe2a5bdc5ec55fcc76941ca31b8d2c.The final promotion PR #98 must remain exactly two canonical files and must not absorb this correction.
Expected implementation outcome:
v01_closure_sprintOUT of the schema-boundintegration_evidence()manifest;closure_sprint_evidence()payload, or an equivalent explicit validated closure payload, rather thanintegration.get("v01_closure_sprint", {});Suggested exact scope
scripts/review_evidence.pybackend/tests/test_review_evidence.pyGenerated deterministic maps only if the existing repository tooling proves they must change. No Project Brain/canonical files, product code, migrations, dependencies, workflows, ruleset or release assets.
Acceptance
Exact-head
Validate,Integration health, andReview EvidencePASS; Ready/mergeable; zero unresolved threads; auto-merge UNARMED; executor stops before merge. After Sol merge + post-merge push CI, refresh same PR #98 onto new main and rerun its three gates.