Repository navigation
fix(scanner): honor configured exclusions in README analysis and exports - #17
Conversation
Co-authored-by: Koru Agent <agent@coru.dev>
There was a problem hiding this comment.
Validator approval after policy checks for exact head 4d958ef3012d89d87513a45927d6d7734554bdd2.
Ticket: ticket-020
Correlation ID: codex-heyasa-code2docs020-20261106
Model: openai/cursor-auto
Reviewed diff chunks: 1
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 1 diff chunk(s). The change consistently applies configured code2llm exclusion patterns to both README analysis and export while preserving native defaults, deduplicating patterns without mutating configuration, and retaining existing .gitignore subproject handling. The regression tests exercise custom globs, hidden directories, entries beyond ten, configuration isolation, export-enabled and disabled analysis, and README-only CLI behavior.
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: 202b685ff7446a6ac61b351d17cacadd9a76440b...4d958ef3012d89d87513a45927d6d7734554bdd2
Change digest: 77b30aa6e3f516813a49d04f832b79a1eefb43fa65fa95d3806fff52c4f54597
Score: 36/100 (M), estimated 41 min, split recommended: true
Affected services/components: repository-wide/unclassified
Machine-readable radar JSONL and SVG
{"actual_change":{"additions":163,"base_sha":"202b685ff7446a6ac61b351d17cacadd9a76440b","binary_files":0,"categories":{"code":2,"tests":2},"change_digest":"77b30aa6e3f516813a49d04f832b79a1eefb43fa65fa95d3806fff52c4f54597","comparison":"202b685ff7446a6ac61b351d17cacadd9a76440b...4d958ef3012d89d87513a45927d6d7734554bdd2","deletions":0,"file_count":4,"files":["code2docs/analyzers/project_scanner.py","code2docs/generators/code2llm_gen.py","tests/test_code2llm_exclusions.py","tests/test_project_scanner.py"],"head_sha":"4d958ef3012d89d87513a45927d6d7734554bdd2","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":2,"delivery":1,"scope":2,"uncertainty":3,"validation":1},"complexity":"M","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":41,"within_budget":false},"impact":{"components":["code2docs","tests"],"files":["code2docs/analyzers/project_scanner.py","code2docs/generators/code2llm_gen.py","tests/test_code2llm_exclusions.py","tests/test_project_scanner.py"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":36,"split":{"parts":[{"estimated_minutes":16,"name":"Implement code2docs","scope":["code2docs"]},{"estimated_minutes":16,"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-020"}<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-020: fix(scanner): honor configured exclusions in README analysis and exports</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,47 80,59 79,85 59,71 56,61" 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">M · 41m</text></svg>DECISION D-020-4726
TICKET ticket-020
HEAD_SHA 4d958ef3012d89d87513a45927d6d7734554bdd2
CORRELATION_ID codex-heyasa-code2docs020-20261106
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","test (3.10)=PASS","test (3.11)=PASS"]
INPUT required_checks = ["test (3.10)","test (3.11)","test (3.12)","test (3.13)"]
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/code2docs","pull_request":17,"head_sha":"4d958ef3012d89d87513a45927d6d7734554bdd2","base_sha":"202b685ff7446a6ac61b351d17cacadd9a76440b","diff_sha256":"55bc2bbe33efd1661f02816f7bbf7f34667d62d4ac26ee12998d8f4574438fdd"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["code2docs/analyzers/project_scanner.py","code2docs/generators/code2llm_gen.py","tests/test_code2llm_exclusions.py","tests/test_project_scanner.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":"202b685ff7446a6ac61b351d17cacadd9a76440b","head_sha":"4d958ef3012d89d87513a45927d6d7734554bdd2","change_digest":"77b30aa6e3f516813a49d04f832b79a1eefb43fa65fa95d3806fff52c4f54597","score":36,"complexity":"M","estimated_minutes":41,"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"
README analysis ignored
code2llm.exclude_patterns, so generated documentation could include artifact copies and other excluded source trees. Merge configured exclusions into the scanner filters while retaining code2llm defaults and independent configuration lists.The optional exporter now forwards every configured pattern through
--exclude, including globs, hidden directory names and entries beyond the first ten. Existing simple.gitignoresubproject handling remains supported.Closes #16. Existing native Planfile allocation: PLF-020 / ticket-020.
Validation: all 171 native tests passed; seven exclusion regressions cover actual collection, YAML-configured README-only CLI generation, complete CLI filtering and configuration isolation. Six regressions fail against the accepted baseline. Ruff F and Black on new tests passed. Required Python 3.10–3.13 checks and independent Validator approval are preserved.