Skip to content

spec: InlineActionSchema picks description, so an inline action's param dialog can say what the action does (cloud#3281 ruling A, half 1 of 2) #29248

Closed

Description

@objectstack-fleet

repo:cloud#2 · os-zhuang · session_0123kRqqdpAJWYMgsgdAJX4G

Filing gate: executing a recorded ruling. objectstack-ai/cloud#3281 was ruled A by the maintainer (「3281 A 3138 A」, 2026-10-26, ruling comment 6408789175): widen the contract upstream, then do the cloud card as filed. The ruling named two objectstack cards as the holding seat's next act. Neither was filed, and the cloud card has sat without them since 10-26. This is the spec half; the ui half is filed beside it.

What happens

The console's one invitation dialog (「邀请成员」, an inline api action on cloud pages) opens with the generic line 「请填写以下信息以继续操作。」 and never says what inviting does. The framework's sys_member invite_user action already has a translated description, but an inline action cannot carry one: InlineActionSchema does not pick description.

Where (objectstack main 0c0d3b68e1)

packages/spec/src/ui/action.zod.ts, InlineActionSchema (around line 2581): the .pick({...}) list has label, confirmText, successMessage, errorMessage, but not description. On ActionSchema, description is already an I18nLabel.

Ask

  • InlineActionSchema picks description: true.
  • A spec test: an inline action with an I18nLabel description parses and keeps it, and one without it still parses.
  • PR lines per the ruling: Clause-②: yes (widening), Metadata-protocol: added.

Business reason

The invitation is how a new owner brings in the first colleague. The dialog should say that the colleague gets an e-mail and joins with the chosen role after accepting. Today it says nothing.

Order

This card lands first. The ui card (DECLARED_COPY_KEYS gains description) follows. Cloud then bumps its pins and adds the description to INVITE_ACTION (cloud#3281).

Dedup

Searched objectstack issues and PRs for "InlineActionSchema description", "DECLARED_COPY_KEYS description" and "cloud#3281": nothing open or merged.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p1 (was p3) · domain:spec · pm:queue · 2026-11-02T11:02Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-steve · session_01ADHkmSduNGC2SZXszyrNut

    Claim: PM loop round 1 · 2026-11-02T11:49Z
    Session: session_01ADHkmSduNGC2SZXszyrNut (seat); dev = card thread session_01ADHkmT9dnPvF2SeYafuvmH
    Account: os-steve
    Branch: claude/project-thread-1zb3tp
    Worktree: the card thread's own checkout of objectstack-ai/objectstack
    Domain: domain:spec
    Seat: domain:spec#2
    File surface: packages/spec/src/ui/action.zod.ts (the InlineActionSchema pick and its docblock) and its tests in packages/spec; packages/lint/src/validate-action-copy-templates.ts (INLINE_KEYS gains description, so the inline copy-template check judges the newly picked key the way it judges a registered action's) and its .test.ts (amended on the card thread's measurement: without it the pick ships declared ≠ enforced at os validate / the publish gate); the regenerated references the spec gates name; root .changeset/; no ui/**, no cloud (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default — the tier is the PM's per-card call (floor sonnet · default opus · ceiling fable); Clause-② widening of a published schema, one CONTRACT_REVIEW_TIER review by the seat before landing, effort: xhigh
    Clause-②: yes (widening)
    Metadata-protocol: added
    Responsibility: n/a — not a defect card
    Thread-read: 6575512138
    Premise: holds (on origin/main f2bf2938 the InlineActionSchema .pick({...}) in packages/spec/src/ui/action.zod.ts lists label, confirmText, successMessage, errorMessage and no description)
    Serial constraints cleared: none (no in-flight domain:spec claim names action.zod.ts; the ui half #29249 is pm:blocked on this card)

    Ruling-ref: objectstack-ai/cloud#3281 ruled A by the maintainer (「3281 A 3138 A」, 2026-10-26, ruling comment 6408789175, as quoted on this card); triage 6575512138 (key name already on ActionSchema, no new public name).

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-steve · session_01ADHkmT9dnPvF2SeYafuvmH
    os-dev-report

    {
      "issue": 29248,
      "status": "done",
      "branch": "claude/project-thread-1zb3tp",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29369",
      "session": "session_01ADHkmT9dnPvF2SeYafuvmH",
      "head": "7b59669918a5f84a79c14fbbc509d1e9e494004e",
      "premise_still_valid": true,
      "summary": "InlineActionSchema picks ActionSchema's own `description` (template slot + inline locale-map arm); InlineAction/InlineActionParsed follow. Premise measured on main 27c1c555 with its built dist: an inline `description` was REFUSED (unrecognized_keys, keys [description]) for string and locale map alike, not stripped. Docblock states element:button already forwards description and the console param dialog draws it, and the remaining window (useActionTextLocalizer DECLARED_COPY_KEYS lacks description, so a locale map reaches the dialog unresolved until #29249); the stale bodyExtra paragraph (forward list now carries bodyExtra) is corrected in place, comment only. In-place fix, seat-approved file-surface add: packages/lint INLINE_KEYS gains description, so validate/compile/publish judge an inline description like a registered one (otherwise a ${...}/blank/unbound-root inline description parses and publishes). Changeset spec+lint minor; references and authorable-surface regenerated.",
      "tests": "head 89985489: spec test 790/790 files, 23392 passed 1 todo; spec typecheck exit 0; lint test 189/189 files, 7827 passed 5 skipped; lint typecheck exit 0; ui from ui/: 8 files (elementButtonActionMembers-8071, action-bodyShape-forward, action-onSuccess-forward, action-outcomeMessages-forward-11344, action-undeclared-keys-8648, block-config, block-config-i18n, PageBlockInspector.i18n) 126 tests passed (PageBlockInspector first exit 1 on unresolvable @objectstack/lint before lint dist existed, prerequisite, re-run 22/22). Final head 7b596699 (test-only describe move): the 3 touched spec files 60/60, spec typecheck exit 0. Ablation via ablation-replace (anchor 1->0, restored blob==HEAD, git diff HEAD empty): drop `description: true,` from the pick -> 8 failed 52 passed (field-set pin, 4 new description cases, flipped inline pin, 2 typed bodies; 5 CONTROL rows + no-description case stay green); drop 'description' from lint INLINE_KEYS -> 2 failed 23 passed (the 2 new lint cases). No dist rebuild needed: both suites import source.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 103 derived (same list at 89985489 and 7b596699). On 7b596699: 103 run, all exit 0; 7 dist-reading spec gates (check:api-surface, browser-reachable-entries, dual-source-exports, entry-nameability, exported-any, generated, skill-examples) first exit 3 PREREQUISITE NOT MET (dist predated the moved test file) and exit 1 for check:generated on the same cause, re-run after spec build, exit 0 each. --ran: '103 run, 0 NOT-MEASURED (a DERIVED zero)', exit 0. On 89985489 all 103 exit 0 too. check:generated at 89985489: 1/14 stale (check:docs) -> --fix -> committed. Offline on the stored PR body: check-changeset-no-major --event exit 0 (yes (widening) + added); check-partof-closing-keyword exit 0. ui check-action-forward-parity exit 0 (element:button owes 13 was 12, forwards 18). Local-only: check:skill-frame-freshness exit 0; check:dev-prereqs exit 1 = 35 ui workspace dists unbuilt in this container (spec dist fresh), state not finding. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "files_changed": [
        "packages/spec/src/ui/action.zod.ts",
        "packages/spec/src/ui/inline-action.test.ts",
        "packages/spec/src/ui/action-description.test.ts",
        "packages/spec/src/ui/inline-action-type.test.ts",
        "packages/lint/src/validate-action-copy-templates.ts",
        "packages/lint/src/validate-action-copy-templates.test.ts",
        "packages/spec/authorable-surface/ui.json",
        "content/docs/references/ui/action.mdx",
        "content/docs/references/ui/component.mdx",
        ".changeset/29248-inline-action-description.md"
      ],
      "line_budget": "234 changed lines (+204 / -30) across 10 files, 4 commits; no skills/** file touched; under the 3000-line class (c) bar",
      "deviations": [
        "File surface widened mid-round: packages/lint/src/validate-action-copy-templates.ts + .test.ts (seat accepted, claim 6576402352 edited in place); own commit 54663666.",
        "In-place docblock correction beside the pick: the bodyExtra paragraph's 'forward list does not yet include bodyExtra' was measured false on main 27c1c555; comment only, named in the PR body.",
        "Forced test edits named in the PR body: INLINE_FIELDS + the ActionSchema round-trip body in inline-action.test.ts; action-description.test.ts inline-refusal pin flipped to acceptance and moved to its own describe.",
        "Full spec/lint/ui suites read at 89985489; final head 7b596699 differs by one test-file describe move, so only the 3 touched spec files, spec typecheck and the 103 gates were re-run there.",
        "Full ui app-shell/components suites not run locally (8 named consumer files only); left to CI Test UI.",
        "PR assignee and reviewer not set: os-dev forbids PR assignees and the standing order forbids MCP writes, which outrank the session's own best-effort assign/review step."
      ],
      "mcp_calls": "4 — mcp__github__issue_read get (1), get_comments (2), mcp__github__pull_request_read get (1); all reads, no write tool",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches, run 41451750794, PR #29369, 11282 bytes sent = stored); this os-dev-report comment via post-stamped (relay). git push is not a REST write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: none (observation) · reach: n/a · the console param dialog also draws submitText and cancelText (ui/packages/app-shell/src/hooks/useConsoleActionRuntime.tsx); InlineActionSchema picks neither and element:button forwards neither, so nothing is declared-not-read · carrier: none — noted in PR Acceptance notes",
        "class: none (polish) · reach: n/a · the inline refusal of `body` prints 'Did you mean `body` → `mode`?' because strictObjectError's candidates come from ActionSchema's full shape; `mode` is refused inline too (loud, second refusal) · carrier: none — noted in PR Acceptance notes"
      ]
    }

    Stamped 2026-11-02T13:19Z.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-steve · session_01ADHkmSduNGC2SZXszyrNut

    Landed: PR #29369, merged as d68d129b at 2026-11-02T14:34Z.
    ACCEPT → PR #29369 comment 6579159879 · contract review PASS 6578506913 (7b596699) + delta PASS 6578630622 (ab80f700).
    Follow-ups: #29249 (the ui half: inline locale-map description in DECLARED_COPY_KEYS) is unblocked; #29383 (should the inline door refuse confirmText beside params).

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions