Repository navigation
Commit bdd3654
fix(spec,lint,metadata-protocol): correct the view container
Fixes #20301
Clause-②: no
Stage 2 of the card, re-scoped by claim amendment `5953063959` and its
correction `5953104466`. Stage 1 (PR #20357) retired `list.tabs`. Stage
2 does not retire the view container's body `name`, because the A2 stop
fired: the metadata door writes that key itself (os-dev report
`5953000865`). What lands here is the corrected ledger record plus the
carried notes from the stage-1 landing record `5870707479`.
⛔ No tombstone, no conversion, no door change, no `view.zod.ts` key
change. #21412 (the runtime door accepts a contradicting container
`name`) is not addressed here and remains open.
## What changed
**1. `packages/spec/liveness/view.json`, the `name` row: the status
stays `dead` and only the note is rewritten.** `verifiedAt` is now
2026-10-02.
- **Why the verdict holds.** The ledger defines `live` as "authoring the
property changes runtime behaviour". An authored container `name` either
restates the key the container already registers under or contradicts
it. So `os validate` / `os lint` keep their `liveness-dead-property`
warning ("drop it"), which is still the right advice.
- **What the note corrects.** It no longer says "a copy nobody reads",
because the door writes and reads that copy. `saveMetaItem` runs
`normalizeViewMetadata` ahead of the schema gate, and it stamps the save
name onto every view body that has none, containers included. This is
pinned by `view-container-runtime-expansion.test.ts`. The overlay paths
then key on the stamped copy: `hydrateOverlayIntoRegistry` registers no
body without a `name`, and `mergePackageAwareOverlay` slots a row by it.
The ObjectQL boot loop also mints the derived key onto every stack
container it registers.
- **Why the key is kept, not retired.** A tombstone would refuse the
platform's own saves. The 2026-09-03 ruling (PR #15319) refused
direction 3. Triage's guard on this card forbids retiring a key the
platform's own writer still sends. The note follows the ledger's "kept
deliberately" precedent.
- **The old attribution, corrected.** The note used to say
artifact-shipped containers and the metadata-validation sweep send the
key. They do not: what was read as theirs is the door's stamp.
- The ledger README's `view` cell carried the same false sentence and is
corrected the same way. The `view.list.tabs` row's note now records that
the two walks below are deleted.
- **Counts.** `gen:liveness-counts` printed `0 shard(s) rewritten, 0
pruned`, and the totals are unchanged: `988 live · 3 experimental · 1
live-elsewhere · 109 dead · 10 planned = 1111`.
**2. The carried notes, at their re-measured locations.**
- `packages/spec/src/system/i18n-resolver.ts`: a comment still called
`ListViewSchema.tabs` a live carrier. It now names the tombstone and
says `UserFiltersSchema.tabs` is the one carrier. This is a comment-only
change.
- `packages/lint/src/validate-list-view-field-refs.ts`: the
`checkTabs(listView.tabs, …)` call is deleted. This rule is `input:
'parsed'` in the authoring-rule registry, and every list-view shape
tombstones `tabs`, so the key could never reach the call. The
`userFilters.tabs` walk stays. Header prose that named `tabs[].filter` /
`tabs[].view` as walked positions is updated.
- `packages/metadata-protocol/src/metadata-diagnostics.ts`: the
`view?.tabs` read in `computeViewReferenceDiagnostics` is deleted. The
write door refuses the key, and stored and artifact bodies have it
stripped by the conversion replay (`applyConversionsToStoredItem` /
`applyArtifactForwardConversions`) before they are served. A body that
still carries it is badged by `computeMetadataDiagnostics` with the
tombstone prescription.
- **Fixtures.** The list-tabs fixtures in
`packages/lint/src/validate-list-view-field-refs.test.ts` and
`packages/objectql/src/metadata-diagnostics.test.ts` are deleted. The
objectql case that asserted the deleted read now asserts the surviving
`userFilters.tabs` read on the same unknown field.
`HARD_CODED_FILTER_WALKS` drops `tabs.filter.field`. The stage-1
tree-scoped absence pin (`view-list-tabs-retirement.test.ts`) drops
those two files from its self-expiring `RESIDUE`, as that set's own
assertion requires. The CLI i18n entry stays.
**3. Patch changesets:** `@objectstack/spec` (liveness/ is in its
`files[]`), `@objectstack/lint` and `@objectstack/metadata-protocol`.
Each carries `Clause-②: no`. objectql changes only a test file, and its
`files[]` ships `dist` only, so it gets no changeset.
## Verification
HEAD `7ee481ef2d` (base `6d67ad5eca`). Every `os-verify-lock` run below
reports `VERDICT command-exit 0`.
| Command | Result |
|:--|:--|
| `pnpm --filter '@objectstack/objectql^...' build` | spec, lint,
metadata-protocol and the closure built, with declarations |
| `pnpm --filter @objectstack/spec check:generated` | `✓ All 15
generated artifacts are up to date` |
| `pnpm --filter @objectstack/spec typecheck` | exit 0 |
| `pnpm --filter @objectstack/spec check:liveness` | exit 0, `✓
packages/spec/liveness/state-counts/ is current` |
| `pnpm --filter @objectstack/spec test` | `Test Files 600 passed
(600)`, `Tests 17601 passed / 1 todo` |
| `pnpm --filter @objectstack/lint test && … typecheck` | `Test Files
119 passed`, `Tests 5574 passed`, test-typecheck OK |
| `pnpm --filter @objectstack/metadata-protocol exec vitest run
--maxWorkers=2 && … typecheck` | `Test Files 201 passed / 3 skipped`,
`Tests 2983 passed / 19 skipped` |
| objectql: three test files, `typecheck`, `build` |
`metadata-diagnostics`, `view-container-divergent-name-registrars`,
`metadata-validation-sweep`: `Tests 23 passed`; typecheck OK |
**Derived gates.** `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands` printed 91 commands. Each was
run, and its exit code was recorded before any pipe. `--ran` printed `✓
dispatch-gates --ran: 91 derived famil(ies) accounted for — 90 run, 1
NOT-MEASURED`. That includes `check:adr-0087-registration` (`✓ … no
declared-breaking changeset (3 non-breaking changeset(s) seen)`),
`check-changeset-no-major` (`✓ This diff introduces no major bump`),
`check-empty-changeset`, `check:changeset-gate-self-tests`,
`check:doc-authoring`, `check:nul-bytes`,
`check:cross-package-test-inputs`, and every `@objectstack/spec`
`check:*` the derivation named.
Two gates did not measure anything locally:
- `NOT MEASURED: check:dual-build-cjs-loads`. It exited 3 (`PREREQUISITE
NOT MET`) because it needs every package built, which this run did not
do.
- `NOT MEASURED: check-engine-split-ratio --days 90`. It exited 2 with
`cannot compute … this clone is shallow`. It is an ADR trigger metric
over git history, and it is recorded as not measured rather than as a
pass.
`check:lean-entry-closure` first exited 3 for lack of objectql's `dist`.
After objectql was built it exited 0 (`✓ … Admitted set held exactly`).
**Narrowing, declared:** the branch is not merged with `origin/main`.
`ceb4a939b4` is 7 commits ahead, and `git diff --stat 6d67ad5
ceb4a93` over this PR's 11 paths is empty. CI's merge ref judges the
combination.
## Acceptance notes
- objectui's `tabs?: ListViewSchema['tabs']` mirror (types
`objectql.ts`) belongs to objectui. It picks up the stage-1 tombstone at
its next pin bump, and this PR does not edit it.
- `packages/spec/src/ui/view.zod.ts` (the `ViewSchema` guidance comment,
about lines 4720-4728) still says artifact-shipped containers and the
validation sweep send the container `name`. That is the same
misattribution the ledger note corrects. The comment is left alone, per
this stage's no-`view.zod.ts` scope. Carrier: the next PR to touch that
block, or none.
- `skills/**`: no hits for the touched surfaces.
- The at-tier contract review follows this PR (seat's note on the claim
amendment).
---
_Generated by [Claude
Code](https://claude.ai/code/session_01YDt3PzwfrkuFzUBF89WPmM)_
---------
Co-authored-by: Claude <noreply@anthropic.com>name ledger note; delete the unreachable list-view tabs walks (#21423)1 parent 39a912e commit bdd3654
11 files changed
Lines changed: 88 additions & 59 deletions
File tree
- .changeset
- packages
- lint/src
- metadata-protocol/src
- objectql/src
- spec
- liveness
- src
- system
- ui
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
Lines changed: 9 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
86 | | - | |
87 | 86 | | |
88 | 87 | | |
89 | 88 | | |
| |||
241 | 240 | | |
242 | 241 | | |
243 | 242 | | |
244 | | - | |
| 243 | + | |
245 | 244 | | |
246 | 245 | | |
247 | 246 | | |
248 | | - | |
| 247 | + | |
249 | 248 | | |
250 | 249 | | |
251 | 250 | | |
252 | 251 | | |
253 | 252 | | |
254 | | - | |
| 253 | + | |
255 | 254 | | |
256 | 255 | | |
257 | 256 | | |
258 | 257 | | |
259 | 258 | | |
260 | | - | |
261 | 259 | | |
262 | 260 | | |
263 | 261 | | |
| |||
292 | 290 | | |
293 | 291 | | |
294 | 292 | | |
295 | | - | |
296 | | - | |
297 | | - | |
298 | | - | |
299 | | - | |
300 | 293 | | |
301 | 294 | | |
302 | 295 | | |
| |||
426 | 419 | | |
427 | 420 | | |
428 | 421 | | |
429 | | - | |
430 | | - | |
| 422 | + | |
| 423 | + | |
431 | 424 | | |
432 | | - | |
| 425 | + | |
433 | 426 | | |
434 | 427 | | |
435 | 428 | | |
436 | 429 | | |
437 | | - | |
| 430 | + | |
438 | 431 | | |
439 | 432 | | |
440 | 433 | | |
| |||
707 | 700 | | |
708 | 701 | | |
709 | 702 | | |
710 | | - | |
| 703 | + | |
711 | 704 | | |
712 | 705 | | |
713 | 706 | | |
714 | | - | |
715 | 707 | | |
716 | 708 | | |
717 | 709 | | |
| |||
720 | 712 | | |
721 | 713 | | |
722 | 714 | | |
723 | | - | |
724 | 715 | | |
725 | 716 | | |
726 | 717 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
134 | 134 | | |
135 | 135 | | |
136 | 136 | | |
137 | | - | |
138 | | - | |
139 | | - | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
140 | 140 | | |
141 | 141 | | |
142 | 142 | | |
| |||
201 | 201 | | |
202 | 202 | | |
203 | 203 | | |
204 | | - | |
205 | | - | |
206 | | - | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
207 | 208 | | |
208 | 209 | | |
209 | 210 | | |
| |||
520 | 521 | | |
521 | 522 | | |
522 | 523 | | |
523 | | - | |
| 524 | + | |
524 | 525 | | |
525 | 526 | | |
526 | 527 | | |
527 | | - | |
| 528 | + | |
528 | 529 | | |
529 | 530 | | |
530 | 531 | | |
| |||
768 | 769 | | |
769 | 770 | | |
770 | 771 | | |
771 | | - | |
772 | | - | |
773 | | - | |
774 | | - | |
775 | | - | |
776 | | - | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
777 | 782 | | |
778 | 783 | | |
779 | 784 | | |
| |||
792 | 797 | | |
793 | 798 | | |
794 | 799 | | |
795 | | - | |
796 | 800 | | |
797 | 801 | | |
798 | 802 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
228 | 228 | | |
229 | 229 | | |
230 | 230 | | |
231 | | - | |
232 | | - | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
233 | 236 | | |
234 | 237 | | |
235 | 238 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | | - | |
34 | 33 | | |
35 | 34 | | |
36 | 35 | | |
| |||
48 | 47 | | |
49 | 48 | | |
50 | 49 | | |
51 | | - | |
| 50 | + | |
52 | 51 | | |
53 | | - | |
| 52 | + | |
54 | 53 | | |
55 | 54 | | |
56 | | - | |
| 55 | + | |
57 | 56 | | |
58 | 57 | | |
59 | 58 | | |
| |||
0 commit comments