# Task for delegate

Security-audit: ${@:-the current code, diff, or feature}

Structure your answer as:
1. **Trust boundary** — where untrusted input enters, where sensitive data leaves; map the attack surface in one paragraph
2. **Findings** — grouped by severity (Critical / High / Medium / Low / Info). For each:
   - **Category** — one of: Injection, AuthN/AuthZ, Secrets, Crypto, Input validation, Output encoding, Deserialization, SSRF, Path traversal, Race/TOC-TOU, Dependency, Logging/PII, Configuration, Supply chain
   - **Location** — file, line, function
   - **Description** — the vulnerability, with a concrete exploit scenario
   - **Fix** — the minimal secure change, with a code snippet
3. **Missing controls** — auth, rate limiting, audit logging, CSRF/CORS, headers, etc. that should exist but don't
4. **Dependencies** — any third-party packages with known CVEs in this surface (if you can determine versions)
5. **Threat model gaps** — what's out of scope for this audit but worth a separate pass

Be concrete and adversarial — describe a real attack, not "consider validating input." If the code is sound, say so explicitly and explain what you'd look for if it weren't. Do not pad with general security advice that doesn't apply to the specific code.

## Acceptance Contract
Acceptance level: reviewed
Completion is not accepted from prose alone. End with a structured acceptance report.

Criteria:
- criterion-1: Implement the requested change without widening scope
- criterion-2: Return evidence sufficient for an independent acceptance review

Required evidence: changed-files, tests-added, commands-run, validation-output, residual-risks, no-staged-files

Review gate: required by reviewer.

Finish with a fenced JSON block tagged `acceptance-report` in this shape:
Use empty arrays when no items apply; array fields contain strings unless object entries are shown.
`criteriaSatisfied[].status` must be exactly one of: satisfied, not-satisfied, not-applicable.
`commandsRun[].result` must be exactly one of: passed, failed, not-run.
`manualNotes` and `notes` are optional strings; an empty string means no note and does not satisfy `manual-notes` evidence.
```acceptance-report
{
  "criteriaSatisfied": [
    {
      "id": "criterion-1",
      "status": "satisfied",
      "evidence": "specific proof"
    },
    {
      "id": "criterion-2",
      "status": "satisfied",
      "evidence": "specific proof"
    }
  ],
  "changedFiles": [
    "src/file.ts"
  ],
  "testsAddedOrUpdated": [
    "test/file.test.ts"
  ],
  "commandsRun": [
    {
      "command": "command",
      "result": "passed",
      "summary": "short result"
    }
  ],
  "validationOutput": [
    "validation output or concise summary"
  ],
  "residualRisks": [
    "none"
  ],
  "noStagedFiles": true,
  "diffSummary": "short description of the diff",
  "reviewFindings": [
    "blocker: file.ts:12 - issue found, or no blockers"
  ],
  "manualNotes": "anything else the parent should know"
}
```