Follow-up to the update-audit pipeline. The first smoke run (#986) went green but created no issue — the post step used jq | curl -sf | jq, so the pipe's exit status came from the trailing jq and a failed POST was swallowed.
Change
Rewrite the post step to capture each write's HTTP status via -w '%{http_code}', print it, and fail the step on any non-2xx (dumping the Gitea error body). Payloads are written to files instead of piped through the masking pipeline.
What it revealed
With the fix, run #987 failed loudly with the real cause:
POST .../issues -> HTTP 403
{"message":"token does not have at least one of required scope(s): [write:issue]"}
The agent itself works and produces the report; security_bot_token is scoped for code/PRs but lacks write:issue.
Required before this can post (separate, manual)
Grant write:issue to security_bot_token (Gitea PATs are immutable — recreate the bot token with its existing repo/PR scopes plusissue, then update the security_bot_token Woodpecker secret). No pipeline change needed once the token has the scope.
Follow-up to the update-audit pipeline. The first smoke run (#986) went **green but created no issue** — the post step used `jq | curl -sf | jq`, so the pipe's exit status came from the trailing `jq` and a failed POST was swallowed.
## Change
Rewrite the post step to capture each write's HTTP status via `-w '%{http_code}'`, print it, and **fail the step on any non-2xx** (dumping the Gitea error body). Payloads are written to files instead of piped through the masking pipeline.
## What it revealed
With the fix, run #987 failed loudly with the real cause:
```
POST .../issues -> HTTP 403
{"message":"token does not have at least one of required scope(s): [write:issue]"}
```
The agent itself works and produces the report; `security_bot_token` is scoped for code/PRs but lacks `write:issue`.
## Required before this can post (separate, manual)
Grant `write:issue` to `security_bot_token` (Gitea PATs are immutable — recreate the bot token with its existing repo/PR scopes **plus** `issue`, then update the `security_bot_token` Woodpecker secret). No pipeline change needed once the token has the scope.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The first smoke run went green but created no issue: the post step used
`jq | curl -sf | jq`, so the pipe's exit status came from the trailing jq
and a failed POST was swallowed.
Rewrite the post step to capture each write's HTTP status explicitly via
`-w '%{http_code}'`, print it, and fail the step on any non-2xx (dumping the
Gitea error body). Payloads are written to files instead of piped.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
Follow-up to the update-audit pipeline. The first smoke run (#986) went green but created no issue — the post step used
jq | curl -sf | jq, so the pipe's exit status came from the trailingjqand a failed POST was swallowed.Change
Rewrite the post step to capture each write's HTTP status via
-w '%{http_code}', print it, and fail the step on any non-2xx (dumping the Gitea error body). Payloads are written to files instead of piped through the masking pipeline.What it revealed
With the fix, run #987 failed loudly with the real cause:
The agent itself works and produces the report;
security_bot_tokenis scoped for code/PRs but lackswrite:issue.Required before this can post (separate, manual)
Grant
write:issuetosecurity_bot_token(Gitea PATs are immutable — recreate the bot token with its existing repo/PR scopes plusissue, then update thesecurity_bot_tokenWoodpecker secret). No pipeline change needed once the token has the scope.🤖 Generated with Claude Code
The first smoke run went green but created no issue: the post step used `jq | curl -sf | jq`, so the pipe's exit status came from the trailing jq and a failed POST was swallowed. Rewrite the post step to capture each write's HTTP status explicitly via `-w '%{http_code}'`, print it, and fail the step on any non-2xx (dumping the Gitea error body). Payloads are written to files instead of piped. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>