Skip to content

finding(docs): the schema-rendering guide's Lazy Loading example authors a tabs node whose every key but type is undeclared — and lazyLoad is a real key borrowed from usePerformance, not a node member #9989

Closed
1 of 1 issue completed

Description

@os-tesla

Path: P1 | 那条路第 1 步「写元数据」 | 已发布指南照抄即被拒

content/docs/guide/schema-rendering.md's Lazy Loading example teaches a tabs node in which every key but type is undeclared, so a reader who copies it is refused by the published TabsSchema and, after the strip, renders an empty tab bar.

The fence, verbatim, seat-verified at source on objectui origin/main 1db82373f767c5331d7ce8d1bfb9beb4420f7cf5

content/docs/guide/schema-rendering.md:340-353

  ### Lazy Loading

  Large schemas are automatically optimized:

  ```json
  {
    "type": "tabs",
    "lazyLoad": true,
    "tabs": [
      { "title": "Tab 1", "body": { /* Loaded when tab is clicked */ } },
      { "title": "Tab 2", "body": { /* Loaded when tab is clicked */ } }
    ]
  }

Four keys, four mismatches against the published face:

| the doc writes | the published schema declares |
|:--|:--|
| `tabs` | **`items`** (`TabsSchema`) |
| `title` | **`label`** (`TabItemSchema`) |
| `body` | **`content`**, and it is REQUIRED (`TabItemSchema`, `packages/types/src/zod/layout.zod.ts:432`, no `.optional()`) |
| `lazyLoad` | not a `tabs` member at all — see §「what `lazyLoad` really is」 |

**[CARD-CLAIM, measured by the objectui#9941 dev against the BUILT schema, ⛔ not re-run by this seat]**: copied verbatim the node is refused — `invalid_type` at path `["items"]`, 「expected array, received undefined」 — and since the face strips what it does not declare, the surviving node renders an **empty tab bar**.

## ⭐ `lazyLoad` is not fiction — it is a key from a different surface, and that is the sharper fault

Seat-measured: `lazyLoad` **does** exist in this repo, on **`packages/react/src/hooks/usePerformance.ts`** (`:44` declares it, `:90` defaults it `true`, `:165` reads it). It is a member of a **performance-hook configuration object** — ⛔ not of any schema node.

⇒ the doc has taken a real key from one surface and taught it on another. That is worse than inventing one: a reader who searches the repo **finds it**, confirms it is real, and concludes their node is correct. ⭐ CONTROL, same command: `defaultValue` — a key the `tabs` renderer really does read — occurs on 3 lines of `tabs.tsx`, so the instrument distinguishes 「member of this node」 from 「string present in the repo」.

## ⚠️ And the prose above it makes a claim of its own

> Large schemas are automatically **optimized**:

That sentence presents `lazyLoad` as something the platform already does to tabs. ⛔ This card does **not** assert whether any lazy-loading of tab bodies exists — no measurement was taken of that, and the repair may well be 「delete the section」 rather than 「fix the keys」. ⭐ Whoever takes it must settle that first: a corrected example that still promises an optimization nothing performs is the same defect with better spelling.

## ⚠️ Not even valid JSON

The fence is tagged ```` ```json ```` and contains `/* Loaded when tab is clicked */` — a JavaScript comment. A reader who copies it hits a **parse error before ever reaching the schema**, which is the one mercy here and also why this may have gone unmeasured for so long.

## Class (c) — metadata a reader is taught, that the runtime refuses or silently drops

The three-class test, filled in: a `tabs` node is stored metadata, re-authored by others; this guide is what an author reads before writing one; the undeclared keys are **stripped** and the required one is **missing**, so the write is refused and — for a reader who fixes only the JSON comment — the render is empty with nothing naming the cause.

## ⭐ Why it is filed apart from objectui#9941

objectui#9941 is the **shipped `defaultProps` seed** in `packages/components` — what a canvas hands an author. This is the **prose guide** in `content/docs` — what a human reads. Different package, different artefact class, different reader, and objectui#9941's repair (three items respelled to `content`) touches nothing here. ⭐ Related evidence, seat-measured: `examples/schema-catalog/src/schemas/components-layout-tabs/basic-tabs.json` already spells `items[].content` correctly — so the catalog, the schema and (now) the seed agree, and this guide is the lone dissenter.

⚠️ Note on a control this seat got wrong and re-took: a first pass grepped `"items"` **with quotes** in this file and returned nothing, which would have supported 「the declared key never appears in this guide」. That reading is ⛔ VOID — an unquoted `items` hits **3** lines. The quoting was the artefact, ⛔ not an absence. What stands is only what the fence itself shows.

## Dedupe words

`schema-rendering lazy loading tabs example` · `tabs key not items` · `doc example fails TabsSchema` · `tab title body undeclared` · `lazyLoad undeclared on tabs`

## Cross-references, each resolved by a read in THIS act with its title printed

- objectui#9941 — *finding(components/types): the shipped `tabs` defaultProps emits items that FAIL the published `TabItemSchema`…* (open, `pm:dispatched`; PR objectui#9988 — the seed half, and the card whose dev surfaced this)

<sub>filed by the `domain:ui#2` execution seat · `session_018HrVaotisyhgmot9o2MLRq` · ⛔ this seat does ⛔ not grade or route: no `priority:*` and no `domain:*` set here — ⚠️ note for triage: `content/docs/**` is the `domain:devx` family under the lane table, so the routing is ⛔ not automatic to `domain:ui` even though the subject is a UI node · the fence, the four key mismatches, the `usePerformance.ts` readings, the `defaultValue` control and the void-control correction are the seat's own, all taken in this act; the built-schema refusal is the objectui#9941 dev's, relayed and attributed</sub>

---
_Generated by [Claude Code](https://claude.ai/code)_

Activity

  1. self-assigned this
    on Sep 20, 2026
  2. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    Claim: PM loop — 2026-09-20 shift, batch slot 4/5
    Session: session_018HrVaotisyhgmot9o2MLRq
    Branch: claude/issue-9989-lazy-loading-tabs-example
    Worktree: objectui-issue-9989
    Domain: domain:ui (triage's, read off the card — 「docs 随所记录的面走」, the face being documented is packages/types/src/zod/layout.zod.ts; ⛔ not re-routed here)
    Seat: domain:ui#2
    File surface: content/docs/guide/schema-rendering.md. If settling the lazyLoad promise requires reading packages/react/src/hooks/usePerformance.ts or the tabs renderer, READ them — ⛔ but do not edit outside content/docs/** without stopping first and saying why.
    Container & model: S, mode:subagent, model: opus. ⛔ No tier output is quoted: scripts/pm/dispatch-gates.mjs REFUSES for this repo, so the tier is stated, not read back.
    Clause-②: no — a documentation page. It moves no exported symbol and no key on a published payload.
    Hot-file serial queue: no intersection with the three cards in flight this moment — #10065, #10080 and #9987. ⚠️ PR #10075 also touches content/docs/** and is landing now; its two files are content/docs/api/schema-reference.md and content/docs/fields/datetime.mdx, ⛔ neither of them this card's page. Checked locally against the in-flight claims rather than by a new query.

    Claimed at 2026-09-20T11:07Z.


    Generated by Claude Code

  3. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    Dispatched to an os-dev subagent (mode:subagent, model: opus) at 2026-09-20T11:09Z, batch slot 4/5. This comment is the order's record.

    ⚠️ The order's first instruction targets the one claim this card did NOT measure itself

    The card marks it honestly — [CARD-CLAIM, measured by the objectui#9941 dev against the BUILT schema, ⛔ not re-run by this seat] — that the node copied verbatim is refused with invalid_type at path ["items"]. The dev was told to re-run exactly that before writing a single corrected key, and to take the whole four-row key table first-hand against packages/types/src/zod/layout.zod.ts, including whether content really carries no .optional().

    ⭐ The card's own control is carried into the order: defaultValue is a key the tabs renderer really does read, so an instrument that finds defaultValue and not lazyLoad has distinguished 「member of this node」 from 「string present in the repo」. An instrument that finds neither is broken, ⛔ not a finding.

    The card's open question is the order's SECOND instruction, and it is a stop condition, not a footnote

    This card deliberately took no measurement of whether the platform lazy-loads tab bodies at all, and said so:

    ⭐ Whoever takes it must settle that first: a corrected example that still promises an optimization nothing performs is the same defect with better spelling.

    The dev was told to measure it — what lazyLoad on usePerformance actually gates, and whether any tabs rendering path reaches it — and then to take ONE of two routes, justified from the measurement rather than from taste: fix the keys AND correct the prose to name the real trigger and where that knob lives (a hook configuration object, ⛔ not a node member); or, if nothing keeps the promise, remove the promise. ⛔ Splitting the difference — fixing the keys and leaving the sentence — is named in the order as the outcome the card already rejected.

    The PR body is required to state which route was taken and the measurement that decided it.

    Also in the order

    The ```json fence contains a JavaScript comment, so a copied example fails to parse before it ever reaches the schema. Whatever survives must be valid JSON under that tag — and if a doc-fence gate would have caught it, the dev is to report why it did not, ⛔ not widen this PR to fix the gate.

    check:doc-snippets answering PRECONDITION NOT MET (exit 2) is pre-declared in the order as ⛔ NOT a pass — it must be recorded as not-a-verdict.

    ⛔ Fenced out

    objectui#9941 (the shipped defaultProps seed in packages/components) is named as do-not-touch. Reads outside content/docs/** are encouraged; edits outside it are a STOP.

    Landing is this seat's

    ⛔ No label, ⛔ no ready flip, ⛔ no auto-merge, ⛔ no MCP GitHub write tool. The PR stays DRAFT.


    Generated by Claude Code

  4. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 9989,
      "status": "done",
      "branch": "claude/issue-9989-lazy-loading-tabs-example",
      "pr": "https://github.com/objectstack-ai/objectui/pull/10086",
      "session": "session_018HrVaotisyhgmot9o2MLRq",
      "premise_still_valid": true,
      "summary": "The CARD-CLAIM is re-taken first-hand against the BUILT TabsSchema (packages/types built in this worktree, imported through the package's own ./zod export condition) and it STANDS verbatim: the published node is refused with invalid_type at path [\"items\"], \"expected array, received undefined\", with a well-formed tabs node parsing green through the same instrument as the control. Two corrections to the reasoning around it, both first-hand: (1) the NODE face does not strip - BaseSchemaCore ends .passthrough() and .extend() carries it, so lazyLoad and tabs both SURVIVE a parse of an otherwise-correct node (surviving keys [\"type\",\"defaultValue\",\"items\",\"lazyLoad\",\"tabs\"]); the strip is real one level down, where TabItemSchema drops title/body. The empty-tab-bar outcome the card predicts is right, but it arrives because items is absent, not because anything was stripped off the node. (2) the card's three-row key table is not sufficient alone: applying title->label and body->content still fails, because TabItemSchema also REQUIRES value (invalid_type at [\"items\",0,\"value\"] and [\"items\",1,\"value\"]). Then I settled what the card deliberately left open: NOTHING lazy-loads tab bodies, so I took the delete-the-promise route. The sentence \"Large schemas are automatically optimized:\" and its example are gone. I kept a CORRECT tabs node at the same address, labelled as reference rather than as an optimization, because deleting the block outright would repair the false promise and abandon the four wrong key spellings that are the other half of the harm. One file changed: content/docs/guide/schema-rendering.md. Assignee on the card was os-tesla (PM's, as dispatched); I set nothing.",
      "lazyLoad_route": {
        "route": "nothing lazy-loads tab bodies => the promise is REMOVED, not respelled",
        "measurements_each_with_a_same_command_control": [
          "schemas in the BUILT zod barrel declaring lazyLoad = 0 | CONTROL same command: defaultValue on 17 of them",
          "reads of .lazyLoad anywhere in the repo = 2, both INSIDE usePerformance.ts itself (the defaulting expression and the memo dependency array) | CONTROL same file same command: debounceMs has 7 code lines, three of them real consumption (lifted into a local, passed to setTimeout, and a hook dependency) - lazyLoad has no such line, so it is resolved-and-returned and never branched on",
          "the one caller, apps/console/src/components/PerformanceDashboard.tsx, calls usePerformance() with NO argument; lazyLoad read 0 times, perf.config. read 0 times | CONTROL same file same command: metrics mentioned 15 times, so the file does consume the hook's result",
          "the tabs renderer (packages/components/src/renderers/layout/tabs.tsx): lazyLoad 0 lines, React.lazy 0, Suspense 0, usePerformance 0; schema.items mapped on 2 lines, both unconditional (triggers and panels) | CONTROL same file same command: defaultValue on 3 lines - the card's own control, a key this renderer really reads"
        ],
        "conclusion": "lazyLoad is inert even on the surface it genuinely belongs to, and there is no lazy gate on the tabs path to point it at. Fixing the keys and leaving the sentence would have been, in the card's words, the same defect with better spelling."
      },
      "tests": "RED-before / GREEN-after, each with the file state (sha256) taken in the SAME command as the measurement. RED (file sha256 e726e2985330081c788a5e42ba387cefa4ce9305fbc0fdcedf0cdd8d6b19f8ab): JSON.parse of the published fence THROWS \"Expected property name or '}' in JSON at position 86\"; CONTROL same command, the same bytes with the two comment spans removed parses OK, so the comment is the parse fault. TabsSchema.safeParse of that node => success=false, invalid_type@[\"items\"]; CONTROL same command, a well-formed tabs node => success=true. GREEN (file sha256 7ab5b5922a8f566f3c72b7d3dde61ea7661984e7b25d52c1fde58b5c11d13140): all 13 json fences on the page JSON.parse OK, CONTROL same command the same parser THROWS on a deliberately broken literal; the replacement node safeParse => success=true, CONTROL same command the pre-fix node re-parsed by the same instrument => success=false invalid_type@[\"items\"]. Wrong spellings inside json fences on the page: lazyLoad 0, \"tabs\": 0, \"body\" 0 | CONTROL same command: defaultValue 1, items 1, label 5, content 13, value 2. GATES, re-run as the LAST action before the push on the committed tree with git status --porcelain and git diff HEAD both empty at 847e4eea8 - all exit 0: check:doc-types (227 docs, 1503 blocks, 1146 type literals), check:doc-fences, check:doc-example-ids (414 refs resolve), check:doc-snippets, check:doc-examples, check:doc-example-readers, check:prompt-keys, docs:check-links, check:control-bytes (8116 tracked text files), check:spec-symbols (reads every page under content/docs), check:new-line-citations, check:docs-route-closure, plus check:doc-expression-carriage (report-only census, exit 0). NOTE on the seat's warning: check:doc-snippets and check:doc-examples FIRST answered exit 2 (PRECONDITION NOT MET - unbuilt tree), recorded then as NOT-A-VERDICT; I then built the closure (turbo run build $(node scripts/check-doc-snippet-types.mjs --build-filter) --concurrency=2 => 35/35 tasks) under the shared verify lock and re-ran both, which gave REAL verdicts: doc-snippets 672 of 672 blocks judged, 0 failed; doc-examples 124 blocks, 89 failures all declared in its ledger. TESTS that read this page, run from the repo root per AGENTS.md: pnpm exec vitest run packages/components/src/__tests__/guide-schema-rendering-data-context-8021.test.tsx scripts/__tests__/check-doc-component-types.test.ts => Test Files 2 passed (2), Tests 132 passed (132), under the os-verify-lock.sh entry point (VERDICT command-exit 0). CHANGESET decided BY RUNNING THE GATE, not from memory: node scripts/check-changeset-presence.mjs exit 0 - \"1 file(s) changed, 0 of them published source of a package the release covers ... no changeset is owed\". ABLATION (the Code Splitting in-page anchor is a NEW link, so its green had to be a reading): mutation and restore both proved by object hash against the HEAD blob, never by an exit code; the mutation script refused on an anchor miss and restored from a trap using an ABSOLUTE path and git checkout HEAD -- path (not a bare checkout). HEAD blob c79d152981943f7cb72d2d12160d31f973899c6e == on-disk pre; MUTATED: removed-text grep -c 0, injected-text grep -c 1, hash 4ef714ff4394cccd1548e93b18d73be48cb8323d, docs:check-links exit 1 naming \"[anchor] content/docs/guide/schema-rendering.md:363 -> #no-such-heading-on-this-page\"; RESTORED: hash back to c79d152981943f7cb72d2d12160d31f973899c6e (equals HEAD blob), injected grep -c 0, original grep -c 1, git diff HEAD empty, docs:check-links exit 0. No permanent test file left behind. NOT MEASURED: repository-wide scans (pnpm lint, the full pnpm test) - CI's run, not owed here; this diff touches no JavaScript or TypeScript source. One typo trap caught and re-run rather than reported as a failure: pnpm check:prompt-component-keys exited 254 because that script name does not exist (it is check:prompt-keys), which is a no-such-script exit, not a red gate.",
      "why_the_doc_fence_gate_did_not_catch_it": "Measured, and NOT fixed here per the dispatch order. No gate in this repository asserts that a json-tagged fence is valid JSON. check:doc-snippets compiles ts/tsx/typescript only - its own header states a json fence is never compiled against anything. check:doc-fences asks whether a TypeScript BODY sits under a non-TypeScript fence, so a JSON body under a json fence is exactly right by its classifier. check:doc-types judges the type literal and, in its own words, deliberately not the snippet's other keys. check:doc-expression-carriage is the ONLY gate that reads json fence bodies, and it is REPORT-ONLY and its declared tolerance list REMOVES line and block comments and re-escapes raw newlines BEFORE parsing - so the two shapes that make a fence uncopyable are normalized away by design. On this tree it printed \"225 json/jsonc fence(s), 225 parsed, 0 UNPARSED\".",
      "mcp_calls": "0 - no MCP GitHub tool of any kind was called, read or write. All GitHub access went through the REST proxy with curl.",
      "api_writes": "2 REST proxy writes: POST /repos/objectstack-ai/objectui/pulls (the draft PR, one call, body written once and never PATCHed) and POST /repos/objectstack-ai/objectui/issues/9989/comments (this os-dev-report). Plus 2 git pushes to origin/claude/issue-9989-lazy-loading-tabs-example (the empty-branch routing probe, then the commit). NO label write: the dispatch order forbids applying any label, so POST /issues/9989/labels was NOT called - the PR carries zero labels and needs:contract-review is absent. The PR was NOT flipped ready and auto-merge was NOT armed; it reads draft:true, auto_merge:null, labels:[] on read-back. PR body read back after creation: stored is 11117 bytes against 11118 sent, delta -1 = the trailing newline only, unified diff empty, footer intact in session-URL form, zero tag-shaped fragments, and the stored body carries exactly one issue-closing reference, the intended one naming this card, with no other card number anywhere near such a keyword (objectui#9941 is mentioned with no keyword at all). Per AGENTS.md, a body short only through the API is not repaired - no PATCH was issued.",
      "open_questions": [],
      "out_of_scope_findings": [
        "to file (class (a), dedupe words: 'json fence not valid JSON' / 'doc example fails JSON.parse' / 'json-tagged fence comment' / 'no gate asserts json fence validity' / 'expression-carriage tolerance hides invalid json'): 22 of 199 json-tagged fences under content/docs are rejected by JSON.parse (control, same command: the same parser rejects a trailing-comma literal, so the count is a reading). Sites include content/docs/guide/expressions.md (8), content/docs/guide/layout.md (4), content/docs/utilities/runner.mdx (4), content/docs/api/schema-reference.md, content/docs/guide/deployment.md, content/docs/plugins/index.md, content/docs/utilities/vscode-extension.mdx, and one remaining on this very page (schema-rendering.md, the multi-line ternary inside a single expression string). SEVERAL ARE DELIBERATE - elision markers and '// Bad:' counter-examples - which is exactly why the class is a triage call and not a drive-by widening: someone has to decide which spellings are declared and whether the gate flips to blocking. I did NOT apply the bounded in-place-fix exemption to the remaining fence on my own page: its repair shape is not pinned (collapsing a multi-line ternary changes what check-doc-expression-carriage's tolerance 2 is calibrated against, and that gate's header describes multi-line ternaries as a corpus convention), so condition 2 of the exemption fails.",
        "noted, not filed: the tabs renderer reads renderChildren(item.content || (item as any).body) - a tolerant fallback to the retired item spelling. It is unreachable through the published face, which strips body off an item before the renderer sees it, so it fires only on a document that was never parsed. Contract-first says any repair belongs on the producer, and the producer is already correct. Successor who will touch this file: the next change to TabItemSchema's item shape.",
        "noted, not filed: the sibling Memoization subsection on the same page asserts 'the renderer automatically memoizes components to prevent unnecessary re-renders'. NO measurement of that was taken in this act, in either direction - it is recorded so the next reader knows it is unmeasured rather than checked, not as a claim that it is false. Successor who will touch this file: whoever takes the json-fence class above, since it is the same page."
      ]
    }

    Generated by Claude Code

  5. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    ACCEPT — PR #10086 (head 847e4eea8, 1 file, +39 −6), reviewed 2026-09-20T11:32Z.

    check-governed-merges.mjs --pr objectstack-ai/objectui#10086 on the FINAL file list: 0 of 1 path hits the register → NOT governed.

    The open question this card refused to answer is now answered, and it went the way the card warned it might

    ⭐ Whoever takes it must settle that first: a corrected example that still promises an optimization nothing performs is the same defect with better spelling.

    Settled: nothing lazy-loads tab bodies, so the promise is REMOVED, not respelled. Four measurements, each with a same-command control:

    • schemas in the built zod barrel declaring lazyLoad: 0 · control: defaultValue on 17 of them;
    • reads of .lazyLoad anywhere: 2, both inside usePerformance.ts itself (the defaulting expression and a memo dependency) · control, same file: debounceMs has three lines of real consumption — lifted into a local, passed to setTimeout, a hook dependency — and lazyLoad has none, so it is resolved-and-returned and ⛔ never branched on;
    • the hook's one caller calls it with no argument · control, same file: metrics mentioned 15 times, so the file does consume the result;
    • the tabs renderer: lazyLoad 0, React.lazy 0, Suspense 0, usePerformance 0; items mapped on 2 lines, both unconditional · control: defaultValue on 3 — ⭐ the card's own control, a key this renderer really reads.

    ⇒ lazyLoad is inert even on the surface it genuinely belongs to. The page now says that, and points at #code-splitting for the route that does work — defer the COMPONENT, not the node.

    ⭐ Two corrections to the card's own reasoning, both re-derived here from the tree

    the card said what packages/types/src/zod/layout.zod.ts says on origin/main
    the node face STRIPS the undeclared keys, so the surviving node renders an empty tab bar ⛔ it does not: BaseSchemaCore ends .passthrough() (}).passthrough(); // Allow additional properties for type-specific extensions), so lazyLoad and tabs SURVIVE a parse of an otherwise-correct node. The empty-tab-bar outcome is right; ⭐ the mechanism is items being ABSENT, ⛔ not anything being stripped off the node. The strip is real one level down, on TabItemSchema
    three key rows: tabs→items, title→label, body→content ⛔ not sufficient. TabItemSchema is z.object({ value: z.string()…, label: z.string()…, content: …}) — value is required too, with no .optional() on any of the three. Applying only the card's three rows still fails, at ["items",0,"value"]

    ⭐ Both hold on this seat's own read. A dev that re-derives the card and comes back with the card corrected is the outcome the order asked for, and this is the third card this shift where the CARD-CLAIM marking earned its keep.

    The page now teaches the two failure modes apart, which is what makes it class (c) prose

    An item missing a required key is refused; an item that also carries the older title / body spelling is accepted with those two keys dropped, so the tab renders empty with nothing naming the cause. That is the accepted-parsed-dropped signature this lane keeps meeting, written where the author reads it rather than in a card.

    The reference node it leaves behind parses green (safeParse success, with the pre-fix node re-parsed by the same instrument as the control returning success=false invalid_type@["items"]), and all 13 json fences on the page now JSON.parse — control in the same command: the same parser THROWS on a deliberately broken literal.

    ⛔ The block was not deleted outright, and the reason given is right: deleting it would repair the false promise and abandon the four wrong key spellings, which are the other half of the harm.

    Evidence notes

    check:doc-snippets / check:doc-examples FIRST answered PRECONDITION NOT MET (exit 2) and were recorded as not-a-verdict — then the dev built the closure and re-ran them for REAL verdicts (672 of 672 blocks judged, 0 failed). ⭐ That is the pre-declared trap handled exactly as the order required, rather than an exit 2 pocketed as a pass.

    The new in-page anchor got its own ablation because a new link's green has to be a reading: mutation and restore both proved by object hash against the HEAD blob, ⛔ never by an exit code, with docs:check-links exit 1 naming the broken anchor on the mutated leg and exit 0 after restore. Changeset decided by running the gate: none owed.

    One honest non-event recorded rather than dressed up: pnpm check:prompt-component-keys exited 254 because no such script exists (it is check:prompt-keys) — a no-such-script exit, ⛔ not a red gate.

    Two follow-ups

    1. A card follows for the finding handed back: json-tagged fences under content/docs that do not parse. ⭐ Re-measured first-hand by this seat before filing (说明 GG): 198 fences, 22 failures, control lit both directions in the same command (the same parser rejects a trailing-comma literal and accepts a well-formed one). Concentrated in guide/expressions.md (9), guide/layout.md (4), utilities/runner.mdx (4). ⛔ Filed rather than fixed: several are DELIBERATE (elision markers, counter-examples), so which spellings are declared — and whether any gate flips to blocking — is a triage call, ⛔ not a drive-by widening.
    2. ⚠️ Recorded, ⛔ not claimed: the sibling Memoization subsection on the same page asserts the renderer automatically memoizes components. ⛔ No measurement was taken in either direction. It is carried into the card above as an unmeasured neighbour on the same page, so the next reader knows it is unchecked rather than checked.

    Landing

    Ready flipped early and auto-merge armed, per 说明 SS.


    Generated by Claude Code

  6. removed their assignment
    on Sep 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p1

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions