Repository navigation
fix(spec): register the newTabUrl path refusal as an ADR-0087 D3 entry; the form label says path - #27282
Conversation
…; the form label says path Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGufzhJoJYPHSvBpq8euSq
📓 Docs Drift CheckThis PR changes 2 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 1 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 146 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 4dabc85fc0cc0334be4a4b8bf5888ad084ca3149 && git checkout 4dabc85fc0cc0334be4a4b8bf5888ad084ca3149
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 0d45c0e71f0a03bdcf2230901515c2a29716a92b 78e8f97515f54992d16469102d21f461840d42a0 && git checkout -B drift-repro 0d45c0e71f0a03bdcf2230901515c2a29716a92b && git merge --no-ff 78e8f97515f54992d16469102d21f461840d42a0
node scripts/docs-audit/affected-docs.mjs --json 0d45c0e71f0a03bdcf2230901515c2a29716a92b
|
The actions page called newTabUrl a "new-tab target template", which reads as a URL now that only a path starting with / is accepted. Say it is a path on this backend and point an external page at a url action. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGufzhJoJYPHSvBpq8euSq
Contract reviewServed-tier: Round 2 of record 6470108120 on #27252 (merged 13:42Z as ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读 (席位终稿)
席位意见:接受。契约复核第二轮 PASS(6472342134),第一轮 FAIL(6470108120)的条目已关闭。 席位核对 · ACCEPT ·
|
Requested by Yibo Wang · project thread
Refs #26924
Clause-②: no
Metadata-protocol: none
Skills-docs: none — no
skills/**file changes; the one sentence that teachesnewTabUrl(skills/objectstack-ui/rules/actions.md) already teaches a backend path since #27252. Not Tier H.This PR carries the contract-review FAIL items of record 6470108120 on #27252, found after the maintainer had queued #27252 (queued 13:21Z, record 13:21Z, merged 13:42Z as
c13ef04c3).维护者速读
newTabUrl收窄补登 ADR-0087 D3 语义条目ui-action-new-tab-url-path-refused(结构化 TODO,两种改法都写明,不做自动转换);动作表单该字段的标签在四种语言里都改为「路径」。not-required,但变更说明里带了改法,应登记条目;复核结果出来时 fix(spec)!: an action's newTabUrl is a backend path starting with /; dashboard read-refusal and citation prose #27252 已在合并队列里,所以补在这里。os migrate meta的待办),标签仅文字。回滚即 revert 本 PR。packages/spec/src/migrations/entries/semantic/18.ui-action-new-tab-url-path-refused.ts、.changeset/26924-new-tab-url-d3-entry.md、packages/spec/src/ui/action.form.ts;文档content/docs/protocol/objectui/actions.mdx一句改为「本后端路径」。pnpm --filter @objectstack/spec gen:migration-registry && pnpm --filter @objectstack/spec exec vitest run src/migrations,预期全部通过,且生成的登记表含ui-action-new-tab-url-path-refused。What changes
packages/spec/src/migrations/entries/semantic/18.ui-action-new-tab-url-path-refused.ts(protocol 18), following the in-tree18.*-refused.tsshape (18.ui-action-undoable-unfulfillable-refused.ts):surface: anactiondocument (standalone, an object'sactions[], or type-level) whosenewTabUrldoes not start with/.replacement: the backend path (newTabUrl: '/sso-open/{recordId}'), or for an external page dropopensInNewTab/newTabUrland declare atype: 'url'action (target: 'https://example.com/export/${ctx.recordId}',openIn: 'new-tab'). Stated as not mechanically convertible, a structured TODO: an external URL names no path on this backend, and the url-action rewrite changestype, drops the action's owntarget/bodyhandler and replaces the auth-enforcing endpoint with a page the browser opens directly, so which remedy the author meant is not recorded anywhere.reasonandacceptanceCriteria: the console's origin-prefix behaviour, why the set is closed rather than widened, and the stored-row behaviour already pinned by fix(spec)!: an action's newTabUrl is a backend path starting with /; dashboard read-refusal and citation prose #27252 (loads unchanged and registered,invalidwith a[metadata_spec_invalid]boot line,_diagnosticsatnewTabUrl, next save 422INVALID_METADATA).ActionSchema.newTabUrl's JSDoc names the entry..changeset/26924-new-tab-url-backend-path.mdis not edited (check-empty-changesetrefuses edits to a changeset the merge base carries). A new.changeset/26924-new-tab-url-d3-entry.md(@objectstack/specpatch,@objectstack/platform-objectspatch) carriesadr-0087: registered ui-action-new-tab-url-path-refusedand a "Supersedes, in the same release" paragraph that replaces the earliernot-requireddisposition. Both packages are unreleased since fix(spec)!: an action's newTabUrl is a backend path starting with /; dashboard read-refusal and citation prose #27252, so the two notes ship together.content/docs/protocol/objectui/actions.mdxcallednewTabUrla "new-tab target template", which reads as a URL after fix(spec)!: an action's newTabUrl is a backend path starting with /; dashboard read-refusal and citation prose #27252; it now says a path on this backend starting with/, and points an external page at atype: 'url'action withopenIn: 'new-tab'(flagged by the docs-drift check on this PR).action.form.tslabelsnewTabUrl"New-tab path";en.metadata-forms.generated.tsis regenerated bynode scripts/check-i18n-bundles.mjs --write. zh-CN 「新标签页路径」, ja-JP 「新しいタブのパス」, es-ES "Ruta de pestaña nueva": translated-locale values are hand-authored (AGENTS.md documentation guardrails: the generator rewrites onlyenand keeps every translated value), so they are edited in place and the generator re-run reports them in sync.Tests
gen:migration-registrythensrc/migrations+src/conversions→ see Verification.Acceptance notes
refused-shapes.tsdetector is added for the entry; the review asked for the D3 entry. A detector would makeos migrate meta --storedlist each stored row by name; that can follow if the seat wants it.skills/objectstack-ui/evalscase fornewTabUrlstays with the lane seat, as noted at ACCEPT.Verification
All readings on a shared container, base
main7858c1d16.Head
78e8f9751: two commits on7858c1d16, 9 paths.0c704ce93carries the entry, the changeset and the labels (8 paths, +61/-7);78e8f9751is the one-line docs edit.os-verify-lock, one script): install,gen:migration-registry, build,check:generatedexit 0;@objectstack/specvitest 748 files / 22349 tests passed;@objectstack/platform-objects96 files / 1361 tests passed; CLI build, thencheck:i18nOK (en regenerated, translated locales in sync). VERDICT command-exit 0, 891 s.src/migrations+src/conversionsaftergen:migration-registry: 28 files / 945 tests passed; the generated registry carriesui-action-new-tab-url-path-refused.node scripts/check-adr-0087-registration.mjs --base origin/mainexit 0, which does not judge this marker: the gate reads only changesets that declare a breaking change, and this one is a patch. The marker was checked by hand instead: the entry file name, its exportedidand the marker all readui-action-new-tab-url-path-refused, and the generated registry carries it.check-empty-changesetexit 0 (the merged changeset is untouched).0c704ce93, 80 families were derived and all 80 ran serially, every one exit 0. With the docs commit the derivation is 101; the 21 new families plus every docs/link/affected-docs family (31 in all) were rerun on78e8f9751, every one exit 0.dispatch-gates --ranon78e8f9751: 101 derived, 101 run, 0 NOT-MEASURED, 0 UNRUN.🤖 Generated with Claude Code
https://claude.ai/code/session_01WGufzhJoJYPHSvBpq8euSq