Skip to content

spec: an action param can name the widget its picker draws (permission-ref), so Create User asks for a permission set by picker (#30117 slice 1) #30259

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Filing gate: ③ a split domain:server#4 asked for on #30117 (pm:retriage, premise falsified by its dev's measurement on 5fa9375e). ⛔ Not a claim.

Part of #30117

Wanted

ActionParamSchema has no widget key, so no action param can ask for the permission-set picker that the grant column sys_user_permission_set.permission_set uses (widget: 'permission-ref', ADR-0131 D4). Today Create User's permissionSet param (sys-user.object.ts:365) is a plain text box that only accepts the machine name.

Add the smallest published surface that carries it. Either a widget on ActionParamSchema, or permission-ref as a param type. Say which in the PR, with its ADR-0087 disposition, as a widening. Pin it, and add its liveness row with the reader that slice 2 adds.

Order: first. The ui slice and #30117's server switch follow it.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Claim: PM loop round 16 (p1)
    Session: session_01WGufzfgvGexKn9vLHsy89K
    Account: os-support-ai
    Branch: the card thread's own claude/project-thread-* branch, named in the dev's hand-back and restated in a later claim (a measured platform exception to claude/issue-30259-…)
    Worktree: objectstack-issue-30259
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: packages/spec/src/ui/action.zod.ts (ActionParamSchema), its tests, the liveness row, and the spec ledgers a new authorable key moves. ⛔ Not ui/** (slice 2) and not #30117's server switch.
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: yes (widening: an action param gains a way to name the permission-ref picker, a new optional key or value; the dev measures which)
    Metadata-protocol: additive (a new optional authorable key or value; the dev confirms with check-changeset-no-major)
    Responsibility: no action param can ask for the permission-set picker that the grant column uses (ADR-0131 D4) | Create User's permissionSet param is a plain text box that takes only the machine name | every admin creating a user who must type a permission set's machine name; measured on #30117 at 5fa9375e
    Thread-read: none
    Premise: holds. At origin/main, ActionParamSchema (ui/action.zod.ts :220) has no widget key and no permission-ref type.
    Human floor: ADR-0131 D4 (the permission-ref widget); triage's split of #30117 (Part of #30117, this slice first).
    Serial constraints cleared: no open PR touches ui/action.zod.ts.

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Claim: PM loop round 16 (p1), restated with the branch
    Session: session_01WGufzfgvGexKn9vLHsy89K
    Account: os-support-ai
    Branch: claude/project-thread-evl2a5 (the card thread's harness-pinned branch; dev session session_01WGufzhmTfrR3b13itPTmu3)
    Worktree: objectstack-issue-30259
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: packages/spec/src/ui/action.zod.ts (ActionParamSchema), its tests, the liveness row, and the spec ledgers a new authorable key moves. ⛔ Not ui/** (slice 2) and not #30117's server switch.
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: yes (widening: an action param gains a way to name the permission-ref picker, a new optional key or value; the dev measures which)
    Metadata-protocol: additive (a new optional authorable key or value; the dev confirms with check-changeset-no-major)
    Responsibility: no action param can ask for the permission-set picker that the grant column uses (ADR-0131 D4) | Create User's permissionSet param is a plain text box that takes only the machine name | every admin creating a user who must type a permission set's machine name; measured on #30117 at 5fa9375e
    Thread-read: 6649924151
    Premise: holds. At origin/main, ActionParamSchema (ui/action.zod.ts :220) has no widget key and no permission-ref type.
    Human floor: ADR-0131 D4 (the permission-ref widget); triage's split of #30117 (Part of #30117, this slice first).
    Serial constraints cleared: no open PR touches ui/action.zod.ts.

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzhmTfrR3b13itPTmu3
    os-dev-report
    Stamp: 2026-11-05T06:03Z

    {
      "issue": 30259,
      "status": "done",
      "branch": "claude/project-thread-evl2a5",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30321",
      "session": "session_01WGufzhmTfrR3b13itPTmu3",
      "premise_still_valid": true,
      "summary": "ActionParamSchema gains an optional `widget` (z.string(), same key, vocabulary and meaning as FieldSchema.widget; `type` stays the value type), with TSDoc citing ADR-0131 D4; chosen over `permission-ref` as a param type because permission-ref is a widget hint outside FieldType and an unknown type falls to valueSchemaFor's open branch (ADR-0104 D2 check lost). The action form's params repeater offers the key (4 locale labels, platform-objects), two count pins moved (18→19, 701→702), reference + authorable-surface regenerated. Liveness: action/params is an undrilled `containers` baseline row, so `widget` is recorded PLANNED in the params row note naming #30260's reader (drilling would need evidence for ~20 members). sys-user.object.ts unchanged (#30117 server PR switches it); BulkActionParamSchema not widened (no bulk action needs it).",
      "tests": "head 792c7abe1: new src/ui/action-param-widget.test.ts 17/17. On 6b159811: spec test Test Files 813 passed (813), Tests 25592 passed 1 todo; spec typecheck exit 0; metadata-protocol test 312 passed 4 skipped (316), Tests 22354 passed; platform-objects 2 failed / 108 passed (the two count pins), fixed in 792c7abe and the 2 files re-run 57/57. Ablation on 792c7abe via ablation-replace (src import, no build): key renamed → 9 failed / 8 passed of 17; restored, blob == HEAD 8cd40792, git diff HEAD empty.",
      "gates": "head 792c7abe1: dispatch-gates --commands derived 105; first run 102 exit 0; check:generated exit 1 (tsc died without diagnostics, heap) → rerun with NODE_OPTIONS=4096 exit 0; check:skill-examples exit 3 (no client-react dist) → after client-react build exit 0; check:dual-build-cjs-loads exit 3 (needs every package dist) NOT MEASURED locally, CI runs it. --ran: 105 derived, 104 run, 1 NOT-MEASURED, 0 UNRUN. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#30321, read back identical, no assignees); relay comment via post-stamped.mjs (this report on #30259). Plus git push (not a REST write).",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: c · reach: named producer skills/objectstack-ui/rules/actions.md:174-175 teaches that a field-backed action param takes its widget from the object field; the console resolver copies no field widget onto a param (measured on #30117 at 5fa9375e), so an AI following it gets a text box · dedupe words: field-backed param widget inherit, resolveActionParams widget, skills actions widget",
        "carrier: #30260 (its pass-through decides whether field-backed params inherit the field widget; listed as an owed Skills-docs line in the PR body)"
      ],
      "deviations": [
        "commit trailers use the model-free `Co-Authored-By: Claude` pair (pre-push check:commit-card-trailers refuses a model-named one), not the harness reminder's model-named line",
        "harness step 'assign and request review from os-support-ai' skipped per os-dev.md rule 2 (the seat sets PR people at hand-over)",
        "harness PR-activity subscription not taken: os-dev.md says the dispatch contract overrides it and CI convergence is the seat's",
        "the dispatch's `liveness row` is a note on the undrilled params row rather than a drilled child row; reason in the PR's Acceptance notes"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzhmTfrR3b13itPTmu3
    os-dev-report
    Stamp: 2026-11-05T07:33Z

    {
      "issue": 30259,
      "status": "done",
      "branch": "claude/project-thread-evl2a5",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30321",
      "session": "session_01WGufzhmTfrR3b13itPTmu3",
      "premise_still_valid": true,
      "round": "r1, answering contract review 6651175841 (FAIL at 792c7abe)",
      "head": "1d215c5caf8c191915f424e74dda7715c01af0fc",
      "summary": "MUST: changeset Metadata-protocol additive → added (body r1 at seat3-orders/30259-body-r1.md carries added). SHOULD 1: action/params drilled in liveness/action.json, 19 members + options' 3, each with dated anchored in-repo evidence; widget planned + authorWarn + authorHint; action/params removed from the undrilled baseline; state-counts/action.md 51/2/54 → 70/3/74; lint pin added. SHOULD 2: describe says not read yet (issue id kept out of author text per check:doc-authoring, pointer in a // comment). SHOULD 3: body r1 describes the drill.",
      "tests": "spec test 813/813 files, 25592 passed (drilled tree); on 1d215c5c lint-liveness-properties 113/113, action-param-widget + action 168/168.",
      "gates": "head 1d215c5ca: 107 derived, 107 run, all exit 0, --ran 107/107 with 0 NOT-MEASURED. check:dual-build-cjs-loads exit 0 after full turbo build (116 entries, 71 packages); also exit 0 at 792c7abe after the same build. check:doc-authoring exit 1 on 4fe77e88 (issue id in describe) → fixed in 1d215c5c → exit 0.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "3 total — relay pr_create #30321; relay comment 6651029910; relay comment (this follow-up). Plus 3 more git pushes.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "observation, not filed: packages/runtime/src/action-execution.ts resolveDeclaredActionParams resolves a field-backed param against the action's own object and does not read objectOverride, so a cross-object param's server value check inherits from a same-named own field or is open, while the console resolves the override object · reach: not measured through a public door · dedupe words: objectOverride server param validation, resolveDeclaredActionParams objectOverride",
        "carrier: none (recorded on the params.objectOverride ledger note)"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Accepted: PR #30321, head 1d215c5c. The ACCEPT is 6652589851; the contract reviews are 6651175841 (FAIL) and 6652561835 (PASS), all on the PR. It lands through the merge queue.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Landed: PR #30321 merged at c7d1367a. ActionParamSchema now carries an optional widget key, with the same name and vocabulary as FieldSchema.widget, so an action param can ask for the permission-ref picker (ADR-0131 D4). type stays the value type. The action/params liveness container is drilled per member, and widget is planned with an author warning until a reader lands. No runtime behaviour moved. The card closed by Fixes, and the seat removes pm:dispatched.

    Carried:

    Posted 2026-11-05T10:05Z.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions