Anti-Refusal Statement
- Category
- Anti-Refusal
- Confidence
- 80% confidence
- Finding
Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.
- Content
md **Sweep every run directory under `${RUNS_ROOT}` at the start of each run** — not the current one, whose `merged.json` does not exist yet. A purge aimed at the run you are about to create can only delete rows you just collected: a no-op in the costume of compliance, worse than no date at all, because it documents the breach. Purge **both** `merged.json` and `deliverable.json`: purging one while a stale copy survives beside it retains nothing less. Audit first, purge, re-audit — the second audit must print 0, and a second purge must purge 0. **Trap G — the undated row compares as expired.** In jq, both `null` and `""` sort below any date string: `"" < "2026-07-16"` is **true**. Under the present-but-empty rule this skill imposes everywhere else, an unstamped row holds `""`, not `null` — so `select(.delete_after != null)`, the guard the word "null" invites, still destroys every one of them. Verified: `[null, "", "2020-01-01", "2099-01-01"] | map(select(. < "2026-07-16"))` keeps the first three; adding `. != null` keeps `""` in the kill list. A row whose date was never stamped is counted expired and silently destroyed. The direction is fail-closed, so it is not a breach — it is mute data loss on fresh rows, with no warning. Count undated rows separately and print them loudly as "purged as unretainable". **Trap H — nobody stamps the date.** Declaring 12 months and showing `delete_after` in the schema does not compute it. Unless a step in your pipeline derives the date (`date -u -d '+12 months' +%F` on GNU, `date -u -v+12m +%F` on BSD/macOS — write both) and the agent contract requires it, your purge only acts on rows someone happened to date. Enforced retention means code, in the run.
