Keep automatic version scans inside repository boundaries - #134
Conversation
8fd15cc to
e24a1dd
Compare
There was a problem hiding this comment.
Deterministic Validator approval for exact head 3d30d943b39d7cb4698cb9fe7d311c1e32669366.
Ticket: ticket-093
Correlation ID: goal-pr-134-ticket-093-r2
Model: zai/glm-5.3
Reviewed diff chunks: 2
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 2 diff chunk(s). Chunk 1/2 introduces a shared pruned filesystem iterator (project_version_files) that excludes nested .git dirs/gitfiles, .worktrees, .egg-info, configured skip dirs, and symlinks. It is correctly reused by discover_version_specs, _update_init_py_versions, and _sync_nested_versions, replacing the previous os.walk/rglob logic. Tests use real git fixtures and are reported passing. Remaining behavioral notes are minor; the test file's tail is covered in chunk 2. | Chunk 2 adds regression tests asserting discovery/sync do not traverse nested git checkouts, worktrees, gitfiles, dangling markers, .worktrees cache, or symlinked declarations, with byte-for-byte preservation and symlink immutability checks. Tests pass across matrix; PR rationale matches the guarded behavior.
Advisory findings: none
The LLM output above is advisory and was not used as the approval trust root.
Actual PR impact radar
Exact range: 144351619db586f8036147a0988ea446e38acadb...3d30d943b39d7cb4698cb9fe7d311c1e32669366
Change digest: 782c84afa1bcc1fb701d0bc0bb62b36acf0ea5e932979e8a11a0f93da7f47b6a
Score: 64/100 (L), estimated 75 min, split recommended: true
Affected services/components: repository-wide/unclassified
Machine-readable radar JSONL and SVG
{"actual_change":{"additions":262,"base_sha":"144351619db586f8036147a0988ea446e38acadb","binary_files":0,"categories":{"code":3,"configuration":1,"docs":1,"tests":1},"change_digest":"782c84afa1bcc1fb701d0bc0bb62b36acf0ea5e932979e8a11a0f93da7f47b6a","comparison":"144351619db586f8036147a0988ea446e38acadb...3d30d943b39d7cb4698cb9fe7d311c1e32669366","deletions":36,"file_count":6,"files":["goal/cli/version_discovery.py","goal/cli/version_state.py","goal/cli/version_sync.py","project/ticket-093/README.md","project/ticket-093/intent.json","tests/test_version_repository_boundaries.py"],"head_sha":"3d30d943b39d7cb4698cb9fe7d311c1e32669366","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":3,"scope":3,"uncertainty":3,"validation":2},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":75,"within_budget":false},"impact":{"components":["clone","directories","goal","project","tests"],"files":["clone/worktree","directories/gitfiles","goal/cli/version_discovery.py","goal/cli/version_state.py","goal/cli/version_sync.py","project/ticket-093/README.md","project/ticket-093/intent.json","tests/test_version_repository_boundaries.py"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":64,"split":{"parts":[{"estimated_minutes":13,"name":"Implement clone","scope":["clone"]},{"estimated_minutes":13,"name":"Implement directories","scope":["directories"]},{"estimated_minutes":13,"name":"Implement goal","scope":["goal"]},{"estimated_minutes":13,"name":"Implement project","scope":["project"]},{"estimated_minutes":13,"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-093"}<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-093: Keep automatic version scans inside repository boundaries</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 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 · 75m</text></svg>DECISION D-093-1270
TICKET ticket-093
HEAD_SHA 3d30d943b39d7cb4698cb9fe7d311c1e32669366
CORRELATION_ID goal-pr-134-ticket-093-r2
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["test (3.13)=PASS","test (3.12)=PASS","governance / remote lifecycle=PASS","governance / enforce=PASS"]
INPUT required_checks = ["test (3.12)","test (3.13)"]
INPUT required_checks_source = "protected registry (env/request)"
INPUT reviewer_login = "ifuri-validator-agent[bot]"
INPUT superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"144351619db586f8036147a0988ea446e38acadb","head_sha":"3d30d943b39d7cb4698cb9fe7d311c1e32669366","change_digest":"782c84afa1bcc1fb701d0bc0bb62b36acf0ea5e932979e8a11a0f93da7f47b6a","score":64,"complexity":"L","estimated_minutes":75,"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 "zai/glm-5.3"
ASSERT VERDICT_AUTHORITY != "ADVISORY"
Automatic version discovery and synchronization entered nested Git repositories and linked worktrees. A matching VERSION or Python version in another checkout could be treated as part of the parent release and rewritten.
Use one pruned filesystem iterator for discovery, nested lockstep updates and automatic Python version updates. It excludes nested .git directories/gitfiles, the reserved .worktrees directory and symlinks while retaining ordinary monorepo subpackages and the existing per-scan exclusions. Explicitly configured version sources retain their existing behavior.
Validation: all 12 new regressions fail on the previous code and pass with this change, including real clone/worktree fixtures and byte-for-byte preservation checks. Focused version tests: 86 passed, 1 existing skip. Full suite: 735 passed, 2 existing skips. Ruff, governance (0 errors, 0 warnings), installed host contract and Docker Compose checks pass.
Ticket: ticket-093. This publishes source code; it does not create a new PyPI release.