refactor(events): normalize matching keys once per handler pass - #2
Conversation
There was a problem hiding this comment.
Deterministic Validator approval for exact head 8d477dc20a99043b56d89c7f7907922ce96b84a3.
Ticket: ticket-004
Correlation ID: code2schema-pr-2-ticket-004
Model: zai/glm-5.3
Reviewed diff chunks: 1
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 1 diff chunk(s). Refactor hoists event keyword normalization out of the per-function loop, computing each event keyword once and lowercasing each handler name once. Semantics are preserved: keyword derivation (lower, strip 'event', strip whitespace), membership check, append order, and empty-keyword skip are identical. New regression tests cover ordering, duplicates, existing handlers, case-insensitivity, empty keywords, and no-op cases.
Advisory findings: none
The LLM output above is advisory and was not used as the approval trust root.
Actual PR impact radar
Exact range: 0852f7a8c92bf943e4da1968941e03f72a9a4d71...8d477dc20a99043b56d89c7f7907922ce96b84a3
Change digest: 35219864ab8e44f2a26f9143db4b85fa53a1ca13321cd83f709c5c5f0791a8d9
Score: 52/100 (M), estimated 53 min, split recommended: true
Affected services/components: repository-wide/unclassified
Machine-readable radar JSONL and SVG
{"actual_change":{"additions":35,"base_sha":"0852f7a8c92bf943e4da1968941e03f72a9a4d71","binary_files":0,"categories":{"migrations":1,"tests":1},"change_digest":"35219864ab8e44f2a26f9143db4b85fa53a1ca13321cd83f709c5c5f0791a8d9","comparison":"0852f7a8c92bf943e4da1968941e03f72a9a4d71...8d477dc20a99043b56d89c7f7907922ce96b84a3","deletions":3,"file_count":2,"files":["code2schema/analyzer/events.py","tests/test_event_handlers.py"],"head_sha":"8d477dc20a99043b56d89c7f7907922ce96b84a3","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":4,"delivery":2,"scope":2,"uncertainty":3,"validation":2},"complexity":"M","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":53,"within_budget":false},"impact":{"components":["code2schema","subactor","tests","wellmanifest"],"files":["code2schema/analyzer/events.py","subactor/validator-agent","tests/test_event_handlers.py","wellmanifest/performance"],"public_interfaces":["code2schema/analyzer/events.py"],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":52,"split":{"parts":[{"estimated_minutes":20,"name":"Define contract and acceptance boundary","scope":["code2schema/analyzer/events.py"]},{"estimated_minutes":10,"name":"Implement code2schema","scope":["code2schema"]},{"estimated_minutes":10,"name":"Implement subactor","scope":["subactor"]},{"estimated_minutes":10,"name":"Implement tests","scope":["tests"]},{"estimated_minutes":10,"name":"Implement wellmanifest","scope":["wellmanifest"]},{"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-004"}<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-004: refactor(events): normalize matching keys once per handler pass</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 97,53 79,85 54,78 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>DECISION D-004-7612
TICKET ticket-004
HEAD_SHA 8d477dc20a99043b56d89c7f7907922ce96b84a3
CORRELATION_ID code2schema-pr-2-ticket-004
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.10)=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 superseded_checks = []
INPUT ticket_radar_receipt = {"schema":"subactor.ticket-radar/v1","base_sha":"0852f7a8c92bf943e4da1968941e03f72a9a4d71","head_sha":"8d477dc20a99043b56d89c7f7907922ce96b84a3","change_digest":"35219864ab8e44f2a26f9143db4b85fa53a1ca13321cd83f709c5c5f0791a8d9","score":52,"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 = "APPROVE" MODEL "zai/glm-5.3"
ASSERT VERDICT_AUTHORITY != "ADVISORY"
Ticket: ticket-004
Closes #4
Correlation ID: koru-code2schema-event-matching-pilot
Normalize event keywords once per handler pass and each matching function name once. Preserve ordering, duplicate matches, existing handlers, mixed case and empty event keywords.
The branch includes current main through a merge; the PR changes only the event analyzer and regression tests. Validation: all 26 tests passed with the current locked development environment. Earlier Koru execution and wellmanifest/performance measurements remain preserved in the local audit.
Protected publication depends on subactor/validator-agent PR339, which registers both existing locked test contexts.