@keldyn on a pull request to run an on-demand review.
This is not an evidence integration for open pull requests. Verdicts are flags for people to act on and never change a control’s status. When a pull request is merged and a later review of that same PR recorded pass for a control that had previously failed or been at risk, the bot appends one evidence entry (merged commit and a short description). It never replaces an existing entry. A merged pull request that names a Keldyn task can also close that task; see Linking pull requests to tasks. For read-only source-control evidence (access, branch protection, PR approvals, CI history), use the separate GitHub integration.
Integrations are typically managed by workspace admins. The Review Bot GitHub
App is a different app from the GitHub evidence integration. This one
posts checks and comments on pull requests; the evidence app only reads.
What it’s used for
The bot answers one question for every code-relevant control: would merging this pull request cause the control to fail? It is not a generic code review. It does not judge whether the repository already satisfies a control, and it raises no bug, style, or performance findings unless a listed control requires them. A pre-existing gap in code the pull request does not touch is not a finding. The same review rules as the MCPreview-changes prompt apply, so an IDE review and a pull-request review judge the same way. Adding a control in Keldyn, or assigning a framework to a use case, changes the next review with no extra setup.
Controls you have marked not applicable in Keldyn are left out of the review.
Before you begin
1
Decide which platforms to connect
One integration covers GitHub, GitLab, and Bitbucket. Connect only the
platforms you host code on. You can add another later without disconnecting
the first.
2
Choose the repositories to include
On GitHub, pick the organization and repositories during App installation.
On GitLab and Bitbucket, the access token’s scope is what the bot can
review: use a project, group, workspace, or repository token that covers
only those repos.
3
The bot never commits
The bot reads the pull request and proposes fixes as comments. It never
commits, pushes, or edits the branch.
Set up the integration
In the Keldyn web app, go to Integrations and select Keldyn Review Bot. Connect each provider you need.GitHub
1
Install the Review Bot GitHub App
Select Install GitHub App. GitHub opens the Keldyn Review Bot
installation flow. Choose the organization and repositories to review,
review the requested permissions, and approve the installation.
2
Authorize your GitHub account
Complete the GitHub authorization request. Keldyn uses it to verify that
your account can access the installation.
3
Confirm the check appears
Open a pull request on an included repository (or comment
@keldyn on an
existing one). The Keldyn Controls Review check should appear on the
head commit, with a summary comment on the pull request.Keldyn Web Security
On GitHub, also install the Keldyn Web Security action from the GitHub Marketplace. It scans the repository for SAST issues, vulnerable dependencies, leaked secrets, and configuration problems. The Review Bot still posts Keldyn Controls Review against your code-level controls. A workflow with no API key still scans and does not call Keldyn. To open findings and remediation tasks in Keldyn, create a team API key and store it as theKELDYN_API_KEY repository secret.
Open User settings → Team → API Keys and create a key. Turn on Submit automated evidence (evidence.submit). That is the permission this scan needs. A key that already has Edit GRC records (grc.write) can submit scans too, so you do not need a second key for that. evidence.submit does not include the rest of GRC:
- Submit a Web Security scan for the team.
- Create and update findings.
- Create and update the remediation task attached to a new finding.
.github/workflows/web-security.yml:
keldyn-api-key unset and the scan stays in GitHub. To gate merges, require its check on the default branch the same way as Keldyn Controls Review. Inputs, the ignore file, and what each scanner covers are on the Marketplace page.
GitLab
1
Create an access token
Create a project or group access token with the Developer role and the
api scope (read the repository, write merge-request notes and commit
statuses). For a self-managed instance, note the base URL (for example
https://gitlab.example.com).2
Connect in Keldyn
On the GitLab card, select Connect GitLab. Paste the token and, for
self-managed GitLab, the base URL. Keldyn generates a webhook secret.
Leave it as-is.
3
Add the webhook
After connecting, copy the Webhook URL and the webhook secret
(shown once). In GitLab, add a project or group webhook with that URL and
secret token, subscribed to Merge request events and Comments.
Bitbucket
1
Create an access token
Create a Bitbucket Cloud workspace or repository access token with
Repositories: Read and Pull requests: Write.
2
Connect in Keldyn
On the Bitbucket card, select Connect Bitbucket. Paste the token.
Keldyn generates a webhook secret: leave it as-is.
3
Add the webhook
After connecting, copy the Webhook URL and the webhook secret
(shown once). In Bitbucket, add a repository webhook with that URL and
secret, subscribed to Pull request created, updated,
fulfilled, and comment created.
Review settings
Settings apply to every connected provider on the next review. Open the Review settings card on the integration page.Repositories and use cases
Not every repository serves every use case. The Repositories card lists one row per repository the bot knows about (every repository you have bound, plus every repository that has had a review), the use cases it is bound to, and its last review. Bind a repository to one, several, or all of your use cases. On every review the bot loads your organization’s code-level controls plus the code-relevant controls of the frameworks assigned to exactly those use cases. A repository without a binding is reviewed against all use cases.- One use case: a service repository that implements a single AI system.
- Several use cases: a monorepo or shared platform that several systems depend on.
- All use cases: the default; also the right choice for shared infrastructure.
owner/repository, or group/subgroup/project on GitLab). Reset to all removes a binding.
Each row also has Review and Block:
- Review (on by default): when off, automatic reviews are skipped for that repository.
@keldynstill runs. - Block (off by default): when on, the two rule-based checks (secrets in the change, and high-risk / VA-style patterns) can fail the Keldyn Controls Review check. Model findings stay advisory and never block.
How a review works
1
A pull request opens or updates
The bot starts on open, push, reopen, and ready-for-review. Comment
@keldyn (optionally with instructions, for example
@keldyn focus on the auth changes) to re-run at any time.2
Controls are loaded from Keldyn
The bot reviews every code-relevant control on the organization, plus
code-relevant controls from the frameworks assigned to the use cases the
repository is bound to (all use cases unless you bound it, see
Repositories and use cases): excluding
controls marked not applicable.
3
The pull request is reviewed
Keldyn reads the diff and records one verdict per control, with file and
line evidence for anything that would fail or is at risk.
4
Results are posted on the pull request
One summary comment is created or updated in place (per-control table,
evidence, suggested fixes). Inline comments land on changed lines, with
suggested edits where a concrete fix exists. The
Keldyn Controls Review check completes on the head commit.
- Block off (default): the check succeeds. Model findings and rule-based hits are posted on the pull request but never stop a merge.
- Block on: the check fails only when a rule-based check fails (secrets or high-risk change). A review that cannot finish also fails the check, so an unreviewed change cannot sneak through a required gate.
- The summary title still reports model merge impact (
These changes do not put controls at risk/Merging may put control(s) at risk/Merging would cause control(s) to fail). That title is not the merge gate.
For controls already marked Implemented, the bot treats a change that weakens
or removes the previously recorded evidence as a regression. That is the same
rule
review-changes uses in your IDE.Review history
The Review history card on the integration page lists every run: repository, pull request, overall result, per-control tally, whether it ran automatically or from@keldyn, and time. Expand a row for each control’s verdict and evidence.
Verdicts in this history do not change a control’s status in Keldyn. When the pull request is merged and it resolved a finding (a later review of that PR recorded pass after an earlier fail or warning), the bot appends one evidence entry with the merged commit. Use the history to see what merging would have done. If a finding is still open, update the control yourself, or through the controls-to-code workflow.
Linking pull requests to tasks
Put a task reference such asTSK-012 in the pull request’s branch name, title, or description. The bot links the pull request to that task in your Keldyn organization when the pull request opens or updates. The link is made even when automatic review is off, or the review is skipped for plan or token limits. One task can have several pull requests, and one pull request can name several tasks. References to tasks in another organization are ignored.
During the review, Keldyn also decides how far the change completes each linked task, against the acceptance criteria of the task’s controls: criteria met, partly done, or not addressed. The summary comment lists each task and what merging will do. This is part of the same screening call the review already makes. It is not a separate model call.
When the pull request is merged, Keldyn uses the review of the merged commit. It does not re-review:
The task shows its linked pull requests and their review result. Closing a task this way re-checks its controls the same way as closing it by hand: a control moves to Implemented only when its evidence passes the sufficiency check.
What data Keldyn collects and why
The bot requests only the access needed to read the pull request, post results, and record the run.The bot never commits, pushes, or edits the pull-request branch. Access
tokens and webhook secrets for GitLab and Bitbucket are stored encrypted.
The webhook secret cannot be read back after the page that first showed it.
GitHub uses short-lived installation tokens; Keldyn stores the installation
id, not a per-user token. The review sends the changed lines, the version
identifiers, and the use case id. The pull-request head checkout is
discarded when the run finishes, and nothing of the changed lines is kept
after the verdict. What leaves your pipeline, where it goes, who can see
it, and how long it is kept are on Data flow.
Permissions
GitHub App (Keldyn Review Bot, not the evidence app):
GitLab: Developer-role token with the
api scope, so the bot can read the repository and write merge-request notes and commit statuses.
Bitbucket Cloud: Repositories: Read and Pull requests: Write.
Troubleshooting
Reviews that never start, or a check that stays pending, usually mean one of the following:- Wrong GitHub App: the evidence GitHub integration is connected, but this page’s Review Bot App is not. Install Keldyn Review Bot from this integration, not from GitHub evidence.
- Repository not included: the GitHub App installation does not include the repository, or the GitLab / Bitbucket token cannot see it.
- Webhook missing or stale: GitLab and Bitbucket need the URL and secret from the provider card. After Rotate token, update the webhook secret on the provider.
- Draft pull request: drafts are skipped unless Review draft pull requests is on. Mark the pull request ready, or comment
@keldyn. - Automatic review off: with Review automatically off, nothing runs until someone comments
@keldyn. - Review off for the repository: automatic reviews skip that repository. Comment
@keldynto run once. - No code-level controls: the check reports that there is nothing to review against. Assign a framework with code-relevant controls, or stop marking those controls not applicable.
- Check not required: the review ran but merges are not blocked. Add Keldyn Controls Review as a required status check (GitHub) or required commit / build status (GitLab, Bitbucket).
Next steps
Developer SDLC playbook
Run the same review rules in your IDE with
review-changes before you open
a pull request.From controls to code
Turn a Review Bot finding into updated evidence or a remediation task.
Keldyn Web Security
Install this GitHub Action too. It scans the repository each day and on
pull requests for SAST issues, vulnerable dependencies, leaked secrets,
and configuration problems. When you create the team API key, turn on
Submit automated evidence (
evidence.submit). A key with Edit GRC records
(grc.write) can submit scans too.GitHub evidence
Collect read-only source-control evidence. A separate GitHub App from this
one.
Keldyn MCP server
Connect Claude Code or Cursor so local reviews use the same control set.