Files
HiveGrid-Wireframes/hivegrid-cloud/docs/improvement-plan/01-tech-debt-foundation/dead-code.md
T

9.3 KiB

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 <sha> 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.