Repository navigation
feat(spec): a record:path block may opt in to allowStageChange, so a stage can be pressed to move the record there - #28198
Conversation
A record:path block may opt in to changing the record's stage by pressing a stage on the path. Off unless authored, no schema default; the spec declares the opt-in and its meaning only. The console parity gate books the key as unpublished until the path renderer reads it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibxNQzFQH8nBAaoSUkx
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibxNQzFQH8nBAaoSUkx
… allowStageChange Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibxNQzFQH8nBAaoSUkx
…-asm4hj Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibxNQzFQH8nBAaoSUkx
📓 Docs Drift Check2 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. What this run could not see
Coarse fallback — 168 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 a91883cbbf0e83bb4feb6f0460582314d0cba15c && git checkout a91883cbbf0e83bb4feb6f0460582314d0cba15c
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 70209b892a9baa5849cd887bf14107a28d668c7f e0c5c2fd6f7e43e12e7bb8055b5ec55a50b9db7c && git checkout -B drift-repro 70209b892a9baa5849cd887bf14107a28d668c7f && git merge --no-ff e0c5c2fd6f7e43e12e7bb8055b5ec55a50b9db7c
node scripts/docs-audit/affected-docs.mjs --json 70209b892a9baa5849cd887bf14107a28d668c7f |
…-asm4hj Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibxNQzFQH8nBAaoSUkx
|
domain:spec#1 · os-tesla · session_01L9qibw58ehQ2gRHP2h2Puz Contract-review-claim: At |
|
domain:spec#1 · os-tesla · session_01L9qibw58ehQ2gRHP2h2Puz Contract reviewServed-tier: Inputs: card #28061 body and its three comments (claim 6526133189, claim correction 6526163273 with the seat's ruling A, os-dev-report 6527812635); PR #28198 body, 6-file list and the diff against ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Should-fix (none blocks the contract):
Implemented-by: VERDICT: PASS |
|
domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm 维护者速读
席位核对 · ACCEPT ·
|
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 41097385837 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 41098081722 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 41099801845 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 41103651411 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Requested by Tesla · project thread
Fixes #28061
Clause-②: yes (widening)
Metadata-protocol: added
Skills-docs: none —
skills/objectstack-ui/rules/pages.mdteachesrecord:pathasstatusField+stagesand every taught use stays true; teachingallowStageChangewaits for the console half that makes it do something, so the skill line belongs to that follow-up.维护者速读
record:path区块的 spec(RecordPathProps)新增一个可选布尔键allowStageChange,作者打开后,路径上的阶段可以被点击来请求把记录改到该状态;不写或写false时仍是今天的只读进度条。plugin-detail的record-path.tsx)是另一张domain:ui卡。packages/spec/src/ui/component.zod.ts的allowStageChange(describe 写明含义)、packages/spec/src/ui/component.test.ts新增的三条测试、ui/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts新增的一条UNPUBLISHED_EXEMPTIONS豁免。pnpm --filter @objectstack/spec exec vitest run src/ui/component.test.ts -t allowStageChange,预期 3 条全部通过。What changes
RecordPathProps(ComponentPropsMap['record:path']) declaresallowStageChange: z.boolean().optional(), with no schema default (theRecordChatterPropsreason: a default would writefalseonto every parsed component). Absent orfalseis the read-only progress rail, as today. The.describe()and docblock state the console contract from the card: with the key on, each stage the reader may move the record to is a button, offered only to a reader who may editstatusField; a press confirms, then savesstatusFieldthrough the same record updaterecord:detailsuses, with the record's concurrency token, so the object'sstate_machinevalidation (ADR-0020) and field edit rights decide; a refusal is shown in place. No server change.packages/spec/authorable-surface/ui.json(+1 row,ui/RecordPathProps:allowStageChange) andcontent/docs/references/ui/component.mdx(+1 row).ui/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts: oneUNPUBLISHED_EXEMPTIONSentry,'record:path.allowStageChange', citing objectstack#28061. Without it the gate's reverse direction (a key the spec declares must be published in the block's registryinputs) reds Test UI, becauseui/consumes this PR's spec throughworkspace:^. The key is not published because the path renderer does not read it yet, the file's own bar for an entry. When the console half publishes the input, the file's stale check demands the entry's deletion in that change. Seat ruling A (this card's thread) widened the file surface by exactly this entry; nothing else underui/changes.28061-record-path-allow-stage-change.md:@objectstack/specminor, both declaration lines.Console follow-up for the seat to file (
domain:ui):ui/packages/plugin-detail/src/renderers/record-path.tsxhonoursallowStageChange(stage buttons gated by the reader's edit verdict onstatusField, confirm, write through therecord:detailsupdate path with the concurrency token, refusal shown in place), therecord:pathregistration publishes the input, theUNPUBLISHED_EXEMPTIONSentry above is deleted, andskills/objectstack-ui/rules/pages.mdteaches the key.Tests
packages/spec/src/ui/component.test.ts, new block "RecordPathProps allowStageChange — opt-in, off unless authored":accepts the opt-in and keeps the authored value:safeParsesucceeds andallowStageChangeistrue.leaves an existing path unchanged: no default is written(control): the showcase-shapedstatusField+stagesinput parses to an object equal to the input, with noallowStageChangekey.refuses a non-boolean at the key, with the code and path:'yes'gives exactly one issue,code: 'invalid_type',path: ['allowStageChange'].Local runs
pnpm --filter @objectstack/spec typecheckandpnpm --filter @objectstack/spec exec vitest runond9b26f02, under the verify lock: VERDICT command-exit 0; Test Files 843 passed (843), Tests 23972 passed, 1 todo.pnpm --dir ui exec vitest run apps/console/src/__tests__/registry-inputs-spec-parity.test.tsond9b26f02: Test Files 1 passed, Tests 261 passed (261).'record:path.allowStageChange'entry removed (grep -c0 after the edit), the same file fails exactly one case, "record:path publishes every top-level key its spec props schema declares" (expected [ 'allowStageChange' ] to deeply equal []), 1 failed and 260 passed. Restored withgit checkout HEAD --;git diff HEADempty.origin/main(4 commits,packages/specchanges in the automation domain only), on526055d6: workspace build exit 0,pnpm --filter @objectstack/spec check:generated"All 14 generated artifacts are up to date",src/ui/component.test.ts353/353 and the parity file 261/261.!in the title and no(narrowing)arm.Acceptance notes
packages/speconly. The ui parity gate made that impossible without a red Test UI; reported to the seat before any code and ruled A (one exemption entry).content/docs/ui/components/record.mdxis generated from the registryinputs, so it does not list the key until the console half publishes it.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 106 commands ond9b26f02. All 106 ran with stdin from /dev/null, exit codes captured before any pipe: 106 exited 0. Commands 60 to 106 first ran while a dts-less build of the console's dependencies was rewritingdist/; they were re-run after a full declaration build and all 47 exited 0 again.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE: "106 derived famil(ies) accounted for — 106 run, 0 NOT-MEASURED".d9b26f02; the merge withorigin/main(526055d6) brought in 4 commits, none touchingpackages/spec/src/uiorui/.test:reponot run locally (CI's Test Core).Generated by Claude Code