Repository navigation
operatorComments: Track an unaddressed upstream comment on the board, and post nothing upstream unless it clears a bar #283
Description
What happened
On bootc-dev/bootc#2585 the operator left an ordinary design comment (issuecomment-6364011447) without mentioning the bot. The poll claimed it with an agent-board-fix-claim comment on the upstream issue and dispatched a triage. The dispatch workflow then posted a status comment, and the run posted its triage reply there too: three bot comments upstream from a comment that asked for nothing. The operator answered "@cgwalters-bot woah there buddy ...". That reply was claimed and triaged again, and a second, near-duplicate triage went upstream.
The path, at main 2cd92f9, in crates/board-forge/src/poll/comments.rs:
Pass::operator_commentssearchescommenter:<operator> org:<scope>for every scope inoperatorComments.repositories, and passes each thread it finds tothread_readwithaddressed = false. With that, nothing requires a/botor@botline.thread_readdrops only the comments that an earlier claim or marker names (handled). Every other new operator comment, including one that is direction or a complaint, goes tocomment_triage(or tocomment_fixon the bot's own pull request).comment_triageposts the claim (<!-- agent-board-fix-claim -->and "Triage of ...: claimed; started.") on the upstream thread, and dispatches withrepo/itemset to that thread when it is an issue. Only someone else's pull request gets a tracking issue indispatchRepo(poll: Route operator comments on others' PRs through a tracking issue #106). So on an issue the run's answer, and the dispatch workflow's status comment, both land upstream.triage_brieftells the run that an explicit line means "the operator asks for action", and that without one it should "decide whether action is wanted". It never says that a comment may be direction about the bot itself. The woah comment had an@cgwalters-botline, so it went in as an action request.
tracker turned this off with cgwalters-forge/tracker#889, which removes operatorComments. Because notifications is still on, only addressed comments start runs. An addressed run can still claim, show its status and answer upstream, though, and nothing tracks the unaddressed comments any more.
What we want
- An unaddressed operator comment on a repository outside our own org only makes sure the item is tracked. If the item is not on the board, add it. If it is, note the comment on the item. Then give it a priority weighed against the rest of the board and against pace (the pool breakdown versus committed epics), the way the scheduler already weighs work. Nothing is written upstream.
- Never post claims or dispatch status upstream by default. Today the claim on the thread is the dedup record (
handledreads it back). Keep that record in our own space instead: the board item, the tracking issue, or the poll state. That way the upstream thread gets no "claimed / starting triage" comment and noagentic-job-statuscomment. This also needs the dispatch workflow (agentic-job / tracker'sdispatch.yml) not to put its status comment on an item outside our org. - Dispatch triage only when the item earns it. An unaddressed comment starts a triage run only when the item ranks high enough against the board and a pool has capacity by pace. Otherwise it waits on the board like any other item.
- Post the result upstream only when it clears a stated bar. The run reports its confidence and the value of an upstream reply in a structured field, and agent-board checks it. Only a result that is high-confidence and high-value goes out automatically. Anything else stays with us: on the board item or its tracking issue, or as a draft the operator can approve, through the same send-on-approval flow as review drafts (review: Parse review drafts and send an approved one as the bot #256, Epic: Agent-drafted reviews of others' PRs, sent as the bot after cgwalters approves tracker#848). Nothing is posted upstream in that case.
- Read a mention that gives direction as direction. A comment that mentions the bot to steer it or complain ("woah there", "don't do X", "default to tracking") is not a new triage request. At the least, the brief has to tell the run that the comment may be feedback on the bot's own earlier comments in that thread, and that answering it is not a reason to triage the item again. Better, classify it before dispatching and route feedback to the operator's decisions record instead of to a run.
- Compress what does go upstream. The operator asked for one comment, not three, and for outdated bot comments to be hidden automatically (minimize as outdated) once a later one replaces them.
The operator also floated moving per-repository triage like this into bootc-dev/gh-agentic-workflows, run per repository. See #257.
Done when
Unit tests in poll/comments.rs cover these cases:
- An unaddressed operator comment on an upstream issue adds or notes the board item and writes nothing upstream.
- An addressed one still dispatches, but posts no claim or status upstream.
- A low-confidence result stays a draft.
- A mention that gives direction does not start a second triage.
tracker can then turn operatorComments back on.
Generated-by: https://github.com/cgwalters/#llms
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsTodo
Activity
cgwalters-bot commentedon Oct 23, 2026
Found the hard way on bootc-dev/bootc#2585: the claim comment upstream is also the poll's only record that an operator comment was handled. Deleting the claims (as cleanup) made the next pass claim both comments again and dispatch another triage, at 13:15Z. The fix must move that record off the upstream thread, into our own tracking, before claims stop being posted. Until then, hide unwanted claims (minimize as outdated) rather than deleting them.
Generated-by: https://github.com/cgwalters/#llms
cgwalters-bot commentedon Oct 23, 2026
Another trigger to cover: on 23 Oct an ordinary PR review by the operator (an approval with design remarks, no mention: bootc-dev/bootc#2579, pullrequestreview-5631865693) was claimed and triaged the same way. A comment on bootc-dev/bootc#2578 was too, a few hours earlier. tracker#889 has now removed
operatorCommentsfrom the deployment config as the stop-gap. The fix here must treat reviews and review comments like issue comments: unaddressed means track only, never claim or post upstream.Generated-by: https://github.com/cgwalters/#llms
cgwalters-bot commentedon Oct 23, 2026
Parked:
operatorCommentsis not in the pass and is disabled in the deployment (cgwalters-forge/tracker#889); don't re-enable it until this is fixed. Not scheduled; reopen or removeneeds-designto pick it up again.Generated-by: https://github.com/cgwalters/#llms
cgwalters-bot commentedon Oct 26, 2026
The board pass asks a triage run to revisit this issue: nobody has touched it for a while.
Generated-by: https://github.com/cgwalters/#llms
cgwalters-bot commentedon Oct 26, 2026
Dispatched the plan in #283 (comment): run.
cgwalters-bot commentedon Oct 26, 2026
✅ dispatch ended well. Result: #283 (comment)
cgwalters-bot commentedon Oct 26, 2026
Still valid, nothing of it is done, and it still waits on design decisions. At main 814401a the paths the issue describes are unchanged:
operator_commentsstill passes threads tothread_readwithaddressed = false.comment_triagestill claims on the upstream thread and only routes a pull request to a tracking issue indispatchRepo.triage_briefstill says nothing about direction or feedback.The unaddressed path is off only because of cgwalters-forge/tracker#889 (merged 2026-10-23). The addressed path through
notificationsis still live, so an@botcomment on an upstream issue still gets a claim and a status comment there (part 2).These are the questions that block a plan:
tracking_issue(poll: Route operator comments on others' PRs through a tracking issue #106) for issues as well as pull requests. Every upstream thread would get a tracking issue indispatchRepo, the claim would move there, and the run's item would be the tracking issue. The dispatch status comment would then land there too, and tracker'sdispatch.ymlwould not need to change. Is one tracking issue per upstream thread acceptable, or should the record be the board item or the poll state?Once (1) is settled, a first implement slice would cover parts 2 and 5, plus reviews as noted above: route every comment triage through a tracking issue, and add the direction/feedback wording to the brief. Its tests would go in
poll/comments.rs. That would be enough for tracker to keepnotificationson safely. Parts 1, 3, 4 and 6 would follow.Generated-by: https://github.com/cgwalters/#llms