An automated pull request reviewer for LFX repositories, built as a
Guild.ai Native agent. It reviews pull requests as the
lfx-one GitHub account, through a custom Guild integration (see Reviewer
identity).
PROMPT.md is the system prompt; guild.yaml is the Guild manifest.
LFX teams open many pull requests across many repositories, and every one needs a first pass for the same classes of problems. This agent does that first pass automatically, so human reviewers start from a reviewed change instead of a blank diff. It assists other reviewers and does not replace them.
What it does on each review:
- Reads the diff and the commit messages, and reviews them in one pass for correctness, security, performance, test coverage, documentation, and the data privacy, data subject rights, and data residency concerns that apply to LFX services.
- Checks the change against the repository's own rule files (
CLAUDE.md,AGENTS.md,CONTRIBUTING.md,.claude/rules/), read from the target branch so a PR can't change the rules it is judged by. It reviews each repository within the architecture it already uses. - Posts one formal review with inline comments on the changed lines. Each
finding is labeled
[blocking],[minor],[nit], or[question]. - Posts a conversation comment with a short Summary of the change, a Decision (approved, approved with minor comments, or needs changes) with a tally of the findings, and the full recap in a collapsed Details block.
- Flags in-repo docs that a PR leaves missing or contradicts, names the gaps at the top of the summary, and reminds the author about docs outside the repository that it can't read (see "Documentation check").
- Follows up on later pushes by reviewing only the new commits, and reconciles what other reviewers and bots have already said.
- Approves only PRs authored by org members. For anyone else it still reviews, but withholds approval until a maintainer approves.
It is built to run unattended. Pull request content is treated as data, so text in a diff or comment that tries to steer the verdict is reported as a security finding instead of followed. Prompts that a repository ships as its product are reviewed as code. It also limits itself: a cap on review rounds per PR, a debounce on rapid pushes, and a check that skips drafts and closed PRs.
Some areas always need a human reviewer. The "Review exclusions" table in
PROMPT.md lists them; today it has one rule, meeting calendar (ICS)
downloads. When a PR touches a listed area, the agent posts a note saying
why it won't review the PR and skips every later push on it. If it had
approved an earlier commit, it replaces that approval with a "changes
requested" review so the PR can't merge without a human. To ask for a fresh
check, a maintainer deletes that note and then pushes a commit, or
converts the PR to a draft and marks it ready again (needed when the agent
never reviewed the PR, since a push then starts nothing). The agent reviews
the PR only if it no longer changes an excluded area.
It runs from GitHub webhook events delivered by Guild: pull_request
(opened, synchronize, ready_for_review) and issue_comment
(created, a PR comment that starts with @lfx-one re-review). A Guild
comment filter on the issue_comment trigger drops every other comment
before a session starts; see the Triggers section below.
An hourly Guild time trigger also starts a sweep. It reviews at most one
PR an hour that is owed a review: a push dropped because a review was
running or the agent had just commented, a review that did not finish, or
a PR opened in the last 7 days that never got one. The agent marks PRs
that may be owed a review with the label lfx-review-agent-pending and
removes it when a review finishes on the current head. Removing it by hand
only takes that PR out of the sweep. Never rename it: open PRs carry it.
GitHub (linuxfoundation/lfx-review-agent) is the source of truth and the
backup of the Guild setup. Guild's own git host is a deploy target:
guild agent save pushes there. Keep both remotes on the same history.
git remote add github git@github.com:linuxfoundation/lfx-review-agent.gitChanges go through a pull request on GitHub. Each PR that changes
PROMPT.md or guild.yaml bumps the version in the "Agent version" section
of PROMPT.md, which the start comment shows; the Agent Version Check
workflow fails the PR otherwise. After merging such a PR, pull main and
publish with that version:
guild agent save --publish --version-number <version> -m "<summary> (PR #<n>)"guild.json (the Guild agent ID) stays untracked, as Guild's
.git/info/exclude sets up; the agent is linux-foundation~lfx-review-agent.
A Native agent has no clock and cannot run commands. The prompt uses the
webhook's own timestamp as "now" for the whole run: pull_request.updated_at
for opened / synchronize / ready_for_review, and comment.created_at
for re-review. That value drives the Step 1.5 age checks and the started
field in Step 3.5.
A sweep has no webhook. It reads "now" from the first line Guild writes in
every session, * This session was started at HH:MM:SS (24h, UTC) on ..., confirmed by a probe run on 2026-11-03.
Use this only if test runs show those timestamps are missing from the payload Guild delivers, or are too stale to trust.
- Wrap a JSON time API (one
GETthat returns the current UTC time) as a custom Guild integration withguild integration. The base URL is frozen on first publish, so pick a stable endpoint. - Add it to
guild.yamland change Step 0 "Current time" to call it once at the start of the run, falling back to the webhook timestamp if the call fails. - Do not scrape the
Dateheader fromwww.google.comor parse Cloudflarecdn-cgi/trace. Neither is a documented API, and a Native agent cannot runcurlordateanyway.
The prompt reads two workspace variables. Guild only checks at build time that the references are well formed, so set both before enabling triggers.
| Variable | Value |
|---|---|
REVIEWER_LOGIN |
The GitHub login the credential posts as: lfx-one. |
REVIEW_AGENT_HELP_URL |
https://github.com/linuxfoundation/lfx-review-agent/issues. Used in the cap notice, the start comment, and the summary footer. |
If REVIEWER_LOGIN does not match the account that posts, the agent stops
after its first comment and reports a configuration fault (Step 3.5,
identity check). Until the variable is fixed, each new
event posts another stray session-start comment, because the own-comment
filter cannot see the earlier ones.
Do these in order. Steps 1 to 3 need an organization owner or the repository's admins. Step 4 starts live reviews on the repository's next PR event, so do it last.
- Guild GitHub App. An organization owner enables the Guild GitHub App
(
guildai~github) for the repository, so webhook events reach Guild. See Triggers. lfx-onetoken. Add the repository to the existinglfx-onefine-grained token. Edit the token; do not regenerate it, or the Guild credential and its policies stop working. An organization owner must approve the change. See Reviewer identity.- CODEOWNERS. Add
lfx-oneto the team the repository's CODEOWNERS or branch protection accepts, with write access. Without it, the agent's approvals are advisory. - Triggers. Run
scripts/onboard-repo.shfor the repository, thenscripts/sweep-trigger.sh --applyso the hourly sweep covers it. The sweep checks up to 30 repositories for PRs that never got a review; past that, raise the search limit inPROMPT.mdStep 0.3. See Triggers.
No agent, prompt, or credential policy change is needed. The review
exclusions in PROMPT.md apply to every repository; add a rule there first
if the new repository has code the agent must not review.
Webhook events reach the agent through the Guild GitHub App
(guildai~github), not through the lfx-one token. The app only delivers
events for repositories it can see, so before creating triggers:
- An organization owner installs the Guild GitHub App on the
linuxfoundationorganization and enables it for each repository. - The workspace and the app installation must use the same GitHub connection. If a trigger never fires and no session appears, ask Guild which connection the trigger is bound to.
- The repository dropdown in the Guild trigger editor may not list the repository even when the app is installed. A trigger created with the CLI is not checked against that list, and it fires normally.
Each repository needs four webhook triggers, one per event the agent
handles. Each is scoped to one repository with --service-config and
leaves agent_input empty so the raw payload is forwarded. Trigger names
must be unique within the workspace.
| Event | Action | Trigger name | Starts |
|---|---|---|---|
pull_request |
opened |
lfx-review-agent <repo> opened |
the initial review |
pull_request |
synchronize |
lfx-review-agent <repo> synchronize |
a follow-up review after a push |
pull_request |
ready_for_review |
lfx-review-agent <repo> ready_for_review |
the review of a PR that was a draft |
issue_comment |
created |
lfx-review-agent <repo> re-review comment |
a review on a comment that starts with @lfx-one re-review (comment filter below) |
| time, hourly at :17 | lfx-review-agent sweep (one per workspace) |
the sweep (scripts/sweep-trigger.sh) |
scripts/onboard-repo.sh creates them. It takes one or more repository
names, checks them all before creating anything, and skips any trigger
that already exists for this agent, matched on repository, event, action
and agent, so it is safe to run again. It needs jq.
WS=<workspace-id> scripts/onboard-repo.sh lfx-v2-example-service lfx-v2-other-service
guild trigger list --workspace <workspace-id> --limit 200Without the ready_for_review trigger, a PR opened as a draft gets no
review, and commits pushed
while a PR is a draft are never reviewed, so an earlier approval stays in
place.
When the agent starts handling another event, add it to TRIGGERS in
scripts/onboard-repo.sh and to the table above, then rerun the script
for every onboarded repository. It creates only the missing trigger.
The sweep is one time trigger for the whole workspace. Its input is
{"lfx_review_agent_event": "sweep", "repos": [...]}, and
scripts/sweep-trigger.sh builds repos from the active synchronize
triggers, so the list never goes into this repository. Without --apply
it only prints what it would do. It updates the existing trigger in place,
keeping its active or inactive state, or creates it when there is none
(a new trigger starts active). When no synchronize trigger is left, it
deactivates the sweep instead. Guild has no trigger delete; use
guild trigger deactivate <id> to stop the sweep. When a repository
leaves the review, rerun the script and delete the
lfx-review-agent-pending label in that repository. The sweep removes the
label from pull requests outside its list, but only while the token can
still reach them.
WS=<workspace-id> scripts/sweep-trigger.sh # dry run
WS=<workspace-id> scripts/sweep-trigger.sh --apply
guild trigger activate <sweep-trigger-id>Create triggers only for repositories the lfx-one token covers. A trigger
on any other repository fails its first GitHub read, and the session stops
with a configuration fault before anything is posted.
Without a filter, the issue_comment trigger fires on every comment,
including issue comments and the agent's own, and each one starts a full
model run that Step 0 then ends. On 2026-10-28 that was 1,369 runs across
the onboarded repositories, almost none of them re-review requests, so
the triggers were deactivated on 2026-10-29.
Guild's GitHub triggers now check the comment text before starting a
session. Two service_config keys control it: required_text, and
required_text_regex, which makes required_text an RE2 pattern
searched anywhere in the comment body, ignoring case. Every re-review
trigger uses:
{"repo": "linuxfoundation/<repo>", "required_text": "^\\s*@lfx-one\\s+re-review\\b", "required_text_regex": true}The ^ anchor means the comment must start with the phrase, after any
leading whitespace. A phrase later in the comment, a quote reply
(> @lfx-one re-review), and re-reviewed do not start a session. Step 0
in PROMPT.md applies the same starts-with check. In the Guild trigger
editor, these keys are Require text in comment and Use regex.
scripts/onboard-repo.sh creates the trigger with the filter.
scripts/re-review-trigger.sh adds it to existing triggers that lack it,
reads the saved filter back, and only then activates the trigger, for
every repository that still has an active synchronize trigger. Without
--apply it only prints what it would do.
WS=<workspace-id> scripts/re-review-trigger.sh # dry run
WS=<workspace-id> scripts/re-review-trigger.sh --applyguild trigger update --service-config replaces the whole config, so a
manual update must include repo as well as the filter keys.
A new credential starts with an allow-all policy. Create a policy that
allows only the operations in guild.yaml, scoped to this agent and
workspace, then delete the allow-all policy so anything unmatched is denied.
With allow-all gone, merge, push, and delete operations are refused by
default. Operation names are the bare names below, without the
lfx_one_github_ tool prefix. Add explicit DENY policies only after
checking the names against the integration, since a misspelled name matches
nothing.
CRED=<credential-id> # guild credentials list --owner linux-foundation
guild credentials policy create "$CRED" \
--decision ALLOW \
--operations pulls_get,pulls_list_files,pulls_list_commits,pulls_list_reviews,pulls_list_review_comments,pulls_create_review,issues_list_comments,issues_create_comment,issues_update_comment,issues_create_reaction,repos_compare_commits,repos_get_content,git_get_tree,users_get_by_username,repos_get_branch,repos_get_branch_rules,checks_list_for_ref,repos_get_combined_status,search_issues,issues_add_labels,issues_remove_label \
--workspaces <workspace-uuid> \
--agents <agent-uuid>
guild credentials policy list "$CRED"
guild credentials policy delete <allow-all-policy-id>There is no command to update a policy. To allow a new operation on an
existing credential, create another ALLOW policy with only the new
operations, for example the CI check reads added in 0.1.15, the sweep
operations added in 0.1.18, and the tree read added in 0.1.21:
guild credentials policy create "$CRED" \
--decision ALLOW \
--operations repos_get_branch,repos_get_branch_rules,checks_list_for_ref,repos_get_combined_status \
--workspaces <workspace-uuid> \
--agents <agent-uuid>
guild credentials policy create "$CRED" \
--decision ALLOW \
--operations search_issues,issues_add_labels,issues_remove_label \
--workspaces <workspace-uuid> \
--agents <agent-uuid>
guild credentials policy create "$CRED" \
--decision ALLOW \
--operations git_get_tree \
--workspaces <workspace-uuid> \
--agents <agent-uuid>Guild does not enforce enum values in a request: an enum in the
integration spec documents the intended value only. issues_add_labels,
issues_remove_label and issues_create_reaction rely on the prompt to
send the intended value. Putting the label name in the remove operation's
path broke Guild's operation generation (1.0.6), so 1.0.7 keeps the
{name} parameter.
--workspaces takes a UUID or <owner>~<name>, not a bare workspace name.
If the credential is deleted and reconnected, its policies are gone and this
step must be repeated for the new credential ID. A session that cannot
resolve the credential stops at its first call with 401 Unauthorized: Integration credentials not configured for lfx-one-github.
Reviews and comments post as the lfx-one GitHub account (a regular user
account, shown as "LFX One [bot]"). Guild's shared guildai~github
integration connects as the Guild GitHub App instead, so this agent uses a
custom integration, linux-foundation~lfx-one-github.
- The integration wraps the 20 GitHub REST operations the agent uses. The
OpenAPI spec is
integration/lfx-one-github.openapi.yaml. The spec declares an HTTP bearer security scheme. In Guild the connection uses the API Key auth type with the headerAuthorization: Bearer {token}. - The credential is a fine-grained personal access token owned by
lfx-one, with resource ownerlinuxfoundation. Grant it read and write on Pull requests and Issues, read on Contents and Commit statuses, and access to each repository the agent reviews. Without Commit statuses, the CI check reads fail and the agent reviews as before, without the CI check gate. Fine-grained tokens have no Checks permission, so check runs can't be read on private and internal repositories; there the gate uses commit statuses only, and says nothing about check runs. An organization owner must approve it. Connect it from your shell and never commit it:guild integration connect linux-foundation~lfx-one-github --owner linux-foundation. - Set
REVIEWER_LOGINtolfx-one. The re-review phrase is@lfx-one re-review. - An
APPROVEfromlfx-onecounts toward required reviews only if the account is in a team that branch protection or CODEOWNERS accepts. Otherwise it is advisory.
To use the Guild App bot instead, point guild.yaml back at
guildai~github and set REVIEWER_LOGIN to the App's bot login
(<app-slug>[bot]).
Step 5a.1 approves only when the PR's author_association is MEMBER or
OWNER. A member whose org membership is private can show as
CONTRIBUTOR. That fails safe: the review still runs, but approval is
withheld until a maintainer approves. Making membership public fixes it.
The Documentation dimension checks a PR's docs as well as its code.
- What it decides. From the diff, not the title or labels, whether the PR adds a feature, fixes or changes behavior, or changes nothing a user relies on, and which named items it adds, renames, removes or changes: flags, environment variables, config keys, routes, endpoints, UI text, defaults, CLI options.
- Misaligned docs, on every PR: a doc the agent read that still names something the PR renamed or removed, or a doc the PR changes that disagrees with the PR's code. The finding cites both places.
- Missing docs, only on a PR that changes behavior: no doc covers the
change, in the knowledge base (README, CHANGELOG,
docs/, ADRs), user docs, help text and i18n strings, or reference material (OpenAPI, Helm values docs, CLI help). At most 3 get their own comment; the rest fold into one item, each gap on its own line. - Severity. Both kinds are
[minor][docs]. More than 2[minor]findings request changes, as for any other dimension. - Carry-forward. On a follow-up, an earlier
[docs]finding that is still open keeps counting as a[minor]until the PR fixes it. The agent checks this from the PR's file list and patches, with no extra reads. - No opt-out. Labels, checkboxes and PR text that say docs are not
needed have no effect. When docs really are not needed, a maintainer
dismisses the agent's review that requested changes: its
[docs]findings are then resolved and stop counting. Approving the PR does not clear the agent's review. - Summary. The Decision section names the gaps in a "Documentation gaps" line, and says when they are what blocks approval.
- Reminder. When a PR changes behavior, the review body has a
Documentation section that names the changed behaviors and asks the
author to check docs the agent can't read, such as product pages and
docs sites. It is not a finding. A follow-up repeats it only for newly
changed behaviors. The section carries the
<!-- lfx-review-agent:docs-reminder -->marker. - Reads. The agent reads only the root README and declared doc files, at the target branch, within the read budget, and only when the diff gives a reason. A dependency bump reads no docs. Other doc locations are checked from directory listings, for existence only.
A repository can tell the agent where its docs live with a section in a
rule file the agent already reads: the root or a top-level directory's
CLAUDE.md or AGENTS.md, or a file in .claude/rules/.
## Documentation
- In-repo: `docs/`, `charts/app/README.md`, `src/assets/i18n/`
- Docs site: https://docs.example.org/app (owner: docs-team)
- Product page: https://www.example.org/products/app (owner: product-marketing)- The heading is
Documentation, at any level. Only bullets that start withIn-repo:,Docs site:orProduct page:are read. In-repo:takes comma-separated paths from the repository root; a path ending in/is a directory. At most 10 paths are used.Docs site:andProduct page:take one URL each, with an optional owner. At most 5 sites in total are used. The reminder names them and their owners in code spans, so GitHub sends no notification. The agent never fetches them.- The section is read from the target branch, so a PR that adds or edits it is judged by the version already merged. It can't relax any rule or turn the check off.
Run these on a throwaway PR before enabling triggers on a real repository.
- Confirm the delivered payload has the fields Step 0 reads:
pull_request.updated_at,repository.owner.login, and forissue_comment,comment.created_at,comment.id, andissue.html_urlcontaining/pull/. Guild trims theissue_commentpayload:comment.author_associationandissue.pull_requestare not delivered, so Step 0 usesissue.html_urlto recognize a pull request, and Step 0 and Step 1.5 take the commenter's association fromissues_list_commentsinstead. - Open a PR with a deliberate issue. Confirm the session comment is
posted, its
user.loginmatchesREVIEWER_LOGIN, and the review isREQUEST_CHANGES(do not testAPPROVEfirst). - Confirm Step 6 edits the same comment: the
idis unchanged and the recap is appended below the start line. - Push a fix. Confirm a follow-up review scoped to the new commits, and a debounce notice if you push again within 5 minutes.
- Force-push. Confirm the follow-up falls back to a whole-PR review and the recap says history was rewritten.
- Comment
@lfx-one re-review. Confirm it runs a review even after an approval. Then post an ordinary comment, a comment with the phrase after other text, and a quote reply of the phrase, and confirmguild trigger sessions <id>shows no new session for any of them. - After an approval, push another commit. Confirm a follow-up review scoped to the commits after the approved SHA.
- Add an inline comment anchored outside the diff (for example, a finding
in an unchanged caller). Confirm it lands under
Findings outside the diffand the review still posts. - Open a PR from an account outside the org. Confirm the review is
COMMENTEDwith the approval-withheld marker, neverAPPROVED. - Open a PR that changes
ics.helper.ts. Confirm the exclusion notice, no session comment, and no review. Push again: confirm no review and no reply. Then, on a PR the agent approved, push an ICS change: confirm aREQUEST_CHANGESreview replaces the approval. - On the approved PR that got the ICS change, delete the exclusion notice first, then push a commit that reverts the ICS change (a push made while the notice exists is stopped by gate A0). Confirm a normal follow-up review runs.
- Open a PR as a draft. Confirm no review. Mark it ready for review and
confirm a session appears for the
ready_for_reviewtrigger (guild trigger sessions <id>), the payload carriespull_request.updated_atandnumber, and an initial review runs. Then, on a PR the agent approved, convert it to draft, push a commit, and mark it ready again: confirm a follow-up review scoped to that commit. - On a reviewed PR, merge the target branch into the PR branch (for
example, with "Update branch") after the target has moved. Confirm the
session makes no
last_reviewed_sha...head_shacompare call (guild session events <id> --events all), the follow-up reviews the whole PR diff, and the recap says the merge widened the scope. - On a public repository PR whose review would approve, make a
required check fail (for example, a commit without a DCO sign-off).
Confirm a
COMMENTEDreview with the approval-withheld marker, the⚠️ Review passed, required check failed decision, and a failed-checks line. On a PR with only a failing check that is not required (lf-dbt'sdbt Cloud), confirm the review still approves and the line marks it not required. On a private or internal repository, confirm the recap does not mention the expected check-run 403 or list unmatched required checks as pending. Required checks with matching pending commit statuses should still be listed as pending. - On an lf-dbt PR, confirm the Details block ends with a Rule files:
line that lists
CLAUDE.mdandAGENTS.mdas read. On an lfx-self-serve PR, confirm the line listsAGENTS.mdand the.claude/rules/files as read andCONTRIBUTING.mdas skipped (over the 80,000-byte total). Confirm follow-up reviews carry the line too. - When two runs post a cap or debounce notice at the same moment, confirm
the later one is rewritten to the
superseded notice=marker and the earlier one is left as is. - Sweep, dropped push: on a test PR, push while a review is running.
Confirm the PR gets
lfx-review-agent-pending, the next sweep runs a follow-up whose start comment says the hourly check started it, and the label is gone after the recap. Confirm a push during Step 6 leaves the label in place. - Sweep, blocked PRs: put the label on a draft, a PR at 10 reviews, an excluded PR and an up-to-date PR. Confirm the sweep posts nothing on them and removes the label from each.
- Sweep, idle hour: with no labeled PR and no never-reviewed PR, confirm the session posts nothing and its tool output is small (one tenth of a follow-up review or less).
- Sweep, never reviewed: in an onboarded repository, with a non-draft PR under 7 days old that has no agent review or comment and has been quiet for 10 minutes, confirm the next sweep runs its initial review.
- Sweep, reviews keep dying: on a PR with 2 abandoned reviews since its
last summary and the pending label, confirm the sweep posts one
lfx-review-agent:stallednotice and removes the label. Put the label back and confirm the next sweep posts no second notice. Push within 5 minutes of the notice and confirm a review starts (no debounce). - Tail read: on a PR with more than 10 reviews, confirm the Step 5c
pulls_list_reviewscalls useper_page: 10from pagefloor(review_count / 10) + 1, not page 1. - Too large: on a test PR over 20,000 changed lines, push a commit.
Confirm one
lfx-review-agent:too-largenotice, no start comment and no review, and no second notice on the next push. Shrink the PR under the limits and confirm the next push starts a review without a debounce. - Unread files: on a test PR that changes a lockfile without a patch
(for example
pnpm-lock.yaml) and a non-generated file over 100,000 bytes without a patch, confirm the lockfile is named "generated or lockfile, not reviewed line by line", the other file is named in the Decision, and the review is aCOMMENTwith the approval-withheld marker instead of an approval. - Read budget: in the session events of a review, confirm directories
are listed with
git_get_tree(norepos_get_contentcall on a directory), and no full-file read exceeds 100,000 bytes. - Docs, missing: on a
feat:test PR that adds an environment variable in a repository whose README has an environment variable table, README unchanged, confirm a[minor][docs]finding, a Documentation gaps line in the Decision, and the reminder in the review body and in Details. - Docs, no reason to read: on a
chore:dependency bump, confirm no[docs]finding, no reminder, and no README read in the session events. On achore:PR that adds an API route, confirm the reminder. - Docs, carry-forward: push a commit that fixes something else and
leaves the docs alone. Confirm the earlier
[docs]finding is still open, counted under 🟡 with(prior). Push a commit that updates the cited doc and confirm it is resolved and the gaps line is gone. - Docs, reminder once: push a commit with no new named item and confirm no second reminder. Push one that adds a config key and confirm a reminder naming only that key.
- Docs, cap: on a PR with five missing-docs gaps, confirm three findings, one folded item with two lines, and five counted.
- Docs, declared section: merge a "Documentation" section with a docs site and an owner. On a qualifying PR, confirm the reminder names both in code spans and nobody is notified.
- Docs, no opt-out: a PR description that says "docs not needed" or a
docs-not-neededlabel has no effect. - Docs, dismissal: dismiss a 🔴 review that requested changes only for
[docs]gaps, then push without doc changes. Confirm the gaps are resolved ("dismissed by a maintainer") and not counted. When the "dismiss stale approvals" setting dismisses an approval that carried a[docs]gap, confirm the gap still counts. - Docs, force-push: force-push a PR with an open
[docs]gap. Confirm the gap is classified as prior and counted once. - Docs, escaping: a named item containing
<!--is echoed in a code span with the comment markers removed, and adds no marker to the review body. - Docs, dismissal without a summary: dismiss an own review whose
session summary was never written (an abandoned run). Confirm its
[docs]gaps are resolved ("dismissed by a maintainer"). - Docs, changed again: after a dismissal resolved a gap on an item,
push a commit that renames that item again. Confirm a new
[docs]finding.
- Scheduled sweep. Stall detection and Slack notification of an unresolved cycle need a schedule trigger and are not handled yet.
This agent is a port of the dd-pr-review-auto-cloud Claude Code routine.
Behavior carried over from that routine was checked against real review
history:
- Bot
COMMENTEDandDISMISSEDreviews interleave with real verdicts (linuxfoundation/lfx-v2-campaign-servicePR #99), so Step 2 excludes them from the terminal set. - An
APPROVEDreview can becomeDISMISSEDafter later pushes (linuxfoundation/lfx-self-servePR #2979), so Step 3 treats a dismissed review as evidence that a first review ran.
Copyright The Linux Foundation and each contributor to LFX.
This project's source code is licensed under the MIT License. A copy of the license is available in LICENSE.
This project's documentation is licensed under the Creative Commons Attribution 4.0 International License (CC-BY-4.0). A copy of the license is available in LICENSE-docs.