Repository navigation
fix(sync): disambiguate local numeric issue selectors (ticket-254) - #314
Conversation
There was a problem hiding this comment.
Validator approval after policy checks for exact head 3aac59eb80b41c6853fb14abd87426b529e1169a.
Ticket: ticket-254
Correlation ID: local-semcod-planfile-pr-314-ticket-254
Model: openai/cursor-auto
Reviewed diff chunks: 2
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 2 diff chunk(s). The visible changes correctly give GitHub local ticket identities precedence over bare numeric remote aliases, preserve explicit remote selectors containing '#', reject conflicting local-to-remote mappings before provider reads, and retain prior behavior outside strict GitHub selection. The added tests cover mapped and unmapped numeric local IDs, explicit remote forms, combined selectors, unchanged unrelated tickets, and conflict rejection before I/O. All protected required checks passed. | The visible regression test correctly verifies that a selected-state mapping lookup failure propagates, prevents remote issue fetches, and leaves local storage unchanged. All protected required checks passed.
Advisory findings: none
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: be3b0af32f7c7f82b0665632c0c7ccdf66039502...3aac59eb80b41c6853fb14abd87426b529e1169a
Change digest: 33e1c20b85e45070f202cb1c0c733d369dce139044c6994b687ddd3d2157d14b
Score: 68/100 (L), estimated 78 min, split recommended: true
Affected services/components: repository-wide/unclassified
Machine-readable radar JSONL and SVG
{"actual_change":{"additions":208,"base_sha":"be3b0af32f7c7f82b0665632c0c7ccdf66039502","binary_files":0,"categories":{"code":1,"configuration":1,"docs":2,"tests":1},"change_digest":"33e1c20b85e45070f202cb1c0c733d369dce139044c6994b687ddd3d2157d14b","comparison":"be3b0af32f7c7f82b0665632c0c7ccdf66039502...3aac59eb80b41c6853fb14abd87426b529e1169a","deletions":9,"file_count":5,"files":["planfile/sync/operations.py","project/TICKETS.md","project/ticket-254/README.md","project/ticket-254/intent.json","tests/test_sync_selected_provider_reads.py"],"head_sha":"3aac59eb80b41c6853fb14abd87426b529e1169a","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":4,"scope":3,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":78,"within_budget":false},"impact":{"components":["current-head","fixture","planfile","project","tests","transport"],"files":["current-head/base","fixture/repo","planfile/sync/operations.py","project/TICKETS.md","project/ticket-254/README.md","project/ticket-254/intent.json","tests/test_sync_selected_provider_reads.py","transport/deadline"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":68,"split":{"parts":[{"estimated_minutes":12,"name":"Implement current-head","scope":["current-head"]},{"estimated_minutes":12,"name":"Implement fixture","scope":["fixture"]},{"estimated_minutes":12,"name":"Implement planfile","scope":["planfile"]},{"estimated_minutes":12,"name":"Implement project","scope":["project"]},{"estimated_minutes":12,"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-254"}<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-254: fix(sync): disambiguate local numeric issue selectors (ticket-254)</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 31,53" 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 · 78m</text></svg>DECISION D-254-7231
TICKET ticket-254
HEAD_SHA 3aac59eb80b41c6853fb14abd87426b529e1169a
CORRELATION_ID local-semcod-planfile-pr-314-ticket-254
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["notify=PASS","test (3.10)=PASS","test (3.13)=PASS","governance / enforce=PASS","governance / remote lifecycle=PASS","freshness=PASS","ci-loop=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["ci-loop","notify","freshness","governance / remote lifecycle","governance / enforce","test (3.10)","test (3.13)","onedev/local-verify"]
INPUT required_checks_source = "protected registry + GitHub applied rules (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT semantic_review_assessment = {"schema":"subactor.validator/semantic-review-assessment/v1","subject":{"repository":"semcod/planfile","pull_request":314,"head_sha":"3aac59eb80b41c6853fb14abd87426b529e1169a","base_sha":"be3b0af32f7c7f82b0665632c0c7ccdf66039502","diff_sha256":"2ec50fa066b21071bdb8d9c5abc0f4c95a906149211f36a1df55a00e1c101404"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["planfile/sync/operations.py","project/TICKETS.md","project/ticket-254/README.md","project/ticket-254/intent.json","tests/test_sync_selected_provider_reads.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":"be3b0af32f7c7f82b0665632c0c7ccdf66039502","head_sha":"3aac59eb80b41c6853fb14abd87426b529e1169a","change_digest":"33e1c20b85e45070f202cb1c0c733d369dce139044c6994b687ddd3d2157d14b","score":68,"complexity":"L","estimated_minutes":78,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "APPROVE" MODEL "openai/cursor-auto"
ASSERT VERDICT_AUTHORITY != "ADVISORY"There was a problem hiding this comment.
Validator approval after policy checks for exact head 3aac59eb80b41c6853fb14abd87426b529e1169a.
Ticket: ticket-254
Correlation ID: local-semcod-planfile-pr-314-ticket-254
Model: openai/cursor-auto
Reviewed diff chunks: 2
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 2 diff chunk(s). The visible chunk correctly gives GitHub local ticket identities precedence over ambiguous numeric remote aliases, preserves explicit remote issue selectors, rejects conflicting mappings before provider reads, and keeps non-GitHub behavior unchanged. Regression tests cover mapped and unmapped numeric local IDs, explicit remote forms, combined selectors, unrelated-ticket preservation, and pre-fetch conflict rejection. All protected required checks passed. | The visible regression test verifies that a selected mapping-state lookup failure propagates and stops processing before any remote issue fetch or local-store mutation. All protected required checks passed.
Advisory findings: none
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: be3b0af32f7c7f82b0665632c0c7ccdf66039502...3aac59eb80b41c6853fb14abd87426b529e1169a
Change digest: 33e1c20b85e45070f202cb1c0c733d369dce139044c6994b687ddd3d2157d14b
Score: 68/100 (L), estimated 78 min, split recommended: true
Affected services/components: repository-wide/unclassified
Machine-readable radar JSONL and SVG
{"actual_change":{"additions":208,"base_sha":"be3b0af32f7c7f82b0665632c0c7ccdf66039502","binary_files":0,"categories":{"code":1,"configuration":1,"docs":2,"tests":1},"change_digest":"33e1c20b85e45070f202cb1c0c733d369dce139044c6994b687ddd3d2157d14b","comparison":"be3b0af32f7c7f82b0665632c0c7ccdf66039502...3aac59eb80b41c6853fb14abd87426b529e1169a","deletions":9,"file_count":5,"files":["planfile/sync/operations.py","project/TICKETS.md","project/ticket-254/README.md","project/ticket-254/intent.json","tests/test_sync_selected_provider_reads.py"],"head_sha":"3aac59eb80b41c6853fb14abd87426b529e1169a","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":4,"scope":3,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":78,"within_budget":false},"impact":{"components":["current-head","fixture","planfile","project","tests","transport"],"files":["current-head/base","fixture/repo","planfile/sync/operations.py","project/TICKETS.md","project/ticket-254/README.md","project/ticket-254/intent.json","tests/test_sync_selected_provider_reads.py","transport/deadline"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":68,"split":{"parts":[{"estimated_minutes":12,"name":"Implement current-head","scope":["current-head"]},{"estimated_minutes":12,"name":"Implement fixture","scope":["fixture"]},{"estimated_minutes":12,"name":"Implement planfile","scope":["planfile"]},{"estimated_minutes":12,"name":"Implement project","scope":["project"]},{"estimated_minutes":12,"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-254"}<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-254: fix(sync): disambiguate local numeric issue selectors (ticket-254)</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 31,53" 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 · 78m</text></svg>DECISION D-254-7499
TICKET ticket-254
HEAD_SHA 3aac59eb80b41c6853fb14abd87426b529e1169a
CORRELATION_ID local-semcod-planfile-pr-314-ticket-254
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["notify=PASS","test (3.10)=PASS","test (3.13)=PASS","governance / enforce=PASS","governance / remote lifecycle=PASS","freshness=PASS","ci-loop=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["ci-loop","notify","freshness","governance / remote lifecycle","governance / enforce","test (3.10)","test (3.13)","onedev/local-verify"]
INPUT required_checks_source = "protected registry + GitHub applied rules (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT semantic_review_assessment = {"schema":"subactor.validator/semantic-review-assessment/v1","subject":{"repository":"semcod/planfile","pull_request":314,"head_sha":"3aac59eb80b41c6853fb14abd87426b529e1169a","base_sha":"be3b0af32f7c7f82b0665632c0c7ccdf66039502","diff_sha256":"2ec50fa066b21071bdb8d9c5abc0f4c95a906149211f36a1df55a00e1c101404"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["planfile/sync/operations.py","project/TICKETS.md","project/ticket-254/README.md","project/ticket-254/intent.json","tests/test_sync_selected_provider_reads.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":"be3b0af32f7c7f82b0665632c0c7ccdf66039502","head_sha":"3aac59eb80b41c6853fb14abd87426b529e1169a","change_digest":"33e1c20b85e45070f202cb1c0c733d369dce139044c6994b687ddd3d2157d14b","score":68,"complexity":"L","estimated_minutes":78,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "APPROVE" MODEL "openai/cursor-auto"
ASSERT VERDICT_AUTHORITY != "ADVISORY"
A local ticket may have a numeric ID such as
554while mapping to GitHub issue999. Scoped inbound sync previously read both issues and could close an unrelated local ticket mapped to issue554. Bare local IDs now resolve to their mapped issue only; explicit#554andfixture/repo#554continue to select the remote issue.Conflicting selected mappings and state lookup failures stop before issue fetch rather than broadening the selection. Non-GitHub and unscoped behavior remains unchanged. No runtime deployment is included.
Part of #256. Native ticket:
ticket-254; follow-up to #312. The remaining transport/deadline work in #256 is still open.Validation: six failing regression cases reproduced on #312 across YAML and sharded storage, with eight controls passing. After correction, all 683 affected sync tests pass, including 76 selected-read cases; Ruff and native governance pass. Protected current-head/base verification and independent Validator approval are required before merge.