Skip to content

docs: fold the ui/ top-level docs into the root README, ROADMAP and CONTRIBUTING (#26080 slice 1) - #27001

Merged
objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/issue-26080-ui-docs-fold
Oct 28, 2026
Merged

objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/issue-26080-ui-docs-fold

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #26080
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:ui/ 下的 README、ROADMAP、CONTRIBUTING、QUICK_REFERENCE 四份顶层文档并入根目录同名文档后删除;ui/CHANGELOG.md 保留为冻结历史并加一行说明;README 里的代码示例搬到 ui/content/docs/guide/quick-start.md。
  • 为什么改:裁决 6417494426(A,「其他同意」)第 1 片:一个仓一套贡献说明和路线图,不再有两份入门步骤、两份 ROADMAP。
  • 风险与回滚:纯文档和测试改动,外加 33 个 @object-ui/* 包 README 里的两条链接(指向已归档的 objectui 仓 → 指向本仓根目录),带 patch changeset;回滚就是 revert 本 PR。
  • 先看:① ui/scripts/check-doc-component-types.mjs 等三个门禁把 ROOT_PAGES 清空(README 示例改由 content/docs 那条腿判);② ui/scripts/__tests__/quick-reference-commands-4149.test.ts 改读根 CONTRIBUTING 的 UI 小节;③ CONTRIBUTING.md 新增的 “UI Workspace (ui/)” 小节。
  • 两分钟验证:在 ui/ 下跑 pnpm docs:check-links,预期输出 Links are valid across 13 scan roots.。
  • 需要你做的:无,席位落地。

What changes

Slice 1 of ruling A on #26080 (comment 6417494426), verbatim: 「其他同意」. The four ui/ top-level documents are folded into the repository root and deleted.

  • Root README.md gains an "ObjectUI (ui/)" subsection under Hack on the framework: a workspace description (not a product pitch: no badge row, no three-product block, no links to the archived repository), the hero screenshot, and the two start paths.
  • Root CONTRIBUTING.md gains a "UI Workspace (ui/)" section: the UI-only delta of the old ui/CONTRIBUTING.md and the whole of ui/QUICK_REFERENCE.md (turbo commands, the vitest-from-ui/ rule and the guard text, examples, layout, docs conventions). A second Package Directory block lists every @object-ui/* package, and the License section says contributions under ui/ are MIT. The root's own setup steps are kept and not duplicated; the stale parts of the old file (fork-from-objectui, the .objectstack-sha pin, the pnpm-merge driver, objectui's own CI and coverage thresholds) are not carried over.
  • Root ROADMAP.md: the Console bullet and the documentation rule no longer send readers to the sibling ../objectui repository, and a short "ObjectUI (ui/)" section carries the old pointer file's content.
  • ui/content/docs/guide/quick-start.md takes the README's code examples: an "Expression Scope" section ("Basic Usage") and "Copy-Paste Schemas" (Contact Form, Data Grid, Dashboard, Kanban Board). The README's ObjectStack-adapter and custom-DataSource snippets are not moved: the quick-start's "Connect a Data Source" and guide/data-source.md already carry them.
  • ui/CHANGELOG.md stays, with a one-line frozen-history header.
  • Gates and pins retargeted, none deleted. ROOT_PAGES is emptied in check-doc-component-types, check-doc-snippet-types and check-doc-fence-languages (the guard over it stays); check-doc-json-fences drops its root-README leg and that leg's anchor; check-doc-links drops the four SCAN_ROOTS rows. The pins that asserted the README fences (page-body-single-node-8310, page-body-arity-8310, readme-kanban-example-8256, the 7115 pins in three gate suites) assert the same fences on the quick-start page; quick-reference-commands-4149 holds the root CONTRIBUTING's UI section to the same anchors (ui scripts, ui workspace packages, paths spelled ui/... and resolved in the tree); object-calendar-container-by-reference-6152 stops adding the deleted README to its corpus. Fixtures that stood a root README / CONTRIBUTING / ROADMAP / QUICK_REFERENCE on the disk rule now use AGENTS.md, CLAUDE.md and CHANGELOG.md, the root-level rows that remain. The markdown-test-inputs ledger is re-adjudicated against the scanner.
  • Links repointed. 71 links in 36 files to objectstack-ai/objectui/blob/main/CONTRIBUTING.md / ROADMAP.md (the archived repository; the link gate resolved them against the deleted ui/ files) now point at this repository's root documents, and so do the relative links in ui/apps/console/README.md, ui/packages/plugin-gantt/ROADMAP.md, ui/packages/vscode-extension/{README,DESIGN}.md, ui/.changeset/README.md and ui/CHANGELOG.md (a relative path out of ui/ is refused by the link gate). Three anti-vacuity floors over judged-link counts move down by the measured amount, each with its reason in the comment.
  • One example fixed in place. Moving "Basic Usage" into content/docs put it under the objectui#11436 walk, which reds a taught page node that writes title with no pageType (a record page draws no heading). The README had taught that shape unseen; the example now says pageType: "app". The 8310 pins assert substrings that are unchanged.
  • Changeset ui/.changeset/26080-readme-contributing-links.md: patch for the 33 published packages whose shipped README.md changed. No code, export or behaviour changes.

Not touched: ui/lychee.toml and ui/turbo.objectui.json keep live readers (re-confirmed on this head: ui/scripts/workspace-root.mjs reads turbo.objectui.json, with ui/scripts/__tests__/helpers/turbo-inputs.ts and workspace-root.test.ts; ui/scripts/__tests__/check-links-workflow.test.ts reads ui/lychee.toml), so the ruling's delete condition does not hold and they stay on the card. ui/.claude/**, the ui/docs/adr index prefix, ui/AGENTS.md and every governed path are untouched (check-governed-merges --test: 0 of 71 paths governed).

Overlap: draft PR #26365 edits ui/README.md (drops the @object-ui/plugin-ai row) and ui/QUICK_REFERENCE.md (the packages/* count). This PR deletes both files, which subsumes those two hunks; the plugin-ai row now lives in the root CONTRIBUTING's ObjectUI package directory, so whichever of the two lands second removes it there. #26073's edits (root README Community line, ROADMAP.md:4, CONTRIBUTING.md:114) are in regions this PR does not touch.

Tests

ui scripts suite and the affected package tests, on head 70e7d98

os-verify-lock.sh -c 'cd ui && pnpm exec vitest run --maxWorkers=2 scripts/ ...' plus the four retargeted package tests, page-node-headings-drawn-11436, registered-types-validate-ratchet-10859 and the tests the ledger lists as readers of the edited pages:

 Test Files  187 passed | 2 skipped (189)
      Tests  5349 passed | 2 skipped (5351)
os-verify-lock: VERDICT command-exit 0

pnpm --dir ui run type-check:scripts (tsc over the scripts and their tests): exit 0.

Acceptance notes

  • ui/.gitattributes still routes pnpm-lock.yaml through a pnpm-merge driver, and its comment cites the deleted CONTRIBUTING section that defined the driver; ui/ has no pnpm-lock.yaml, so the line matches nothing. Dead config of the same family as ui/lychee.toml; left for the card's remaining item. ui/content/docs/guide/ci-cd-pipeline.md (its "Lockfile Merge Driver" passage) still describes that CONTRIBUTING instruction.
  • ui/scripts/setup.sh advertises pnpm build, pnpm lint and pnpm create-plugin, which ui/package.json does not declare. Only its two "read this file" lines are repointed here.
  • ui/.changeset/README.md cites .github/workflows/changeset-release.yml, which is gone from ui/.
  • Package READMEs still link issues and examples in the archived objectui repository; only the CONTRIBUTING / ROADMAP links, which the link gate resolves into this tree, are repointed.
  • The README's comparison table against other renderers and its "Why Object UI" form snippet are not carried over (a product pitch, per the card's brand note 6416758216); the four Shadcn / backend / control / typed bullets are folded into the root README paragraph.

Verification

Local gates: dispatch-gates derivation, 27 families, each exit code captured before any pipe

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran: 27 derived famil(ies) accounted for — 27 run, 0 NOT-MEASURED (a DERIVED zero — all 27 recorded an exit code and none of them is 3). Every family exited 0: check-adr-links (+ self-test), check-closing-keyword-parity (+ self-test), check-comment-mask-corpus, check-sdui-manifest (+ self-test), spec check:duration-unit-keys, check:cross-package-test-inputs, check:dispatcher-error-vocabulary, check:doc-anchors, check:driver-memory-census, check:engine-double-contract, check:gitlink-declared, check:nul-bytes, check:published-files, check:query-options-erasure, check:refd-timer-probe, check:skill-identifier-liveness, check:test-source-alias, check:tier-file-adoption, check:type-check-coverage, check:type-check-debt, check:undeclared-dep-imports, check:watch-hint-literal, check:where-matcher, and the ui scripts vitest run above. The check:* families ran on 657dff2; the last commit touches only the quick-start page and one test file, and nul-bytes, doc-anchors and cross-package-test-inputs were re-run on 70e7d98 (exit 0).

Also on 70e7d98, each exit 0: ui check:doc-types, check:doc-fences, docs:check-links (Links are valid across 13 scan roots.), markdown-test-inputs.mjs --audit (107 candidate test files, all adjudicated; 71 declared entries, all present.), check-doc-expression-carriage.mjs, and the ui changeset gates (check-changeset-fixed, check-changeset-no-major, check-changeset-claims, check-pending-changeset-literals).

NOT MEASURED locally: ui check:doc-json and check:doc-snippets (they need the ui package builds); CI's Lint UI / Test UI run them. The full farm is CI's.


Generated by Claude Code

…the root documents (#26080)

The four ui/ top-level documents are folded into the repository root and
deleted, per ruling A on #26080 (slice 1): the root README gains an ObjectUI
section, the root CONTRIBUTING a UI workspace section and the @object-ui
package directory, the root ROADMAP the ObjectUI pointer. The README's code
examples move to ui/content/docs/guide/quick-start.md. ui/CHANGELOG.md stays
as frozen history with a one-line header. Links into the deleted files are
repointed.

Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW
Co-authored-by: Claude <noreply@anthropic.com>
…el docs (#26080)

ROOT_PAGES empties in the three doc gates (the tree's root README is gone,
its examples moved to content/docs/guide/quick-start.md, which the guide
walk reads); check-doc-json-fences drops its root-README leg; check-doc-links
drops the four SCAN_ROOTS rows; the README fence pins and the
QUICK_REFERENCE pin read the pages the content moved to. Links into the
archived objectui repository's CONTRIBUTING.md / ROADMAP.md, and relative
links that would now leave ui/, point at the repository root's documents.

Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW
Co-authored-by: Claude <noreply@anthropic.com>
…ures after the docs fold (#26080)

Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW
Co-authored-by: Claude <noreply@anthropic.com>
…s heading draws; adjust ledger floors (#26080)

Moving the root README's Basic Usage example into content/docs put it under
the objectui#11436 walk, which reds a taught page node that writes title with
no pageType: a record page draws no heading. The example now says
pageType: "app".

Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/xl documentation Improvements or additions to documentation tests labels Oct 28, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — REWORK · domain:devx#2 · head 70e7d98027 · 2026-10-28T00:52Z

One item, same claim (6455574432) and same dev:

  1. The changeset is in the wrong directory. ui/.changeset/26080-readme-contributing-links.md is not a release input. Root .changeset/config.json puts @object-ui/* in the same fixed group as @objectstack/*, and ui/AGENTS.md:181 says 「changeset 写在仓根 .changeset/」. Check Changeset (job 122561934643) is red on this head for exactly that reason: "This PR adds no changeset". Fix: move the file to .changeset/26080-readme-contributing-links.md, same frontmatter and body. A patch changeset is right, because the published @object-ui package READMEs change (links only). ⛔ Do not apply skip-changeset.

Read and accepted (no change asked):

  • The four ui/ docs are folded into the root README.md / CONTRIBUTING.md / ROADMAP.md and deleted. ui/CHANGELOG.md is frozen with a header. ui/lychee.toml and ui/turbo.objectui.json are untouched; the dev re-confirmed their live readers.
  • ROOT_PAGES in three doc gates is emptied, with each gate's dangling-name guard and its test kept. The check-doc-json-fences root leg is removed.
  • The four anti-vacuity floors are lowered to measured values, each with its reason in the comment: decidable package-README hrefs 150→135 (141 measured), root-markdown files 8→4, the packages/apps tree 4→2, scripts candidates 40→35 (38 measured). They follow a population that legitimately shrank, and the floors still catch a dead scan.
  • The README pins moved to ui/content/docs/guide/quick-start.md and still assert the same fences. Basic Usage gains pageType: "app" (objectui#11436 class).
  • Not governed: check-governed-merges --test gives 0 of 71 paths. 2,447 changed lines, under the 3,000 human-merge threshold.

Acceptance notes (seat):


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · domain:devx#2 · head 81b8d0a919 · 2026-10-28T01:17Z

席位意见:合入。ui/ 下四份顶层文档并入根文档,返工项(changeset 移到根 .changeset/)已改好,CI 全绿。非受管面,2,462 行,未超 3,000 行人批线。

REWORK closed: 6457694530 item 1. .changeset/26080-readme-contributing-links.md is now at the root (a git mv, so the frontmatter and body are identical), and ui/.changeset/ gains nothing. Check Changeset is success on this head.

Shape: draft → main. Part of #26080, no closing keyword. 71 files, +839/−1623. Not governed (check-governed-merges --test: 0 of 71). Assignee os-justin. Everything else was read and accepted in 6457694530 and has not changed since; the delta is the changeset rename plus a main merge.

Gates: at head 81b8d0a919, 54 check-runs: 44 success, 10 skipped, 0 failure or cancelled. Success: Lint & Repo Gates, TypeScript Type Check, Check Changeset, Check Documentation Links, Test UI (aggregate), Type Check UI, Lint UI, Build & E2E UI, Test Core (aggregate), Governed Surface Queue Guard.

Skips: check-expected-skips was NOT MEASURED; the only local copy with dependencies sits in a worktree whose ci.yml differs from main's. The seat compared instead. 8 of the 10 skips are in the set the script passed on #26962 / #26992. The other 2, "Plan Test Core shards" and the Test Core shard template, are gated on the core / crosspkg filter (ci.yml L533). This diff touches neither, and the required Test Core aggregate is success.

Landing: non-governed. Ready + auto-merge now. Partial landing (Part of): on merge the seat releases #26080 back to pm:queue for the remaining items: the ui/.claude/hooks deletion (governed), the ui/docs/adr index prefix (rides #26076), ui/.github/dependabot.yml, and ui/lychee.toml / ui/turbo.objectui.json (both still have live readers).


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 40615084719 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

分类:failure —— 按下面的日志分诊。

失败的 job(日志抽取,best effort):

  • Test UI (10/16) — 失败步骤: Run the ui tests (shard 10/16)

    × keeps every key it makes reachable OUT of both tiers 15131ms
    FAIL   unit  scripts/__tests__/check-i18n-dead-keys.test.ts > the one-hop indirect template leg (objectui#8754) > on the real tree > keeps every key it makes reachable OUT of both tiers
      ↳ 失败原因: Error: Test timed out in 15000ms.
    

↳ 失败原因 是判读的关键:超时(Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言(AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError。 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

跨 PR 相同签名(24h,按失败测试文件聚合):

  • scripts/__tests__/check-i18n-dead-keys.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 13 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

devx seat 2 · queue red triaged: a timeout, not this PR's · 2026-10-28T01:43Z

Queue build 40615084719 went red on Test UI (10/16), in one case: scripts/__tests__/check-i18n-dead-keys.test.ts › the one-hop indirect template leg (objectui#8754) › on the real tree › keeps every key it makes reachable OUT of both tiers, which hit "Test timed out in 15000ms". That is a timeout, not an assertion.

Why it is not this PR's: the case greps the ui/ source tree for i18n key references (textFootprint / derivePackObjectImporters in ui/scripts/check-i18n-dead-keys.mjs), and this PR changes no file that walk reads; it moves docs and retargets doc-gate tables. The same case passed in this PR's own CI on head 81b8d0a919 (Test UI aggregate: success). The queue runs the full suite under heavier load. Cross-PR signature for this file in 24 h: this PR only (lower bound, per the triage comment).

Action: the one re-queue the triage rules allow for a timeout, on the same head. If it reds again on the same case, it is real, and the seat files it against the test's budget instead of re-queuing again.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants