Repository navigation
docs(skills): type-check more objectstack-ui examples with os:check - #31706
Conversation
Ten more self-contained blocks in the objectstack-ui rules files carry the os:check marker: the new-tab action and html page gain their imports, and the pricing card, doc nav item, four dashboard widgets and the kanban and gantt views are typed against @objectstack/spec/ui. Each file pays the marks inside its own token ceiling by trimming restatements whose rule survives elsewhere in the same file. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jUzyjnwuhUWHpExHXT
|
domain:skills#3 · zhuangjianguo · session_01QsR2jULfPnqQFGcZUtKDFH Contract-review-claim: session_01QsR2jULfPnqQFGcZUtKDFH · head 0de24c0 · 2026-11-08T22:11Z The lane seat's isolated Fable reviewer runs the |
|
domain:skills#3 · zhuangjianguo · session_01QsR2jULfPnqQFGcZUtKDFH Contract reviewServed-tier: Inputs read: card #31112 (body + all 10 comments, incl. claim 6727530009 and dev report 6727833568), PR #31706 (body, 5-file list, ① Derived judgments
② Semver level
Clause-②: no — confirmed against the tree: no narrowing of any published spec, no capability removed at a consumer. ③ Boundary flagsDev flags (report 6727833568
④ Design judgmentMethod: each new mark's block read against the rule text around it and against the schema in the live tree (
Design-break attempts that did not break it: (i) wrappers hiding a wrong lesson — none; every wrapper is one import + a typed No must-fix, no should-fix. One nit; nits alone end the round. Implemented-by: VERDICT: PASS |
|
domain:skills#3 · zhuangjianguo · session_01QsR2jULfPnqQFGcZUtKDFH 维护者速读
席位核对Head-sha:
|
Requested by Steedos · project thread
Refs #31112 (slice 3 of a per-skill split: item 4, objectstack-ui; the card stays open)
Clause-②: no
Metadata-protocol: none
维护者速读
skills/objectstack-ui/rules/dashboards.md(4 段新接入、删减最多)、skills/objectstack-ui/rules/list-views.md(看板与甘特示例改为带类型的ListView)、skills/objectstack-ui/rules/pages.md(3 段新接入)。pnpm --filter @objectstack/spec check:skill-examples,预期最后一行为 332 段示例全部通过类型检查。What changes
skills/objectstack-uihad 15 of its 33 fencedts/typescriptblocks undercheck:skill-examples(measured onmain8210894, all*.mdoutsideevals/;references/_index.mdand the generator-ownedreferences/react-blocks.md, which holds no ts block, excluded). It now has 25. Every new mark is the os:check marker on the line above the fence; each wrapper is one import line plus a typedconston the existing first line (and, for the two arrays, one opening and one closing line), never more than three lines.rules/actions.mdrules/dashboards.mdrules/list-views.mdrules/pages.mdSKILL.md,navigation.md,record-page.mdSkills bundle reading: no
SKILL.mdchanged, so the sum of every publishedSKILL.mdstays 4592 lines.rules/actions.md: theopensInNewTab+newTabUrlaction gains itsdefineActionimport and is marked.rules/pages.md: thekind: 'html'page gains itsdefinePageimport; the styled pricing card becomesconst card: PageComponent = { … };and the doc navigation itemconst navigation: NavigationItem[] = [ … ];. The orphan-looking marker above the master/detail block is over atsxfence and was already counted by the gate, not by this ts tally.rules/dashboards.md: the dataset-bound widget becomesconst widget: DashboardWidget; the twofilterBindingswidgets and the twocompareTowidgets becomeconst widgets: DashboardWidget[] = [ … ];(the second pair gains the comma between its two objects); theoptionsline becomesconst options: DashboardWidget['options']. The two barecompareTo:lines stay a fragment and the file says so once.rules/list-views.md: the kanban and gantt examples becomeconst board: ListViewandconst timeline: ListView, so a top-levelgroupByor a missinggantt.startDateFieldnow fails the gate. The bare-key blocks (data,columns,filter,userFilters,sort,grouping) stay fragments and the file says so once.Why
#31112 item 4 (ruling B of #22059): published examples are guarded by the opt-in type check, and every defect the P0 text-fix card found sat in an unmarked block. This slice brings objectstack-ui's self-contained examples under it.
Example fixes
None. Every candidate block was probed in isolation with its wrapper (TS API, syntactic then semantic pass, with a planted unknown key per file as the control leg) and compiled as written.
Trims that paid the marks (each cut and where its rule survives)
rules/actions.md§Action body context: "— the blessed name (same axes andundefinedcases as hooks, objectstack-data)" became "(as in hooks, objectstack-data)". The blessed-name rule survives atskills/objectstack-data/references/data-hooks.md:584("the single blessed name") and the same read at:619.rules/actions.mdnew-tab warning: "builds and draws a checkbox in the dialog" became "draws a checkbox"; the rule (never express new-tab viaparams) is unchanged.rules/pages.mdkind:'html': "; usekind:'react'for those" cut; survives in the tier table'sreactrow (hooks,onClick, expressions).rules/pages.mdstyling block: its comment "every block carries responsiveStyles + tokens" cut; survives in the Rules list above it (stableidon every styled node, values as design tokens).rules/pages.mdrouting: "; that gives one doc many addresses and breaks cross-references" cut; survives as "so a doc has exactly one URL" in the same paragraph.rules/pages.mdlive instances: "(one source, never a stale copy)" cut; survives at "Write business concepts" ("has no producer and drifts; the self-describing metadata is the one source").rules/dashboards.md§compareTo: "The renderer derives the comparison automatically; no secondfilteris required." cut; survives at Requirements ("The shifted query reuses the originalfiltershape and replaces only the date-bound clauses"). ", so what a widget declares is exactly what runs" cut; the same-shape statement it followed stays.rules/dashboards.mdKPI example comments: the metric's "renderer fetches the prior quarter and surfaces a secondary value + delta arrow" survives at Metric widgets ("a delta arrow plus a trend label"); the chart's "(M2). The renderer issues a second query … overlays it as a muted/dashed series" survives at the §compareTo opening and at Cartesian charts (dashed, reduced opacity).rules/dashboards.md: the metric comment "(binds the crm_task_metrics dataset; filter = runtimeFilter)" survives in the block's owndataset:key and at §Dataset-Bound Widgets ("presentation-scopefilterflows into the query as the runtime filter"); "for this widget only" in the options comment survives in thedateGranularitytable row ("for this widget only"); the pie/donut rationale clause cut, the rule ("compareTois silently ignored") stays.rules/list-views.md: "Every view lives underlist/form/listViews/formViews, as above." survives in §ThedefineViewcontainer's first sentence; thelanescomment "option VALUES to draw, in this order" survives in the note under the block ("laneschooses the lanes and their order … not one of the field's inline options"); "— past the right edge of a narrow screen —" survives in hand-over item (a) ("scroll right"); "; declaresearchableFieldsto choose the set" survives in the table row "declaressearchableFields| that list, verbatim"; ": nothing ever drew it", "(the block above)" and "(CRUD, live updates, filtering, pagination)" carried no rule.Tests
check:skill-examples, before and after, and the reverse check
main8210894):✅ 322 prose examples type-check across 3 surface(s).maintouching noskills/**orpackages/specpath):pnpm --filter @objectstack/spec check:skill-examplesexited 0 with✅ 332 prose examples type-check across 3 surface(s) — every marked block parsed, so tsc ran the SEMANTIC pass on all of them(skills + docs surface 288 → 298).newTabTarget(rules/actions.md:165),docNameon the doc nav item (rules/pages.md:365), the retired widgetposition(rules/dashboards.md:52) and a top-level kanbangroupBy(rules/list-views.md:264). The checker exited 1 with TS2353 at exactly those four lines. Restored withgit checkout HEAD -- skills/objectstack-ui;git diff HEADandgit status --porcelainwere empty after.Derived gate sweep (head 3bc338e)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 44 commands. 43 exited 0.pnpm check:dual-build-cjs-loadsexited 3 (PREREQUISITE NOT MET: needs every package's dist; CI runs it).dispatch-gates --ranexited 0: 44 derived, 43 run, 1 NOT-MEASURED, 0 unrun. Re-run on the merged head 0de24c0:check-skills-token-ratchet,check-changeset-no-major --base origin/main,check:skill-links,check-empty-changeset --base origin/main, all exit 0.Acceptance notes
check:skill-examplesis not in the derived gate list for askills/**diff, so it was run by hand.SKILL.md'ssubformsblock is indented three spaces inside a numbered list item, and the gate's fence pattern only reads a fence at column 0, so a marker there would be an orphan; moving it out of the list would break the list and costs bytesSKILL.mddoes not have (headroom 0). Inrules/list-views.md,filter,sortandgroupingwould compile with a three-line wrapper (probed green), but each costs about 100 bytes and the file has 5 tokens left after the kanban and gantt marks;data(a[...]placeholder),columns(two statements) anduserFilters+appearanceare true fragments. Inrules/dashboards.mdthe two barecompareTo:lines are a fragment.dispatch-gates --tiermandates Fable forskills/**, and the claim records the no-Fable-build exit; the contract review is the seat's, on the lane's isolated reviewer.Verification
pnpm --filter @objectstack/spec check:skill-examples(needs@objectstack/specand@objectstack/client-reactbuilt) prints 332 examples green;node scripts/check-skills-token-ratchet.mjsexits 0 with everyskills/objectstack-uifile within its ceiling.Human Minimum
A governed approver reviews and approves (Tier H).
🤖 Generated with Claude Code
Generated by Claude Code