Skip to content

fix(sync): disambiguate local numeric issue selectors (ticket-254) - #314

Merged
ifuri-validator-agent[bot] merged 3 commits into
mainfrom
ticket/254-selector-identity
Oct 28, 2026
Merged

ifuri-validator-agent[bot] merged 3 commits into
mainfrom
ticket/254-selector-identity

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

A local ticket may have a numeric ID such as 554 while mapping to GitHub issue 999. Scoped inbound sync previously read both issues and could close an unrelated local ticket mapped to issue 554. Bare local IDs now resolve to their mapped issue only; explicit #554 and fixture/repo#554 continue 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.

@tom-sapletta-com
tom-sapletta-com marked this pull request as ready for review October 28, 2026 17:30

@ifuri-validator-agent ifuri-validator-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
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"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit ff2193f into main Oct 28, 2026
8 checks passed

@ifuri-validator-agent ifuri-validator-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
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"

@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/254-selector-identity branch October 28, 2026 17:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant