Skip to content

fix(advise): derive reflex patterns from proposal categories (ticket-106) - #129

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/106-reflex-advise-categories
Oct 8, 2026
Merged

ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/106-reflex-advise-categories

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

Problem

collect_reflex_patterns read analysis['patterns'], but reflex analyze returns proposals / events / statistics, with no patterns key. monag advise therefore always reported "0 wzorców reflex", and the priority readings ignored recurring failures. It also used min_repeat=1, so every one-off event became a proposal (595 on an 8-hour transcript corpus).

Change

  • _patterns_from_proposals(): one pattern per proposal category, with summed frequency and group count, used by both the import and CLI runners.
  • REFLEX_MIN_REPEAT = 2.

Evidence

On the 8 h tool-failure projection: 228 proposals → patterns operational-failure 3377/136, test-feedback 267/65, governance-friction 192/19, credential-readiness, provider-unavailability. Before the fix: patterns=[].
Full suite: 467 passed. Governance GOV-PASS. Ruff: no new findings in the touched files (one fewer).

Ticket: ticket-106

🤖 Generated with Claude Code

…106)

reflex analyze has no 'patterns' key, so advise always saw zero reflex
patterns. Build one pattern per proposal category and require two repeats
instead of turning every one-off event into a proposal.

Co-Authored-By: Claude <noreply@anthropic.com>

@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 97ec37e4462ab3b0dde8e12a96cd4df4aab35b43.

Ticket: ticket-106
Correlation ID: local-semcod-monag-pr-129-ticket-106
Model: openai/cursor-auto
Reviewed diff chunks: 1
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 1 diff chunk(s). The PR successfully addresses the issue where collect_reflex_patterns failed to find patterns from reflex analyze output. It properly groups proposals by category and computes frequencies and group counts using the new _patterns_from_proposals function. Additionally, REFLEX_MIN_REPEAT is correctly increased to 2 to prevent one-off failures from being reported as patterns. Tests and intent metadata correctly track the changes.
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: 452d655cdd4287c86a94a89c9b8816cf3d799b67...97ec37e4462ab3b0dde8e12a96cd4df4aab35b43
Change digest: b3c13a55e9508a52de28dcbb4e5513b3ee921f4d39a8a7f88e1e898c3e4df660
Score: 56/100 (L), estimated 72 min, split recommended: true
Affected services/components: repository-wide/unclassified

Machine-readable radar JSONL and SVG
{"actual_change":{"additions":99,"base_sha":"452d655cdd4287c86a94a89c9b8816cf3d799b67","binary_files":0,"categories":{"code":1,"configuration":1,"docs":1,"tests":1},"change_digest":"b3c13a55e9508a52de28dcbb4e5513b3ee921f4d39a8a7f88e1e898c3e4df660","comparison":"452d655cdd4287c86a94a89c9b8816cf3d799b67...97ec37e4462ab3b0dde8e12a96cd4df4aab35b43","deletions":4,"file_count":4,"files":["project/ticket-106/README.md","project/ticket-106/intent.json","src/monag/advise.py","tests/test_advise.py"],"head_sha":"97ec37e4462ab3b0dde8e12a96cd4df4aab35b43","service_count":0,"services":[]},"assessment_mode":"observed-pr","axes":{"coupling":5,"delivery":2,"scope":3,"uncertainty":3,"validation":1},"complexity":"L","confidence":0.9,"diagnostics":["RADAR-ACCEPTANCE-MISSING","RADAR-BUDGET-EXCEEDED"],"estimate":{"budget_minutes":30,"minutes":72,"within_budget":false},"impact":{"components":["192","267","3377","claude.com","project","src/monag","tests"],"files":["192/19","267/65","3377/136","claude.com/claude-code","project/ticket-106/README.md","project/ticket-106/intent.json","src/monag/advise.py","tests/test_advise.py"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":56,"split":{"parts":[{"estimated_minutes":10,"name":"Implement 192","scope":["192"]},{"estimated_minutes":10,"name":"Implement 267","scope":["267"]},{"estimated_minutes":10,"name":"Implement 3377","scope":["3377"]},{"estimated_minutes":10,"name":"Implement claude.com","scope":["claude.com"]},{"estimated_minutes":10,"name":"Implement project","scope":["project"]},{"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-106"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-106: fix(advise): derive reflex patterns from proposal categories (ticket-106)</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 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">L · 72m</text></svg>
Merge will be attempted after this approval when explicitly authorized. ## Decision record (recomputable)
DECISION D-106-3424
TICKET ticket-106
HEAD_SHA 97ec37e4462ab3b0dde8e12a96cd4df4aab35b43
CORRELATION_ID local-semcod-monag-pr-129-ticket-106
ACTOR agent:ifuri-validator-agent[bot]
APPLIED_RULE P-CORE-015
INPUT author_login = "tom-sapletta-com"
INPUT observed_checks = ["governance / remote lifecycle=PASS","governance / enforce=PASS","onedev/local-verify=PASS"]
INPUT required_checks = ["onedev/local-verify","governance / remote lifecycle","governance / enforce"]
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/monag","pull_request":129,"head_sha":"97ec37e4462ab3b0dde8e12a96cd4df4aab35b43","base_sha":"452d655cdd4287c86a94a89c9b8816cf3d799b67","diff_sha256":"ff94faaeea9e5e88917ef20697b3f61a8bf5919359a7aa0341f9a7e33acd5961"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["project/ticket-106/README.md","project/ticket-106/intent.json","src/monag/advise.py","tests/test_advise.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":"452d655cdd4287c86a94a89c9b8816cf3d799b67","head_sha":"97ec37e4462ab3b0dde8e12a96cd4df4aab35b43","change_digest":"b3c13a55e9508a52de28dcbb4e5513b3ee921f4d39a8a7f88e1e898c3e4df660","score":56,"complexity":"L","estimated_minutes":72,"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"

@ifuri-validator-agent
ifuri-validator-agent Bot merged commit 07c3e57 into main Oct 8, 2026
3 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/106-reflex-advise-categories branch October 8, 2026 02:14
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