docs(skills): make the analytics dataset a module-completeness line item - #13972
Draft
claude[bot] wants to merge 1 commit into
Draft
docs(skills): make the analytics dataset a module-completeness line item#13972claude[bot] wants to merge 1 commit into
claude[bot] wants to merge 1 commit into
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #13696
What this changes
The published catalog's module-completeness list —
skills/objectstack-ui/SKILL.md§ CRM UI Blueprint (Metadata-First), framed verbatim as "the default for 'build a complete metadata app UI' tasks" — pricedsrc/views/**,src/apps/**, dashboards and reports, but never the dataset the last two bind.git grep 'src/datasets'over the whole published catalog returned zero hits before this PR.That omission is the card's finding, exactly. An agent grew a complete leave-management module from one sentence — object with 15 fields, an approval flow, five profiles of permissions, four views, a nav entry wired into an existing app — and every one of those works in the app. The module was simply not in the report builder's dataset list, because the analytics face needs a second declaration nothing told the agent to write.
Three edits:
skills/objectstack-ui/SKILL.md— the blueprint table gains an Analytics dataset row (src/datasets/*.dataset.ts), placed above Dashboards and Reports so it reads in dependency order. The Reports row, which used to carry "Bind adataset…" as a sub-clause, now selectsrows/valuesfrom that dataset — the binding obligation moved up to a peer line item rather than being restated. Net +1 line.content/docs/getting-started/build-with-claude-code.mdx— the docs half of the grow-a-module path. Theobjectstack-uiprompt row now asks for the dataset before the dashboard (the previous prompt, "Add a dashboard with a metric for open tickets", is the exact request that silently produces nothing when no dataset exists), and the section's habits list gains "A module is not finished until its analytics face exists."scripts/check-skills-token-ratchet.mjs— theCEILINGSrow for that SKILL.md, see below.Why the dataset stays a separate declaration
Per the ruling on the card (#13696 comment 5475439419, maintainer 2026-08-31, director seat batch #15, verbatim and untranslated: 「同意」), option C: dataset-only report sources are design intent, not a defect — the dataset layer carries the governed joins, row-level security and measure semantics an object does not express. The ruling's own words for the remedy: 「发布技能与文档的「长模块」路径必须把 dataset 声明列为模块完整性的一部分」.
Deliberately not done here, per that same ruling:
The token ratchet, and the arithmetic
check-skills-token-ratchetis shrink-only per file andskills/objectstack-ui/SKILL.mdhad 12 tokens of headroom (25113 / 25125) — roughly 48 bytes, against a table row of ~200. The gate names two ways forward: pay by genuine deletion in the same file, or raise the ceiling "in a PR whose body quotes a maintainer ruling authorizing it". This PR does both, taking the deletion first so the raise is as small as it can honestly be.In bytes, which is what the
ceil(utf8 bytes / 4)convention divides:25113 → 25143 tokens. The existing 12 tokens of headroom absorb part of that, so the ceiling moves 18 (25125 → 25143) and lands at zero headroom — the next token in this file is paid for by deleting one, exactly as before.
The deleted sentence is
Reports bind the same way (dataset + rows + values + runtimeFilter).It sat one line below a sentence that already names reports among the surfaces that bind a dataset and select named dimensions and values, so it restated report binding a second time inside its own paragraph; the only fact unique to it,runtimeFilter, is authored and explained in § Report Configuration below it. It is genuine deletion, not a re-wrap — a re-wrap moves no tokens and pays nothing.The authorizing ruling is the one quoted above, and the raise follows the two precedents already in that table (
objectstack-automation12643 andobjectstack-pm-dispatch14391), which likewise carry the maintainer's words in the row comment and the arithmetic in the raising PR's body.check-ratchet-remedy-authoritystays green: the⛔ MAINTAINER-ONLYcompliance token is untouched.Verification
Union derived mechanically on the final head
0e8a4e97(node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack; the derivation is byte-identical before and after the commit) — 39 families across 29 workflow files, all green:check:pm-governed-merges,check:skill-frame-sync,check:skill-identifier-liveness,check:skill-compatibility,check:corpus-claim-drift,check:doc-authoring,check:docs-single-h1,check:role-word.turbo run buildover@objectstack/spec,@objectstack/lint,@objectstack/formula,@objectstack/client-react,@objectstack/clientall four are green:check:doc-formula-expressions— 22 record-scoped formula example(s) across 427 files / 1451 TS blocks judged cleancheck:doc-security-posture— 26 ObjectSchema.create example(s) … carry an os validate-clean security posturecheck:docs— 230 generated files in sync with packages/speccheck:skill-examples— 260 prose examples type-check across 3 surface(s)check-test-completenessgrades a savedturbo run testlog and exits 3 when handed none. Its own text says this branch is unreachable in CI and "it is not a red, and there is nothing here to fix."Ratchet family re-run on the committed head
0e8a4e97, after the last commit rather than before it:Bundle total moves 186520 → 186550 tokens.
Every exit code above was captured before any pipe, and each verdict is quoted from the line the gate printed itself.
Changeset
None, and
skip-changesetapplied — this diff publishes nothing from any package. That follows the merged sweep-flight precedent exactly: #13833, #13861, #13867 and #13891 each touchedskills/**only, each carrieddocumentation+skip-changeset, and none carried a changeset file.Scope
Draft, and governed on both counts (
skills/**is a governed surface; the ratchet row is a maintainer-authority surface) — human merge or the pinned-approval queue path, never a self-flip to ready.Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
Generated by Claude Code