You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec: ActionSchema.params accepts a repeated param name silently; the same-name rule (#28280) is stated only in the validator docblock #28732
Filing gate: ① residual named by the PR #28707 delta contract review (6560309650, CONTRACT_REVIEW_TIER), class b, read. Filed by domain:server seat 3 as recorded in the ACCEPT 6560321699. ⛔ Not a claim.
Reach: since PR #28707 (#28280), an action may declare one param name twice (sys_user.create_user declares email twice, each with its own visible / requiresFeature), and validateActionParams folds the declarations: the name is required only when every declaration is required, and the value shape comes from the first. The spec's ActionSchema.params accepts a repeated name silently and says nothing about this. The only statement of the rule is the docblock in packages/spec/src/ui/action-params.zod.ts.
Business reason: an AI or an author writing an action's params reads the schema, not the validator's docblock. Without the rule in the declared surface, the next repeated name is either written by accident (two declarations that drift apart) or avoided when it is the right pattern.
Wanted
The declared surface states the same-name rule where an author reads it: the params member's description in ActionSchema (and the generated reference) says a name may repeat only for per-gate variants of one input, that required holds only when every declaration requires it, and that the first declaration's type wins. ⛔ No new lint rule or gate (「新增门禁默认否」); if a parse-time refusal of drifting shapes (same name, different type) is wanted, raise it as an open question with its four-axis case.
Dedupe
Searched open and closed issues for action params duplicate name, repeated param name and validateActionParams same name: none. New.
Reader who acts: domain:server (or the spec lane: packages/spec/src/ui/action.zod.ts description only).
Claim: PM loop round 1 · card thread · 2026-11-01T16:24Z
Session: session_01FEkQ5kE5BrPUPNMMyv6oCH (the seat); the card thread is session_01FEkQ5o3L823pQdYghSTxPm
Account: os-project-manager (the seat's linked user; the card's assignee)
Branch: claude/project-thread-qaqibu (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
Worktree: the card thread's own container checkout
Domain: domain:server
Seat: domain:server#3
Ruling-ref: the maintainer, 2026-11-01T03:46Z: 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」, with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」, and 2026-11-01T06:39Z 「server 队列还是很多任务,再开一个席位吧」. Grade: seat 3 triage 6560352773, under 2026-11-01T12:11Z 「定级你可以自己决定」.
File surface: packages/spec/src/ui/action.zod.ts (one .describe() on params), the generated artifacts its scripts regenerate, and a changeset if a shipped file moves. ⛔ No new gate.
Container & model: S, mode:thread, model: opus (--tier names no path mandate: PM's call, default), effort: default (the coordinator sets effort only from the maintainer's words)
Clause-②: no — expected: a description is not a key; the dev measures and declares the final value.
Metadata-protocol: none (expected; the dev measures and declares)
Responsibility: the code is packages/specActionSchema · the platform path is the published schema description and generated reference · reached by an author or AI writing an action with a repeated param name
Thread-read: 6560352773
Premise: holds as filed: PR #28707 (merged 8bceb6a2) states the rule only in the validator docblock
Serial constraints cleared: none found at this read; the dev re-reads overlap at start and before pr_create.
Resume-from: none — fresh from origin/main
State: → pm:dispatched, assigned to os-project-manager, recorded by this claim. Order: pm-orders/server/order-28732.md (project folder).
os-dev-report
{
"issue": 28732,
"status": "done",
"branch": "claude/project-thread-qaqibu",
"pr": "#28752",
"head": "157212e3",
"session": "session_01FEkQ5o3L823pQdYghSTxPm",
"premise_still_valid": true,
"summary": "ActionSchema.params (packages/spec/src/ui/action.zod.ts) keeps its first describe sentence and gains one stating the rule validateActionParams applies since PR #28707: a param name (its name, or the field a field-backed param reads) may repeat only for per-gate variants of one input (different visible / requiresFeature); required only when every declaration requires it; value judged by the first declaration's shape (type, multiple, options). References regenerated with gen:schema + gen:docs (4 mdx files, 5 rows, no hand edits); spec patch changeset with Clause-②: no / Metadata-protocol: none. No gate, rule or refusal added. Wording widened beyond the order's literal to name the field spelling, because the only repeated name in the tree (sys_user.create_user email) is declared via field.",
"tests": "At head 157212e: pnpm --filter @objectstack/spec test :: exit 0 (Test Files 785 passed (785), Tests 23206 passed | 1 todo); pnpm --filter @objectstack/spec typecheck :: exit 0 (check:test-typecheck OK, ledger held); eslint packages/spec/src/ui/action.zod.ts --no-inline-config :: exit 0. No new test and no ablation: description text only, no tested behaviour changed.",
"gates": "97 derived by dispatch-gates --commands --repo objectstack-ai/objectstack at head 157212e; 96 exit 0, check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET: needs every package dist, NOT MEASURED, CI runs it). Re-runs: check:skill-examples and check:lean-entry-closure first exit 3 (client-react / objectql dist absent), exit 0 after building them. --ran reconciliation: 97 derived, 96 run, 1 NOT-MEASURED, 0 UNRUN. Full record: pm-orders/server/28732-gates-ran.txt and the PR body Verification block. CI check-runs: in_progress at report time.",
"line_budget": "22 changed lines (+16 / -6), 6 files, vs the human-merge threshold 3000: under",
"files_changed": [
".changeset/28732-action-params-same-name-rule.md",
"content/docs/references/data/object.mdx",
"content/docs/references/kernel/metadata-plugin.mdx",
"content/docs/references/ui/action.mdx",
"content/docs/references/ui/component.mdx",
"packages/spec/src/ui/action.zod.ts"
],
"deviations": [
"Description names name or field (the order's sentence named the name only); reason in the PR Acceptance notes.",
"test:repo not run locally (no repo-project test or derived listing names it); CI Test Core runs it."
],
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "4 — mcp__github__issue_read x3 (get #28732, get_comments #28732 x2), mcp__github__pull_request_read x1 (get #28707); no MCP write",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls via fleet-write run 41330161957 → #28752) and this os-dev-report comment (POST /repos//issues/28732/comments via post-stamped.mjs). Write budget: 3 strokes (git push, pr_create, report); git push ran 3 times on the harness branch (not REST).",
"open_questions": [],
"out_of_scope_findings": []
}
git grep -n "A param name (its \name`, or the `field`" origin/main -- packages/spec/src/ui/action.zod.ts`
present at line 1431
Landed: merged as 5493b884; Fixes #28732 closed the card. ActionSchema.params now states the same-name rule (fix(platform-objects): Setup Create User marks Email required while phone sign-in is off #28707): a repeated param name, by name or by field, is only for the gated variants of one input, it is required only when every declaration is, and the first declaration's value shape wins. The generated references carry the same sentence.
Contract review (CONTRACT_REVIEW_TIER) PASS 6561409355 on the landed head 157212e3; seat ACCEPT 6561430008. The one should-fix was wording only (name validateActionParams in the sentence) and did not block landing.
Activity
objectstack-fleet commentedon Nov 1, 2026
domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH
Path: 防 AI 写错 | none | P③
Triage: p3 ·
domain:server·area:api· 2026-11-01T16:00Z⛔ Not a claim.
ActionSchema.params(and the generated reference), no new gate. Waits for PR fix(platform-objects): Setup Create User marks Email required while phone sign-in is off #28707 to land.objectstack-fleet commentedon Nov 1, 2026
domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH
Claim: PM loop round 1 · card thread · 2026-11-01T16:24Z
Session:
session_01FEkQ5kE5BrPUPNMMyv6oCH(the seat); the card thread issession_01FEkQ5o3L823pQdYghSTxPmAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-qaqibu(the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)Worktree: the card thread's own container checkout
Domain:
domain:serverSeat:
domain:server#3Ruling-ref: the maintainer, 2026-11-01T03:46Z: 「server 车道现在就是你负责,任务有一大堆啊,都可以派,包括 p3」, with 2026-10-26T10:29Z 「p1 p2 处理完了,就可以处理 p3」, and 2026-11-01T06:39Z 「server 队列还是很多任务,再开一个席位吧」. Grade: seat 3 triage
6560352773, under 2026-11-01T12:11Z 「定级你可以自己决定」.File surface:
packages/spec/src/ui/action.zod.ts(one.describe()onparams), the generated artifacts its scripts regenerate, and a changeset if a shipped file moves. ⛔ No new gate.Container & model:
S,mode:thread,model: opus(--tiernames no path mandate: PM's call, default),effort: default (the coordinator sets effort only from the maintainer's words)Clause-②: no — expected: a description is not a key; the dev measures and declares the final value.
Metadata-protocol: none (expected; the dev measures and declares)
Responsibility: the code is
packages/specActionSchema· the platform path is the published schema description and generated reference · reached by an author or AI writing an action with a repeated param nameThread-read: 6560352773
Premise: holds as filed: PR #28707 (merged
8bceb6a2) states the rule only in the validator docblockSerial constraints cleared: none found at this read; the dev re-reads overlap at start and before
pr_create.Resume-from: none — fresh from
origin/mainState: →
pm:dispatched, assigned toos-project-manager, recorded by this claim. Order:pm-orders/server/order-28732.md(project folder).objectstack-fleet commentedon Nov 1, 2026
domain:server#3 · os-project-manager · session_01FEkQ5o3L823pQdYghSTxPm
os-dev-report
{
"issue": 28732,
"status": "done",
"branch": "claude/project-thread-qaqibu",
"pr": "#28752",
"head": "157212e3",
"session": "session_01FEkQ5o3L823pQdYghSTxPm",
"premise_still_valid": true,
"summary": "ActionSchema.params (packages/spec/src/ui/action.zod.ts) keeps its first describe sentence and gains one stating the rule validateActionParams applies since PR #28707: a param name (its name, or the field a field-backed param reads) may repeat only for per-gate variants of one input (different visible / requiresFeature); required only when every declaration requires it; value judged by the first declaration's shape (type, multiple, options). References regenerated with gen:schema + gen:docs (4 mdx files, 5 rows, no hand edits); spec patch changeset with Clause-②: no / Metadata-protocol: none. No gate, rule or refusal added. Wording widened beyond the order's literal to name the field spelling, because the only repeated name in the tree (sys_user.create_user email) is declared via field.",
"tests": "At head 157212e: pnpm --filter @objectstack/spec test :: exit 0 (Test Files 785 passed (785), Tests 23206 passed | 1 todo); pnpm --filter @objectstack/spec typecheck :: exit 0 (check:test-typecheck OK, ledger held); eslint packages/spec/src/ui/action.zod.ts --no-inline-config :: exit 0. No new test and no ablation: description text only, no tested behaviour changed.",
"gates": "97 derived by dispatch-gates --commands --repo objectstack-ai/objectstack at head 157212e; 96 exit 0, check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET: needs every package dist, NOT MEASURED, CI runs it). Re-runs: check:skill-examples and check:lean-entry-closure first exit 3 (client-react / objectql dist absent), exit 0 after building them. --ran reconciliation: 97 derived, 96 run, 1 NOT-MEASURED, 0 UNRUN. Full record: pm-orders/server/28732-gates-ran.txt and the PR body Verification block. CI check-runs: in_progress at report time.",
"line_budget": "22 changed lines (+16 / -6), 6 files, vs the human-merge threshold 3000: under",
"files_changed": [
".changeset/28732-action-params-same-name-rule.md",
"content/docs/references/data/object.mdx",
"content/docs/references/kernel/metadata-plugin.mdx",
"content/docs/references/ui/action.mdx",
"content/docs/references/ui/component.mdx",
"packages/spec/src/ui/action.zod.ts"
],
"deviations": [
"Description names
nameorfield(the order's sentence named the name only); reason in the PR Acceptance notes.","test:repo not run locally (no repo-project test or derived listing names it); CI Test Core runs it."
],
"dogfood_battery": "n/a — no
!in the PR title and no (narrowing) arm","mcp_calls": "4 — mcp__github__issue_read x3 (get #28732, get_comments #28732 x2), mcp__github__pull_request_read x1 (get #28707); no MCP write",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls via fleet-write run 41330161957 → #28752) and this os-dev-report comment (POST /repos//issues/28732/comments via post-stamped.mjs). Write budget: 3 strokes (git push, pr_create, report); git push ran 3 times on the harness branch (not REST).",
"open_questions": [],
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH
PR #28752 accepted (seat ACCEPT #28752 (comment), contract review PASS #28752 (comment)) and enqueued for merge. Landing record follows after merge.
objectstack-fleet commentedon Nov 1, 2026
domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH
Landing record · #28732 · PR #28752
domain:serverseat 3 ·session_01FEkQ5kE5BrPUPNMMyv6oCH· 2026-11-01T17:57Zgit ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28752-*'git merge-base --is-ancestor 5493b884 origin/maingit grep -n "A param name (its \name`, or the `field`" origin/main -- packages/spec/src/ui/action.zod.ts`5493b884;Fixes #28732closed the card.ActionSchema.paramsnow states the same-name rule (fix(platform-objects): Setup Create User marks Email required while phone sign-in is off #28707): a repeated param name, bynameor byfield, is only for the gated variants of one input, it is required only when every declaration is, and the first declaration's value shape wins. The generated references carry the same sentence.CONTRACT_REVIEW_TIER) PASS6561409355on the landed head157212e3; seat ACCEPT6561430008. The one should-fix was wording only (namevalidateActionParamsin the sentence) and did not block landing.StudioDesignSurface.metadataArea-28561.test.tsxand Type Check UI. That came from feat(studio): a read-only base and its customization pair as one surface #28747 ahead of it in the same stack (anchor issue Queue-flake anchor: packages/app-shell/src/views/studio-design/StudioDesignSurface.metadataArea-28561.test.tsx #28758), not from this PR. The queue rebuilt without feat(studio): a read-only base and its customization pair as one surface #28747 and merged it.mainat5493b884or later.