# Repo pre-scan bundle report

Target: `/workspace/research/agenticjobs` · generated 2026-09-25T21:35:01Z · deterministic line/manifest scans only

**This is a pre-scan, not an audit.** It catches known-bad patterns cheaply; it cannot prove absence of vulnerabilities.

| tool | HIGH | MED | LOW | status |
|---|---|---|---|---|
| secret-prescan | 0 | 4 | 0 | ok |
| dep-prescan | 0 | 0 | 0 | ok |
| ci-prescan | 0 | 4 | 0 | ok |
| docker-prescan | 1 | 0 | 2 | ok |
| crypto-prescan | 11 | 0 | 2 | ok |
| iac-prescan | 0 | 0 | 0 | ok |
| auth-prescan | 0 | 0 | 0 | ok |
| cors-prescan | 0 | 1 | 2 | ok |
| csrf-prescan | 0 | 32 | 2 | ok |
| sqli-prescan | 2 | 4 | 0 | ok |
| nosql-prescan | 0 | 0 | 3 | ok |
| xss-prescan | 1 | 29 | 25 | ok |
| cmdi-prescan | 0 | 2 | 5 | ok |
| path-prescan | 0 | 0 | 3 | ok |
| ssti-prescan | 0 | 0 | 0 | ok |
| redirect-prescan | 0 | 0 | 0 | ok |
| xxe-prescan | 0 | 0 | 0 | ok |
| deser-prescan | 0 | 0 | 0 | ok |
| upload-prescan | 0 | 0 | 0 | ok |
| injection-prescan | 0 | 0 | 2 | ok |
| redos-prescan | 0 | 8 | 22 | ok |
| authz-prescan | 0 | 1 | 41 | ok |
| jwt-prescan | 0 | 0 | 0 | ok |
| oauth-prescan | 0 | 3 | 0 | ok |
| headers-prescan | 0 | 0 | 6 | ok |
| debug-prescan | 0 | 0 | 0 | ok |
| clarity-prescan | 0 | 0 | 0 | ok |
| solidity-prescan | 0 | 0 | 0 | ok |
| llm-prescan | 0 | 0 | 0 | ok |
| graphql-prescan | 0 | 0 | 0 | ok |
| ws-prescan | 0 | 0 | 0 | ok |
| session-prescan | 0 | 0 | 9 | ok |
| tls-prescan | 1 | 0 | 14 | ok |
| timing-prescan | 1 | 0 | 1 | ok |
| memsafe-prescan | 0 | 0 | 0 | ok |
| log-prescan | 0 | 0 | 0 | ok |
| proto-prescan | 0 | 1 | 2 | ok |
| race-prescan | 0 | 0 | 0 | ok |
| webconf-prescan | 0 | 0 | 0 | ok |
| mcp-prescan | 0 | 0 | 0 | ok |
| ssrfsink-prescan | 0 | 3 | 52 | ok |
| reslimit-prescan | 0 | 3 | 2 | ok |

**Totals: 17 HIGH / 95 MEDIUM / 195 LOW**

## secret-prescan
- **MEDIUM** `generic-assignment` `/workspace/research/agenticjobs/test/api.test.ts:1834` — match `cps_…`
- **MEDIUM** `generic-assignment` `/workspace/research/agenticjobs/test/api.test.ts:1835` — match `cp_l…`
- **MEDIUM** `generic-assignment` `/workspace/research/agenticjobs/test/billing.test.ts:24` — match `cps_…`
- **MEDIUM** `generic-assignment` `/workspace/research/agenticjobs/test/billing.test.ts:25` — match `cp_l…`

## dep-prescan
- **INFO** `semver-range` `@hono/node-server (dependencies)` — semver range '^1.14.0' — lockfile required for integrity
- **INFO** `semver-range` `@profullstack/emailer (dependencies)` — semver range '^1.0.3' — lockfile required for integrity
- **INFO** `semver-range` `@profullstack/hqtui (dependencies)` — semver range '^0.5.0' — lockfile required for integrity
- **INFO** `semver-range` `@profullstack/leaderboard (dependencies)` — semver range '^0.3.1' — lockfile required for integrity
- **INFO** `semver-range` `@profullstack/synconfig (dependencies)` — semver range '^0.1.2' — lockfile required for integrity
- **INFO** `semver-range` `@simplewebauthn/server (dependencies)` — semver range '^14.0.1' — lockfile required for integrity
- **INFO** `semver-range` `@types/node (devDependencies)` — semver range '^24.3.0' — lockfile required for integrity
- **INFO** `semver-range` `@types/pg (devDependencies)` — semver range '^8.11.10' — lockfile required for integrity
- **INFO** `semver-range` `hono (dependencies)` — semver range '^4.6.14' — lockfile required for integrity
- **INFO** `semver-range` `pg (dependencies)` — semver range '^8.13.1' — lockfile required for integrity
- **INFO** `semver-range` `prettier (devDependencies)` — semver range '^3.3.3' — lockfile required for integrity
- **INFO** `semver-range` `typescript (devDependencies)` — semver range '^5.9.2' — lockfile required for integrity

## ci-prescan
- **MEDIUM** `ACTION-TAGPIN` `.github/workflows/ci.yml:35` — action pinned to a mutable ref, not a commit SHA: actions/checkout@v4
- **MEDIUM** `ACTION-TAGPIN` `.github/workflows/ci.yml:37` — action pinned to a mutable ref, not a commit SHA: pnpm/action-setup@v4
- **MEDIUM** `ACTION-TAGPIN` `.github/workflows/ci.yml:41` — action pinned to a mutable ref, not a commit SHA: actions/setup-node@v4
- **MEDIUM** `ACTION-TAGPIN` `.github/workflows/ci.yml:72` — action pinned to a mutable ref, not a commit SHA: actions/checkout@v4
- **INFO** `PERMS-DEFAULT` `.github/workflows/ci.yml:1` — no explicit permissions: block — token scope falls back to the repo/org default (often permissive read-write)

## docker-prescan
- **HIGH** `SECRET-IN-ENV` `docker-compose.yml:17` — literal credential value in POSTGRES_PASSWORD
- **LOW** `BASE-TAGPIN` `Dockerfile:6` — base image node:24-slim — tag pin is mutable; digest pin is stronger
- **LOW** `BASE-TAGPIN` `Dockerfile:31` — base image node:24-slim — tag pin is mutable; digest pin is stronger
- **INFO** `NO-HEALTHCHECK` `Dockerfile` — no HEALTHCHECK — orchestrators cannot detect a wedged container

## crypto-prescan
- **HIGH** `TLS-VERIFY-OFF` `src/db/pool.ts:38` — TLS certificate verification disabled — MITM-exposes the connection
- **HIGH** `WEAK-RNG` `test/api.test.ts:512` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/api.test.ts:620` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/api.test.ts:674` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/api.test.ts:921` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/api.test.ts:1025` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/api.test.ts:1184` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/api.test.ts:1232` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/api.test.ts:1300` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/api.test.ts:2327` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **HIGH** `WEAK-RNG` `test/idempotency.test.ts:69` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **LOW** `WEAK-RNG` `test/api.test.ts:2339` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)
- **LOW** `WEAK-RNG` `test/api.test.ts:3085` — non-CSPRNG used where predictability may matter (secrets/tokens need crypto.random / secrets / SecureRandom / crypto/rand)

## iac-prescan
No findings.

## auth-prescan
No findings.

## cors-prescan
- **MEDIUM** `CORS-ALLOW-ALL` `src/server/middleware.ts:153` — framework-level allow-every-origin (raw-*) — every website can read this service's responses
- **LOW** `CORS-WILDCARD` `src/server/middleware.ts:146` — Access-Control-Allow-Origin: * — fine for public data, dangerous on authenticated endpoints
- **LOW** `CORS-WILDCARD` `src/server/routes/discovery.ts:212` — Access-Control-Allow-Origin: * — fine for public data, dangerous on authenticated endpoints

## csrf-prescan
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/agents.tsx:46` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/agents.tsx:77` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/auth.tsx:36` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/auth.tsx:101` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/inbox.tsx:132` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/inbox.tsx:234` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/inbox.tsx:246` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/inbox.tsx:329` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/inbox.tsx:368` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/inbox.tsx:487` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/inbox.tsx:497` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/jobs.tsx:355` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/jobs.tsx:665` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/me.tsx:236` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/me.tsx:277` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/me.tsx:307` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/me.tsx:316` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/me.tsx:374` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/notifications.tsx:46` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/post.tsx:50` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/post.tsx:305` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/post.tsx:315` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/post.tsx:350` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/post.tsx:433` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/post.tsx:595` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/recommendations.tsx:130` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/recommendations.tsx:203` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/recommendations.tsx:210` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/recommendations.tsx:284` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/tracker.tsx:23` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/updates.tsx:106` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **MEDIUM** `CSRF-TOKEN-ABSENT-FORM` `src/views/updates.tsx:147` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block
- **LOW** `CSRF-MUTATING-GET` `test/api.test.ts:1766` — mutating verb bound to a GET route — reachable via <img>/<a>/prefetch with no CSRF check
- **LOW** `CSRF-TOKEN-ABSENT-FORM` `test/updates.test.ts:123` — POST/PUT/DELETE/PATCH form with no csrf/xsrf/authenticity-token field in its block

## sqli-prescan
- **HIGH** `SQLI-QUERY-INTERP` `src/core/agents.ts:431` — query call built with template-literal — if any part is user-influenced this is injectable; use bound parameters
- **HIGH** `SQLI-QUERY-INTERP` `src/core/recommendations.ts:332` — query call built with template-literal — if any part is user-influenced this is injectable; use bound parameters
- **MEDIUM** `SQLI-IDENT-INTERP` `src/core/jobs.ts:321` — template-literal into identifier/order position — cannot be parameterized; must be allowlisted
- **MEDIUM** `SQLI-QUERY-INTERP` `src/core/updates.ts:359` — query call built with template-literal — if any part is user-influenced this is injectable; use bound parameters
- **MEDIUM** `SQLI-QUERY-INTERP` `src/core/updates.ts:370` — query call built with template-literal — if any part is user-influenced this is injectable; use bound parameters
- **MEDIUM** `SQLI-QUERY-INTERP` `src/core/updates.ts:383` — query call built with template-literal — if any part is user-influenced this is injectable; use bound parameters

## nosql-prescan
- **LOW** `NQ-PROTO-KEY` `test/applications.test.ts:83` — property keyed by request value or __proto__/constructor name — prototype-pollution sink
- **LOW** `NQ-PROTO-KEY` `test/landing-policy-keys.test.ts:9` — property keyed by request value or __proto__/constructor name — prototype-pollution sink
- **LOW** `NQ-PROTO-KEY` `test/landing-policy-keys.test.ts:27` — property keyed by request value or __proto__/constructor name — prototype-pollution sink

## xss-prescan
- **HIGH** `XSS-DOM-SINK` `src/views/layout.tsx:118` — non-literal reaches raw-HTML DOM sink
- **MEDIUM** `XSS-JS-URL` `src/core/mail.ts:122` — href/src attribute assembled with interpolation
- **MEDIUM** `XSS-JS-URL` `src/core/mail.ts:188` — href/src attribute assembled with interpolation
- **MEDIUM** `XSS-JS-URL` `src/views/agents.tsx:299` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/candidates.tsx:184` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/candidates.tsx:246` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/inbox.tsx:27` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/inbox.tsx:234` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/inbox.tsx:246` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/inbox.tsx:510` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/jobs.tsx:163` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/jobs.tsx:224` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/jobs.tsx:375` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/jobs.tsx:429` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/jobs.tsx:608` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/jobs.tsx:805` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/layout.tsx:71` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/layout.tsx:73` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/network.tsx:68` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/network.tsx:147` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/notifications.tsx:41` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/notifications.tsx:108` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/rankings.tsx:87` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/rankings.tsx:157` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/recommendations.tsx:22` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/recommendations.tsx:130` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/updates.tsx:46` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/updates.tsx:63` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/updates.tsx:106` — URL scheme position attacker-controllable
- **MEDIUM** `XSS-JS-URL` `src/views/updates.tsx:147` — URL scheme position attacker-controllable
- **LOW** `XSS-JS-URL` `src/core/capacity-alert.ts:138` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/core/markdown-media.ts:117` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/core/recommendations.ts:481` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/core/watches.ts:326` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/core/watches.ts:327` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/markup/markdown.ts:337` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/markup/markdown.ts:395` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/markup/markdown.ts:396` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/markup/markdown.ts:398` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `src/server/routes/discovery.ts:115` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `test/api.test.ts:403` — javascript:/vbscript: URL literal
- **LOW** `XSS-JS-URL` `test/api.test.ts:2579` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `test/bare-url-parentheses.test.ts:6` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `test/features.test.ts:324` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `test/features.test.ts:348` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `test/features.test.ts:353` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `test/markup.test.ts:27` — javascript:/vbscript: URL literal
- **LOW** `XSS-JS-URL` `test/markup.test.ts:28` — javascript:/vbscript: URL literal
- **LOW** `XSS-JS-URL` `test/markup.test.ts:29` — javascript:/vbscript: URL literal
- **LOW** `XSS-JS-URL` `test/resume-contact-url.test.ts:35` — javascript:/vbscript: URL literal
- **LOW** `XSS-JS-URL` `test/resume-contact-url.test.ts:36` — javascript:/vbscript: URL literal
- **LOW** `XSS-JS-URL` `test/resume-contact-url.test.ts:56` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `test/resume-contact.test.ts:106` — href/src attribute assembled with interpolation
- **LOW** `XSS-JS-URL` `test/safe-redirect.test.ts:11` — javascript:/vbscript: URL literal
- **LOW** `XSS-JS-URL` `test/updates.test.ts:52` — javascript:/vbscript: URL literal

## cmdi-prescan
- **MEDIUM** `CI-PIPE-SHELL` `src/cli/manage.ts:80` — download piped to a shell/interpreter
- **MEDIUM** `CI-SPAWN-ARG` `src/core/markdown-media.ts:135` — user-flavoured arg reaches no-shell exec — argument-injection review
- **LOW** `CI-PIPE-SHELL` `src/cli/manage.ts:51` — pipe-to-shell text inside string/markup — verify it is display-only
- **LOW** `CI-PIPE-SHELL` `src/views/docs.tsx:294` — pipe-to-shell text inside string/markup — verify it is display-only
- **LOW** `CI-PIPE-SHELL` `src/views/hire.tsx:161` — pipe-to-shell text inside string/markup — verify it is display-only
- **LOW** `CI-PIPE-SHELL` `src/views/jobs.tsx:333` — pipe-to-shell text inside string/markup — verify it is display-only
- **LOW** `CI-SPAWN-ARG` `test/tracker.test.ts:382` — user-flavoured arg reaches no-shell exec — argument-injection review

## path-prescan
- **LOW** `PT-DOTDOT-CONCAT` `src/cli/index.ts:688` — '../' literal combined with a variable
- **LOW** `PT-DOTDOT-CONCAT` `src/cli/index.ts:730` — '../' literal combined with a variable
- **LOW** `PT-DOTDOT-CONCAT` `src/cli/manage.ts:72` — '../' literal combined with a variable

## ssti-prescan
No findings.

## redirect-prescan
No findings.

## xxe-prescan
No findings.

## deser-prescan
No findings.

## upload-prescan
No findings.

## injection-prescan
- **LOW** `PI-TOOL-ABUSE` `README.md:26` — destructive/financial imperative embedded in instruction text
- **LOW** `PI-TOOL-ABUSE` `docs/openprofile.md:25` — destructive/financial imperative embedded in instruction text

## redos-prescan
- **MEDIUM** `REDOS-USER-PATTERN` `src/cli/jobfile.ts:22` — regex built from a non-literal — pattern injection plus unknown complexity
- **MEDIUM** `REDOS-USER-PATTERN` `src/core/import-job.ts:105` — regex built from a non-literal — pattern injection plus unknown complexity
- **MEDIUM** `REDOS-USER-PATTERN` `src/core/import-job.ts:106` — regex built from a non-literal — pattern injection plus unknown complexity
- **MEDIUM** `REDOS-USER-PATTERN` `src/core/import.ts:288` — regex built from a non-literal — pattern injection plus unknown complexity
- **MEDIUM** `REDOS-USER-PATTERN` `src/markup/markdown.ts:53` — regex built from a non-literal — pattern injection plus unknown complexity
- **MEDIUM** `REDOS-USER-PATTERN` `src/markup/markdown.ts:348` — regex built from a non-literal — pattern injection plus unknown complexity
- **MEDIUM** `REDOS-USER-PATTERN` `src/markup/resume.ts:182` — regex built from a non-literal — pattern injection plus unknown complexity
- **MEDIUM** `REDOS-USER-PATTERN` `src/server/routes/pages.tsx:962` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-ADJACENT-REPEAT` `myna-plugin/posting.js:38` — adjacent unbounded repeats with overlapping character classes — review; dangerous when chained or nested in /^#\s+.+\n?/
- **LOW** `REDOS-ADJACENT-REPEAT` `src/server/routes/specs.ts:44` — adjacent unbounded repeats with overlapping character classes — review; dangerous when chained or nested in /^#\s+.*\n/
- **LOW** `REDOS-USER-PATTERN` `test/api.test.ts:2579` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/api.test.ts:2582` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/capacity.test.ts:284` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/css.test.ts:44` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:230` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:276` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:280` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:281` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:282` — regex built from request-derived input — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:306` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:323` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:324` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:325` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:326` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:348` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/features.test.ts:353` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/recommendations.test.ts:87` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/recommendations.test.ts:88` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/recommendations.test.ts:90` — regex built from a non-literal — pattern injection plus unknown complexity
- **LOW** `REDOS-USER-PATTERN` `test/redaction.test.ts:176` — regex built from a non-literal — pattern injection plus unknown complexity

## authz-prescan
- **MEDIUM** `AUTHZ-OBJECT-NO-OWNER` `test/inbox-parties.test.ts:68` — object fetched/mutated by client-supplied id with no ownership predicate in the handler — BOLA/IDOR shape
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/agents.tsx:119` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/agents.tsx:144` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/agents.tsx:161` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/agents.tsx:187` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/agents.tsx:254` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/agents.tsx:286` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:318` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:388` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:454` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:553` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:600` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:665` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:706` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:746` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:769` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:806` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:873` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:891` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:907` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:922` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1100` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1150` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1198` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1203` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1208` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1213` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1302` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1305` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1329` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1426` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/api.ts:1490` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/mcp.ts:28` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/passkey.ts:147` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/settings.ts:114` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/watches.tsx:85` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/watches.tsx:101` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/watches.tsx:128` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/watches.tsx:142` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/watches.tsx:162` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/watches.tsx:201` — mutating route in a file with some auth vocabulary
- **LOW** `AUTHZ-MUTATING-NO-AUTH` `src/server/routes/watches.tsx:222` — mutating route in a file with some auth vocabulary

## jwt-prescan
No findings.

## oauth-prescan
- **MEDIUM** `OAUTH-SECRET-LITERAL` `test/api.test.ts:1834` — client/app secret is an inline literal (weak/<16 chars) — ships in source and bundles
- **MEDIUM** `OAUTH-SECRET-LITERAL` `test/billing.test.ts:24` — client/app secret is an inline literal (weak/<16 chars) — ships in source and bundles
- **MEDIUM** `OAUTH-SECRET-LITERAL` `test/billing.test.ts:34` — client/app secret is an inline literal (weak/<16 chars) — ships in source and bundles

## headers-prescan
- **LOW** `HDR-CSP-UNSAFE` `src/server/middleware.ts:110` — style-src carries an unsafe-* source — style-level exposure only
- **LOW** `HDR-PUBLIC-CACHE` `src/server/routes/discovery.ts:180` — Cache-Control public in a file carrying auth/session vocabulary — shared caches may store per-user responses
- **LOW** `HDR-PUBLIC-CACHE` `src/server/routes/discovery.ts:199` — Cache-Control public in a file carrying auth/session vocabulary — shared caches may store per-user responses
- **LOW** `HDR-PUBLIC-CACHE` `src/server/routes/discovery.ts:211` — Cache-Control public in a file carrying auth/session vocabulary — shared caches may store per-user responses
- **LOW** `HDR-PUBLIC-CACHE` `src/server/routes/discovery.ts:952` — Cache-Control public in a file carrying auth/session vocabulary — shared caches may store per-user responses
- **LOW** `HDR-CSP-UNSAFE` `test/api.test.ts:3521` — script-src carries 'unsafe-inline' — script source the CSP was meant to exclude

## debug-prescan
No findings.

## clarity-prescan
No findings.

## solidity-prescan
No findings.

## llm-prescan
No findings.

## graphql-prescan
No findings.

## ws-prescan
No findings.

## session-prescan
- **LOW** `SES-URL-TOKEN` `src/server/routes/api.ts:1365` — credential name placed in a URL query — tokens in links leak via logs and Referer
- **LOW** `SES-URL-TOKEN` `src/server/routes/pages.tsx:919` — credential name placed in a URL query — tokens in links leak via logs and Referer
- **LOW** `SES-URL-TOKEN` `test/api.test.ts:375` — credential name placed in a URL query — tokens in links leak via logs and Referer
- **LOW** `SES-URL-TOKEN` `test/mail.test.ts:52` — credential name placed in a URL query — tokens in links leak via logs and Referer
- **LOW** `SES-URL-TOKEN` `test/mail.test.ts:58` — credential name placed in a URL query — tokens in links leak via logs and Referer
- **LOW** `SES-URL-TOKEN` `test/mail.test.ts:59` — credential name placed in a URL query — tokens in links leak via logs and Referer
- **LOW** `SES-URL-TOKEN` `test/mail.test.ts:69` — credential name placed in a URL query — tokens in links leak via logs and Referer
- **LOW** `SES-URL-TOKEN` `test/mail.test.ts:82` — credential name placed in a URL query — tokens in links leak via logs and Referer
- **LOW** `SES-URL-TOKEN` `test/mail.test.ts:101` — credential name placed in a URL query — tokens in links leak via logs and Referer

## tls-prescan
- **HIGH** `TLS-VERIFY-OFF` `src/db/pool.ts:38` — certificate verification explicitly disabled — any TLS peer is accepted; MITM reads and rewrites the channel
- **LOW** `TLS-PLAINTEXT` `test/browse.test.ts:83` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/browse.test.ts:85` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/browse.test.ts:89` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/features.test.ts:408` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/fetch-public-target.test.ts:18` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/fetch-public-target.test.ts:46` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/fetch-public-target.test.ts:47` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/fetch-public-target.test.ts:57` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/fetch-public-target.test.ts:58` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/fetch-public-target.test.ts:64` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/push.test.ts:192` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/translation-prefixes.test.ts:47` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/translation-prefixes.test.ts:51` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted
- **LOW** `TLS-PLAINTEXT` `test/translation-prefixes.test.ts:54` — http:// endpoint bound to a transport name/arg — credentials and payloads travel unencrypted

## timing-prescan
- **HIGH** `T-SECRET-EQ` `test/api.test.ts:1763` — early-exit `!==` on secret-named operand — leaks the first differing byte per probe; use a constant-time compare (compare_digest / timingSafeEqual / subtle.ConstantTimeCompare / hash_equals)
- **LOW** `T-LEN-LEAK` `src/core/push.ts:176` — length compare on secret-named data — length oracle (also short-circuits the real compare)

## memsafe-prescan
No findings.

## log-prescan
No findings.

## proto-prescan
- **MEDIUM** `PP-ASSIGN-REQ` `/workspace/research/agenticjobs/web/public/sw.js:102` — Object.assign copies attacker keys via [[Set]] — a __proto__ own-key invokes the prototype setter on the target
- **LOW** `PP-FORIN-COPY` `/workspace/research/agenticjobs/src/client/sync.ts:50` — key-enumeration copy into another object with no own-property/special-key guard — __proto__ own-keys from parsed input write to the target's prototype
- **LOW** `PP-FORIN-COPY` `/workspace/research/agenticjobs/src/server/routes/pages.tsx:243` — key-enumeration copy into another object with no own-property/special-key guard — __proto__ own-keys from parsed input write to the target's prototype

## race-prescan
No findings.

## webconf-prescan
No findings.

## mcp-prescan
No findings.

## ssrfsink-prescan
- **MEDIUM** `SF-VAR-SINK` `/workspace/research/agenticjobs/src/cli/manage.ts:51` — url-ish 'site' into an outbound fetch — provenance not visible here; verify an exact-hostname allowlist
- **MEDIUM** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/src/core/import-job.ts:235` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **MEDIUM** `SF-VAR-SINK` `/workspace/research/agenticjobs/src/directory/fetch.ts:121` — url-ish 'target' into an outbound fetch — provenance not visible here; verify an exact-hostname allowlist
- **LOW** `SF-URL-PARAM` `/workspace/research/agenticjobs/src/server/routes/agents.tsx:95` — request value stored in url-named 'url' — blind-SSRF surface if any path later fetches it; enforce an allowlist at the fetch site
- **LOW** `SF-URL-PARAM` `/workspace/research/agenticjobs/src/server/routes/discovery.ts:309` — request value stored in url-named 'url' — blind-SSRF surface if any path later fetches it; enforce an allowlist at the fetch site
- **LOW** `SF-URL-PARAM` `/workspace/research/agenticjobs/src/server/routes/discovery.ts:376` — request value stored in url-named 'url' — blind-SSRF surface if any path later fetches it; enforce an allowlist at the fetch site
- **LOW** `SF-URL-PARAM` `/workspace/research/agenticjobs/src/server/routes/discovery.ts:451` — request value stored in url-named 'url' — blind-SSRF surface if any path later fetches it; enforce an allowlist at the fetch site
- **LOW** `SF-URL-PARAM` `/workspace/research/agenticjobs/src/server/routes/discovery.ts:633` — request value stored in url-named 'url' — blind-SSRF surface if any path later fetches it; enforce an allowlist at the fetch site
- **LOW** `SF-URL-PARAM` `/workspace/research/agenticjobs/src/server/routes/mcp.ts:45` — request value stored in url-named 'origin' — blind-SSRF surface if any path later fetches it; enforce an allowlist at the fetch site
- **LOW** `SF-URL-PARAM` `/workspace/research/agenticjobs/src/server/routes/watches.tsx:115` — request value stored in url-named 'url' — blind-SSRF surface if any path later fetches it; enforce an allowlist at the fetch site
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/api.test.ts:550` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/api.test.ts:2767` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/api.test.ts:2772` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/api.test.ts:2776` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/api.test.ts:2778` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/api.test.ts:2786` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/browse.test.ts:32` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/capacity.test.ts:283` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-VAR-SINK` `/workspace/research/agenticjobs/test/features.test.ts:408` — url-ish 'endpoint' into an outbound fetch — provenance not visible here; verify an exact-hostname allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:191` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:197` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:201` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:204` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:210` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:214` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:222` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:232` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:238` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:244` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/markup.test.ts:252` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:54` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:64` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:65` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:68` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:95` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:126` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:135` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:136` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:138` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/openprofile.test.ts:231` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/redaction.test.ts:40` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/redaction.test.ts:41` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/redaction.test.ts:104` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/redaction.test.ts:127` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/resume-contact.test.ts:108` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/resume-export-header.test.ts:25` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/resume.test.ts:232` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/resume.test.ts:234` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/resume.test.ts:262` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/resume.test.ts:283` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/resume.test.ts:289` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/resume.test.ts:291` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/tui-applications.test.ts:99` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/updates.test.ts:61` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist
- **LOW** `SF-SUBSTR-GUARD` `/workspace/research/agenticjobs/test/views.test.ts:319` — URL guard is a substring/prefix-domain test — bypassable (api.example.com.evil.tld, evilapi.example.com); compare the parsed hostname against an exact allowlist

## reslimit-prescan
- **MEDIUM** `RL-REQ-LOOP` `/workspace/research/agenticjobs/src/cli/args.ts:58` — request-derived loop bound — CPU linear in attacker input
- **MEDIUM** `RL-REQ-ALLOC` `/workspace/research/agenticjobs/src/server/routes/pages.tsx:564` — request-sized array/buffer allocation — call-derived value 'source' (line 561): the callee may transform or clamp it; verify a bound
- **MEDIUM** `RL-REQ-ALLOC` `/workspace/research/agenticjobs/src/server/routes/pages.tsx:582` — request-sized array/buffer allocation — call-derived value 'bytes' (line 581): the callee may transform or clamp it; verify a bound
- **LOW** `RL-VAR-ALLOC` `/workspace/research/agenticjobs/src/cli/watches.ts:125` — size-named 'width' reaches this sink — provenance not visible here; verify a bound is applied upstream
- **LOW** `RL-VAR-ALLOC` `/workspace/research/agenticjobs/src/schema/text.ts:85` — size-named 'length' reaches this sink — provenance not visible here; verify a bound is applied upstream
