--- id: DIS-003 status: ready phase: 0 priority: p0 labels: [phase:0, type:fix, priority:p0, security] branch: phase-0/sanitize-env assignee: null started: null pr: null merged: null --- # DIS-003: `sanitizedEnv()` — Secrets aus Child-Env entfernen ## Ziel Kein Secret (`DISCORD_BOT_TOKEN` etc.) darf im Environment des `claude`-Kindprozesses landen. Ein Agent kann heute per `echo $DISCORD_BOT_TOKEN` den Bot-Token exfiltrieren. ## Kontext `src/agent/runner.ts` vererbt aktuell `process.env` vollständig. → `docs/development-plan.md` §2.6, `docs/ai-engineer-analyse.md` §4. ## Scope - **In**: `src/runtime/env.ts`: `sanitizedEnv(extra?)` entfernt `DISCORD_BOT_TOKEN`, `DISCORD_CLIENT_SECRET`, Pattern `/^(SECRET_|TOKEN_|API_KEY_?)/i`, setzt `CI=true`, `DISCLAW_AGENT=1`, `DISCLAW_AGENT_NAME=` · optionale `env_blocklist` via `disclaw.yaml` · `runner.ts` nutzt `sanitizedEnv` statt `process.env` - **Out**: Whitelist-statt-Blacklist-Modus ## Definition of Done - [ ] `sanitizedEnv()` ist pur, keine Seiteneffekte - [ ] Unit-Test `tests/unit/sanitize-env.test.ts` deckt: Token entfernt, Pattern-Match, PATH/HOME bleiben, Extras überschreiben, `env_blocklist` wird angewendet - [ ] Runner nutzt `sanitizedEnv` an allen Spawn-Stellen - [ ] `npm run build && npm test` grün ## Dateien (erwartet) - `src/runtime/env.ts` - `src/agent/runner.ts` - `src/config/loader.ts` - `tests/unit/sanitize-env.test.ts` ## Abhängigkeiten Keine. Kann parallel zu DIS-002 laufen (beide editieren `runner.ts` — bei Merge-Konflikt rebased DIS-003 auf DIS-002). ## Spec → `docs/backlog.md` #DIS-003