fix(lint): a liveness finding's fix text never comes from the ledger note, for any row class - #21169
Conversation
…note, for any row class Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): ⛔ 2 release-owned page(s) name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 4 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 3a8e95838807d9a98c9d997f2b631d9add3ffc3c && git checkout 3a8e95838807d9a98c9d997f2b631d9add3ffc3c
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin f0cc16e8d55b02269c7db708254e2917ba7e84e2 88dc06a2012516079c9d5b70230ce23a2ee18df5 && git checkout -B drift-repro f0cc16e8d55b02269c7db708254e2917ba7e84e2 && git merge --no-ff 88dc06a2012516079c9d5b70230ce23a2ee18df5
node scripts/docs-audit/affected-docs.mjs --json f0cc16e8d55b02269c7db708254e2917ba7e84e2
|
Contract reviewServed-tier: ① Derived judgmentsThe checkout has no Code (
Tests (
Changeset (
Merge-cleanliness. ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #21096
Clause-②: no
What
checkIteminpackages/lint/src/lint-liveness-properties.tsnow builds the fix text asentry.authorHint ?? defaultHint. The row's ledgernoteis never author-facing, for every row class (opted-inauthorWarn,experimental,dead,live-elsewhere,planned). The now-unusedisVerdictTriggeredhelper and the comments describing the old split are removed.describe()already carries a default hint for all four verdicts a finding can carry (experimental,planned,dead,live-elsewhere), so no prose was invented. Aliverow withauthorWarnstill throws the integrity sentinel, unchanged.No ledger row under
packages/spec/liveness/**is edited: this is the structural direction from triage, not per-rowauthorHintdiscipline.Measured end to end
os lint --jsononexamples/app-showcase(built from this tree, before and after rebuilding@objectstack/lint), the twoliveness-planned-propertyfindings,fixfield:planned+ authorWarn per enforce-or-mark ... Re-verified 2026-07-30: ..." (about 700 characters of maintainer prose, one tracker id).The two
liveness-dead-propertyfindings onshowcase_contributorare unchanged ("Remove it — it is declared in the spec but not consumed at runtime."). Exit code 0 before and after.Tests (
lint-liveness-properties.test.ts)object.externalSharingModelpin now asserts the planned default hint, no#followed by digits, and that the row's note text is absent (with an anti-vacuity guard that the row is still opted-in, has noauthorHintand a note with a tracker id).experimentalrow: a row with anauthorHintprints it exactly (control); a row without one prints neither its note nor a tracker id.dead,live-elsewhere,plannedandexperimental, with and withoutauthorWarn.Results:
pnpm --filter @objectstack/lint test118 files / 5486 tests pass; the liveness file alone 93 pass;pnpm --filter @objectstack/lint typecheckgreen.Ablation (one-line revert to
entry.authorHint ?? entry.note ?? defaultHint, throughscripts/ablation-replace.mjs, anchor hit 1 time, blob moved, restore verified byte-identical to HEAD): 6 tests go red (the two real-ledger pins, the two synthetic pins, the live-elsewhere precedence pin, the dead RLS end-to-end pin); 87 stay green. Restored;git diff HEADempty.Other sites where a ledger note could reach an author
None found in
packages/lint/srcorpackages/cli/srcbesides this expression. The other.notereads invalidate-react-page-props.tsare deprecation records, not ledger rows. Nothing else reads the ledger'snoteas author text.Gates
node scripts/pm/dispatch-gates.mjs --commandsderived 60 families; each was run and recorded with its exit code, then reconciled with--ran: 59 exit 0, 1 NOT MEASURED (check:dual-build-cjs-loads, exit 3, PREREQUISITE NOT MET: eight unrelated packages have nodist/in this worktree; nothing was measured, and the diff touches noexportsor build output). CI owns the rest.Coordination
#21135 (the liveness README) states the same model. It has no open PR and no branch at this time; whichever lands second keeps the two consistent. This PR does not touch the README.
Generated by Claude Code