Repository navigation
Commit d0a7e74
docs(adr-0087): amend D8 predicate 4 and D9 predicate 1 for ui packages (#26455)
<!-- claude-projects-attribution: {"github_login":"os-steve"} -->
_Requested by **Steve** · [project
thread](https://claude.ai/code/project/chan_01FdL1XeUyvVNxLreh3F4Qi9?thread=cmsg_01FdL1XeUyvVNxLreh3F4Qi9Ex6pB8edHJLnCCc1tgdXz5)_
Part of #26220 (PR 1 of 2 for parts 3 and 4: the ADR wording. PR 2, the
gate code, follows once this lands).
Clause-②: no
Metadata-protocol: none
**Governed (Tier H): `docs/adr/**`.** This PR stays a draft and is not
queued or armed until a GOVERNED_APPROVERS account approves it.
## 维护者速读(草稿)
**改了什么:** 只改了 ADR-0087 一个文件,加了两条修订说明,状态行也记了一笔。
- D8 谓词 4 加一个窄分支:接口除了 `any` 索引签名变成非 `any`(`unknown`
也算)以外,继承和所有成员逐字不变,就算收窄。
- D9 谓词 1 的入口映射:除了 `src/index.ts`,也认
`src/index.tsx`。两个都有就判为歧义拒绝,都没有照旧拒绝。
**为什么改:** 有两个 ui PR 走真实处置被门禁拒。#26293 把 `[key: string]: any` 改成
`unknown`,原文只认“整体是 any”。#26365(plugin-ai 退役)卡在入口映射上:38 个发布的 ui 包里有 21
个入口是 `src/index.tsx`。两处都只影响 TS 消费者,账本不是正确渠道。这是你在决策卡上选的方案 A。
**风险与代价(含回滚):** 谓词 4 是 `type-surface-only` 豁免的唯一保险。新分支要求除索引签名外逐字相同,所以
#6048(删成员)的形状照样被拒,自测里的回归钉继续断言这一点。入口映射只按源文件名判断,不读构建配置。本 PR 只改文字;门禁代码在 PR
2,带电池行和消融。回滚:revert 本 PR;PR 2 落地后要一起 revert。
**席位意见:** 同意合入(ui 席 1)。两条修订都只放宽到实测挡住的那一类,没有顺手扩大。D8 的新分支只放行「声明成员完全不变、只有
`any` 索引签名收窄」这一种情况;#6048 那种丢成员的情况照旧被拒,回归钉还在。D9 只多认 `src/index.tsx`
一个入口,两个入口同时存在时按有歧义拒绝。被挡的是 #26293(#25918)和 #26365(#25921 plugin-ai 下线);PR
2 把检查脚本和测试补上后,会拿这两个 PR 证明 exit 0。
**你要做的:** 读两条修订说明(D8 谓词 4 下、D9 不可映射段落下),同意就批准本 PR。批准后由席位入队,然后开 PR 2。
## What changes
`docs/adr/0087-metadata-protocol-upgrade-contract.md` only (+63 / −1):
- **Status line:** one `**Amended** (2026-10-27, #26220 …)` entry
pointing at the two notes.
- **D8, under predicate 4: amendment note "predicate 4 reads an `any`
INDEX SIGNATURE".** For a bare reference naming an exported `interface`,
or a `type` alias whose right-hand side is an object type literal,
predicate 4 also holds when (1) at base the member surface has at least
one index signature typed `any`, (2) at HEAD at least one of them
carries a non-`any` value type, with `unknown` counted as narrowed there
only, and (3) heritage, type parameters and every member are otherwise
identical, compared member by member on the masked, normalised surface.
The note states why this is not a weakening: the #6048 shape (a member
removed) fails condition 3 and keeps the founding-case refusal, and
dotted member paths are untouched.
- **D9, under the unmappable-entry paragraph: amendment note "the source
entry may be `src/index.tsx`".** The declaration entry
(`dist/index.d.ts` or its twins) maps to the package's one source entry,
`src/index.ts` or `src/index.tsx`. Both present is refused as ambiguous,
neither present is refused as before, and the build tool is never
consulted.
## Measured (main `83e9d718`)
- 38 published `ui/` packages (46 manifests, 8 private). 21 have
`src/index.tsx`, and all 21 name `./dist/index.d.ts` as their types
entry; their builds are vite-plugin-dts with `insertTypesEntry: true`.
- No workspace package has both `src/index.ts` and `src/index.tsx`.
- `@objectstack/client-react` (one of D9's four measured unmappables)
builds with `tsup src/index.tsx`, the same shape.
- #26293's operand at its merge base: `{ schema: TSchema; [key: string]:
any; }` → HEAD `{ schema: TSchema; [key: string]: unknown; }` (gate
output at `e349c832`, predicate 4 refusal).
## Gates
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives 24 commands at `2494b54b` (base
`83e9d718`). All 24 exit 0, including `node
scripts/check-adr-0087-registration.mjs --base origin/main` and
`--self-test`, `node scripts/check-adr-links.mjs`, `node
scripts/check-adr-symbol-anchors.mjs`, `pnpm check:adr-anchors`, `pnpm
check:doc-authoring` and `pnpm check:pm-governed-merges`. `pnpm --filter
@objectstack/lint run check:doc-formula-expressions` first exited 3
(prerequisite: `@objectstack/formula` and `@objectstack/lint` dist not
built); after `pnpm exec turbo run build --filter=@objectstack/formula
--filter=@objectstack/lint` it exits 0. `--ran`: 24 derived, 24 run, 0
NOT-MEASURED, 0 UNRUN. No package or script is touched, so there is no
build closure and no changeset (`skip-changeset`).
## Acceptance notes
- PR 2 (after this lands) carries the code in
`scripts/check-adr-0087-registration.mjs`: the predicate-4 limb with
red/green battery rows (#26293's shape green; a member removed beside
the index signature, the #6048 pin, a non-`any` base index signature,
and a dotted path all red), and the `src/index.tsx` mapping (green on a
vite-plugin-dts-shaped fixture; both entries present red as ambiguous),
each with an ablation. Its proof: `--base origin/main` exits 0 on #26293
and #26365.
- #26324 (predicate 2 cannot certify an operand named `default`) is a
separate card and is not addressed here.
---
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01Am8eYNReiNP66D2JihPS1q
Co-authored-by: Claude <noreply@anthropic.com>1 parent eeaa827 commit d0a7e74
1 file changed
Lines changed: 63 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
927 | 927 | | |
928 | 928 | | |
929 | 929 | | |
| 930 | + | |
| 931 | + | |
| 932 | + | |
| 933 | + | |
| 934 | + | |
| 935 | + | |
| 936 | + | |
| 937 | + | |
| 938 | + | |
| 939 | + | |
| 940 | + | |
| 941 | + | |
| 942 | + | |
| 943 | + | |
| 944 | + | |
| 945 | + | |
| 946 | + | |
| 947 | + | |
| 948 | + | |
| 949 | + | |
| 950 | + | |
| 951 | + | |
| 952 | + | |
| 953 | + | |
| 954 | + | |
| 955 | + | |
| 956 | + | |
| 957 | + | |
| 958 | + | |
| 959 | + | |
| 960 | + | |
| 961 | + | |
| 962 | + | |
| 963 | + | |
| 964 | + | |
| 965 | + | |
| 966 | + | |
| 967 | + | |
| 968 | + | |
930 | 969 | | |
931 | 970 | | |
932 | 971 | | |
| |||
1062 | 1101 | | |
1063 | 1102 | | |
1064 | 1103 | | |
| 1104 | + | |
| 1105 | + | |
| 1106 | + | |
| 1107 | + | |
| 1108 | + | |
| 1109 | + | |
| 1110 | + | |
| 1111 | + | |
| 1112 | + | |
| 1113 | + | |
| 1114 | + | |
| 1115 | + | |
| 1116 | + | |
| 1117 | + | |
| 1118 | + | |
| 1119 | + | |
| 1120 | + | |
| 1121 | + | |
| 1122 | + | |
| 1123 | + | |
| 1124 | + | |
| 1125 | + | |
| 1126 | + | |
1065 | 1127 | | |
1066 | 1128 | | |
1067 | 1129 | | |
| |||
0 commit comments