Skip to content

feat(monitor): infer an agent's task from its ticket worktree (ticket-107) - #130

Merged
ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/107-infer-agent-task
Oct 8, 2026
Merged

ifuri-validator-agent[bot] merged 1 commit into
mainfrom
ticket/107-infer-agent-task

Conversation

@tom-sapletta-com

Copy link
Copy Markdown
Contributor

Problem

monag status showed every agent as task: unknown (process only) unless started through monag run. Asked "are tasks being executed autonomously?", monag could show processes but not what they work on.

Change

inferred_task() in monitor.py: when an agent reported no task, look at the working directories of the agent and its children; a canonical <primary>/.worktrees/ticket-NNN--slug yields inferred from worktree: <repo> ticket-NNN: <intent summary> (summary whitespace-collapsed, 100 chars, up to 3 tickets). Reported tasks still win; everything else stays unknown (process only). It is labelled as an observation, not ownership or progress.

Evidence

Live run on this host: two Claude agents now show monag ticket-107: … and willmux ticket-222: „uruchom X w/do Y” is not an installation; agents outside ticket worktrees stay unknown.
Tests: 5 new (fake /proc, missing/broken intent); full suite 471 passed, 1 skipped. Governance GOV-PASS. Ruff clean on the new test.

Ticket: ticket-107

🤖 Generated with Claude Code

…-107)

Agents not started through 'monag run' all showed 'unknown (process only)',
so status could not tell what autonomous agents were doing. When no task is
reported, name the canonical .worktrees/ticket-NNN--slug the agent or its
children work in, with the ticket intent summary, labelled as inferred.

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 93d9a655c10f3ffa4f10fdb3f061c60c322a2097.

Ticket: ticket-107
Correlation ID: local-semcod-monag-pr-130-ticket-107
Model: openai/cursor-auto
Reviewed diff chunks: 1
Advisory LLM verdict: APPROVE
Advisory summary: Reviewed all 1 diff chunk(s). The implementation cleanly extracts worktree paths using a well-crafted regex and robustly parses the intent.json file to infer agent tasks, safely handling potential IO, decoding, or structural errors. The fallback to 'unknown' is preserved.
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: 07c3e575e440e865a25adfadb9ea12afa7e798d6...93d9a655c10f3ffa4f10fdb3f061c60c322a2097
Change digest: d1117fd9f3a0129a6f2f8d5921e9f890654b4d8b49abc3845ec285898b1a243b
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":144,"base_sha":"07c3e575e440e865a25adfadb9ea12afa7e798d6","binary_files":0,"categories":{"code":1,"configuration":1,"docs":1,"tests":1},"change_digest":"d1117fd9f3a0129a6f2f8d5921e9f890654b4d8b49abc3845ec285898b1a243b","comparison":"07c3e575e440e865a25adfadb9ea12afa7e798d6...93d9a655c10f3ffa4f10fdb3f061c60c322a2097","deletions":2,"file_count":4,"files":["project/ticket-107/README.md","project/ticket-107/intent.json","src/monag/monitor.py","tests/test_monitor_task_inference.py"],"head_sha":"93d9a655c10f3ffa4f10fdb3f061c60c322a2097","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":["claude.com","missing","project","src/monag","tests","w","worktrees"],"files":["claude.com/claude-code","missing/broken","project/ticket-107/README.md","project/ticket-107/intent.json","src/monag/monitor.py","tests/test_monitor_task_inference.py","w/do","worktrees/ticket-NNN--slug"],"public_interfaces":[],"runtime_dependencies":0},"schema":"subactor.ticket-radar/v1","score":56,"split":{"parts":[{"estimated_minutes":10,"name":"Implement claude.com","scope":["claude.com"]},{"estimated_minutes":10,"name":"Implement missing","scope":["missing"]},{"estimated_minutes":10,"name":"Implement project","scope":["project"]},{"estimated_minutes":10,"name":"Implement src/monag","scope":["src/monag"]},{"estimated_minutes":10,"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-107"}
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128" role="img"><title>ticket-107: feat(monitor): infer an agent&#x27;s task from its ticket worktree (ticket-107)</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-107-2587
TICKET ticket-107
HEAD_SHA 93d9a655c10f3ffa4f10fdb3f061c60c322a2097
CORRELATION_ID local-semcod-monag-pr-130-ticket-107
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":130,"head_sha":"93d9a655c10f3ffa4f10fdb3f061c60c322a2097","base_sha":"07c3e575e440e865a25adfadb9ea12afa7e798d6","diff_sha256":"03da8906fea3c00ce7b4e2475d6497e3d1fa0b369313b51615474ce6400aae7a"},"policy":{"policy_schema":"subactor.validator/semantic-review-policy/v1","policy_version":1,"policy_sha256":"676cb4516bbfed2a000e40b9b1b6e4a430ecc761ec546aeb53d721a1905cfdd7","required":false,"critical_paths":[],"observed_paths":["project/ticket-107/README.md","project/ticket-107/intent.json","src/monag/monitor.py","tests/test_monitor_task_inference.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":"07c3e575e440e865a25adfadb9ea12afa7e798d6","head_sha":"93d9a655c10f3ffa4f10fdb3f061c60c322a2097","change_digest":"d1117fd9f3a0129a6f2f8d5921e9f890654b4d8b49abc3845ec285898b1a243b","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 80dacb1 into main Oct 8, 2026
3 checks passed
@ifuri-validator-agent
ifuri-validator-agent Bot deleted the ticket/107-infer-agent-task branch October 8, 2026 13:26
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