Repository navigation
Skills optimization flight — skills/objectui: RESTRUCTURE (≈ −21,600 tok of 64,022, −34%) — ~19% of the package is addressed at a contributor to this repo (console-development.md, no-touch-zones.md, half of architecture.md), one rule stated up to four times, 11 vestigial guide frontmatters, and three evals that fail correct answers #7251
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationand removed
on Sep 2, 2026 Claim: PM loop round 4
Session:session_01LraLgQVGq8egUwfYZpbYt1
Branch:claude/issue-7251-skills-objectui-optimization
Worktree:objectui-issue-7251
Domain:domain:skills
File surface:skills/objectui/**(published; governed by ruling 批 #7, ui#6866) + a NEW repo-internal skill directory under.claude/skills/for the contributor-only content moved out of the customer bundle (user-invocable: false; also governed) +packages/plugin-gantt/README.md(the gantt kitchen-sink's new home) +scripts/skills-path-baseline.jsononly ifcheck:skills-pathsdemands; ⛔ no objectstack file (a missing or weaker anchor there is a "follow-up for" line in the PR body); ⛔ no other objectui surface
Container & model: L (29 files, 64,022 tokens; moves across three destinations; three eval corrections; two funded additions),mode:subagent,model: opus— objectui has nodispatch-gates.mjs --tiermandate forskills/**; the content limb applies, compensated by the seat's in-seat review atCONTRACT_REVIEW_TIER
Clause-②: yes — OUI-G-02 (getGanttConfigreadsschema.gantt/ flatschema.*, neverschema.props) and OUI-G-03 (${...}ontitle/label/value/descriptionIS evaluated on declaring types viaEXPRESSION_BINDABLE_TEXT_KEYS_BY_COMPONENT) are renderer-contract claims ⇒needs:contract-reviewon both carriers at PR creation; in-seat review before any human review request
Serial constraints cleared: no open objectui PR touchesskills/objectui/**or.claude/skills/**; cross-package pointers go to objectstack-ui (C-01; its entry file is held by objectstack#14568 but the anchor sections exist onmain), objectstack-data (C-02:rules/field-types.md/ the*Whenpredicate rows), objectstack-formula (C-03:## Surfaces that take an Expression, onmainand on the delivered #14563 branch); heavy slots: objectstack#14315 i18n + #14316 formula (patch round) + this = 3 ⇒ the cap
Decision inputs: objectstack#14296 ruled1A 2A 3A 4A(item 2's stub rule does not apply here — objectui's evals are real fixtures and three of them are corrected, not deleted); objectstack#14568 (split condition) does not bind this repo — objectui has no token ratchet, the discipline is the value gate with per-file deltas reported.Landing form: the closing PR opens with
Fixes #7251(the DEFER rows are follow-up cards / notes, not a second round on this card); earlier split PRs, if any,Part of #7251. Governed ⇒ draft; ⛔ never mark ready; objectui has noskip-changesetlabel — an empty-frontmatter changeset only if the repo's rule asks, ⛔ never request a label.
Generated by Claude Code
Dev claim (os-dev seat)
Session:
session_01LraLgQVGq8egUwfYZpbYt1
Branch:claude/issue-7251-skills-objectui-optimization(pushed empty at base4704aa4— write-route probe green)
Worktree:/home/user/objectui-issue-7251File surface I will touch (claim-declared, the serialization list for parallel agents):
skills/objectui/**(published, governed — ruling 批 构建一个 **Live Playground (实时演练场)** (用于展示引擎能力) #7, ui#6866)- ONE new repo-internal skill directory under
.claude/skills/for the contributor-only content moved out of the customer bundle (user-invocable: false; also governed) packages/plugin-gantt/README.md(new home for the gantt kitchen-sink)scripts/skills-path-baseline.jsonONLY ifcheck:skills-pathsdemands it per its own header- no objectstack file; no other objectui surface
Assignee is the PM's field — not touched.
Premise check at my base
4704aa4(audit ref was67dadd6):git diff --stat 67dadd6 origin/main -- skills/objectui .claude/skillsis empty ⇒ the audited surface is byte-identical at my base, so everyskills/objectui/**span in the audit record cites correctly here.packages/**citations are re-verified individually at4704aa4.Next comment carries the full audit record verbatim (the finding-by-finding spec).
Generated by Claude Code
audit-record — skills/objectui (read-only audit at 67dadd6)
Verbatim contents of the seat's
audit/objectui/findings.md. The GitHub body sanitizer eats
angle-bracket-shaped fragments, so the three that appear in the source are transliterated.Transliteration key (source spelling on the left, as it appears below on the right):
source written below as an HTML comment containing os:check, placed on the line above a fenceOSCHECK-MARKERpackages/+ an angle-bracketedname+/README.mdpackages/PKGNAME/README.mdNothing else is altered. Path/line citations are at
67dadd6; the dev seat verified
git diff --stat 67dadd6 origin/main -- skills/objectui .claude/skillsis empty, so every
skills/objectui/**span cites identically at the branch base4704aa4.
Audit findings —
skills/objectui/(objectui @origin/main=67dadd6)Read-only audit. Every span cited at the pinned ref. Token unit =
ceil(utf8 bytes / 4).Package measurement
Files 29 (1 SKILL.md, 1 README.md, 12 guides, 4 rules, 11 evals) Bytes 256,089 Tokens 64,022 (guides 45,065 · rules 8,602 · SKILL.md 2,272 · README.md 1,113 · evals 6,079) Largest file guides/console-development.md— 30,397 B / 7,600 tok (11.9 % of package)TypeScript fences 123, of which 0 carry a type-check marker JSON/JSONC fences 63 Registered component types in packages/**230 ( ComponentRegistry.register('…'))Types named anywhere in skill text 98 / 230 (loose substring match — real coverage is lower) What is enforced in objectui, and what is not
Gate Scope Covers skills/**?scripts/check-skills-paths.mjs+scripts/skills-path-baseline.json(pnpm check:skills-paths, CI.github/workflows/skills-paths.yml:70)in-repo paths stated in backtick code spans in prose (not fences) exist on disk YES — the only skills gate. Green: 92/93 stated path(s) resolve across 18 guide file(s); 1 baselinedscripts/check-doc-links.mjsSCAN_ROOTS(:583-614) —content/docs,examples,docs, package/app trees, root markdownNO — there is no skillsrowscripts/check-doc-component-types.mjsDOCS_ROOT = 'content/docs'; header states it verbatim: "This gate walkscontent/docsand nothing else: notskills/**" (:211-213)NO scripts/check-doc-snippet-types.mjsDOCS_ROOT = 'content/docs'+PACKAGES_DIRREADMEs (:301-302)NO scripts/check-doc-fence-languages.mjscontent/docs+packages/PKGNAME/README.md(:144-145)NO Token ratchet (objectstack scripts/check-skills-token-ratchet.mjs)— DOES NOT EXIST in objectui. package.jsonhas 60+check:*scripts; none is a skills size/token gate.skills/objectui/has no ceiling and can grow without paying.Example type-check (objectstack packages/spec/scripts/check-skill-examples.ts, markerOSCHECK-MARKERon the line above the fence)— DOES NOT EXIST in objectui. grep -rc "os:check" skills/objectui/→ zero markers; all 123 TypeScript fences are unchecked by anything.Net: objectui enforces path existence only. Size, prose-vs-implementation drift, fence compilability and cross-package overlap are all unenforced.
Structure check on
@object-ui/*references (as instructed). Everyimport { … } from '@object-ui/*'in a TypeScript fence resolves to a real package and a real export at67dadd6— verified forapp-shell,auth,components(viaexport * from './ui'/'./custom',packages/components/src/index.ts:74-75),core,fields,i18n,mobile,permissions,providers,react,types,layout.@object-ui/mobile(the 2026-08-31 sweep's site) does exist:packages/mobile/package.json,private=no. The remaining guides' package/export references are clean — the residue is elsewhere (OUI-F-02, OUI-H-01).
Findings
A — Trigger precision
id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-A-01 A SKILL.md:3vs/home/user/objectstack/skills/README.md:114objectui routes outward ("Do NOT use for server-side ObjectStack concerns … those belong to the objectstack-*skills") but nothing routes inward. objectstack's catalog names objectui once, outside the Index and outside "Cross-skill routing":- [\../objectui`](…) — Studio UI (separate repo).` A customer agent on the objectstack bundle authoring a Studio app UI has no route to this package for its core task.ADDone "Cross-skill routing" row in objectstackskills/README.mdnaming@object-ui/*renderer work — paid by OUI-C-01 in that repo+40 / −1,200 ① yes — decides which package loads ② no ③ construct HIGH yes OUI-A-02 A SKILL.md:1-5vs/home/user/objectstack/skills/*/SKILL.mdfrontmattersEvery objectstack sibling carries license,compatibility: Requires @objectstack/spec 17.x (Zod v4 schemas)andmetadata.{author,version,domain,tags};skills/README.md:71-78documents these as the shared contract. objectui carriesname,description,user-invocable: false— no version pin, though Core Principle 1 (SKILL.md:41-43) makes@objectstack/specbinding andpackages/types/package.json:95pins^17.0.0.ADDcompatibility+metadata; paid by OUI-D-01+60 ① yes — names the spec major being authored against ② no ③ construct HIGH yes OUI-A-03 A guides/*.md:1-4(11 of 12)11 guides carry standalone-skill frontmatter ( name: objectui-app-composition,description: … Use this skill whenever …);architecture.mdcarries none. OnlySKILL.md's frontmatter is read at load; these 11 are a second, competing router no runtime consults, whose triggers contradictSKILL.md's Quick Reference phrasing (e.g.page-builder.md:3claims the "migrate handwritten React pages" surface thatSKILL.md:113compresses to "Page building & schema design"). Measured 6,372 B / 1,593 tok.DELETEall 11 blocks−1,593 ① no ② yes ③ n/a HIGH yes OUI-A-04 A guides/page-builder.md:250"see the objectui-schema-expressionsskill" — no such skill exists; it isguides/schema-expressions.mdin this package. Residue of the pre-consolidation era (README.md:5).check-skills-paths.mjscannot see it (not a path).REWRITE-AS-CONSTRUCT→[\guides/schema-expressions.md`](./schema-expressions.md)`±0 ① yes — the pointer currently dead-ends ② no ③ n/a HIGH no B — Structure / progressive disclosure (central: 12 guides at full weight)
id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-B-01 B guides/console-development.md:1-510The largest file (7,600 tok, 11.9 %) is addressed at a maintainer of THIS repo. Its opening: "Use this skill when working on the Console application ( apps/console/)" (:8).README.md:13says the install target is the customer's.claude/skills/objectui/; a customer has noapps/console/, nopackages/app-shell/src/views/metadata-admin/registry.ts(:139), and never had the "Retired names" symbols (:117-134).:10-47is 622 tok of git archaeology over five SHAs correcting an earlier revision of the same note.:44-47states third parties forkexamples/console-starter(~100 LOC) instead.MOVE-TOrepo-internal (.claude/skills/, beside the other internal skills)−7,600 ① no ② yes ③ n/a HIGH yes OUI-B-02 B rules/no-touch-zones.md:1-136+SKILL.md:89-93Whole rules file forbids editing packages/components/src/ui/**/*.tsxbecausescripts/shadcn-sync.js(:708-716) overwrites them. A customer install has neither path. The four-step wrapper workflow (:623-671) instructs the reader to edit this repo's source.SKILL.md:89-93restates it as Core Principle 8. Exposes the gate's blind spot:check-skills-paths.mjspasses these paths because it checks existence in this repo — the wrong question for a published package.MOVE-TOrepo-internal +DELETESKILL.md:89-93−937 −93 = −1,030 ① no ② yes ③ n/a HIGH yes OUI-B-03 B guides/architecture.md:14-90,:171-189"Monorepo Topology" (1,140 tok) decides which package in this monorepo new code belongs in — "Pick a package by role + dependency weight" ( :16), "❌ Do NOT create a package for every component" (:75). "AI Workflow Instructions" (:171-189, 234 tok): "On 'Create New Component' … 1. Type Definition: Update@object-ui/types" — a customer cannot. Customer-facing half is:84-89+:91-126(238 tok).REWRITE-AS-CONSTRUCT: keep:84-89,:91-126; delete topology tables + AI-workflow. Plugin/platform inventory already exists atguides/project-setup.md:58-100−1,374 ① no ② yes ③ construct survives HIGH yes OUI-B-04 B guides/project-setup.md:252-339,:426-454"Monorepo structure" ( pnpm-workspace.yamlwithpackages/*, Turbo build order,pnpm --filter,./scripts/setup.sh) + the 20-line vitest-invocation guard (:306-328) = 778 tok of contributor content;:319-325is a Chinese console message quoted verbatim. Deployment (:437-444) documentsapps/console/vercel.json— this repo's own deploy.DELETE:252-339,:437-444−838 ① no ② yes ③ n/a HIGH yes OUI-B-05 B guides/testing.md:10-61Pins this repo's CI: vitest.config.mtscoverage thresholds (:29-30), the three inlinetest.projectsand theheavyDomTestslist (:34-46),vitest.setup.dom.tsx(:48-60). Reusable half starts at:62.DELETE:10-61−551 ① no ② yes ③ n/a HIGH yes OUI-B-06 B SKILL.md:15-33,:37-39,:49-55vs:105-129Order buries the router. The only decision-changing construct — the guide table ( :105-129, 441 tok) — sits behind 90 lines: "Strategic Positioning" marketing (:15-19, "The only library combining Low-Code speed with Shadcn/Tailwind design quality"), an in-scope list namingpackages/andapps/console(:22-25), Core Principle 0 "English-Only Codebase" (:37-39, a contributor style rule the package itself violates — OUI-G-01), Core Principle 3 "Documentation Driven Development … you MUST update …content/docs/guide/*.md" (:49-55, instructs editing this repo's docs tree).REWRITE-AS-CONSTRUCT: promote:105-129;DELETE:15-19,:37-39,:49-55−259 + reorder ① yes — routing is the first decision each session ② partly ③ construct HIGH yes OUI-B-07 B guides/page-builder.md:6-39,:502-530317 tok of framing preamble before the first authoring instruction at :42. Tail duplicatesSKILL.md::502-522restatesSKILL.md:131-151nearly clause-for-clause (292 tok);:524-530"Example prompts this skill should handle well" (134 tok) is eval material, andevals/page-builder.jsonexists.DELETE:10-39,:502-530−647 ① no ② yes ③ n/a HIGH no OUI-B-08 B README.md:45-97"Eval format" ( :45-69) + "Maintenance" (:87-97) teach the maintainer how to author eval JSONs and where to add a guide. 602 tok, shipped every customer session.DELETE:45-97−602 ① no ② yes ③ n/a MED yes OUI-B-09 B evals/(11) vsguides/(12)README.md:93-94states the package's own invariant: "New domain area → add a guide … and an eval JSON underevals/with the same basename."guides/architecture.mdhas no eval. Norules/*has one.ADD evals/architecture.jsonorDELETEthe invariant sentence (cheaper; consistent with OUI-B-03)−20 ① no ② yes ③ n/a HIGH no OUI-B-10 B package-wide No dead links, no orphans. All 16 guides/*+rules/*linked fromSKILL.md; all 30 relative links resolve (checked programmatically); router lists all 12 guides. Clean result.— 0 — HIGH no C — Cross-package redundancy
id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-C-01 C guides/app-composition.md:13-110vs/home/user/objectstack/skills/objectstack-ui/SKILL.md:857-893, 634-648Verbatim duplicate of the anchor. objectui :104-107: "Prefer the object's default view over a pinnedviewName; prefer URLfilters… over authoring a view for one-off slices; prefer a named view over a page; use a page only for composition a single object view cannot express. Every target appears exactly once." objectstack-ui:889-893: "One-sentence rule: prefer the object's default view over a pinnedviewName; prefer URLfiltersover authoring a view for one-off slices; prefer a named view over a page; use a page only for composition a single object view cannot express. Every target appears exactly once." The nine-member nav-item table (objectui:39-52) is objectstack-ui:636-648; thefilters-slice rule (objectui:68-75) is objectstack-ui:870-878; objectstack-ui:858credits "objectui ADR-0055" as source. A customer authoring*.app.tsloads objectstack-ui. objectui uniquely owns only column 2 of:39-52— the runtime URL each nav type resolves to (resolveHref,packages/layout/src/NavigationRenderer.tsx).MERGE-INTO objectstack-ui(anchor survives there — it is where the*.app.tsauthor sits); objectui keeps a ~15-line nav-type→URL route table−1,564 +250 = −1,314 ① no ② yes ③ route table survives HIGH yes OUI-C-02 C guides/schema-expressions.md:258-302vsobjectstack-data/SKILL.md:250-296,objectstack-formula/SKILL.md:256-257, 417-421visibleWhen/readonlyWhen/requiredWhenare fully taught in two objectstack packages, including the protocol-17conditionalRequiredremoval that objectui restates at:289-293. Worse than redundant — divergent: objectui teaches the bare string (requiredWhen: "record.status in ['sent','paid']",:271); objectstack-data teaches the canonical tagged template (requiredWhen: P\record.status == 'paid'`,:269`). A customer loading both gets two spellings for one key.MERGE-INTO objectstack-data; objectui keeps 3 lines on the renderer-side fact only (reactive re-evaluation viaresolveFieldRuleState,@object-ui/core)−686 +80 = −606 ① no ② yes ③ pointer HIGH yes OUI-C-03 C guides/schema-expressions.md:304-4011,339 tok on the CEL list-view tier — conditional formatting, row-action visible/disabled,SelectOption.visibleWhen,field.dependsOn, options-vs-lookup. All CEL overrecord.*evaluated by@objectstack/formula(:309-313says so), i.e. objectstack-formula/-data ground. Renderer-side residue worth keeping is narrow: fail-open vs fail-closed (:300-302,:347-348) and the legacy-shape translation with its one-time deprecation warning (:332-337).MERGE-INTO objectstack-formula; keep ~15 lines−1,339 +200 = −1,139 ① no ② yes ③ construct MED yes OUI-C-04 C guides/data-integration.md:66-95vs objectstack-queryQueryParams($select/$filter/$orderby/$skip/$top/$expand/$search/$count) is objectstack-query's vocabulary. objectui's version adds one thing the anchor cannot: the index signature[key: string]: any(:79) is why an unprefixedlimittype-checks and is then dropped (:442).Keep — the $-prefix trap is renderer-side and decision-changing.ADDa one-line "full query semantics → objectstack-query" pointer instead of expanding+15 ① yes (the trap) ② no ③ n/a MED no OUI-C-05 C guides/auth-permissions.md:122-251vs objectstack-data (sharingModel / RLS)@object-ui/permissionsis genuinely client-side and distinct from server RLS. But nothing in either package tells an ObjectStack customer which to author, and:193-205shows the trap:RowLevelPermission.filteris returned verbatim and uninterpolated, so'ownerId = ${user.id}'reaches the caller as literal text. Two permission models, no routing sentence.ADDone routing sentence at:122; paid by OUI-D-02+35 ① yes — decides which model to author ② no ③ n/a MED yes D — Density
id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-D-01 D guides/page-builder.md:356-4582,195 tok — one plugin of 19 takes 33 % of the page-builder guide. A 35-line maximal Gantt JSON ( :356-391) then four config tables and six prose paragraphs coveringresourceView,capacity,autoZoomToFilter,persistLayout,mobileReadOnly,markers, PNG/PDF export, the 定位 locate icon and 闪烁 pulse. Not a canonical example — a feature manual for@object-ui/plugin-gantt. Its three sibling plugins get 4-9 lines each (:313-354).MOVE-TO packages/plugin-gantt/README.md; keep a 10-line minimal gantt node beside kanban/form/grid−2,195 +120 = −2,075 ① no — 19 of 20 readers never author a gantt ② yes ③ minimal example survives HIGH yes OUI-D-02 D guides/console-development.md:10-47622 tok of commit archaeology: five SHAs ( c1e105793,28ffe4033,b279d80d6,cccdf84d7,ff9a0d9e9), a date range, and a paragraph correcting an earlier revision of this same note.:42-43("Look inpackages/app-shellfirst. Grep before you assume a path") is the whole actionable content.DELETE:14-39−500 ① no ② yes ③ n/a HIGH no (subsumed by OUI-B-01) OUI-D-03 D guides/console-development.md:117-134"Retired names — do not import these": 18 rows / 741 tok of symbols deleted from apps/console, each with rationale prose ("Deleted (cccdf84d7, 26 lines)", "195 lines when it landed, 317 when it went", "Worth knowing before deciding that aROADMAP.mdline naming it was invented rather than stale"). A customer never imported any of them.DELETE−741 ① no ② yes ③ n/a HIGH yes (retired semantics) OUI-D-04 D SKILL.md:142-151+guides/page-builder.md:513-522"Fast Triage Playbook for Ambiguous Requests" — four generic steps and the closer "This keeps momentum while inviting focused user feedback." Generic agent behaviour, stated twice. DELETEboth−210 ① no ② yes ③ n/a MED no OUI-D-05 D SKILL.md:155**You are the Architect. Build the Engine.**— persona flourish; the reader builds an app, not the engine.DELETE−15 ① no ② yes ③ n/a HIGH no OUI-D-06 D rules/styling.md:112-12817 lines of "Why" rationale for the colour carve-out ending "Read that rationale as the test." The operative test is already stated at :108-110("any inline style that hard-codes a colour such that dark mode renders identically");:120-123restates it a third time.DELETE:112-123; keep the scope sentence:125-128−220 ① no — :108-110decides every case ② yes ③ the test is the constructMED no E — Constructs & examples
Top-5 real authoring tasks, derived from the corpus (437 JSON schemas under
examples/schema-catalog/src/schemas/,apps/console,apps/site) by walking every"type"key — not from any table of contents:Rank Real authoring task Evidence ONE canonical copy-pasteable example? 1 Compose a page from layout + text primitives text×702,flex×248,stack×153,box×84,container×15NO — flex/stack/box/containerget 0 mentions package-wide (OUI-F-01)2 Build a form form×81,input×48,label×45,select×24,checkbox×12,textarea×9Partial — object-formnode atpage-builder.md:333-344; no guide for theform/fieldsschema itself3 Build a card / KPI surface card×93,statistic×29,metric-card×11,metric×5YES for card/statistic(page-builder.md:201-223);metric-cardunmentioned4 Wire a data grid / table grid×26,data-table×5, pluginobject-gridYES — page-builder.md:313-331, with thefield-vs-nameconstruct5 Wire a DataSource + provider 36 files importing SchemaRendereracrossapps/+examples/YES — data-integration.md:97-153id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-E-01 E package-wide (123 fences) Zero OSCHECK-MARKERmarkers; nocheck-skill-examples.tsequivalent.check-skills-paths.mjs:120-122deliberately excludes fences ("A fence is a worked example"), so no gate reads inside a single code block in this package. 123 TypeScript + 63 JSON fences, all unverified.ADDthe marker convention + a port of the objectstack gate — highest-leverage structural addition; paid by OUI-B-01+0 (tooling) ① yes — it is what stops the 121-site sweep recurring ② no ③ construct HIGH yes OUI-E-02 E guides/page-builder.md:356-391The package's largest single example (35 lines) is a kitchen sink: 20 optional keys set at once, so the reader cannot tell which three are required until :393says so afterwards. Also carries Chinese labels (OUI-G-01).REWRITE-AS-CONSTRUCT: required-three-keys minimal fence(in OUI-D-01) ① yes ② no ③ yes HIGH no OUI-E-03 E guides/plugin-development.md:52, 151, 307, 420vspackages/types/src/plugin-scope.ts:49-54The guide teaches registration only as ComponentRegistry.register(...). The real plugin-scoped APIPluginScope.registerComponent(type, component, meta?)— documented in the implementation's own docblock (plugin-scope.ts:49) — is never mentioned.evals/plugin-development.jsonrequiresregisterComponentin two of three answers (OUI-H-02), so the package's own eval contradicts its guide.ADDa 4-lineregisterComponentrow; paid by OUI-B-07+60 ① yes — it is the API a plugin author actually gets ② no ③ construct HIGH no F — Gaps vs real usage
id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-F-01 F absent from skills/objectui/**The three most-used layout primitives are undocumented. Across all 437 catalog schemas: flex248,stack153,box84,container15. All real registered types (packages/components/src/renderers/layout/flex.tsx:14,box.tsx:63,container.tsx:107). Grepping the package for each → 0.SKILL.md:81names "Grid, Stack, Container" as English nouns in a sentence aboutcolumns, never as authorabletypestrings, and gives no props. A customer authoring a page reaches forflexfirst; the package is silent.ADDone layout-primitive table (flex/stack/box/container/grid— type, key props, when to pick which); paid by OUI-B-03 or OUI-D-01+250 ① yes — the #1 authoring decision by volume ② no ③ construct HIGH no OUI-F-02 F README.md:81-85,guides/architecture.md:29-71Two real, used packages absent from every inventory: @object-ui/sdui-parser(14 importing files inapps/+examples/) and@object-ui/react-runtime(5). Neither appears inREADME.md's "Coverage map" (which claims "The skill stays in sync with thepackages/tree",:79) nor inarchitecture.md's four package tables.@object-ui/test-supportis also absent — correctly, it isprivate=yes.ADDtwo rows, orDELETEthe "stays in sync" claim+30 or −25 ① marginal ② yes ③ n/a HIGH no OUI-F-03 F guides/architecture.md:35, 88;guides/project-setup.md:405-413, 424Speculative surface. @object-ui/runnerhas 0 importing files acrossapps/**andexamples/**(grepped@object-ui/runner, excludingnode_modules), yet occupies 4 documented positions including a decision-matrix row. Zero usage in examples is evidence, not proof — it isprivate=no— but a removal candidate under startup focus.@object-ui/collaboration: 3 files, listed inREADME.md:83,architecture.md:46,project-setup.md:90, with no guide and no example anywhere.RETIRE-SURFACEor compress each to one inventory row−180 ① no ② yes ③ n/a MED yes OUI-F-04 F guides/architecture.md:36" @object-ui/data-*… Connectors for REST, ObjectQL, GraphQL (e.g.@object-ui/data-objectstack)" — the plural family implies siblings. Onlypackages/data-objectstack/exists.data-integration.md:359-421correctly tells the reader to hand-write aRestApiAdapter.REWRITE-AS-CONSTRUCT→ name the one package, point at the hand-written-adapter recipe−20 ① yes — stops a search for a package that is not there ② no ③ n/a MED no OUI-F-05 F guides/project-setup.md:186-203CLI table lists 14 commands. Enumerated from packages/cli/src/**.command('…'):add analyze build check create dev doctor generate init lint serve start studio test validate= 15 real; the table'sobjectui create pluginmaps tocreate. Every documented command resolves. Clean result.— 0 — HIGH no G — Consistency
id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-G-01 G guides/page-builder.md:379-381, 401-409, 418-425, 434, 445, 448-450, 452-457;guides/project-setup.md:319-324The package violates its own Core Principle 0. SKILL.md:37-39: "ALL user-facing text in components, documentation, comments, and UI labels MUST be written in English. Do NOT use Chinese … in … doc files";README.md:96: "All authored text … must be English-only". CJK byte-range grep: ~25 lines carrying Chinese outsidei18n.md(where it is legitimate demo data). In a JSON fence a customer would copy:{ "field": "status", "label": "状态" }(page-builder.md:379). In prose: "remove it (移除依赖), or right-click a bar for 添加紧前/添加紧后依赖" (:401-402). In a table cell: "Marks a row view-only / 仅查看" (:424). And a whole quoted console block atproject-setup.md:319-324(vitest 调用被拒绝…正确跑法 —— 一律在【仓库根目录】执行).REWRITE-AS-CONSTRUCT(translate) — most leaves anyway under OUI-D-01 and OUI-B-04~−40 ① yes — a copied "label": "状态"ships Chinese into an English app ② partly ③ n/aHIGH yes OUI-G-02 G guides/page-builder.md:415-416vspackages/plugin-gantt/src/ObjectGantt.tsx:508-545andrules/protocol.md:94-147"The gantt field config may also be hoisted to top-level propsinstead of nesting undergantt." Contradicts the package's own central rule — stated four times — thatpropsis never read by aui:*/page:*renderer. Implementation:ObjectGantttakesschema: ObjectGanttSchemaonly (:268-288);getGanttConfigreadsschema.gantt, else flat keys offschema.*(:526-545);schema.propsis never read. The source comment calls that branch "The internal flat form — the ObjectView / ListView flatten product", i.e. not an authoring face. The same guide says "top-level" correctly 12 lines later (:427-428).REWRITE-AS-CONSTRUCT: "…hoisted onto the node (the internal flatten shape — prefer theganttblock)"±0 ① yes — teaches the one spelling the package elsewhere forbids ② no ③ n/a HIGH yes OUI-G-03 G guides/schema-expressions.md:649vs:47(same file),rules/protocol.md:22, 65-92,guides/page-builder.md:191, 236-244Debugging checklist step 1: "A ${...}ontitle/label/value/descriptionis never evaluated". Contradicted 600 lines earlier in the same file (:47): those four keys are template-evaluated on the declaring types —statistic(label/value/description),card(title/description),button(label) — a closed set read fromEXPRESSION_BINDABLE_TEXT_KEYS_BY_COMPONENTin@objectstack/spec/ui, pinned bypackages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx:50-54, 107. An agent debugging with the checklist will "fix" working schemas.REWRITE-AS-CONSTRUCT: "…evaluated only on the declaring types (statistic/card/button), read raw everywhere else"±0 ① yes — the checklist is the last thing read before acting ② no ③ n/a HIGH yes OUI-G-04 G package-wide Brand spelling split: "Object UI" ×62 vs "ObjectUI" ×54. Every rules/*.mdandSKILL.mduseObjectUI; every guide frontmatter and most guide prose useObject UI; all 11 eval JSONs useObject UIin prompts.REWRITE-AS-CONSTRUCT: normalise toObjectUI(the npm /SKILL.mdspelling)±0 ① no ② no ③ n/a HIGH no OUI-G-05 G guides/testing.md:363vsguides/data-integration.md:87MSW mock returns { records: [...], total: 1 }; the sibling guide statesQueryResult.datais "required, and NOT namedrecords". Defensible (raw server envelope ≠QueryResult) but it is the exact spelling named as the trap, in a fence a reader will copy.REWRITE-AS-CONSTRUCT: rename todata, or annotate// raw server envelope, not QueryResult±0 ① marginal ② no ③ n/a LOW no OUI-G-06 G package-wide Retired-spelling sweep ( silently,ignored,dropped,legacy,deprecated,M9,v5.0,OLD,NEW,project-as-workspace): no residue.M9/v5.0/OLD/NEW→ zero hits. Everysilently/dropped/ignoredhit describes real measured runtime behaviour.projecthere means a customer's code project, not an ObjectStack runtime workspace, so objectstack'senvironment-not-projectconvention does not apply. Clean result.— 0 — HIGH no H — Evals
11 files, 6,079 tok, ~3 prompts each. Every
must_containtoken was cross-checked against (a) its own guide, (b) the whole package, (c)packages/**.id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-H-01 H evals/mobile.json:36-44Tests a surface that does not exist, and would FAIL a correct answer. Eval 3 requires must_contain: ["useSwipe", "useLongPress", "@object-ui/mobile"].grep -rn "useSwipe\b|useLongPress\b" packages/→ zero hits repo-wide.packages/mobile/src/index.ts:22-53exportsuseGesture,useSpecGesture,usePullToRefresh,useBreakpoint,useResponsive,useResponsiveConfig,useTouchTarget,MobileProvider,ResponsiveContainer,BREAKPOINTS;guides/mobile.md:34-59correctly teaches "One hook,useGesture, per gesture" withtype: 'swipe-left'/'long-press'. An answer following the guide fails; an answer inventing two hooks passes.REWRITE-AS-CONSTRUCT:["useGesture", "swipe-left", "long-press", "@object-ui/mobile"]±0 ① yes — it grades the package's own correct answer wrong ② no ③ n/a HIGH yes OUI-H-02 H evals/plugin-development.json:14, 30;evals/page-builder.jsoneval 1Three evals require registerComponent, absent everywhere in the package (guides teachComponentRegistry.register). It is real (packages/types/src/plugin-scope.ts:54) but untaught — OUI-E-03. Evals 1 and 3 also requireFieldWidgetProps, whereas guide and implementation both useFieldWidgetComponentProps(plugin-development.md:240, 268-271); the assertion passes only by accidental substring match onFieldWidgetPropsSchema(:282).REWRITE-AS-CONSTRUCT(align toComponentRegistry.register+FieldWidgetComponentProps) andADDtheregisterComponentAPI per OUI-E-03±0 ① yes ② no ③ n/a HIGH yes OUI-H-03 H evals/page-builder.jsoneval 2must_contain: ["visible", "props", "admin", "section"]. Requiring the literal tokenpropsin a passing answer inverts the package's most-repeated hard rule — "Keys Live on the Node, Not in apropsEnvelope" (rules/protocol.md:94-147), restated atpage-builder.md:87-94,schema-expressions.md:64-74,data-integration.md:263-267. An answer that correctly keeps every key on the node and never writespropsfails this eval. (sectionis also absent frompage-builder.md.)REWRITE-AS-CONSTRUCT: droppropsfrommust_contain; move it tomust_not_contain±0 ① yes — trains the grader against the package's central rule ② no ③ n/a HIGH yes OUI-H-04 H evals/app-composition.jsonevals 1-4All four require the literal JSON-quoted "type": "object". The guide writes the shape as{type:'object', objectName}throughout (app-composition.md:41-44, 56, 61) — single quotes, no space. A correct answer copying the guide's own spelling fails all four. Brittle string matching, not a decision test.REWRITE-AS-CONSTRUCT: assertobjectName+navigation+viewName±0 ① yes ② no ③ n/a HIGH no OUI-H-05 H evals/mobile.json:14;evals/project-setup.jsoneval 3;evals/testing.jsoneval 2;evals/page-builder.jsoneval 3Four more assertions require tokens absent from their own guide: sidebar(0 occurrences inguides/mobile.md),ComponentRegistry(absent fromguides/project-setup.md),edit(absent fromguides/testing.md),refresh(absent fromguides/page-builder.md). Each grades a decision the guide never teaches.REWRITE-AS-CONSTRUCTper row, or drop the token±0 ① yes ② partly ③ n/a HIGH no OUI-H-06 H evals/console-development.json(698 tok) vsguides/console-development.md(7,600 tok)Proportionality: the eval set (6,079 tok) tests 11 of 12 guides and 0 of 4 rules files — including rules/protocol.md, whoseprops/properties/bindable-keys contract is the package's densest, most error-prone surface and the subject of three separate in-package restatements.ADD evals/protocol.json(~3 prompts, ~450 tok) targeting the node-vs-propsdecision; paid by OUI-B-08 (−602)+450 ① yes — the decision the package most exists to change ② no ③ construct MED no I — Size proportionality
id dim file:span evidence proposal Δtok gate ①②③ conf human-floor OUI-I-01 I package-wide 64,022 tok against 5 distinct high-frequency real authoring tasks (E) and 230 registered types of which ~98 are named at all. ~12,000 tok (19 %) is addressed at a contributor to this repo rather than any customer (OUI-B-01…B-05, B-08); ~5,400 tok (8 %) is in-package duplication (OUI-I-02, I-03); ~3,000 tok (5 %) restates objectstack anchors (OUI-C-01…C-03). Two of four rules/files are load-bearing (protocol.md,styling.md); one is repo-internal (no-touch-zones.md). No token ratchet exists to have caught any of it.Structural — see verdict ≈ −21,600 (−34 %) per row HIGH yes OUI-I-02 I 4 duplication clusters The same rule is stated up to four times. ① Stylesheet imports + @theme/@sourcesplit ×4: anchorrules/styling.md:260-316(685) +guides/page-builder.md:252-304(646) +guides/project-setup.md:124-164(474) +SKILL.md:139-140(199) — andSKILL.md:140even says "do not keep a second copy of the answer here" while being the second copy. ② Expression-evaluation boundary table ×3: anchorrules/protocol.md:5-43, 94-147+guides/schema-expressions.md:28-100(968) +guides/page-builder.md:173-250(934). ③data-table/useDataScopereader trap ×3: anchorrules/protocol.md:193-212(357) +guides/schema-expressions.md:421-451(307) +guides/data-integration.md:203-231(323) — the last two share the Ada Lovelace / Grace Hopper fixture verbatim. ④columnsbreakpoint object +2xldropped ×3: anchorrules/protocol.md:264-296(352) +SKILL.md:81(~90) +guides/mobile.md:101-107(113).MERGE-INTOtherules/*anchor in each cluster; leave a one-line pointer where the guide needs the cue−1,319 −1,902 −630 −203 = −4,054 (+~200 pointers) ≈ −3,850 ① no — the anchor already decides ② yes ③ pointer HIGH yes OUI-I-03 I guides/*.md:1-4×11, plus:8openers ×12Vestigial standalone-skill framing: 11 frontmatter blocks (1,593 tok, OUI-A-03) plus twelve "Use this skill to …" openers ( page-builder.md:8,testing.md:8,mobile.md:8,i18n.md:8,plugin-development.md:8,project-setup.md:8,auth-permissions.md:8,console-development.md:8,data-integration.md:8,schema-expressions.md:8, pluspage-builder.md:10-32's "When to use this skill"). These are files inside one skill, not skills.DELETEfrontmatters; rewrite openers as one-line scope statements−1,593 −180 = −1,773 ① no ② yes ③ n/a HIGH yes
Incidental falsehoods
(By-product of this audit. The 2026-08-31 sweep is not being redone.)
# file:span claim measured truth 1 guides/page-builder.md:415-416"The gantt field config may also be hoisted to top-level propsinstead of nesting undergantt."ObjectGanttacceptsschema: ObjectGanttSchemaonly (packages/plugin-gantt/src/ObjectGantt.tsx:268-288).getGanttConfig(:508-545) readsschema.gantt, else the flat keys offschema.*;schema.propsis never read. The flat branch's own comment calls it "The internal flat form — the ObjectView / ListView flatten product". The word is node, notprops— and the same guide says so correctly at:427-428.2 guides/schema-expressions.md:649"A ${...}ontitle/label/value/descriptionis never evaluated"False on the declaring types, and contradicted by :47of the same file.EXPRESSION_BINDABLE_TEXT_KEYS_BY_COMPONENT(@objectstack/spec/ui) declaresstatistic→label/value/description,card→title/description,button→label; pinned bypackages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx:50-54, 107.3 README.md:79"The skill stays in sync with the packages/tree" + a 5-group coverage map@object-ui/sdui-parserand@object-ui/react-runtimeare published (private=no) and imported in 14 and 5 files acrossapps/+examples/; neither appears in the map or anywhere in the package.4 guides/architecture.md:36" @object-ui/data-*… Connectors for REST, ObjectQL, GraphQL"Only packages/data-objectstack/exists. Nodata-rest, nodata-graphql.5 evals/mobile.json:36-44asserts useSwipe/useLongPressare the mobile gesture APIZero occurrences in packages/**. The API isuseGesturewith atypediscriminator (packages/mobile/src/index.ts:25).
Generated by Claude Code
os-dev-report
{ "issue": 7251, "status": "done", "branch": "claude/issue-7251-skills-objectui-optimization", "pr": "https://github.com/objectstack-ai/objectui/pull/7370", "premise_still_valid": true, "summary": "skills/objectui went from 64,023 to 43,679 tokens, -20,344 (-31.8%), 29 files to 27, in 12 commits, one per cluster. IMPLEMENT (a)-(h) all landed: console-development.md and no-touch-zones.md moved to a new .claude/skills/objectui-contributor/ (user-invocable false); the contributor halves of architecture/project-setup/testing/README deleted; the gantt feature manual moved to packages/plugin-gantt/README.md with a minimal node left behind; three of four in-package duplicate clusters merged into their rules/* anchor; 11 vestigial frontmatters (6,372 B, matching the audit exactly) deleted; C-01/C-02/C-03 replaced by pointers to objectstack-ui, -data and -formula anchors verified BY CONTENT on objectstack origin/main; the router promoted to first in SKILL.md; every funded correctness item corrected at source; the layout-primitive table and evals/protocol.json added. ONE finding is premise_false and was reverted, see below. TWO deviations from the audit's proposals were forced by objectui gates the audit did not measure, both declared in the PR body. Assignee untouched; the PM's claim was already on the card.", "premise_false": [ "OUI-I-02 cluster 3 (data-table / useDataScope reader trap, x3) — merged, then REVERTED byte for byte from 96655c5. The two guide spans are not prose duplicates: packages/components/src/__tests__/skill-guide-data-table-binding.test.tsx lifts them off disk at run time, renders the data-table block through the real SchemaRenderer and asserts the four Ada/Grace body cells, and extracts the seven object-* names from the literal sentence 'the plugin packages register (...)' to assert each is registered by exactly one plugin package reading useDataScope(schema.bind) — with an explicit counter-probe against a vacuous pass. The merge turned 5 assertions red. The test's docblock states the intent: 'the guides are executable fixtures ... Keep it that way.' The other three I-02 clusters stand; verified by git grep -ln skills/objectui -- ':!*.md' ':!skills/**' then running every test it names." ], "deviations": [ "OUI-A-02 — compatibility carries NO version literal. scripts/__tests__/doc-version-claims.test.ts (covers skills/, objectui#4981; objectstack has no equivalent, which is why the siblings can freeze a number) refused 'Requires @objectstack/spec 17.x (Zod v4 schemas)' and named the remedy: 'Prefer DELETING the literal and pointing at the truth instead'. The field points at the manifests. A KNOWN_CLAIMS entry was rejected — registering an unverifiable claim is what that ratchet exists to stop.", "OUI-H-03 — props moved to must_not_contain spelled as the JSON envelope '\"props\": {', not the bare word. A bare props there would fail any answer that NAMES the rule while following it, which is the same defect pointing the other way." ], "file_surface_supplement": "scripts/__tests__/check-skills-paths.test.ts — outside the dispatch's declared surface, taken under the bounded in-place rule and named with evidence in the PR body. Forced by the ruled move: the checked floor '> 50' cannot survive a scan that legitimately dropped to 27 (it is '> 20' with the arithmetic recorded), and the objectui#3713/#3730 block read the moved guide through repoRoot (ENOENT) and asserted a baseline entry the gate itself demanded be deleted. It landed inside b38ee5e via a stale index entry rather than its own commit; 72f650e carries the rationale rather than rewriting a pushed commit.", "tests": "All heavy steps serialized through scripts/pm/os-verify-lock.sh (one queue-timeout exit 99, resumed on the same OS_VERIFY_LOCK_SLOT). Gates run AFTER the final commit, on head 72f650e, exit codes captured before any pipe, verdict lines quoted from the gates themselves: check-skills-paths exit 0 'OK (27/27 stated path(s) resolve across 16 guide file(s))' (was 92/93 across 18 at base); check-doc-links exit 0 'Links are valid across 17 scan roots.'; check-control-bytes exit 0 'OK (scanned 6054 tracked text file(s); skipped 85 binary)'; check-doc-fence-languages exit 0; check-changeset-presence exit 0 'No source or published contract of a released package changed in this range, so no changeset is owed.'; check-shell-escape-residue exit 0; check-governed-queue-guard --self-test exit 0 '132 cases pass'; check-governed-queue-guard --test over all 31 changed paths exit 3 'GOVERNED — 28 of 31 path(s) are on a governed surface' (the correct governed verdict, not a red); pnpm type-check:scripts exit 0, and tsc --listFiles confirms check-skills-paths.test.ts IS in that program, so it is a measurement and not the excluded-tests NOT-MEASURED trap. vitest: scripts set 'Test Files 6 passed (6), Tests 155 passed (155)'; the eight tests that read skills/objectui/** 'Test Files 8 passed (8), Tests 115 passed (115)' — that same set read 5 failed / 110 passed before the cluster-3 revert, and doc-version-claims read 1 failed / 123 passed before the compatibility fix, so both reds were real measurements, not template. No ablation was run: nothing in this diff is a guard whose failure needed proving. pnpm lint NARROWED, declared with all three readings: population from eslint's own config (files ['**/*.{ts,tsx}'] plus the ignore list) makes exactly 1 of the 31 changed paths lintable, the other 30 being .md/.json; --format json reports 1 file, 0 errors, 0 warnings; eslint.config.js sets no parserOptions.project and no projectService, so linting is not type-aware and this diff cannot move any untouched file's verdict. Repo-wide eslint is CI's run.", "mcp_calls": "14 — 2 issue comments (claim, audit record) + 3 search_issues (dedupe, each targeted) + 5 issue_write create (follow-up cards) + 1 get_label + 1 create_pull_request + 1 pull_request_read (PR body read-back; the PR page has no SSR payload block, unlike an issue page) + 2 issue_write update (label union writes). This report comment makes 15. Bulk reads went to the zero-quota channels: git for the trees, the issue-page embedded JSON payload for the card body, all comments, and both label compare-read-backs. REST is 403 for this session ('GitHub access is not enabled for this session') and gh is absent, so every write went through MCP — declared channel switch.", "open_questions": [], "out_of_scope_findings": [ "filed as #7358: check-skills-paths lost 55 of its 93 assertions (49 + 6) when the two guides left SCAN_ROOT — widen it to cover .claude/skills; the gate was built for console-development.md (#3713/#3730), still 49 coordinates deep and now unguarded", "filed as #7359: no gate reads inside a code fence in skills/objectui — 123 TypeScript and 63 JSON fences, zero os:check markers (the flight's DEFER row OUI-E-01)", "filed as #7360: six more eval assertions grade tokens their guide never teaches (OUI-H-05) plus OUI-H-02's untaught registerComponent and the FieldWidgetProps substring accident, plus one NOT in the audit — evals/mobile.json eval 2 asserts useOffline while the export is useOfflineSync, passing on the substring", "filed as #7361 (finding): container.maxWidth's @default says 'lg' while the renderer applies 'xl', and FlexLayoutProps.align says 'center' while flex.tsx applies 'start' and stack.tsx 'stretch' — an instance of the open #4631, found while writing the layout table from the renderers instead of the types", "filed as #7362: content/docs/guide/agent-skills.md still draws both moved files inside the published tree and ci-cd-pipeline.md describes a baseline entry that no longer exists — outside this flight's file surface", "follow-up for objectstack-ui (OUI-A-01, no card — objectstack is read-only for this seat): objectui routes outward but nothing routes inward; objectstack's skills/README.md names objectui once, outside its Index and outside Cross-skill routing", "follow-up for objectstack-ui / objectstack-data (OUI-C-05, no card, same reason): two permission models, client-side @object-ui/permissions and server RLS, with no sentence anywhere telling a customer which to author; RowLevelPermission.filter is returned verbatim and uninterpolated" ] }Draft PR #7370 is open and stays draft (governed). CI was not waited on, per the standing rule that convergence is the PM's step; gate status at report time is whatever CI reports on
72f650e. Worktree removed without--force.
Generated by Claude Code
ACCEPT — PR #7370 @
72f650e8(−20,344 tok, −31.8%; 29 → 27 files)Session:
session_01LraLgQVGq8egUwfYZpbYt1(skills lane seat)Verified against GitHub, not the report:
- PR skills(objectui): optimization flight — contributor-only content moved out, duplicates merged into rules/, router first, three evals corrected (net −20,344 tokens, −31.8%) #7370 is a draft against
main,mergeable_state: clean, 12 commits (one per cluster, individually droppable), 31 files, +524 / −1,205, first lineFixes #7251. - CI on
72f650e8: all 28 check runs completed — Test shards 1/4–4/4, Type Check, Lint, Build & E2E, Governed Surface Queue Guard, Skill Guide Path Check, Internal Docs Link Check, Control Byte Scan, Shell Escape Residue Scan, Changeset Declaration, Doc Snippet / Doc Component Type Check, Bundle Analysis, Docs Route Eager Closure Check, Inert vi.mock Specifier Check, README Export Check, Pre-Install Import Graph Check, Live E2E all success; the coverage jobs skipped by design. Nothing red, nothing pending.
Contract review (
needs:contract-review, both carriers) — done in-seat at the contract-review tier: PASS. Each claim checked at source on this base, not carried from the audit:claim verdict evidence OUI-G-02 — the gantt config is read from the node, never hoisted propsPASS getGanttConfigreadsschema.gantt, else the flat keys offschema.*(packages/plugin-gantt/src/ObjectGantt.tsx:509-513); no.propsread in the fileOUI-G-03 — ${...}ontitle/label/value/descriptionIS evaluated on declaring typesPASS EXPRESSION_BINDABLE_TEXT_KEYS_BY_COMPONENT(@objectstack/spec/ui), pinned bypackages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx(statistic,card,button; negativestext,ui:statistic)OUI-H-01 — the gesture API is useGesturePASS packages/mobile/src/index.ts:25;useSwipe/useLongPresshave zero hits underpackages/OUI-F-01 — layout-primitive defaults as the renderers apply them PASS flexrow / start / start / gap 2;stackcolumn / stretch / gap 2;gridgap 4;containermaxWidthxl;boxclassName verbatim — read from the renderer sources, which is why they differ from the JSDoc (#7361 records the JSDoc side)Per the 2026-08-31 ruling, the seat that reviewed strips the label:
needs:contract-reviewremoved from this card and from #7370 in the same stroke.Also accepted:
premise_falseon OUI-I-02 cluster ③ — thedata-table/useDataScopespans inschema-expressions.mdanddata-integration.mdare executable fixtures lifted at run time byskill-guide-data-table-binding.test.tsx(5 assertions red when merged); the revert restores the span byte-for-byte. The audit finding is withdrawn for that cluster; the other three clusters stand.- Both deviations —
compatibilitystates no version literal (thedoc-version-claimsratchet refuses one, and aKNOWN_CLAIMSentry would defeat that ratchet's purpose); OUI-H-03'smust_not_containspelled as"props": {rather than the bare word. - One out-of-surface co-edit, flagged for the maintainer:
scripts/__tests__/check-skills-paths.test.ts— thecheckedfloor moved 50 → 20 and the docs(skills): console-development.md 指路的 7 个 console 页面里 5 个不存在,并整节教用已删除的 MetadataManagerPage #3713/docs(skills): console-development.md 的 Key contexts / Key hooks / UnifiedSidebar 三处把 13 个真实符号指到 apps/console 下已不存在的目录 #3730 block re-pinned, both forced by the ruled move ofconsole-development.mdout ofSCAN_ROOT. The honest cost (55 of 93 assertions no longer exercised) is measured in check-skills-paths lost 55 of its 93 assertions when the contributor guides moved out ofskills/— widen SCAN_ROOT to cover.claude/skills#7358 with the widening's shape. It rode insideb38ee5e;72f650ecarries the rationale. Droppable only together with cluster (a). - No changeset — the repo's own gate answered ("no source or published contract of a released package changed").
Follow-ups filed unassigned by the dev: #7358 (
check-skills-pathscoverage after the move), #7359 (no fence gate /os:checkport — the DEFER row OUI-E-01), #7360 (six more eval assertions grading untaught tokens + theuseOfflinesubstring accident), #7361 (layout@defaultJSDoc vs renderer), #7362 (content/docs/guide/agent-skills.mdandci-cd-pipeline.mdstill describe the moved files). Two cross-repo notes (OUI-A-01 inward routing row for objectstack'sskills/README.mdgenerator; OUI-C-05 client-permissions vs server-RLS routing sentence, needs both halves) go on the seat ledger in objectstack; they are not this PR's.Governed surface (
skills/**,.claude/skills/**): the PR stays draft; review requested from os-zhuang and hotlong; landing is the maintainer's.Fixes #7251closes this card on merge; the seat stripspm:dispatchedthen.
Generated by Claude Code
- PR skills(objectui): optimization flight — contributor-only content moved out, duplicates merged into rules/, router first, three evals corrected (net −20,344 tokens, −31.8%) #7370 is a draft against
- added a commit that references this issue
on Sep 2, 2026 - added a commit that references this issue
on Sep 6, 2026 - added 3 commits that reference this issue
on Sep 9, 2026
Member card of the skills catalog optimization program objectstack-ai/objectstack#14292 (maintainer mandate 2026-09-02, verbatim: 「审核所有的 skills,进行全面的优化。」). Filed by the skills lane seat (session
session_01LraLgQVGq8egUwfYZpbYt1). Read-only audit at objectuiorigin/main67dadd6. Full findings table = audit record: the dev postsaudit/objectui/findings.md(seat scratchpad) verbatim as the first comment at claim time. Publishedskills/**is a governed surface in this repo (maintainer ruling 批 #7, ui#6866):.mdcontent ⇒ maintainer review, draft PR, human merge.Audit summary
29 files, 64,022 tokens (guides 45,065 · rules 8,602 · SKILL.md 2,272 · README.md 1,113 · evals 6,079); largest file
guides/console-development.md7,600 tok (11.9%). Enforcement here: exactly one skills gate,check:skills-paths(paths in prose code spans exist on disk — green, 92/93), and nothing else: no token ratchet, noos:checkfence gate (grep -rc "os:check" skills/objectui/= 0), doc-link/component-type/snippet gates all excludeskills/**. Real usage (437 schema-catalog JSONs + apps + examples), true authoring frequencies:text702,flex248,stack153,button126,card93,box84,form81 … against 230 registered types the package names ~98. Every@object-ui/*import in a TS fence resolves at 67dadd6 (@object-ui/mobileexists). Verdict RESTRUCTURE: ~12,000 tok addressed at a contributor to THIS repo (customer installs have noapps/console/, nopackages/components/src/ui/**, nopnpm-workspace.yaml); ~8% in-package duplication; ~5% restating objectstack anchors; 11 vestigial standalone-skill frontmatters; the router (the file's only decision-changing construct) buried under 90 lines of preamble.Top findings
guides/console-development.md:1-510— addressed at a maintainer of this repo.claude/skills/(separate commit)styling.md:260-316+page-builder.md:252-304+project-setup.md:124-164+SKILL.md:139-140), expression table ×3,data-tabletrap ×3,columns/2xl×3rules/*anchor + pointersguides/page-builder.md:356-458— 1 plugin of 19 takes 33% of the guidepackages/plugin-gantt/README.md(separate commit), keep a 10-line minimalguides/*.md:1-4×11 +:8openers ×12 — vestigial frontmatter no runtime readsguides/architecture.md:14-90, 171-189— monorepo package placement:84-89+:91-126app-composition.md:13-110vs objectstack-ui:857-893, 634-648— verbatim duplicateschema-expressions.md:304-401— CEL list-view tier owned by objectstack-formula (:309-313says so)rules/no-touch-zones.md:1-136+SKILL.md:89-93— forbids editing a path no customer hasproject-setup.md:252-339, 437-444— workspace/Turbo/vitest guard/vercelconsole-development.md:117-134— deleted-symbols tablepage-builder.md:6-39, 502-530— preamble + restatement ofSKILL.md:131-151+ eval promptsschema-expressions.md:258-302vs objectstack-data:250-296—visibleWhen/readonlyWhen/requiredWhentaught twice with divergent spellingsREADME.md:45-97— eval-authoring instructions shipped to every customer sessiontesting.md:10-61— this repo's vitest projects, coverage thresholdsSKILL.md:15-19, 37-39, 49-55— router buried under positioning/style/doc-driven proseCorrectness (zero delta, HIGH, fix in this flight)
evals/mobile.json:36-44requiresuseSwipe/useLongPress— zero hits repo-wide; the API isuseGesture(packages/mobile/src/index.ts:25): the eval fails a correct answer.evals/page-builder.jsoneval 2 requires the literal tokenprops— inverting the package's most-repeated rule (rules/protocol.md:94-147).app-compositionevals require"type": "object"while the guide writes{type:'object', …}.schema-expressions.md:649"a${...}ontitle/label/value/descriptionis never evaluated" — false on declaring types (EXPRESSION_BINDABLE_TEXT_KEYS_BY_COMPONENT; pinned inSchemaRenderer.bindableTextKeys.test.tsx) and contradicted by:47.page-builder.md:415-416"gantt field config may also be hoisted to top-levelprops" —getGanttConfigreadsschema.ganttor flatschema.*, neverschema.props; the word is node (:427-428says so).page-builder.md/project-setup.mdviolate the package's own Core Principle 0, incl. a copy-pasteable fence with"label": "状态"(:379).README.md:79"stays in sync with thepackages/tree" —@object-ui/sdui-parser(14 importers) and@object-ui/react-runtime(5) appear nowhere;architecture.md:36"@object-ui/data-*… REST, ObjectQL, GraphQL" — onlypackages/data-objectstack/exists.Three funded additions
flex/stack/box/container/grid— type string, key props, when to pick which), +250, paid by OUI-B-03 — the Add automated testing infrastructure and CI/CD workflows #2/Add public roadmap, VitePress documentation site, and GitHub Pages deployment #3/Fix documentation deployment for www.objectui.org #6 most-authored types get zero mentions package-wide.evals/protocol.json— three prompts on the node-vs-props-vs-propertiesdecision, +450, paid by OUI-B-08 (the eval set covers 11 of 12 guides and 0 of 4 rules files; no token ratchet in this repo, so a new fixture file is allowed here).os:checkfence-marker convention + a port of objectstack'scheck-skill-examples.ts: 123 TypeScript fences are checked by nothing.Flight scope
IMPLEMENT, split-by-file allowed with a report, as separate commits so the maintainer can drop any one: (a) contributor-only content OUT of the customer bundle —
guides/console-development.mdandrules/no-touch-zones.mdmove to a repo-internal skill under.claude/skills/(new directory,user-invocable: false, a one-line pointer where the router listed them; also governed, same PR), the monorepo halves ofarchitecture.md/project-setup.md/testing.md/README.md:45-97deleted; (b) the gantt kitchen-sink moved topackages/plugin-gantt/README.md; (c) the four duplicate clusters merged into theirrules/*anchor with pointers; (d) the 11 vestigial frontmatters deleted; (e) cross-package duplicates (C-01 → objectstack-ui, C-02 → objectstack-data, C-03 → objectstack-formula) deleted with one-line pointers; (f) the router first inSKILL.mdwith accurate trigger phrasing for the two under-described guides; (g) every correctness item above; (h) additions 1–2. Updatescripts/skills-path-baseline.jsononly ifcheck:skills-pathsdemands it.DEFER: OUI-E-01 (gate port → a follow-up
domain:skillscard in this repo, filed by the dev as out-of-scope); OUI-A-01/A-02 (cross-repo routing with objectstack-ui → "follow-up" note); OUI-F-03 (@object-ui/runner/collaborationretire-surface → one row each, never the last mention).Flight constraints (binding)
main, first lineFixes #<this card>on the closing one (Part of #<this card>on earlier splits); governed ⇒ stays draft; ⛔ never mark ready; review requests are the seat's step.ceil(utf8 bytes/4)) before/after.pnpm check:skills-paths,pnpm lint,pnpm type-check(this repo's spelling), the doc gates the changed paths trigger, plus the repo'scheck:governed-queue-guard --test <paths>(its exit 3 is the governed verdict, not a red); record the head sha. Changeset: objectui has noskip-changesetlabel — an empty-frontmatter changeset if the repo's rule asks for one on askills/**change, ⛔ never request a label.needs:contract-reviewon both carriers (G-02/G-03 are renderer-contract claims).Refs: objectstack#14292 (anchor) · objectstack#14296 (batch-1 decisions) · objectstack#13658 / #7094 (truth sweep) · #7097 (breakpoint gate candidate).