A Builds panel above the Repositories shows the running builds, then the
queued ones, then the failures of the last week that no build of the same
name answers or runs again, at most five, served by GET /api/activity.
Every page is up to 1440 px wide and the home tiles at least 180 px, so
five fit in one row on a desktop screen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude-code
changed title from WIP: The home page lists running, queued and failed builds, and its tiles are smaller to The home page lists running, queued and failed builds, and its tiles are smaller (v1.43.0)2026-10-14 12:05:15 +02:00
hint writing rules violated in the changed docs: .claude/skills/architecture/SKILL.md:56: more than one sentence on a line; .claude/skills/architecture/SKILL.md:56: line longer than 400 characters (1958)
hint 16 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
hint 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js, src/main/resources/templates/releases.html
hint 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt
hint 6 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (all full files together would exceed [review] max_full_files_chars = 160000, and no excerpt fits the limits either): src/main/resources/templates/home.html, src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt, src/test/kotlin/de/hoennig/werkator/server/PermanentBranchRoutesRestTest.kt and 3 more (advisory: Jev judged every changed file)
8 of 11 units passed all questions (1 PR document(s)).
3 answers ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83594, calls 1, tokens in 80277 / out 18949 (reasoning included in out), duration 228.7 s, cost 0.0468 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 10053, cost 0.0004 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 104258 / out 2115, cost 0.0141 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 30354, cost 0.0013 USD, phases: path_judge 1.1 s, classifier 0.8 s, context 47.7 s, model_review 178.5 s, config: defaults + host + repository (.werkrevisor.toml at main 15b1251).
Reviewed head `76ce39ce37c831c1e4e40fbab730a46fcad188c2` against base `15b125126912d7c2124c222b8ecd8a839c12aa5d`, werkrevisor 0.41.2.
<!-- werkrevisor:76ce39ce37c831c1e4e40fbab730a46fcad188c2 -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:964bbb247f5dca652674eca1afcc093c,2e5483faa8a02db874a07cae06ead28c,9ccdedaf34428a034c59d38e45ac370c,4f255434d4bce1663b753f80e0700cb2,0f3281f08a9c11f21483462e0ebb51ce,8ecdd77d0b403e2f2b52b39c29ac5328,969a182268213048ce5457cb20a4498f,35a9c5de8012fe1d875b05f86b47fccb,bf5be3568fe069ac550950cb3e5f08ae,ac56a54b358196208981ae1c0bcd62d6,7c0d932203f687f0e48eda7bc4301796,930f45a3ea02bbb555e6054dec2dcdfe,42b4ecb0d61b2e0c9f3c2963bafd1177,821a983ea7b162ddff1804629bc566ba,65c4240f8dcd2e2d1ca53147d408f3a9,f5114f4f983f91bfd3cd6974bfb62d8e,1f28011399dfcec817bd13d149912887,98bb5cbfdf4106c702b590b5a742169c,f9cfe5c4e38138cc70b83c19152d20b7,381f2e9ba6d7c0d31a95e93a369e416b,9dd853e3993ab420287221f2cd762286,70d00eff3e81fed613da79b4831cf91e,cb9385babd1fb5c82df3550113c2a78f,373af575f677b00e26783d81838a0b41,ff7dcfe8da9a6ce6c47af7484829cae8,4116a77d086bf32029e93f257879239b,b80c0f3cbc729c7ecbe90836795fd067,251209d9757da38e585317e53428d286,0aff342ae7ec392df3eae3405ed23c1c,5ebb8eeb24592a659c26761ca3889aa8,cc712151d2fa0d2cef1f01b4bfb91cc1,e6cc35586d202faaacfe5891d2af76df,7b44fa136173176710f16d74efca1121,1bb79d3bf02571500d48e595054cf5f2,e80816c82e9a2eeeecbe21d15c0f798c,568dcd2a5ac5a2ea166f84d5d3882488,c332b3341f3eff8a0859574e0dcabb1c,e2ea1a146c1dc93f081cc9cf7c44cf54,2f09c4638b6d8007184e665393505977,ad5a451939446e8d5b8fb699669b09d0,552426f91324f1fc2d82bb6778fbbbbc,549f0649ccb0d7d0dbede42e64b96b3c,1d4022786014e23be1f514424bf5f3aa,6c9db70308086c6824b4a46a4f39cac8,abfdeda0fd89bfc7965a7541315374d1,e78802366e4dc4f259e0d542ea6c84e6,b2740f42697a747801a7441107bbaf7d,bf1d781c20c482a0a4b9bf3286ea27af,39a026626e3367ea2ea392ac5915cf71,a599217ea3ef4fb4fb15d192a138e1ca,97e39b6daebdf07967ebdd5a7df05dd7 -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>76ce39c</code>, superseded by <a href="http://git.javagil.de/mi/werkator/pulls/160#issuecomment-5359">the result for <code>bd3323c</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** spec: docs/prs/2026-10-14-PR#160-home-builds-panel.md Scenario#160.03 more_than_one_aspect (0.67 > yellow_above = 0.6)
- **YELLOW** spec: docs/prs/2026-10-14-PR#160-home-builds-panel.md Scenario#160.05 more_than_one_aspect (0.80 > yellow_above = 0.6)
- **YELLOW** spec: docs/prs/2026-10-14-PR#160-home-builds-panel.md Scenario#160.06 more_than_one_aspect (0.71 > yellow_above = 0.6)
- **hint** writing rules violated in the changed docs: .claude/skills/architecture/SKILL.md:56: more than one sentence on a line; .claude/skills/architecture/SKILL.md:56: line longer than 400 characters (1958)
- **hint** 16 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
- **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
- **hint** 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js, src/main/resources/templates/releases.html
- **hint** 1 changed file was given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt
- **hint** 6 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (all full files together would exceed [review] max_full_files_chars = 160000, and no excerpt fits the limits either): src/main/resources/templates/home.html, src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt, src/test/kotlin/de/hoennig/werkator/server/PermanentBranchRoutesRestTest.kt and 3 more (advisory: Jev judged every changed file)
### Classifier
| Unit | Question | Problem | Confidence | Verdict |
|---|---|---|---|---|
| docs/prs/2026-10-14-PR#160-home-builds-panel.md Scenario#160.03 | more_than_one_aspect | 0.67 | – | YELLOW |
| docs/prs/2026-10-14-PR#160-home-builds-panel.md Scenario#160.05 | more_than_one_aspect | 0.80 | – | YELLOW |
| docs/prs/2026-10-14-PR#160-home-builds-panel.md Scenario#160.06 | more_than_one_aspect | 0.71 | – | YELLOW |
8 of 11 units passed all questions (1 PR document(s)).
3 answers ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83594, calls 1, tokens in 80277 / out 18949 (reasoning included in out), duration 228.7 s, cost 0.0468 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 10053, cost 0.0004 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 104258 / out 2115, cost 0.0141 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 30354, cost 0.0013 USD, phases: path_judge 1.1 s, classifier 0.8 s, context 47.7 s, model_review 178.5 s, config: defaults + host + repository (.werkrevisor.toml at main 15b1251).<br>
Reviewed head `76ce39ce37c831c1e4e40fbab730a46fcad188c2` against base `15b125126912d7c2124c222b8ecd8a839c12aa5d`, werkrevisor 0.41.2.
</sub>
</details>
werkrevisor: YELLOW / HUMAN_REVIEW for 76ce39ce37c831c1e4e40fbab730a46fcad188c2.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `76ce39ce37c831c1e4e40fbab730a46fcad188c2`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:76ce39ce37c831c1e4e40fbab730a46fcad188c2 -->
What makes several repositories one UI (ADR 0009) is the Repositories page and the repository line (RFC 0001), not a switcher: `RepoOverviews` derives one `RepoOverviewDto` per served repository — the newest build per `latestPerName`, running and pending counts, the failed latest builds of the last seven days (`RECENT_FAILURE_WINDOW`), the watcher's per-repository problem in the banner's words — sorted newest build first, never-built last; `GET /api/repos` serves the list, `/repos` renders it (redirecting to the home page with one served repository), and `UiController.baseModel` puts the `RepoLineView` (the current repository plus the conspicuous ones, and the link to the rest) on every repository page. `werkator.js` re-renders both from the endpoint on the table interval; `UiFormats.repoStatusLine`/`count` and the script's `repoStatusLine`/`countText`, and `RepoLineView.chipOf`/`renderRepoChip`, must produce the same texts. Fragment names are deliberately not element names — Thymeleaf resolves `fragments :: nav` to the first `<nav>` element before the fragment of that name. Statuses are a dot and a Mono word (`.status::before`, outlined for pending, pulsing for running), so `status status-<name>` stays the only markup. Icons are stroke glyphs as CSS masks (`.icon.icon-<name>`, `--icon` data URIs appended at the end of `werkator.css`) colored by `currentColor`; `werkator.js` builds them with `icon(name)`/`iconLink(...)`, the templates write the `<span class="icon icon-…">` by hand — no emoji anywhere. IBM Plex Sans and Mono are bundled as WOFF2 under `static/fonts/` (latin subset, six faces) and declared by `@font-face` in the stylesheet: nothing is loaded from a third party.
The home page (`/`, RFC 0003) is the instance's entrance, served with one repository as well as with twelve: a 288 px system rail left — the verdict, one row per gauge of the system page and four smaller tiles, each a link into `/system` — and the repository mosaic right, one card per repository in the Repositories page's own order (newest activity first, so attention is a tint and never a new position) with the bar strip of its last twelve builds, height for duration and colour for outcome. `HomeViews.kt` derives all of it from `GET /api/repos` (the strip is `RepoOverviewDto.recentBuilds`) and `GET /api/system`; only the sparklines are drawn client-side, by the system page's own `drawSpark` from `GET /api/system/history`. The page does not use `viewHead` — no tabs, no `h1`, no repository line — but it carries the watcher banner, and the footer sits outside its two-column grid so it spans both. `HomeBarView.strip`/`barStrip`, `HomeCardView.toneOf`/`cardTone` and `HomeTexts`/`homeMeta` are twins like every other pair.
The home page (`/`, RFC 0003) is the instance's entrance, served with one repository as well as with twelve: a 288 px system rail left — the verdict, one row per gauge of the system page and four smaller tiles, each a link into `/system` — and the repository mosaic right, one card per repository in the Repositories page's own order (newest activity first, so attention is a tint and never a new position) with the bar strip of its last twelve builds, height for duration and colour for outcome. `HomeViews.kt` derives all of it from `GET /api/repos` (the strip is `RepoOverviewDto.recentBuilds`) and `GET /api/system`; only the sparklines are drawn client-side, by the system page's own `drawSpark` from `GET /api/system/history`. Above the mosaic stands the Builds panel (PR#160): across all repositories the running builds (longest running first), then the queued ones (longest waiting first), then the failures — failed or timed out, not outdated (PR#156), started within `RECENT_FAILURE_WINDOW`, of a name that is not running or queued again — newest first, at most `BuildActivity.LIMIT` (5). `BuildActivity` derives them on read from each repository's history and redacts a private repository's like `RepoOverviews`; `GET /api/activity` serves them, and a tile leads to the Current Builds view while the build runs or waits, to the build page once it failed. `HomeBuildView.toneOf`/`buildTone` and the tile markup of `home.html`/`renderHomeBuild` are twins; a tile carries the ticker's data attributes, so its time counts on between polls. Five tiles fit one row on a desktop screen because every page is up to 1440 px wide and a tile at least 180 px. The page does not use `viewHead` — no tabs, no `h1`, no repository line — but it carries the watcher banner, and the footer sits outside its two-column grid so it spans both. `HomeBarView.strip`/`barStrip`, `HomeCardView.toneOf`/`cardTone` and `HomeTexts`/`homeMeta` are twins like every other pair.
The change adds a public activity endpoint and authorization-dependent redaction of private-repository content. A mistake at this boundary could expose repository names, branches, commits, or pull requests, so human review is required.
No findings.
The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
Model `gpt-6-astra`, effort high, tokens in 430059 (cached 351488) / out 1659, 65.7 s, 14 commands; reviewed head `76ce39ce37c831c1e4e40fbab730a46fcad188c2`.
<!-- werkrevisor-codex:76ce39ce37c831c1e4e40fbab730a46fcad188c2 -->
<!-- werkrevisor-codex-critical:true -->
<!-- werkrevisor-codex-unattached:0 -->
<!-- werkrevisor-codex -->
<!-- werkrevisor-folded -->
<details><summary>⚠️ werkrevisor ERROR for <code>?</code>, superseded by <a href="http://git.javagil.de/mi/werkator/pulls/160#issuecomment-5359">the result for <code>bd3323c</code></a></summary>
## Codex review: critical
The change adds a public activity endpoint and authorization-dependent redaction of private-repository content. A mistake at this boundary could expose repository names, branches, commits, or pull requests, so human review is required.
No findings.
The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
<sub>
Model `gpt-6-astra`, effort high, tokens in 430059 (cached 351488) / out 1659, 65.7 s, 14 commands; reviewed head `76ce39ce37c831c1e4e40fbab730a46fcad188c2`.
</sub>
</details>
ai-review/assessment human review required; a human approval unlocks the merge; no human review requested; merge conflict with main: the author rebases the branch onto main and pushes
Gate: no human review requested; merge conflict with main: the author rebases the branch onto main and pushes.
Change kind: mixed.
Reasons
YELLOW PR too large for an AI-only approval: 818 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
hint 16 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
hint 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js, src/main/resources/templates/releases.html
hint 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): src/test/kotlin/de/hoennig/werkator/server/PermanentBranchRoutesRestTest.kt, src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt
hint 5 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (all full files together would exceed [review] max_full_files_chars = 160000, and no excerpt fits the limits either): src/main/resources/templates/home.html, src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt, src/test/kotlin/de/hoennig/werkator/server/ReposApiControllerRestTest.kt and 2 more (advisory: Jev judged every changed file)
hint 1 finding(s) of low severity or rated minor by Jev: src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt:120-186
Findings
[low] Swapped scenario labels at src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt:120-186, hint, as a line comment
Classifier
19 of 19 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83769, calls 1, tokens in 80446 / out 21819 (reasoning included in out), duration 348.7 s, cost 0.0503 USD (reported), classifier `jev-1.13.0` calls 19, tokens in 17631, cost 0.0007 USD, finding judge `none` calls 0, tokens in 0, cost 0.0000 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 105267 / out 2336, cost 0.0098 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 31459, cost 0.0013 USD, phases: path_judge 1.1 s, classifier 1.1 s, context 52.3 s, model_review 293.3 s, finding_judge 0.0 s, config: defaults + host + repository (.werkrevisor.toml at main d17f9bd).
Reviewed head `bd3323c740d74dbe1be3d181e9779927e5f9448c` against base `d17f9bd16056c064a4f17ba8ee1f4c49ba87656d`, werkrevisor 0.41.2.
<!-- werkrevisor:bd3323c740d74dbe1be3d181e9779927e5f9448c -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:588535d9895b8474a4cd7a45db7cba38,2e5483faa8a02db874a07cae06ead28c,a21d5be563b49e1213a26ce7e7467320,4f255434d4bce1663b753f80e0700cb2,0f3281f08a9c11f21483462e0ebb51ce,8ecdd77d0b403e2f2b52b39c29ac5328,969a182268213048ce5457cb20a4498f,35a9c5de8012fe1d875b05f86b47fccb,bf5be3568fe069ac550950cb3e5f08ae,ac56a54b358196208981ae1c0bcd62d6,7c0d932203f687f0e48eda7bc4301796,930f45a3ea02bbb555e6054dec2dcdfe,42b4ecb0d61b2e0c9f3c2963bafd1177,821a983ea7b162ddff1804629bc566ba,65c4240f8dcd2e2d1ca53147d408f3a9,f5114f4f983f91bfd3cd6974bfb62d8e,1f28011399dfcec817bd13d149912887,98bb5cbfdf4106c702b590b5a742169c,f9cfe5c4e38138cc70b83c19152d20b7,381f2e9ba6d7c0d31a95e93a369e416b,9dd853e3993ab420287221f2cd762286,70d00eff3e81fed613da79b4831cf91e,cb9385babd1fb5c82df3550113c2a78f,373af575f677b00e26783d81838a0b41,ff7dcfe8da9a6ce6c47af7484829cae8,4116a77d086bf32029e93f257879239b,b80c0f3cbc729c7ecbe90836795fd067,251209d9757da38e585317e53428d286,0aff342ae7ec392df3eae3405ed23c1c,5ebb8eeb24592a659c26761ca3889aa8,cc712151d2fa0d2cef1f01b4bfb91cc1,e6cc35586d202faaacfe5891d2af76df,7b44fa136173176710f16d74efca1121,1bb79d3bf02571500d48e595054cf5f2,e80816c82e9a2eeeecbe21d15c0f798c,568dcd2a5ac5a2ea166f84d5d3882488,c332b3341f3eff8a0859574e0dcabb1c,8d937f1303d780d7a6661c31dc2d1bf2,35ae09e6234912d7e5d557bfb18b1225,6f670208ea806f06a93aa5c66e0caac1,552426f91324f1fc2d82bb6778fbbbbc,549f0649ccb0d7d0dbede42e64b96b3c,1d4022786014e23be1f514424bf5f3aa,8e515ee5d6b57fc02724b2e1792609c9,abfdeda0fd89bfc7965a7541315374d1,e78802366e4dc4f259e0d542ea6c84e6,c963d967c3f65370843cf1a764c4888e,35e5e85326ddfd04b598ba3d7a86b152,bf1d781c20c482a0a4b9bf3286ea27af,39a026626e3367ea2ea392ac5915cf71,a599217ea3ef4fb4fb15d192a138e1ca,2c5d9b899dacecc6d557de2b509c5464 -->
<!-- werkrevisor-folded -->
<details><summary>🟡 werkrevisor YELLOW for <code>bd3323c</code>, superseded by <a href="http://git.javagil.de/mi/werkator/pulls/160#issuecomment-5367">the result for <code>cb53076</code></a></summary>
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Gate: no human review requested; merge conflict with main: the author rebases the branch onto main and pushes.
Change kind: `mixed`.
### Reasons
- **YELLOW** PR too large for an AI-only approval: 818 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
- **hint** 16 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
- **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
- **hint** 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js, src/main/resources/templates/releases.html
- **hint** 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): src/test/kotlin/de/hoennig/werkator/server/PermanentBranchRoutesRestTest.kt, src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt
- **hint** 5 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (all full files together would exceed [review] max_full_files_chars = 160000, and no excerpt fits the limits either): src/main/resources/templates/home.html, src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt, src/test/kotlin/de/hoennig/werkator/server/ReposApiControllerRestTest.kt and 2 more (advisory: Jev judged every changed file)
- **hint** 1 finding(s) of low severity or rated minor by Jev: src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt:120-186
### Findings
1. **[low] Swapped scenario labels** at `src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt:120-186`, hint, as a line comment
### Classifier
19 of 19 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83769, calls 1, tokens in 80446 / out 21819 (reasoning included in out), duration 348.7 s, cost 0.0503 USD (reported), classifier `jev-1.13.0` calls 19, tokens in 17631, cost 0.0007 USD, finding judge `none` calls 0, tokens in 0, cost 0.0000 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 105267 / out 2336, cost 0.0098 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 31459, cost 0.0013 USD, phases: path_judge 1.1 s, classifier 1.1 s, context 52.3 s, model_review 293.3 s, finding_judge 0.0 s, config: defaults + host + repository (.werkrevisor.toml at main d17f9bd).<br>
Reviewed head `bd3323c740d74dbe1be3d181e9779927e5f9448c` against base `d17f9bd16056c064a4f17ba8ee1f4c49ba87656d`, werkrevisor 0.41.2.
</sub>
</details>
werkrevisor: YELLOW / HUMAN_REVIEW for bd3323c740d74dbe1be3d181e9779927e5f9448c.
The result comment of werkrevisor holds the details.
werkrevisor: YELLOW / HUMAN_REVIEW for `bd3323c740d74dbe1be3d181e9779927e5f9448c`.
The result comment of werkrevisor holds the details.
<!-- werkrevisor-review:bd3323c740d74dbe1be3d181e9779927e5f9448c -->
The PR document defines Scenario#160.04 as "A failure older than seven days has no tile!" and Scenario#160.06 as "A visitor sees a private repository's build counted and timed, but not named!". In BuildActivityUnitTest.kt the suffixes on those two tests are swapped: the seven-day-window test name ends with "(Scenario#160.06)" and the private-repository test name ends with "(Scenario#160.04)". The other verifying tests (ReposApiControllerRestTest, UiHomeRestTest) carry the correct Scenario#160.06 suffix. The behaviour the tests verify is correct; the only defect is the inconsistent scenario-number labelling, which contradicts the PR document.
**[low] Swapped scenario labels** (werkrevisor)
hint
The PR document defines Scenario#160.04 as "A failure older than seven days has no tile!" and Scenario#160.06 as "A visitor sees a private repository's build counted and timed, but not named!". In BuildActivityUnitTest.kt the suffixes on those two tests are swapped: the seven-day-window test name ends with "(Scenario#160.06)" and the private-repository test name ends with "(Scenario#160.04)". The other verifying tests (ReposApiControllerRestTest, UiHomeRestTest) carry the correct Scenario#160.06 suffix. The behaviour the tests verify is correct; the only defect is the inconsistent scenario-number labelling, which contradicts the PR document.
YELLOW PR too large for an AI-only approval: 818 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
hint 16 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
hint 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
hint 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js, src/main/resources/templates/releases.html
hint 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): src/test/kotlin/de/hoennig/werkator/server/PermanentBranchRoutesRestTest.kt, src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt
hint 5 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (all full files together would exceed [review] max_full_files_chars = 160000, and no excerpt fits the limits either): src/main/resources/templates/home.html, src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt, src/test/kotlin/de/hoennig/werkator/server/ReposApiControllerRestTest.kt and 2 more (advisory: Jev judged every changed file)
Classifier
19 of 19 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83588, calls 1, tokens in 80284 / out 12229 (reasoning included in out), duration 233.5 s, cost 0.0387 USD (reported), classifier `jev-1.13.0` calls 19, tokens in 17631, cost 0.0007 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 105363 / out 2309, cost 0.0064 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 31458, cost 0.0013 USD, phases: path_judge 1.2 s, classifier 1.1 s, context 49.3 s, model_review 181.2 s, config: defaults + host + repository (.werkrevisor.toml at main d17f9bd).
Reviewed head `cb53076758d0a3410c4e8ff521126e5827a243ab` against base `d17f9bd16056c064a4f17ba8ee1f4c49ba87656d`, werkrevisor 0.41.2.
<!-- werkrevisor:cb53076758d0a3410c4e8ff521126e5827a243ab -->
<!-- werkrevisor-verdict:YELLOW -->
<!-- werkrevisor-blocks:588535d9895b8474a4cd7a45db7cba38,94ca5f9c5ed0a34e5df3ade5d5ee0460,a21d5be563b49e1213a26ce7e7467320,4f255434d4bce1663b753f80e0700cb2,0f3281f08a9c11f21483462e0ebb51ce,8ecdd77d0b403e2f2b52b39c29ac5328,969a182268213048ce5457cb20a4498f,35a9c5de8012fe1d875b05f86b47fccb,bf5be3568fe069ac550950cb3e5f08ae,ac56a54b358196208981ae1c0bcd62d6,7c0d932203f687f0e48eda7bc4301796,930f45a3ea02bbb555e6054dec2dcdfe,42b4ecb0d61b2e0c9f3c2963bafd1177,821a983ea7b162ddff1804629bc566ba,65c4240f8dcd2e2d1ca53147d408f3a9,f5114f4f983f91bfd3cd6974bfb62d8e,1f28011399dfcec817bd13d149912887,98bb5cbfdf4106c702b590b5a742169c,f9cfe5c4e38138cc70b83c19152d20b7,381f2e9ba6d7c0d31a95e93a369e416b,9dd853e3993ab420287221f2cd762286,70d00eff3e81fed613da79b4831cf91e,cb9385babd1fb5c82df3550113c2a78f,373af575f677b00e26783d81838a0b41,ff7dcfe8da9a6ce6c47af7484829cae8,4116a77d086bf32029e93f257879239b,b80c0f3cbc729c7ecbe90836795fd067,251209d9757da38e585317e53428d286,0aff342ae7ec392df3eae3405ed23c1c,5ebb8eeb24592a659c26761ca3889aa8,cc712151d2fa0d2cef1f01b4bfb91cc1,e6cc35586d202faaacfe5891d2af76df,7b44fa136173176710f16d74efca1121,1bb79d3bf02571500d48e595054cf5f2,e80816c82e9a2eeeecbe21d15c0f798c,568dcd2a5ac5a2ea166f84d5d3882488,c332b3341f3eff8a0859574e0dcabb1c,8d937f1303d780d7a6661c31dc2d1bf2,35ae09e6234912d7e5d557bfb18b1225,b33278069591dc776511e50d6c9bd5a1,552426f91324f1fc2d82bb6778fbbbbc,549f0649ccb0d7d0dbede42e64b96b3c,1d4022786014e23be1f514424bf5f3aa,8e515ee5d6b57fc02724b2e1792609c9,abfdeda0fd89bfc7965a7541315374d1,e78802366e4dc4f259e0d542ea6c84e6,c963d967c3f65370843cf1a764c4888e,35e5e85326ddfd04b598ba3d7a86b152,bf1d781c20c482a0a4b9bf3286ea27af,39a026626e3367ea2ea392ac5915cf71,a599217ea3ef4fb4fb15d192a138e1ca,2c5d9b899dacecc6d557de2b509c5464 -->
## 🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind: `mixed`.
### Reasons
- **YELLOW** PR too large for an AI-only approval: 818 changed lines (docs and mechanical files not counted) exceed [size] max_changed_lines = 800; please review it yourself
- **hint** 16 changed file(s) that neither weaken the checks, touch security nor show a risk category of jvm-spring-backend according to Jev
- **hint** 1 build change(s) of low risk according to Jev: build.gradle.kts (weakens checks 0.03, risk 0.00, security 0.01)
- **hint** 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (each larger than [review] max_full_file_chars = 80000): src/main/resources/static/werkator.js, src/main/resources/templates/releases.html
- **hint** 2 changed files were given to the AI as excerpt of the selected lines and 5 lines around each changed line, not in full (all full files together would exceed [review] max_full_files_chars = 160000): src/test/kotlin/de/hoennig/werkator/server/PermanentBranchRoutesRestTest.kt, src/test/kotlin/de/hoennig/werkator/server/UiPageRestTest.kt
- **hint** 5 changed files were given to the AI only as diff, not in full, so it could not check them against the rest of their file (all full files together would exceed [review] max_full_files_chars = 160000, and no excerpt fits the limits either): src/main/resources/templates/home.html, src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt, src/test/kotlin/de/hoennig/werkator/server/ReposApiControllerRestTest.kt and 2 more (advisory: Jev judged every changed file)
### Classifier
19 of 19 units passed all questions (1 PR document(s)).
1 answer ignored because of a confidence below [classifier] min_confidence.
<sub>
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83588, calls 1, tokens in 80284 / out 12229 (reasoning included in out), duration 233.5 s, cost 0.0387 USD (reported), classifier `jev-1.13.0` calls 19, tokens in 17631, cost 0.0007 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 105363 / out 2309, cost 0.0064 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 31458, cost 0.0013 USD, phases: path_judge 1.2 s, classifier 1.1 s, context 49.3 s, model_review 181.2 s, config: defaults + host + repository (.werkrevisor.toml at main d17f9bd).<br>
Reviewed head `cb53076758d0a3410c4e8ff521126e5827a243ab` against base `d17f9bd16056c064a4f17ba8ee1f4c49ba87656d`, werkrevisor 0.41.2.
</sub>
The change adds a public activity endpoint and extends control-token-dependent redaction of private repository content. A mistake at this authorization boundary could expose private repository names, branches or commits, so human review is required.
No findings.
The merge waits for the status ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
Model `gpt-6-astra`, effort high, tokens in 315363 (cached 272640) / out 1358, 54.3 s, 9 commands; reviewed head `cb53076758d0a3410c4e8ff521126e5827a243ab`.
<!-- werkrevisor-codex:cb53076758d0a3410c4e8ff521126e5827a243ab -->
<!-- werkrevisor-codex-critical:true -->
<!-- werkrevisor-codex-unattached:0 -->
<!-- werkrevisor-codex -->
## Codex review: critical
The change adds a public activity endpoint and extends control-token-dependent redaction of private repository content. A mistake at this authorization boundary could expose private repository names, branches or commits, so human review is required.
No findings.
The merge waits for the status `ai-review/codex`: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.
<sub>
Model `gpt-6-astra`, effort high, tokens in 315363 (cached 272640) / out 1358, 54.3 s, 9 commands; reviewed head `cb53076758d0a3410c4e8ff521126e5827a243ab`.
</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
See docs/prs/2026-10-14-PR#160-home-builds-panel.md
🤖 Generated with Claude Code
WIP: The home page lists running, queued and failed builds, and its tiles are smallerto The home page lists running, queued and failed builds, and its tiles are smaller (v1.43.0)🟡 werkrevisor YELLOW for
76ce39c, superseded by the result forbd3323c🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
8 of 11 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83594, calls 1, tokens in 80277 / out 18949 (reasoning included in out), duration 228.7 s, cost 0.0468 USD (reported), classifier `jev-1.13.0` calls 11, tokens in 10053, cost 0.0004 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 104258 / out 2115, cost 0.0141 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 30354, cost 0.0013 USD, phases: path_judge 1.1 s, classifier 0.8 s, context 47.7 s, model_review 178.5 s, config: defaults + host + repository (.werkrevisor.toml at main3 answers ignored because of a confidence below [classifier] min_confidence.
15b1251).Reviewed head `76ce39ce37c831c1e4e40fbab730a46fcad188c2` against base `15b125126912d7c2124c222b8ecd8a839c12aa5d`, werkrevisor 0.41.2.
werkrevisor: YELLOW / HUMAN_REVIEW for
76ce39ce37c831c1e4e40fbab730a46fcad188c2.The result comment of werkrevisor holds the details.
@@ -54,3 +54,3 @@What makes several repositories one UI (ADR 0009) is the Repositories page and the repository line (RFC 0001), not a switcher: `RepoOverviews` derives one `RepoOverviewDto` per served repository — the newest build per `latestPerName`, running and pending counts, the failed latest builds of the last seven days (`RECENT_FAILURE_WINDOW`), the watcher's per-repository problem in the banner's words — sorted newest build first, never-built last; `GET /api/repos` serves the list, `/repos` renders it (redirecting to the home page with one served repository), and `UiController.baseModel` puts the `RepoLineView` (the current repository plus the conspicuous ones, and the link to the rest) on every repository page. `werkator.js` re-renders both from the endpoint on the table interval; `UiFormats.repoStatusLine`/`count` and the script's `repoStatusLine`/`countText`, and `RepoLineView.chipOf`/`renderRepoChip`, must produce the same texts. Fragment names are deliberately not element names — Thymeleaf resolves `fragments :: nav` to the first `<nav>` element before the fragment of that name. Statuses are a dot and a Mono word (`.status::before`, outlined for pending, pulsing for running), so `status status-<name>` stays the only markup. Icons are stroke glyphs as CSS masks (`.icon.icon-<name>`, `--icon` data URIs appended at the end of `werkator.css`) colored by `currentColor`; `werkator.js` builds them with `icon(name)`/`iconLink(...)`, the templates write the `<span class="icon icon-…">` by hand — no emoji anywhere. IBM Plex Sans and Mono are bundled as WOFF2 under `static/fonts/` (latin subset, six faces) and declared by `@font-face` in the stylesheet: nothing is loaded from a third party.The home page (`/`, RFC 0003) is the instance's entrance, served with one repository as well as with twelve: a 288 px system rail left — the verdict, one row per gauge of the system page and four smaller tiles, each a link into `/system` — and the repository mosaic right, one card per repository in the Repositories page's own order (newest activity first, so attention is a tint and never a new position) with the bar strip of its last twelve builds, height for duration and colour for outcome. `HomeViews.kt` derives all of it from `GET /api/repos` (the strip is `RepoOverviewDto.recentBuilds`) and `GET /api/system`; only the sparklines are drawn client-side, by the system page's own `drawSpark` from `GET /api/system/history`. The page does not use `viewHead` — no tabs, no `h1`, no repository line — but it carries the watcher banner, and the footer sits outside its two-column grid so it spans both. `HomeBarView.strip`/`barStrip`, `HomeCardView.toneOf`/`cardTone` and `HomeTexts`/`homeMeta` are twins like every other pair.The home page (`/`, RFC 0003) is the instance's entrance, served with one repository as well as with twelve: a 288 px system rail left — the verdict, one row per gauge of the system page and four smaller tiles, each a link into `/system` — and the repository mosaic right, one card per repository in the Repositories page's own order (newest activity first, so attention is a tint and never a new position) with the bar strip of its last twelve builds, height for duration and colour for outcome. `HomeViews.kt` derives all of it from `GET /api/repos` (the strip is `RepoOverviewDto.recentBuilds`) and `GET /api/system`; only the sparklines are drawn client-side, by the system page's own `drawSpark` from `GET /api/system/history`. Above the mosaic stands the Builds panel (PR#160): across all repositories the running builds (longest running first), then the queued ones (longest waiting first), then the failures — failed or timed out, not outdated (PR#156), started within `RECENT_FAILURE_WINDOW`, of a name that is not running or queued again — newest first, at most `BuildActivity.LIMIT` (5). `BuildActivity` derives them on read from each repository's history and redacts a private repository's like `RepoOverviews`; `GET /api/activity` serves them, and a tile leads to the Current Builds view while the build runs or waits, to the build page once it failed. `HomeBuildView.toneOf`/`buildTone` and the tile markup of `home.html`/`renderHomeBuild` are twins; a tile carries the ticker's data attributes, so its time counts on between polls. Five tiles fit one row on a desktop screen because every page is up to 1440 px wide and a tile at least 180 px. The page does not use `viewHead` — no tabs, no `h1`, no repository line — but it carries the watcher banner, and the footer sits outside its two-column grid so it spans both. `HomeBarView.strip`/`barStrip`, `HomeCardView.toneOf`/`cardTone` and `HomeTexts`/`homeMeta` are twins like every other pair.Writing rule: more than one sentence on a line (werkrevisor writing rule)
Fix the line, or reply why it stays, and resolve this comment.
Writing rule: line longer than 400 characters (1958) (werkrevisor writing rule)
Fix the line, or reply why it stays, and resolve this comment.
Fixed: the Builds panel's paragraph stands apart from the long line now, one sentence per line; line 56 is unchanged against main again.
Fixed: the Builds panel's paragraph stands apart from the long line now, one sentence per line; line 56 is unchanged against main again.
⚠️ werkrevisor ERROR for
?, superseded by the result forbd3323cCodex review: critical
The change adds a public activity endpoint and authorization-dependent redaction of private-repository content. A mistake at this boundary could expose repository names, branches, commits, or pull requests, so human review is required.
No findings.
The merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 430059 (cached 351488) / out 1659, 65.7 s, 14 commands; reviewed head `76ce39ce37c831c1e4e40fbab730a46fcad188c2`.ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.🟡 werkrevisor YELLOW for
bd3323c, superseded by the result forcb53076🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Gate: no human review requested; merge conflict with main: the author rebases the branch onto main and pushes.
Change kind:
mixed.Reasons
Findings
src/test/kotlin/de/hoennig/werkator/server/BuildActivityUnitTest.kt:120-186, hint, as a line commentClassifier
19 of 19 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83769, calls 1, tokens in 80446 / out 21819 (reasoning included in out), duration 348.7 s, cost 0.0503 USD (reported), classifier `jev-1.13.0` calls 19, tokens in 17631, cost 0.0007 USD, finding judge `none` calls 0, tokens in 0, cost 0.0000 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 105267 / out 2336, cost 0.0098 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 31459, cost 0.0013 USD, phases: path_judge 1.1 s, classifier 1.1 s, context 52.3 s, model_review 293.3 s, finding_judge 0.0 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
d17f9bd).Reviewed head `bd3323c740d74dbe1be3d181e9779927e5f9448c` against base `d17f9bd16056c064a4f17ba8ee1f4c49ba87656d`, werkrevisor 0.41.2.
werkrevisor: YELLOW / HUMAN_REVIEW for
bd3323c740d74dbe1be3d181e9779927e5f9448c.The result comment of werkrevisor holds the details.
@@ -0,0 +117,4 @@activity(repo).all(now).map { it.build.artifactKey } shouldBe listOf("feature/again-30")}test("a failure older than seven days has no tile (Scenario#160.06)") {[low] Swapped scenario labels (werkrevisor)
hint
The PR document defines Scenario#160.04 as "A failure older than seven days has no tile!" and Scenario#160.06 as "A visitor sees a private repository's build counted and timed, but not named!". In BuildActivityUnitTest.kt the suffixes on those two tests are swapped: the seven-day-window test name ends with "(Scenario#160.06)" and the private-repository test name ends with "(Scenario#160.04)". The other verifying tests (ReposApiControllerRestTest, UiHomeRestTest) carry the correct Scenario#160.06 suffix. The behaviour the tests verify is correct; the only defect is the inconsistent scenario-number labelling, which contradicts the PR document.
Fixed: the seven-day test names Scenario#160.04, the private-repository test Scenario#160.06.
🟡 werkrevisor: YELLOW / HUMAN_REVIEW
Change kind:
mixed.Reasons
Classifier
19 of 19 units passed all questions (1 PR document(s)).
Usage: model `openrouter/minimax/minimax-m3`, LLM done, tokens counted before the call 83588, calls 1, tokens in 80284 / out 12229 (reasoning included in out), duration 233.5 s, cost 0.0387 USD (reported), classifier `jev-1.13.0` calls 19, tokens in 17631, cost 0.0007 USD, excerpt selection `openrouter/openai/gpt-6-luna` calls 9, tokens in 105363 / out 2309, cost 0.0064 USD (reported), build file judge `jev-1.13.0` calls 17, tokens in 31458, cost 0.0013 USD, phases: path_judge 1.2 s, classifier 1.1 s, context 49.3 s, model_review 181.2 s, config: defaults + host + repository (.werkrevisor.toml at main1 answer ignored because of a confidence below [classifier] min_confidence.
d17f9bd).Reviewed head `cb53076758d0a3410c4e8ff521126e5827a243ab` against base `d17f9bd16056c064a4f17ba8ee1f4c49ba87656d`, werkrevisor 0.41.2.
Codex review: critical
The change adds a public activity endpoint and extends control-token-dependent redaction of private repository content. A mistake at this authorization boundary could expose private repository names, branches or commits, so human review is required.
No findings.
The merge waits for the status
Model `gpt-6-astra`, effort high, tokens in 315363 (cached 272640) / out 1358, 54.3 s, 9 commands; reviewed head `cb53076758d0a3410c4e8ff521126e5827a243ab`.ai-review/codex: every line comment resolved, and the approval of a human for a critical PR or for a finding that is only here.