Codex agent — after remediation
Codex agent remediation result
- Generated. codex wrote this application during this run, from a prompt. Not written by a human, and not selected for being vulnerable. The prompt and generated code browser are linked below.
- Insecure. REACHABLE found the remediation list — all findings that are not proven noise. See the scan.
- Remediated. REACHABLE handed that remediation list to the same agent. The final scan has 7 open actionable finding(s); 0 resolved against the baseline scan.
Application evidence: generation prompt · workspace contents · code before remediation · fixed code · side-by-side code diff
Model disclosure: the application was written by gpt-5.5 from OpenAI API, pinned for this run and recorded in the run's evidence. The fix was made by the same agent, but through reachctl remediate, which selects the agent and does not pin its model — so the fixing model is whichever that agent's CLI resolved at run time, and is not asserted here.
Scanner provenance
REACHABLE wheel/build and scan timestamps, read from the scanner database rows that produced the page. Actionable counts are repo.db SIGNAL rows under the product ACTIONABLE_SQL filter.
| Scan | REACHABLE version | Timestamp (UTC) | Commit | Status | Actionable |
|---|---|---|---|---|---|
| Baseline | 1.0.0b199 | 2026-09-12 14:17:03 | 48eb92fc | superseded | 7 |
| Baseline | 1.0.0b199 | 2026-09-12 14:21:29 | 48eb92fc | superseded | 8 |
| Baseline | 1.0.0b199 | 2026-09-12 15:19:23 | 48eb92fc | complete | 7 |
Run estimate
Token estimates are recorded before the run starts. The remediation estimate is recalculated after REACHABLE has the scan database and knows how many findings are in scope.
| Planned runtime | 21-110 minutes |
|---|---|
| Planned model tokens | 53000-475000 total |
| Planned input tokens | 28000-280000 |
| Planned output tokens | 25000-195000 |
| Generation budget | 1800s |
| Remediation scope | 7 |
Run 2026-09-12 14:21:45 UTC · status partial after 2 agent fix attempt(s)
Run status: partial after 2 iteration(s).
Initial actionable (repo.db): 7. Resolved (scan delta): 0. Current open (repo.db): 7. Noise (repo.db baseline): 24. INITIAL, OPEN, and RESOLVED come from repo.db actionable counts (product ACTIONABLE_SQL on the baseline and final scans). They are not counted from SARIF, data.json, or remediation-audit row matching. The table below is the per-finding remediation ledger.
Open means still actionable on the final scan in repo.db. That can mean the iteration budget ended, the agent did not make the right change, or the finding needs a non-source/package/build change that the agent could not safely complete in this lane. Per-finding ledger rows below may still disagree with this scan total when matching is incomplete; the cards follow the database.
Generated workspace contents
The agent generated these files in the repository before scan. They are scanned and published as evidence. Dependency installs, build outputs, and compiled binaries can explain why one agent has more package or binary findings than another.
Workspace observations: binary_artifact: 12, build_directory: 1735, compiled_artifact: 9, extensionless_executable: 12. Open the full JSON.
| Largest generated file | Bytes |
|---|---|
| portal/node_modules/esbuild/bin/esbuild | 11427952 |
| portal/node_modules/@esbuild/linux-x64/bin/esbuild | 11427952 |
| portal/node_modules/.bin/esbuild | 11427952 |
| portal/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c | 9234104 |
| portal/node_modules/typescript/lib/typescript.js | 9112572 |
Remediation scope — 7 finding(s)
repo.db actionable count on the baseline scan. Table lists 7 ledger/validation row(s) as per-finding evidence.
| Order | Outcome | Severity | Type | Finding | File |
|---|---|---|---|---|---|
| 1 | Not fixed | CRITICAL | CWE | User-controlled path joined into filesystem path - path traversal risk | portal/src/server.ts:116 |
| 2 | Not fixed | CRITICAL | CWE | Flask route sends a non-literal file path — path traversal risk | docs-worker/app.py:126 |
| 3 | Not fixed | HIGH | CWE | SQL query with f-string interpolation — SQL injection risk | docs-worker/app.py:139 |
| 4 | Not fixed | HIGH | CWE | SQL query built with string concatenation — use PreparedStatement with parameterized queries instead. | risk-api/src/main/java/com/sthenos/treasury/RiskApi.java:184 |
| 5 | Not fixed | MEDIUM | CWE | File read on a path built from external input without resolving symlinks and validating the result stays inside the expected directory — CWE-59 symlink following. An attacker who controls the director | docs-worker/app.py:140 |
| 6 | Not fixed | LOW | CONFIG | Found an HTTP server without TLS. Use 'http.ListenAndServeTLS' instead. See https://golang.org/pkg/net/http/#ListenAndServeTLS for more information. | payments-api/main.go:51 |
| 7 | Not fixed | LOW | CVE | GHSA-68rp-wp8r-4726 | docs-worker/app.py:89 |
This is the remediation list REACHABLE handed to the agent, collapsed to each finding's final recorded outcome. The noise list below is excluded only when REACHABLE has explicit non-production or unreachable evidence.
The code the agent wrote
The staged patch, exactly as committed.
The agent changed no files. The diff was produced and is empty, so this is a measured outcome and is published as such.
Noise — 22 finding(s)
All 22 are excluded for one reason: the application never reaches the vulnerable code. These are real advisories against real dependencies — not filtered out as test or scaffolding files. They are excluded from the remediation scope, and listed rather than hidden. 1 of 22 stopped appearing once the in-scope fixes landed, almost always because they shared a root cause with something that was in scope. REACHABLE never asked the agent to touch them and they are not counted as fixed — the point of excluding them is that they did not need fixing. The other 21 are unchanged.
| What happened | Why it is excluded | Severity | Type | Finding | File | |
|---|---|---|---|---|---|---|
| Not fixed | not reachable | HIGH | CVE | GHSA-535w-7cp7-47q4 | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CVE | GHSA-fjgf-rc76-4x9p | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CWE | User-controlled value interpolated into a query string via fmt.Sprintf — potential code injection (CWE-94). The interpolated value may allow arbitrary query commands. Use parameterized queries or stri | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | HIGH | DLP | PII data sent to external HTTP endpoint — data leakage risk. | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | HIGH | CVE | GHSA-wc9g-mqfw-jrwm | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CVE | GHSA-xf7r-hgr6-v32p | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CVE | GHSA-44fp-w29j-9vj5 | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CVE | GHSA-g5hg-p3ph-g8qg | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CVE | GHSA-5528-5vmv-3xc2 | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CWE | SQL query with f-string interpolation — SQL injection risk | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/docs-worker/app.py | |
| Not fixed | not reachable | HIGH | CVE | GHSA-72gw-mp4g-v24j | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CVE | GHSA-v52c-386h-88mc | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | HIGH | CWE | SQL query built with fmt.Sprintf — SQL injection risk | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | HIGH | CVE | GHSA-4pg4-qvpc-4q3h | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Not fixed | not reachable | MEDIUM | CWE | Internal error details written to HTTP response — exposes server internals (table names, paths, stack traces) to clients. Return a generic error message and log the detail server-side. | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | MEDIUM | CWE | Internal error details written to HTTP response — exposes server internals (table names, paths, stack traces) to clients. Return a generic error message and log the detail server-side. | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | MEDIUM | CWE | HTTP response status code is never checked. 4xx/5xx errors and 3xx redirects are silently treated as successful responses, potentially processing error pages as valid data (CWE-391). Add: if resp.Stat | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | MEDIUM | CWE | Internal error details written to HTTP response — exposes server internals (table names, paths, stack traces) to clients. Return a generic error message and log the detail server-side. | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | MEDIUM | CWE | Unbounded read of HTTP response body — DoS via large response. Wrap with io.LimitReader: io.ReadAll(io.LimitReader(resp.Body, maxBytes)) | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | MEDIUM | CWE | Internal error details written to HTTP response — exposes server internals (table names, paths, stack traces) to clients. Return a generic error message and log the detail server-side. | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| Not fixed | not reachable | LOW | CVE | GHSA-qvfw-j98x-7q72 | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| Gone, not attributed | not reachable | INFO | SUSPICIOUS | New dependency not present in prior version (6.15.2): es-define-property | pkg://qs@6.15.3 |
Additional scan context — 9 row(s)
Not remediation scope and not counted as noise. These rows were present in scanner context but were not in the product's actionable validation export for this source-remediation pass, so they are not counted as fixed or open remediation work.
| Why it is not in scope | Severity | Type | Finding | File | |
|---|---|---|---|---|---|
| reachable, marked not actionable | CRITICAL | CWE | User-controlled path joined into filesystem path - path traversal risk | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| reachable, marked not actionable | CRITICAL | CWE | Flask route sends a non-literal file path — path traversal risk | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/docs-worker/app.py | |
| reachability not established | HIGH | CWE | SQL query built with string concatenation — use PreparedStatement with parameterized queries instead. | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/risk-api/src/main/java/com/sthenos/treasury/RiskApi.java | |
| reachable, marked not actionable | HIGH | CWE | SQL query with f-string interpolation — SQL injection risk | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/docs-worker/app.py | |
| reachable, marked not actionable | MEDIUM | CWE | File read on a path built from external input without resolving symlinks and validating the result stays inside the expected directory — CWE-59 symlink following. An attacker who controls the director | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/docs-worker/app.py | |
| reachability not established | MEDIUM | CWE | Express app without helmet - missing security headers | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/portal/src/server.ts | |
| reachable, marked not actionable | LOW | CONFIG | Found an HTTP server without TLS. Use 'http.ListenAndServeTLS' instead. See https://golang.org/pkg/net/http/#ListenAndServeTLS for more information. | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/payments-api/main.go | |
| reachable, marked not actionable | LOW | CVE | GHSA-68rp-wp8r-4726 | agent-remediation/workspace-remediation/20260912-142126/iteration-02/proof-state/scanner-v0/docs-worker/app.py | |
| reachability not established | INFO | SUSPICIOUS | New dependency not present in prior version (10.9.2): picocolors | pkg://jake@10.9.4 |
Remediation Attempt
Started with 7 findings to fix. Iteration 2 fixed 0 issues; 7 issues left. 7 finding(s) still need attention.
7 security finding(s) still remain. Noise and context are listed separately on this page.
| Starting findings | 7 |
|---|---|
| Iterations used | 1 |
| Final open findings | 7 |
| Noise excluded | 0 |
| Context only | 0 |
| Stop condition | Stopped with findings still open. |
Pass-by-pass breakdown
| Pass | Started with | Fixed | Left | Noise excluded | Context | Time | How it ended |
|---|---|---|---|---|---|---|---|
| 2 | 7 | 0 | 7 | 0 | 0 | 67.6s | ran to completion |
| Total | 7 | 0 | 7 | 0 | 0 | 67.6s | none killed |
Iteration 2: fixed 0 issues; 7 issues left
- None
How long it took
Wall clock, read from the scanner's own output and the remediation database timestamps.
| Stage | Seconds |
|---|---|
| Scan (before) | 180.3s |
| Rescan (after) | 169.1s |
| Agent pass 1 (writing the fix) | 14.1s |
| Agent pass 2 (writing the fix) | 14.6s |
| Remediation loop total (2 pass(es), incl. a rescan per pass) | 144.2s |
| Agent time only, all passes | 28.7s |