Skip to content

v0.7.1

Choose a tag to compare

@github-actions github-actions released this 13 Oct 14:58
· 63 commits to main since this release
Immutable release. Only release title and notes can be modified.
d5c80c6

A bug-fix release. Most of the fixes are in follow-up rounds and the summary comment: findings from earlier rounds now get a status and have their threads resolved once fixed, the summary and its Description vs. Implementation section keep to what the change and its description contain, and a finding is placed, counted and matched to its duplicates the same way on every review.

There are no new settings and no schema changes. Visible after the upgrade: pom.xml is reviewed by default, because **/pom.xml left the default THRILLHOUSEBOT_REVIEW_IGNORED_FILES. With REVIEW_CI_CONTEXT_ENABLED=true, the logs of failing GitHub Actions jobs are read even when REVIEW_CI_CONTEXT_INCLUDE_LOGS is off. Unpinned image tags are graded low instead of medium. The next follow-up round resolves the threads of findings from older rounds that were fixed or cleared. The secret-scan marker is now keyed with GITHUB_WEBHOOK_SECRET: declines recorded under the old marker still match, but changing the webhook secret raises each declined secret finding once more.

Fixed

  • The summary no longer describes the description's unimplemented claims as delivered (#920): the summary call now sees the names each changed file declares or modifies, and treats the PR title and description as the author's claims. A behaviour that no file or finding shows is listed under Description vs. Implementation as unconfirmed instead of being described as implemented.
  • Description vs. Implementation lists only real description gaps, and keeps them on a re-review (#946, #964): a gap is dropped when it misquotes the title or description, cites neither the description nor a linked issue, or says the description omits files that it names. The section names each finding that reports a mismatch with the description, and a re-review of the same commit keeps an open gap unless the author edited the description to settle it.
  • Linked-issue findings name the issue and stay within its acceptance criteria (#1073): with one issue linked, "the linked issue" now reads "the linked issue #N". A criterion the issue does not contain is removed from findings and from Description vs. Implementation, and a finding about an unmet criterion is always posted on a review thread.
  • The Changed Files walkthrough and the summary text keep to what the change contains (#964, #1076): a file summary on a mistyped path is moved onto the changed file it means instead of leaving every row "Not summarized", and placeholder text, review bookkeeping, settings the file does not have and invented ticket keys are removed. A path in the summary or in a finding's description that names neither a changed file nor a file of the repository is corrected when it is a near miss of one changed file, and removed otherwise.
  • A summary diagram that would not render is left out, and Key Findings and the verification banner count correctly (#952, #964): a flowchart with broken edge syntax, unbalanced quotes or unbalanced brackets is omitted. At equal severity Key Findings lists the security scan's findings first and says how many findings its cap left out, and the verification banner counts the findings the round posts.
  • A re-review of the same commit keeps the previous overview when the new summary is degraded or incomplete (#965): when the summary call is skipped, refused or fails, the previous round's overview, file summaries and diagram are shown under a banner. A partial answer keeps the earlier file summaries and diagram it is missing.
  • The CI-failure context names the failing tests, and the summary says which finding explains each failing check (#922): with REVIEW_CI_CONTEXT_ENABLED=true, the logs of up to two failing GitHub Actions jobs are read and the failed tests they name are listed; REVIEW_CI_CONTEXT_INCLUDE_LOGS=true now only adds the last 30 log lines. The summary's sentence on each failing check is computed from the open findings that cite the check or one of its tests.
  • Findings backed by the diff or by CI are no longer posted at low confidence (#926, #952): an injection finding that quotes both the untrusted input and the sink from the diff, and a finding that cites a failing CI check or test, are raised from low to medium confidence after verification.
  • A finding is placed inline or under "Things to double-check" by the same rule on every review (#1077): pull requests reviewed in several calls skipped the severity calibration that single-call reviews apply, so the same finding could open a thread on a small pull request and only be listed on a large one. Critical and high findings are posted inline at any confidence, and medium and low ones unless their confidence is low.
  • Deterministic IaC findings post at high confidence, and model findings that repeat a scan finding are merged into it (#921, #952, #1072): scan findings no longer carry the "verify before acting" hedge. A model finding near an IaC detection that names the same defect is dropped in favour of the scan's, and so is a model secret finding that names a scanned secret's variable or environment key, anywhere in the same file or in a documentation or configuration file of the pull request.
  • Unpinned image tags are graded low, and versioned images and placeholder values are not reported (#926): an unpinned base image, action or chart is now a low-risk finding. An image that a COPY --from= names by an explicit version is not reported as unpinned, and a model secret finding on a line that assigns only an interpolation (${VAR}) or a placeholder is dropped.
  • Fewer false positives and misses in the security scan (#981, #983): the generic secret rule skips values that are mostly regular-expression syntax and complete quoted test samples, while executable credential assignments remain scanned. The IaC wildcard rule reports a "*" at any position in a one-line Action or Resource list.
  • Unrelated scan findings no longer trigger all-pairs duplicate checks (#1031): matching uses file, line and identifier indexes instead of comparing every detection with every model finding or earlier decline. Separate defects remain separate.
  • Follow-up changes are reported once, and finding markers are unique across rounds (#927, #1117): when REVIEW_FOLLOW_UP_SUMMARY_ENABLED is on, new, resolved and still-open counts appear in the review outcome instead of a separate delta comment, with each closed finding named once. The hidden finding marker carries a key derived from the finding's file, line and title, so a later round binds each thread to the right finding.
  • Findings from earlier rounds get a status, and fixed or cleared ones have their threads resolved (#957, #958, #959, #1066): a finding raised before the newest round is counted as superseded, resolved or justified when its code leaves the diff, its fix lands, or a maintainer clears or declines it. Its thread is resolved, it is named once among the round's closed findings, and a decline that stands can become a review learning. An @thrillhousebot resolved reply on a finding's thread now resolves that thread with a fixed acknowledgement instead of a generated reply.
  • The reason for keeping a declined finding open is shown (#963): when the review keeps a finding open after a maintainer's reply on its thread, the review body gives the reason. When a decline says the code cannot run concurrently and the diff states that it does, the note quotes that statement.
  • One test decides whether two findings are the same defect (#956, #972, #964): replacement, the duplicate guard and the "Same issue as" note now agree, so a reworded re-raise is not counted twice and a finding is not paired with an unrelated one nearby.
  • A double-check item replaced by an inline finding stays counted (#969): the item counts as still present, and the finding that replaced it is marked open since an earlier review instead of being reported as new.
  • The check run counts every open finding (#952): when earlier findings are still open, the check run leads with the open total, for example "21 open findings: 1 new (0 critical, 0 high, 1 medium, 0 low), 20 still open from earlier rounds".
  • A suggestion is posted only on the lines it quotes (#924): a finding is moved onto the lines its suggestion_old occupies, or loses its suggestion when they cannot be found, so applying a suggestion no longer deletes code nobody flagged. A suggestion that changes a Markdown table row's cell count is dropped.
  • A finding on a mistyped or wrongly cased path is posted on the changed file it means (#945, #925, #1022): a path that matches exactly one changed file by suffix, file name or letter case is mapped onto it, and a finding that still names no changed file is listed in the review body instead of being sent to GitHub. When GitHub refuses or rate-limits a thread, the warning gives the actual reason.
  • Build manifests are reviewed (#935): **/pom.xml is no longer in the default THRILLHOUSEBOT_REVIEW_IGNORED_FILES, build manifests are packed ahead of larger files, and the scope note names every file the ignore list kept out. A deployment that sets its own list keeps it.
  • Excluded labels added just after a pull request opens are honoured (#1021): when WEBHOOK_REQUIRED_LABELS or WEBHOOK_EXCLUDED_LABELS is set, the labels are read from the API instead of the opened payload, so a Dependabot pull request labelled a moment later is skipped. An automatic review checks the labels again before it writes, and an approval held back for CI is dropped when the labels no longer allow the review.
  • Stored maintainer decisions constrain repeated policy findings (#971, #1070): the review applies a decision to the same kind of finding in the same kind of file. A selected learning that accepts mutable Dockerfile image tags keeps a repeated low-risk policy finding under "Things to double-check"; a current digest requirement, a failing CI check or a different defect still takes precedence.
  • The review asks how a rule handles a format's special lines (#979): when a change reads a standard format, the failure-mode request asks the model to run that format's special lines through it, such as a unified diff's \ No newline at end of file marker.
  • Posted text no longer includes the model's self-corrections or internal wording (#964, #986, #987): working notes such as "wait, the binding is …", other stages' terms such as "confirmed findings" or "no findings in this batch", and the note on how the review input was supplied are removed without leaving fragments or dropping an indented bullet's marker.
  • A linked issue named after a mid-line run of backticks is still found (#1032): a code block in the pull request body now opens only at the start of a line, so a later "Closes #17" is no longer skipped.
  • Dispatch text in a single-quoted string no longer reopens a correct "it runs serially" decline (#762): in languages that always write strings with single quotes (Python, JavaScript, TypeScript, Ruby, PHP, shell and others), a single-quoted span is read as a string, not code.
  • Checking a long finding description for an absence claim takes linear time (#1030): the verifier's check for claims such as "nothing sanitizes the input" no longer slows down quadratically on long descriptions.
  • The verifier prompt gives both reasons cited-location evidence can be missing (#1033): the field is absent when nothing was resolved, and also when the resolved text did not fit the evidence budget.

Security

  • The secret-scan content marker is keyed, so it cannot confirm a guessed value (#985): the hidden marker on a secret finding was a plain SHA-256 prefix, which let anyone test guesses for a short secret offline. It is now an HMAC-SHA-256 under a key derived from GITHUB_WEBHOOK_SECRET. A decline recorded under the old marker still matches, and changing the webhook secret raises each declined secret finding once more.

  • Bumped Jackson (jackson-bom) from 2.22.2 to 2.22.3 (#914) for four advisories in the JSON parser the bot uses on webhook payloads and model responses: GHSA-7hhh-6rmp-j9qf, GHSA-p6pp-m3f8-5c89, GHSA-cxp5-3px4-pw24 and GHSA-wv8q-qhhj-9h54

  • The documentation site uses patched cache, math-rendering and CSS-selector dependencies (#1118): http-cache-semantics moves from 4.2.0 to 4.3.0, KaTeX from 0.16.47 to 0.18.11, and postcss-selector-parser from 6.1.4 to 7.1.6, fixing GHSA-ch52-4w7c-c8xp, GHSA-238p-pmpm-9mq7 and GHSA-rj75-hqrm-r3gf. Mermaid moves from 11.17.2 to 12.2.0 so its bundled KaTeX code is patched too; these packages are not part of the bot image.

Documentation

  • The shipped samples state the secret entropy threshold's units and range (#1034): application.properties and .env.example now say that REVIEW_SECRET_SCAN_ENTROPY_THRESHOLD is in bits per character, must be in (0, 8], and applies only to the generic credential-assignment rule. The default (3.5) is unchanged

Dependencies

  • Bumped Quarkus from 3.39.4 to 3.40.1 (#1008, #1012) and Quarkus LangChain4j from 1.13.3 to 1.14.0 (#1010)
  • Bumped spotless-maven-plugin from 3.10.2 to 3.10.3 (#914)
  • Bumped the actions group (#1011), the frontend npm dependencies (#1015, #1019, #1020) and the website docs dependencies (#1009, #1014, #1017, #1018)

What's Changed

Fixes

  • fix(webhook): honour label gates on labels added after a pull request opens by @devops-thiago in #1025
  • fix(review): post findings at the diff's path case and name the real reason a thread was refused by @devops-thiago in #1026
  • fix(review): remove the review-input note cleanly and keep indented bullet markers by @devops-thiago in #1035
  • fix(review): post a finding on a mistyped path at the changed file it names by @devops-thiago in #1037
  • fix(verifier): name both reasons a cited location can be absent by @devops-thiago in #1040
  • fix(review): post a suggestion only on the lines its suggestion_old quotes by @devops-thiago in #1043
  • fix(review): lead the check run's counts with every open finding by @devops-thiago in #1048
  • fix(review): stop scan false positives on regexes and quoted sample text, read wildcards anywhere in a list by @devops-thiago in #1036
  • fix(review): count table cells with GFM's backslash escapes by @devops-thiago in #1047
  • fix(review): give every earlier-round finding a status and act on standing declines through their own thread by @devops-thiago in #1041
  • fix(review): key the secret-scan content fingerprint with the server's secret by @devops-thiago in #1050
  • fix(review): post IaC scan findings unhedged, collapse their model duplicates, drop secret claims on stand-ins by @devops-thiago in #1045
  • fix(review): read a single-quoted span as a string in single-quote-string languages by @devops-thiago in #1055
  • fix(review): open a code fence in a PR body only at the start of a line by @devops-thiago in #1054
  • fix(review): keep a replaced double-check item counted and its replacement out of the new findings by @devops-thiago in #1056
  • fix(review): review build manifests and name every file the ignore list withholds by @devops-thiago in #1062
  • fix(review): screen description gaps against the PR text and name description findings by @devops-thiago in #1039
  • fix(review): keep the model's self-corrections and other stages' vocabulary out of posted text by @devops-thiago in #1042
  • fix(review): keep the previous overview on a degraded or incomplete summary of the same head by @devops-thiago in #1049
  • fix(review): resolve and name an older round's fixed or cleared finding once, and apply an in-thread resolved directive by @devops-thiago in #1069
  • fix(review): pair findings by one same-defect test for replacement, the guard and the Same issue as note by @devops-thiago in #1044
  • fix(review): grade unpinned tags low and keep established findings off low confidence by @devops-thiago in #1046
  • fix(review): post the delta on every follow-up round and key finding markers per finding by @devops-thiago in #1059
  • fix(review): release a description gap an edited description settles, and judge run-together and trailing-attribution quotes by @devops-thiago in #1071
  • fix(review): keep a stored decline covering its defect class unless the code shows a difference by @devops-thiago in #1067
  • test(eval): send the eval the trailing guidance a review sends, and probe a format's special lines by @devops-thiago in #1068
  • fix(review): name the failing tests in the CI-failure context and tie each failing check to a finding by @devops-thiago in #1061
  • fix(review): omit an unparseable summary flowchart, rank and count Key Findings, count verification over posted findings by @devops-thiago in #1051
  • fix(review): explain a decline the model did not accept and cite the concurrency the diff states by @devops-thiago in #1060
  • fix(review): ground the summary in the change's evidence and treat the description as claims by @devops-thiago in #1063
  • fix(review): screen the summary's file summaries and purpose against the change by @devops-thiago in #1057
  • fix(review): place findings inline or under double-check by one table on both lanes (#1077) by @devops-thiago in #1086
  • fix(review): hold the Description vs. Implementation section to the PR text and keep it on an unchanged head (#1074) by @devops-thiago in #1085
  • fix(review): collapse a model finding about the scanned secret by its identifier, not line distance (#1072) by @devops-thiago in #1082
  • fix(review): count only real file names in the false-omission screen (#1074 follow-up) by @devops-thiago in #1087
  • fix(review): name the linked issue, hold cited criteria to it, and thread unmet ones (#1073) by @devops-thiago in #1083
  • fix(review): cite failing CI tests by name and compute the summary's failing-check sentence by @devops-thiago in #1084
  • fix(review): name the finding that names a failing test in the summary's CI sentence (#1091) by @devops-thiago in #1097
  • fix(review): close identity, evidence and carry-over audit gaps by @devops-thiago in #1113
  • fix(review): preserve code and prose during text screening by @devops-thiago in #1114
  • fix(review): honor selected Dockerfile image-policy declines by @devops-thiago in #1116
  • fix(review): preserve scanner recall and bound duplicate matching by @devops-thiago in #1115
  • fix(review): keep parser evidence tied to its source by @devops-thiago in #1112
  • fix(review): report follow-up changes in one outcome by @devops-thiago in #1119

Other changes

  • docs(changelog): record the Jackson 2.22.3 security bump by @devops-thiago in #1007
  • style(test): reflow the ChatModelDefaultOffTest javadoc by @devops-thiago in #1027
  • refactor(review): run the per-call finding checks as a FindingScreen stage chain by @devops-thiago in #1024
  • refactor(review): one stand-down chain for the head-moved and label-gate abandons by @devops-thiago in #1029
  • refactor(ai): pass the review call's prompt inputs as one template variable by @devops-thiago in #1038
  • test: clear the two Sonar issues on main in the scrubber and prompt-rendering tests by @devops-thiago in #1052
  • perf(review): index the security scan's identity matching by path by @devops-thiago in #1053
  • perf(review): read the absence claim's subject backwards from each verb token by @devops-thiago in #1058
  • refactor(review): decide the restart's sentence start in code to keep its regex simple by @devops-thiago in #1065
  • docs(review): say which issue a linked-issue bullet's criterion is checked against (#1073 follow-up) by @devops-thiago in #1088
  • fix(review): check the paths summary and finding text name against the change and the repository by @devops-thiago in #1089
  • fix(deps): patch website dependencies and bundled math renderer by @devops-thiago in #1120
  • chore(release): prepare 0.7.1 by @devops-thiago in #1096

Full Changelog: v0.7.0...v0.7.1