int-upload #1

Merged
Jriyuu merged 26 commits from int-upload into main 2026-11-02 13:08:37 +11:00
Owner
No description provided.
Upload files to ".forgejo/workflows"
Some checks failed
checks / lint (pull_request) Failing after 21s
pr-review / ai-review (pull_request) Successful in 14m17s
pr-review / skill-scan (pull_request) Successful in 5s
1add2d259f

🤖 AI review for 62bcfc2a

Advisory only - this never blocks the merge. You decide.

Review output
[ocr] 19 file(s) changed, reviewing 15 in /workspace/jriyuu-labs/craft-workbench
[ocr] Skipping CHANGELOG.md — filtered by path/extension rules
[ocr] Skipping README.md — filtered by path/extension rules
[ocr] Skipping src/job_instructions.md — filtered by path/extension rules
[ocr] Skipping src/requirements.txt — filtered by path/extension rules
[ocr] Filtered 4 file(s) by include/exclude rules
[ocr] Plan completed for group "tests/mock_litellm.py"
[ocr]   ▶ code_search file_patterns=[['*']] search_text=mock_litellm
[ocr]   ✔ code_search (12ms)
[ocr]   ▶ code_search file_patterns=[['src/']] search_text=litellm|base_url
[ocr]   ✔ code_search (9ms)
[ocr]   ▶ code_search search_text=mock_litellm
[ocr]   ✔ code_search (11ms)
[ocr]   ▶ code_search search_text=litellm
[ocr]   ✔ code_search (11ms)
[ocr]   ▶ file_read end_line=230 file_path=README.md start_line=185
[ocr]   ✔ file_read (3ms)
[ocr]   ▶ file_find query_name=tests/
[ocr]   ✔ file_find (4ms)
[ocr]   ▶ file_read end_line=60 file_path=src/entrypoint.sh start_line=1
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ file_read end_line=60 file_path=src/labs.example.yaml start_line=1
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ file_read file_path=src/workbench/server.py start_line=170 end_line=215
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ code_comment
[ocr]   ✔ code_comment (0s)
[ocr]   ▶ code_search search_text=mock_litellm
[ocr]   ✔ code_search (56ms)
[ocr]   ▶ code_search search_text=litellm
[ocr]   ✔ code_search (9ms)
[ocr]   ▶ code_search search_text=base_url
[ocr]   ✔ code_search (9ms)
[ocr]   ▶ file_read end_line=230 file_path=README.md start_line=190
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ file_read end_line=105 file_path=src/workbench/guard.py start_line=1
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ code_search search_text=UNSAFE_ALLOW_LOCAL
[ocr]   ✔ code_search (10ms)
[ocr]   ▶ code_search file_patterns=[src/workbench/server.py] search_text=Guard
[ocr]   ✔ code_search (10ms)
[ocr]   ▶ code_search search_text=api_token file_patterns=[src/workbench/server.py]
[ocr]   ✔ code_search (11ms)
[ocr]   ▶ file_read file_path=src/workbench/server.py start_line=540 end_line=600
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ file_read start_line=1 end_line=43 file_path=src/labs.example.yaml
[ocr]   ✔ file_read (5ms)
[ocr] Plan completed for group ".forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh"
[ocr]   ▶ file_find query_name=requirements
[ocr]   ✔ file_find (5ms)
[ocr]   ▶ code_search file_patterns=[['src/workbench/setup.py']] search_text=print\( use_perl_regexp=true
[ocr]   ✔ code_search (9ms)
[ocr]   ▶ file_read_diff path_array=[src/workbench/__main__.py]
[ocr]   ✔ file_read_diff (0s)
[ocr]   ▶ file_read file_path=src/requirements.txt
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ file_read file_path=src/workbench/setup.py
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ code_search use_perl_regexp=true
[ocr]   ✔ code_search (11ms)
[ocr]   ▶ code_comment
[ocr]   ✔ code_comment (0s)
[ocr]   ▶ file_read file_path=src/workbench/config.py
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ file_read file_path=src/workbench/server.py start_line=150 end_line=280
[ocr]   ✔ file_read (5ms)
[ocr]   ▶ file_find query_name=test
[ocr]   ✔ file_find (9ms)
[ocr]   ▶ file_read end_line=80 file_path=src/workbench/server.py start_line=1
[ocr]   ✔ file_read (4ms)
[ocr]   ▶ file_find query_name=job_instructions
[ocr]   ✔ file_find (4ms)
[ocr]   ▶ code_comment
[ocr]   ✔ code_comment (0s)
[ocr] No tool calls parsed for .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh, retrying...
[ocr] Round 2 failed for group ".forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh": LLM completion error: POST "https://ai.jriyuu.io/v1/chat/completions": 400 Bad Request {"message":"litellm.BadRequestError: OpenAIException - Invalid request parameters. Please check your input and try again.\n\nLiteLLM: model group 'ci-reviewer' failed with the error above and no fallback model group was found for it, so the request was not retried on another model. Fallbacks are configured for: qwen3.8-27b, qwen3.8-27b-fast, reverse-engineer-core. Add a fallbacks entry for that model group (Router fallbacks or proxy router_settings.fallbacks) to retry on another model.","type":"invalid_request_error","param":"messages[1].content","code":"400"} (keeping earlier findings)
[ocr] Plan phase failed for group "src/labs.example.yaml,src/workbench/__init__.py,src/workbench/__main__.py,src/workbench/config.py,src/workbench/guard.py,src/workbench/server.py,src/workbench/setup.py": plan request: POST "https://ai.jriyuu.io/v1/chat/completions": 504 Gateway Timeout : <html>
<head><title>504 Gateway Time-out</title></head>
<body>
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx</center>
</body>
</html> (continuing without plan)
[ocr] No tool calls parsed for src/labs.example.yaml,src/workbench/__init__.py,src/workbench/__main__.py,src/workbench/config.py,src/workbench/guard.py,src/workbench/server.py,src/workbench/setup.py, retrying...
[ocr] Subtask error for group "workbench Python application & config": LLM completion error: caller deadline exceeded: context deadline exceeded
[ocr] Summary: 15 file(s) reviewed, 4 comment(s), ~486877 token(s) used (input: ~356269, output: ~130608), cache(read: ~220608, write: ~0), 30m13s elapsed
[ocr] Session: e7057185-0384-48d2-8df5-305d23179907
Review partially complete: 4 finding(s); 7 of 15 selected item(s) failed.

─── tests/mock_litellm.py:138-139 ───
[maintainability · low] The CLI args are consumed positionally with no validation: running `python3
tests/mock_litellm.py` with no args crashes with a raw `IndexError` traceback from
`int(sys.argv[1])` instead of the usage message the docstring already provides, and `LOG_PATH` is
bound from `sys.argv` at module import time, coupling the module to the process argv even when it's
only imported. Cheap fix: check argc once in the `__main__` block and print the usage.

  if __name__ == "__main__":
+     if not 2 <= len(sys.argv) <= 3:
+         sys.exit("usage: python3 tests/mock_litellm.py <port> <request-log-file>")
      ThreadingHTTPServer(("127.0.0.1", int(sys.argv[1])), Handler).serve_forever()


─── tests/mock_litellm.py:44-45 ───
[bug · low] A request body that parses as valid JSON but isn't an object (e.g. `null`, `[]`, or a
bare string) slips past this `except`: `body.get('model')` then raises `AttributeError`, which isn't
in the caught tuple, so the handler thread dies in socketserver's handle_error and the client gets a
dropped connection instead of the 400 this block is meant to produce for malformed input.
Normalizing the shape inside the try (e.g. `if not isinstance(body, dict): raise ValueError("request
body must be a JSON object")`) routes it through the existing 400 path.

              body = json.loads(self.rfile.read(int(self.headers.get("content-length", 0))))
+             if not isinstance(body, dict):
+                 raise ValueError("request body must be a JSON object")
              auth = self.headers.get("authorization") or self.headers.get("x-api-key")


─── src/entrypoint.sh:32-35 ───
[bug · low] The condition doesn't match the comment: docker stop is handled by the TERM/INT trap
above (`wait -n` is interruptible, so the trap runs and exits 0 before this line is reached). Signal
numbers 129-255 observed at `wait -n` actually mean a lab server itself was killed by a signal —
e.g. OOM-kill (137, plausible given one 4G Ghidra heap per running job under a 20g limit) or
segfault (139) — and that case is silently swallowed here: no "a lab server exited" line, no
diagnostic before the automatic restart. Consider logging it (and exiting 1 so restart policies like
on-failure still restart):

  if [ "$rc" -gt 128 ]; then
-   # A stop signal interrupted the wait (docker stop): the trap already shut down cleanly.
-   exit 0
+   # A lab server died from a signal (e.g. OOM-killed 137, segfault 139); the TERM/INT
+   # trap already handles docker stop, so anything seen here is a crash worth a log line.
+   echo "craft-workbench: a lab server died from a signal (rc=$rc); stopping"
+   kill "${pids[@]}" 2>/dev/null || true
+   wait
+   exit 1
  fi


─── src/entrypoint.sh:21-25 ───
[test · low] The bootstrap enforces an unmachined contract between three sides: setup must print
exactly "<lab> <port>" to stdout (stderr must carry the logs), serve must run as `python -m
workbench serve <lab>` with the lab name as the sole positional arg, and the image HEALTHCHECK must
match the child cmdline via pgrep -f "[w]orkbench serve". It all holds today, but a format or argv
drift fails silently — zero job APIs, container stays up, only symptom is pgrep going unhealthy.
Nothing in the repo (only tests/mock_litellm.py was added) exercises this layer; a smoke test
running setup/serve with WORKBENCH_* overrides pointed at temp dirs would lock the stdout format,
the module invocation form and the healthcheck pattern together.

- while read -r lab _port; do
-   [ -n "$lab" ] || continue
-   "$PY" -m workbench serve "$lab" &
-   pids+=("$!")
- done <<< "$labs"
+ # e.g. a smoke test that asserts, for a temp labs.yaml reached via WORKBENCH_* env:
+ #   setup output lines match '^[a-z][a-z0-9-]* [0-9]+$'   (this loop's parse assumptions)
+ #   a spawned `python -m workbench serve <name>` cmdline matches pgrep -f "[w]orkbench serve"
+ #   `python -m workbench serve` with no arg / unknown arg exits non-zero

[ocr] WARNING [review_round_failed] .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh: round 2: LLM completion error: POST "https://ai.jriyuu.io/v1/chat/completions": 400 Bad Request {"message":"litellm.BadRequestError: OpenAIException - Invalid request parameters. Please check your input and try again.\n\nLiteLLM: model group 'ci-reviewer' failed with the error above and no fallback model group was found for it, so the request was not retried on another model. Fallbacks are configured for: qwen3.8-27b, qwen3.8-27b-fast, reverse-engineer-core. Add a fallbacks entry for that model group (Router fallbacks or proxy router_settings.fallbacks) to retry on another model.","type":"invalid_request_error","param":"messages[1].content","code":"400"}

LLM retry report summary: 5 of 30 requests affected -- 3 requests failed, 2 requests recovered after retry

Review planning (2 requests):
- src/labs.example.yaml,src/workbench/__init__.py,src/workbench/__main__.py,src/workbench/config.py,src/workbench/guard.py,src/workbench/server.py,src/workbench/setup.py: timed out (HTTP 504) -> timed out (HTTP 504) -> timed out (HTTP 504) -> timed out (HTTP 504) -> timed out (HTTP 504) -> timed out (HTTP 504) -> failed
- .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh: timed out (HTTP 504) -> succeeded

Core review (3 requests):
- .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh: rejected by provider (HTTP 400) -> failed
- src/labs.example.yaml,src/workbench/__init__.py,src/workbench/__main__.py,src/workbench/config.py,src/workbench/guard.py,src/workbench/server.py,src/workbench/setup.py: timed out -> failed
- .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh: timed out (HTTP 504) -> succeeded

Per-attempt detail: --format json (retry_report).

Open Code Review via ci-actions · model ci-reviewer · job log

<!-- ci-actions:open-code-review --> ### 🤖 AI review for `62bcfc2a` Advisory only - this never blocks the merge. You decide. <details open><summary>Review output</summary> ```text [ocr] 19 file(s) changed, reviewing 15 in /workspace/jriyuu-labs/craft-workbench [ocr] Skipping CHANGELOG.md — filtered by path/extension rules [ocr] Skipping README.md — filtered by path/extension rules [ocr] Skipping src/job_instructions.md — filtered by path/extension rules [ocr] Skipping src/requirements.txt — filtered by path/extension rules [ocr] Filtered 4 file(s) by include/exclude rules [ocr] Plan completed for group "tests/mock_litellm.py" [ocr] ▶ code_search file_patterns=[['*']] search_text=mock_litellm [ocr] ✔ code_search (12ms) [ocr] ▶ code_search file_patterns=[['src/']] search_text=litellm|base_url [ocr] ✔ code_search (9ms) [ocr] ▶ code_search search_text=mock_litellm [ocr] ✔ code_search (11ms) [ocr] ▶ code_search search_text=litellm [ocr] ✔ code_search (11ms) [ocr] ▶ file_read end_line=230 file_path=README.md start_line=185 [ocr] ✔ file_read (3ms) [ocr] ▶ file_find query_name=tests/ [ocr] ✔ file_find (4ms) [ocr] ▶ file_read end_line=60 file_path=src/entrypoint.sh start_line=1 [ocr] ✔ file_read (5ms) [ocr] ▶ file_read end_line=60 file_path=src/labs.example.yaml start_line=1 [ocr] ✔ file_read (5ms) [ocr] ▶ file_read file_path=src/workbench/server.py start_line=170 end_line=215 [ocr] ✔ file_read (5ms) [ocr] ▶ code_comment [ocr] ✔ code_comment (0s) [ocr] ▶ code_search search_text=mock_litellm [ocr] ✔ code_search (56ms) [ocr] ▶ code_search search_text=litellm [ocr] ✔ code_search (9ms) [ocr] ▶ code_search search_text=base_url [ocr] ✔ code_search (9ms) [ocr] ▶ file_read end_line=230 file_path=README.md start_line=190 [ocr] ✔ file_read (5ms) [ocr] ▶ file_read end_line=105 file_path=src/workbench/guard.py start_line=1 [ocr] ✔ file_read (5ms) [ocr] ▶ code_search search_text=UNSAFE_ALLOW_LOCAL [ocr] ✔ code_search (10ms) [ocr] ▶ code_search file_patterns=[src/workbench/server.py] search_text=Guard [ocr] ✔ code_search (10ms) [ocr] ▶ code_search search_text=api_token file_patterns=[src/workbench/server.py] [ocr] ✔ code_search (11ms) [ocr] ▶ file_read file_path=src/workbench/server.py start_line=540 end_line=600 [ocr] ✔ file_read (5ms) [ocr] ▶ file_read start_line=1 end_line=43 file_path=src/labs.example.yaml [ocr] ✔ file_read (5ms) [ocr] Plan completed for group ".forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh" [ocr] ▶ file_find query_name=requirements [ocr] ✔ file_find (5ms) [ocr] ▶ code_search file_patterns=[['src/workbench/setup.py']] search_text=print\( use_perl_regexp=true [ocr] ✔ code_search (9ms) [ocr] ▶ file_read_diff path_array=[src/workbench/__main__.py] [ocr] ✔ file_read_diff (0s) [ocr] ▶ file_read file_path=src/requirements.txt [ocr] ✔ file_read (5ms) [ocr] ▶ file_read file_path=src/workbench/setup.py [ocr] ✔ file_read (5ms) [ocr] ▶ code_search use_perl_regexp=true [ocr] ✔ code_search (11ms) [ocr] ▶ code_comment [ocr] ✔ code_comment (0s) [ocr] ▶ file_read file_path=src/workbench/config.py [ocr] ✔ file_read (5ms) [ocr] ▶ file_read file_path=src/workbench/server.py start_line=150 end_line=280 [ocr] ✔ file_read (5ms) [ocr] ▶ file_find query_name=test [ocr] ✔ file_find (9ms) [ocr] ▶ file_read end_line=80 file_path=src/workbench/server.py start_line=1 [ocr] ✔ file_read (4ms) [ocr] ▶ file_find query_name=job_instructions [ocr] ✔ file_find (4ms) [ocr] ▶ code_comment [ocr] ✔ code_comment (0s) [ocr] No tool calls parsed for .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh, retrying... [ocr] Round 2 failed for group ".forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh": LLM completion error: POST "https://ai.jriyuu.io/v1/chat/completions": 400 Bad Request {"message":"litellm.BadRequestError: OpenAIException - Invalid request parameters. Please check your input and try again.\n\nLiteLLM: model group 'ci-reviewer' failed with the error above and no fallback model group was found for it, so the request was not retried on another model. Fallbacks are configured for: qwen3.8-27b, qwen3.8-27b-fast, reverse-engineer-core. Add a fallbacks entry for that model group (Router fallbacks or proxy router_settings.fallbacks) to retry on another model.","type":"invalid_request_error","param":"messages[1].content","code":"400"} (keeping earlier findings) [ocr] Plan phase failed for group "src/labs.example.yaml,src/workbench/__init__.py,src/workbench/__main__.py,src/workbench/config.py,src/workbench/guard.py,src/workbench/server.py,src/workbench/setup.py": plan request: POST "https://ai.jriyuu.io/v1/chat/completions": 504 Gateway Timeout : <html> <head><title>504 Gateway Time-out</title></head> <body> <center><h1>504 Gateway Time-out</h1></center> <hr><center>nginx</center> </body> </html> (continuing without plan) [ocr] No tool calls parsed for src/labs.example.yaml,src/workbench/__init__.py,src/workbench/__main__.py,src/workbench/config.py,src/workbench/guard.py,src/workbench/server.py,src/workbench/setup.py, retrying... [ocr] Subtask error for group "workbench Python application & config": LLM completion error: caller deadline exceeded: context deadline exceeded [ocr] Summary: 15 file(s) reviewed, 4 comment(s), ~486877 token(s) used (input: ~356269, output: ~130608), cache(read: ~220608, write: ~0), 30m13s elapsed [ocr] Session: e7057185-0384-48d2-8df5-305d23179907 Review partially complete: 4 finding(s); 7 of 15 selected item(s) failed. ─── tests/mock_litellm.py:138-139 ─── [maintainability · low] The CLI args are consumed positionally with no validation: running `python3 tests/mock_litellm.py` with no args crashes with a raw `IndexError` traceback from `int(sys.argv[1])` instead of the usage message the docstring already provides, and `LOG_PATH` is bound from `sys.argv` at module import time, coupling the module to the process argv even when it's only imported. Cheap fix: check argc once in the `__main__` block and print the usage. if __name__ == "__main__": + if not 2 <= len(sys.argv) <= 3: + sys.exit("usage: python3 tests/mock_litellm.py <port> <request-log-file>") ThreadingHTTPServer(("127.0.0.1", int(sys.argv[1])), Handler).serve_forever() ─── tests/mock_litellm.py:44-45 ─── [bug · low] A request body that parses as valid JSON but isn't an object (e.g. `null`, `[]`, or a bare string) slips past this `except`: `body.get('model')` then raises `AttributeError`, which isn't in the caught tuple, so the handler thread dies in socketserver's handle_error and the client gets a dropped connection instead of the 400 this block is meant to produce for malformed input. Normalizing the shape inside the try (e.g. `if not isinstance(body, dict): raise ValueError("request body must be a JSON object")`) routes it through the existing 400 path. body = json.loads(self.rfile.read(int(self.headers.get("content-length", 0)))) + if not isinstance(body, dict): + raise ValueError("request body must be a JSON object") auth = self.headers.get("authorization") or self.headers.get("x-api-key") ─── src/entrypoint.sh:32-35 ─── [bug · low] The condition doesn't match the comment: docker stop is handled by the TERM/INT trap above (`wait -n` is interruptible, so the trap runs and exits 0 before this line is reached). Signal numbers 129-255 observed at `wait -n` actually mean a lab server itself was killed by a signal — e.g. OOM-kill (137, plausible given one 4G Ghidra heap per running job under a 20g limit) or segfault (139) — and that case is silently swallowed here: no "a lab server exited" line, no diagnostic before the automatic restart. Consider logging it (and exiting 1 so restart policies like on-failure still restart): if [ "$rc" -gt 128 ]; then - # A stop signal interrupted the wait (docker stop): the trap already shut down cleanly. - exit 0 + # A lab server died from a signal (e.g. OOM-killed 137, segfault 139); the TERM/INT + # trap already handles docker stop, so anything seen here is a crash worth a log line. + echo "craft-workbench: a lab server died from a signal (rc=$rc); stopping" + kill "${pids[@]}" 2>/dev/null || true + wait + exit 1 fi ─── src/entrypoint.sh:21-25 ─── [test · low] The bootstrap enforces an unmachined contract between three sides: setup must print exactly "<lab> <port>" to stdout (stderr must carry the logs), serve must run as `python -m workbench serve <lab>` with the lab name as the sole positional arg, and the image HEALTHCHECK must match the child cmdline via pgrep -f "[w]orkbench serve". It all holds today, but a format or argv drift fails silently — zero job APIs, container stays up, only symptom is pgrep going unhealthy. Nothing in the repo (only tests/mock_litellm.py was added) exercises this layer; a smoke test running setup/serve with WORKBENCH_* overrides pointed at temp dirs would lock the stdout format, the module invocation form and the healthcheck pattern together. - while read -r lab _port; do - [ -n "$lab" ] || continue - "$PY" -m workbench serve "$lab" & - pids+=("$!") - done <<< "$labs" + # e.g. a smoke test that asserts, for a temp labs.yaml reached via WORKBENCH_* env: + # setup output lines match '^[a-z][a-z0-9-]* [0-9]+$' (this loop's parse assumptions) + # a spawned `python -m workbench serve <name>` cmdline matches pgrep -f "[w]orkbench serve" + # `python -m workbench serve` with no arg / unknown arg exits non-zero [ocr] WARNING [review_round_failed] .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh: round 2: LLM completion error: POST "https://ai.jriyuu.io/v1/chat/completions": 400 Bad Request {"message":"litellm.BadRequestError: OpenAIException - Invalid request parameters. Please check your input and try again.\n\nLiteLLM: model group 'ci-reviewer' failed with the error above and no fallback model group was found for it, so the request was not retried on another model. Fallbacks are configured for: qwen3.8-27b, qwen3.8-27b-fast, reverse-engineer-core. Add a fallbacks entry for that model group (Router fallbacks or proxy router_settings.fallbacks) to retry on another model.","type":"invalid_request_error","param":"messages[1].content","code":"400"} LLM retry report summary: 5 of 30 requests affected -- 3 requests failed, 2 requests recovered after retry Review planning (2 requests): - src/labs.example.yaml,src/workbench/__init__.py,src/workbench/__main__.py,src/workbench/config.py,src/workbench/guard.py,src/workbench/server.py,src/workbench/setup.py: timed out (HTTP 504) -> timed out (HTTP 504) -> timed out (HTTP 504) -> timed out (HTTP 504) -> timed out (HTTP 504) -> timed out (HTTP 504) -> failed - .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh: timed out (HTTP 504) -> succeeded Core review (3 requests): - .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh: rejected by provider (HTTP 400) -> failed - src/labs.example.yaml,src/workbench/__init__.py,src/workbench/__main__.py,src/workbench/config.py,src/workbench/guard.py,src/workbench/server.py,src/workbench/setup.py: timed out -> failed - .forgejo/workflows/build.yml,docker/Dockerfile,docker/compose.yaml,docker/craft-workbench.xml,src/bin/ca,src/bin/chromium,src/entrypoint.sh: timed out (HTTP 504) -> succeeded Per-attempt detail: --format json (retry_report). ``` </details> <sub>Open Code Review via ci-actions · model `ci-reviewer` · [job log](https://nidavellir.jriyuu.io/jriyuu-labs/craft-workbench/actions/runs/40)</sub>
Upload files to "src/workbench"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
92e1aa4728
Upload files to "src"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
9a72500887
Upload files to "tests"
Some checks failed
checks / lint (pull_request) Failing after 24s
pr-review / skill-scan (pull_request) Has been cancelled
pr-review / ai-review (pull_request) Has been cancelled
28a489d081
Upload files to "docker"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
970d92ee9c
Upload files to "src/workbench"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
af159c77db
Upload files to "tests"
All checks were successful
checks / lint (pull_request) Successful in 18s
pr-review / ai-review (pull_request) Successful in 30m26s
pr-review / skill-scan (pull_request) Successful in 5s
a99fee0e6c
Upload files to "src/workbench"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
09100f543b
Upload files to "src/bin"
Some checks failed
checks / lint (pull_request) Successful in 19s
pr-review / skill-scan (pull_request) Has been cancelled
pr-review / ai-review (pull_request) Has been cancelled
847f5cdd12
Upload files to "src"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
c2a9adafab
Upload files to "docker"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
209cf50b8f
Upload files to "/"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
595bd17df0
Upload files to ".forgejo/workflows"
All checks were successful
checks / lint (pull_request) Successful in 19s
pr-review / ai-review (pull_request) Successful in 23m36s
pr-review / skill-scan (pull_request) Successful in 4s
84ba04de94
Upload files to "tests"
Some checks failed
checks / lint (pull_request) Successful in 20s
pr-review / skill-scan (pull_request) Has been cancelled
pr-review / ai-review (pull_request) Has been cancelled
afed4540ed
Upload files to "src/workbench"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
ba438773df
Upload files to "src"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
6518f1f65c
Upload files to "docker"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
d7455b8257
Upload files to "/"
Some checks failed
pr-review / ai-review (pull_request) Has been cancelled
pr-review / skill-scan (pull_request) Has been cancelled
checks / lint (pull_request) Has been cancelled
331ad6ee3e
Upload files to ".forgejo/workflows"
All checks were successful
pr-review / ai-review (pull_request) Successful in 30m35s
pr-review / skill-scan (pull_request) Successful in 4s
checks / lint (pull_request) Successful in 19s
9ba0d29be8
Upload files to "src/workbench"
All checks were successful
pr-review / ai-review (pull_request) Successful in 30m26s
checks / lint (pull_request) Successful in 20s
pr-review / skill-scan (pull_request) Successful in 4s
62bcfc2a6b
Jriyuu merged commit 01f33e200a into main 2026-11-02 13:08:37 +11:00
Jriyuu deleted branch int-upload 2026-11-02 13:08:43 +11:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jriyuu-labs/craft-workbench!1
No description provided.