Repository navigation
docs(lint): the liveness lint's live-elsewhere example no longer names manifest.runtime - #27650
Conversation
…s manifest.runtime The doc comment and the `live-elsewhere` default hint used `manifest.runtime` as the worked example of a row enforced only in a sibling repo. That row reads `live` since the boot-time loader began dispatching on the plugin tier, so the example taught the opposite of the ledger. Both places now describe the verdict generically (a key with zero local dispatch whose only enforcer is a gate in another repository, named by the row's evidence); no shipped row holds the verdict today. Rule id, message and the hint's instruction are unchanged. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2dZmutT6YPdL6nSFmM
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2dZmutT6YPdL6nSFmM
Name one enforcer shape (a marketplace publish gate) in the hint and the doc comment, so the example is not read beside the ledger README's rule that a key consumed only by the closed runtime stays live; split the comment's long parenthetical into two sentences; trim the changeset's Clause line to the bare form the sibling changesets use. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2dZmutT6YPdL6nSFmM
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2dZmutT6YPdL6nSFmM
|
domain:spec#4 · marchtian · session_017ihL2dZmutT6YPdL6nSFmM Independent full review (spec rule: a complete second-model review before merge)Reviewer: an isolated subagent fed the card, the triage ruling, the full diff and the governing text (AGENTS.md documentation guardrails and changeset rules, the liveness ledger README's Record 1 — first head
|
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. 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): |
|
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V 席位核对 · ACCEPT · card #27569 · 2026-10-29T16:26Z
Contract reviewServed-tier: ① Derived judgmentsNo accept set or public surface changes: one hint string and one doc comment. The hint is author-facing text, and the new text names no row that the ledger contradicts. ② Semver level
③ Boundary flagsNone raised by the dev; none found. Author Implemented-by: VERDICT: PASS |
Requested by 田騏 · project thread
Fixes #27569
Clause-②: no
Metadata-protocol: none
维护者速读
packages/lint/src/lint-liveness-properties.ts里live-elsewhere判定的两处举例(文档注释和默认提示语)不再点名manifest.runtime,改成通用描述:「本仓零分发、唯一执行者是另一个仓库的门(例如市场发布门),台账行的evidence指明它」。规则 id、消息、提示语的指令(保留该属性、看台账行的 evidence)都没动。manifest.runtime这行台账在 ADR-0025 M1 — local T0 install loop for first-party, self-signed plugins: os plugin install (signature + integrity, materialize, record), boot-time loader with the tier dispatch point, disable/uninstall, Stripe sample as acceptance #27123 之后已是live(本地有加载期分发点),而提示语还把它当作live-elsewhere的样板,作者读到的与台账相反。今天packages/spec/liveness/*.json里live-elsewhere行为零,所以没有现成的真实样板可换,只能改成通用说法。packages/lint/CHANGELOG.md未动(发布流程所有)。packages/lint/src/lint-liveness-properties.ts的defaultHint(live-elsewhere分支)那一个 hunk,再看上面文档注释的 hunk。grep -n "manifest.runtime" packages/lint/src/lint-liveness-properties.ts应无命中;pnpm --filter @objectstack/lint test全绿(177 个文件)。What changes
lintLivenessPropertiescarriedmanifest.runtimeas its worked example of alive-elsewhererow in two places: thedescribe()doc comment and thelive-elsewhereverdict'sdefaultHint. Measured onmain@178b5238:grep -n "manifest.runtime" packages/lint/src/lint-liveness-properties.ts→ 2 hits (L217, L295).packages/spec/liveness/manifest.json, rowruntime:"status": "live","verifiedAt": "2026-10-29","evidenceScope": "in-repo"; itsnoteopensENFORCED AT LOAD SINCE #27123 (ADR-0025 §3.5 M1), AND STILL AT THE CLOUD PUBLISH GATE — so the verdict FLIPPED live-elsewhere → live on local evidence.grep -rc '"status": "live-elsewhere"' packages/spec/liveness/*.json→ 0 rows today (statuses present: live 899, dead 80, planned 30, experimental 1). So there is no real row to swap in, and both places describe the verdict generically instead, as the card's second option allows. The ledger README (packages/spec/liveness/README.md, thelive-elsewheresection) keeps themanifest.runtimeaccount as the historical worked example by its own statement, and is not touched.The swap:
evidence", followed by its own sentence "No shipped row holds the verdict today; the ledger README keeps the historical worked example."; "That row is not deletable" becomes "Such a row is not deletable". (The first head named "a closed runtime's check" as a second shape; the review's nit 1 removed it, because the README's own rule keeps a key consumed only by the closed runtime atlive.)(for \manifest.runtime`, the cloud marketplace publish gate)becomes(a marketplace publish gate, for instance)`. The sentence around it — "Keep it — nothing reads it when the stack loads here, but a sibling repo enforces it (…); see the ledger row's evidence for the enforcer." — is unchanged.liveness-live-elsewhere-property, the messagekindand the hint's instruction are unchanged. No behaviour change..changeset/27569-liveness-lint-elsewhere-example.md:@objectstack/lintpatch (the hint string ships in the package's dist), with theClause-②: no/Metadata-protocol: nonelines.packages/lint/CHANGELOG.mdis not edited.Tests
No test pins the old example text. The existing pins on this verdict still hold and were run:
toContain('sibling repo'),toContain('evidence'),toContain('keep it'),not.toContain('Remove it'), and the default-hint equality pins (lint-liveness-properties.test.ts). The test file's comments that mentionmanifest.runtimedescribe the history ("until #27123 flipped that row") accurately and are outside the ruling's two places, so they are left as they are.pnpm --filter @objectstack/lint test@16006a58(underos-verify-lock): Test Files 177 passed (177) · Tests 7599 passed | 5 skipped (7604),VERDICT command-exit 0.pnpm --filter @objectstack/lint typecheck@16006a58:tsc --noEmit+check:test-typecheckgreen,VERDICT command-exit 0.Acceptance notes
manifest.runtimewas the first row carrying the verdict; that history stays in the ledger README's worked example and in the test file's comments, which this card does not touch.packages/lint/CHANGELOG.mdstill carries the old hint sentence in its released entries, which is release-owned text and stays as shipped.Verification
Local subset, run on the final head
f1d90c65(the derived list fromnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, 52 commands, each exit code captured to a file before any pipe, then--ranreconciliation):dispatch-gates --ran: 52 derived families accounted for — 50 run (all exit 0), 2 NOT-MEASURED (recorded exit 3, PREREQUISITE NOT MET):node scripts/check-plugin-teardown-shape.mjs --self-test(its fixture needs an unshallowed clone; this checkout is shallow) andpnpm check:dual-build-cjs-loads(needs the wholepnpm build; only the lint, objectql and spec closures were built here). Both are CI's on a full checkout and build.check:doc-authoring,check:nul-bytes,check:changeset-no-major,check:empty-changeset,check:adr-0087-registration,check:docs-transcript-drift,check:lean-entry-closure,check:issue-citations,check:published-files,check:test-source-alias,check:cross-package-test-inputs.pnpm --filter @objectstack/lint test@f1d90c65: Test Files 177 passed (177), Tests 7604 passed (7604),VERDICT command-exit 0.pnpm --filter @objectstack/lint typecheck@16006a58(the only later edits are comment and string text in the same file; the head run oftscis CI'sTypeScript Type Check):VERDICT command-exit 0.node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD: green (no card relation, no model identifier in the trailer pair).test:repo(the vitestrepoproject,Test Core), the lint workflow's whole-tree farm, and the dogfood battery (n/a: no!in the title and no(narrowing)arm).Independent full review record: posted as a comment on this PR (PASS WITH NITS on
16006a58, nits applied; delta PASS; whole-PR PASS atf1d90c65).Generated by Claude Code