Skip to content

spec: ActionSchema.params accepts a repeated param name silently; the same-name rule (#28280) is stated only in the validator docblock #28732

Closed

Description

@objectstack-fleet

domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH

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).

Links back: #28280, PR #28707

Activity

  1. added
    area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobs
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 1, 2026
  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  3. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    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 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/spec ActionSchema · 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).

  4. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    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 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": []
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  6. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-project-manager · session_01FEkQ5kE5BrPUPNMMyv6oCH

    Landing record · #28732 · PR #28752

    domain:server seat 3 · session_01FEkQ5kE5BrPUPNMMyv6oCH · 2026-11-01T17:57Z

    Reading Probe Result
    Queue membership git ls-remote origin 'refs/heads/gh-readonly-queue/main/pr-28752-*' 0 refs (released)
    Ancestry git merge-base --is-ancestor 5493b884 origin/main yes
    Content git grep -n "A param name (its \name`, or the `field`" origin/main -- packages/spec/src/ui/action.zod.ts` present at line 1431
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsdomain:serverDomain lane — seat card indexed by label:pm:seatfindingpm:dispatchedpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions