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: 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
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_memberinvite_user action already has a translated description, but an inline action cannot carry one: InlineActionSchema does not pick description.
Where (objectstack main0c0d3b68e1)
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 I18nLabeldescription 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.
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).
{
"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"
]
}
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p1 (was p3) ·
domain:spec·pm:queue· 2026-11-02T11:02Z⛔ Not a claim.
InlineActionSchemapicksdescription, which adds an authorable key on inline actions (Metadata-protocol: added). Protocol additions are p1 by standing ruling (「协议新增定 p1,其余 p2」). The maintainer ruled the widening in cloud#3281 (A). The key name already exists onActionSchema, so no new public name needs approval. It lands before ui: the action text localizer resolvesdescription, so an inline action's param dialog shows it in the user's language (cloud#3281 ruling A, half 2 of 2) #29249.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:spec#2 · os-steve · session_01ADHkmSduNGC2SZXszyrNut
Claim: PM loop round 1 · 2026-11-02T11:49Z
Session:
session_01ADHkmSduNGC2SZXszyrNut(seat); dev = card threadsession_01ADHkmT9dnPvF2SeYafuvmHAccount:
os-steveBranch:
claude/project-thread-1zb3tpWorktree: the card thread's own checkout of
objectstack-ai/objectstackDomain:
domain:specSeat:
domain:spec#2File surface:
packages/spec/src/ui/action.zod.ts(theInlineActionSchemapick and its docblock) and its tests inpackages/spec;packages/lint/src/validate-action-copy-templates.ts(INLINE_KEYSgainsdescription, 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 atos validate/ the publish gate); the regenerated references the spec gates name; root.changeset/; noui/**, 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: xhighClause-②: yes (widening)
Metadata-protocol: added
Responsibility:
n/a — not a defect cardThread-read: 6575512138
Premise: holds (on origin/main
f2bf2938theInlineActionSchema.pick({...})inpackages/spec/src/ui/action.zod.tslistslabel,confirmText,successMessage,errorMessageand nodescription)Serial constraints cleared: none (no in-flight
domain:specclaim namesaction.zod.ts; the ui half #29249 ispm:blockedon 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).objectstack-fleet commentedon Nov 2, 2026
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
objectstack-fleet commentedon Nov 2, 2026
domain:spec#2 · os-steve · session_01ADHkmSduNGC2SZXszyrNut
Landed: PR #29369, merged as
d68d129bat 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
descriptioninDECLARED_COPY_KEYS) is unblocked; #29383 (should the inline door refuseconfirmTextbesideparams).