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

decision: React 18 is a published peer contract (^18 || ^19 in 33 packages) that is never installed or tested — narrow to ^19, or add a React 18 lane? #13465

Closed

Description

@os-zhuang

Ruled: 6386224339 · letter A · 2026-10-24T15:47Z

Filing gate ②: a decision only the maintainer can make. Raised by the 2026-10-24 whole-repo review; the maintainer approved filing the review's independent cards verbatim: 「同意:建议新建:与合并无关、独立成卡的产品/契约项(可现在建)」. Batch-of: 13.

维护者速读

一句话问题:我们对外承诺 React 18 可用,但仓里没有任何东西在 React 18 上跑过——锁文件里 0 个 react@18、613 个 react@19.2.8,没有 18 的 CI 车道,radix 焦点补丁也是对 19 的树打的。要么把承诺收窄到 ^19(诚实,一次 minor + breaking 说明),要么加一条 React 18 测试车道(为一个没人证明存在的消费者付每次 CI 的钱)。

Measured (2026-10-24, HEAD 7981384)

  • 33 packages declare peerDependencies.react: "^18.0.0 || ^19.0.0"; root pnpm.overrides pins react / react-dom 19.2.8 and @types/react 19.2.18; grep -c "react@18\." pnpm-lock.yaml → 0 (control react@19.2.8 → 613); no workflow matrix mentions React 18; AGENTS.md §2 says "React 18+".
  • patches/@radix-ui__react-focus-scope.patch was written and tested against the 19-only tree.
  • Dedup (peerDependencies … react|React 18|react@18): 3 hits, none about this (two release PRs, one unrelated fix).

Options × real cost × effort

what what a customer sees effort
A Narrow every peer to ^19.0.0 (one changeset per package, minor with a breaking note per AGENTS 版本号策略) an 18 host gets a peer warning / refusal at install instead of a runtime surprise nobody can reproduce S, one PR, 33 manifests; no landed precedent for a peer narrowing in the dump
B Keep the range and add one React 18 vitest project / CI lane the promise becomes verified; every CI run pays another full suite (today's suite is 19,542 s measured) M, plus a permanent CI cost
C Keep as is an untested promise stays published 0

Business meaning: A is "we sell what we test"; B is "we test what we sell"; C is "we hope".

四轴(业务立场):① 长远:A 缩小契约到实测面,B 扩大验证面以配契约,C 留一个没人验证的声明;② 业务拉动:没有已知的 React 18 消费者(本仓看不到 npm 依赖方,未实测),零拉动默认 remove;③ 防 AI 犯错:A 让一个 18 主机在安装时响亮失败,C 让它在运行时静默坏掉;④ 创业阶段不扩散:A 删掉一个永久义务,B 新增一条永久车道。

Recommendation: A. Confidence gap: external React 18 consumers are 未实测 (npm dependents are not readable from the session); if one is known, B becomes the honest choice. Only-① check: 只看①选 A;②③④ 是否翻转:否。

裁后执行:A → one os-dev PR narrowing the 33 ranges with one changeset each, AGENTS §2 "React 18+" becomes "React 19"; B → a react18 vitest project under projects in vitest.config.mts and a shard in ci.yml (governed surface).

os-decision-facets
① 项目长远合理性:A 收窄契约到实测面,减少特例;B 扩大验证面;C 维持未验证声明。
② 实际业务拉动:无已知 React 18 消费者(未实测),零拉动默认 remove。
③ 防 AI 犯错:A 在安装期响亮拒绝;C 让 18 主机运行期静默失败。
④ 创业阶段不扩散:A 删一个永久义务;B 新增一条永久 CI 车道。
Prior rulings read: peerDependencies react|React 18|react@18 → 3 hits (unrelated); ADR none; thread: none.

Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24, written through the maintainer's own account token (the session holds no fleet-bot credential). Evidence files: that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; triage grades and routes; suggested labels are suggestions only.


Generated by Claude Code

Activity

  1. os-zhuang commented on Oct 24, 2026

    @os-zhuang
    ContributorAuthor

    Maintainer ruling — letter A.

    Source: the maintainer, in the Claude Code review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf chat on 2026-10-24, verbatim and untranslated: 「13465 同意」

    Recorded by that session on the maintainer's instruction (who: the maintainer; what: the quote above; where: the session chat, not GitHub). Per the card's 裁后执行 section, execution is now:

    • One os-dev PR narrowing peerDependencies.react (and react-dom where declared) from ^18.0.0 || ^19.0.0 to ^19.0.0 in the 33 packages, one changeset per package at minor with a breaking note (AGENTS.md 版本号策略: no major in a changeset); AGENTS.md §2 "React 18+" becomes "React 19" (governed surface, separate PR or an authorised approval).

    Transition applied in the same write: needs-user-decision → pm:queue; the Ruled: line is prepended to the body. Dispatch is the objectui domain:ui seat's.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    Contributor

    Triage: first grade — dependencies · priority:p2 · domain:ui · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-24T17:02Z

    ⛔ Not a claim, ⛔ not a dispatch.
    finding comes off.

    • Ruled A, 6386224339: narrow the 33 peerDependencies.react entries to ^19.0.0, with a minor changeset per package and a breaking note, per AGENTS 版本号策略. AGENTS.md §2's "React 18+" is fixed in the same PR, a governed line.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1 · 2026-10-25T00:31Z
    Session: session_01Erxd3BYXhV2mQMatxGZ9yg (the card session that works this card; claim written by the domain:ui seat 4 session session_01XWGTsmqrtrt1Zqh1ioWqsT)
    Account: os-elon-musk
    Branch: claude/project-thread-8vyi5c (platform-assigned at spawn; the card session can push only this branch)
    Worktree: objectui-issue-13465
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: every packages/*/package.json / apps/*/package.json that declares a react or react-dom peer range, AGENTS.md (the §2 "React 18+" line only), .changeset/13465-*.md (one per published package), pnpm-lock.yaml if the install rewrites it (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6387034917
    Premise: holds — on objectui main cd70b78, AGENTS.md:36 still reads "React 18+"; 31 manifests carry the exact string "^18.0.0 || ^19.0.0" (the card measured 33 at 7981384; the dev re-derives the set by any spelling, not by this count)
    Serial constraints cleared: seat 1's open PRs #13473 and #13474 touch no package.json and not AGENTS.md (read at this claim)
    Writes: all PR, comment and label writes go only through objectstack's relay (scripts/pm/fleet-write); never write with GitHub MCP.

    • Ruling (verbatim, 6386224339): 「13465 同意」 → letter A: "One os-dev PR narrowing peerDependencies.react (and react-dom where declared) from ^18.0.0 || ^19.0.0 to ^19.0.0 in the 33 packages, one changeset per package at minor with a breaking note (AGENTS.md 版本号策略: no major in a changeset); AGENTS.md §2 "React 18+" becomes "React 19" (governed surface, separate PR or an authorised approval)." Triage (6387034917) puts the AGENTS.md line in the same PR.
    • Tier H: AGENTS.md is governed. The PR stays draft and waits for an approval by GOVERNED_APPROVERS; draft a ## 维护者速读(草稿) section (Chinese, business view, seat opinion left empty). A narrowing of a published peer range also owes one contract-review-tier review before the queue.
  4. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Claim amendment · domain:ui#4 · 2026-10-25T00:33Z · amends the claim 6391446264 (append-only; the claim's other lines stand)

    Measured by the card session on cd70b78: 31 packages, 56 peer declarations (31 react + 25 react-dom); no other spelling; no @types/react peers. The ruling's "33" reads as 31.

    File surface, added on the card session's request (each edit makes a now-false statement true; no behaviour beyond the narrowing):

    • Tests that pin the old range: scripts/__tests__/react-peer-range-norm-3741.test.ts, scripts/__tests__/doc-version-claims.test.ts (with its claim-ledger keys), scripts/__tests__/quick-reference-current-release-4143.test.ts.
    • What those tests read: the 12 package READMEs' peer lines (packages/{auth,collaboration,components,i18n,layout,mobile,permissions,plugin-ai,plugin-designer,plugin-report,react,react-runtime}/README.md) and QUICK_REFERENCE.md's React row.
    • Consistency: content/docs/guide/troubleshooting.md, content/docs/guide/plugins.md, packages/create-plugin/src/templates.ts (the generated plugin's peers, its own minor changeset), comment-only lines in packages/react (useGlobalUndo), packages/components (inline-markdown, two "Built with React 18+" doc lines), packages/cli scaffold-dependencies + its test.
    • Cross-lane face: skills/objectui/SKILL.md (the Tech Stack line that mirrors AGENTS.md §2) and skills/objectui/guides/plugin-development.md are the domain:skills face (published skills/**). They ride here because they mirror the governed line this ruling changes. Net line budget for skills/**: 0 (rewrite in place, add nothing). The claiming seat follows them to MERGED; their review is owed at that face's tier (contract-review tier), on top of the Tier H approval the PR already waits for.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    ACCEPT → PR #13481 comment 6391709813 · domain:ui#4 · 2026-10-25T01:02Z. Tier H: waits for a GOVERNED_APPROVERS approval and a same-head contract review (needs:contract-review on the PR).

  6. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Landed · domain:ui#4 · 2026-10-25T03:00Z

    PR #13481 merged at 2026-10-25T02:18Z, merge commit 6f629a7310a53d7a60f9e1937d12223a7b141722, after the Tier H approval of record (os-zhuang) and the same-head contract review PASS (6392078557). The card closed completed through Fixes; pm:dispatched comes off in this stroke. objectui merges publish nothing (the changesets release is a human act).


    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

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedependenciesdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions