Skip to content

Commit e07c9f9

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-14895-i18n-extract-check-hint
2 parents f505afe + 6eba38f commit e07c9f9

5 files changed

Lines changed: 54 additions & 17 deletions

File tree

.claude/agents/os-dev.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,11 @@ model: opus
3838
- PR 上不是你设置的状态属于另一个 actor:⛔ 永不去纠正;疑问进报告,挡住报 blocked。
3939
- 共享身份让所有人的写入都像你写的;被改写的 body 只是关于 body 的证据,不证明别的。
4040
- 回退他人的操作(尤其 ready 翻转)永不轮到你;把意外写进 `summary`
41-
3. **范围 = 这张 issue,别无其它。** 顺路撞见的无关缺陷立成新的无 assignee issue。
42-
- 列进 `out_of_scope_findings`;⛔ 永不在本 PR 里修它。
41+
3. **范围 = 这张 issue,别无其它。** 顺路发现 ⛔ 不在本 PR 修,只有三类立卡且不打标签:
42+
- (a) 可复现缺陷(复现或失败探针具名);(b) 违背已声明契约(引契约原文);
43+
- (c) 让 AI 写出运行时拒收或静默丢弃的元数据的陷阱;三类内 ⛔ 不因看着小揣着不报。
44+
- 其余 ⛔ 不立卡:观察、死代码、未演练漂移、抛光、风格、文档 nit、命名。
45+
- 它们进 PR `## 验收备注`,报告 `out_of_scope_findings``noted, not filed: …`,席位 ACCEPT 时读。
4346
- 先搜再立:关键词 + 文件路径扫 open issues;并行 dev 同一小时立的卡只有这一搜能看见。
4447
- 通道先探后选:同容器先测一条 repo-scoped REST 读;通 ⇒ 走 REST 列表端点 + 本地 grep。
4548
- 通道对照表见 `.claude/skills/pm-dispatch/references/rest-channel.md`,其 ✓ 按座位实测。
@@ -49,13 +52,10 @@ model: opus
4952
- 大宗读走零配额档:公开仓单卡网页内嵌 JSON payload 载原始 body + 全评论。
5053
- 其拼写与边界住 platform-readings;它只覆盖单卡读,⛔ 不拿它做 search。
5154
- 卡与评论先走 git 与 payload 档,MCP 留给写 + 那一次查重;报告记 MCP 调用计数(`mcp_calls`)。
52-
- 立不成 ⇒ 发现连同缘由写进报告交 PM 代立。
53-
- ⛔ 不查重硬立与静默弃报同为禁形:发现永不因通道断而消失。
55+
- 立不成 ⇒ 发现连同缘由写进报告交 PM 代立;⛔ 不查重硬立与静默弃报同为禁形。
5456
- PM 的去重读数随派发词下发,当既有事实用,只复核其后增量,⛔ 不重跑。
5557
- 归挂不散落:落在已排队 issue 完成范围内的发现,立成它的 sub-issue(自动进派发池)。
5658
- 只是依赖它的,独立立单带一行 `Blocked-by:`;立在修复落地的仓,带回链。
57-
- 观察类发现(死代码、未演练漂移、外观抛光)打 `finding` 标签,⛔ 不打 `pm:queue`
58-
- 具体缺陷不打标签,留给 PM 分诊;⛔ 不因看着小揣着不报,平实立单,分诊轮定级。
5959
- 有界就地修豁免,四条全立才就地修:① 与本卡同一缺陷类;② 机械修且形态已被钉死。
6060
- ③ 该文件无其他认领持有;④ 同一批门禁族,不新增验证面。
6161
- 就地修欠两样:认领申报的文件面同轮增补;PR 正文点名该修复并附证据。
@@ -73,10 +73,10 @@ model: opus
7373

7474
1. **重活串行,共享验证锁只有一个入口。** 每次 build/test 都从这里走。
7575
- `bash scripts/pm/os-verify-lock.sh -c '<command>'`(或 `-- <argv>`);⛔ 永不手搓 `flock`/lockfile。
76-
- 入口点保证:等待预算钉死在一次前台调用内;按到达序授予;99 专指没排到;报持锁时长
76+
- 一次前台调用领全部等待预算,阻塞到拿锁或 99;⛔ 不轮询重试,恒设 `OS_VERIFY_LOCK_SLOT`
7777
- 它不保证机器空闲:`check:*` 门禁、install、dev server 不走它,与持锁同核并跑。
7878
- 锁下墙钟绝对值是共享盒读数;只包命令本身,不包你的阅读与判断。
79-
- 结论读它印的 `VERDICT command-exit` 行,⛔ 不读裸 `$?`;排队是常态,不是挂死。
79+
- 结论读它印的 `VERDICT command-exit` 行,⛔ 不读裸 `$?`;按到达序授予,排队是常态,不是挂死。
8080
2. **压住堆**:重命令前缀 `NODE_OPTIONS=--max-old-space-size=4096`,要抬需给理由。
8181
3. **定向,不扫全**:只 build/test 受影响的包,turbo 用 `--concurrency=2`
8282
- 单文件跑法 `pnpm --filter <pkg> exec vitest run --maxWorkers=2 <file>`
@@ -92,8 +92,8 @@ model: opus
9292
- 消融/变异脚本自带还原 trap(硬线在标准条款节的 ablation 条)。
9393
7. **排队不是停摆,在轮内主动等。** 持锁的是你不拥有的进程,它的完成不会唤醒你。
9494
- ⛔ 永不为等锁结束一轮。
95-
- 循环:拿到 99 就把间隔花在无锁工作上(测试、changeset、PR 正文、包内 `typecheck`)。
96-
- 然后带同名再跑一次:`OS_VERIFY_LOCK_SLOT=<稳定名>` 在第一次尝试之前就设好
95+
- 99 专指没排到,读作 NOT MEASURED;把间隔花在无锁工作上(写测试、changeset、PR 正文)。
96+
- 再取以同名续位,⛔ 不从队尾重排:`OS_VERIFY_LOCK_SLOT=<稳定名>` 在第一次尝试前就设好
9797
- 没排到的调用把排位寄存,同名再来续原到达戳;不设它,每次离开都从队尾重排。
9898
- 排队约 20 分钟无进展 ⇒ 先看这次检查能否收窄到不必持锁(收窄要申报,见干净收尾)。
9999
- 收窄不了就停下报 `blocked` 并点名持锁者:`os-verify-lock.sh --status` 打印持锁者与队列。
@@ -371,7 +371,7 @@ model: opus
371371
"open_questions": [
372372
{ "question": "", "options": ["A …", "B …"], "recommendation": "A, because …" }
373373
],
374-
"out_of_scope_findings": ["filed as #<n>: one-line description"]
374+
"out_of_scope_findings": ["filed as #<n>: one-line description", "noted, not filed: one-line observation"]
375375
}
376376
```
377377

.claude/skills/pm-dispatch/references/platform-readings.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
- `assignees` 实测为陈旧空值而权威读非空;`labels`/`state` 由此存疑、未实测,⛔ 不写成已测。
145145
- ⇒ ⛔ 认领承载字段(`assignees``pm:*` 标签、`state`)永不从本档读。
146146
- ⛔ 本档的缺席不是读数:要么 `hasNextPage: false`,要么第二通道。
147+
- 两数组各比 `edges` 长度与 `totalCount`:短即最新几项缺席,认领检查走分页 `get_comments`
147148
- 自己刚写的按原写入通道回读;失效方向是空转与重发。
148149
- 成因:本档经 CDN 缓存,专对最新内容失效且绕不掉,cache-busting 查询串与 no-cache 头都无效。
149150
- 内容可滞后数分钟到数十分钟;它没有位置性对照 —— 更早内容全在,只有最新几条缺席。
@@ -250,6 +251,7 @@
250251
- 分步文件在 `{Job name}/{step number}_{step name}.txt`
251252
- completeness check 绿只断言没有 worker 静默死,不等于测试通过。
252253
- 并发输出的相邻不等于因果:先查 `turbo.json` 依赖边,⛔ 不只看 tail。
254+
- turbo 一败多包同印 `ELIFECYCLE Command failed`:权威读数是 `Failed:` 行与该包自己的 `##[error]`
253255
- 公开发出的诊断被推翻时,更正发在同样公开的位置,据它开的 PR 撤回 draft、解绑 `Fixes`
254256
- 判正文被截断必须双读取:`.body` 原文,加 `Accept: application/vnd.github.full+json``.body_html`
255257
- 两者同一处断掉才算 issue 端截断。
@@ -288,6 +290,7 @@
288290
- 第四形:裸 REST `POST /pulls` 建 PR 时,在已带 session-URL 页脚的正文后再追加一条同形页脚。
289291
- 该追加带前置横线、恰 90 字节,送出体是存储体的严格前缀。
290292
- ⇒ 追加形态随通道与动作(建 / 改)变,⛔ 不由任一条推其余;写后必回读。
293+
- 平台在尾部 `---` 前后正反两向归一空行:比对正文只按首个差异偏移,⛔ 不按长度。
291294
- 评论创建两通道都追加 58 字节 ⇒ 严格解析 `os-dev-report` 必须停在最后一个右花括号。
292295
- 并行 spec PR 同动 pin 计数断言:被踢不是事故,按 os-regen 序再解一轮。
293296
- 解冲突两侧收据都保留、按合并顺序堆叠;新计数从合并后源码重数,⛔ 不从收据做算术。

scripts/pm/check-skill-line-ratchet.mjs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,29 @@ export const CEILINGS = new Map([
553553
// 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」) — provenance dates,
554554
// ruling citations and incident narrative left; every rule stayed. Landed count,
555555
// headroom 0, same convention (lowering is always legitimate).
556-
['.claude/skills/pm-dispatch/references/platform-readings.md', 359],
556+
// Raised 359 → 362 by the fourth-increment ruling — again an ORDINARY raise
557+
// under this map's own maintainer exit, ⛔ not a cross-file move. Maintainer,
558+
// decision batch #56, 2026-09-06, verbatim and untranslated: 「其他同意」 on the
559+
// presented recommendation, option A; the director record's own sentences for
560+
// it (comment 5559776878):
561+
// The ceiling in `scripts/pm/check-skill-line-ratchet.mjs` for
562+
// `.claude/skills/pm-dispatch/references/platform-readings.md` moves 359 →
563+
// 362 … All three lines land as authored … No existing line is deleted to pay
564+
// for them (option C rejected); no line is dropped (option B not needed).
565+
// Spent in full at one line per reading, each written in this file's voice and
566+
// wrapped by this module's own `wrapLine` rather than estimated: the zero-quota
567+
// payload channel's timeline discriminant +1 (compare each array's `edges`
568+
// length against `totalCount`; short means the NEWEST items are absent, so a
569+
// claim check goes to the paged `get_comments` read), the authoritative reading
570+
// of a multi-package `ELIFECYCLE` spray +1 (the `Failed:` line plus that
571+
// package's own `##[error]`), and the first-differing-offset comparison that the
572+
// platform's two-way blank-line normalisation around a trailing rule forces +1
573+
// = +3 exactly. Nothing was paid in place: line-neutral folding was MEASURED,
574+
// not assumed — of the file's 333 adjacent rule pairs, ZERO fit the 120-byte
575+
// line cap when merged, so there is no re-wrap slack at all, and re-wrap funding
576+
// is refused per the 2026-08-17 rule in any case. Landed count, headroom 0, same
577+
// convention.
578+
['.claude/skills/pm-dispatch/references/platform-readings.md', 362],
557579
// Per-operation REST/GraphQL/git channel mapping — which fleet operation has
558580
// a REST twin (each row executed in a real session, provenance date carried
559581
// per row), the handful that are GraphQL-only, and the queue-routing
@@ -963,6 +985,21 @@ export const CROSS_FILE_MOVES = new Map([
963985
// failure the header warns about. Neither ruling is reopened by this: both
964986
// are still quoted beside the ceiling, which is where a reader gets back to
965987
// them, and the lines they bought are the lines this rewrite handed back.
988+
{
989+
// Quoted beside this entry's ceiling above, where the +3 is accounted
990+
// for line by line. Copied from there, not paraphrased.
991+
ruling:
992+
'the fourth-increment raise on'
993+
+ ' `.claude/skills/pm-dispatch/references/platform-readings.md` — maintainer,'
994+
+ ' decision batch #56, 2026-09-06, verbatim and untranslated: 「其他同意」 on option'
995+
+ ' A, and the sentences that ruling adopts, in the director record\'s own words'
996+
+ ' (comment 5559776878): "The ceiling in `scripts/pm/check-skill-line-ratchet.mjs`'
997+
+ ' for `.claude/skills/pm-dispatch/references/platform-readings.md` moves 359 → 362'
998+
+ ' … All three lines land as authored … No existing line is deleted to pay for them'
999+
+ ' (option C rejected); no line is dropped (option B not needed)."',
1000+
date: '2026-09-06',
1001+
delta: 3,
1002+
},
9661003
],
9671004
sources: [
9681005
['.claude/skills/pm-dispatch/references/lanes/cli.md', 35],

skills/objectstack-data/rules/field-types.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ options: [
8888
|:-----|:------------|:-----------|
8989
| `lookup` | Reference another object (independent) | `reference`, `lookupFilters`, `multiple`, `deleteBehavior` |
9090
| `master_detail` | Parent–child with lifecycle control | `reference`, `deleteBehavior` (`cascade`/`restrict``set_null` is refused) |
91-
| `tree` | Hierarchical self-reference | `reference` |
91+
| `tree` | Hierarchical self-reference | `reference` — optional; when written, this object's own name (any other object is refused at parse) |
9292
| `user` | Person picker — a lookup specialized to `sys_user` (assignee, watchers). Stored identically to `lookup` | `multiple` (collaborators), `defaultValue: 'current_user'` |
9393

9494
> **`multiple: true` lookup ≠ junction object.** A multi-value lookup is stored
@@ -106,9 +106,6 @@ options: [
106106
| `video` | Video files ||
107107
| `audio` | Audio files ||
108108

109-
There is no per-field attachment config (size limits, allowed types, storage) —
110-
storage concerns live outside the field schema.
111-
112109
## Embedded (JSON sub-objects)
113110

114111
Stored as JSON on the parent row — no separate table / FK:

skills/objectstack-data/rules/relationships.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Guide for modeling relationships between objects using `lookup`, `master_detail`
88
|:-----|:----------|:---------|:--------|:---------|:---------|
99
| `lookup` | Independent | Optional by default | Independent | Supported via `summary` | "Related to" |
1010
| `master_detail` | Coupled (cascade delete) | Forced only under `controlled_by_parent`; else lint-warned | Inherits parent | Supported via `summary` | "Owned by" |
11-
| `tree` | Self-reference | Optional | N/A | Not available | Hierarchical |
11+
| `tree` | Self-reference | Optional — and so is `reference`, which when written must name this object itself; any other object is refused at parse, not lint-warned | N/A | Not available | Hierarchical |
1212

1313
## When to Use lookup vs master_detail
1414

0 commit comments

Comments
 (0)