Repository navigation
fix(spec): the retirement sentence names --write: it applies the edits it can prove, you apply the rest - #22142
Conversation
…dits it can prove, you apply the rest The house `os migrate meta` sentence closing every ADR-0087-covered prescription now reads: Run `os migrate meta --from <N>` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand. The MIXED two-clause variant carries the same `--write` clause. The class pin moves with it, widens to driver-turso's three tombstones, and reads the two facts the sentence rests on from the command's own flag table. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
`pnpm --filter @objectstack/spec check:generated --fix` (check:docs was the one stale artifact). Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
…retirement sentence Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
…irement-sentence-write
… from the merged tree
`bash scripts/pm/os-regen-merge.sh` step 2 took main's side of
content/docs/references/{api/metadata,data/object,system/migration}.mdx (the
os-regen driver kept one side); regenerated with `gen:schema && gen:docs`
from the merge commit's tree.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
…; the lint index rule's sentence joins the class pin Carries the house sentence into the two sites the merged index-scope retirement brought (DECLARED_INDEX_BARE_TRUE_RETIRED and the lint unique-unscoped-declared-index fix text) and into the test that pins the former verbatim. The lint sentence was a template literal, which the class pin cannot read, so it is now plain-quoted, as the lint corpus's other site is. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
📓 Docs Drift CheckThis PR changes 3 package(s): 30 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 12 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 142 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 6671b7fea46a104f7ed99f9506a004f5fd8c8bcf && git checkout 6671b7fea46a104f7ed99f9506a004f5fd8c8bcf
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 13aea189591b935d81eb306f9be8a50c9045f661 75302366e563cf2c6529380977f135f9966a84f5 && git checkout -B drift-repro 13aea189591b935d81eb306f9be8a50c9045f661 && git merge --no-ff 75302366e563cf2c6529380977f135f9966a84f5
node scripts/docs-audit/affected-docs.mjs --json 13aea189591b935d81eb306f9be8a50c9045f661
|
Contract reviewServed-tier: Read at 2026-10-08T04:30Z, from the inputs the brief names and nothing else: card #9591 (body and all 12 comments; page 2 came back empty), PR #22142 (body; its 102-file list is identical to Gate verdicts (the check-runs on the head): 42 runs, 38 ① Derived judgmentsEach item names what the diff implies and whether it is right.
② Semver level
③ Boundary flagsDev deviations, report
Dev deviations, report
Out-of-scope findings, both reports, answered:
New from this review, in neither report:
No Implemented-by: VERDICT: PASS Generated by Claude Code |
…irement-sentence-write
…ed, from the merged tree `bash scripts/pm/os-regen-merge.sh` step 2 took main's side (the os-regen driver kept one side); regenerated with `gen:schema && gen:docs` from the merge commit's tree. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
…`--write` clause The two-clause sentence the manifest `permissions` string-list retirement brought from main now names `--write`, as the class pin requires of the two-clause shape; its verbatim test pin and the changeset's two-clause bullet move with it. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
Contract reviewServed-tier: Read at 2026-10-08T06:10Z, from the brief's inputs and nothing else: card #9591 (body and all 15 comments; page 2 came back empty), PR #22142 (body; its 104-file list is identical to Gate verdicts (the check-runs on the head): 42 runs, 38 ① Derived judgments
② Semver level
③ Boundary flagsReport
Report
Report
Report
New from this review, in no report:
No Implemented-by: VERDICT: PASS Generated by Claude Code |
…irement-sentence-write
…rom the merged tree `bash scripts/pm/os-regen-merge.sh` step 2 took main's side (the os-regen driver kept one side); regenerated with `gen:schema && gen:docs` from the merge commit's tree. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAi5BVvQNiYzepSAcsoFLK
|
Regen-provenance: 6053587390 · fe3af56 → 7530236 ·
|
|
The merge queue refused this PR, as designed; the seat's pointer did not certify the hop.
|
Contract reviewServed-tier: Rendered 2026-10-08T07:39Z. PR #22142 at this head against its merge base Why this record is owed, re-derived. This head is
Check-runs on this head. 36 runs: 34 ① Derived judgmentsSurface (a), the shipped prescription text across
Surface (b),
② Semver level
One completeness gap, non-blocking: the changeset's ③ Boundary flagsEvery deviation and finding in
Nothing above blocks. Both surfaces hold at this head, and the hop added nothing to the PR's net diff. Implemented-by: VERDICT: PASS Generated by Claude Code |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 37748210189 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
|
The red merge-group build above is not this PR's.
|
Fixes #9591
Clause-②: no (prescription text only; no input's accept or reject result changes)
This is the spec-lane half of the card: the shared retirement sentence names
--write, and the class-wide pin moves in the same PR. The codemod itself landed in PR #22108 (a959493cdf).The sentence
Before (the #9529 wording):
After:
The one allowed two-clause variant (a conversion that covers only part of a value) carries the same clause:
… to list the mechanical edits for the X case; --write applies the ones it can prove, and WHAT-HAPPENS-TO-THE-REST.Its two members are dashboardcompareTo.offsetand the script node'sconfig.actionType.Checked against the tool on
main(51290bca).packages/cli/src/commands/migrate/meta.tsdeclareswrite: Flags.boolean({ … default: false, exclusive: ['stored'] }). Its help text says it rewrites the authored sources in place "for each mechanical change traced to one literal in one project file; every other change is listed with the reason it was not written". Without the flag the run writes only the--outsnapshot. The wording satisfies every ruling that binds it:6045697201. The sentence never says "rewrite existing sources automatically" unqualified ("the ones it can prove"), and it names--writebecause the default run still only lists.meta.ts.os migrate meta --writebeside the default run #22122's skill text ("lists the mechanical edits";--write"rewrites in place each edit it can trace to one literal in one project file, lists every other with the reason it was not written").Where it moved (counted at
017761f0; the merge ofmainadded no site)packages/spec/src: 157 (155 house form, 2 two-clause).packages/lint/src: 1.packages/drivers/driver-turso/src: 3. Every one passes the new anchors;apply them by handsurvives only in the pin's own RED fixtures.migrations/registry.ts: 3 sentences, regenerated from the movedentries/semantic/18.*.tsbygen:migration-registry.chartConfig.xAxis.fieldhint invalidate-widget-bindings.ts: a template literal with interpolation after the sentence, so the pin cannot see it (Acceptance notes).retiredKey()docblock example.apply them by handin 63 files (188 occurrences; old tail left: 0) and printed per-file before/after counts. Two seams split mid-phrase (translation.zod.ts) and the two two-clause sites were rewritten by anchored edits that had to hit exactly once.form-layout-inline-grid-retired.test.ts, the turso / driver-memorytoContain('os migrate meta --from 17')) are untouched, because they stay true..changeset/9591-retirement-sentence-write.md:patchfor@objectstack/spec,@objectstack/lintand@objectstack/driver-turso, the three packages whose shipped text moves.content/docs/references/**: 32 files (+268/−268) frompnpm --filter @objectstack/spec check:generated --fix;check:docswas the only stale artifact.check:generatedthen exited 0.The class pin (
retired-key-migrate-sentence.test.ts)HOUSE_AT_MARKERandMIXED_AT_MARKER, and their markdown twins, require the new clause. Theos migrate metanever rewrites the authored sources that 144 shipped retirement messages promise it will #9529 sentence, which does not name--write, is now RED. Two further spellings are RED: one that names--writewithout the qualification, and one that qualifies it but leaves the rest unowned.WITHDRAWN_CLAIMis unchanged: the unqualified automatic-rewrite claim stays a hard RED everywhere. A new non-vacuity case proves neither legal shape trips it.os migrate meta's own flag table. Awriteboolean flag must exist and must havedefault: false, the two facts the sentence rests on. The read is covered by@objectstack/spec's existingpackages/**/*.tscross-package declaration.packages/drivers/driver-turso/srcjoins, on [lint] validate-expressions 的 script 退役键提示仍说 "rewrite it" — #6856 house 句式的最后一个域外站点 #7030's terms. Its threetursoconfig tombstones carry the house sentence, and their docblock defers toretired-key.ts, but the pin never walked them. Without this, a rewording leaves them behind with every assertion green. The lint-only anti-vacuity case now covers each widened corpus.retired-key.tsmodule docblock record the new sentence and why. The "the claim may be restored" note is gone, replaced by what was restored and how far.Reverse verification, run from committed HEAD
017761f0throughscripts/ablation-replace.mjs(each anchor hit as declared and was restored to a blob equal to HEAD withgit diff HEADempty). Expected direction: red.turso.zod.tssentences back to the #9529 wording (anchor ×3→0, blobe25cca4d5508→a05fe3f09733)driver-turso:spec/turso.zod.ts:63,:75,:82meta.tswriteflagdefault: false→true(blobc036012c63c9→71acff21ef8c)meta.tsflag renamedwrite→inPlace(blobc036012c63c9→29a8a9402284)writeboolean flag"Under the old corpora, mutation A would have stayed green, because driver-turso was in no corpus.
One bounded fix on the same sentences:
CHATTER_POSITION_RETIREDThe three
record:chatter/record:discussionpositionvalue prescriptions ('sidebar','inline','drawer', inui/component.zod.ts) told the author to run a bareos migrate meta. The command refuses that withMissing required flag --from(meta.tsrun(), theflags.from === undefinedbranch). The conversion isrecord-chatter-position-vocabulary,toMajor: 18, so they now name--from 17. They therefore join the pin's judged set in house form, and the "(registered under protocol major 18)" aside goes. The fix qualifies as bounded: the same sentence class, a mechanical change to an already-pinned form, a file inside this claim's surface, and the same gate family. No test pinned the old text.Governed surface:
.claude/skills/spec-property-retirement/SKILL.md(Tier S)The pin requires the retirement playbook to teach both shapes (
SKILL_HOUSE_TEMPLATEandSKILL_MIXED_TEMPLATEmust match its convention 5). So changing the sentence forces the playbook edit, and this PR lands as Tier S. Convention 5 now carries the two new templates. Its note that the command "never writes a source file" was made false by PR #22108, so it is deleted. Line count 337 → 337 (ceiling 337), with every line within the 120-byte budget:node scripts/pm/check-skill-line-ratchet.mjsexits 0. ⛔ No publishedskills/**file changes: PR #22122 ownsskills/objectstack-upgrade/SKILL.md, and no published skill carries the sentence (git grepcount 0).维护者速读(草稿)
改了什么:所有退役键报错末尾那句统一提示,从「运行
os migrate meta --from N列出机械修改,然后手工改」改为「……列出机械修改;--write会写入它能证明的那些,其余你手工改」。共 161 处被 pin 判定的报错文案(含 2 处两从句变体),外加生成的 registry 3 处、lint 模板字符串 1 处;其中 3 处原先写成不带--from的命令(该命令会直接拒绝),一并改正。守这句话的 pin 同步更新,并新增一条断言:CLI 必须真有--write且默认不写。为什么改:
--write已随 PR #22108 落地,旧句只说「手工改」,低估了工具;但--write只写能证明的站点,所以不能说「自动重写源文件」。新句两头都如实。风险与代价(含回滚):纯文案,不改任何 schema、键、类型、导出或错误码;解析结果不变。依赖旧整句原文匹配的调用方会失配(仓内 23 个测试已同步);前缀「…for existing sources;」不变。回滚即 revert 本 PR。在途的兄弟 PR 若新增处方仍用旧句,会被 pin 打红,后落地者改用新句。
席位意见:
你要做的:无需操作;本 PR 触
.claude/**(Tier S),由席位按合同审查记录落地。Verification (branch base
51290bca; final headf9ca14d548)pnpm --filter @objectstack/spec build: VERDICT command-exit 0.check:generated --fixregenerated the one stale artifact;check:generatedthen exited 0 (15 of 15 current), and again in the gate run atf9ca14d548.vitest run --project local: Test Files 623 passed (623), Tests 18613 passed, 1 todo, at017761f0.vitest run --project repo(53 files incl. the class pin): 53 passed (53), Tests 903 passed (903), at017761f0.@objectstack/driver-tursovitest run: Test Files 88 passed (88), Tests 2373 passed, 33 skipped, at017761f0(afterpnpm --workspace-concurrency=2 --filter '@objectstack/lint...' --filter '@objectstack/driver-turso...' build; the first run, before that build, could not resolve unbuilt dependencies and is NOT MEASURED, not red).typecheckfor spec (tsc --noEmit+check:scripts-typecheck+check:test-typecheck), lint and driver-turso: exit 0 at017761f0.main(033e5c536d: docs(skills): objectstack-upgrade namesos migrate meta --writebeside the default run #22122, fix(lint)!: a conditional validation rule's nested then / otherwise predicate meets the build's expression verdict, at os build and the object save door (#22042) #22127, fix(objectql): skipAutomations never skips the builtin audit stamps #22106) asf9ca14d548, with no conflict (fix(lint)!: a conditional validation rule's nested then / otherwise predicate meets the build's expression verdict, at os build and the object save door (#22042) #22127 also editsvalidate-expressions.ts): the class pin 15 passed (15);@objectstack/lintvitest run: Test Files 123 passed (123), Tests 5688 passed (5688); linttypecheckexit 0.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackatf9ca14d548derives 124 commands (the claim-time 79 plus 45). All 124 exit 0 atf9ca14d548.--ranreconciliation: 124 derived, 124 run, 0 NOT-MEASURED, a zero derived from the recorded exit codes. (At017761f0, five gates first answered exit 3, PREREQUISITE NOT MET: one shallow-clone fixture and four that need unbuilt dists. The clone was deepened as the gate asked, and all five are green in thef9ca14d548run.)node scripts/pm/check-skill-line-ratchet.mjs: exit 0; the playbook is 337 lines (ceiling 337), and no line is over 120 bytes.pnpm exec eslint --no-inline-config --format jsonover the 66 changed.tsfiles reports 66 files, 0 errors and 0 warnings. The population iseslint.config.mjs's**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}glob, which excludes the changed.md/.mdxfiles. The config never enables type-aware linting (its own comment at:326–:328), so this diff cannot move any untouched file's verdict. The repo-widepnpm lintis CI's.Siblings in flight
#21982, PR #22094 (#13458) and PR #22103 (#5082) each add prescriptions with today's sentence. Whichever lands after this one carries the new sentence; the class pin reds it at that merge otherwise. Whichever of those lands first, this branch merges
mainbefore landing.Acceptance notes
content/docs/automation/flows.mdx×2,protocol/objectql/query-syntax.mdx,data-modeling/queries.mdx,protocol/objectui/actions.mdx,ui/apps.mdx×2). Each is the page's own advice, not a quoted error, and still true of the default run; each undersells--write. They aredomain:devxpages outside this claim, so they are not touched here.cli.migrate-meta-codemod(docs/qa/platform-checklist/areas/cli.json). Its RESTART CHECK fired when PR feat(cli): os migrate meta --write — write the chain's mechanical edits into the authored sources #22108 added--write, and the item still asserts a print-only command. Its step 1 greps for theos migrate metanever rewrites the authored sources that 144 shipped retirement messages promise it will #9529 sentence verbatim and now finds none. Re-authoring the item belongs to the checklist author, not this PR.migrations/registry.tsmigration notes (outside the pin's scope by design) and theconversions/registry.tscomments.chartConfig.xAxis.fieldhint (validate-widget-bindings.ts) moved, but it remains invisible to the class pin: a template literal, withsuggestName(…)and the suppress hint interpolated after the sentence.skills/objectstack-data/rules/indexing.md:31says "runos migrate meta --from 16to strip them automatically", andskills/objectstack-data/SKILL.md:377says the command "strips them". The default run strips nothing from sources, and--writestrips only what it can prove.WITHDRAWN_CLAIMhas no strip spelling, so the pin cannot see this. Widening it here would redmainon a Tier H file this PR may not touch, so it is reported to the PM for the skills lane.config.actionTypetwo-clause tail ("the stub and marker values are removed") is unchanged in substance; only the--writeclause was inserted before it.Patch round 1 (written by the PM seat from the dev's report
6052088494)Merge:
origin/mainef1fcb26a2(PR feat(spec)!: refuse bare unique: true on a declared index at protocol 18 — stated scope, zero-drift conversion (ADR-0120 D2/D5a/D7) #22103) was merged throughos-regen-merge.shasfeca6b5ace. The three reference pages both sides had changed (api/metadata,data/object,system/migration) were regenerated from the merged tree as98e2f6e373. That brings back feat(spec)!: refuse bare unique: true on a declared index at protocol 18 — stated scope, zero-drift conversion (ADR-0120 D2/D5a/D7) #22103'sunique?: false | 'global' | 'organization'rows, which the driver had dropped.feat(spec)!: refuse bare unique: true on a declared index at protocol 18 — stated scope, zero-drift conversion (ADR-0120 D2/D5a/D7) #22103's sites: the merge brought two non-test sites with the old tail and one test that asserts it verbatim. All three carry the new sentence at
b9d6e82619:packages/spec/src/data/object.zod.ts(DECLARED_INDEX_BARE_TRUE_RETIRED);packages/lint/src/data-model-rules.ts(theunique-unscoped-declared-indexfix text);unique-scope-message.test.ts.The pin now judges 163 sentences:
spec158 (156 house + 2 two-clause),lint2,driver-turso3.The pin's blind spot: the
data-model-rules.tssentence sat in a template literal, which the judge cannot read (escaped backticks), so it was never judged. It is now plain-quoted, as invalidate-expressions.ts, and the pin's Mechanism paragraph records that template literals are invisible to the scan. Ablation D (that sentence back to the old tail) gives 3 failed / 12 passed, naminglint:data-model-rules.ts:463.validate-widget-bindings.tsstays the one template-literal site the pin cannot judge (an Acceptance note).Verification at
b9d6e82619:--project local: 623 files / 18,619 tests;--project repo: 53 / 903;dispatch-gates --ran: 124 derived / 124 run / 0 NOT-MEASURED;Patch round 2 (written by the PM seat from the dev's report
6053397952; claim revised6052335087)fec87e7e07) landed first with a two-clause prescription lacking the--writeclause, which this PR's class pin refuses. The sibling rule here ("whichever lands later carries the new sentence") puts the edit in this PR.origin/main959c209d56was merged throughos-regen-merge.shas3b6335b9be, with no hand-written conflict.content/docs/references/api/protocol.mdxwas regenerated asc40b3babd7.fe3af5642c, 4 files beyond the merge):packages/spec/src/kernel/manifest.zod.tsPLUGIN_PERMISSIONS_LIST_FORMnow closes with "Runos migrate meta --from 17to list the mechanical edits for the package manifest case;--writeapplies the ones it can prove, and a granted-permission record is not a source it reads." It keeps Phase 2 of #11333: retire the legacy string[] arm of manifest.permissions (major, standard retirement route) #13458's own second clause and adds the house--writeclause, the seat's wording.manifest-permissions-string-list.test.tsmoved with it.compareTo.offset, the script node'sconfig.actionType, and the package manifestpermissionscase. The pin judges 164 sentences (spec 159 = 156 house + 3 two-clause; lint 2; driver-turso 3) with 0 bad sites.fe3af5642c:--project local: 625 files / 18,661 tests;--project repo: 53 / 903;dispatch-gates --ran: 124 / 124 / 0 NOT-MEASURED;Generated by Claude Code