Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .changeset/25753-field-external-id-dead.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
'@objectstack/spec': patch
---

fix(spec): `os lint` tells an author that a field's `externalId: true` does nothing

Clause-②: no (a liveness-ledger re-grade: no schema, accept set, served body or error code moves; only the advisory `liveness-dead-property` warning on an authored `externalId: true` starts, and the flag's description is reworded)
Metadata-protocol: none

The shipped liveness ledger (`liveness/field.json`) graded a field's `externalId` flag `live` on the strength of one renderer module that was deleted for having no importers. Re-measured across `packages/**` and `ui/**`, nothing reads the flag: the Studio field inspector edits it and a metadata summary copies it, and no upsert matches on it. The row is now `dead`, so `os lint` warns on a field that sets `externalId: true` (the default `false` is not warned). The flag's schema description, and the reference pages generated from it, no longer say it drives upserts.

- **What to do.** Remove the flag. To match seed records on a field, name the field in the seed dataset's `externalId` (`name` when it is left out). For an import, name it in the mapping's `upsertKey`.
- **Unchanged.** Parsing (the key is still accepted, default `false`), seed loading, imports and every upsert.
8 changes: 3 additions & 5 deletions .claude/agents/os-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ model: opus
- 优先扩展一个守卫关掉整个类;任一条不成立 ⇒ 回默认:报告列出交席位立单、不碰。
- 本轮改动令其变假或触碰的已发布缺陷必修;其余立卡并记明已发布面,PR 照常落地。
4. ⛔ 永不推 `main`、合并任何 PR、在代码 PR 里改 `content/docs/releases/`;改错另开 docs-only PR。
- force-push 按落地仓 AGENTS.md:objectui/cloud 绝对禁;objectstack §3 五条全立才 `--force-with-lease`。
- force-push 按落地仓 AGENTS.md:cloud 绝对禁;objectstack §3 五条全立才 `--force-with-lease`。
5. **Contract-first。** 修复若诱使你在消费端加宽容回退(`??` 别名、宽松解析),缺陷在上游。
- 去生产者或 spec 修,或返回 `needs_decision`。
6. **issue 正文是线索,不是规格。** 动手前对 `origin/main` 核验其前提。
Expand Down Expand Up @@ -122,7 +122,7 @@ model: opus
- 从门禁绿跑清单里挑一个已 pin 的 fake 照抄。
- 缺一种该文件没有的 double 时,覆写文件里已有的 double 优于 pin 新的:不动台账。
- 匹配到零个脚本的 `pnpm --filter` 运行以 0 退出:什么都没跑,读上去却是通过。
- objectui 把 typecheck 拼作 `type-check`(连字符);核对输出里确实回显了脚本名。
- `ui/` 的包把 typecheck 拼作 `type-check`(连字符);核对输出里确实回显了脚本名。
- 浏览器验证:Chromium 已预装,`PLAYWRIGHT_BROWSERS_PATH` 指向 `/opt/pw-browsers`。
- launch 传 `executablePath: '/opt/pw-browsers/chromium'`;⛔ 永不跑 `playwright install`。

Expand Down Expand Up @@ -154,7 +154,7 @@ model: opus
- 派生答哪些门禁读你改的文件,不答哪些测试测这个脚本。
- 跑同目录点名它的 `*.test.ts`,加同包 tests 下 `git grep` 该脚本文件名的全部命中。
- 该脚本只住在 objectstack,答案只关于它所在的树:每次推导第一行(stderr)点名仓与 commit。
- 读之前先核对;姊妹仓未必有 `scripts/pm/dispatch-gates.mjs`:objectui 只有 `check-half-states.mjs`。
- 读之前先核对;姊妹仓未必有 `scripts/pm/dispatch-gates.mjs`:hotcrm 就没有。
- 把它们的路径喂进 objectstack 检出,得到的是 objectstack 的门禁族:形态完整、退出 0、全错。
- 那边的清单从该仓自己的 `package.json` 与 `.github/workflows/` 手工推导。
- 加 `--repo <owner>/<name>` 申报本次答案该属于哪个仓,不匹配即拒绝并同时点名两个仓。
Expand Down Expand Up @@ -306,8 +306,6 @@ model: opus
- 关此步骤的是读回不是写入;读回只验写落了,验不出有门在读:幻影门标签读回照样成功。
- 被拒 ⇒ 报端点与状态码、席位代挂,⛔ 不报 `blocked`、不走 MCP;收尾再读一次。
- 分类器拒外部写 ⇒ 停手,`deviations` 记命令与拒因,席位只转维护者定夺;⛔ 不换路重发。
- objectui:路径标签归 `labeler.yml`,逐 push 同步;无门禁读你打的标签 ⇒ 派发词未点名即零写。
- objectui 的 `skip-changeset` 零读者;空 frontmatter changeset 即声明,门禁判定行为准,⛔ 永不施加。
- 报告在本地验证走完时交付,CI 收敛等待归 PM 不归你:⛔ 不为等 CI 结论推迟报告。
- 门禁状态如实记录,`in_progress` 是诚实值;PR 开出后 ⛔ 永不 sleep、定时等待或空转轮询 CI。
- 你报告之后才转红的门禁,会作为同一认领上的补丁轮回来。
Expand Down
5 changes: 0 additions & 5 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
"Bash(agent-browser snapshot *)",
"Bash(agent-browser skills *)",
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectstack/issues/*/labels *)",
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectui/issues/*/labels *)",
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/hotcrm/issues/*/labels *)",
"Bash(curl -sS -X GET https://api.github.com/rate_limit *)",
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectstack/issues?* *)",
Expand Down Expand Up @@ -57,13 +56,10 @@
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/objectui/commits/*/check-runs* *)",
"Bash(curl -sS -X GET https://api.github.com/repos/objectstack-ai/hotcrm/commits/*/check-runs* *)",
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectstack/pulls/* *)",
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectui/pulls/* *)",
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/hotcrm/pulls/* *)",
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectstack/pulls/*/ccr/ready_for_review *)",
"Bash(curl -sS -X PUT https://api.github.com/repos/objectstack-ai/objectstack/pulls/*/ccr/auto_merge *)",
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/objectui/pulls/*/ccr/ready_for_review *)",
"Bash(curl -sS -X POST https://api.github.com/repos/objectstack-ai/hotcrm/pulls/*/ccr/ready_for_review *)",
"Bash(curl -sS -X PUT https://api.github.com/repos/objectstack-ai/objectui/pulls/*/ccr/auto_merge *)",
"Bash(curl -sS -X PUT https://api.github.com/repos/objectstack-ai/hotcrm/pulls/*/ccr/auto_merge *)",
"Bash(node --use-env-proxy scripts/pm/post-stamped.mjs *)",
"Bash(node --use-env-proxy scripts/pm/label-write.mjs *)",
Expand All @@ -78,7 +74,6 @@
"Bash(node scripts/pm/issue-transfer.mjs *)",
"Bash(node --use-env-proxy scripts/pm/issue-transfer.mjs *)",
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectstack/issues/* *)",
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/objectui/issues/* *)",
"Bash(curl -sS -X PATCH https://api.github.com/repos/objectstack-ai/hotcrm/issues/* *)"
],
"deny": [
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/checklist-test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ GitHub 写入只走 pm-dispatch 写入门:仓根直调 `scripts/pm/issue-create.
是协议载体、不入分诊 sweep,⛔ 不是可派发单元;工作标签随抽取出的缺陷卡走(RUNNER 抽取
义务条款)。**这条在记录的整个生命周期成立** —— 收口与关闭时同样不补挂。
- **正文**,按此顺序:
- **环境指纹** —— framework sha、`.objectui-sha`、端口、db、seed、时间戳。
- **环境指纹** —— framework sha(`ui/` 在内)、端口、db、seed、时间戳。
- **范围** —— 选择器 + 每项所对的 `revision`。
- **逐条款判定表** —— 项 · 条款 · 判定 · 一行**文本** oracle 证据
(API/网络/构建/测试结果 —— 服务端真相,永不是像素)。
Expand Down
28 changes: 10 additions & 18 deletions .claude/skills/dogfood-verification/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,24 +73,17 @@ dev 工作树、dev-server 端口、preview 浏览器全是**共享的**:并行
- [ ] ⚠️ **消融的 mutate 腿与 restore 腿都要重建 —— 但那条规则不是 dogfood 专属**:
判据、preflight 与两次实测住在 `.claude/agents/os-dev.md`;⛔ 这里不留第二份拷贝。
- [ ] `dist/` 已 gitignore —— 安全;永不提交构建产物。
- [ ] **`/_console` UI 是 *vendored objectui 构建*,与框架 `dist` 是两回事。** 它由
`.objectui-sha` 钉住、按预构建 bundle 提供。已合并的 objectui 修复 —— *甚至
bump 过的 `.objectui-sha`* —— 在 vendored console 重建之前**不会活在 :3000
上**:运行中的服务器继续提供旧构建产物(BUILD 陈旧 ≠ PIN 陈旧)。所以**在宣布
:3000/_console 上发现 console/Studio UI 缺陷之前,先对当前 objectui 源码或全新
构建核一遍** —— vendored bundle 可能是旧的,缺陷可能上游已修。最快的权威核验 =
objectui 的 HMR console 指向你的服务器:
- [ ] **`/_console` UI 是 *Console 构建*,与框架包的 `dist` 是两回事。** 它由
仓库根目录的 `pnpm console:build` 从 `ui/apps/console` 构建,拷进 `packages/console/dist`。
`ui/` 下已合并的修复在 Console 重建之前**不会活在 :3000 上**:运行中的服务器继续
提供旧构建产物。所以**在宣布 :3000/_console 上发现 console/Studio UI 缺陷之前,先
对当前 `ui/` 源码或全新构建核一遍** —— 构建可能是旧的,缺陷可能已修。最快的权威
核验 = `ui/` 的 HMR console 指向你的服务器:
`VITE_SERVER_URL=http://localhost:<port> DEV_PROXY_TARGET=http://localhost:<port> pnpm --filter @object-ui/console dev`
(独立 origin → 需要它自己的 `admin@objectos.ai/admin123` 登录)。跳过这步曾在
一个 objectui main 已修掉的 action-create 死路上白付一整圈 spawn-a-fix。
- [ ] **漂移的构建不再静默启动(#7752)。** `build-console.sh` 把它构建所用的 SHA 盖
进 `packages/console/dist/.objectui-sha`;当这个章与仓库的 `.objectui-sha` pin
不一致时,`os dev` **拒绝挂载 `/_console`** 并打印补救 —— `/_console/` 404,横
幅不再宣传 console URL。那是要修的前置条件,不是产品缺陷:跑
**`pnpm console:build`**(在仓库根目录跑,从本仓 `ui/` 下的 Console 源码重建;
改 Console 就改 `ui/` 下的源码)再重启。`pnpm check:console-sha`
不启动也能报同一比较。`OS_ALLOW_CONSOLE_DRIFT=1` 是故意启动陈旧 bundle —— 那之
后你做的每个 console 观察,描述的都是一个仓库没有钉住的 commit。
一个上游已修掉的 action-create 死路上白付一整圈 spawn-a-fix。
- [ ] **构建新鲜度由你自核。** `pnpm console:build` 产出的 dist 不盖 SHA 章,`os dev`
无从判定它是否陈旧,照常挂载 `/_console`;改过 `ui/` 就先在仓库根目录重建再观察。

## 3. 核验 —— 视觉 / API 先行,DOM 殿后(防误报规则)

Expand All @@ -104,8 +97,7 @@ dev 工作树、dev-server 端口、preview 浏览器全是**共享的**:并行
- [ ] **门的两侧都要测**:`requiresService`/`requiresObject`/权限门要在依赖存在*与*
缺席两种状态下各验一次。
- [ ] 服务端是权威可见性门(ADR-0124 D1)—— 客户端过滤只是「礼貌」。元数据开关不改
UI 时,先查强制在服务端(框架,可在本仓修)还是客户端(objectui console,另一
个仓)。
UI 时,先查强制在服务端(框架)还是客户端(`ui/` 的 console);两边都在本仓修。
- [ ] 用 `preview_screenshot`(API 改动用 `preview_network`)向用户证明;loading
spinner / 异步数据状态要显式写明,而不是声称你没等到的最终值。

Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/pm-dispatch/references/decision-analysis.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@

## 应用仓推荐序特例

- 能力先建在平台(spec、objectstack 运行时、objectui 渲染器);应用仓(cloud、hotcrm)不自建替代。
- 能力先建在平台(spec、objectstack 运行时与其 `ui/` 渲染器);应用仓(cloud、hotcrm)不自建替代。
- 阻塞源是平台缺陷 ⇒ 恒荐等待;⛔ 不荐绕行(形状容错、复刻平台规则)、不荐劈半落地。
- 过渡唯维护者明裁;应用仓临时扩展平台契约,仅当平台卡与移除卡同一裁决立出。
- 应用仓裁决立出的平台卡取被裁卡优先级,⛔ 不降档。推论出处:cloud 2932 A、cloud 2924 A。
4 changes: 2 additions & 2 deletions .claude/skills/pm-dispatch/references/dispatch-runbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
- 之二,解锁扫描反演 = 逐仓 `state=CLOSED` + `since` 与 `Blocked-by:` 反向索引求交,命中走双查。
- 之三,健康指标 = 逐标签 `perPage: 1` 只读 `totalCount`。
- 裸卡数例外:标签缺席无计数可读,取本轮析取①的枚举,⛔ 不另发查询。
- 每日层(当日首 fire)= 两仓全量对账 + 归集本就日频的职责。
- 每日层(当日首 fire)= 全量对账 + 归集本就日频的职责。
- 日频职责 = finding 集中轮;`Restart-when:` 批扫归车道巡查,决策箱回填归总监席。
- 成本靶:干活轮 ≤50k token,空转轮守既有探针预算。
- 每条枚举比对返回数与 `totalCount`;分页只治当次,一个谓词,⛔ 不加第二条代码路径。
Expand All @@ -86,7 +86,7 @@
- 交付了一半的阻塞是判断不是 grep,归四件之③,⛔ 不进机械旗。
- 发布窗口判据:已上膛 = 开着的 head `changeset-release/main` PR,`is:pr is:open head:changeset-release`。
- 点亮对照 `git ls-remote origin changeset-release/main` 必中;⛔ title 永不是判据。
- 两仓 title 不同、由 action 配置:objectui `chore: release packages`、objectstack `chore: version packages`。
- title 由 action 配置,本仓为 `chore: version packages`。
- 上膛与否不足:真判据是本卡 changeset 已否折进该 head `CHANGELOG.md`,即「离永久还有多远」。
- 卡上 re-check 命令两条硬线:① 每条 grep 自带阳性对照。
- 对照取同文件里确定存在、且 ⛔ 绝不是被测词子串的一个词。
Expand Down
3 changes: 1 addition & 2 deletions .claude/skills/pm-dispatch/references/filing-gate.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@
- 协议类:修复改 spec 接受/声明面(含 ADR-0087 转换窗)或 `/meta` 读存删门的收答,宽窄皆算。
- REST/数据门收窄亦算;措辞、文档、账本、CLI 旗、lint/verify 导出、门不变的服务行为不算。
- 此类任何车道皆 p1 + 在研大版 `target:`,可退役键的条件卡同档;维护者裁决,本节余条不压。
- 分诊轮的维护者清单点名等下个 `next.N` 的 objectui 卡数,堆积即请切版。
- 此类的消费方跟进卡(objectui 类型镜像、渲染器、Studio)缺它即坏用户才 p1,余者守本档。
- 此类的消费方跟进卡(`ui/` 类型镜像、渲染器、Studio)缺它即坏用户才 p1,余者守本档。
- 坏用户 = 设计器系统性写出协议拒收的元数据,或协议声明的块/键渲染为空;纯镜像不算。
- 此类的跟进卡全部列入消费方新大版的首发卡,赶在该版发布前落地。
- 清单项三态 ①:项会 fail ⇒ 断,继承其 `priority`;⛔「有人在等」不是定级判据。
Expand Down
7 changes: 3 additions & 4 deletions .claude/skills/pm-dispatch/references/lanes/director.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,15 @@
- 待您清单与待字索引随所属批只呈一次,⛔ 不逐轮重印;座位贴散文降为指针,标签即状态。
- 出口执行:核验动作确已发生,再摘标加证据评论同笔;出口条款见 `../state-machine.md`。

## 职责四:每日摘要、发版板、pin 链与总表
## 职责四:每日摘要、发版板与总表

- 每日摘要:在飞/待裁/待落地/撞墙、等复审逾 24h 的 PR、发版板、pin 滞后、无卡 fork PR。
- 每日摘要:在飞/待裁/待落地/撞墙、等复审逾 24h 的 PR、发版板、无卡 fork PR。
- 座位贴与在飞活性复查归本摘要,见 `../dispatch-runbook.md` 巡查常设项与 `../triage-duties.md`。
- 发版板 `target:<major>` 主仓归本席;判据二元,⛔ 不做优先级渐变:不修它,RC 能不能发。
- 判阻塞四类:① 用户今天就撞的已发布面缺陷;② 公开契约 declared≠enforced。
- ③ 存量数据/迁移形状(发布后修不回);④ 发布说明里要为它道歉的。
- 拆分/分票时 `target:*` 随工作走,对每一半重跑二元判据,默认继承,不继承按四类写明理由。
- 每张板恰好一个生产者;鲜度节奏、清板三选一、pin 前置见 `../seat-post-protocol.md`。
- 跨仓 pin 链:objectui pin 落后且其队列已空 ⇒ 在本仓立/刷新 console bump 单;⛔ 只立单不 bump。
- 每张板恰好一个生产者;鲜度节奏、清板三选一见 `../seat-post-protocol.md`。
- 见新 tag 族发布 ⇒ 在 cloud 与每个应用仓立平台版本 bump 单;单张封顶,已有则追评刷新。
- bump 单等待卡清单 = hold 索引(`Restart-when:`/`Blocked-by:` 点名该发布的 open 卡),查询落正文。
- 车队总表随本摘要重生成,坐席/接管/收班同笔;一席一行,⛔ 不手改;见 `../project-forms.md`。
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/pm-dispatch/references/lanes/hotcrm.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
- `objectstack-ai/hotcrm` 全仓:元数据优先的 CRM 样板工程,不入 spec 依赖链。
- 应用即展品,不是功能实验场 —— 收卡第一问恒为这张卡展现哪项平台能力。
- 边界:平台相关的功能在平台中实现。
- 建设 hotcrm 时发现的平台能力缺口,立普通平台卡到 objectstack 或 objectui。
- 建设 hotcrm 时发现的平台能力缺口,立普通平台卡到 objectstack(渲染器在其 `ui/`)。
- 那是 file-at-destination、非缝卡、待分诊;hotcrm 侧同笔挂 `pm:blocked` 加 `Blocked-by:` 回链。
- ⛔ 永不在 hotcrm 内绕行:绕行把平台缺口藏进样板,展品从此示范错误写法。
- `repo:hotcrm` 缝标签只给真协调卡,跨仓次序即卡的实质。
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/pm-dispatch/references/lanes/triage.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
见 triage-duties.md;本文是本席的岗位说明,现值状态恒在座位贴,⛔ 不迁入本文。

- 由维护者一句召唤到任一项目,默认同总监席项目;只写标签与审计评论,⛔ 无 PR、无认领。
- 范围 = objectstack、objectui 每张卡首触(业务理由与定级)与跨车道查重;应用仓无分诊席。
- 范围 = objectstack(`ui/` 在内)每张卡首触(业务理由与定级)与跨车道查重;应用仓无分诊席。
- 应用仓业务理由由该项目召唤的总监席复核;第三方应用的总监是其自身维护者。
- 每 fire 只取一个仓,两仓轮替、仓内最旧优先;最旧未路由超 4h 的仓本轮优先。
- 每 fire 最旧优先;最旧未路由超 4h 的卡本轮先清。
- 补半状态前先确认无人在动,读后新现六态属他席即停手;⛔ 不加第二席、不改 fire 频率。
Loading
Loading