# Expected Findings — Memory-Poisoning Walkthrough

This is the testable contract. `run-memory-poisoning.mjs` exits 0
only when each detector category has at least one finding.

## Per-detector contract

| Detector | Min findings | Severity floor | OWASP |
|----------|-------------:|----------------|-------|
| detectInjection | 1 | MEDIUM | LLM01 |
| detectShellCommands | 1 | LOW | LLM06 |
| detectSuspiciousUrls | 1 | HIGH | LLM02 |
| detectCredentialPaths | 1 | HIGH | LLM02 |
| detectPermissionExpansion | 1 | CRITICAL | LLM06 / ASI06 |
| detectEncodedPayloads | 1 | MEDIUM | LLM01 |

Total: at least 6 unique findings, severity-weighted such that
the highest tier in any single file is CRITICAL.

## File-level expectations

| File | Min findings |
|------|-------------:|
| `CLAUDE.md` | 12 |
| `.claude/agents/health-checker.md` | 3 |

The agent file count is lower because the fixture is intentionally
shorter — its purpose is to prove E15 (v7.2.0) coverage of the
agent-file surface, not to exhaustively replicate every CLAUDE.md
signal.

## Bucket-mapping logic (in run-memory-poisoning.mjs)

Findings are bucketed in priority order:

1. permission expansion (most specific) — matches "permission expansion"
   or `allowed-tools` / `bypassPermissions` / `dangerously` / `skip-permissions`
2. credential paths — matches "credential path" or `.ssh` / `.aws` /
   `kubeconfig` / `wallet` / `service-account-key`
3. suspicious URLs — matches "suspicious exfiltration url/domain" or
   `webhook.site` / `requestbin`
4. encoded payloads — matches "base64" or "encoded payload"
5. shell commands — matches "shell command" or `curl` / `wget` / `eval`
6. injection (broadest, last) — matches "injection" / "ignore previous" /
   "spoofed"

The order matters because some findings carry "directive" or
"override" wording that would otherwise fall into the injection
bucket — by checking permission-expansion first we avoid double-counting.

## Side effects

- No file is modified
- No network call (scanner is fully offline)
- Discovery uses `scanners/lib/file-discovery.mjs::discoverFiles()`
- Memory-poisoning-scanner only inspects files matching
  `MEMORY_FILE_PATTERNS` — the fixture deliberately uses
  `CLAUDE.md` and `.claude/agents/health-checker.md` to ensure
  the scanner picks them up
