Repository navigation
feat(github): decide whose PR feedback wakes agents with ordered rules - #1746
Draft
johnmatthewtennant wants to merge 8 commits into
Draft
johnmatthewtennant wants to merge 8 commits into
johnmatthewtennant wants to merge 8 commits into
Conversation
Base automatically changed from
jtennant/simone/first-party-command-sources
to
main
October 27, 2026 20:55
johnmatthewtennant
force-pushed
the
jtennant/poppy/github-author-allowlist
branch
2 times, most recently
from
October 28, 2026 13:55
d2a2c7d to
a6933cb
Compare
johnmatthewtennant
force-pushed
the
jtennant/poppy/github-author-allowlist
branch
from
October 28, 2026 18:36
7ce88dc to
2649215
Compare
johnmatthewtennant
changed the base branch from
main
to
jtennant/poppy/watching-sidebar-onboarding
October 28, 2026 18:36
johnmatthewtennant
force-pushed
the
jtennant/poppy/github-author-allowlist
branch
from
October 28, 2026 20:29
2649215 to
13fe4ff
Compare
johnmatthewtennant
force-pushed
the
jtennant/poppy/watching-sidebar-onboarding
branch
from
October 28, 2026 20:32
9c8472d to
d66d510
Compare
johnmatthewtennant
force-pushed
the
jtennant/poppy/github-author-allowlist
branch
3 times, most recently
from
October 29, 2026 01:43
6e15c86 to
61ebd33
Compare
johnmatthewtennant
force-pushed
the
jtennant/poppy/watching-sidebar-onboarding
branch
from
October 29, 2026 02:57
a3e3bd0 to
c490af7
Compare
johnmatthewtennant
force-pushed
the
jtennant/poppy/github-author-allowlist
branch
from
October 29, 2026 02:57
61ebd33 to
ee70d24
Compare
Agents act on the comments a PR watch quotes, so anyone able to comment on a public pull request could steer them. Settings > Plugins > GitHub comment authors now holds trusted organizations, trusted logins and ignored logins. Once a trusted entry is saved, only trusted logins, members of a trusted organization and the signed-in account wake agents; ignored logins never do. Membership is read through gh, batched and kept for an hour, and feedback whose author's membership cannot be read waits for a later poll. Each poll rereads the settings. Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: John Tennant <jtennant@block.xyz>
A login GitHub has no user for, such as a mannequin, failed its whole batch, so every comment in it waited forever. A failed batch now asks each login alone, and a login whose own read fails ten polls in a row counts as no member. Batches are sized to the pull command's 4096-byte input limit instead of a fixed ten logins. Logins may contain underscores, as Enterprise Managed Users' do, and any case of [bot]. A failed save shows its error, and the card and docs say that hidden memberships and misspelled organizations count as none. Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: John Tennant <jtennant@block.xyz>
The GitHub plugin now adds a settings card, so the keyboard order of the Settings navigation includes it after Builderlab hosting. Turning GitHub back on also adds that card to the stacked narrow navigation, which pushes the toggle down, so the test scrolls it back into view before checking it. Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: John Tennant <jtennant@block.xyz>
Three lists and a hardcoded rule for agents' 🤖 comments could not say things like "members of block, but not this bot" or "anyone at squareup whose login starts with ada_". Settings > Plugins > GitHub comment authors now holds one rule per line in a single text box. A rule is allow or deny, then any of author:login, author:@me, author:/pattern/, org:name, body:/pattern/ and prefix:text. The first rule that matches decides, and feedback no rule matches wakes nobody. Patterns are JavaScript regular expressions with the i, m, s or u flags, and author patterns always ignore case, as logins do. Org stays an exact name, since membership is only asked for named organizations. Saving compiles every pattern and rejects the rules with an error that names the line. The defaults, deny author:@me prefix:🤖, allow author:@me and allow, keep today's behavior and are shown and editable, so the 🤖 rule moves out of watch.ts. Rules are saved under a v2 key, and lists saved under v1 become the equivalent rules. Membership is kept per organization, with the same batching, input limit and ten-poll give-up as before. Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: John Tennant <jtennant@block.xyz>
Nobody uses the list settings yet, so lists saved by an earlier build of this change fall back to the default rules. Signed-off-by: John Tennant <jtennant@block.xyz> Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ship Feedback admitted into the quiet window was told even if the owner tightened the rules before it was sent, and a membership answer older than an hour still admitted an author when refreshing it failed. Waiting feedback is now checked against the current rules on each poll, and admission only uses membership read within the hour. Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: John Tennant <jtennant@block.xyz>
Use the shared SettingsGroup form layout and its trailing action row, as other explicit-save Settings forms do. Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: John Tennant <jtennant@block.xyz>
Rechecking waiting feedback kept anything the rules could not yet decide, so a comment that needed an unread organization membership was still told once the quiet window passed. It is now unseen again and read on a later poll, like new feedback that needs a membership. Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: John Tennant <jtennant@block.xyz>
johnmatthewtennant
force-pushed
the
jtennant/poppy/github-author-allowlist
branch
from
October 29, 2026 05:57
310dece to
32fd8a8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Context
github_watch_prquotes new pull request comments and reviews to the agent watching. Anyone who can comment on a public pull request can put text in front of that agent, and main's only filtering is dropping the signed-in account's own 🤖 comments.Change
The GitHub plugin now decides whose feedback wakes agents with ordered allow and deny rules. All of it lives in
src/bundled/github.allowordeny, then any of these conditions, all of which must hold:author:login, an exact login (a bot's ends in[bot]), orauthor:@me, the signed-inghaccount.author:/pattern/, a regular expression the login must match.org:name, membership of an organization, named exactly.body:/pattern/, a regular expression the comment must match.prefix:text, what the comment starts with. It runs to the end of the line.allowrules is an allowlist.i,m,soruflags. Author patterns always ignore case, since GitHub logins do, and exact logins also match regardless of case. Org has no pattern form, because membership is only looked up for named organizations.Line 2: Invalid regular expression: /(/i: Unterminated group.watch.tsinto the first rule:allowremains, the card says anyone can wake agents.pullgh command, only for organizations the rules name. It is batched to the 4096-byte input limit, trusted for an hour, and asked one login at a time after a failed batch. An answer older than an hour is not used, even when refreshing it fails. A login whose own read fails ten polls in a row counts as no member. Feedback waits for a later poll only when a rule needs a membership that hasn't been read.ghaccount, or one in a misspelled organization, counts as none. Bots and deleted accounts are in no organization.Validation
src/bundled/github/watcher.test.tsdrives the real watcher with theghcommand answers faked, so these cover rule evaluation, membership reads and wakes, not live GitHub:The settings card and the watcher share one stored policy:
AuthorSettings.test.tsxsaves through the card and reads the result with the watcher'sloadPolicy, and the watcher tests above change rules mid-watch through that same storage.tests/browser/settings.spec.mjschecks the settings card in the real app in Chromium and WebKit.Not tested: the native app against a real pull request and real organization membership.
Screenshots
Default rules, with the warning about a bare allow
A rule that does not compile
Saved organization rules