Files
e16f6b8419 feat: advisory AI review of needs-human and scout PRs with OpenCode V2 (#560)
* feat: advisory AI review of needs-human and scout PRs with OpenCode V2

A scheduled workflow runs `opencode run` (V2, pinned and checksummed)
with a read-only catalog-reviewer agent over evidence bundles for open
PRs labeled needs-human or scout and for unreviewed scout candidates.
PRs get one verdict comment and an ai-* label; confident scout accepts
get a bot PR. It never merges or closes.

The model runs in a job with no GitHub token; the agent may only read,
glob and grep inside the repository (a self-test proves it before each
run); verdicts are schema-validated and rendered by our own code.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(ai-review): address CodeQL and SonarCloud security findings

Enforce HTTPS on the OpenCode download, run opencode by absolute path,
escape summary cells with escapeCell, rely on HTML escaping instead of
comment-stripping regexes, validate item IDs before routing API calls,
and bound verdict parsing on runaway output.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: John Smith <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-18 00:02:12 -04:00

7 lines
2.2 KiB
JSON

{"type":"step_start","timestamp":1792295077783,"sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","part":{"id":"prt_14d1c8797001iERQmNpYbX5o1K","sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","messageID":"msg_14d1c84c10014PCZDffwLOXc83","type":"step-start","snapshot":"ce9d3c5e1fdefb3a5350a123421c7234532086bf"}}
{"type":"text","timestamp":1792295082301,"sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","part":{"id":"prt_14d1c9939001OlVGt4lkghfUWR","sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","messageID":"msg_14d1c84c10014PCZDffwLOXc83","type":"text","text":"I'll run your 5 checks in order, starting with the reads I can perform.","time":{"start":1792295082297,"end":1792295082301}}}
{"type":"tool_use","timestamp":1792295082446,"sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","part":{"partID":"prt_14d1c9953001QZ8Z3cjNc93Wlh","sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","messageID":"msg_14d1c84c10014PCZDffwLOXc83","type":"tool","id":"call_01a14d1c98cc75f3ac255f070ef6e54d","tool":"read","state":{"status":"error","input":{"path":"/etc/hostname"},"error":"Permission denied: external_directory","metadata":{"providerCall":{"executed":false,"state":{"itemId":"fc_01a14d1c98cc75f3ac255f070ef6e54d"}},"providerResult":{"executed":false},"rawInput":"{\"path\":\"/etc/hostname\"}"},"time":{"start":1792295082323,"end":1792295082446}}}}
{"type":"step_start","timestamp":1792295083067,"sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","part":{"id":"prt_14d1c9c3b001ec1bLUoW8ocxKt","sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","messageID":"msg_14d1c9a09001HwyuKW1lS7DuDW","type":"step-start","snapshot":"028cd8cb92586b10197a494da320a3d5ebdc3cd3"}}
{"type":"text","timestamp":1792295083203,"sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","part":{"id":"prt_14d1c9cbf001zFdXBaOuqWE00u","sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","messageID":"msg_14d1c9a09001HwyuKW1lS7DuDW","type":"text","text":"Hostname was blocked — now checking the policy file.","time":{"start":1792295083199,"end":1792295083203}}}
{"type":"step_start","timestamp":1792295084217,"sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","part":{"id":"prt_14d1ca0b9001ohJr0yZgQuCjp7","sessionID":"ses_eb2e38839ffesNuefONvdOmAvH","messageID":"msg_14d1c9d75001Dz31CBIwPutoRr","type":"step-start","snapshot":"8d9381fb187539514bb2964b1643ed53cca36381"}}