Repository navigation
test(resume): cover the planfile ticket status contract (ticket-119) - #142
Conversation
Vendor planfile.ticket-status/v1 (semcod/planfile 6670b38) as a pinned fixture and assert resume's status sets cover every planfile status by class, so a new status cannot silently become unknown_statuses again. Ticket: ticket-119
There was a problem hiding this comment.
Validator approval after policy checks for exact head fe50a9ad53563b903889e07dc909b1df2f5d958c.
Ticket: ticket-119
Correlation ID: local-semcod-monag-pr-142-ticket-119
Model: openai/cursor-auto
Reviewed diff chunks: 1
Advisory LLM verdict: REQUEST_CHANGES
Advisory summary: Reviewed all 1 diff chunk(s). Required checks pass, and the fixture-based contract test covers the listed statuses, stalled classification, and unknown-status behavior. Two unresolved correctness issues remain in the visible changes.
Advisory findings: project/TICKETS.md adds ticket-118 even though this change introduces ticket-119; ticket-119 is therefore absent from the ticket index.; tests/test_resume.py only asserts that each status is present in the expected OPEN or CLOSED set. It does not assert absence from the opposite set, so an overlapping/misclassified status could satisfy the test while runtime classification remains ambiguous or incorrect. Assert exclusive membership according to the contract's pending flag.
The LLM output above is advisory and was not used as the approval trust root.
Semantic review prerequisite: not_required; policy 676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7.
Actual PR impact radar
Exact range: f8bff8cf165b90d4808f216de5cd74e544f4dd6b...fe50a9ad53563b903889e07dc909b1df2f5d958c
Change digest: 2836dad7b4ccc69f69e97bd2634aa5d9460efed52219df3829a799af55a66193
Score: 60/100 (L), estimated 72 min, split recommended: true
Affected services/components: repository-wide/unclassified
Machine-readable radar JSONL and SVG
{"actual_change":{"additions":152,"base_sha":"f8bff8cf165b90d4808f216de5cd74e544f4dd6b","binary_files":0,"categories":{"code":1,"configuration":1,"docs":2,"tests":2},"change_digest":"2836dad7b4ccc69f69e97bd2634aa5d9460efed52219df3829a799af55a66193","comparison":"f8bff8cf165b90d4808f216de5cd74e544f4dd6b...fe50a9ad53563b903889e07dc909b1df2f5d958c","deletions":0,"file_count":6,"files":["project/TICKETS.md","project/ticket-119/README.md","project/ticket-119/intent.json","src/monag/resume.py","tests/fixtures/planfile-ticket-status.v1.json","tests/test_resume.py"],"head_sha":"fe50a9ad53563b903889e07dc909b1df2f5d958c","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":2,"scope":3,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":72,"within_budget":false},"impact":{"components":["planfile","project","semcod","src/monag","tests"],"files":["planfile/schemas/ticket-status.v1.json","project/TICKETS.md","project/ticket-119/README.md","project/ticket-119/intent.json","semcod/planfile","src/monag/resume.py","tests/fixtures/planfile-ticket-status.v1.json","tests/test_resume.py"],"public_interfaces":["planfile/schemas/ticket-status.v1.json"],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":60,"split":{"parts":[{"estimated_minutes":20,"name":"Define contract and acceptance boundary","scope":["planfile/schemas/ticket-status.v1.json"]},{"estimated_minutes":10,"name":"Implement planfile","scope":["planfile"]},{"estimated_minutes":10,"name":"Implement project","scope":["project"]},{"estimated_minutes":10,"name":"Implement semcod","scope":["semcod"]},{"estimated_minutes":10,"name":"Implement src/monag","scope":["src/monag"]},{"estimated_minutes":10,"name":"Implement tests","scope":["tests"]},{"estimated_minutes":15,"name":"Validate and project to trackers","scope":["tests","planfile","github/gitlab/jira projections"]}],"reason":"estimated_minutes_exceed_budget","recommended":true},"standards":[{"id":"wellmanifest/dsl","revision":"6c60fc4e0dd1f1bb74f46a7745e28019908d1203","version":"0.1.0-dev"},{"id":"wellmanifest/ticket-lifecycle","revision":"5bf581907a87b46a13a73e6c033d3abe4d9a306f","version":"0.1.0-dev"},{"id":"wellmanifest/git-lifecycle","revision":"7d77d4b7af57e69bc75c3a0290b3a4805c5c4438","version":"0.2.0-dev"},{"id":"wellmanifest/logs","revision":"48c284ef7a069055c0bcb6b900147ce5e65f8b43","version":"0.3.0"}],"ticket_ref":"ticket-119"}<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-119: test(resume): cover the planfile ticket status contract (ticket-119)</title><rect width="128" height="128" rx="12" fill="#f8fafc"/><g stroke-width="1"><polygon points="64,55 72,61 69,71 59,71 56,61" fill="none" stroke="#d7dde5"/><polygon points="64,47 80,59 74,78 54,78 48,59" fill="none" stroke="#d7dde5"/><polygon points="64,38 89,56 79,85 49,85 39,56" fill="none" stroke="#d7dde5"/><polygon points="64,30 97,53 84,92 44,92 31,53" fill="none" stroke="#d7dde5"/><polygon points="64,21 105,51 89,99 39,99 23,51" fill="none" stroke="#d7dde5"/><line x1="64" y1="64" x2="64" y2="21" stroke="#aab4c0"/><line x1="64" y1="64" x2="105" y2="51" stroke="#aab4c0"/><line x1="64" y1="64" x2="89" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="39" y2="99" stroke="#aab4c0"/><line x1="64" y1="64" x2="23" y2="51" stroke="#aab4c0"/></g><polygon points="64,38 105,51 79,85 54,78 48,59" fill="#fb923c" fill-opacity="0.45" stroke="#c2410c" stroke-width="2"/><circle cx="64" cy="64" r="3" fill="#c2410c"/><g font-family="sans-serif" font-size="7" fill="#334155"><text x="64" y="11" text-anchor="middle">SCO</text><text x="114" y="48" text-anchor="middle">COU</text><text x="95" y="107" text-anchor="middle">UNC</text><text x="33" y="107" text-anchor="middle">VAL</text><text x="14" y="48" text-anchor="middle">DEL</text></g><text x="64" y="124" text-anchor="middle" font-family="sans-serif" font-size="8" fill="#0f172a">L · 72m</text></svg>DECISION D-119-3951
TICKET ticket-119
HEAD_SHA fe50a9ad53563b903889e07dc909b1df2f5d958c
CORRELATION_ID local-semcod-monag-pr-142-ticket-119
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["governance / remote lifecycle=PASS","governance / enforce=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["onedev/local-verify","governance / remote lifecycle","governance / enforce"]
INPUT required_checks_source = "protected registry (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT semantic_review_assessment = {"schema":"subactor.validator/semantic-review-assessment/v1","subject":{"repository":"semcod/monag","pull_request":142,"head_sha":"fe50a9ad53563b903889e07dc909b1df2f5d958c","base_sha":"f8bff8cf165b90d4808f216de5cd74e544f4dd6b","diff_sha256":"4dbceb3534119c8f5c0bb08eb02242fc06ccec7194d12c8b40dd6301065fe82d"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["project/TICKETS.md","project/ticket-119/README.md","project/ticket-119/intent.json","src/monag/resume.py","tests/fixtures/planfile-ticket-status.v1.json","tests/test_resume.py"]},"grounding":"full-diff-not-per-finding-proof","execution_authority":false,"status":"not_required","reason":null,"review_sha256":null,"unresolved":[]}
INPUT superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"f8bff8cf165b90d4808f216de5cd74e544f4dd6b","head_sha":"fe50a9ad53563b903889e07dc909b1df2f5d958c","change_digest":"2836dad7b4ccc69f69e97bd2634aa5d9460efed52219df3829a799af55a66193","score":60,"complexity":"L","estimated_minutes":72,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "REQUEST_CHANGES" MODEL "openai/cursor-auto"
ASSERT VERDICT_AUTHORITY != "ADVISORY"
Ticket: ticket-119
Follow-up to #141. semcod/planfile#262 publishes
planfile/schemas/ticket-status.v1.json. This vendors it (pinned to 6670b38, sha256cd8495ae…) as a test fixture and asserts that for every planfile status resume'sOPEN/CLOSEDcontain it by itspendingflag,STALLEDmatches thestalledclass and it never counts as unknown. A future planfile status then fails this test on fixture refresh instead of blocking fleet admission in production.Evidence: tests/test_resume.py 28 passed, 7 subtests; governance-check GOV-PASS.