Repository navigation
Commit 63d5db2
fix(lint): one-line fix lines for 17 more author-time rule ids;
Part of #22161
Clause-②: no
Stage 2 of the card, slice 14: the over-long `fix:` lines, continued in
slices 11 to 13's shape. Each finding's `hint` (the CLI's `fix:` line,
the runtime issue's `hint`) of 17 more `packages/lint` rule ids, in nine
rule files, is now one remedy line of at most 200 characters, and what
the lines used to explain is each id's `RULE_EXPLANATIONS` entry behind
`os explain RULE_ID`. The card stays open: 58 author-time ids still
carry a hint over 200 characters (the last section).
## What changes
- **One remedy line per finding.** The 17 ids, every hint the lint suite
fires, before → after (count of distinct hints · length range):
| rule id | file | lint suite, before → after | runtime door |
|---|---|---|---|
| `searchable-field-unknown` | `validate-searchable-fields.ts` | 16 ·
238–448 → 10 · 47–129 | `view` / `object` write, 422 |
| `searchable-field-unprovisioned` | same | 2 · 361–362 → 2 · 174–175 |
`view` / `object` write, 2xx advisory |
| `searchable-field-unsearchable` | same | 11 · 143–328 → 10 · 69–139 |
`view` / `object` write, 422 |
| `flow-filter-token-unknown` | `validate-flow-filter-tokens.ts` | 5 ·
100–427 → 5 · 91–182 | `flow` write, 422 |
| `action-no-placement` | `validate-action-locations.ts` | 1 · 424 → 1 ·
171 | CLI only |
| `mapping-target-field-unknown` | `validate-mapping-target-fields.ts` |
5 · 189–405 → 3 · 61–189 | CLI only |
| `unconsumed-widget-option` | `validate-dashboard-widget-options.ts` |
1 · 396 → 1 · 135 | CLI only |
| `sort-field-unprovisioned` | `validate-sortable-fields.ts` | 5 ·
371–378 → 5 · 184–191 | `view` write, 2xx advisory |
| `sort-field-unsortable` | same | 5 · 312–332 → 5 · 134–154 | `view`
write, 422 |
| `sort-field-unknown` | same | 8 · 88–301 → 8 · 47–142 | `view` write,
422 |
| `visibility-predicate-unknown-function` |
`validate-visibility-predicates.ts` | 7 · 360–375 → 1 · 165 | `view`
write, 422 |
| `visibility-bare-identifier` | same | 21 · 101–221 → 21 · 37–102 |
`view` write, 422 |
| `visibility-predicate-syntax` | same | 8 · 97–214 → 8 · 97–113 |
`view` write, 422 |
| `nav-object-ungranted` | `validate-nav-access.ts` | 3 · 362–370 → 3 ·
110–118 | CLI only |
| `hook-body-write-unprovisioned-anchor` |
`validate-hook-body-writes.ts` | 2 · 358–365 → 2 · 171–178 | CLI only |
| `hook-body-write-unknown-field` | same | 11 · 216–275 → 11 · 51–110 |
CLI only |
| `hook-body-source-unparseable` | same | 1 · 254 → 1 · 105 | CLI only |
A count that falls is a line that stopped interpolating something: the
unknown-function line no longer repeats the function's name (the verdict
names it), and the searchable / mapping lines no longer list the
object's fields.
- **The reasoning moves, the remedy stays.**
- The three search ids: why a stale or inadmissible entry is a `400
INVALID_FIELD` on list search (the `$searchFields` echo), that a view
narrows the object's set and never widens it (ADR-0061), that a lookup
column stores only an id, and that declaring the object's own set
chooses it explicitly are the explanations'.
- The three sort ids: that both runtime doors refuse a formula sort with
`400 INVALID_SORT` is the explanation's; the remedy lines are unchanged
in substance.
- The three unprovisioned-anchor ids (`searchable-field-unprovisioned`,
`sort-field-unprovisioned`, `hook-body-write-unprovisioned-anchor`): the
line names the three ways out (declare the column, drop the reference,
opt out of the injection); how (`columnMap`, `ownership: 'none'`,
`systemFields: { audit: false }`) is one shared paragraph,
`UNPROVISIONED_ANCHOR_REMEDY`, in each of the three entries.
- `flow-filter-token-unknown`: the line names the value functions (as
the run-time refusal does) and the placeholder alternative; the two
vocabularies in full are the explanation's (already held to the
grammar's constants by the rule's test).
- The three visibility ids: the other-language spellings CEL does not
parse, why re-spelling cannot fix an unregistered name, and which
namespaces each surface binds are the explanations'. The
unknown-function line still says NAME fault and still offers no
suggestion (the ruling's refinement 2 and the cases pinning it are
untouched).
- `nav-object-ungranted`: why `requiredPermissions` / `visible` do not
clear it, and when a grant from another installed package makes it moot,
are the explanation's.
- The hook-body ids: which write shapes are checked
(`HOOK_BODY_WRITE_PATTERNS`) and that the warning never blocks a build
are a new paragraph of the unknown-field entry; what a partially parsed
body leaves unchecked was already the unparseable entry's.
- **A list the verdict already covers is not echoed.**
`searchable-field-unknown`, `sort-field-unknown` and
`mapping-target-field-unknown` listed every field of the object; the
verdict's "Did you mean" names the near miss.
`mapping-target-field-unknown` keeps the compound fields and their parts
on every line: the ruling on #20149 (item 3) is that every
import-mapping refusal lists the legal parts, and the import door's own
refusal does.
- **Two ids gain an explanation entry**, because their reasoning had no
entry to move into: `action-no-placement` ("where an action can be
placed"; the location list is held to the spec's `ACTION_LOCATIONS` by
the rule's test) and `unconsumed-widget-option` ("which widget options a
renderer reads"). Their `rule:` line now ends with the `os explain`
pointer. `unconsumed-widget-option` is `@objectstack/sdui-parser`'s
diagnostic code, which `validate-dashboard-widget-options.ts` forwards
unchanged, so the table's id test (`rule-explanations.test.ts`) and the
CLI's (`explain-rule-id.test.ts`) count it as a lint-produced id the way
they already count the functional-completeness ids: lint's test imports
`UNCONSUMED_WIDGET_OPTION`, and the CLI's (which does not depend on
sdui-parser) fires it from `validateDashboardWidgetOptions`. No name is
added to the barrel.
- **Two shared one-line forms, beside the long ones (a file-surface
amendment, below).** Four of the 17 hints were not written in their rule
files: `searchable-field-unprovisioned`, `sort-field-unprovisioned` and
`hook-body-write-unprovisioned-anchor` print `unprovisionedAnchorHint()`
(`system-fields.ts`), and `hook-body-source-unparseable` prints
`PARSE_FAILURE_HINT` (`checked-parse.ts`). Each gains a short sibling,
`unprovisionedAnchorFix()` and `PARSE_FAILURE_FIX`, in the pattern slice
2 set with `unprovisionedAnchorVerdict()`: the converted ids use the
short form, and the long form keeps its other callers
(`dashboard-filter-field-unprovisioned`,
`react-chart-field-unprovisioned`, `flow-template-field-unprovisioned`,
`page-field-unprovisioned`, the action-body and flow-node anchor ids;
`action-body-source-unparseable`, `react-page-source-unparseable`,
`startup-source-unparseable`) byte-identical until their slices converge
them. Neither new name is on a published entry: `index.ts` re-exports
`checked-parse.ts` by name and `system-fields.ts` not at all.
- **Nothing else moves.** Every `message`, rule id, severity and `path`,
and what each rule accepts or refuses, is unchanged: every hunk in the
eleven source files is a `hint` expression, a comment, the two additive
short forms, or an import swapped to them (`listNames` drops out of
`validate-mapping-target-fields.ts` with the roster). No condition,
branch, skip or dedupe moved.
- `.changeset/22161-lint-slice-14-one-line-fix.md`: `@objectstack/lint`
`patch`, `Clause-②: no`, with the runtime `hint` FROM → TO for every id
that fires at the runtime gate.
### File surface: the claim's, plus two declared amendments
The claim (`6127894761`) names the nine rule files,
`rule-explanations.ts`, a text-only test rider in `packages/cli` /
`packages/metadata-protocol` and the changeset. The dispatch's
instruction for a producer outside that list is "fix it at the producer
and say where and why". Where it went beyond the list:
- `system-fields.ts` and `checked-parse.ts`: the additive short forms
above. Editing the long forms instead would have changed the hints of
nine ids outside this slice, two of them in files this slice may not
touch (`validate-flow-template-paths.ts`, which open PR #23062 edits,
and `validate-widget-bindings.ts`, left for a whole-file slice);
inlining a copy in each rule file would have forked one remedy into
three spellings, which is the drift both modules exist to prevent. No
open PR touches either file.
- Test riders: `validate-react-page-props.test.ts` (one text pin on the
shared searchable core's `fix:` line, which now reads `'Fix the name, or
add "email" to crm_account.fields'`), `rule-explanations.test.ts` (the
forwarded id above) and `packages/cli/test/explain-rule-id.test.ts` (the
same id, fired from its producer; not text-only, one statement).
`packages/metadata-protocol` needed nothing.
## The runtime wire
Measured at the door with `runRuntimeAuthoringRules` on the base dist
and on the rebuilt one (a scratch probe, 32 writes across `view`,
`object`, `flow`, `hook`, `action`, `dashboard`, `app`, `mapping` and
`page`):
- a `view` write: `sort-field-unknown` (422 `issues[].hint`, a name / a
dotted path 114 / 261 → 47 / 135), `sort-field-unsortable` (422, 318 →
140), `sort-field-unprovisioned` (2xx `advisories[].hint`, 363 → 176),
`searchable-field-unknown` (422, 281 / 430 → 48 / 129),
`searchable-field-unsearchable` (422, a formula / outside the declared
set / a lookup / a json column 222 / 142 / 323 / 157 → 110 / 68 / 135 /
64), `searchable-field-unprovisioned` (2xx advisory, 361 → 174),
`visibility-predicate-syntax` (422, a recognised spelling / none 106 /
214 → 106 / 107), `visibility-predicate-unknown-function` (422, 371 →
165) and `visibility-bare-identifier` (422, a bare name / an unbound
namespace 160 / 215 → 41 / 96);
- an `object` write: `searchable-field-unknown` (422, the object's own
set / a built-in list view 266 / 261 → 55 / 50),
`searchable-field-unsearchable` (422, 222 → 110) and
`searchable-field-unprovisioned` (2xx advisory, 361 → 174);
- a `flow` write: `flow-filter-token-unknown` (422, `{TOMORROW()}` /
`{ROUND(x)}` / `{Math.round(x)}` / `{TODAY() - 45 - 10}` 336 / 358 / 427
/ 100 → 91 / 113 / 182 / 100);
- no write reaches `action-no-placement`,
`mapping-target-field-unknown`, `unconsumed-widget-option`,
`nav-object-ungranted` or the three `hook-body-*` ids: the first three
are registered with no `runtimeTypes`, and the other four are
reference-suite members on the frozen `flow` default whose collections a
flow snapshot does not carry. A sort declared on an object write's own
`listViews` does not reach either (`validateSortableFields` runs for
`flow` and `view` only); only its search half does.
Readers of `hint`, read-only against objectui `main` at `5dcb101c`
(fetched into a ref of its own, `git grep` for `.hint` reads and
destructured `hint`, ref deleted after): Studio's `saveAdvisoryToast.ts`
`formatFinding` renders `[rule] where — message hint` for every 2xx
advisory, so the two `*-unprovisioned` toasts shorten;
`DraftChangesPanel.tsx` reads `hint` only for its in-browser
security-posture pass (none of these ids). No objectui source reads a
422 issue's `hint`. REST (`PUT /api/v1/meta`) forwards `issues` /
`advisories` as JSON (`toIssue` copies `hint` verbatim); `packages/mcp`
registers no metadata write tool, so an MCP or AI author reaches the
gate through REST. **No reader in either repository matches on `hint`
text.** `check:watch-hint-literal` guards something else of the same
name and ran in the gate set (below).
## Census (taken first, before any edit, at the base `c5b43b606`)
Method: the earlier slices' scratch preload (`NODE_OPTIONS=--import`,
never committed) patching `Array.prototype.push` to record every
finding-shaped object, deduped by (rule, hint) per process, with its
push site, appended per new key. Lengths are the `hint` alone.
- **`packages/lint` suite**: the 17 ids re-measured at the base equal
the claim's lengths exactly (448, 362, 328, 427, 424, 405, 396, 378,
332, 301, 375, 221, 214, 370, 365, 275, 254). Base: 239 ids fire, 97
over 200 = 21 fenced + 3 repo-gate + 73 author-time. After, at the final
head `bea1fb15f`: 240 ids fire, 82 over 200 = 21 fenced + 3 repo-gate +
58 author-time, and every hint of the 17 is at most 200 (the table). The
58 are the base's 73 less these 17, plus two ids `main` brought over 200
while this slice was open (`page-section-count-not-multi-value` 228 and
`page-field-unknown` 206, `validate-page-field-bindings.ts`, #23080);
`lint-flow-patterns.ts`'s two grew with #23062.
- **Runtime publish gate**, the whole `@objectstack/metadata-protocol`
suite (which reads `@objectstack/lint` from source), in a base worktree
and at the branch: `searchable-field-unknown` 253 → 51 and
`sort-field-unknown` 101 → 55 at the door; `action-no-placement` 424 →
171 fires only inside `protocol.runtime-authoring-gate.test.ts`'s
comparison against `runAuthoringRules('build', …)`, the CLI tier, never
at the door.
- **`packages/cli` unit tier** (283 files, after): `action-no-placement`
(171) and `hook-body-write-unknown-field` (87; the removed caveat was
165 characters, so 252 before, derived) fire. Not run before the edit:
the slot was spent on the base `os validate` and metadata-protocol runs
(see Tests).
- **`os validate`** (the built CLI) on `app-crm`, `app-todo`,
`app-showcase`, `app-multi-package`, exit 0 each, base worktree and
branch: none of the 17 fires; each prints the same 9 / 7 / 70 / 3
`rule:` lines, and the output is byte-identical once the worktree path
and the millisecond timings (`Load time`, `Validation passed (…ms)`) are
normalised — those are the only differing lines.
## Tests
Every heavy run went through `scripts/pm/os-verify-lock.sh` (slots
`issue-22161-s14`, `issue-22161-s14-base`); its VERDICT lines are in the
report.
- **Each rule's own suite pins the new shape.** A new last block per
test file holds every recorded `fix:` line of its converted ids to one
line of at most 200 characters behind a coverage control naming each arm
(both unknown arms and the four unsearchable arms of the search rule;
both unknown arms, the formula and the anchor of the sort rule; the
date, plain, suggestion and method-call arms of the flow filter line;
the mapping line with and without compound parts and the collision; the
syntax line with and without a recognised spelling, the unknown
function, both bare-identifier arms on both layers; the hook
unknown-field line with and without a suggestion), plus a check per id
that `explainRule(id)` holds what the line stopped saying. Two files
gained a recorder (`validate-action-locations.test.ts`,
`validate-dashboard-widget-options.test.ts`), and four recorders now
keep `hint` beside `message`. Pins that read the old hint text moved to
the explanation, text-only (the searchable `400 INVALID_FIELD` pins, the
sortable `400 INVALID_SORT` pin, the mapping part-list pin's wording).
New pins hold an explanation's spelled-out list to its source: the
action locations to `ACTION_LOCATIONS`, and the value functions on the
flow filter line to `FLOW_TEMPLATE_VALUE_FUNCTIONS`.
- **Lint suite** at `bea1fb15f`: Test Files 137 passed (137), Tests
6,614 passed (6,614); VERDICT command-exit 0 (6,569 at the base).
- **Lint build + typecheck** at `bea1fb15f`: `pnpm turbo run build
--filter=@objectstack/lint...` (4 tasks; lint's build script runs
`check-dts-emitted`) and `pnpm --filter @objectstack/lint run typecheck`
(`tsc --noEmit` + `check:test-typecheck` OK, 2 files / 6 errors / 2
pinned signatures held), VERDICT command-exit 0 each. The rebuilt dist
carries the new text (`If the remote table carries '` and `until the
source parses` 1 hit each in `index.js`, `index.cjs`, `runtime.js`,
`runtime.cjs`; `where an action can be placed` in `index` and
`rule-explanations`; the old `Flow filter values resolve in two
vocabularies` 0).
- **The built entries' export closure is unchanged** (Clause-② check):
the runtime export keys and the declaration exports of `index`,
`runtime` and `rule-explanations`, read from the base dist and from the
rebuilt one, are identical — 370 / 552, 6 / 11 and 2 / 3 names, 0 added
and 0 removed; at the final head against current `main` (`968acc895`,
which adds one name of its own) 371 / 553, 6 / 11 and 2 / 3, again 0
added and 0 removed.
- **CLI unit tier** on the branch before the merge: Test Files 1 failed,
282 passed (283), Tests 1 failed, 4,269 passed — the one failure was
`explain-rule-id.test.ts` counting the new `unconsumed-widget-option`
entry as a CLI-produced id, fixed by the rider above; that file at
`bea1fb15f`: Test Files 1 passed (1), Tests 14 passed (14), VERDICT
command-exit 0.
- **metadata-protocol suite**, base worktree and branch: Test Files 227
passed, 3 skipped (230), Tests 28,192 passed, 19 skipped, VERDICT
command-exit 0 both.
- **Ablation** (one-shot, from the committed head `bea1fb15f`, through
`scripts/ablation-replace.mjs` under the lock, with a shell `trap`
restoring `HEAD` by absolute path; the rule suite imports the rule
source, so there is no dist leg): `nav-object-ungranted`'s pre-slice
370-character hint restored as one literal. Predicted before the run:
exactly the new bound pin in `validate-nav-access.test.ts` goes red,
every other case stays green. Observed:
`src/validate-nav-access.test.ts` Tests 1 failed, 20 passed (21),
exactly that pin, printing the old line. The mutation landed (anchor x1
→ x0, blob `8a92bc4eeb61` → `098d3d76f9fe`) and was restored (blob
`8a92bc4eeb61` == HEAD, `git diff HEAD` empty, `git status --porcelain`
empty). Run at `51e2ab6b3`; the rule file and its test have the same
blobs at the final head.
- **ESLint, narrowed:** `npx eslint --no-inline-config --format json`
over the 23 changed `.ts` files of `packages/lint` (and the CLI test, 24
files at the final head): 0 errors, 0 warnings. The population is
`eslint.config.mjs`'s `**/*.{ts,…}` block plus its `packages/**` blocks;
the config never enables type-aware linting (no
`parserOptions.project`), so no untouched file's verdict can move. A
control-character scan of every changed file found no match.
- **Gates:** one merge of `origin/main` through
`scripts/pm/os-regen-merge.sh` (`3c7949b66` → `51e2ab6b3`, onto
`0aef78881`; no conflict, and the branch edits no generated artifact;
main brought `packages/spec`, `packages/cli` and
`packages/metadata-protocol` changes and no `packages/lint` file). A
second merge followed when #23062 (the open PR the claim named) landed:
`bea1fb15f`, onto `968acc895`, no conflict; it touches `packages/lint`
but none of this slice's files. `node scripts/pm/dispatch-gates.mjs
--commands --repo objectstack-ai/objectstack` with no paths at the final
head `bea1fb15f` (25 paths vs the merge base `968acc895`) derived 63
commands; 62 ran, each exit code captured before any pipe, all 0
(longest: `check:query-options-erasure` 305s, `check:slot-lookup` 163s,
`check-comment-mask-corpus` 123s). `check:dual-build-cjs-loads` first
refused (exit 3, PREREQUISITE NOT MET: six packages had no dist); after
building those six with their closure under the lock (56 tasks, VERDICT
command-exit 0) it ran, exit 0 (107 entry points across 66 packages).
NOT MEASURED, by the dispatch's order: `check:type-check-debt`. `--ran`:
`Run reconciliation — 63 derived, 62 run, 1 NOT-MEASURED, 0 UNRUN.`
`origin/main` moved two commits after the second merge (`051134140`,
`6662e3f59`: the REST openapi document and `AppPlugin`), touching no
file of this slice; not merged again. The artifact-roster and PR-context
families are CI's.
## Acceptance notes
- **A long name can still lengthen a line.** The bound holds on every
variant the suites, the runtime probe and the four example apps fire;
the names in a hint (the object and field of the search, sort and anchor
lines, the nav entry's object) are the author's. The closest measured
case is `sort-field-unprovisioned` at 191 (`showcase_ext_customer` /
`created_at`). A hook with several target objects joins them into the
anchor line's object name, as before.
- **The mapping line keeps the parts list.** An object with two compound
fields prints both fields' parts, about 80 characters each; no suite,
probe or example app fires that shape. The ruling on #20149 (item 3)
puts the parts on every refusal, and this slice does not re-rule it.
- **The field rosters now print nowhere.** A near miss gets the
verdict's "Did you mean"; a far miss gets none, where it used to get
every field of the object. Slices 11 to 13 made the same call for their
lists.
- **Two `rule:` lines gain the `os explain` pointer**
(`action-no-placement`, `unconsumed-widget-option`), through the new
entries. That is the printer's own rule for an id the table holds, not a
printer change.
- **The long forms stay for their other callers.**
`unprovisionedAnchorHint()` keeps six ids outside this slice and
`PARSE_FAILURE_HINT` three (of those nine, two are fenced ids, one is a
repo-gate id and six are on the remaining list); each converges on the
short form when its slice comes, as `unprovisionedAnchorVerdict()` did
for the verdicts.
## Remaining for this card
**58 author-time `packages/lint` ids still carry a hint over 200
characters** in the final lint census (at `bea1fb15f`: 82 over 200 = 58
+ 21 fenced + 3 repo-gate), by file, longest first:
- `lint-flow-patterns.ts` (2): `flow-double-brace-interpolation` 1413,
`flow-bare-dollar-reference` 1234
- `data-model-rules.ts` (6): `unique/legacy-organization-composite` 578,
`unique/unscoped-declared-index` 380, `object/missing-name-field` 327,
`rollup/non-numeric-aggregand` 282, `unique/double-declaration` 279,
`field/select-missing-options` 207
- `validate-widget-bindings.ts` (11):
`dashboard-filter-field-unprovisioned` 561, `chart-field-unknown` 415,
`dashboard-filter-field-unknown` 403, `chart-measures-missing` 369,
`widget-legacy-analytics-shape` 338, `widget-measures-missing` 330,
`widget-filter-field-unknown` 322,
`widget-legacy-analytics-unrenderable` 320, `table-count-only` 311,
`chart-dimensions-missing` 291, `dashboard-filter-field-not-included`
218
- `validate-ai-agent-authoring.ts` (2): `agent-authoring-withdrawn` 363,
`default-agent-outside-roster` 237
- `validate-react-page-props.ts` (4): `react-chart-field-unprovisioned`
362, `react-prop-missing-required` 277, `react-page-source-unparseable`
254, `react-block-needs-record-context` 228
- `validate-translatable-sections.ts` (1):
`translation-section-name-missing` 359
- `validate-action-body-writes.ts` (4):
`action-body-write-unprovisioned-anchor` 358,
`action-body-write-unknown-field` 323, `action-record-write-discarded`
309, `action-body-source-unparseable` 254
- `validate-flow-node-writes.ts` (2):
`flow-node-write-unprovisioned-anchor` 358,
`flow-node-write-unknown-field` 289
- `validate-managed-api-methods.ts` (1):
`object/managed-api-method-unaffordable` 357
- `validate-nav-object-servability.ts` (1): `nav-object-unservable` 348
- `validate-rule-compilability.ts` (2):
`validation-rule-json-schema-uncompilable` 341,
`validation-rule-regex-uncompilable` 300
- `validate-dataset-references.ts` (2): `dataset-include-unknown` 336,
`dataset-field-unknown` 206
- `validate-translation-references.ts` (1): `translation-target-unknown`
317
- `validate-approval-approvers.ts` (3):
`approval-approver-not-membership-tier` 313,
`approval-expression-no-empty-policy` 294, `approval-expression-invalid`
292
- `validate-seed-replay-safety.ts` (1):
`seed-insert-mode-duplicates-on-replay` 309
- `validate-chart-bindings.ts` (1): `chart-measure-unknown` 285
- `validate-object-field-refs.ts` (1): `object-field-ref-unknown` 284
- `validate-capability-references.ts` (1):
`capability-reference-unknown` 273
- `validate-record-title.ts` (2): `title-format-retired` 267,
`title-unresolvable` 237
- `validate-list-view-field-refs.ts` (2): `list-view-field-unknown` 258,
`list-view-field-dotted` 233
- `validate-view-containers.ts` (1): `view-container-shape` 256
- `validate-seed-state-machine.ts` (1):
`seed-value-outside-state-machine` 251
- `validate-ai-surface-affinity.ts` (1): `ai-skill-surface-mismatch` 235
- `validate-page-source-styling.ts` (1):
`page-source-className-tailwind` 231
- `lint-liveness-properties.ts` (1): `liveness-planned-property` 230
- `validate-page-field-bindings.ts` (2):
`page-section-count-not-multi-value` 228, `page-field-unknown` 206
- `validate-list-view-mode.ts` (1): `list-view-filters-in-views-mode`
219
Not in the 58: the 26 fenced ids as PR #22448 lists them (21 fire a hint
over 200), the 3 repo-gate ids (`startup-open-vocabulary-verdict`,
`startup-source-unparseable`, `startup-verdict-assertive-wording`), and
the `packages/cli` ids on #22841.
---
_Generated by [Claude
Code](https://claude.ai/code/session_019G5ZnRrTMiwcHG6iZM19zf)_
---------
Co-authored-by: Claude <noreply@anthropic.com>os explain RULE_ID carries what they explained (#23097)1 parent 2d21b9c commit 63d5db2
25 files changed
Lines changed: 574 additions & 118 deletions
File tree
- .changeset
- packages
- cli/test
- lint/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
343 | 343 | | |
344 | 344 | | |
345 | 345 | | |
346 | | - | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
347 | 357 | | |
348 | 358 | | |
349 | 359 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
| 26 | + | |
| 27 | + | |
25 | 28 | | |
26 | 29 | | |
27 | | - | |
| 30 | + | |
28 | 31 | | |
29 | 32 | | |
30 | 33 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
380 | 380 | | |
381 | 381 | | |
382 | 382 | | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
383 | 396 | | |
384 | 397 | | |
385 | 398 | | |
| |||
894 | 907 | | |
895 | 908 | | |
896 | 909 | | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
897 | 914 | | |
898 | 915 | | |
899 | 916 | | |
| |||
906 | 923 | | |
907 | 924 | | |
908 | 925 | | |
| 926 | + | |
909 | 927 | | |
910 | 928 | | |
911 | 929 | | |
| |||
2015 | 2033 | | |
2016 | 2034 | | |
2017 | 2035 | | |
| 2036 | + | |
2018 | 2037 | | |
2019 | 2038 | | |
2020 | 2039 | | |
| |||
2046 | 2065 | | |
2047 | 2066 | | |
2048 | 2067 | | |
2049 | | - | |
| 2068 | + | |
| 2069 | + | |
| 2070 | + | |
| 2071 | + | |
2050 | 2072 | | |
2051 | | - | |
| 2073 | + | |
| 2074 | + | |
2052 | 2075 | | |
2053 | 2076 | | |
2054 | 2077 | | |
| |||
2071 | 2094 | | |
2072 | 2095 | | |
2073 | 2096 | | |
| 2097 | + | |
2074 | 2098 | | |
2075 | 2099 | | |
2076 | 2100 | | |
| |||
3602 | 3626 | | |
3603 | 3627 | | |
3604 | 3628 | | |
| 3629 | + | |
| 3630 | + | |
| 3631 | + | |
| 3632 | + | |
| 3633 | + | |
| 3634 | + | |
| 3635 | + | |
| 3636 | + | |
| 3637 | + | |
| 3638 | + | |
| 3639 | + | |
| 3640 | + | |
| 3641 | + | |
| 3642 | + | |
| 3643 | + | |
| 3644 | + | |
| 3645 | + | |
| 3646 | + | |
| 3647 | + | |
| 3648 | + | |
| 3649 | + | |
| 3650 | + | |
| 3651 | + | |
| 3652 | + | |
| 3653 | + | |
| 3654 | + | |
| 3655 | + | |
| 3656 | + | |
| 3657 | + | |
| 3658 | + | |
| 3659 | + | |
| 3660 | + | |
| 3661 | + | |
| 3662 | + | |
| 3663 | + | |
| 3664 | + | |
| 3665 | + | |
| 3666 | + | |
| 3667 | + | |
| 3668 | + | |
| 3669 | + | |
| 3670 | + | |
| 3671 | + | |
| 3672 | + | |
| 3673 | + | |
| 3674 | + | |
| 3675 | + | |
| 3676 | + | |
| 3677 | + | |
| 3678 | + | |
| 3679 | + | |
3605 | 3680 | | |
3606 | 3681 | | |
3607 | 3682 | | |
| |||
3922 | 3997 | | |
3923 | 3998 | | |
3924 | 3999 | | |
| 4000 | + | |
| 4001 | + | |
3925 | 4002 | | |
3926 | 4003 | | |
3927 | 4004 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
235 | 235 | | |
236 | 236 | | |
237 | 237 | | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
0 commit comments