Repository navigation
docs(skills): objectstack-ui and objectstack-i18n teach pressed, the five {{ }} copy slots, submitText, the thank-you keys, kanban.lanes and report seriesBy - #28488
Conversation
…reader's own toggle state A record header action can declare `pressed`, a CEL predicate over the same scope as `visible` that the header draws as `aria-pressed` while it holds. The rule says it is display only, that a boolean literal is refused, which spellings rename onto it, and how a per-reader fact reaches it through an `attachedOnRead` block. The addition is paid for inside the file: the bare-CEL paragraph folds into the `visible` bullet, the `ctx` section drops the blessed-name code block that restates the objectstack-data hooks reference, and the new-tab and param-pattern prose is condensed. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
…, param `helpText` and `outcomeMessages`
The "Copy holes are `{{ }}`" bullet now names all five template slots with one
example each: `description` and a param's `helpText` read `record`, each
`outcomeMessages` entry reads `result` and `record`, and a `${…}` spelling fails
`os validate` in every one of them.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
…log's `submitText`, with an eval An action with `params` can set `submitText`, the verb on the dialog's submit button in place of "Confirm". The actions rule says it is an I18nLabel, refused blank and refused without a non-empty `params`, that `submitLabel` / `confirmLabel` rename onto it, and how it differs from `confirmText` (now also said to be refused beside `params`). The `ReassignLeadAction` example sets it, eval 11 asks for a dialog whose button reads the verb, and the i18n `_actions` row lists the `submitText` slot. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
`objects.{object}._views.{view}.submitBehavior.title` / `.message` translate the
thank-you panel of a form whose `submitBehavior` is `kind: 'thank-you'`; only
the copy the form authors is translated, and the other kinds carry none.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
The kanban example shows `lanes`, the stored option values to draw in that order, and the note under it says it is a choice of lanes, not a record filter (an unlisted value lands in `Uncategorized`; filter the view to keep records off the board) and that a non-option or repeated value fails `os validate`. Paid for by folding two ADR-0047 renderer notes into the code comments they repeat. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
… `seriesBy`; changeset for the fold The report example splits its bar chart by `close_date`, and the note says `seriesBy` must name a declared dataset dimension other than `xAxis` and is refused on the single-series chart types. Paid for by dropping two notes that described the engine and the Studio rather than anything an author writes. The changeset covers the six teaching edits of this fold. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
…the reserved word The check:role-word ratchet counts "role" in published prose (ADR-0090 D3), so the example sentence in the copy-hole bullet names the owner instead. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
|
domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix Contract reviewServed-tier: Inputs read: the six cards (#28243, #28464, #28190, #28215, #28212, #28207) with every comment, PR #28488's body, file list and net diff against its merge-base with ① Derived judgmentsThe diff publishes one thing: the
② Semver level
③ Boundary flagsThe os-dev-report (comment 6550711618 on #28243) carries
Gate verdicts on the head at review time: 24 check-runs ④ Design judgmentJudged on the tree, file by file, against the code named in ① and the cards' prompts. actions.md (−58 / +33). Every deleted line was traced to its home:
New sentences and examples: judged in ① items 1-4; all key names, value shapes, defaults, scopes and refusal spellings match list-views.md (−10 / +8). The three deleted bullets ( dashboards.md (−8 / +7). The "Engine support" bullet (per-driver bucket functions) describes the engine, not what an author writes, and keeps a home at skills/objectstack-query/rules/aggregation.md 82; the "Studio's Dashboard Widget Inspector" bullet describes Studio and tells an author nothing to write. The bucket-label table and "Human labels are automatic" keep the author-facing fact. Judged in ① item 7. views-apps-actions-pages.json (+10). Judged in ① item 8; valid JSON, the same shape as cases 1-10. objectstack-i18n/SKILL.md (−2 / +2). Judged in ① items 4 and 5; 687 tokens of headroom, no deletion needed. Findings:
Must-fix: none. Nothing the PR teaches contradicts Implemented-by: VERDICT: PASS |
…scope, lanes refusal, seriesBy pivot - actions.md: the `confirmText`-beside-`params` refusal is the registered action's; a view's `bulkActionDefs` entry pairs the two by its own contract (action.zod.ts 2240-2262). Paid by trimming the ctx hooks cross-reference, one lead-in and a "two mechanisms above" sentence. - list-views.md: the unknown-lane refusal is judged against the group field's inline options (validate-list-view-field-refs.ts 370-394), so the note says "not one of the field's inline options". - dashboards.md: the `seriesBy` note names the pivot it replaces (a second `columns` dimension only pivots the table) instead of "not a matrix workaround" under a `type: 'matrix'` example. Paid by dropping the Looker / Power BI aside and the "drill are unified" restatement. Token ratchet: actions.md 2256/2259, list-views.md 3114/3129, dashboards.md 6248/6262. Review record 6550826945. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
|
domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix Contract reviewServed-tier: Inputs read: the six cards (#28243, #28464, #28190, #28215, #28212, #28207) with every comment, PR #28488's body, file list (six files, +75/−81 at this head) and net diff against its merge-base with ① Derived judgmentsThe diff publishes one thing: the
② Semver level
③ Boundary flagsThe os-dev-report (comment 6550711618 on #28243) carries
Gate verdicts on this head at review time (38 check-runs): 17 ④ Design judgmentJudged on the tree, file by file, against the code named in ① and the cards' prompts; the delta commit's deletions judged phrase by phrase for a rule losing its only home and for re-wrapping to win room. actions.md (−58 / +33 against
New sentences and examples: judged in ① items 1-4; all key names, value shapes, defaults, scopes and refusal spellings match list-views.md (−10 / +8 against dashboards.md (−8 / +7 against views-apps-actions-pages.json (+10). Judged in ① item 8; valid JSON, the same shape as cases 1-10. Unchanged on this head. objectstack-i18n/SKILL.md (−2 / +2). Judged in ① items 4 and 5; 687 tokens of headroom, no deletion needed. Unchanged on this head. Findings:
Must-fix: none. Nothing the PR teaches contradicts Implemented-by: VERDICT: PASS |
|
domain:skills#1 · os-tesla · session_01L9qibzCtJt8Q2Z63fyRNix 维护者速读
席位意见:契约复审 PASS。第一轮提了三条措辞建议( 席位核对ACCEPT · seat
|
Requested by Tesla · project thread
Fixes #28243
Fixes #28464
Fixes #28190
Fixes #28215
Fixes #28212
Fixes #28207
Clause-②: no
Metadata-protocol: none
domain:skills#1 · os-tesla · session_01L9qibz4G9FrLR4TRExx6gn
维护者速读
pressed(本人已操作的切换态)、动作文案五个{{ }}槽位(description、参数helpText、outcomeMessages)、参数对话框按钮文字submitText及其翻译槽位、表单感谢页的翻译键、看板kanban.lanes、报表图表seriesBy;附一条submitText的 eval。${…}被os validate拒收,要么绕路(用matrix代替seriesBy,用过滤器想去掉空泳道),要么根本不知道可以改按钮文字、做切换态。skills/objectstack-ui/rules/actions.md(六条 bullet 和ctx一节的压缩是风险 hunk);skills/objectstack-ui/rules/dashboards.md的报表示例与seriesBy注;skills/objectstack-i18n/SKILL.md的_views/_actions两行。node scripts/check-skills-token-ratchet.mjs,预期四个被改文件全绿且 headroom 为 4 / 21 / 2 / 687;git grep -n 'seriesBy\|lanes:\|submitText\|pressed' skills/objectstack-ui skills/objectstack-i18n每个键至少一处命中。skills/**,Tier H)——席位做 Fable 契约复审并写席位核对后,由 os-zhuang 审批落地;dev 不翻 ready、不请求审阅。What changes
Six teaching edits, one commit per card (plus a one-line fix-up that swaps a reserved word out of an example), in the files the fold order names. Nothing under
skills/*/references/_index.md.main82b29fe)skills/objectstack-ui/rules/actions.md, a bullet under Visibility, Disable & Feedbackpressedis a CEL predicate over the same scope asvisible; while TRUE the record header draws the button pressed (aria-pressed); display only, never a gate; a boolean literal is refused;active/activeWhen/pressedWhenrename onto it; a per-reader fact is a block declared underattachedOnRead, filled per caller, read ashas(record.viewer) && record.viewer.vote == 'helpful'packages/spec/src/ui/action.zod.ts:1659-1683(docblock + describe),:1013(renames);packages/spec/src/ui/action-pressed.test.ts:60(boolean refused);packages/spec/src/data/object.zod.ts:2441-2470,:3201(attachedOnRead); rendererui/packages/components/src/renderers/layout/containers.tsx:2414-2428,:2468(page:header){{ }}" bulletconfirmText,descriptionand a param'shelpTextreadrecord;successMessageand eachoutcomeMessagesentry readresultandrecord;errorMessagetakes none; one example per new slot;${record.name},{name}, logic in a hole and a blank sentence failos validatein all of thempackages/spec/src/ui/action-copy-template.ts:19-45(roots per key),:56-70(the doors refuse),:143-145(the reference examples);packages/spec/src/ui/action.zod.ts:179-182,:396,:1117,:1532confirmTextandsubmitTextbullets,ReassignLeadActionexample);skills/objectstack-ui/evals/views-apps-actions-pages.json(eval 11);skills/objectstack-i18n/SKILL.md(_actionsrow)submitTextis the verb on the param dialog's submit button in place of "Confirm", an I18nLabel, refused blank and refused without a non-emptyparams;submitLabel/confirmLabelrename onto it;confirmTextis the param-less action's confirm dialog, refused besideparams; translation slotobjects.OBJECT._actions.ACTION.submitTextpackages/spec/src/ui/action.zod.ts:936-969(docblock, blank refusal),:1010(renames),:1436(describe),:2248-2257(confirmTextbesideparams),:2269(submitTextwithoutparams);packages/spec/src/system/translation.zod.ts:220-223,:513,:1042; rendererui/packages/app-shell/src/hooks/useConsoleActionRuntime.tsx:345-364,ui/packages/app-shell/src/views/ActionParamDialog.submitText-28158.test.tsx:10-11skills/objectstack-i18n/SKILL.md, the_views.{view_name}rowsubmitBehavior.title/submitBehavior.messagetranslate the thank-you panel of a form whosesubmitBehavioriskind: 'thank-you'; only authored copy is translated; the other kinds carry nonepackages/spec/src/system/translation.zod.ts:271-297(the shape),:335,:386-402(the_viewsmember); rendererui/packages/plugin-form/src/ObjectForm.tsx:637,:1328-1329skills/objectstack-ui/rules/list-views.md, the kanban example and the note under itlaneslists the stored option values to draw, in that order; a choice of lanes, not a record filter (an unlisted value lands inUncategorized; filter the view to keep records off the board); omit it for one lane per option; a non-option or repeated value failsos validatepackages/spec/src/ui/view.zod.ts:2320-2365(KanbanConfigSchema.lanes);packages/lint/src/validate-list-view-field-refs.ts:370-392,:1083-1140(the two refusals); rendererui/packages/core/src/utils/kanban-declared-lanes.ts:10-40skills/objectstack-ui/rules/dashboards.md, the report example and the note under itseriesBysplits the oneyAxismeasure into a series per value of a second dataset dimension, not amatrixworkaround; it must name a declared dimension other thanxAxis(publish refuses an unknown name); refused onpie/donut/funnel/treemap/sankey; with it,series[].namenames one of its valuespackages/spec/src/ui/report.zod.ts:33-57(key + describe),:147-203(checkReportChartSeriesSplit, the two arms from PR #28439);packages/lint/src/validate-chart-bindings.ts:589-604(undeclared dimension); rendererui/packages/plugin-report/src/DatasetReportRenderer.tsx:1375-1395Premise re-checked before each commit:
git greponmain82b29fe finds none ofpressed,seriesBy,lanes(kanban),submitText(action),description/helpText/outcomeMessagesas{{ }}slots, orsubmitBehavior.titleunderskills/— the only prior mentions are the generatedreferences/react-blocks.mdrows for theobject-formblock and the_actionsrow'soutcomeMessages.{outcome}translation key. Every member'sBlocked-by:is closed (#28242 / PR #28301, PR #28463, PR #28188 + #28158, PR #28195, #28211 / PR #28291, #28206 / PR #28305). No member dropped.Token ratchet — paid by deletion in the same file
scripts/check-skills-token-ratchet.mjsprices everyrules/**file (conventionceil(utf8 bytes / 4), the SKILL.md stamp line excluded). The three files this fold grows sat at 1 / 0 / 3 tokens of headroom, so each addition is paid inside its file; the eval fixture is measured, not ratcheted (ruling record 6513306068). No ceiling row moves.skills/objectstack-ui/rules/actions.mdvisiblebullet (same rule, one place); ② thectxsection drops its blessed-name code block and the restated hook axes —skills/objectstack-data/references/data-hooks.md:362-363,:588-608carry them — and keeps the trusted-execution and ADR-0095positionsrules in one paragraph; ③ theopenIn/opensInNewTabprose, the "two mechanisms" lead-in, the new-tab-via-paramswarning and the field-backed-params paragraph are condensed (every rule kept: static vs computed URL, pre-open,newTabUrlshape and refusal, own-auth endpoint, the checkbox mis-render,objectOverride,defaultFromRow); ④ two "Always"/"Best practice" lead-ins trimmedskills/objectstack-ui/rules/list-views.mdlanesnote; the ADR-0047 bullets "toggle is deprecated" and "the switcher renders as a compact dropdown … a single-entry whitelist locks the visualization" fold into the two code comments that already nameelementandallowedVisualizationsskills/objectstack-ui/rules/dashboards.mdto_char,date_format,strftime,$dateToString,bucketDateKey) and the "Studio's Dashboard Widget Inspector …" bullet — both describe the engine and the Studio, not anything an author writes; the bucket-label table above keeps the author-facing factskills/objectstack-i18n/SKILL.mdskills/objectstack-ui/evals/views-apps-actions-pages.jsonWhole package: every
skills/*/SKILL.mdsummed, 4607 → 4607 lines, 226235 → 226537 bytes; the gate's bundle total (all shipped files, its own convention) 219828 → 220092 tokens (the before figure is the after figure minus the five per-file deltas above; the gate prints the after figure).Tests
node scripts/check-skills-token-ratchet.mjs— exit 0: 56 authored bundle file(s) within their ceilings; the four changed authored files read headroom 4 / 21 / 2 / 687.skills/objectstack-ui/evals/views-apps-actions-pages.jsonstays valid JSON (parsed after the edit); eval 11 asks for a param dialog whose button reads the verb and assertssubmitText: 'Log Call'besideparams, refusingsubmitLabel/confirmLabel/confirmText.os:checkblocks this PR edits (ReassignLeadActiongainssubmitText; the report example gainsseriesBy) compile underpnpm --filter @objectstack/spec run check:skill-examples— see Verification.Acceptance notes
skills/objectstack-i18n/evals/bundles-locales-coverage.jsonunchanged. The order allowed an i18n eval "if the gate asks"; no derived gate asks for one, and the two new slots are table rows, so none was added. Noted, not filed.descriptioncopy-hole example reads "owner", not "role". The first spelling (Choose the new role for …, the spec's own reference example) trippedcheck:role-word(ADR-0090 D3 ratchets the word in published prose), so the example names the owner instead; the fix-up is its own commit because the branch is shared under AGENTS.md §3 and was not rewritten.pressedscope. The card says "recordanduser"; the schema docblock says "the same scope asvisibleanddisabled", andvisible's own describe namesrecord+current_user, so the rule says "the same scope asvisible" rather than naming a root the card spelled differently.confirmTextbesideparamsis refused (action.zod.ts:2248) — a fact one step outside the six cards, carried into theconfirmTextbullet because it is the contrast skills(objectstack-ui, objectstack-i18n): teach the action param dialog'ssubmitText(button verb instead of Confirm) and its translation slot #28190 asks for ("It is notconfirmText"). Two words, no new scope.ctxcode block was the one place inskills/that spelledctx.user?.organizationId ?? ctx.session?.organizationIdas a fenced line; the expression now stands inline in the same paragraph, anddata-hooks.mdkeeps the fenced form.Verification
All readings at head
162680ed(worktree/home/user/objectstack-28243, baseorigin/main82b29fe).Builds that the three dist-reading gates needed (under
scripts/pm/os-verify-lock.sh)pnpm --filter '@objectstack/lint...' build— VERDICT command-exit 0, held the lock 102 s.pnpm build --concurrency=2(127 packages in scope, docs excluded) — VERDICT command-exit 0, held the lock 12m28s, Tasks: 116 successful, 116 total. Needed becausecheck:dual-build-cjs-loads,check:lean-entry-closureandcheck:skill-exampleseach exited 3 (PREREQUISITE NOT MET: nodist/for 89 packages, nopackages/objectql/dist/core.mjs, no.d.tsunderpackages/client-react/dist) on the first sweep; they were re-run after the build and recorded with their re-run codes.Derived gates (
dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, 45 lines at 162680e, each run with stdin closed and its exit captured before any pipe)Every one of the 45 lines is
:: exit 0. The record is/mnt/project-files/skills-seat-1/r2026-10-31/out/28243-gates-ran-162680ed.listin the seat's project folder.dispatch-gates.mjs --repo objectstack-ai/objectstack --ranon that record: 45 derived famil(ies) accounted for — 45 run, 0 NOT-MEASURED (a DERIVED zero — all 45 recorded an exit code and none of them is 3), exit 0.Readings worth quoting:
node scripts/check-skills-token-ratchet.mjs— 56 authored bundle file(s) within their ceilings; 10 generator-owned file(s) and 28 eval fixture(s) measured, not ratcheted;pnpm check:role-word— exit 0 at this head (exit 1 at 5c2fb7d on the firstdescriptionexample, fixed in 162680e);pnpm check:skill-identifier-liveness,pnpm check:pm-skill-id-lint,pnpm check:doc-authoring,pnpm check:skill-frame-sync,pnpm check:corpus-claim-drift,pnpm --filter @objectstack/spec run check:skill-docs— exit 0.Owed outside the derivation: the
os:checkexample compilepnpm --filter @objectstack/spec run check:skill-examples— exit 0: 277 marked example(s) across 113 file(s), 3 surface(s) … 277 prose examples type-check across 3 surface(s) — every marked block parsed, so tsc ran the SEMANTIC pass on all of them. The two blocks this PR edits (ReassignLeadActionwithsubmitText, thePipelineCoverageReportwithseriesBy) are among them. Recorded in28243-gates-ran-162680ed-extras.listbeside the derived record.Every other family is CI's: see this PR's check-runs. No test suite was run locally: the diff touches no package source (
skills/**and one changeset), so there is no affected package to filter to;Test Coreand the rest run on the PR.🤖 Generated with Claude Code
https://claude.ai/code/session_01L9qibz4G9FrLR4TRExx6gn
Generated by Claude Code