Skip to content

CI-001B4 — Make frontend lint non-mutating and fail closed #186

Closed

Description

@daliu

Outcome

Complete through PR #189. Main commit: bec7d5e365eacb418563a172029f241f660d9768.

The frontend CI job no longer rewrites source or ignores lint failure. It runs a direct, blocking checker over 102 JS/JSX/TS/TSX files before application tests, then proves tracked and non-ignored untracked paths stayed clean.

Child of #105 (CI-001). Depends on #124 (closed).

Released claim

CLAIMED by /root at 2026-07-13T22:10:25Z on codex/issue-186-frontend-lint-gate. The isolated branch refreshed onto 28681ef74a8aaa1addb2c01d533442dd952e65c1, exact source commit 0bb164904fb6a8352c6141fc44ff7cd30425e750 was reviewed, and PR #189 squash-merged as bec7d5e365eacb418563a172029f241f660d9768.

The nine-path claim is released.

Verified invariant

  • The lint process disables the repository-wide eslint-plugin-only-warn effect so configured severity remains visible.
  • The reviewable baseline contains all 102 scanned files and every individual finding: 125 configured errors and 7 warnings.
  • Any added, removed, moved, or changed record rejects.
  • Fatal parser/configuration/process failures reject through one fixed message; hostile exception getters/Proxies cannot leak their text through the CLI or test harness.
  • The exact job prefix pins the GitHub-hosted runner, read-only permission, credential-free checkout, Node 20, dependency install with lifecycle scripts disabled, direct lint, and immediately adjacent clean proof.
  • Structural tests reject duplicate YAML keys, self-hosted runners, global/job/step overrides, inserted environment steps, reordered wiring, mutation, incomplete scope, and swallowed failures.
  • Ignored dependency/build paths and an operating-system sandbox remain explicitly outside this proof.

Acceptance

  • Add one explicit non-mutating lint:ci script covering frontend JS, JSX, TS, and TSX.
  • Preserve configured severities by disabling only the process-local effect of eslint-plugin-only-warn.
  • Store all 102 scanned files and all 125 configured errors plus 7 warnings as deterministic, reviewable individual records.
  • Accept only the exact reviewed records and reject fatal/malformed/missing/failed input.
  • Share one safe verification wrapper between CLI and test harness and emit only one fixed bounded rejection.
  • Replace the fail-open workflow line with direct Node lint followed immediately by the clean check.
  • Pin the runner/job/setup trust context and reject overrides or prefix changes.
  • Keep the opt-in lint:fix utility out of CI.
  • Add hostile workflow, finding, parser, exception, and dirty-checkout tests.
  • Prove exact lint success, deliberate fatal failure, hostile-exception redaction, and probe removal.
  • Run frontend, SPA, workflow, Functions, Rules, commerce emulator, build, and diff checks.
  • Update exact engineering status without claiming clean lint, branch protection, or deployment.
  • Record exact pull-request and post-merge hosted evidence.

Evidence

  • Three independent reviews: approved.
  • PR run 29291402007: all five GitHub jobs passed; exact install, lint, clean, tests, and build steps passed; Netlify disposable preview passed.
  • Post-merge run 29291515653: all five jobs passed on exact main bec7d5e365eacb418563a172029f241f660d9768, including the named lint and clean steps.

Officer impact: None — this changes an engineering quality gate and no officer task or public behavior.

Officer documentation: None — no officer procedure changes.

Deployment evidence: Source, tests, merge, hosted PR CI, disposable preview, and post-merge CI are proven. No production website publication, Firebase deployment, Stripe/provider change, branch-protection change, or production behavior occurred.

Activity

  1. self-assigned this
    on Jul 13, 2026
  2. added
    priority:P0Launch blocker or urgent security risk
    type:securitySecurity or privacy boundary
    area:ciContinuous integration and deployment
    size:SSmall focused issue
    status:in-progressClaimed and actively being implemented
    type:testingTest infrastructure and quality gates
    on Jul 13, 2026
  3. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    Claim correction before editing: the required frontend extensions are JS, JSX, TS, and TSX. Exact-base read-only lint reports 132 warnings and zero errors across those four extensions. Acceptance and excluded scope now pin ceiling 132 and explicitly forbid lint-rule weakening or application-source cleanup. The earlier 29 count covered only JS/JSX.

  4. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    Final pre-edit scope amendment: replace the count-only ceiling with an exact reviewable warning-fingerprint baseline and a dependency-free checker. Owned paths now include only .github/scripts/check-frontend-lint.cjs and .github/lint-baseline.json for that purpose. Exact 132-warning inventory: JS 2, JSX 27, TS 2, TSX 101 across 102 files. Any added, removed, or changed fingerprint must fail and require reviewed baseline movement.

  5. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    VERIFICATION PAUSED at 2026-07-13T22:19:02Z: exact origin/main and the #186 worktree both reproduce one macOS Node 20.20.2 failure in untouched functions/requestValidation.test.js. Hosted exact-main Linux CI 29288647739 passed 990/990. #186 does not own or edit that path. I am keeping the #186 claim/diff unchanged and extracting a separate test-only portability fix before PR, then will refresh #186 onto the resulting main.

  6. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    DEPENDENCY CLEARED at 2026-07-13T22:28:48Z: the unrelated macOS/Linux Node 20 baseline defect is fixed under #187/#188 at main 28681ef; post-merge CI 29289912751 passed. #186 extraction resumes after a controlled refresh onto that exact main. Its original claimed paths remain unchanged.

  7. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    EXTRACTION FINISHED — 2026-07-13T22:54:46Z

    Exact isolated source commit: 0bb164904fb6a8352c6141fc44ff7cd30425e750
    PR: #189

    The nine-path claimed slice is committed and pushed. Three independent reviews approve. Exact local Node 20 evidence includes direct lint 102 files / 125 configured errors / 7 warnings; 42/42 workflow tests; 133/133 frontend tests; 10/10 SPA tests; Functions lint plus 990 pass / 32 skipped; Rules 317/317; commerce emulator 31/31; diagnostic build; fixed fatal-parser and hostile-exception probes; and the exact post-commit clean check.

    Status remains status:in-progress until exact PR and post-merge hosted evidence pass. No website, Firebase, Stripe/provider, branch-setting, or production change has occurred.

  8. daliu commented on Jul 13, 2026

    @daliu
    ContributorAuthor

    COMPLETE / CLAIM RELEASED — 2026-07-13T22:59:04Z

    PR #189 squash-merged as exact main bec7d5e365eacb418563a172029f241f660d9768. Pull-request CI 29291402007 and post-merge CI 29291515653 passed every GitHub job; both exact frontend jobs passed lifecycle-disabled install, direct non-mutating lint, immediate clean-check proof, tests, workflow validation, and build. Three independent reviews approved.

    No production website, Firebase, Stripe/provider, or branch-setting change occurred. The nine-path claim and branch ownership are released.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:ciContinuous integration and deploymentpriority:P0Launch blocker or urgent security risksize:SSmall focused issuetype:securitySecurity or privacy boundarytype:testingTest infrastructure and quality gates

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions