Problem
The @typescript-eslint/no-explicit-any rule is set to error in .eslintrc.js, and context/code-standards.md states it is "enforced by ESLint, not just documentation." It is not enforced anywhere that can block a merge.
.github/workflows/ci.yml runs three steps: npm ci, npm run build, and npm test. There is no lint step. A pull request reintroducing any passes CI cleanly.
The lint script compounds this. It is eslint "{src,apps,libs,test}/**/*.ts" --fix. Because of --fix, running it locally rewrites files rather than reporting failures, and it does not reliably exit non-zero on violations it cannot auto-fix. There is no check-only variant to call from CI.
The current state of the codebase is genuinely clean. All 32 explicit any usages were removed on 2026-07-16 and grep currently finds zero in src/. That work is unprotected. The next PR can undo it silently.
Ground Rules
This issue must be solved according to StepFi's established engineering standards. Before writing any code:
- Read context/architecture-context.md in full
- Read context/code-standards.md in full
- Read context/progress-tracker.md to understand what has already been built and why, so you do not duplicate or contradict recent work
- Read
.github/workflows/ci.yml and .eslintrc.js before changing either
- Read
.github/workflows/ci.yml in the StepFi-Web repo, which already runs npm run lint in CI, and match that approach so the two repos stay consistent
Your PR will be rejected regardless of whether CI passes if it conflicts with anything in these files, introduces patterns inconsistent with what already exists, or duplicates functionality that was solved differently elsewhere in the codebase.
What To Build
- Add a
lint:check script to package.json: eslint "{src,apps,libs,test}/**/*.ts" --max-warnings=0. No --fix. This is the CI entry point.
- Keep the existing
lint script with --fix for local developer use. Do not remove it. Developers rely on it.
- Add a
Lint step to the build-test job in .github/workflows/ci.yml, running npm run lint:check. Place it after Install dependencies and before Build, so a lint failure reports quickly.
- Confirm the step actually fails the build. Temporarily introduce an
any, push, and verify CI goes red. Include that evidence in the PR description. A lint step that silently passes is worse than none, because it creates false confidence.
- Do not add new rules or change rule severities in this PR. Scope is enforcement of the existing configuration only. Rule changes belong in their own issue with their own review.
- If
lint:check surfaces pre-existing violations in test/ that the *.spec.ts override does not already exempt, fix them in this PR rather than weakening the rule or widening the override.
Files To Touch
package.json
.github/workflows/ci.yml
Acceptance Criteria
Mandatory Checks Before Opening PR
PRs that fail any check above will be closed without review, regardless of how much work went into them. No exceptions. This is a Grantfox-funded, quality-first project. Code that does not meet these standards will not be merged and will not be paid.
Problem
The
@typescript-eslint/no-explicit-anyrule is set toerrorin.eslintrc.js, andcontext/code-standards.mdstates it is "enforced by ESLint, not just documentation." It is not enforced anywhere that can block a merge..github/workflows/ci.ymlruns three steps:npm ci,npm run build, andnpm test. There is no lint step. A pull request reintroducinganypasses CI cleanly.The
lintscript compounds this. It iseslint "{src,apps,libs,test}/**/*.ts" --fix. Because of--fix, running it locally rewrites files rather than reporting failures, and it does not reliably exit non-zero on violations it cannot auto-fix. There is no check-only variant to call from CI.The current state of the codebase is genuinely clean. All 32 explicit
anyusages were removed on 2026-07-16 andgrepcurrently finds zero insrc/. That work is unprotected. The next PR can undo it silently.Ground Rules
This issue must be solved according to StepFi's established engineering standards. Before writing any code:
.github/workflows/ci.ymland.eslintrc.jsbefore changing either.github/workflows/ci.ymlin the StepFi-Web repo, which already runsnpm run lintin CI, and match that approach so the two repos stay consistentYour PR will be rejected regardless of whether CI passes if it conflicts with anything in these files, introduces patterns inconsistent with what already exists, or duplicates functionality that was solved differently elsewhere in the codebase.
What To Build
lint:checkscript topackage.json:eslint "{src,apps,libs,test}/**/*.ts" --max-warnings=0. No--fix. This is the CI entry point.lintscript with--fixfor local developer use. Do not remove it. Developers rely on it.Lintstep to thebuild-testjob in.github/workflows/ci.yml, runningnpm run lint:check. Place it afterInstall dependenciesand beforeBuild, so a lint failure reports quickly.any, push, and verify CI goes red. Include that evidence in the PR description. A lint step that silently passes is worse than none, because it creates false confidence.lint:checksurfaces pre-existing violations intest/that the*.spec.tsoverride does not already exempt, fix them in this PR rather than weakening the rule or widening the override.Files To Touch
package.json.github/workflows/ci.ymlAcceptance Criteria
npm run lint:checkexits non-zero when an explicitanyis present insrc/npm run lint:checkdoes not modify any filelint:checkon every pull request tomainanyinsrc/fails CI, demonstrated in the PR descriptionlintscript with--fixstill works for local useMandatory Checks Before Opening PR
npm run build)anytypesPRs that fail any check above will be closed without review, regardless of how much work went into them. No exceptions. This is a Grantfox-funded, quality-first project. Code that does not meet these standards will not be merged and will not be paid.