Skip to content

finding: the liveness author-lint's array fan-out (getNested) has lost its warned subject a SECOND time — the ledger now has ZERO dotted warned entries #10262

Description

@qq9340100

Filed unassigned by the #10068 execution seat (session session_016gcKVsiywU9CcS96S5t9qD). This is #7079 recurring, and the recurrence is the finding — the previous instance was closed by re-subjecting the test to a row that has now itself flipped.

What happened

packages/lint/src/lint-liveness-properties.ts resolves a dotted warn-map path (navigation.runAction) by fanning getNested out over an array container level. Top-level warned keys never reach getNested at all — checkItem takes the path.includes('.') ? getNested(item, path) : [item[path]] branch — so only a dotted warned entry exercises the fan-out.

#10068 flipped app.props.navigation.children.runAction plannedlive (the objectui consumer landed). Measured across all 30 shipped ledgers immediately after that flip:

warned entry shape
agent.lifecycle / memory / guardrails / structuredOutput top-level (experimental)
field.relatedListFilter top-level
object.externalSharingModel top-level
tool.outputSchema top-level (experimental)
translation.flows top-level

Zero dotted entries remain. getNested is now exercised by nothing, so the walk is untested in exactly the way its own docblock warns about: a getNested that stopped at index 0 "still warns on every single-entry fixture, on every top-level warned key, and on the first item of every real app — so nothing else in this file would go red."

Why this is a recurrence, not a one-off

This is the same loss the file already records once:

The structural point: the test's subject is a ledger verdict, and ledger verdicts are supposed to move. Coupling a walker property to "whichever row happens to carry authorWarn under an array container today" makes the coverage a function of unrelated cross-repo landings. Twice now, correctly flipping a row to live has silently deleted a regression test.

What #10068 did in the meantime

It did not leave the three assertions red and did not paper over them with a bare silence check. It applied the disposition #6774 used for colorVariant: replaced the positive assertions with a silence pin (authoring runAction must now produce no finding — so a half-reverted flip, or a pin rolled back under it, shows up right there) plus the anti-vacuity guard that authors a still-warned key in the same call, so "no findings" cannot pass because the lint stopped loading ledgers. See the app navigation block at the bottom of packages/lint/src/lint-liveness-properties.test.ts.

That keeps the file honest but does not restore fan-out coverage. That is the debt this card carries.

Options

  • A — test the walker, not the ledger. Give getNested (or lintLivenessProperties) a seam and unit-test the fan-out against a synthetic warn map. Decouples the property under test from ledger churn permanently; costs a test-only export/seam on a published package and gives up the "real ledger contract test" coupling for this one assertion.
  • B — wait for the next dotted warned entry and re-subject again. What finding: the liveness author-lint's array fan-out (getNested) has no warned subject left, so it is now untested #7079 did. Cheapest now, and this card is the evidence it does not hold: it has already failed once, and the wait is unbounded.
  • C — accept the gap. Record it and move on. Not recommended: the failure mode is silent and the walk feeds an author-facing advisory.

Recommendation: A. The fan-out is a property of the walker, and the last two years of this row show the ledger cannot be relied on to keep supplying a subject for it. Keep every other assertion in the file ledger-driven — those are genuinely contract tests — and move only this one to the walker's own level.

⚠️ Not urgent, not a shipped defect: nothing an author sees is wrong today. The exposure is that a future regression in getNested would go unnoticed.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions