## What type of PR is this?
- [x] 📝 Documentation
- [x] 🏗️ CI/CD
## Description
Prepares the 0.6.0 release: bumps the project version from
`0.5.1-SNAPSHOT` to `0.6.0` and turns the
`[Unreleased]` changelog section into `[0.6.0]`.
The changelog is rewritten so it describes what changes for someone
upgrading from 0.5.0. Entries
recording fixes to work done inside this cycle are dropped, because the
defects they name never
shipped — a reader upgrading from 0.5.0 never saw them. Twenty-two issue
references go: the
truncation-salvager follow-ups (#582, #592, #617), the spend-ceiling
disclosure fixes (#521, #524,
#530), the write-pacing follow-ups (#541, #542, #577, #598), the
verifier hedging refinements (#594,
#610), and others of the same kind.
What stays is the features 0.6.0 adds, the behaviour it changes, and the
defects that were present in
0.5.0. Membership in that last group was decided against the `v0.5.0`
tag rather than from when an
issue was filed, since every issue in this cycle was filed after 0.5.0
shipped:
| check against `v0.5.0` | result | consequence |
|---|---|---|
| `Dockerfile.runtime` present | yes | image fixes (#561, #564) shipped,
kept |
| streaming in `AiReviewService` | yes | empty SSE frame (#555) shipped,
kept |
| `List.copyOf` in `DiffBudgetPlanner` | 4 uses | null-filename crash
(#472, #551) shipped, kept |
| retry loop in `AiReviewService` | yes | length-cap retry (#495, #504)
shipped, kept |
| `FindingVerifierPrompts` present | yes | verifier precision
(#611–#614) shipped, kept |
| `TruncatedResponseSalvager` | absent | its follow-ups are
cycle-internal, dropped |
| `RebuttalContradiction`, `ConfigKeyContextResolver`, `PatchCoverage`,
`GitHubWriteRetry` | absent | same, dropped |
The prose follows the guidance on
[signs of AI
writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing):
plain sentences,
no promotional framing, and the em-dash and "X instead of Y" habits cut
back to where they carry
meaning.
Also corrects the `max-diff-lines` comment in `application.properties`,
which still listed
`/describe`, `/changelog` and `/add-docs` as capped by it after this
cycle moved those commands onto
token-budgeted batches. The README table already described the new
behaviour, so the two disagreed
and the properties file was the wrong one. Reported by the bot on #532.
## Also in this PR
Three gaps found after the first commit, each a convention the 0.5.0 cut
followed and this one had
missed.
**Dependency bumps.** 0.4.0 and 0.5.0 both carry a `### Dependencies`
section and 0.6.0 had none.
Added: the Quarkus platform 3.37.4 to 3.38.0 and `quarkus-langchain4j`
1.12.0 to 1.12.2;
`jackson-dataformat-yaml` declared explicitly now that reading a
repository's own
`.github/thrillhousebot.yml` uses it directly; frontend `next` to
16.2.12 and dev-only `jsdom` to
30.0.1; `github/codeql-action` to v4.37.6, `actions/setup-java` to
v5.7.0, `docker/login-action` to
v4.6.0; Spotless to 3.9.0. A fresh empty `[Unreleased]` is left above
the release section, as the
0.5.0 cut did.
**Architecture documentation.** `docs/ARCHITECTURE.md` was last touched
on 2026-08-08 and eight of
this cycle's capabilities appeared nowhere in it — verified at zero
occurrences each before the
change: the per-review spend ceiling, the `concise` model binding, patch
coverage as review context,
repository-supplied ignore globs, path-scoped instructions, the decline
re-check, write pacing, and
the coverage-honesty rules that decide when a file withholds APPROVE.
The Packages table also
predated the classes carrying them. Both updated, at the subsystem level
the document is written at.
README needed nothing: all 52 environment variables and all 12 commands
are already documented
there, and the website's Configuration and Commands pages are
include-wrappers over README sections,
so they track it automatically.
**Docs freeze.** `versions.json` listed `current: v0.5.0` with archives
stopping at 0.4.0, so 0.5.0
shipped without being frozen — the same lapse the 0.5.0 cut found for
0.4.0. Because
`archive-docs-version.mjs` expands the include markers at archive time,
archiving the working tree
would have produced a directory labelled v0.5.0 documenting `/improve`
and the spend ceiling. The doc
sources were restored to the `v0.5.0` tag, archived, then reverted.
Verified both directions:
| check | archived 0.5.0 pages | live tree |
|---|---|---|
| `REVIEW_MAX_TOKENS_PER_REVIEW` | 0 | 1 |
| `/improve` | 0 | present |
| `REVIEW_CI_GATING` | 1 | — |
Nine pages with matching assets and `src/content/versions/0.5.0.json`;
`current.label` moves to
v0.6.0. Unlike the 0.4.0 archive, the tag restore resurrected no deleted
files. The site builds: 75
pages, all internal links valid.
## Related Issues
N/A — release mechanics.
## How Has This Been Tested?
- [x] Unit tests
`./mvnw -B clean test` → `Tests run: 3067, Failures: 0, Errors: 0,
Skipped: 0`, building
`thrillhousebot 0.6.0`. `./mvnw -B clean compile spotbugs:check
spotless:check` → `BugInstance size
is 0`.
No production code changes, so there is nothing to cover: the diff is
the version string, the
changelog, the architecture document, one properties comment and the
frozen 0.5.0 docs.
The docs site was built as well (`npm ci && npm run build` in
`website/`): 75 pages, all internal
links valid.
## Checklist
- [x] My code follows the project's coding standards
- [x] I have performed a self-review of my own code
What type of PR is this?
Description
Every recognized comment command is acknowledged with a 👀 reaction before it runs, so any
handler that returns without posting leaves the commenter looking at an acknowledged command that
produced nothing — which reads as a hang, not as a decision.
/summaryon a PR that already carries a summary did exactly that. The decline was deliberate andlogged (
Ignoring /summary — a summary comment is already present on <repo> #<n>) but nothingreached the PR. It now states the decline and how to get a fresh summary anyway:
Audit of the same shape. Five other paths acknowledged and then declined in silence; all are
now answered:
/add-docs,/improve,/generate-testsdisabled by their kill switchthrillhousebot.review.<key>=true)/describe,/changelog,/generate-testswhose generator returned nothingTwo decisions worth flagging for review:
the "disabled" notice before authorizing would let any commenter make the bot speak on a
repository whose maintainers switched the command off. Behaviour for authorized users is
unchanged; unauthorized users now cost one permission lookup on a disabled command.
deliberate exception to the new rule, for the same anti-abuse reason, and it is now stated in the
class contract and pinned by a test.
The generator-returned-nothing notice deliberately names both possible causes ("it found nothing to
suggest, or the generation did not complete"): the generators return
nullfor both, and thehandler has no way to tell them apart, so asserting either one would be a claim this code cannot
support.
Related Issues
Fixes #538
How Has This Been Tested?
CommentCommandServiceTest— 7 tests written/updated against the unfixed code first. All 7 failedin exactly the way the issue describes: the command runs, decides, and never posts.
Verbatim red output for the issue's own case:
Green after the fix:
Tests run: 45, Failures: 0, Errors: 0, Skipped: 0.Gates (Java 25):
./mvnw -B clean compile spotbugs:check spotless:check→BugInstance size is 0, BUILD SUCCESS./mvnw -B clean test→Tests run: 2595, Failures: 0, Errors: 0, Skipped: 0git diff -U0 abd76e5...HEADon changed main code → 17 executable changed lines,17 fully covered, 0 uncovered lines and 0 uncovered branches
Checklist
Additional Notes
/add-docsand/improvealready post their own outcome fromDocGenerationService/PrImprovementService, so they need no reply here beyond the kill-switch case. No behaviour changefor any command that was already producing output.