Comfy-Org / Comfy-Org/ComfyUI_frontend

Five dead path literals in eslint.config.ts, .oxlintrc.json and CODEOWNERS name files that do not exist

Open
#15,622 0 comments 0 reactions 1 assignee Claimed by @christian-byrne View on GitHub
agent-ok area:CI/CD developer experience
Dominant language
TypeScript
Stars
2k
Forks
699
Avg merge
1d 7h
Merged PRs (30d)
490

Description

## Problem

Five path literals in `eslint.config.ts`, `.oxlintrc.json` and `CODEOWNERS` name files that do not
exist anywhere in the repo. A stale path in an enforcement config is a rule applied to zero files,
and on the PR page a gate covering nothing looks byte-identical to a gate that passes. Two of these
have been dead for eleven months.

Delete them. All five are provable no-ops today, so this PR is behaviour-preserving.

GitHub issue: https://github.com/Comfy-Org/ComfyUI_frontend/issues/15622. That issue also proposes
building a mechanical liveness check and re-opening a lint-coverage decision. **Both are excluded
here** — see Out of scope. This ticket is the deletion only.

## Provenance

* **Found by:** config-path-liveness sweep across ComfyUI_frontend's enforcement configs;
re-verified against `origin/main` for this ticket · 2026-08-22
* **How:** every literal below was grepped at its cited line and the path it names was checked
against `git ls-files` at `origin/main` `a08a7598aa`
* **Why now:** five one-line deletions with zero behaviour change, and the alternative is that they
keep aging
* **Lane rationale:** `agent-ok` — nothing to decide, the fenced scope is mechanical
* **Dedup identity:** `fe-dead-config-path-literals`. Linear dedupe run 2026-08-22: no existing
ticket. FE-1744 is the adjacent `src/world/` layer-zone finding and is deliberately not included
here, because its sibling half is a live design question
* **Confidence:** verified — every line opened, every path existence-checked

## Evidence

All at `origin/main` `a08a7598aa`. Left column is the literal as it appears; right column is why it
is dead.

| Site | Literal | Why dead |
| --- | --- | --- |
| `eslint.config.ts:117` | `'src/types/generatedManagerTypes.ts'` | file absent; it moved to `src/workbench/extensions/manager/types/` in #5662 |
| `.oxlintrc.json:15` | `"src/types/generatedManagerTypes.ts"` | same |
| `eslint.config.ts:118` | `'src/types/vue-shim.d.ts'` | file absent; deleted in #5852 |
| `.oxlintrc.json:16` | `"src/types/vue-shim.d.ts"` | same |
| `CODEOWNERS:15` | `/src/extensions/core/maskEditorLayerFilenames.ts` | file absent; deleted in #6308 |

Existence checks run at `a08a7598aa`:

```
absent src/types/generatedManagerTypes.ts
absent src/types/vue-shim.d.ts
absent src/extensions/core/maskEditorLayerFilenames.ts
EXISTS src/workbench/extensions/manager/types/generatedManagerTypes.ts
```

All five sit in ignore lists or ownership routing, so deleting a literal that matches no file cannot
change which files are linted or who owns what. That is what makes this safe.

One consequence worth stating plainly so nobody "fixes" it in this PR: because the
`generatedManagerTypes.ts` ignore points at the old path, the generated file **is** linted today at
its real path. Deleting the dead ignore does not change that — it is already the status quo. Whether
generated manager types *should* be linted is a separate question and is out of scope.

Recent commits: `eslint.config.ts` — benjcooley (#15175), Christian Byrne (#14472, #15300).
`.oxlintrc.json` — Alexander Brown (#15575, #15570). `CODEOWNERS` — Christian Byrne (#14068, #14879).
Note that `CODEOWNERS` blame is misleading: it was bulk-rewritten in #12590, so blame credits that
commit's author for all 38 routing lines.

## Acceptance criteria

- [ ] The five literals above are removed, and nothing else in those three files changes
- [ ] `pnpm lint` and `npx oxlint src` produce the same findings before and after. Capture both
outputs and diff them; state in the PR that the diff is empty
- [ ] `npx eslint --print-config src/main.ts` resolves the same rule set before and after
- [ ] `CODEOWNERS` still parses — GitHub validates it on push; confirm no new "unknown owner or
invalid path" annotation appears on the PR
- [ ] No new file is added, and no lint or CI configuration is added

## Out of scope

1. **Do not build the config-path liveness check.** Issue #15622 argues for it; it is a separate
piece of work with its own baseline design, and bundling it makes this PR unreviewable
2. **Do not repoint the `generatedManagerTypes.ts` ignore** at
`src/workbench/extensions/manager/types/generatedManagerTypes.ts`. That would newly exclude a file
that is linted today — a behaviour change and a decision, not cleanup
3. **Do not delete these four**, which name patterns rather than missing files and sit in arrays
whose sibling entries are live: `eslint.config.ts:270` (`'apps/*/src/**/*.tsx'`),
`eslint.config.ts:282` and `:294` (`'src/platform/remote/**/*.vue'`), `.oxlintrc.json:129`
(`"**/*.stories.vue"`), `.fallowrc.jsonc:131` (`"**/*.generated.*"`). Each currently matches zero
files, but they are forward-looking globs and removing them is a judgement call, not a no-op
4. `eslint.config.ts`'s `src/world/**` layer zone — that is
[#15583](https://github.com/Comfy-Org/ComfyUI_frontend/issues/15583) / FE-1744, which is entangled
with an open question about whether `src/systems/` should be guarded
5. Any change to which files either linter covers

## Working notes

Everything needed is above; you do not need any other context to finish this.

* Base off `main`. Do not target `feature/ecs-migration`, and do not merge anything.
* Verifying the "lint output is unchanged" criterion needs a captured baseline, because **neither
linter's exit code carries the answer**. `oxlint` exits 1 both for real errors and when every
input path is ignored; `knip`'s exit code is pinned at 1 by two pre-existing
`apps/website/*.config.ts` load errors regardless of your change. Capture the full output before
the change, diff the output after, and ignore `$?`.
* This is a pnpm workspace with **eight** `node_modules` directories. With only the root one
present, tooling fails identically at every commit, which makes a before/after diff meaningless.

---

Original issue text as filed on 2026-08-22 (superseded by the section above, preserved in full)

The body above narrows this issue to the mechanical half only: deleting the five literals that name files which do not exist. The original three-part ask is preserved below. The other two parts -- building a mechanical config-path liveness check, and deciding whether generated manager types should be linted -- are deliberately NOT part of this unit of work and remain open; see "Out of scope" above. Nothing has been deleted.

## Summary

Nine path literals across `eslint.config.ts`, `.oxlintrc.json`, `CODEOWNERS` and `.fallowrc.jsonc` name files and directories that do not exist on any live ref. None of them currently breaks a gate — this is a hygiene issue, and it is filed mainly to argue for the mechanical check that finds them, because two of these have been dead for eleven months and nothing noticed.

A stale path in an enforcement config is a rule applied to zero files. `eslint` exits 0. `oxlint` exits 0. On the PR page a gate covering nothing is byte-identical to a gate that passes.

## Evidence

Measured on `origin/main` `a2603c59a6` and `origin/feature/ecs-migration` `5002fae1b1` — identical results, so all of this is pre-existing on `main`.

Denominator: **438 path literals extracted from 109 config and check files; 29 dead.** 20 more are gitignored build artifacts, 6 resolve only under a pnpm sub-workspace, 5 are documentation placeholders — those are classified separately rather than counted as dead.

The dead literals worth fixing:

| file:line | literal | why it is dead |
| --- | --- | --- |
| `eslint.config.ts:117` | `src/types/generatedManagerTypes.ts` | moved to `src/workbench/extensions/manager/types/` in #5662 (2025-09-19) |
| `.oxlintrc.json:15` | `src/types/generatedManagerTypes.ts` | same |
| `eslint.config.ts:118` | `src/types/vue-shim.d.ts` | deleted in #5852 (2025-09-30) |
| `.oxlintrc.json:16` | `src/types/vue-shim.d.ts` | same |
| `CODEOWNERS:15` | `/src/extensions/core/maskEditorLayerFilenames.ts` | deleted in #6308 (2025-10-27) |
| `eslint.config.ts:270` | `apps/*/src/**/*.tsx` | 0 `.tsx` files in the repo |
| `eslint.config.ts:282,294` | `src/platform/remote/**/*.vue` | `src/platform/remote/` has 7 `.ts` files, 0 `.vue` |
| `.oxlintrc.json:129` | `**/*.stories.vue` | 0 `.stories.vue` files |
| `.fallowrc.jsonc:131` | `**/*.generated.*` | 0 matching files |

Each of the last four sits in an array whose sibling entries are live, so the surrounding block still applies. The first five are pure no-ops.

One of them is not neutral. The stale `generatedManagerTypes.ts` ignore means the generated file **is** being linted at its real path. Verified against the effective ESLint config (eslint 10.8.1, `ESLint#isPathIgnored`):

```
isPathIgnored YES src/types/generatedManagerTypes.ts <- the dead ignore
isPathIgnored no src/workbench/extensions/manager/types/generatedManagerTypes.ts <- the real file
isPathIgnored YES src/extensions/core/maskeditor.ts <- positive control
```

The positive control matters: `maskeditor.ts` is ignored via the live `src/extensions/core/*` pattern, so the probe is not stuck returning `no`.

Clean result worth recording alongside: **all 31 `paths:` / `paths-ignore:` trigger filters across the 12 workflows that use them are live.** That is the case where a dead path is worst — a workflow that never triggers, and a never-triggered required check reads as passing — and it is clean today.

## Suggested fix

1. Delete the five no-op literals; repoint the two `generatedManagerTypes.ts` ignores at `src/workbench/extensions/manager/types/generatedManagerTypes.ts` if generated code should stay unlinted (see 3).
2. Add a mechanical check: for every path literal in a config or check file, assert it matches at least one file. Fail on **new** dead literals only, baselining the current set, the same `new-only` shape `.fallowrc.jsonc` already uses for fallow. A working implementation with tree-derived positive and negative control arms is at `christian-byrne/ticket-to-pr-pipeline` `scripts/check-config-path-liveness.py` and runs against this repo read-only via `git ls-tree`/`git show`.
3. Decide whether generated manager types should be linted. They are today, by accident.

## Attribution note

`git blame` is not usable for this on a local clone. Local clones here are shallow (`.git/shallow` present), so every line older than the graft collapses onto `aff7f2a296` — "fix: prevent Record Audio waveform from overflowing node bounds (#8070)", 2026-01-15 — which is marked with a leading `^` that is easy to miss. Four of these literals blame to that commit locally and none of them belong to its author.

Separately, `CODEOWNERS` blame lands on `1e01c7128b6` ("chore: Add org prefix for team in CODEOWNERS", #12590), a bulk rewrite of 38/38 routing lines. `Chore: Oxfmt formatting pass` (`aa5125cef6`) has the same property and is **not** listed in `.git-blame-ignore-revs`.

True authorship, via `GET /repos/:o/:r/commits?path=`: `generatedManagerTypes.ts` moved by @christian-byrne (#5662), `vue-shim.d.ts` deleted by @webfiltered (#5852), `maskEditorLayerFilenames.ts` deleted by @jtydhr88 (#6308). Assigned to @christian-byrne as the largest share plus owner of the tooling ask; the other two are one-line deletions that can ride along.

## Related

- #15583 — the same class, but genuinely inert: the `src/world/**` layer zone. Not duplicated here.
- #15585 — the same class in the ADR-compliance automation (`src/ecs/`).
- #11091 — the uncovered inverse: 5 of 22 top-level `src/` directories appear in zero enforcement configs.
- #15535 — currently fixing a *different* silent-inertness bug in the same `src/platform/remote/**` block (flat config replaces rather than merges rule options).

Found by a config-path-liveness sweep of the ECS migration branch.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.