# Dead-Code Cleanup **Status:** completed **Task-ID:** #25 **Phase:** 01 **Estimated Effort:** 2-3h (single commit, kein Sub-Sprint) **Owner:** claude (opus-4-7) ## Problem Im Codebase liegen mehrere ungenutzte Funktionen, auskommentierte Caller und orphan Env-Keys herum. Sie verzerren die Codebase-Analyse, lassen TypeScript-Helper-Pfade unklar und produzieren irreführende `.env`-Diffs. Konkret: - `updateTenantUser` in `apps/web/app/utils/db/tenants.db.server.ts:454-461` — kein einziger lebender Caller. Einziger ehemaliger Caller in `apps/web/app/routes/app.$tenant/settings/members/edit.$id.tsx:92` ist seit Monaten auskommentiert. - `compile()`-Helper in `apps/web/app/modules/workflowEngine/services/WorkflowsVariablesService.ts:26-50` — nirgends importiert; der echte Pfad läuft über `interpolateVariables()`. - `AUTH_RECAPTCHA_SECRET_KEY` in `packages/config/src/catalog.ts:539` plus 3 Verwendungs-Stellen, von denen 0 tatsächlich gegen den Key prüfen (alle nutzen `AUTH_RECAPTCHA_SITE_KEY`). - Lokale `.env` enthält `GITHUB_TOKEN` und `NOTIFICATIONS_NOVU_APP_ID` ohne jeden Codepfad. `.env.example` zieht diese Keys weiter, neue Devs setzen sie unnötig. Aufwand für diesen Cleanup ist gering, der psychologische Effekt für Folgetasks (saubere Grep-Ergebnisse) ist hoch — deshalb ganz vorne in Phase 01. ## Depends on - Keine. Diese Task hat keine internen Abhängigkeiten und kann sofort starten. ## Blocks - `01-tech-debt-foundation/dep-updates.md` (#28) — Dep-Updates touchen u.a. `tenants.db.server.ts`. Wenn dead-code dort drinbleibt, müssen Diffs zweimal reviewed werden. Best: zuerst löschen. - `01-tech-debt-foundation/password-policy.md` (#27) — Password-Policy-Refactor greppt nach Auth-Env-Keys. Orphan `AUTH_RECAPTCHA_SECRET_KEY` würde false-positives produzieren. ## Approach Single-commit Cleanup. Keine Migration, kein Feature-Flag, keine Rollback-Komplexität. Wir nehmen vier kleine Patches und packen sie in einen atomic commit `01/dead-code: remove unused helpers and orphan env keys`. Alternativen verworfen: - **Pro Stelle ein Commit** — overkill bei vier reinen Löschungen, würde nur Log aufblähen. - **Deprecation-Phase** — die Funktionen werden nicht extern konsumiert (kein Export aus packages/*-public-API), eine Deprecation-Phase würde keinen Mehrwert bringen. ## Implementation Steps 1. **Verify-Suche bevor gelöscht wird** — pro Symbol einmal `rg`, dokumentieren ob es wirklich keine Caller gibt. - Files: keine; nur Recherche - Output: kurze Liste in PR-Body 2. **Remove `updateTenantUser` + Caller-Stub** — Funktion in `apps/web/app/utils/db/tenants.db.server.ts` (Zeilen 454-461) löschen; auskommentierte Block in `apps/web/app/routes/app.$tenant/settings/members/edit.$id.tsx:92` (samt umgebenden Kommentaren) entfernen. - Files: `apps/web/app/utils/db/tenants.db.server.ts`, `apps/web/app/routes/app.$tenant/settings/members/edit.$id.tsx` 3. **Remove `compile()`-Helper** — Funktion in `apps/web/app/modules/workflowEngine/services/WorkflowsVariablesService.ts:26-50` löschen; falls dort am Dateianfang Imports nur für `compile` da waren, mit entfernen. - Files: `apps/web/app/modules/workflowEngine/services/WorkflowsVariablesService.ts` 4. **Remove `AUTH_RECAPTCHA_SECRET_KEY`** — Eintrag in `packages/config/src/catalog.ts:539` raus; alle Code-Stellen (rg-Liste aus Step 1) entfernen; falls `getEnv("AUTH_RECAPTCHA_SECRET_KEY")` irgendwo gerufen wird, ersetzen mit dem tatsächlich verwendeten `AUTH_RECAPTCHA_SITE_KEY` oder ganz entfernen wenn redundant. - Files: `packages/config/src/catalog.ts`, ggf. weitere 5. **Remove orphan env keys aus lokaler `.env` und `.env.example`** — `GITHUB_TOKEN` und `NOTIFICATIONS_NOVU_APP_ID` aus `.env.example` (lokale `.env` ist nicht im Repo, wird nur dokumentiert). - Files: `.env.example` 6. **Single atomic commit** — alle vier Patches zusammen. - Commit: `01/dead-code: remove unused helpers and orphan env keys` ## Test Requirements - **Unit-Tests:** keine neuen — alle vier Löschungen sind Code, der nicht getestet ist (das ist Teil des Problems). Bestehende Test-Suite muss weiterhin grün laufen. - **Integration-Tests:** `pnpm test` global laufen lassen; speziell der workflowEngine-Test-Block (`pnpm --filter=web test workflowEngine`) und der tenant-route-Block. - **Typecheck:** `pnpm typecheck` muss grün sein (Imports müssen aufgelöst werden auch nach Löschung). - **Lint:** `pnpm lint --max-warnings=0` muss grün sein (keine neuen ungenutzten-Import-Warnings). - **Grep-Verify nach Commit:** `rg "updateTenantUser|AUTH_RECAPTCHA_SECRET_KEY|NOTIFICATIONS_NOVU_APP_ID"` darf nur noch in `docs/` oder gar nicht mehr matchen. - **Coverage-Target:** kein neuer Code — Coverage-Quote für die touched Files muss mindestens gleich bleiben. - **Test-Files:** keine neuen. **NICHT als completed markieren bevor alle Tests grün sind.** ## Acceptance Criteria - [ ] `updateTenantUser` aus `apps/web/app/utils/db/tenants.db.server.ts` entfernt - [ ] Auskommentierter Caller in `apps/web/app/routes/app.$tenant/settings/members/edit.$id.tsx` entfernt - [ ] `compile()`-Helper aus `WorkflowsVariablesService.ts` entfernt - [ ] `AUTH_RECAPTCHA_SECRET_KEY` aus `packages/config/src/catalog.ts` plus alle Code-References entfernt - [ ] `GITHUB_TOKEN` und `NOTIFICATIONS_NOVU_APP_ID` aus `.env.example` entfernt - [ ] `pnpm lint`, `pnpm typecheck`, `pnpm test` grün - [ ] Single atomic commit, push auf `agent/01-dead-code` - [ ] Detail-MD Progress-Log aktualisiert - [ ] PROGRESS.md Status auf `completed` ## Rollback Strategy Single commit → `git revert ` reicht. Keine DB-Migration, keine Daten-Veränderung, keine Production-Konfig-Änderung. Rollback ist sicher in <30s. Wenn nach Rollback noch ein follow-up-Problem auftritt (z.B. ein Caller stellt sich doch heraus): erneuter Cleanup mit präziserer Grep-Recherche. ## Security Notes - **Recaptcha-Removal:** Sicherstellen, dass durch das Entfernen von `AUTH_RECAPTCHA_SECRET_KEY` keine Server-seitige Captcha-Prüfung wegfällt, die aktuell aktiv genutzt wird. Recherche in Step 1 muss explizit prüfen: gibt es einen Code-Pfad der `/siteverify` o.ä. ruft? Wenn ja → diesen Pfad separat in `password-policy.md` oder einem neuen Security-Task adressieren, nicht hier hidden mit löschen. - Keine sonstigen Security-Implikationen — die gelöschten Helper sind ungenutzt. ## Subagent Recommendations - **Planning:** unnötig — Task ist trivial. - **Research:** `general-purpose`-Subagent mit Auftrag: "Verifiziere per ripgrep dass folgende Symbole keinen lebenden Caller haben: `updateTenantUser`, `WorkflowsVariablesService.compile`, `AUTH_RECAPTCHA_SECRET_KEY`, `GITHUB_TOKEN`, `NOTIFICATIONS_NOVU_APP_ID`. Liefer-Format: pro Symbol entweder 'no callers' oder Liste der Caller-Files." - **Implementation:** `general-purpose`-Subagent mit Brief: "Wende die 5 Löschungen aus dead-code.md Steps 2-5 an. Run lint+typecheck+test. Wenn grün → ein atomic commit gemäß Step 6." - **Tests:** kein separater Subagent — Reuse der bestehenden Suite reicht. - **Verification:** `general-purpose`-Subagent mit Acceptance-Criteria-Checkliste, liefert `[ ] / [x]`-Status. - **Code-Review:** `gsd-code-reviewer` nach Phase-Abschluss (nicht pro Task). ## Staging-Deployment-Steps Nicht nötig — reiner Code-Cleanup ohne Service-Side-Effects. Wenn CI grün, ist Production-Deploy sicher. ## Deviations from Plan - **Step 5 (`.env.example` orphan-key removal) ist no-op.** Weder `GITHUB_TOKEN` noch `NOTIFICATIONS_NOVU_APP_ID` noch `AUTH_RECAPTCHA_SECRET_KEY` sind im aktuellen `.env.example` enthalten. Die Datei führt nur die tatsächlich verwendeten OAuth-/Provider-Keys (`GITHUB_OAUTH_CLIENT_ID`, `GITHUB_OAUTH_CLIENT_SECRET`, `NOTIFICATIONS_NOVU_API_KEY`, `AUTH_RECAPTCHA_SITE_KEY`). Detail-MD war out-of-date; das eigentliche Cleanup-Ziel ist trotzdem erreicht (keine Orphans im `.env.example`). Kein Code-Change nötig. - **Precursor-Commit für Lefthook-Hook.** Der lefthook `lint-staged`-Step versagt mit `--max-warnings=0` für jede Datei, die unter `apps/web/app/**` liegt, weil `.eslintrc` line 20 `app/` in `ignorePatterns` führt und ESLint v8 dann "File ignored because of a matching ignore pattern" als Warning emittiert. Frühere Commits müssen den Hook umgangen haben. Per AGENT-INSTRUCTIONS Regel 9 (`--no-verify` verboten) habe ich einen Precursor-Commit (`ed9a1654`) gemacht, der `scripts/eslint-staged.mjs` als Wrapper einführt und die staged-files vor dem Linten durch `ESLint.isPathIgnored()` filtert. Dauerhafte Fix bis ESLint v9 (mit nativem `--no-warn-ignored`) eingeführt wird (Phase 01 #28). - **Test-Files für `AUTH_RECAPTCHA_SECRET_KEY` mussten mit-angepasst werden** (3 statt 1 Stelle): `packages/config/src/catalog.test.ts`, `env-access-inventory.test.ts`, `env-examples.test.ts` plus `packages/config/README.md`. Im atomic commit enthalten. ## Progress Log - 2026-05-17 00:30 — `135718f3` — Planning-Baseline committed (improvement-plan + STAGING-ACCESS.md stub, dieser Commit liegt auf main). - 2026-05-17 00:32 — `ed9a1654` — Precursor: lefthook `lint-staged` Wrapper-Script (`scripts/eslint-staged.mjs`) eingeführt, filtert ESLint-ignored Files vor dem Linten. - 2026-05-17 00:33 — `b4de00bf` — `updateTenantUser`, `compile()`-Helper, `AUTH_RECAPTCHA_SECRET_KEY`-Entry und 3 Test/Doc-Referenzen entfernt. 8 Files, -54 LOC. `pnpm lint`, `pnpm typecheck`, `pnpm test` (1890/1890) grün.