Repository navigation
refactor(spec): share the form object-name resolver with lint - #25979
Conversation
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NRNx6Ah37J9r3zaMuuC4fs
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NRNx6Ah37J9r3zaMuuC4fs
📓 Docs Drift Check4 anchor(s) derived from 3 changed package(s); no hand-written page names any of them. What this run could not see
Coarse fallback — 144 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 3b74b6556c576d7e801372739428f5ea28ad25ba && git checkout 3b74b6556c576d7e801372739428f5ea28ad25ba
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a4eae06499a8f0377960bfc9c98daced5cf19258 1691585fa6ee4047eb9bb46bc06952df1cfcf147 && git checkout -B drift-repro a4eae06499a8f0377960bfc9c98daced5cf19258 && git merge --no-ff 1691585fa6ee4047eb9bb46bc06952df1cfcf147
node scripts/docs-audit/affected-docs.mjs --json a4eae06499a8f0377960bfc9c98daced5cf19258 |
Contract reviewServed-tier: Inputs: card #25756 (body, comments 6394618326, 6409947695, 6410190296, 6411223236), PR #25979 body, file list and net diff against main at the head, the 48 check-runs on the head. Read-only: nothing built, run or re-run. ① Derived judgments
② Semver levelChangeset ③ Boundary flags
Implemented-by: VERDICT: PASS |
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NRNx6Ah37J9r3zaMuuC4fs
Contract reviewServed-tier: Inputs: card #25756 (body, comments 6394618326, 6409947695, 6410190296, 6411223236), PR #25979 body, file list and net diff against main at the head, the 48 check-runs on the head, and the prior record 6411696416 on head 7a6a2de as a prior record only. Read-only: nothing built, run or re-run. The head moved from 7a6a2de by exactly one commit, 1691585, which changes comment lines alone in packages/metadata-core/src/anonymous-form-intake.ts (+5/-2, compare 7a6a2de...1691585: ahead 1, one file); the whole head is judged below, not only the delta. ① Derived judgments
② Semver levelChangeset ③ Boundary flags
Implemented-by: VERDICT: PASS |
席位核对ACCEPT · domain:spec seat 2 · 2026-10-26T09:10Z · head
|
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 40298562907 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
|
Queue ejection · domain:spec seat 2 The merge-queue CI run 40298562907 failed one test in |
Requested by Steedos · project thread
Fixes #25756
Clause-②: yes (widening)
Metadata-protocol: none
What
The rung order that resolves the object an open anonymous form submits into (the form's
data.object, else the view'slist.data.object,form.data.object,object) was typed twice: asanonymousFormObjectNamein@objectstack/metadata-coreand ascandidateObjectNamein the lint rulevalidate-public-form-file-fields. It now lives once, in@objectstack/spec/uibesideanonymousFormIntakeCandidates.packages/spec/src/ui/anonymous-form-intake.ts: declares and exportsanonymousFormObjectName; the docblock no longer says it stays in metadata-core.packages/metadata-core/src/anonymous-form-intake.ts: re-exports the spec function. The consumers (restform-routes.ts,rest-server.ts, metadata-protocolruntime-authoring-gate.ts) import from metadata-core unchanged.packages/lint/src/validate-public-form-file-fields.ts: imports it from@objectstack/spec/ui;candidateObjectNameis gone.anonymousFormObjectNameto be the spec binding itself (module and barrel); a lint test pins that the rule imports it from@objectstack/spec/uiand keeps no retyped copy.api-surface/ui.jsonandexport-origins/ui.json(one added export); one changeset.Behaviour effect (stated, as ordered)
Lint's old helper went through
viewObjectName(view-walk.ts), which also readsobjectNameon a raw input and skips non-string or empty values. The shared function is the doors' own raw read and does neither, so lint now judges exactly the object the doors resolve. A form that setsobjectName(not a spec key) or an empty or non-stringobjectno longer binds an object in this rule; the doors never honoured those either, so the rule no longer judges a form the doors cannot reach. No producer in the repo was found relying on the old reading.Measurements
git grep candidateObjectName -- packages: 0 hits after the change.git grep "v.list?.data?.object" -- packagesstill hits lint-view-refs.ts:185, an unrelated candidate list (the card's own correction).Acceptance notes
Gate and test readings are in the os-dev report comment on #25756.
Generated by Claude Code