Skip to content

chore(dependabot): hold ESLint at 8.x — resolves #304 (un-mergeable)#308

Merged
kaizencycle merged 1 commit into
mainfrom
cursor/dependabot-hold-eslint-major-6011
Jun 11, 2026
Merged

chore(dependabot): hold ESLint at 8.x — resolves #304 (un-mergeable)#308
kaizencycle merged 1 commit into
mainfrom
cursor/dependabot-hold-eslint-major-6011

Conversation

@kaizencycle

Copy link
Copy Markdown
Owner

Summary

#304 (ESLint 8 → 10) cannot be merged and should be closed. This adds a
Dependabot ignore rule for ESLint semver-major bumps so it stops being
re-proposed (Dependabot auto-closes #304 once this lands).

Why #304 is un-mergeable (not just hard — blocked upstream)

ESLint 9/10 requires flat config and downstream support that does not exist
for this repo's toolchain:

Constraint Evidence Impact
eslint-config-next@14.2.35 peer eslint: ^7.23.0 || ^8.0.0 used by 55+ apps via next lint ESLint 9/10 breaks next lint fleet-wide
Even latest eslint-config-next@15.x peer caps at ^9.0.0 npm view no eslint-config-next release supports ESLint 10, at any Next version
@typescript-eslint@6 peer eslint: ^7 || ^8 repo devDeps non-Next packages also break on ESLint 9/10

So there is no configuration — not even upgrading Next.js to 15 — that makes
ESLint 10 work today. CI already proves it: #304's Core Build & Test and
Portal Validation are red.

What this PR does

Adds to .github/dependabot.yml (npm ecosystem):

    ignore:
      - dependency-name: "eslint"
        update-types:
          - "version-update:semver-major"

with a comment recording the constraint. ESLint stays at 8.x (where it's been
verified green, including in #307). Revisit when Next.js is upgraded and
eslint-config-next ships ESLint 10 support.

Follow-ups (not in this PR)

  • Close chore(deps-dev): bump eslint from 8.57.1 to 10.4.1 #304.
  • The repo is missing the dependencies (and ci) labels referenced in
    dependabot.yml — Dependabot warns it can't apply them. Worth creating them
    (I can't create labels from here).
  • If you want ESLint 9 partially (non-Next TS packages only, via
    @typescript-eslint@8 + flat config), that's a separate, scoped initiative —
    happy to plan it.

"We heal as we walk." — Mobius Systems

Open in Web Open in Cursor 

ESLint 10 (PR #304) is not installable for this repo: eslint-config-next
has no release supporting ESLint 10 (peer caps at ^9, only from v15) and is
used by 55+ Next.js apps via 'next lint'; @typescript-eslint@6 caps at
ESLint 8. Bumping would break 'next lint' fleet-wide with no upstream fix.

Adds an ignore rule for ESLint semver-major bumps so Dependabot stops
re-proposing it (and auto-closes #304). Revisit once Next.js is upgraded
and eslint-config-next ships ESLint 10 support.

EPICON-INTENT: prevent an un-mergeable, CI-breaking dependency bump from
recurring; record the toolchain constraint that blocks it.

Co-authored-by: Michael Judan <kaizencycle@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

Drift Compliance: All test vectors passed GI threshold validation

@kaizencycle kaizencycle added the consensus:approved consensus approval label Jun 11, 2026
@kaizencycle kaizencycle merged commit 6c7fc93 into main Jun 11, 2026
18 of 23 checks passed
kaizencycle added a commit that referenced this pull request Jun 11, 2026
… drift (#309)

<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
## Summary

Fixes the **recurring** `Check Catalog Freshness` failure at its root
cause,
instead of re-syncing the catalog by hand every few hours.

## Root cause

`catalog/mobius_catalog.json` stores a `content_hash` per doc under
`docs/`. Two
docs are machine-generated and committed with `[skip ci]` (which
deliberately
skips the catalog regen):

| File | Writer | Cadence |
|---|---|---|
| `docs/divergence/dashboard.md` | `mobius-divergence-dashboard.yml` |
every 6h |
| `docs/divergence/WEEKLY_DIGEST.md` | `mobius-pulse-unified.yml` |
weekly |

Each regeneration changes their content, but `[skip ci]` means the
catalog's
stored hash is never updated — so the catalog drifts and **every
subsequent PR
fails freshness through no fault of its own** (this is the loop that hit
#300#308, including this very session's PRs). Hand re-syncing the catalog
only holds
until the next 6-hourly dashboard commit.

## Fix

`scripts/exportCatalog.ts` now skips those two generated files
(`IGNORE_DOC_PATHS`). They're machine output, not catalogued
documentation, so
their churn can no longer drift the catalog. Regenerated catalog:
`docCount`
961 → 959 — **only** the two generated files removed; `OVERVIEW.md` and
every
real doc are retained.

## Why this is safe / verified

- Deterministic: CI runs the same `npm run export:catalog`, now
producing the
same 959-doc set → freshness passes and *stays* passing across dashboard
  updates.
- Verified locally with the same normalized comparison the
`catalog-check`
  workflow uses: the only delta is the two removed generated files.
- The `echo-bot` (which regenerates + commits the catalog itself) is
unaffected
  and remains in sync.

---

*"We heal as we walk." — Mobius Systems*
<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a
href="https://cursor.com/agents/bc-3a6802eb-2d2c-4043-97df-1be3b0246011"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-web-light.png"><img
alt="Open in Web" width="114" height="28"
src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a
href="https://cursor.com/background-agent?bcId=bc-3a6802eb-2d2c-4043-97df-1be3b0246011"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img
alt="Open in Cursor" width="131" height="28"
src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>
kaizencycle added a commit that referenced this pull request Jun 11, 2026
… taken, 1 corrected, 3 held) (#315)

## EPICON Intent Block

- **Intent:** Consolidate the five open Dependabot PRs (#310#314) into
one reviewable change with per-dependency judgment, per operator request
("check if they are safe to merge, if not, unify them to one big PR for
safety").
- **Scope:** `package-lock.json`, three workspace `package.json` files,
`.github/dependabot.yml` ignore rules. No workflow, canon, or attested
content touched.
- **Actor:** Claude Code under operator identity, C-339.
- **Consequence class:** Dependency hygiene — net reduction of
unreviewed major-version churn.

## Safety verdict per PR

| PR | Bump | Verdict | Disposition |
|---|---|---|---|
| #310 | `@vercel/node` 5.8.16→5.8.17 | ✅ Safe (patch, in-range of
`^5.5.15`) | **Taken** — lockfile updated |
| #312 | `@types/node` 18→**25** | ⚠️ Wrong target — repo runtime is
**Node 20** | **Taken as 18→20**: `^18.0.0`→`^20.0.0` in
`packages/atlas-sentinel`, `sentinels/atlas`, `sentinels/uriel`;
lockfile dedupes to one 20.x. Ignore rule for `@types/node >=21` |
| #311 | `hardhat-chai-matchers` 2→3 | ❌ Incompatible — requires hardhat
3; `gic-registry-contracts` pins `hardhat 2.22.5` | **Held** via ignore
rule; bump belongs in a hardhat-3 migration |
| #313 | `http-proxy-middleware` 2→4 | ❌ Two majors; v3 rewrote the
`createProxyMiddleware` API that `apps/api-gateway` uses | **Held** via
ignore rule |
| #314 | `tailwindcss` 3→4 | ❌ v4 is a CSS-first config rewrite; **8
apps** pin `^3.4.x` with `tailwind.config.js` | **Held** via ignore
rule; migrate deliberately, not via dep bump |

The ignore rules follow the repo's own precedent (#308, ESLint held at
8.x), each with a comment stating the unblock condition so they're
revisitable, not permanent.

## Lockfile diff verification

Verified the lock diff contains **only**: `@vercel/node` 5.8.16→5.8.17,
removal of nested `@types/node` 18.19.130 copies (dedupe to root
20.19.43), in-range nested 22.19.1→22.19.21 refreshes, and the
`undici-types` transitive. No major versions moved.

## After merge

Dependabot auto-closes #310#314 on its next run: #310/#312 because the
dependencies moved, #311/#313/#314 because of the ignore rules. No
manual closing needed.

**Residual risk:** the three packages whose types moved 18→20 are
type-checked in CI, not locally (worktree had no `node_modules`) — if
CI's type-check flags anything, I'll fix on this branch.

https://claude.ai/code/session_014WMkjWLnt4ezGEHujmukLk

---
_Generated by [Claude
Code](https://claude.ai/code/session_014WMkjWLnt4ezGEHujmukLk)_
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consensus:approved consensus approval

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants