Uh oh!
There was an error while loading. Please reload this page.
skills(ui): split the entry into SKILL.md + rules/ under #14296 item 1 (package net −58 tokens, −0.17%) - #14658
Merged
Merged
Conversation
…okens) The 22,856-token entry file becomes a 3,821-token entry plus five `rules/*.md` files, converging objectstack-ui on the catalog's declared anatomy (`skills/README.md`, Skill anatomy) that data, platform and query already use. Text MOVES; it is not rewritten. The only text that is not a moved line is five file titles and five one-line pointers. Deleted, all of it restatement the reassembly exposes: UI-B-02 the forward reference from `## Dashboards` to "the Production Pattern section below" (-75), the re-introduction paragraph under the second dashboards heading (-33), and the duplicated Date Macros pointer blockquote (-69) -- the two dashboard sections, previously 780 lines apart, now share one home in `rules/dashboards.md`. UI-B-05 the prose prop list for the two react blocks (-53 -57 with its trailing clause), which restated the generated contract that the very next blockquote makes authoritative. `check:skill-identifier-liveness` Leg 2 binds three sections to this file BY PATH, so `## Report Types`, `### Action Types` and `### Navigation Item Types` keep their exhaustive tables in the entry while their bodies move -- one topic across two files, in three places. Nothing in that script changed. Ratchet: one row per new file, pinned at its landed count; the entry row re-locked 25445 -> 3821. No other row moves. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Sweeping every "above" / "below" in the new tree for a target that is no longer in the same file found three, all dead on arrival and all deleted rather than rewritten -- a dead pointer is removed text, not an occasion for new prose: SKILL.md "There is no `chart` report type ... (see the example below)" -- the report example moved to rules/dashboards.md. rules/navigation "assign a record `Page` (below)" -- Pages moved to rules/pages.md. rules/pages page type `list` "(see the iron rule above)" -- the iron rule moved to rules/navigation.md. -14 tokens. The three ratchet rows are re-pinned at the new landed counts so every objectstack-ui row keeps exactly zero headroom; package 33,957 -> 33,899, net -58. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Pure relocation, not an admission. The baseline is keyed by PATH, and the two
occurrences it already carried for `skills/objectstack-ui/SKILL.md` moved into
`rules/list-views.md` ("the tab-bar role") and `rules/navigation.md` ("semantic
roles") -- byte-identical lines, so `--update` reads the same two occurrences
at two new paths and drops the old row:
- "skills/objectstack-ui/SKILL.md": 2
+ "skills/objectstack-ui/rules/list-views.md": 1
+ "skills/objectstack-ui/rules/navigation.md": 1
The whole baseline diff is those three lines: no other file was re-baselined,
and the total is unchanged at 2, so the shrink-only ratchet is not weakened.
This is the case the gate's ratchet-DOWN remedy names, kept in its own commit.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
This was referenced Sep 2, 2026
os-zhuang
approved these changes
Sep 2, 2026
os-zhuang
marked this pull request as ready for review
September 2, 2026 22:48
os-zhuang
enabled auto-merge
September 2, 2026 22:48
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Sep 3, 2026
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 freeto 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.
Part of #14298
Ruling: "#14296 item 1 = A, comment 5507419465". Condition (a) was read at programme level by "#14568 = A, comment 5511939006" (director seat, verbatim reply 「同意」): the split PR itself must land token-neutral or negative, and the package arithmetic is carried by the programme.
The three conditions, with numbers
(a) Token-neutral or negative — measured -58.
node scripts/check-skills-token-ratchet.mjsbefore and after, at headd72e3dcc:SKILL.mdrules/*.md(5 new files)contracts/react-blocks.contract.json,references/react-blocks.md,references/_index.md)evals/Net -58 (-0.17%). Gross deletions -248, additions +190 (five file titles, one
## Detailed Rulesheading, five one-line pointers). Nothing in this PR is positive.Programme account for the package: round 1 #14338-2,585 + this split -58 + seam card #14559-5,352 = -7,995 against the pre-programme 36,542 = -21.9%.
(b) Ceilings. Five rows added, each pinned AT its landed count so every new file starts with exactly zero headroom; the entry row re-locked to its landed count. No other row changed.
skills/objectstack-ui/SKILL.mdskills/objectstack-ui/rules/actions.mdskills/objectstack-ui/rules/dashboards.mdskills/objectstack-ui/rules/list-views.mdskills/objectstack-ui/rules/navigation.mdskills/objectstack-ui/rules/pages.md(c) Not a channel for added prose — proved line by line, not asserted. Comparing the multiset of non-blank lines before (1,591) and after (1,586): 28 lines in the new tree are not lines of the old
SKILL.md, and not one of them is a new sentence — 5 file titles, 1## Detailed Rulesheading, 5 one-line pointers, 10 headings whose only change is a level shift or a deletion inside the heading text, and 7 lines whose only change is a rewritten relative link or a deleted dead clause. That is the entire set of text this PR authored. The check is reproducible from the diff.File map
## Configuring a List View·## Configuring Kanban Views·## Configuring Gantt Viewsrules/list-views.md## App Navigation(theApp.createexample) ·## Three Run Modes·## Record Presentationrules/navigation.md## Dashboards·## Dashboards (cont.)·### Report Configuration·## Analytics Cubesrules/dashboards.md## Pages — Lightning-Style Page Layouts·## Docs — Package Documentationrules/pages.md## Actions(body below### Action Types)rules/actions.md## View Types·## Detailed Rules·## App Navigationhead ·## Report Types·## CRM UI Blueprint·## Date Macros·## Actionshead ·## Common Pitfalls·## Verify your work·## ReferencesSKILL.mdFive files, not the audit's suggested nine — the brief says fewer is better, and two of the nine were folded deliberately:
rules/filter-tokens.mdwas not created because## Date Macrosis cross-cutting (list views, dashboards, reports, pages) and is the target of the package's only in-file anchors, so it stays in the entry;rules/master-detail.mdwas not created because### Master-Detail Formsis a routing ladder ("you almost never need a custom page or form config — prefer, in order"), which is exactly the kind of construct the entry keeps.Dashboards now have one home. The two sections that sat 780 lines apart are adjacent in
rules/dashboards.md, the second demoted to### KPI Widgets, Filters, Drilldownunder the first — which is what makes the three UI-B-02 deletions below dead text rather than a judgement call.Deletions, per finding
SKILL.md:554-558Dashboardshape withrefreshInterval, header actions, date range, global filters, widget options, and the period-over-period (compareTo) modifier; date bucketing comes from the bound dataset dimension'sdateGranularity(ADR-0021)."SKILL.md:1316-1317Dashboard) are first-class metadata. Beyond the basic widget layout shown above, the production-grade pattern uses:"SKILL.md:1381-1384SKILL.md:1029-1032ObjectFormhonorsobjectName/mode/recordId/formType/onSuccess/onCancel;ListViewhonorsobjectName/fields/onRowClick/navigation."SKILL.md## Report Typeschart:config (see the example below)"rules/dashboards.md(-6)rules/navigation.mdRecord PresentationPage(below)"rules/pages.md(-2)rules/pages.mdpage typelistinterfaceConfig(see the iron rule above)"rules/navigation.md(-6)Gross -248. No decision-changing construct was deleted, and nothing was deleted to reach a number — condition (a) is satisfied by the split being byte-conserving, not by these.
Every "above" / "below" in the new tree was swept for a target that left its file; those three were the only ones, and each is deleted rather than rewritten — a dead pointer is removed text, not an occasion for new prose.
The one-topic-two-files cost, declared
check:skill-identifier-livenessLeg 2 binds three sections toskills/objectstack-ui/SKILL.mdby path (report-types,action-types,navigation-item-types); a bound heading that leaves its file yields[stale-binding] … A renamed heading unbinds the assertion, so it fails here rather than quietly checking nothing, pinned by that script's own self-test. Nothing in the script was changed. So three topics are split across two files:## Report Typeskeeps its exhaustive table in the entry;### Report Configurationmoved torules/dashboards.md(promoted to##).### Action Typeskeeps its table in the entry; the rest of Actions moved torules/actions.md(headings shifted up one level).### Navigation Item Typeskeeps its table in the entry; theApp.createexample moved torules/navigation.md.That is a real legibility cost of the split as constrained, and it is the reason those three entry sections look thin.
Link rewrites
Three links crossed a directory boundary and were rewritten, following the
skills/objectstack-platform/rules/precedent:#date-macros--filter-placeholdersbecame../SKILL.md#date-macros--filter-placeholders, and./references/react-blocks.md/./contracts/react-blocks.contract.jsonbecame../references/…/../contracts/….Not in this PR
contracts/react-blocks.contract.json, 5,352 tokens) belongs to [Decision] Skills optimization program — batch 1 (4 items): new-file ceilings for splits · planned-eval stubs · react-blocks double rendering · published pm-dispatch scope #14296 item 3 and is the spec lane's seam card Seam (spec lane, ruled):gen:react-blocksstops emittingskills/objectstack-ui/contracts/react-blocks.contract.json— the markdown rendering becomes the single AI-facing output (#14296 item 3 = A) #14559. Generated output is untouched here.evals/is untouched; the real fixture stays.premise_false: none — no audit finding was skipped this round for a false premise.Gates
Head
d72e3dcc. Family re-derived on the final commit withnode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(25 commands, from the script's own merge-base changeset — not a hand-written path list), and the whole union re-run on that head underscripts/pm/os-verify-lock.shwithOS_VERIFY_LOCK_SLOT=issue-14298-r2. Every exit code captured before any pipe. 31 ran, 30 exit 0.The six beyond the derivation, each owed for a named reason:
check-skills-token-ratchet.mjs --self-test(this PR edits that gate, so its own self-test is owed on top of the derived family — 64 cases pass),check:skill-examplesandcheck:skill-refs(the dispatch named them;skills/**changed),check:doc-anchorsandcheck:published-readme-links(links crossed a directory),check:nul-bytes(any edit).The verdicts that answer this PR's specific risks, quoted from the gates themselves:
check:skill-examples— "256 prose examples type-check across 3 surface(s) — every marked block parsed, so tsc ran the SEMANTIC pass on all of them". All 15os:checkmarkers travelled with their fences (0 in the entry, 15 across the five rules files; 15 before, 15 after) and the marked blocks still compile from their new files.check:skill-identifier-liveness— "Leg 1: 465 citation(s) over 46 published file(s) … Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)". The three path-keyed ui bindings still resolve insideSKILL.md.check:published-readme-links— "176 outbound link(s) across 60 published markdown file(s) … 1 anchor(s) verified, 103/103 relative target(s) found". The new../SKILL.md#date-macros--filter-placeholdersand../references/…links resolve.check:doc-anchors— "295 internal #fragment link(s) across 409 source file(s) all resolve to a real heading".check:skill-docs/check:skill-refs— both in sync; no generated file needed regenerating, and none was touched.check:role-word— green after the baseline re-point (its own commit; see below).node scripts/check-skills-token-ratchet.mjs— "36 authored bundle file(s) within their ceilings", every objectstack-ui row at exactly zero headroom.check:test-completenessexited 3, which is NOT MEASURED, not a failure — the gate says so itself: "Nothing was measured: this gate exited before parsing a single summary line … ⛔ It is NOT a finding". Recorded as such rather than counted green.check:role-wordneeded the baseline re-pointed, and that is a pure relocation. The baseline is keyed by PATH; the two occurrences it already carried forSKILL.md("the tab-bar role", "semantic roles") moved intorules/list-views.mdandrules/navigation.mdas byte-identical lines.--updatetherefore produced a three-line diff — one row removed, two added, total unchanged at 2 — and re-baselined no other file. It is in its own commit. The count did not move, which is what the brief asked to be shown.Repo-wide
pnpm lintwas not run; the narrowing is measured, not assumed. (1) The population comes from eslint's own config, not a guess: everyfilesglob ineslint.config.mjsis{ts,tsx,mts,cts,js,jsx,mjs,cjs}, no markdown plugin is configured, and.mdappears in no glob — so the six markdown files in this diff are outside eslint's population entirely. (2) Counted from--format json: of the eight changed files eslint claims exactly one,scripts/check-skills-token-ratchet.mjs, at 0 errors / 0 warnings;role-word-baseline.jsonreports "File ignored because no matching configuration was supplied". (3) Invariance for untouched files: the config configures noprojectServiceand noproject, so type-aware linting is off and nothing in this diff can move the verdict of a file it does not contain. CI's Lint job runs the full sweep regardless.🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code