# Phase 13: Real Lint Gate (ESLint) - Discussion Log > **Audit trail only.** Do not use as input to planning, research, or execution agents. > Decisions are captured in CONTEXT.md — this log preserves the alternatives considered. **Date:** 2026-06-11 **Phase:** 13-real-lint-gate-eslint **Areas discussed:** Rule strictness, Existing-violation strategy, Prettier scope, Lint file coverage --- ## Rule Strictness — ruleset | Option | Description | Selected | |--------|-------------|----------| | `recommended` (non-type-aware) | Syntactic only, fast, no tsconfig wiring; misses async/promise bugs | | | `recommendedTypeChecked` | Type-aware; catches floating/misused promises + unsafe any; needs projectService, slower, more first-run violations | ✓ | | `strict`/`strictTypeChecked` | Maximal rules; heavy churn + bikeshed risk | | **User's choice:** `recommendedTypeChecked` **Notes:** Motivated by async-heavy backend (outbox/push/reminder schedulers). projectService: true. ## Rule Strictness — gate threshold | Option | Description | Selected | |--------|-------------|----------| | `--max-warnings 0` | Any warning fails CI; every rule is error-or-off | ✓ | | Errors only | Warnings surface but don't fail; softer rollout, accumulation risk | | | You decide | Pick based on first-run count | | **User's choice:** `--max-warnings 0` --- ## Existing-Violation Strategy | Option | Description | Selected | |--------|-------------|----------| | Fix all violations now | Phase green across both apps; real bugs fixed; larger phase | ✓ | | Minimal green ruleset, ratchet later | Enable only passing rules; small phase, weaker gate, deferred work | | | Baseline file (snapshot + ratchet) | Snapshot current violations as accepted; new-only fails; extra tooling | | **User's choice:** Fix all violations now **Notes:** Hard constraint added (D-13-06): fixes must address the violation, not mask it — no blanket eslint-disable, no `void` to silence floating promises; suppressions need justifying comments. --- ## Prettier Scope | Option | Description | Selected | |--------|-------------|----------| | `eslint-config-prettier` only | Disable conflicting format rules, no Prettier itself; phase stays ESLint-only | | | Add Prettier + format gate too | Full lint+format; scope creep beyond goal; reformats all files now | ✓ | | Defer Prettier entirely | ESLint only, no config-prettier; future conflict risk | | **User's choice:** Add Prettier + format gate too **Notes:** Expands ROADMAP Phase 13 goal ("ESLint only") — flagged for planning to update ROADMAP one-liner + success criteria. Follow-up decided wiring: standalone `prettier --check` + eslint-config-prettier (rejected eslint-plugin-prettier). ### Prettier wiring (follow-up) | Option | Description | Selected | |--------|-------------|----------| | Standalone + config-prettier | Separate `prettier --check` CI step + eslint-config-prettier off-switch; clean separation | ✓ | | eslint-plugin-prettier | Prettier as an ESLint rule; one gate, slower/noisier, discouraged | | **User's choice:** Standalone + eslint-config-prettier --- ## Lint File Coverage | Option | Description | Selected | |--------|-------------|----------| | All TS/TSX: src + tests + e2e + configs | Most thorough; needs projectService + config-file override; more first-run fixes | ✓ | | src/ + tests, skip configs | Simpler, configs unchecked | | | src/ only | Smallest scope; tests + e2e harness + configs unlinted | | **User's choice:** All TS/TSX (src + tests + e2e + configs) **Notes:** Config files need a non-type-checked override block (D-13-10). --- ## Claude's Discretion - Flat-config file layout (single root vs per-app) - Exact `.prettierrc` options (standard defaults) - CI step ordering within `fast-checks` ## Deferred Ideas None — Prettier was folded into scope, not deferred. Reviewed-but-not-folded: the Phase 8 Gitea-CI todo (already complete, matched on shared keywords only).