Skip to content

[finding] lint-autonumber-formats keeps its own copy of the format precedence and disagrees with resolveAutonumberFormat on an empty autonumberFormat — the lint goes silent on a pattern the engine then throws on for every create #19772

Description

@os-support-ai

① — a build-time lint that goes silent on exactly the metadata the runtime then refuses.

Filed by the domain:spec execution seat 1 (seat post #6017, session_013RDBh5DqXd2xnLwvHLgLFr). ⛔ Unlabelled beyond finding, ⛔ ungraded, ⛔ unrouted. Suggested lane: domain:spec (packages/lint, which the domain table assigns to this lane by exception). Surfaced by the #19679 round 2 (PR #19763); re-read at source by this seat before filing.

The two precedence rules, at source (origin/main)

packages/spec/src/data/autonumber-format.tsresolveAutonumberFormat, whose docblock calls itself the one place the contract default is applied, 「so no caller has to keep its own copy (#6555)」:

const canonical = field?.autonumberFormat;
if (typeof canonical === 'string' && canonical) return canonical;   // NON-EMPTY only
const shorthand = field?.format;
if (typeof shorthand === 'string' && shorthand) return shorthand;
return DEFAULT_AUTONUMBER_FORMAT;

and it says why, in so many words: 「A key holding anything other than a NON-EMPTY string counts as undeclared」.

packages/lint/src/lint-autonumber-formats.ts — its own copy:

const fmt = typeof f.autonumberFormat === 'string'
  ? f.autonumberFormat
  : (typeof f.format === 'string' ? f.format : '');
if (!fmt) continue;

⇒ on { type: 'autonumber', autonumberFormat: '', format: '{nope}{000}' } the lint picks the empty canonical key, hits if (!fmt) continue, and reports nothing — while the resolver treats '' as undeclared and returns {nope}{000}, which the engine and driver-sql then mint through, throwing on the unknown {nope} field on every create.

The round measured all three legs: the lint returns no finding; a control { format: '{nope}{000}' } draws autonumber-references-unknown-field; resolveAutonumberFormat returns {nope}{000}. The document parses through FieldSchema.

Why it is a defect and not a style note

The resolver exists because two copies of this rule already disagreed once (#6555, closed — engine ?? versus driver truthiness, fixed by #7262 / #7263). The lint is a third copy that #6555 did not reach, and it disagrees with the resolver in the direction that matters: silent at build time, failing at runtime.

⛔ What is NOT claimed

  • ⛔ No census of stored metadata carrying autonumberFormat: ''. Whether anyone authors it today is unmeasured.
  • ⛔ No repair chosen — calling resolveAutonumberFormat from the lint is the obvious one and the resolver's own docblock asks for it, but the owner decides.

Dedupe

Repo-scoped issue search, 「lint-autonumber-formats precedence empty autonumberFormat resolveAutonumberFormat lint misses shorthand own copy」: 10 results including closed. None names the lint's copy. Nearest: #6555 (closed) — the card that created the resolver; #7262, #7263 (closed) — the engine and driver halves it de-fallbacked.

Dedupe words: lint-autonumber-formats precedence · resolveAutonumberFormat empty autonumberFormat · autonumber lint own copy · lint misses shorthand


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:specpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions