Skip to content

Bound fresh capture retries for changing application files (ticket-045) - #45

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/045-capture-source-retry
Oct 13, 2026
Merged

ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/045-capture-source-retry

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

A changing PyCharm LocalHistory file can abort a five-profile capture and delay the next complete copy until the next scheduled interval. This change allows a configured number of fresh attempts only for verified source-change errors. Failed staging is discarded; retry lock acquisition, planning, SQLite/compiler/native deadlines and publication share an additional retry deadline. Unsafe paths, byte budgets, SQLite failures and unverified/legacy worker diagnostics do not trigger retries.

The typed Env DSL settings are UNCRASH_CAPTURE_ATTEMPTS (1..3) and UNCRASH_CAPTURE_RETRY_TIMEOUT_SECONDS (1..600). Existing deployment files keep one attempt. The public template is owned by the governance workstream and follows as a separate material change; production can explicitly select two attempts after protected delivery.

Validation: final retry/diagnostic/configuration suite67PASS, including real Rust/plain/encrypted multi-file retries and deadline/process/lock failures. Full regression555PASS/9optionalSKIP/8subtests; managed governancePASS0errors0warnings. The initial full run encountered shared /tmp exhaustion; its failed result is retained, and the final run uses a fresh private disk-backed TMPDIR. No IDE or provider process is signaled by this change.

@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 a4a5f42ac3927936c4442d23d8ac1a00e4465b71.

Ticket: ticket-045
Correlation ID: uncrash-pr45-ticket045-protected-publication
Model: gemini/gemini-3.8-flash
Reviewed diff chunks: 3
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 3 diff chunk(s). Diff chunk 1 introduces typed configuration settings for capture retry attempts and retry timeouts, establishes SourceChangedError for verified concurrent mutations, and wires deadline-constrained execution into SQLite backups, native build/capture timeouts, and file locking. | This chunk implements the retry loop for snapshot capture upon verified SourceChangedError, threading retry deadlines through lock acquisition, filesystem traversal, SQLite backups, and native worker execution, supported by comprehensive unit and integration tests. | Diff chunk 3 adds comprehensive tests in test_capture_retry.py covering expired retry deadlines during staging publication, environment variable precedence over process variables, Python snapshot reader retry behavior on mutated files, deadline enforcement for SQLite snapshots and native builds, and input validation for retry configuration parameters.
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: d393951720b45ecedf797a2e617938551d9eb8bc...a4a5f42ac3927936c4442d23d8ac1a00e4465b71
Change digest: d0be105e8cafdc81df8b6c5994ff2ef5a669980d55f9e869caea18ff6e8424ec
Score: 72/100 (L), estimated 105 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":370,"base_sha":"d393951720b45ecedf797a2e617938551d9eb8bc","binary_files":0,"categories":{"code":2,"configuration":1,"docs":2,"tests":1},"change_digest":"d0be105e8cafdc81df8b6c5994ff2ef5a669980d55f9e869caea18ff6e8424ec","comparison":"d393951720b45ecedf797a2e617938551d9eb8bc...a4a5f42ac3927936c4442d23d8ac1a00e4465b71","deletions":13,"file_count":6,"files":["project/TICKETS.md","project/ticket-045/README.md","project/ticket-045/intent.json","src/uncrash/configuration.py","src/uncrash/store.py","tests/test_capture_retry.py"],"head_sha":"a4a5f42ac3927936c4442d23d8ac1a00e4465b71","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":3,"scope":5,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":105,"within_budget":false},"impact":{"components":["Rust","SQLite","deadline","project","regression555PASS","retry","src/uncrash","tests","unverified"],"files":["Rust/plain/encrypted","SQLite/compiler/native","deadline/process/lock","project/TICKETS.md","project/ticket-045/README.md","project/ticket-045/intent.json","regression555PASS/9optionalSKIP/8subtests","retry/diagnostic/configuration","src/uncrash/configuration.py","src/uncrash/store.py","tests/test_capture_retry.py","unverified/legacy"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":72,"split":{"parts":[{"estimated_minutes":11,"name":"Implement Rust","scope":["Rust"]},{"estimated_minutes":11,"name":"Implement SQLite","scope":["SQLite"]},{"estimated_minutes":11,"name":"Implement deadline","scope":["deadline"]},{"estimated_minutes":11,"name":"Implement project","scope":["project"]},{"estimated_minutes":11,"name":"Implement regression555PASS","scope":["regression555PASS"]},{"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-045"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-045: Bound fresh capture retries for changing application files (ticket-045)</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,21 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 · 105m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-045-5294
TICKET ticket-045
HEAD_SHA a4a5f42ac3927936c4442d23d8ac1a00e4465b71
CORRELATION_ID uncrash-pr45-ticket045-protected-publication
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["governance / enforce=PASS","governance / remote lifecycle=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["governance / enforce","governance / remote lifecycle","onedev/local-verify"]
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/uncrash","pull_request":45,"head_sha":"a4a5f42ac3927936c4442d23d8ac1a00e4465b71","base_sha":"d393951720b45ecedf797a2e617938551d9eb8bc","diff_sha256":"f8351009043e528163a57e8af302f45ed55942f153a41a5a8d9636678f8d0ba6"},"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-045/README.md","project/ticket-045/intent.json","src/uncrash/configuration.py","src/uncrash/store.py","tests/test_capture_retry.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":"d393951720b45ecedf797a2e617938551d9eb8bc","head_sha":"a4a5f42ac3927936c4442d23d8ac1a00e4465b71","change_digest":"d0be105e8cafdc81df8b6c5994ff2ef5a669980d55f9e869caea18ff6e8424ec","score":72,"complexity":"L","estimated_minutes":105,"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 "gemini/gemini-3.8-flash"
ASSERT VERDICT_AUTHORITY != "ADVISORY"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit 0949c21 into main Oct 13, 2026
3 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/045-capture-source-retry branch October 13, 2026 05:53
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