Repository navigation
fix: avoid projection rebuild under dedupe lock (ticket-216) - #264
Conversation
There was a problem hiding this comment.
Validator approval after policy checks for exact head a3be9d30c29c32de59cb3010be3c55d7386cb054.
Ticket: ticket-216
Correlation ID: local-semcod-planfile-pr-264-ticket-216
Model: openai/cursor-auto
Reviewed diff chunks: 1
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 1 diff chunk(s). The bounded change uses the existing nonrepairing ticket lookup during deduplicated reuse, preventing stale or missing SQLite projections from triggering a full rebuild while the mutation lock is held. Regression coverage spans missing and stale projections, current and archived tickets, and optional occurrence notes. 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: ca3f35c934f3b2cd06b369adf44c6863ac8f4712...a3be9d30c29c32de59cb3010be3c55d7386cb054
Change digest: 5d5456f42e28c2ac82a5ae3045b9f23c51ae6be8ec4d267b4371949a5e232ead
Score: 68/100 (L), estimated 83 min, split recommended: true
Affected services/components: repository-wide/unclassified
Machine-readable radar JSONL and SVG
{"actual_change":{"additions":145,"base_sha":"ca3f35c934f3b2cd06b369adf44c6863ac8f4712","binary_files":0,"categories":{"code":1,"configuration":1,"docs":2,"tests":1},"change_digest":"5d5456f42e28c2ac82a5ae3045b9f23c51ae6be8ec4d267b4371949a5e232ead","comparison":"ca3f35c934f3b2cd06b369adf44c6863ac8f4712...a3be9d30c29c32de59cb3010be3c55d7386cb054","deletions":1,"file_count":5,"files":["planfile/__init__.py","project/TICKETS.md","project/ticket-216/README.md","project/ticket-216/intent.json","tests/test_ticket_create_dedupe.py"],"head_sha":"a3be9d30c29c32de59cb3010be3c55d7386cb054","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":3,"scope":4,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":83,"within_budget":false},"impact":{"components":["Stale","current","missing","planfile","project","tests","with"],"files":["Stale/missing","current/archived","missing/stale","planfile/__init__.py","project/TICKETS.md","project/ticket-216/README.md","project/ticket-216/intent.json","tests/test_ticket_create_dedupe.py","with/without"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":68,"split":{"parts":[{"estimated_minutes":11,"name":"Implement Stale","scope":["Stale"]},{"estimated_minutes":11,"name":"Implement current","scope":["current"]},{"estimated_minutes":11,"name":"Implement missing","scope":["missing"]},{"estimated_minutes":11,"name":"Implement planfile","scope":["planfile"]},{"estimated_minutes":11,"name":"Implement project","scope":["project"]},{"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-216"}<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-216: fix: avoid projection rebuild under dedupe lock (ticket-216)</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,30 105,51 79,85 54,78 39,56" 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 · 83m</text></svg>DECISION D-216-0562
TICKET ticket-216
HEAD_SHA a3be9d30c29c32de59cb3010be3c55d7386cb054
CORRELATION_ID local-semcod-planfile-pr-264-ticket-216
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","freshness=PASS","governance / remote lifecycle=PASS","ci-loop=PASS","governance / enforce=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":264,"head_sha":"a3be9d30c29c32de59cb3010be3c55d7386cb054","base_sha":"ca3f35c934f3b2cd06b369adf44c6863ac8f4712","diff_sha256":"13e43c98432841f06513e8a16a717e896eae5797a7978091fbac7181745a04db"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["planfile/__init__.py","project/TICKETS.md","project/ticket-216/README.md","project/ticket-216/intent.json","tests/test_ticket_create_dedupe.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":"ca3f35c934f3b2cd06b369adf44c6863ac8f4712","head_sha":"a3be9d30c29c32de59cb3010be3c55d7386cb054","change_digest":"5d5456f42e28c2ac82a5ae3045b9f23c51ae6be8ec4d267b4371949a5e232ead","score":68,"complexity":"L","estimated_minutes":83,"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"
Delivery
Ticket-216 / PLF-18410: use existing nonrepairing ticket lookup inside deduplication mutation lock. Stale/missing SQLite projection falls back to authoritative sources instead of rebuilding every archive while holding the writer lock. Normal index maintenance is unchanged.
Validation
Eight deterministic regressions failed before the change and pass afterward: missing/stale projection, current/archived ticket, with/without occurrence notes. 45 focused tests passed; full suite 1273 passed, 6 skipped. Ruff and governance clean. Protected OneDev and independent Validator required. No deployment claimed for this change.