Skip to content

Commit 0e8a4e9

Browse files
committed
docs(skills): make the analytics dataset a module-completeness line item
The published CRM UI Blueprint is the catalog's completeness list — it is framed verbatim as "the default for 'build a complete metadata app UI' tasks" — and it priced views, app navigation, dashboards and reports while never naming the DATASET the last two bind. An agent following it grew the app face of a module (object, fields, approval flow, five profiles of permissions, four views, a nav entry) and left the analytics face silently empty: the module was simply absent from the report builder's dataset list. Dataset-only report sources are design intent, not a defect — the dataset layer carries the governed joins, row-level security and measure semantics the object does not express. So the fix is authoring-material-side: the dataset becomes its own row in the completeness table, at the same standing as views and menu entries, and the docs grow-a-module path gains the same habit. Token ratchet: +204 bytes for the new row, -7 for the Reports row it lets shrink, -77 for a sentence deleted in the same file that restated report binding a second time inside its own paragraph. 25113 -> 25143 tokens; the row's 12 tokens of headroom absorb part of it, so the ceiling moves 18. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
1 parent 4ab8b59 commit 0e8a4e9

3 files changed

Lines changed: 28 additions & 5 deletions

File tree

content/docs/getting-started/build-with-claude-code.mdx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,16 +356,24 @@ prompt you can give verbatim:
356356
|:---|:---|:---|
357357
| Data model — objects, fields, relationships, validations, seeds | `objectstack-data` | "Add an `account` object and link tickets to it with a required lookup. Seed three demo accounts." |
358358
| Queries & reports over records | `objectstack-query` | "Show me the count of open tickets per priority, using an aggregation." |
359-
| Views, dashboards, apps, record pages | `objectstack-ui` | "Add a dashboard with a metric for open tickets and a bar chart of tickets by priority." |
359+
| Views, dashboards, apps, record pages | `objectstack-ui` | "Declare a `tickets` dataset over the ticket object, then add a dashboard with a metric for open tickets and a bar chart of tickets by priority." |
360360
| Business automation — flows, approvals, schedules | `objectstack-automation` | "Every day at 9:00, escalate tickets that have been open more than 48 hours." |
361361
| Permissions & row-level security | `objectstack-data` (security sections) | "Members should only see their own tickets; support managers see everything." |
362362
| Formula / conditional-field logic (CEL) | `objectstack-formula` | "Make `resolved_at` required and visible only when status is resolved." |
363363
| AI agents & tools inside your app | `objectstack-ai` | "Add an AI skill that triages new tickets into a priority." |
364364
| REST/auth surface tuning | `objectstack-api` | "Restrict the ticket API to read-only for non-members." |
365365
| Translations | `objectstack-i18n` | "Add a zh-CN translation bundle for the ticket object and app navigation." |
366366

367-
Two habits keep this reliable as the app grows:
367+
Three habits keep this reliable as the app grows:
368368

369+
- **A module is not finished until its analytics face exists.** Objects, views
370+
and a nav entry make an object usable; they do not make it *reportable*.
371+
Dashboards and reports bind a **declared dataset** by name
372+
(`src/datasets/*.dataset.ts`) — the layer that carries the governed joins,
373+
filters and measure definitions an object does not express — so an object with
374+
no dataset simply never appears in the report builder. Ask for the dataset in
375+
the same breath as the views, and `objectstack-ui`'s completeness blueprint
376+
lists it as its own line item.
369377
- **The gate applies to every domain.** Flows, dashboards, permissions, and
370378
translations all go through the same `npm run validate` — the agent should run
371379
it after each change, exactly as `AGENTS.md` instructs.

scripts/check-skills-token-ratchet.mjs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,21 @@ export const CEILINGS = new Map([
272272
// minimal anchor form; the raising PR's body carries the arithmetic.
273273
['skills/objectstack-pm-dispatch/SKILL.md', 14391],
274274
['skills/objectstack-query/SKILL.md', 5552], // -17 (was 5569)
275-
['skills/objectstack-ui/SKILL.md', 25125], // -29 (was 25154)
275+
// 25125 -> 25143: the CRM UI Blueprint — the catalog's module-completeness
276+
// list, and the only place an agent is told what a finished module contains —
277+
// priced `src/views/**`, `src/apps/**`, dashboards and reports but never the
278+
// DATASET those last two bind, so an agent grew the app face and left the
279+
// analytics face silently empty (a module shipped with views, nav, approvals
280+
// and permissions was simply absent from the report builder). Maintainer
281+
// ruling 2026-08-31, director seat batch #15, verbatim and untranslated:
282+
// 「同意」 — accepting option C, whose text is: 「发布技能与文档的「长模块」路径
283+
// 必须把 dataset 声明列为模块完整性的一部分」. Arithmetic, in bytes because that
284+
// is what this convention divides: +204 for the new blueprint row, -7 for the
285+
// Reports row it lets shrink, and -77 for a sentence deleted in the same file
286+
// that restated report binding a second time inside its own paragraph — +120
287+
// net, 25113 -> 25143 tokens. The row's 12 tokens of headroom absorb part of
288+
// it, so the CEILING moves 18. The raising PR's body carries the same numbers.
289+
['skills/objectstack-ui/SKILL.md', 25143],
276290
['skills/objectstack-upgrade/SKILL.md', 8333], // -2 (was 8335)
277291

278292
// ── the #12392 extension: the rest of the AUTHORED bundle ────────────────

skills/objectstack-ui/SKILL.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,7 @@ allowed joins, intrinsic filter, dimensions, and certified measures. The legacy
688688
per-widget inline query (`object` + `categoryField` + `valueField` + `aggregate`)
689689
**was removed** — a widget now requires `dataset` + `values`; the closed schema
690690
REJECTS the inline keys by name, and one lacking `dataset` fails `os validate`.
691-
Reports bind the same way (`dataset` + `rows` + `values` + `runtimeFilter`). The dataset shape is
691+
The dataset shape is
692692
`DatasetSchema` — see `node_modules/@objectstack/spec/src/ui/dataset.zod.ts`.
693693

694694
A widget's presentation-scope `filter` flows into the query as the runtime
@@ -1404,8 +1404,9 @@ Use this CRM-style structure as the canonical UI assembly reference:
14041404
| Multi-view object UI | `src/views/*.view.ts` | Define default `list` + `form`, then named `listViews` / `formViews` for scenarios |
14051405
| **Public / anonymous form** | `src/views/*.view.ts` (formView with `sharing.allowAnonymous: true`) | Web-to-Lead / Web-to-Case. Auto-exposed at `GET/POST /api/v1/forms/:slug` |
14061406
| App navigation | `src/apps/*.app.ts` | Use grouped nav trees, `viewName` shortcuts, and `requiresObject` for capability-aware visibility |
1407+
| **Analytics dataset** | `src/datasets/*.dataset.ts` | One per object you want reportable — dashboards and reports bind a **declared** dataset by name, so an object without one has no analytics face |
14071408
| Dashboards | `src/dashboards/*.dashboard.ts` | Combine KPI + chart + table widgets with shared `dateRange` and `globalFilters` |
1408-
| Reports | `src/reports/*.report.ts` | Bind a `dataset` + `rows` (dimensions) + `values` (measures) for tabular/summary/matrix/joined analytics |
1409+
| Reports | `src/reports/*.report.ts` | Select `rows` (dimensions) + `values` (measures) from that dataset; tabular/summary/matrix/joined |
14091410
| Record pages | `src/pages/*.page.ts` | Compose `regions` + components (`page:header`, `record:highlights`, related lists, tabs) |
14101411
| User actions | `src/actions/*.actions.ts` | Use `flow` for orchestration and `modal` for parameterized bulk mutations |
14111412

0 commit comments

Comments
 (0)