Skip to content

Commit 3fd460e

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-15451-oauth-delete-void
2 parents c094e3f + fa125f3 commit 3fd460e

29 files changed

Lines changed: 1793 additions & 1563 deletions
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
---
2+
'@objectstack/objectql': minor
3+
'@objectstack/spec': minor
4+
---
5+
6+
feat(objectql,spec): `Field.valueDomain` binds at the write seam — a non-member is refused with `value_domain` (maintainer ruling 2026-09-02 on #14168, engine half)
7+
8+
**BREAKING** accept-set narrowing on the ObjectQL record write path, shipped as
9+
`minor` under the repo's launch-window convention for breaking changes.
10+
11+
The key is **already published, and published unenforced**. The version-packages
12+
cut `8a1bad8b8` (2026-09-04 10:20Z) consumed the spec half's changeset
13+
`field-value-domain-slot.md` and released `@objectstack/spec@17.3.0`, which
14+
declares `Field.valueDomain`, parses it, and refuses it on any type other than
15+
`text` — and never reads it when a record is written. The 17.3.0 liveness ledger
16+
states the gap in its own words: "a non-member WRITTEN to a `text` field
17+
declaring a domain is accepted today". That write is accepted on 17.3.0 and is
18+
refused from this release on.
19+
20+
**Refused shape**, precisely: a record write that supplies a value for a `text`
21+
field whose definition declares `valueDomain`, where the WRITTEN value is not a
22+
member of the named standard. It fails with the field error code `value_domain`,
23+
carrying `constraint: { valueDomain }` and a message that names the standard in
24+
all four platform locales. Nothing else narrows — a field that declares no
25+
`valueDomain` is untouched, and so is every other field type, because the schema
26+
accepts the key on `text` alone and the validator judges exactly that set.
27+
28+
**Remedy: write a member of the declared standard.** `iana_time_zone` admits
29+
`UTC` and refuses `Mars/Olympus`; `iso_4217_currency` admits `CHF` and refuses
30+
`chf`; `iso_3166_alpha2` admits `CH` and refuses `ZZ`. Dropping the
31+
`valueDomain` declaration from the field lifts the refusal entirely, for an
32+
author who declared a domain they did not mean.
33+
34+
**No stored row is touched, and none becomes invalid.** This is the `min` /
35+
`max` / `maxLength` transition-gate class: a value stored before the domain was
36+
declared — or before this release — is never re-read, and it survives an edit of
37+
another field on the same record. An absent or empty value follows the field's
38+
`required` handling, not this check.
39+
40+
<!-- adr-0087: not-required (no-migration-prescription) Nothing authorable is
41+
renamed, retired or tombstoned. `Field.valueDomain` keeps its name, its type and
42+
its position; this release only makes the declaration the key already carries
43+
bind at the write seam, so `objectstack migrate meta` has no metadata to
44+
rewrite — a document that declares a domain is already in its final spelling,
45+
and one that declares none is untouched. ⚠️ This disposition does NOT rest on
46+
the key being unpublished, and must not be read that way: 17.3.0 shipped
47+
`Field.valueDomain` declared, parsed and UNENFORCED, which is exactly why this
48+
changeset carries the BREAKING banner above. It rests on the stored side
49+
instead. A stored value outside a declared domain is never re-read, so no stored
50+
row is invalidated here and none is reachable by a ledger entry at all. And
51+
which member a stored non-member SHOULD have been is authoring intent no ledger
52+
entry can decide: the stored string carries no evidence of whether the author
53+
meant a different member of that standard, a different standard, or no
54+
declaration at all. The channel that reaches the author is the refusal itself,
55+
raised at the write, naming the standard — the same ground the sibling
56+
accept-set narrowing #15319 stands its own `no-migration-prescription`
57+
disposition on. -->
58+
59+
- The membership test is the spec's shared `isValueDomainMember` — the same
60+
predicate, over the same closed vocabulary, that a settings specifier's
61+
`valueDomain` uses. A time zone accepted in Settings is the time zone
62+
accepted in a field.
63+
- The two authoring forms (`fieldForm`, `objectForm`) gain a `valueDomain`
64+
control, shown on exactly the types the schema accepts the key on. The
65+
object-form control's choices are derived from the vocabulary, not re-typed.

.claude/skills/pm-dispatch/SKILL.md

Lines changed: 702 additions & 862 deletions
Large diffs are not rendered by default.
Lines changed: 50 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,60 @@
1-
# 契约复核细则(席内)(references —— 按需加载)
1+
# 契约复核细则(席内)
22

3-
出处:主文件条款②闸门(原则/双肢与档位单源在彼);本表 = 复核细则,⛔ 不引 issue 编号
3+
见 SKILL.md 〈入队与落地〉的条款②闸门;本文只放载体纪律、归属资格与降档保险丝
44

55
## 载体纪律(挂与清)
66

7-
- **适用性 —— 内容肢及于 published `skills/**`**(2026-08-31 裁定):作**可证伪的
8-
算子/契约语义主张**的改动挂标走本复核;⛔ 判据不是「提到契约」,纯算子清单、拼写、
9-
格式不触发(标尺:10 处命中仅 3 处主张)。受管面人工合并 ⛔ 不替代复核,两道保障叠加。
10-
- **claim 声明按设计临时(provisional)**(2026-09-01 裁定):`Clause-②: yes|no` 只定
11-
派发档位的保守方向,⛔ 非终审;真闸门在 PR/报告时的档位复核 —— 证据与成本在那里。
12-
声明被档位推翻 = 机制按设计工作,⛔ 不作席位过失。
13-
- **机械地板(同笔;claim 时可查树、无需判断)**:任何**新导出符号****已发布载荷上的
14-
新键**`yes`,直接锁契约复审档。**conformance 类 ⛔ 不机械化**(填充已声明字段、在两
15-
个已发布码之间重选输入类):判别需档位判断,claim 拿不准 ⇒ **按 yes 派契约复审档**(假
16-
yes 自纠、假 no 出货);⛔ 不建全量分类学与 claim 时决策程序(创业镜头:代价是复审轮)。
17-
- **PR 与卡双载体同笔挂**(2026-08-22 裁定)(PR 一存在即挂,报告先于 PR 到达则先挂卡侧、
18-
ACCEPT 时补齐 PR 侧),同笔在卡上记一行
19-
条款②认定;停靠短暂(只防复核完成前误入队),⛔ 无「等外部席位」的无限期状态。
20-
-**不预挂**(维护者 2026-08-28 裁定):可复审增量存在前永不挂标,提前挂已废止 —— 前瞻
21-
条款②事实住卡上裁决/分诊评论、`Clause-②` 申报与 `--tier` 输出;开载体恒 = 真实待审。
22-
- **载体不迁移**(2026-08-18 裁定): 闸门载体保持本标签,
23-
⛔ 不迁 PR review / Request Changes、不为迁移留门。
24-
- **重挂前先查裁决**:闸门标签缺失 ⇒ 先 grep 卡评论找复审结论 —— PASS +
25-
无标 + head 未动 = 已清标非被剥;head 后移或无结论才重挂(`get_reviews` 读空 ≠ 未复审)。
7+
- 内容肢及于 published `skills/**`:作可证伪的算子或契约语义主张的改动挂标走本复核。
8+
- ⛔ 判据不是提到契约:纯算子清单、拼写、格式不触发。
9+
- 受管面人工合并 ⛔ 不替代复核,两道保障叠加。
10+
- `Clause-②: yes | no` 按设计临时:只定派发档位的保守方向,⛔ 非终审。
11+
- 真闸门在 PR 或报告时点的档位复核;声明被档位推翻 ⛔ 不作席位过失。
12+
- 机械地板 claim 时可查树:新导出符号或已发布载荷上的新键恒 `yes`,直接锁契约复审档。
13+
- conformance 类 ⛔ 不机械化:填充已声明字段、在两个已发布码之间重选输入类都需判断。
14+
- claim 拿不准 ⇒ 按 `yes` 派契约复审档;⛔ 不建全量分类学与 claim 时决策程序。
15+
- PR 与卡双载体同笔挂:PR 一存在即挂;报告先于 PR 到达则先挂卡侧,ACCEPT 时补齐 PR 侧。
16+
- 同笔在卡上记一行条款②认定;停靠只防误入队,⛔ 无等外部席位的无限期状态。
17+
- 前瞻的条款②事实住卡上裁决与分诊评论、`Clause-②` 申报和 `--tier` 输出。
18+
- 开着的载体恒 = 真实待审。
19+
- 载体不迁移:⛔ 不迁 PR review 或 Request Changes,⛔ 不为迁移留门。
20+
- 重挂前先查裁决:闸门标签缺失 ⇒ 先 grep 卡评论找复审结论。
21+
- PASS + 无标 + head 未动 = 已清标不是被剥;head 后移或无结论才重挂。
22+
- `get_reviews` 读空 ≠ 未复审。
2623

2724
## 复核归属与资格(席内)
2825

29-
- **归属:该卡派发席,交付后收集复核当轮席内完成**(2026-08-31 裁定)
30-
(沿(2026-08-21 裁定)的放宽 —— 审的是低档实现者的契约增量,非自身产物;主文件
31-
「⛔ 免复核不放行」禁的是免复核直放,不禁本路径)。
32-
- **契约判断清单(收集复核的升格件,逐项落卡/PR 评论,⛔ 不是散文自述)**:① derived
33-
judgments 逐项 —— diff 引出的接受集/公开面变化逐条点名判对错;② semver 定级 —— 变更
34-
级别与 changeset 声明一致;③ 边界旗处置 —— dev 挂旗/open_questions 逐旗答复或升级。
35-
- **独立性件 —— 隔离复核子代理**:契约判断**真分叉**、或 dev 挂旗待裁 ⇒ 起**上下文
36-
隔离的 fable 复核子代理**出第二意见,只喂卡片、既有裁决与 PR 本体,⛔ 不喂派发令与
37-
派发席自己的结论(污染即失独立性);简报写成**对抗性**(找拒绝理由)。未达档席 ⛔ 不凭
38-
自述复核,恒走本路径;子代理裁决按转录核验采信(下节),逐字采纳或整体作废。
39-
- **裁决载独立性对(机读,C4 行比对)**(2026-09-01 裁定 A、2026-09-02 裁定读法 a):产出 diff
40-
的身份写 `Implemented-by:` —— `mode:subagent` dev 记其分支(`claude/issue-…`,子代理无自有
41-
session),`mode:remote` dev 记 session id;`Reviewed-by:` = 出裁决席位的 session。两者同
42-
session ⇒ 报 SELF-REVIEW,⛔ 不作独立复核;两行皆无的历史裁决恒静默(⛔ 缺失永不转红)。
43-
- **放行 = 清标即落地**(2026-08-25 裁定):PASS ⇒ 同席同笔剥标(双载体),
44-
清标评论引 2026-08-31 裁定作 provenance,按
45-
`landing-operations.md` 走落地前检 → 转 ready → 挂 auto-merge/入队;轮报设**复审清单**
46-
节(同代裁清单强制审计形状)。
47-
- **落地前检三条**(2026-08-31 裁定):① 席内契约档 PASS 在案(卡上达档裁决评论);②
48-
`needs:contract-review` 双载体已清;③ PR 全部 check 全绿(⛔ 非 required 子集)。② 逐对机读
49-
`node scripts/pm/check-clause2-carriers.mjs --pair PR-NUMBER`:0 双肢可读且一致 · 4 不一致 · 3 环境答不
50-
了 ⛔ 不作干净。转 ready 同笔留 provenance 评论引该 PASS;受管面不适用,draft-only 终局不变。
51-
- **外部评审链降为可选**(改写(2026-08-27 裁定)所立的定时轮常设归属):
52-
分诊定时轮与总监席召唤非放行必要条件,在线时作**事后审计/抽
53-
**,其裁决仍被尊重 —— 审计 FAIL 按状态机 label-flip 交回派发席补丁轮;⛔ 不与席内复核
54-
抢同一载体的放行动作;资格与档位硬门对审计者同样成立。
26+
- 归属该卡派发席,交付后收集复核当轮席内完成。
27+
- 审的是低档实现者的契约增量,非自身产物。
28+
- 契约判断清单逐项落卡或 PR 评论,⛔ 不是散文自述。
29+
- ① derived judgments 逐项:diff 引出的接受集与公开面变化逐条点名判对错。
30+
- ② semver 定级:变更级别与 changeset 声明一致。
31+
- ③ 边界旗处置:dev 挂旗与 `open_questions` 逐旗答复或升级。
32+
- 独立性件:契约判断真分叉、或 dev 挂旗待裁 ⇒ 起上下文隔离的复核子代理出第二意见。
33+
- 只喂卡片、既有裁决与 PR 本体,⛔ 不喂派发令与派发席自己的结论;简报写成对抗性。
34+
- 未达档席 ⛔ 不凭自述复核,恒走本路径;子代理裁决按转录核验采信。
35+
- 裁决载独立性对(机读):产出 diff 的身份写 `Implemented-by:`,出裁决的席位写 `Reviewed-by:`
36+
- `mode:subagent` dev 记其分支 `claude/issue-…`(子代理无自有 session);`mode:remote` dev 记 session id。
37+
- 两者同 session ⇒ 报 SELF-REVIEW,⛔ 不作独立复核;两行皆无的历史裁决恒静默。
38+
- 放行 = 清标即落地:PASS ⇒ 同席同笔剥双载体,清标同笔留 provenance 评论引该 PASS。
39+
- 随后按 `landing-operations.md` 走落地前检 → 转 ready → 挂 auto-merge 或入队。
40+
- 轮次报告设复审清单专节,形状与代裁清单同为强制审计。
41+
- 落地前检三条:① 席内契约档 PASS 在案,即卡上的达档裁决评论。
42+
- ② 双载体已清,逐对机读 `node scripts/pm/check-clause2-carriers.mjs --pair PR-NUMBER`
43+
- 该命令 0 = 双肢可读且一致,4 = 不一致,3 = 环境答不了;⛔ 3 不作干净。
44+
- ③ PR 全部 check 全绿,⛔ 非 required 子集;受管面不适用,draft-only 终局不变。
45+
- 外部评审链是可选事后审计:分诊定时轮与总监席召唤 ⛔ 不是放行必要条件。
46+
- 审计 FAIL 按状态机 label-flip 交回派发席补丁轮。
47+
- ⛔ 不与席内复核抢同一载体的放行动作;资格与档位硬门对审计者同样成立。
5548

5649
## 降档保险丝(机读)
5750

58-
- 席内复核/审计每场前**必读一次服役档**(读法与陷阱单源见 platform-readings),⛔ 自述档位不
59-
是读数(静默降档腐蚀的恰是自述);读数 ≠ `CONTRACT_REVIEW_TIER` ⇒ 本席 ⛔ 不自判清标,改走
60-
转录核验的 fable 复核子代理 —— 标签在复核完成前原样留置,卡在队列外等待是安全态。
61-
- **保险丝只测座位自会话**:`mode:subagent` 里的 `get_session` 量的是**派发会话**(实测:
62-
钉在地板档的子代理读回父档,⛔ 不作互证),传参只是配置 ⛔ 不作达档读数;
63-
条款②的 `mode:subagent` 派发照旧恒保留 `needs:contract-review` 至席内复核完成。
64-
- **转录档位核验**(维护者 2026-08-27 裁)——「派更高档位子代理复审」仅核验通过才合法:采
65-
信/清标前 grep 子代理 transcript 中 harness 逐消息盖章的 `model` 字段,产出裁决的每轮都须读
66-
到契约复审档位,见回退证据 ⇒ 裁决整体作废;父会话仅两个合法动作 —— **逐字采纳或
67-
整体作废**(理由仅机械三种:核验失败/越范围/格式不完整),⛔ 永不改写/删节/润色。
68-
- 契约复核 ⛔ 不适用额度耗尽豁免降档(豁免对象是派发;复核正为补偿低档派发而存在)。
51+
- 席内复核与审计每场前必读一次服役档,读法与陷阱见 `platform-readings.md`
52+
- ⛔ 自述档位不是读数;读数 ≠ `CONTRACT_REVIEW_TIER` ⇒ 该席 ⛔ 不自判清标。
53+
- 改走转录核验的复核子代理;标签在复核完成前原样留置,卡在队列外等待是安全态。
54+
- 保险丝只测座位自会话:`mode:subagent``get_session` 量的是派发会话,⛔ 不作互证。
55+
- 传参只是配置 ⛔ 不作达档读数;条款②的 `mode:subagent` 派发恒保留标至席内复核完成。
56+
- 转录档位核验:采信或清标前 grep 子代理 transcript 中 harness 逐消息盖章的 `model` 字段。
57+
- 产出裁决的每轮都须读到契约复审档位,见回退证据 ⇒ 裁决整体作废。
58+
- 父会话只有两个合法动作:逐字采纳,或整体作废(核验失败、越范围、格式不完整)。
59+
- ⛔ 永不改写、删节或润色子代理裁决。
60+
- 契约复核 ⛔ 不适用额度耗尽豁免降档:豁免对象是派发,复核正为补偿低档派发而存在。

.claude/skills/pm-dispatch/references/core-rules.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
# PM 核心条款(人读摘要)
22
每行一条有约束力的规则,按 PM 语料自身的章节分组,供人工复核。
33
细节参数、事实表与操作配方仍以 SKILL.md 与同目录其它 references 为准;本文不新增规则。
4+
## 红线
5+
- PM 不写任何文件;⛔ 永不合自己的、红的或未复核的 PR,合并只经合并队列发生。
6+
- 版本发布必须人工,发现未经人工的发布痕迹按事故立案,⛔ 不代跑补救性发布。
7+
- 版本包 PR 默认永不催,唯一例外是重要修复已合 main 在等发布且提醒点名用户后果。
8+
- 受管面由维护者人工合并且合并即审核记录,⛔ 席位永不以任一账号对受管面 PR 批准。
9+
- ⛔ 永不代维护者回答产品或架构问题,唯一例外是已裁的代裁车道。
10+
- ⛔ 永不派发 assignee 属于别人的 issue,⛔ 永不派发带决策标签的 issue。
11+
- 并行度以 `batch` 封顶,同批按构造文件面不相交。
412
## 入口与角色
513
- 座位角色由 `/pm-dispatch` 参数认定;无角色参数按执行姿态跑,车道由座位贴认定。
614
- 开轮第一个动作是一次最便宜的车道盘点查询,⛔ 在它之前不读任何长文本。
@@ -11,8 +19,7 @@
1119
- 开轮互斥读四个读数:收班简报、开轮标记、本车道最新他会话认领、最新关闭卡的认领。
1220
- 未收班活动任一未满一个轮次即自退;有收班简报可直接坐席,坐席后先写开轮标记。
1321
## 全体座位的不变量
14-
- 所有状态住 GitHub 的标签、assignee、正文行与 `pm:seat` 座位贴,⛔ 本地不留跟踪状态。
15-
- 循环必须能从全新会话恢复。
22+
- 状态住 GitHub 标签、assignee、正文行与座位贴;⛔ 本地零状态;循环须能从新会话恢复。
1623
- PM ⛔ 不写文件也不写代码,唯一例外是维护者逐 PR 明示授权的 `.claude/` 内部工具 PR。
1724
- 该例外须把授权原话引在 PR 正文并由另一座位或维护者复核,⛔ 不得自审自合。
1825
- GitHub 上的新内容一律英文,中文只留轮次报告、派发令里的裁决引文与决策四维分析。
@@ -117,6 +124,7 @@
117124
- 受管面 PR 留 draft 并向两个授权批准账户请审;档位不足的契约卡 ⛔ 禁止入队。
118125
- 入队资格是每一个检查全绿 ⛔ 不是必查子集;碰生成物的 PR 入队前先同步再重生成。
119126
- 跟到合并为止并每轮读队列成员资格与 `origin/main`;踢出按签名台账四分支处置。
127+
- 合并即发布的仓无验证层不合并,落地判据是已发布且探测通过 ⛔ 不是 MERGED。
120128
- 每轮打中文轮次报告,含判决表、升级项、代裁清单、等人合项、受管合并审计与五指标。
121129
- 收工点是会话内在飞归零、存档后立即派下一波 ⛔ 不等人闸;清空转待命而不是退场。
122130
## 断粮与跨墙恢复
@@ -136,14 +144,6 @@
136144
- 有实测拉动时荐长远终态一次付清,零拉动时荐不扩散,防错轴打破余下平局。
137145
- 每张决策卡落卡即带标准四棱块;卡先于弹窗,被阻塞的执行卡同笔转 `pm:blocked`
138146
- 项目总监席由人工召唤,四职是复核审计、决裁勤务、维护者动作台账、受管合并审计。
139-
## 护栏
140-
- PM 不写任何文件;⛔ 永不合自己的、红的或未复核的 PR,合并只经合并队列发生。
141-
- 版本发布必须人工,发现未经人工的发布痕迹按事故立案,⛔ 不代跑补救性发布。
142-
- 版本包 PR 默认永不催,唯一例外是重要修复已合 main 在等发布且提醒点名用户后果。
143-
- 受管面由维护者人工合并且合并即审核记录,⛔ 席位永不以任一账号对受管面 PR 批准。
144-
- ⛔ 永不代维护者回答产品或架构问题,唯一例外是已裁的代裁车道。
145-
- ⛔ 永不派发 assignee 属于别人的 issue,⛔ 永不派发带决策标签的 issue。
146-
- 并行度以 `batch` 封顶,同批按构造文件面不相交。
147147
## 报告契约
148148
- 终报 JSON 的权威形状住 `.claude/agents/os-dev.md`,⛔ 本协议不另存第二份。
149149
- 前提被证伪且无 PR 是合法终报,当再分诊输入复核,⛔ 永不当失败派发。

0 commit comments

Comments
 (0)