Skip to content

perf(scan): compiled exclude regex and native Rust MinHash signatures (ticket-015) - #22

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/015-native-rust-excludes-and-minhash-in-scan-hot-paths
Oct 12, 2026
Merged

ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/015-native-rust-excludes-and-minhash-in-scan-hot-paths

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

Summary

  • Replace repetitive fnmatch.fnmatch pattern matching in _should_exclude with a single compiled regex alternation, dropping scan exclude overhead significantly (~62s on 20k+ paths).
  • Delegate MinHash signature generation in lsh_matcher to native PyO3 redup_fast_hash.compute_minhash_signature with automatic fallback to pure Datasketch.
  • Increase LRU cache capacity for path filtering from 1,000 to 65,536 entries.
  • Add unit tests for compiled exclude regex equivalence and native MinHash signature calculation.

Addresses ticket-015.

… (ticket-015)

- scanner_cache: one compiled alternation instead of per-pattern fnmatch (~62s of a 2m19s scan); LRU 1000 -> 65536
- lsh_matcher: MinHash signature via redup_fast_hash (one call/block) wrapped for datasketch LSH, with datasketch fallback
- tests for exclude equivalence with fnmatch and native signature
@tom-sapletta-com
tom-sapletta-com force-pushed the ticket/015-native-rust-excludes-and-minhash-in-scan-hot-paths branch from eed6a63 to 61dd746 Compare October 12, 2026 16:31

@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 61dd7462614c23c425c4bad908c60dd9438ef35b.

Ticket: ticket-015
Correlation ID: local-semcod-redup-pr-22-ticket-015
Model: gemini/gemini-3.8-flash
Advisory LLM review: LLM_UNAVAILABLE
Reason: No module named 'litellm'
This approval rests on the deterministic checks alone; no advisory opinion was recorded for this head.
Semantic review prerequisite: not_required; policy 676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7.

Actual PR impact radar

Exact range: 5534ac0ec06dd2895235bab7d987d94d939b4f16...61dd7462614c23c425c4bad908c60dd9438ef35b
Change digest: 789e2da3de900eee19d011ba9e0bf28134dad8feb0171ba9a565a094d5b79b34
Score: 48/100 (M), estimated 53 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":136,"base_sha":"5534ac0ec06dd2895235bab7d987d94d939b4f16","binary_files":0,"categories":{"code":2,"configuration":1,"docs":2,"tests":2},"change_digest":"789e2da3de900eee19d011ba9e0bf28134dad8feb0171ba9a565a094d5b79b34","comparison":"5534ac0ec06dd2895235bab7d987d94d939b4f16...61dd7462614c23c425c4bad908c60dd9438ef35b","deletions":3,"file_count":7,"files":["project/TICKETS.md","project/ticket-015/README.md","project/ticket-015/intent.json","src/redup/core/lsh_matcher.py","src/redup/core/scanner_cache.py","tests/test_lsh_matcher.py","tests/test_scanner.py"],"head_sha":"61dd7462614c23c425c4bad908c60dd9438ef35b","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":3,"delivery":2,"scope":3,"uncertainty":3,"validation":1},"complexity":"M","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":53,"within_budget":false},"impact":{"components":["project","src/redup","tests"],"files":["project/TICKETS.md","project/ticket-015/README.md","project/ticket-015/intent.json","src/redup/core/lsh_matcher.py","src/redup/core/scanner_cache.py","tests/test_lsh_matcher.py","tests/test_scanner.py"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":48,"split":{"parts":[{"estimated_minutes":15,"name":"Implement project","scope":["project"]},{"estimated_minutes":15,"name":"Implement src/redup","scope":["src/redup"]},{"estimated_minutes":15,"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-015"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-015: perf(scan): compiled exclude regex and native Rust MinHash signatures (ticket-015)</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 89,56 79,85 59,71 48,59" 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 · 53m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-015-2445
TICKET ticket-015
HEAD_SHA 61dd7462614c23c425c4bad908c60dd9438ef35b
CORRELATION_ID local-semcod-redup-pr-22-ticket-015
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["test (3.10)=PASS","test (3.13)=PASS","governance / enforce=PASS","governance / remote lifecycle=PASS"]
INPUT required_checks = ["test (3.10)","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/redup","pull_request":22,"head_sha":"61dd7462614c23c425c4bad908c60dd9438ef35b","base_sha":"5534ac0ec06dd2895235bab7d987d94d939b4f16","diff_sha256":"20d3d0b7d62e16ad7623ec731cc65f3f98dc44af84c0e526094d2efc37cfa864"},"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-015/README.md","project/ticket-015/intent.json","src/redup/core/lsh_matcher.py","src/redup/core/scanner_cache.py","tests/test_lsh_matcher.py","tests/test_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":"5534ac0ec06dd2895235bab7d987d94d939b4f16","head_sha":"61dd7462614c23c425c4bad908c60dd9438ef35b","change_digest":"789e2da3de900eee19d011ba9e0bf28134dad8feb0171ba9a565a094d5b79b34","score":48,"complexity":"M","estimated_minutes":53,"split_recommended":true,"services":[],"authority":"ADVISORY","promotion":"FORBIDDEN"}
VERDICT APPROVE AUTHORITY DETERMINISTIC
REJECTED REQUEST_CHANGES BECAUSE NO_UNSAFE_CHANGE_REASON_FOUND
ADVISORY llm_verdict = "" MODEL "gemini/gemini-3.8-flash"
ASSERT VERDICT_AUTHORITY != "ADVISORY"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit c290460 into main Oct 12, 2026
4 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/015-native-rust-excludes-and-minhash-in-scan-hot-paths branch October 12, 2026 16:38
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