From dc077e17239288fa5b24e4fe2a0e057872673a09 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 10 Sep 2026 05:35:02 +0000 Subject: [PATCH 1/2] skills(objectstack-ui): state the one-app-per-package cap in App Navigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The App Navigation section tells an author to `register under defineStack({ apps: [...] })` and stops there. Nothing in the published bundle says the array holds one entry: measured across `skills/`, the one-app rule appears 0 times in any spelling, while `defineStack` appears 54 times and `App.create` 3 — the zeros are readings, not an empty corpus. An agent authoring `*.app.ts` from this skill therefore has no reason not to write one app per audience, and finds out at `defineStack` load time, after the design is written. All three `ADR-0019` citations in the published bundle point at `0019-approval-as-flow-node`, so this one names its record explicitly. ⚠️ This overruns the published-skills token ratchet by 59 tokens (3874 against a ceiling of 3815, headroom measured at 0 before writing). The ceiling is deliberately NOT touched and nothing else is trimmed to pay for it — both are maintainer decisions. See the PR body. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU --- skills/objectstack-ui/SKILL.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/skills/objectstack-ui/SKILL.md b/skills/objectstack-ui/SKILL.md index d33297243f..25adeb49dd 100644 --- a/skills/objectstack-ui/SKILL.md +++ b/skills/objectstack-ui/SKILL.md @@ -160,6 +160,10 @@ An **App** groups objects, dashboards, reports, and custom pages into a structured navigation tree. Build with `App.create({...})` from `@objectstack/spec/ui` and register under `defineStack({ apps: [...] })`. +⛔ **Exactly one App per `type: 'app'` package** — `defineStack` refuses a +second at load, per ADR-0019 (app-as-consumer-unit) D3. More audiences are +`requiredPermissions`-gated groups **inside** that one app, never a second app. + ### Navigation Item Types | Type | Properties | Purpose | From 4f22acc38d72f9a34fceaacb9cd1c64dfde14543 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 13 Sep 2026 12:49:50 +0000 Subject: [PATCH 2/2] chore(gates): raise the objectstack-ui SKILL.md token ceiling to its landed count The one-app-per-package cap added to `skills/objectstack-ui/SKILL.md` sits 41 tokens over the shrink-only ratchet. The maintainer ruled on 2026-09-13 that this PR may grow the file; the ruling is quoted verbatim beside the row and in the PR body, which is the evidence bar the gate's header sets. Re-measured on the merged head rather than copied from the pre-merge CI run: `origin/main` deleted the `page` view-type row from the same file after that run, so the landed count is 3856 (15424 bytes), not the 3874 CI reported. The row is pinned AT that measurement, so it carries zero headroom. No other ceiling moves, and no text was re-wrapped or reflowed to buy tokens. Claude-Session: https://claude.ai/code/session_01NFSv55L8jzmE9yvi9UwZug Co-authored-by: Claude --- scripts/check-skills-token-ratchet.mjs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/scripts/check-skills-token-ratchet.mjs b/scripts/check-skills-token-ratchet.mjs index 8c9f2c6458..62a4702b29 100644 --- a/scripts/check-skills-token-ratchet.mjs +++ b/scripts/check-skills-token-ratchet.mjs @@ -371,7 +371,24 @@ export const CEILINGS = new Map([ // entry's landed count in the same PR, so the split banks its own shrink // instead of leaving 21,630 tokens of headroom behind for the next author. // Lowering is always legitimate (see the shrink-only section in the header). - ['skills/objectstack-ui/SKILL.md', 3815], + // 3815 -> 3856: the one-app-per-package cap, stated in App Navigation. The + // entry page taught an author how to declare an App but never that a + // `type: 'app'` package ships exactly ONE, so an agent authored a second App + // object and met the cap at `defineStack` load time instead of at authoring + // time — the published teaching is the only place that fact can reach them. + // No existing text is made redundant by it, so there was nothing in this + // file to delete to fund it. Maintainer ruling 2026-09-13, authorizing this + // raise, verbatim and untranslated: 「17310 允许增加」. + // Arithmetic, in bytes because that is what this convention divides. The + // addition is +234 bytes (15260 -> 15494, i.e. 3815 -> 3874, +59 tokens), + // which is the number the pre-merge CI run reported. `origin/main` then + // deleted the `page` row from the same file's view-type table (-70 bytes), + // so the LANDED file is 15424 bytes and the ceiling moves by 41, not 59. + // Pinned AT the measurement taken on the merged head — zero headroom, so + // the next token added here is paid for by deleting one from this file. + // Independently reproducible without running this script: + // ceil($(wc -c < skills/objectstack-ui/SKILL.md) / 4) == ceil(15424 / 4) + ['skills/objectstack-ui/SKILL.md', 3856], ['skills/objectstack-upgrade/SKILL.md', 8333], // -2 (was 8335) // ── the #12392 extension: the rest of the AUTHORED bundle ────────────────