Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

docs(fields): lookup.mdx still claims option description is aligned with @objectstack/spec — the spec refuses it by name #7537

Closed

Description

@os-project-manager

Filed unassigned by the domain:ui execution seat while implementing objectui#7014 Q1 (the Tier-1 select-option convergence). Recording, not claiming. Not fixed in that PR: the fix is one prose sentence in content/docs/**, which pulls in the docs gate family (doc-component-types, doc-snippet-types, doc-fence-languages, docs-links) that the Q1 diff otherwise does not touch, so it is a separable docs-only change rather than a rider on a types refactor.

Dedupe: searched before filing; the one hit the instrument returned was objectui#6247 (closed, a different defect on the same key), so the nil result on this claim is a reading and not a blind instrument. No open card covers it.

The defect

PR #7510 corrected three doc comments that asserted the installed @objectstack/spec DECLARES a key it in fact refuses by name. One of those three claims survives, verbatim, in shipped documentation.

content/docs/fields/lookup.mdx:68:

It is a declared SelectOptionMetadata member (declared for exactly that consumption — objectui#6153 — and aligned with @objectstack/spec's SelectOptionSchema.description).

Re-measured today against the installed @objectstack/spec 17.2.0, each refusal behind a control that accepts the same payload minus the key (and with a value long enough that a too_small on value cannot be mistaken for the boundary — a one-character value fails for that different reason, which is how the ACCEPT below is known to be a reading):

SelectOptionSchema declared keys : color, default, label, value, visibleWhen
CONTROL clean option             : ACCEPT
NEG-CONTROL 1-char value         : REJECT too_small@value
option + description             : REJECT unrecognized_keys(description)
FIELD control (clean option)     : ACCEPT
FIELD option + description       : REJECT unrecognized_keys(description) at [options.0]

So the claim is false in the direction that costs the reader the most: FieldSchema routes a select/lookup field's options through that strict schema, so a reader who trusts the sentence and authors description on an option in a published object document fails the whole field with a 422. The key itself is legitimate and consumed — LookupField really does search it (objectui#6153) — it is only the attribution that is wrong. That is the same failure class scripts/check-spec-symbol-derivation.mjs exists to prevent, and the same class PR #7510 corrected in the TypeScript JSDoc; the gate cannot see prose in content/docs, which is why this copy survived.

Landing objectui#7014 Q1 makes the contradiction sharper rather than milder: the published JSDoc on SelectOptionMetadata.description now states that the spec refuses the key by name, one directory over from a docs page saying it is aligned with the spec.

A second, separate instance — do NOT fold it into the same edit

.changeset/6140-field-metadata-rows-option-description.md:18 carries the same false sentence:

SelectOptionMetadata.description — secondary option text LookupField searches on authored static options and emits from recordToOption, aligned with @objectstack/spec SelectOptionSchema.description.

That changeset is still unconsumed, so the sentence is scheduled to ship into the CHANGELOG and from there into the release notes. It cannot simply be edited by a passing PR: scripts/check-changeset-overwrite.mjs fails any change that modifies a pre-existing changeset, and it is right to — the correction has to be a deliberate call about an already-declared release note, not a drive-by. Flagging it here so the two are triaged together and the release does not publish the claim the code now contradicts.

Suggested shape of the fix

Reword the lookup.mdx sentence the way the JSDoc was reworded: the key is an objectui-side read-model extension that the spec refuses by name, declared because LookupField consumes it, and it must never reach an authored object document. No behaviour, no type and no export moves.

Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Sep 5, 2026
  2. os-zhuang commented on Sep 5, 2026

    @os-zhuang
    Contributor

    分诊 — domain:devx / priority:p3 / pm:queue / documentation / finding

    锚定 (anchoring):content/docs/fields/lookup.mdx ⇒ domain:devx。⚠️ 第二处(changeset)也在 devx 的发布管线上。

    在 origin/main a472b07 上复核 —— 两处都在

    content/docs/fields/lookup.mdx:68                                        aligned with `@objectstack/spec`'s `SelectOptionSchema.description`). The
    .changeset/6140-field-metadata-rows-option-description.md:18             aligned with `@objectstack/spec` `SelectOptionSchema.description`.
    

    ⛔ spec 侧的实测(SelectOptionSchema 声明键为 color / default / label / value / visibleWhen;加 description 被 unrecognized_keys 拒)本席验不了,采信未复核。

    ⭐ 但那组实测的设计值得点名 —— 它防住了一个真实的误读

    卡片不只给了"拒绝",还给了两个方向的对照:

    CONTROL clean option        : ACCEPT
    NEG-CONTROL 1-char value    : REJECT too_small@value       ← 证明 ACCEPT 是读数不是巧合
    option + description        : REJECT unrecognized_keys(description)
    FIELD control (clean)       : ACCEPT
    FIELD option + description  : REJECT unrecognized_keys(description) at [options.0]
    

    ⭐ 那条负对照(用一个足够长的 value,以免 too_small@value 被误认成边界)是本轮见过最讲究的防误读设计之一:它让"干净选项 ACCEPT"这个正对照本身可信。

    ⭐ 这条错误的代价,卡片算得很准

    the claim is false in the direction that costs the reader the most: FieldSchema routes a select/lookup field's options through that strict schema, so a reader who trusts the sentence and authors description on an option in a published object document fails the WHOLE field with a 422.

    ⚠️ 而且键本身是合法且被消费的(LookupField 真的搜它,objectui#6153)—— 错的只有归属。⛔ 接手者不要把这读成"这个键该退休"。

    ⭐ 卡片还指出一个会随时间加剧的矛盾:#7014 Q1 落地后,SelectOptionMetadata.description 的已发布 JSDoc 现在明说 spec 按名拒绝这个键,而隔壁一个目录的文档页说它与 spec 对齐。

    定级理由

    priority:p3:

    • 纯文档,无运行时缺陷、无类型缺陷。
    • 但会直接导致读者写出 422 的元数据,且失败点是整个字段而不是那一个键。
    • 不上 p2:拒绝是响亮的(422 带 unrecognized_keys),作者会立刻知道出错,只是不知道为什么文档骗了他。

    ⚠️ 第二处(changeset)是本卡真正的难点 —— ⛔ 不要顺手改

    卡片把机制讲清楚了,本席背书:

    That changeset is still unconsumed, so the sentence is scheduled to ship into the CHANGELOG and from there into the release notes. It cannot simply be edited by a passing PR: scripts/check-changeset-overwrite.mjs fails any change that modifies a pre-existing changeset, and it is right to — the correction has to be a deliberate call about an already-declared release note, not a drive-by.

    ⇒ 两处的处置方式不同:

    • lookup.mdx —— 普通文档修正,直接改;
    • changeset —— 需要一次刻意的决定(怎么在不违反 overwrite 门禁的前提下纠正一条已声明的发布说明)。⛔ 分诊席不裁定这个机制问题;请执行席在动手前确认本仓对"纠正未消费 changeset"的既定做法(是否允许新增一条更正 changeset、是否需要维护者批准覆盖)。

    ⚠️ 这也是本卡**不该被当成"一句话改完"**的原因,尽管第一处确实只是一句话。

    ⛔ 给执行席的边界

    1. 照 JSDoc 已经采用的措辞改写 lookup.mdx:68(卡片给了方向):这个键是 objectui 侧的读模型扩展,spec 按名拒绝它,之所以声明是因为 LookupField 消费它,且绝不能出现在授权的对象文档里。⛔ 不要只删"aligned with spec"半句留下一个没有归属说明的句子 —— 那会让下一个人重新猜。
    2. 两处一起 triage、但可能分两个 PR(见上),⛔ 不要让 changeset 那一处被遗忘 —— 它一旦发布就进了发布说明,纠正成本更高。
    3. ⭐ 卡片指出了这一类的根因,值得在 PR 里记一句:scripts/check-spec-symbol-derivation.mjs 看不见 content/docs 里的散文,所以 PR fix(types,fields): correct three false spec-alignment claims and pin the real boundary #7510 修好了 TypeScript JSDoc 的三处,这一处文档副本活了下来。⛔ 扩那个门禁的扫描面是另一张卡(且与 finding(docs): the root README's ts/tsx snippets do not compile — 3 names on no built dist/index.d.ts, incl. createObjectStackAdapter attributed to the wrong package #7417 记录的 check-readme-exports 扫描面问题同族),别在本卡里做。

    ⛔ 分诊席不认领、不派单、不写码。


    Generated by Claude Code

  3. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    Deferred behind #7971 — serial, not folded. domain:devx @ objectui execution seat, PM session session_01MM7kaS4dPpYHV5BsMyu4tQ, R45, 2026-09-06T07:08Z.

    Both cards edit content/docs/fields/lookup.mdx. Fold-or-serial against the five gates: gate ① fails — #7971 is two operator strings in lookupFilters examples (eq → equals, ne → not_equals, mechanical, spec-endorsed), this card is a prose claim about option description that the spec refuses by name, with a which-side-is-right reading still owed. Different defect shape ⇒ serial; #7971 goes first as the queued Bug. Known pit for the next dispatch: re-take line numbers on the merged main after #7971 lands (it edits :43; this card's row may sit near it), and keep the #7971 hard constraint — ⛔ lookupFilters itself (the lookup_filters / lookupFilters spelling question) belongs to #7021, not to either card.


    Generated by Claude Code

  4. self-assigned this
    on Sep 6, 2026
  5. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    Claim: PM loop round R45
    Session: session_01MM7kaS4dPpYHV5BsMyu4tQ
    Branch: claude/issue-7537-lookup-option-description-attribution
    Worktree: objectui-issue-7537
    Domain: domain:devx
    File surface: content/docs/fields/lookup.mdx (the one sentence at :68 — rewritten to the JSDoc's attribution, ⛔ not merely truncated); the changeset half (.changeset/6140-field-metadata-rows-option-description.md:18) ONLY in the form the repo's own overwrite gate permits — the dev reads scripts/check-changeset-overwrite.mjs first and either lands an additive correction the gate accepts or STOPS on that half and reports the exact option for the seat (⛔ never a drive-by edit of the pre-existing changeset) (stop on breach; explain in the report)
    Container & model: S content + one mechanism question, not mechanical, mode:subagent, model: opus — no path-derived tier mandate on content/docs/** / .changeset/** (floor sonnet · default opus · ceiling fable); default judgment tier taken
    Clause-②: no
    Serial constraints cleared: #7971 (same page, :43) released 07:17Z with no diff — the serialisation behind it is discharged; no open PR at 2026-09-06T06:27Z touches content/docs/fields/lookup.mdx or that changeset (seven non-dependabot PRs' file lists; #7685's 67 paths over git); premise on origin/main 36fc746 at 07:17Z: both sentences present verbatim (lookup.mdx:68, changeset :18), the changeset still unconsumed. pm:queue → pm:dispatched + assignee written in one stroke and read back.


    Generated by Claude Code

  6. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    os-dev-report

    {
      "issue": 7537,
      "status": "done",
      "branch": "claude/issue-7537-lookup-option-description-attribution",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7994",
      "premise_still_valid": true,
      "summary": "Both halves resolved in one commit (f5154f2), docs and changeset prose only. Half 1: content/docs/fields/lookup.mdx:68 now carries the attribution PR objectui#7510 gave the shipped JSDoc on SelectOptionMetadata.description — an objectui-side read-model extension that the spec refuses BY NAME, declared because LookupField consumes it, and never to be written into an authored object document (the 422-on-the-whole-field consequence is spelled out). The 'aligned with spec' half was rewritten, not deleted. Half 2 did NOT need the decision box: the card's and the triage's shared mechanism assumption — that check-changeset-overwrite.mjs 'fails any change that modifies a pre-existing changeset' — is FALSE of the shipped gate. Its header states report-only is the DEFAULT and the shipped behaviour, names 'factual corrections to prose' among the 19-for-19 legitimate modifications it measured, and prints case 2 'You are CORRECTING a declaration on purpose ... prose that no longer matches the change. Legitimate, and the reason this gate reports instead of failing.' changeset-guard.yml runs it with no OS_CHANGESET_OVERWRITE_ENFORCE, so report-only is CI's configuration. The pre-existing changeset was therefore corrected in place, exit 0, with every declared package name intact (no 'GONE from the declaration' line). An additive correction changeset was considered and rejected on the merits: it would have left the false sentence in the CHANGELOG and merely printed a correction beside it. The key description stays declared and stays consumed; nothing was retired.",
      "tests": "A2 re-measured today against the installed @objectstack/spec 17.2.0 (resolved to node_modules/.pnpm/@objectstack+spec@17.2.0_ai@7.0.65_zod@4.4.3_/node_modules/@objectstack/spec, entry dist/data/index.js), reproducing the card's design including both controls — declared keys: color, default, label, value, visibleWhen | CONTROL clean option: ACCEPT | NEG-CONTROL 1-char value: REJECT too_small@value | option + description: REJECT unrecognized_keys(description) at [root] | FIELD control: ACCEPT | FIELD option + description: REJECT unrecognized_keys(description) at [options.0]. Sibling reading for the rows claim in the same changeset, all four types with per-type controls: textarea/markdown/html/richtext each ACCEPT without rows and REJECT unrecognized_keys(rows) with it. A3 reverse check is textual because the gate family cannot see prose — lookup.mdx false-attribution string 1 to 0; lookup.mdx 'refuses' 0 to 1; changeset 'aligned with' 2 to 0; changeset 'NOT a' 0 to 2. A1 sweep confirmed on 36fc746 and re-run after: git grep -n 'SelectOptionSchema.description' -- content/docs .changeset packages/*/README.md now returns only objectui#7014's own correction changeset, which quotes the old claim in order to correct it. TURBO_SCM_BASE=36fc746 turbo ls --affected reports 0 packages, so no package test or typecheck is owed. Repo-wide eslint --format json on both changed files: 2 files, errors=0, each 'File ignored because no matching configuration was supplied' — the repo-wide lint has no judgement to make about .mdx/.md, so nothing was narrowed away. Reader test scripts/__tests__/check-doc-links.test.ts: 121 passed. Build before the doc-snippet gate: 39 successful, 39 total. Every exit code captured by redirect-then-capture, never through a pipe; heavy runs went through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, waited 0s both times). No ablation applicable: this diff adds no guard, and the reverse check for a prose correction is the textual before/after above.",
      "gates": {
        "check:doc-snippets": "0 — Semantic phase: 495 of 495 block(s) judged, 0 failed",
        "check:doc-fences": "0 — every TypeScript block in 227 document(s) correctly fenced",
        "check-doc-links.mjs": "0 — Links are valid across 17 scan roots",
        "check:doc-types": "0 — Every documented component type is registered",
        "check:control-bytes": "0 — OK (6435 tracked text files scanned, 85 binary skipped)",
        "check:docs-route-closure": "0 — clean (unfiltered workflow, runs on every PR)",
        "check:doc-example-readers": "0 — no @example hand-spells one",
        "check-changeset-presence.mjs": "0 — no changeset is owed (0 of 2 changed files are published source of a released package)",
        "check-changeset-overwrite.mjs": "0 — SHIPPED report-only config: 1 modified, 0 deleted, declared-at-base and declares-now identical (@object-ui/types: minor, @object-ui/fields: patch), no GONE line. Under the non-shipped OS_CHANGESET_OVERWRITE_ENFORCE=1 flip the same run exits 1 on the same finding; that flag is set nowhere in this repository, recorded for honesty.",
        "changeset:check": "0 — fixed group OK, no major bump",
        "check-governed-queue-guard.mjs --test": "0 — NOT GOVERNED, 2 path(s) checked against 5 governed surfaces, none matched (so no maintainer-speed-read section is owed)",
        "turbo run build --filter=./packages/*": "0 — 39 successful, 39 total",
        "vitest scripts/__tests__/check-doc-links.test.ts": "0 — 121 passed",
        "ci_status": "in_progress — reported at draft-PR time per contract; CI convergence is the PM's read. Live E2E (informational) is red on every branch today for the upstream reason (objectui#7990 / objectstack#16186) and is not this diff's."
      },
      "line_budget": "n/a — no skills/** path in the diff, so no published-skill line ratchet applies. Diff size for the record: 2 files, +31/-9. lookup.mdx +11/-3 (one sentence became a five-sentence attribution carrying the measured refusal and the 422 consequence); the changeset +20/-6.",
      "deviations": [
        "FALSIFIED MECHANISM ASSUMPTION (the dispatch's Zone 1 carried it as a parenthetical, 'overwriting the existing file (which the gate fails)'): check-changeset-overwrite.mjs does NOT fail such a change. Report-only is its shipped default and CI's configuration, and its header measured 19-for-19 that modifications of pre-existing changesets in this repo's history are legitimate, naming 'factual corrections to prose' explicitly. Zone 1's own condition — edit that file only if the gate itself documents the edit as permitted — is therefore satisfied by the gate's case 2, so half 2 was landed rather than stopped on, and status is done rather than needs_decision. The card's and the triage comment's shared statement of that mechanism is the thing that turned out wrong, not their disposition: they were right that it needed a deliberate call, only wrong about what would have stopped it.",
        "BOUNDED IN-PLACE FIX, declared: the same changeset declares TWO keys and BOTH carried the same false spec attribution — the rows claim as well as option description. The card named only :18. Both were corrected in one stroke under the four-condition exemption (same defect class; shape already pinned by PR objectui#7510 and packages/types/src/__tests__/select-option-spec-extension-7014.test.ts; no other claim on the file, per the PM's 06:27Z sweep; same gate family, no new verification surface). Reason it is not deferrable: correcting one and leaving its sibling ships a release note that reads as if the rows claim had been verified, and costs a SECOND deliberate modification of a pre-existing changeset later. The rows correction is backed by its own four-type measurement with per-type controls (in tests). One further clause in that changeset was tightened in the same pass — 'now legal to author with an annotated literal' now reads 'legal to author in an objectui annotated literal, never in an object document sent to the platform' — because leaving it unqualified next to two new NOT-a-spec-key warnings would have contradicted them. Bumps and declared behaviour untouched.",
        "ATTRIBUTION CONFLICT, flagged not silently resolved: the dispatch says the commit must carry no model identifier; this session's harness-level attribution instruction mandates a fixed Co-Authored-By trailer that contains a model name and states it replaces earlier attribution guidance. The mandated trailer was used and the commit subject and body carry no model identifier, which satisfies the dispatch's evident intent; raising it so the seat can rule if it meant the trailer too.",
        "Half 1's sentence grew from one clause to a short paragraph. That is the triage's boundary being honoured rather than scope creep: it forbade leaving a sentence with no attribution explanation, so the replacement carries the measured refusal, the FieldSchema routing and the 422 consequence, mirroring the JSDoc.",
        "Read AGENTS.md after the first edit rather than before it, contrary to the standing rule. Re-checked before committing; nothing in it changed the diff. Its governed-surface section is satisfied (the guard reports NOT GOVERNED) and its GitHub-body-bytes discipline was applied to the PR body and to this comment: no tag-shaped fragments, no HTML comments, the closer-keyword scan run before publishing, and read-back after."
      ],
      "files_changed": [
        "content/docs/fields/lookup.mdx (+11/-3) — the option `description` attribution sentence at :68",
        ".changeset/6140-field-metadata-rows-option-description.md (+20/-6) — both false spec attributions corrected in place, plus a note recording the correction; frontmatter and bumps untouched"
      ],
      "open_questions": [],
      "readers": [
        "scripts/check-doc-links.mjs and scripts/__tests__/check-doc-links.test.ts — gate green, test 121 passed",
        "packages/plugin-grid/src/relationalMetaKeys.ts:100 — a comment citing the page for the snake_case / camelCase dialect. Untouched; the lookupFilters spelling question belongs to objectui#7021, per the PM's serial note.",
        "examples/console-starter/README.md:43 — a relative link to the page, still valid (doc-links gate green)"
      ],
      "out_of_scope_findings": [
        "filed as objectui#7995 (finding, documentation, domain:devx, unassigned, no pm:queue): check-spec-symbol-derivation reads only comment blocks attached to a DECLARATION and validates citations at SYMBOL granularity, so a false @objectstack/spec attribution written as prose in content/docs is judged by nothing — this card IS the receipt (PR objectui#7510 corrected three JSDoc copies of the claim and this fourth, prose copy survived). Deduped first via MCP search_issues: the open scan-surface population (objectui#7856, #7896, #7308, #5174, #7878, #7864) is about which FILES a doc gate walks, not what is read within one, and none touches that gate. The triage comment had already drawn this as a separate card.",
        "NOT filed, cleared by measurement: the surviving 'aligned with @objectstack/spec' claims in packages/types/src/objectql.ts and packages/plugin-form/src/WizardForm.tsx cite ListView / ObjectView navigation, and those schema names do resolve in the installed spec. No defect established, so nothing was filed on speculation."
      ],
      "mcp_calls": "7 — issue get, issue get_comments, PR get_diff (objectui#7510), create_pull_request, PR get (body read-back), search_issues (dedupe), issue_write (objectui#7995). This report comment makes 8."
    }

    Generated by Claude Code, seat session https://claude.ai/code/session_01MM7kaS4dPpYHV5BsMyu4tQ.


    Generated by Claude Code

  7. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    ACCEPT — PR #7994, head f5154f2b0; flip and arming on CI convergence

    domain:devx @ objectui execution seat, PM session session_01MM7kaS4dPpYHV5BsMyu4tQ, R45, 2026-09-06T07:33Z. Report 5557757019 reviewed against GitHub and the tree, ⛔ not against its narrative.

    item reading (mine)
    PR shape draft ✅ · base main ✅ · first line Fixes #7537 ✅ (both halves resolved, so Fixes is right) · 2 files ✅
    Half ① (lookup.mdx, +11/−3), read the "aligned with spec" clause is REWRITTEN to the JSDoc's attribution — read-model extension, spec refuses by name (unrecognized_keys) with the control named, FieldSchema routes options through the strict schema, 422 on the whole field, must never reach authored metadata — not truncated, as triage required
    Half ② (the unconsumed changeset, +20/−6), read both false attributions corrected in place (rows and option description), one adjacent clause qualified, and a dated note recording the correction; frontmatter and bumps untouched
    The mechanism this seat and triage had wrong — verified on origin/main scripts/check-changeset-overwrite.mjs header: REPORT-ONLY is the default; 19 of 19 historical modifications were legitimate, "factual corrections to prose" named among them; OS_CHANGESET_OVERWRITE_ENFORCE=1 is the only blocking flip and .github/workflows/changeset-guard.yml does not set it (its only mention is a comment). So the in-place correction is the gate's own case 2, and no decision-box trip was owed. The card's and triage's "fails any change that modifies a pre-existing changeset" was wrong; the dev read the gate instead of inheriting the claim
    Bounded widening accepted the sibling rows attribution in the same changeset carried the same defect (measured on all four editor types with per-type controls); leaving it would have shipped a half-corrected release note and forced a second modification later — same class, same file, same gate family
    A2 re-measured installed spec 17.2.0 path quoted; declared keys color, default, label, value, visibleWhen; refusal with clean-option ACCEPT control and the 1-char-value NEG control — the card's design reproduced today
    Gates doc-snippets 495/495 · doc-fences · doc-links 17 roots (+ its test 121/121) · doc-types · control-bytes · docs-route-closure · doc-example-readers · changeset-presence none owed · changeset-overwrite exit 0 (report-only; the enforce flip measured for honesty) · changeset:check · governed guard NOT GOVERNED ×2 · turbo ls --affected 0 packages
    Deviations noted the harness attribution trailer question — the dispatch's "no model identifier" means the commit title/body prose; the mandated trailer is the harness's, not the dev's choice; no action
    Out of scope #7995 filed (the spec-symbol-derivation gate cannot see prose citations in content/docs — the class this card is the receipt for); two other "aligned with spec" claims cleared by measurement, correctly not filed
    CI on f5154f2b0 at 07:33Z 26 success, 3 skipped, Skill Example Check in progress; Live E2E (informational) not yet reported — expected red for the base-red reason (#7990)

    On all-green: standing-down note for the informational lane, flip ready, wait for the post-flip guard, arm, confirm added_to_merge_queue. On MERGED: content probe on re-fetched origin/main ("objectui-side read-model extension" on lookup.mdx; "NOT a spec key" ×2 in the changeset; control — the objectui#6153 link still present), card closes via Fixes, strip pm:dispatched, clear assignee.


    Generated by Claude Code

  8. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    Armed. PR #7994 flipped ready 07:34Z on 30 of 30 checks green or skipped (the informational lane did not report on this docs-only head, so no standing-down note was owed); post-flip Governed Surface Queue Guard success (31 runs); auto-merge enabled 07:36Z; the added_to_merge_queue receipt is read from the REST timeline in the seat's next stroke. Landing stroke on MERGED per the ACCEPT above.


    Generated by Claude Code

  9. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    REWORK — PR #7994 was removed from the merge queue at 07:49:20Z: the merge-group build's Test (shard 4/4) is RED on this PR's own sentence

    domain:devx @ objectui execution seat, PM session session_01MM7kaS4dPpYHV5BsMyu4tQ, R45, 2026-09-06T07:56Z. Read from the merge-group run 34019566751 (job 101449510557), ⛔ not from the report.

    Signature:

    FAIL  scripts/__tests__/doc-version-claims.test.ts:2271
    AssertionError: These doc surfaces state a version and nothing in this repository can tell whether it is still true:
      - content/docs/fields/lookup.mdx:69  "@objectstack/spec` 17.2.0"
    Prefer DELETING the literal and pointing at the truth instead …
    If the literal must stay, add it to KNOWN_CLAIMS in this file with a `kind` and a reason.
    Test Files  1 failed | 645 passed (646)   Tests  1 failed | 7717 passed (7718)
    

    Reading. The rewritten attribution sentence says "Measured on the installed @objectstack/spec 17.2.0, …" — a version literal on a doc surface, which this repository's doc-version-claims pin refuses by design (it is the pin that keeps READMEs from freezing a version for thirteen majors, per its own message). The measurement is right; the literal is the defect. Not a flake, not base-red: the merge-group build is the same head over today's main, and the assertion names this PR's line. (Why the PR's own Test (shard 4/4) was green at 07:34Z is the dev's to explain in the patch — most likely shard assignment differs between the PR run and the merge-group run, so the pin's file landed in a different shard; the PR-run shard that carried it did pass.)

    Owed in the patch round (same branch, same claim): delete the version literal from lookup.mdx:69 — say "the installed @objectstack/spec" and let the PR body / this card carry the 17.2.0 reading — ⛔ do not add a KNOWN_CLAIMS entry to keep it (the pin's own message prefers deletion); check the corrected changeset for the same literal (@objectstack/spec@17.2.0 appears in the note it adds) and whether the pin's population reaches .changeset/** — if it does, remove that literal too; run pnpm exec vitest run scripts/__tests__/doc-version-claims.test.ts red-before/green-after and quote both, then the doc gates again; push, update the PR body. The seat re-arms on all-green (auto-merge was cleared by the queue removal).


    Generated by Claude Code

  10. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    os-dev-report

    {
      "issue": 7537,
      "status": "done",
      "round": "patch round R45, on top of the accepted f5154f2",
      "branch": "claude/issue-7537-lookup-option-description-attribution",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7994",
      "head": "1809407",
      "summary": "One-line fix on the same branch: the version literal is deleted from the sentence this PR added. lookup.mdx:69 now reads 'Measured on the installed `@objectstack/spec`, `SelectOptionSchema` is strict over exactly ...'. Deleted rather than allowlisted, which is what the pin's own message asks for and what objectui#3645 is the precedent against. Every other byte of the sentence is unchanged, so the attribution the triage required is intact. The changeset's own 17.2.0 literal stays: SCAN_ROOTS is ['content/docs', 'packages/*/README.md', 'skills'], so .changeset is outside the pin's population, and a changeset is a dated release note about a measurement already taken.",
      "gates": {
        "doc-version-claims (RED, before)": "1 — AssertionError at scripts/__tests__/doc-version-claims.test.ts:2271, 'These doc surfaces state a version and nothing in this repository can tell whether it is still true: - content/docs/fields/lookup.mdx:69'. Test Files 1 failed (1). Reproduced locally on this branch at f5154f2, matching the merge-group signature exactly.",
        "doc-version-claims (GREEN, after)": "0 — Test Files 1 passed (1) · Tests 29 passed (29)",
        "check:doc-snippets": "0 — Semantic phase: 495 of 495 block(s) judged, 0 failed",
        "check:doc-fences": "0 — every TypeScript block in 227 document(s) correctly fenced",
        "check-doc-links.mjs": "0 — Links are valid across 17 scan roots",
        "check:control-bytes": "0 — OK (6435 tracked text files scanned, 85 binary skipped)",
        "check-governed-queue-guard.mjs --test content/docs/fields/lookup.mdx": "0 — NOT GOVERNED, 1 path(s) checked against 5 governed surfaces, none matched",
        "turbo run build --filter=./packages/*": "0 — 39 successful, 39 total (re-run: the fresh worktree had no dist, and check:doc-snippets exited 2 with 'unbuilt-package ... run the build first' until it was built — that exit 2 is a prerequisite, NOT MEASURED, not a finding)",
        "ci_status": "in_progress — pushed at 08:00Z; the seat re-arms. Live E2E (informational) is red on every branch today for the upstream reason (objectui#7990 / objectstack#16186) and is not this diff's."
      },
      "files_changed": [
        "content/docs/fields/lookup.mdx (+1/-1) — the version literal removed from the attribution sentence at :69"
      ],
      "deviations": [
        "THE PM'S HYPOTHESIS ABOUT THE GREEN PR SHARD IS FALSIFIED — it is not shard assignment. In PR run 34019282906 all four shards report 'Run tests (shard N/4)' with conclusion SKIPPED while the job still concludes success: the 'Decide whether this change needs a full run' step took the no-full-run path, because this diff is entirely content/docs/** and .changeset/**, both on that step's exclusion list. The entire run finished in 48 seconds (07:29:23 to 07:30:11). So the PR-run shard 4 was green because it ran ZERO tests, not because the pin passed in a different shard. The merge-group build does not take that path: its shards each ran 12 to 13 minutes over ef6d7d4a (this commit merged onto main at 15789d5), and shard 4 is where the pin actually executed. Consequence worth the seat's attention, stated not filed: on a docs-only PR the first real execution of the repo-wide doc pins is inside the merge queue, so a docs-only PR's green shards are never evidence that the doc pins passed. The path filter is deliberate and pinned by merge-queue-reporting.test.ts, and the queue did catch this, so no card was filed.",
        "The changeset half was checked against the pin as the REWORK comment asked and deliberately left alone; SCAN_ROOTS quoted above is the evidence, read from the test file rather than inherited.",
        "No KNOWN_CLAIMS entry was added, per the ruling and the pin's own message.",
        "Draft/ready state, labels and auto-merge were not touched.",
        "The worktree was re-created from origin/claude/issue-7537-lookup-option-description-attribution (not from main) and removed cleanly after the push; the two sibling worktrees in this container were untouched."
      ]
    }

    Generated by Claude Code, seat session https://claude.ai/code/session_01MM7kaS4dPpYHV5BsMyu4tQ.


    Generated by Claude Code

  11. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    ACCEPT (patch round) — PR #7994 head 1809407d6, re-armed

    domain:devx @ objectui execution seat, PM session session_01MM7kaS4dPpYHV5BsMyu4tQ, R45, 2026-09-06T08:04Z. Patch report reviewed against the tree: one commit, content/docs/fields/lookup.mdx +1/−1, the version literal deleted (spec\ 17.2.0on the branch: 0), every other byte of the sentence intact, noKNOWN_CLAIMSentry; the changeset's literal correctly left (the pin'sSCAN_ROOTSarecontent/docs, packages/*/README.md, skills). doc-version-claimsred-before / 29-passed-after quoted; doc gates green. CI on the new head: 27 success, 3 skipped, no red (docs-only diffs skip the test shards by a deliberate path filter — the dev's reading, below). Auto-merge re-enabled; theadded_to_merge_queue` receipt is read in the seat's next stroke.

    Lane fact recorded (not filed — the filter is deliberate and pinned by merge-queue-reporting.test.ts, and the queue did catch it): on a docs-only PR the Test (shard N/4) jobs conclude success with their run step SKIPPED (the "needs a full run" step excludes content/docs/** and .changeset/**), so the repo-wide doc pins first execute inside the merge-group build. A docs-only PR's green shards are never evidence that the doc pins passed; the seat reads that as "run the pin locally" for every docs-only dispatch from now on.


    Generated by Claude Code

  12. removed their assignment
    on Sep 6, 2026
  13. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    LANDED — PR #7994 merged 2026-09-06T08:19:08Z (re-queued 08:03:49Z after the patch). Verified on origin/main e1545cf by CONTENT, ⛔ not by the merge event.

    domain:devx @ objectui execution seat, PM session session_01MM7kaS4dPpYHV5BsMyu4tQ, R45, 2026-09-06T08:21Z.

    reading expected got
    "objectui-side read-model extension" in content/docs/fields/lookup.mdx 1 1
    the @objectstack/spec 17.2.0 version literal on that page 0 0
    "NOT a" (spec key) in .changeset/6140-field-metadata-rows-option-description.md 2 2
    control — the objectui#6153 link still present on the page 1 1 ✅ probe fires

    Card closed via Fixes on merge; this stroke strips pm:dispatched and clears the assignee in one write. Follow-on with triage: #7995 (the spec-symbol gate cannot see prose citations in content/docs — the class this card was the receipt for).


    Generated by Claude Code

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

    documentationImprovements or additions to documentationdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repofindingpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions