Uh oh!
There was an error while loading. Please reload this page.
feat(spec): live-elsewhere — fifth liveness verdict with gate-executable criteria (#13483) - #14056
Conversation
…ed in a sibling repo (#13483) A key enforced only in a sibling repo had no honest verdict: dead lies about the cross-repo consumer, live is refused by the gate (repo-local evidence must resolve). The new status carries gate-executable criteria (elsewhere.mts): a foreign-realm evidence pointer, evidenceScope cross-repo, a REQUIRED dated attestation, and a 180d expiry that fails the build demanding a re-reading of the foreign enforcer — never a re-stamp. manifest.runtime migrates as the first row, attested at the #12400 cloud reading (2026-08-29, cloud @15f55df). Part of #13483 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mciyv38maJ6HYVMiaM26T1
…veness-live-elsewhere-verdict
… generator comment Part of #13483 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mciyv38maJ6HYVMiaM26T1
📓 Docs Drift Check
What this run could not see
Coarse fallback — 128 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#13483
Introduces the fifth liveness-ledger verdict
live-elsewhere— dead here by measurement, genuinely enforced in a sibling repo — with criteria the gate executes, and migratesmanifest.runtime(the #13479 qualifying-note stopgap) as its first row. Direction was mechanically locked by triage:deadlies about the cross-repo consumer,liveis refused by the gate (its repo-local evidence must resolve against this checkout), so a new status is the only exit.Premise — answered before the fix (the ruled precondition)
What a non-local evidence pointer looks like. The realm-marker grammar the evidence scanner already machine-reads, pointed at the foreign ENFORCER and pinned to a foreign commit in the prose. The shipped template is the migrated row:
cloud: packages/service-cloud/src/plugin-permission-audit.ts#auditPluginPermissions @15f55df + packages/service-cloud/src/routes/package-publish.ts:530 — the marketplace publish gate: an unverified publisher requesting the node tier is hard-rejected with HTTP 422 ...Repo (realm marker), path plus consuming symbol, enforcement description, and the commit the reading was taken at — the structured pointer the card asked for, carried in the grammar the ledger already has rather than a new JSON shape. I considered a machine-checked foreign-SHA field and rejected it: a shape check cannot distinguish a real reading from a fabricated one, so it would add surface without adding falsifiability; what makes fabrication pointless is the expiry below, which forces a periodic genuine re-reading. Foreign paths stay counted-never-resolved (that boundary is deliberate and load-bearing); any repo-local path such an entry ALSO cites is held to the full scanned-status standard (existence, line bound, symbol anchor, key mention) — the status joins EVIDENCE_SCANNED_STATUSES.
What re-verification discipline applies to a repo this board may not be able to read. The gate cannot read cloud, and this design never asks it to — what CI executes is the SHAPE of the claim and its CLOCK, four criteria enforced by the new
scripts/liveness/elsewhere.mts(exit 1 each, proven red through the real gate in the self-tests):evidencestring must attribute at least one path to a foreign realm — the verdict IS this pointer; without it the status is exactly the unverified label the card's hard constraint names;evidenceScopemust becross-repo— the verdict is a cross-repo claim by definition;verifiedAtis REQUIRED — for every other status an undated row is a worklist entry because the file/line/symbol/key-mention checks keep watching the cited code; nothing local can watch a foreign enforcer rot, so an undated elsewhere-claim would be unfalsifiable forever;Re-attestation means a seat WITH access re-reads the enforcer at its current head, repairs the pointer if it moved, re-pins the commit, and stamps
verifiedAtwith that reading's date. Re-stamping without re-reading is the "trust the prose note" downgrade the ruling forbids, and the gate guidance says so verbatim. If the window closes and no seat with access can be found, the red build IS the escalation: the row returns to the maintainer (needs-user-decision) to rule whether an unverifiable pointer still counts as evidence. The design degrades into that fork rather than into silence — trust is time-boxed, never institutional.The access face, measured this run (reported either way, per the dispatch order). Probe:
add_reporead request for objectstack-ai/cloud from this dev seat, 2026-09-01. Result: denied — "you don't have access to objectstack-ai/cloud" — the same face #11331 records from #10627 (re-measured 2026-08-26 there). Countervailing record: the board verifiably read cloud twice in the last week — #10812 (cloud at 5b5925a, 2026-08-24) and #12400 (cloud at 15f55df, reading of 2026-08-29, controls held: 15 manifest-property reads findable). So the fork condition — cloud genuinely unreachable for verification — is measured NOT to hold: access is seat-dependent, not absent, and CI-side reachability is not load-bearing in this design. Consequence for this delivery: I could not honestly re-read the enforcer from this seat today, so the migrated row'sverifiedAtis 2026-08-29 — the date of the #12400 reading it cites — not a fresh stamp of today's date.What changed
packages/spec/scripts/liveness/elsewhere.mts(new) +elsewhere.test.ts(new) — the criteria, pure and injected-clock, plus the two prescriptions (shape repair vs re-attestation).check-liveness.mts— status joins the scanned set and the vocabulary docs; per-row criteria wiring in classify(); two new failure headings plus an always-printed population line (the two-number discipline); the unknown-status guidance now points a DELIBERATE vocabulary change at this precedent while still forbidding typo-widening.readme-table.mts— STATUS_COLUMNS gainslive-elsewhere; StateCountsRow, foldStateCounts, renderStateCounts move together (the artifact-shape rule those files document); guidance de-hardcodes the column count.build-state-counts.mts— total sum includes the new column.packages/spec/liveness/manifest.json—manifest.runtimemigrates: statuslive-elsewhere, the foreign pointer above asevidence,verifiedAt2026-08-29, note rewritten to carry both halves' measurement provenance and the re-attestation contract.packages/spec/liveness/state-counts.md— regenerated (newelsewherecolumn; manifest now live 22 / dead 15 / elsewhere 1).packages/spec/liveness/README.md— vocabulary table rows fordead(sharpened: dead means no consumer anywhere the census looked) andlive-elsewhere; a dedicated criteria section; the stale "no cross-repo value covers cloud" paragraph corrected; the manifest Notes cell re-measured (Dead 21 becomes Dead 20, runtime's disposition updated).check-liveness.test.ts— a new seven-case block through the real gate via ledger-root: control green with the population line, four red criteria legs, the malformed-verifiedAt single-heading boundary, and the scanned-set membership leg; existing pins updated for the five-name vocabulary.readme-table.test.ts— column pins updated; fold and render cases for the fifth column..changeset/liveness-live-elsewhere-verdict.md— patch for @objectstack/spec (theliveness/dir ships in the package files whitelist).Clause-2: no — the diff touches no
packages/spec/src/**path (verified on the merge-base diff; ledger plus gate tooling only). File face vs the claim comment, declared: the enumerated list named check-liveness.mts, its tests, evidence.mts, manifest.json, README and changeset; the implementation additionally landselsewhere.mtsplus test (new module in the same claimed directory),readme-table.mtsplus test andbuild-state-counts.mts(the STATUS_COLUMNS artifact-shape sites, mechanically unavoidable for a vocabulary widening), and the regeneratedstate-counts.md. All inside the two directories the claim's serial-constraint line locks; evidence.mts itself needed no change.Second consumer (read, not edited)
#11331 is not addressed here and remains open. Its enforce leg lives in the same cloud control plane; the evidence shape generalizes with no per-key machinery — should its fork land as enforce-in-cloud, the
manifest.integrityrow takes the same form: acloud:pointer at the verifier, cross-repo scope, dated attestation. Note per the #12400 reading, cloud today PERSISTS integrity and verifies nothing, so that card's fork is genuinely open.Verification (all at head 5db4407 unless noted)
pnpm --filter @objectstack/spec run check:liveness— exit 0; judgment lines: "live-elsewhere: 1 entr(ies) carry the verdict (dead here, enforced in a sibling repo), 1 with a foreign pointer, cross-repo scope, and an attestation of at most 180d old." and the green summary now includes "every live-elsewhere verdict points at a named foreign enforcer under an unexpired attestation"; manifest row reads "38 classified (live 22, dead 15, live-elsewhere 1)".pnpm --filter @objectstack/spec run typecheckat 44bd1a1 — exit 0 (tsc, scripts program, test program);--listFilesshows both new files inside the scripts program (measured, not assumed).node scripts/pm/dispatch-gates.mjs, derivation line cites this tree at 44bd1a1): 36 gates run, 33 green by their own printed verdicts, including check:changeset-gate-self-tests, check:doc-authoring, spec check:empty-state, spec check:strictness-ledger, spec check:variant-docs, check:merge-driver, check:page-declaration-shape, check:pm-governed-merges, check:published-files, check:slot-lookup, check:test-source-alias, check:type-source-resolution, check:where-matcher, check:nul-bytes. Ratchet families (liveness, empty-state, strictness-ledger) re-ran green at 5db4407 after the final commit.Out-of-scope findings
lint-liveness-properties.tsdescribe() deliberately throws on a status it has not been taught; unreachable today (reaching it requires authorWarn true or experimental, and no live-elsewhere row carries either) but reachable the day such a row opts into authorWarn — filed separately with the designed repair..claude/skills/spec-property-retirementconsumes ledgerdeadverdicts and should name the new status in its discipline (a dead-here-enforced-elsewhere key now reads live-elsewhere and is never a removal input) — filed separately as documentation drift.Generated by Claude Code
Generated by Claude Code