Skip to content

Commit dc6a2fe

Browse files
committed
docs(lint): re-anchor dead tracker citations in packages/lint/src to the commits that decided them
Comment and docblock lines in 22 packages/lint/src files that cited a tracker number answering 404 now cite, in ruling C+D's form C, the commit in this repository's history that decided what the line describes, and say in words what was decided. Comments only: 81 lines out, 81 in; no code token, string, message or hint moves. authoring-rules.ts is left at its base blob while an open PR holds it. Claude-Session: https://claude.ai/code/session_014EJ1ED8X4MMrT18BhVx4tx Co-authored-by: Claude <noreply@anthropic.com>
1 parent 7a1faf1 commit dc6a2fe

22 files changed

Lines changed: 81 additions & 81 deletions

‎packages/lint/src/data-model-rules.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export interface LintIssue {
6161
* runtime gate's `fingerprint` reads `where` and `path` together (making
6262
* `where` more specific cannot merge two findings that were distinct).
6363
*
64-
* [#10064] On the runtime gate's WIRE surface (`RuntimeAuthoringIssue.path`,
64+
* [commit def0d3e63] On the runtime gate's WIRE surface (`RuntimeAuthoringIssue.path`,
6565
* the 422 `issues[]` / 2xx `advisories`), the top-level collection index of a
6666
* collection-resident finding is rewritten to the entry's NAME
6767
* (`objects[417].sharingModel` → `objects.acme_invoice.sharingModel`) after

‎packages/lint/src/flow-template-grammar.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
* - `NOW()` / `TODAY()` with an optional `± N` day offset — closed, two names.
3232
* - `$User.<path>` — closed prefix.
3333
* - `round` / `floor` / `ceil` / `abs` / `min` / `max` in CALL position —
34-
* closed by maintainer ruling on #11060 ("exactly … every name and semantic
34+
* closed by the maintainer ruling commit 815585513 records ("exactly … every name and semantic
3535
* mirrored **1:1 from the CEL stdlib**, ⛔ no second semantics invented").
3636
* - a bare or dotted identifier (`{recordId}`, `{record.id}`, `{status}`) —
3737
* **OPEN**: it addresses the run's `VariableMap`, which holds the flow's
@@ -101,7 +101,7 @@ export const FLOW_TEMPLATE_DATE_FUNCTIONS: readonly string[] = ['NOW', 'TODAY'];
101101

102102
/**
103103
* The value-expression function table — the CEL stdlib's numeric six, by the
104-
* #11060 ruling. Mirrors `EXPRESSION_FUNCTION_ARITY`'s key set.
104+
* ruling commit 815585513 records. Mirrors `EXPRESSION_FUNCTION_ARITY`'s key set.
105105
*/
106106
export const FLOW_TEMPLATE_VALUE_FUNCTIONS: readonly string[] = [
107107
'round', 'floor', 'ceil', 'abs', 'min', 'max',

‎packages/lint/src/lint-flow-patterns.ts‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
* specifically (range operators `>=`/`<=` are not flagged — they're the building
5656
* block of the correct pattern), keeping false positives near zero.
5757
*
58-
* #13681 / #14394 — per-iteration containment, as a PAIR of rules. A `loop`
58+
* commit 8ed9c54b4 / #14394 — per-iteration containment, as a PAIR of rules. A `loop`
5959
* body has no error handling of its own: `loop-node.ts` iterates with a bare
6060
* `await`, so the first item whose node fails ends the entire run and every
6161
* later item goes unprocessed, silently. The containment spelling exists and was
@@ -261,7 +261,7 @@ export const FLOW_DECISION_INCLUSIVE_OVERLAP = 'flow-decision-inclusive-overlap'
261261
*/
262262
export const FLOW_MULTI_WRITE_UNFILTERED = 'flow-multi-write-unfiltered';
263263
/**
264-
* #13681 / #14394 — a `loop` body that runs a node which can fail, with no
264+
* commit 8ed9c54b4 / #14394 — a `loop` body that runs a node which can fail, with no
265265
* `try_catch` between the loop and that node. The first failing item kills the
266266
* whole sweep: `loop-node.ts:123-135` iterates with a bare `await` and no
267267
* `try`/`catch` anywhere in the file, so the body's failure propagates out of
@@ -279,7 +279,7 @@ export const FLOW_MULTI_WRITE_UNFILTERED = 'flow-multi-write-unfiltered';
279279
*/
280280
export const FLOW_LOOP_BODY_UNCONTAINED = 'flow-loop-body-uncontained';
281281
/**
282-
* #13681 / #14394 — the near-miss shape: a `try_catch` that declares no `catch`
282+
* commit 8ed9c54b4 / #14394 — the near-miss shape: a `try_catch` that declares no `catch`
283283
* region. `catch` is optional in the schema (`control-flow.zod.ts:315`) and
284284
* omitting it makes the container **fail** (`try-catch-node.ts:190`), so the
285285
* wrapped region dies exactly like an unwrapped one — measured side by side, the
@@ -340,7 +340,7 @@ const DATA_NODE_TYPES = new Set(['get_record', 'create_record', 'update_record',
340340
* - `http` — a non-2xx (when `failOnError`), a timeout/abort, or a failed
341341
* durable enqueue (`http-nodes.ts:208, :249-253`).
342342
* - `notify` — no title, an empty resolved recipient set, or a delivery throw
343-
* (`notify-node.ts:293, :300, :446`). The measured #13681 case exactly: one
343+
* (`notify-node.ts:293, :300, :446`). The measured case commit 8ed9c54b4 records, exactly: one
344344
* row with a null owner killed the sweep.
345345
* - `connector_action` — a degraded connector, an unresolvable action, or a
346346
* throwing call (`connector-nodes.ts:69, :76, :124`).
@@ -1330,7 +1330,7 @@ function scanApprovalReviseLoops(
13301330

13311331
/**
13321332
* The minimal `catch` region, measured end to end on the real `AutomationEngine`
1333-
* (#13681) and quoted verbatim by both containment rules and by
1333+
* (commit 8ed9c54b4) and quoted verbatim by both containment rules and by
13341334
* `content/docs/automation/flows.mdx`.
13351335
*
13361336
* `catch` cannot be empty: `FlowRegionSchema.nodes` is `.min(1)`
@@ -1425,7 +1425,7 @@ function scanUncontainedLoopBodies(
14251425
`that is a legitimate reading and this stays a warning. ` +
14261426
// The tracker ids stay OUT of the runtime string (`check:doc-authoring`):
14271427
// an author reading this hint cannot resolve `#NNNN`. The measurement
1428-
// and the ruling behind this rule are #13681 / #14394; the docblock on
1428+
// and the ruling behind this rule are commit 8ed9c54b4 / #14394; the docblock on
14291429
// {@link FLOW_LOOP_BODY_UNCONTAINED} carries them for the reader who can.
14301430
`See content/docs/automation/flows.mdx §"Per-iteration containment".`,
14311431
// Warning, not `error`: see the severity policy at the top of this
@@ -1465,7 +1465,7 @@ function scanUncontainedLoopBodies(
14651465
/**
14661466
* #14394 rule B — a `try_catch` with no `catch` region, anywhere in the flow.
14671467
*
1468-
* Measured (#13681): the container fails through, and the run is byte-identical
1468+
* Measured (commit 8ed9c54b4): the container fails through, and the run is byte-identical
14691469
* to the one with no `try_catch` at all. `retry`, when present, only delays it.
14701470
*
14711471
* A `catch` that is PRESENT but malformed is deliberately not this rule's
@@ -1737,15 +1737,15 @@ export function lintFlowPatterns(stack: AnyRec): FlowLintFinding[] {
17371737
// purge, and this rule's main habitat — in range (#5383/#5635).
17381738
scanUnboundedBulkWrites(at, graphNodes, findings);
17391739

1740-
// (g) #13681/#14394 — a `loop` body running a fallible node with no
1740+
// (g) commit 8ed9c54b4 / #14394 — a `loop` body running a fallible node with no
17411741
// `try_catch` between the loop and it. Per graph like the rest, and
17421742
// that is what keeps the count right: every `loop` node belongs to
17431743
// exactly one graph, so its body is descended exactly once, and a
17441744
// nested loop is judged in its own graph rather than through its
17451745
// parent (see {@link scanUncontainedLoopBodies}).
17461746
scanUncontainedLoopBodies(at, graphNodes, findings);
17471747

1748-
// (h) #13681/#14394 — the near-miss: a `try_catch` with no `catch`. Scanned
1748+
// (h) commit 8ed9c54b4 / #14394 — the near-miss: a `try_catch` with no `catch`. Scanned
17491749
// everywhere, not only inside a loop: the container fails through
17501750
// wherever it is written. Inside a loop body it is the shape (g)
17511751
// deliberately treats as contained, so exactly one of the two rules

‎packages/lint/src/lint-liveness-properties.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ function describe(entry: LedgerEntry): { kind: string; rule: string; defaultHint
273273

274274
/**
275275
* ── Coverage seam (#14057). Package-internal: NOT part of the published surface,
276-
* same posture as the #10262 seam below `getNested` (exported from the MODULE
276+
* same posture as the test seam commit 2aca1bc4c added below `getNested` (exported from the MODULE
277277
* only; `src/index.ts` re-exports neither, and this package's `exports` map
278278
* publishes just `.` and `./runtime`). ────────────────────────────────────
279279
*
@@ -431,7 +431,7 @@ export function getNested(obj: AnyRec, path: string): unknown[] {
431431
}
432432

433433
/**
434-
* ── Test seam (#10262). Package-internal: NOT part of the published surface ──
434+
* ── Test seam (commit 2aca1bc4c). Package-internal: NOT part of the published surface ──
435435
*
436436
* `getNested` above and this wrapper are exported for
437437
* `lint-liveness-properties.test.ts` to drive the array fan-out against a
@@ -455,7 +455,7 @@ export function getNested(obj: AnyRec, path: string): unknown[] {
455455
* - #7079 was closed by re-subjecting to `app.…navigation.children.runAction`;
456456
* - #10068 flipped THAT live → subject lost again, and measured across all 30
457457
* shipped ledgers every remaining warned entry is top-level, so there is
458-
* nothing left to re-subject to. Filed as #10262 (this seam).
458+
* nothing left to re-subject to. This seam is commit 2aca1bc4c.
459459
*
460460
* A broken walk is invisible without it: a `getNested` that stopped at index 0
461461
* "still warns on every single-entry fixture, on every top-level warned key,

‎packages/lint/src/reference-integrity-suite.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ export const REFERENCE_INTEGRITY_RULES: readonly ReferenceIntegrityRule[] = [
563563
// build the other command would have stopped. Joining the suite is the whole
564564
// fix; the two hand-wired call sites are deleted with it (#4345 follow-up).
565565
{ name: 'validateReadonlyFlowWrites', run: validateReadonlyFlowWrites },
566-
// [#13653] The SAME question as the member above, on the surface that had no
566+
// [commit 36d287803] The SAME question as the member above, on the surface that had no
567567
// answer for it: a hook body's `ctx.api.object('x').update({ readonlyField })`.
568568
// A hook's `ctx.api` is a ScopedContext over the TRIGGERING operation's
569569
// context, so on a non-system trigger the engine strips the key and the call

‎packages/lint/src/runtime-gate.ts‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ const TYPE_TO_STACK_KEY: Readonly<Record<string, string>> = {
170170
report: 'reports',
171171
email_template: 'emailTemplates',
172172
mapping: 'mappings',
173-
// [#19143 above, #19370 here] `position` / `app` — the two collections only
173+
// [#19143 above, commit a227afa41 here] `position` / `app` — the two collections only
174174
// `security-role-word` judges. They arrive together with that rule's
175175
// crossing, never ahead of it: `DEFAULT_METADATA_TYPE_REGISTRY` declares both
176176
// `allowRuntimeCreate: true`, so Studio's app designer, REST `/meta` and an
@@ -261,7 +261,7 @@ const TYPE_TO_STACK_KEY: Readonly<Record<string, string>> = {
261261
* here plus a `CONTEXT_STACK_KEYS` entry, made when a rule that RESOLVES
262262
* REFERENCES INTO the collection actually crosses the wall, never in advance.
263263
*
264-
* [#19370] `positions` / `apps` are the measured limit of that sentence, and
264+
* [commit a227afa41] `positions` / `apps` are the measured limit of that sentence, and
265265
* the reason it now says RESOLVES rather than reads. `security-role-word`
266266
* crossed the wall reading both collections, and they are still not carried:
267267
* the rule judges each identifier and label on its own, so the universe it
@@ -359,7 +359,7 @@ export interface RuntimeStackContext {
359359
* read — narrows NOTHING. The whole collection is handed over, exactly as
360360
* before. The fallback direction is deliberate and is the opposite of a size
361361
* threshold: an unknown provenance buys MORE validation input, never less, so
362-
* the gate never stops judging (the #9798 / #9261 / ADR-0110 D3 fail-open
362+
* the gate never stops judging (the fail-open commit c7655d472 closed, #9261, ADR-0110 D3: the
363363
* shape this card was explicitly forbidden from re-creating).
364364
*/
365365
export interface RuntimePackageScope {
@@ -724,7 +724,7 @@ export const WRITTEN_STACK_KEYS: ReadonlySet<string> = new Set(Object.values(TYP
724724

725725
/**
726726
* The collection-resident stack keys whose TOP-LEVEL index the gate rewrites
727-
* to a name key before findings leave it (#10064) — DERIVED, not listed (#13390).
727+
* to a name key before findings leave it (commit def0d3e63) — DERIVED, not listed (#13390).
728728
*
729729
* These are the collections a written item lands INSIDE **and** that the
730730
* context also fills — so a finding's `objects[417]` is an offset into this
@@ -743,7 +743,7 @@ export const WRITTEN_STACK_KEYS: ReadonlySet<string> = new Set(Object.values(TYP
743743
* clause, which is validity, not completeness, and the compiler held nothing
744744
* else. Omitting a member here did not fail to build, fail a test, or fail a
745745
* gate; it emitted findings that LOOK correct whose `path` the caller cannot
746-
* resolve, which is the #10064 defect re-created silently.
746+
* resolve, which is the defect commit def0d3e63 fixed, re-created silently.
747747
*
748748
* [#13977] That reading of `CONTEXT_STACK_KEYS` is now history rather than
749749
* description: it is derived from `RuntimeStackContext` and complete by
@@ -776,8 +776,8 @@ export const WRITTEN_STACK_KEYS: ReadonlySet<string> = new Set(Object.values(TYP
776776
* had to hand-write. Mapping the `dataset` type moved it IN, in the same one-key
777777
* edit and with no second spelling to remember: a dataset write's snapshot now
778778
* holds the tenant's other datasets beside the written one, so `datasets[3]` is
779-
* again an offset into an array the caller has never seen. That is the #10064
780-
* defect this constant exists to prevent, and the derivation caught the widening
779+
* again an offset into an array the caller has never seen. That is the defect commit def0d3e63 fixed,
780+
* the one this constant exists to prevent, and the derivation caught the widening
781781
* rather than being told about it.
782782
*/
783783
const NAME_KEYED_STACK_KEYS: readonly string[] = deriveNameKeyedStackKeys(
@@ -796,7 +796,7 @@ const PATH_SAFE_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
796796
const TOP_LEVEL_INDEX = buildTopLevelIndexPattern(NAME_KEYED_STACK_KEYS);
797797

798798
/**
799-
* `objects[417].sharingModel` → `objects.acme_invoice.sharingModel` (#10064).
799+
* `objects[417].sharingModel` → `objects.acme_invoice.sharingModel` (commit def0d3e63).
800800
*
801801
* The maintainer-ruled wire shape for collection-resident findings: the
802802
* top-level collection index no caller can resolve is replaced by the entry's
@@ -925,7 +925,7 @@ export function runRuntimeAuthoringRules(args: {
925925
const before = new Set(runRules(rules, snapshots.baseline, ctx).map(fingerprint));
926926
const added = runRules(rules, snapshots.candidate, ctx)
927927
.filter((f) => !before.has(fingerprint(f)))
928-
// [#10064] The wire shape: collection-resident findings key their
928+
// [commit def0d3e63] The wire shape: collection-resident findings key their
929929
// top-level collection entry by NAME, not by this gate's private snapshot
930930
// index. Rewritten only on what leaves the gate — the differential above
931931
// ran on the rules' raw positional paths.

‎packages/lint/src/validate-action-body-writes.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export const ACTION_RECORD_WRITE_DISCARDED = 'action-record-write-discarded';
132132
export const ACTION_BODY_SOURCE_UNPARSEABLE = 'action-body-source-unparseable';
133133

134134
/**
135-
* [#8663] The action-surface twin of `hook-body-write-unprovisioned-anchor`.
135+
* [commit 192213f66] The action-surface twin of `hook-body-write-unprovisioned-anchor`.
136136
* Same question, same wording, same `warning` severity — this rule and the hook
137137
* rule share {@link IMPLICIT_FIELDS}, so they shared its blind spot too.
138138
*/
@@ -314,7 +314,7 @@ export function validateActionBodyWrites(stack: AnyRec): ActionBodyWriteFinding[
314314
// Built lazily: only the unknown-field check needs it, so a stack whose
315315
// action bodies never reach `ctx.api` never pays it.
316316
let objectFields: Map<string, Set<string>> | null = null;
317-
// [#8663] Non-empty only for a stack carrying an ADR-0015 `external` object.
317+
// [commit 192213f66] Non-empty only for a stack carrying an ADR-0015 `external` object.
318318
let anchors: ReadonlyMap<string, ReadonlySet<string>> | null = null;
319319

320320
for (const site of sites) {
@@ -399,7 +399,7 @@ export function validateActionBodyWrites(stack: AnyRec): ActionBodyWriteFinding[
399399
// (it maps a remote column they vouch for) — never either finding.
400400
if (known.has(w.field)) continue;
401401
if (IMPLICIT_FIELDS.has(w.field)) {
402-
// [#8663] Implicitly writable SOMEWHERE is not provisioned HERE.
402+
// [commit 192213f66] Implicitly writable SOMEWHERE is not provisioned HERE.
403403
if (!anchors.get(w.object)?.has(w.field)) continue;
404404
reported.add(dedupeKey);
405405
findings.push({

‎packages/lint/src/validate-component-types.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
/**
44
* [ADR-0078] The page-component TYPE gate — the author-time rejection the open
5-
* `type` union never had (#12950, riding the #12183 ruling of 2026-08-26).
5+
* `type` union never had (commit 225e7690f, riding the #12183 ruling of 2026-08-26).
66
*
77
* ## What was missing
88
*

‎packages/lint/src/validate-empty-combinators.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* ## The runtime is not changing, and this file changes nothing about it
88
*
99
* #5322 (maintainer ruling, 2026-08-04) settled the RUNTIME semantics of the
10-
* four empty shapes as the boolean identity reduction, and #5659/PR #6528 made
10+
* four empty shapes as the boolean identity reduction, and #5659 (commit 3510e4a25) made
1111
* that reduction one implementation — `reduceFilterVerdict` in
1212
* `@objectstack/spec/data`, proven against `FILTER_LOGIC_CASES` and consumed by
1313
* every backend. This rule touches no translate or evaluation path. It asks the

‎packages/lint/src/validate-expressions.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ function rulePredicates(rule: AnyRec, path: string): Array<{ label: string; raw:
525525
*
526526
* ## Why this is a rule of its own rather than a missing root
527527
*
528-
* Until #6290 the same rejection fell out of `@objectstack/formula`'s
528+
* Until commit e9b526597 the same rejection fell out of `@objectstack/formula`'s
529529
* `SCOPE_ROOTS` not listing `current_user` — a global baseline, doing a
530530
* per-surface job by accident. Two things were wrong with that:
531531
*
@@ -568,7 +568,7 @@ function rulePredicates(rule: AnyRec, path: string): Array<{ label: string; raw:
568568
*
569569
* A denylist cannot track `SCOPE_ROOTS`: every root added there is unreported
570570
* here until somebody remembers to copy it across (`current_user` itself
571-
* arrived in #6290 and needed #6584 to be noticed). The allowlist inverts the
571+
* arrived in commit e9b526597, and needed that same change (#6584) to be noticed). The allowlist inverts the
572572
* maintenance burden onto the three roots that are pinned by three anchors and
573573
* change only when the evaluators do.
574574
*
@@ -767,7 +767,7 @@ function rulePredicates(rule: AnyRec, path: string): Array<{ label: string; raw:
767767
*
768768
* `SCOPE_ROOTS`' own docblock made the original widening measurable rather than
769769
* a matter of taste: its `current_user` entry claims to be "the last one this
770-
* list was missing (#6290)". `app` is that sentence's second counterexample —
770+
* list was missing" (commit e9b526597 wrote it). `app` is that sentence's second counterexample —
771771
* the same mechanism (#6713's point: a hand-maintained list doing a per-surface
772772
* job drifts), a second sighting, not an analogy to the first.
773773
*
@@ -1890,7 +1890,7 @@ export function validateStackExpressions(stack: AnyRec): ExprIssue[] {
18901890
issues.push({ where, message: verdict.message, source: verdict.source, severity: 'error' });
18911891
}
18921892
}
1893-
// [#6290] Per-OPTION `visibleWhen` — a `select`/`multiselect`/`radio`
1893+
// [commit e9b526597] Per-OPTION `visibleWhen` — a `select`/`multiselect`/`radio`
18941894
// option's own predicate (`SelectOptionSchema.visibleWhen`,
18951895
// `field.zod.ts:143`). It had no traversal here at all, so the whole
18961896
// option surface reached compile, validate and run time unvalidated:
@@ -1900,7 +1900,7 @@ export function validateStackExpressions(stack: AnyRec): ExprIssue[] {
19001900
//
19011901
// Deliberately checked on the SAME `record` scope as the field-level
19021902
// slots, and that is the whole of the difference between the two faces
1903-
// after #6290: `current_user` is a declared root platform-wide (ADR-0068
1903+
// after commit e9b526597: `current_user` is a declared root platform-wide (ADR-0068
19041904
// D1), so it passes here — options resolve through
19051905
// `resolveCascadingOptions` against the host's predicate scope, which
19061906
// binds it (ADR-0068 / objectui#2284), and the showcase's

0 commit comments

Comments
 (0)