From 0a60c270ea1f342ebfa10c2a7c4889f5776df0dc Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 27 Oct 2026 03:38:22 +0000 Subject: [PATCH 1/2] docs(skills): objectstack-platform says what a seeded sys_user row becomes, not a refusal the runtime never makes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The contract review on the previous head found the section's opening reason false: a `sys_user` row written through `data` is not refused — seed writes run as the system context and bypass the identity write guard — it lands as a directory row with no account that nobody can sign in as. The sentence and eval 7's parenthetical now say that; the two CEILINGS rows are re-pinned at the new measurement with their arithmetic rewritten. Claude-Session: https://claude.ai/code/session_01JQwxbX1XjSzpntF9n85TgB Co-authored-by: Claude --- scripts/check-skills-token-ratchet.mjs | 22 +++++++++---------- skills/objectstack-platform/SKILL.md | 9 ++++---- .../evals/config-plugins-ops.json | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/scripts/check-skills-token-ratchet.mjs b/scripts/check-skills-token-ratchet.mjs index 9bd4258cd2f..7233686c098 100644 --- a/scripts/check-skills-token-ratchet.mjs +++ b/scripts/check-skills-token-ratchet.mjs @@ -431,7 +431,7 @@ export const CEILINGS = new Map([ // decision tables at 487 lines. // 5833 -> 5828: A2′ — the release-stamp line left the count (see // STAMP_LINE_REPIN); the file's count fell by the same 5, headroom unchanged. - // 5828 -> 5981 (card #26302, the objectstack-platform row of the skills gap + // 5828 -> 5997 (card #26302, the objectstack-platform row of the skills gap // audit): the Seed Data section gains `demoStaff` against `devLogins` — a // seed deals records to people and cannot create one, so the people are // declared in `demoStaff` and `os dev` creates the accounts (position and @@ -447,11 +447,11 @@ export const CEILINGS = new Map([ // sequence's "(see Ports & networking)" aside and the two cheat-sheet port // comments (the Port resolution paragraph says both). Arithmetic in bytes: // on `origin/main` the priced text was 23294 bytes (5824 tokens, headroom 4); - // the cuts remove 309 bytes and the section adds 939, so the LANDED priced - // text is 23924 bytes -> 5981 tokens: the 4 tokens of headroom are absorbed - // and the ceiling moves 5828 -> 5981 (+153). Pinned AT the measurement. - // ceil(($(wc -c < skills/objectstack-platform/SKILL.md) - 20) / 4) == ceil(23924 / 4) - ['skills/objectstack-platform/SKILL.md', 5981], + // the cuts remove 309 bytes and the section adds 1000, so the LANDED priced + // text is 23985 bytes -> 5997 tokens: the 4 tokens of headroom are absorbed + // and the ceiling moves 5828 -> 5997 (+169). Pinned AT the measurement. + // ceil(($(wc -c < skills/objectstack-platform/SKILL.md) - 20) / 4) == ceil(23985 / 4) + ['skills/objectstack-platform/SKILL.md', 5997], // `skills/objectstack-pm-dispatch/SKILL.md` (9708) and its // `rules/dev-template.md` (1838) left this table on 2026-09-10 with the files: // the maintainer deleted the published PM skill whole (verbatim: @@ -760,17 +760,17 @@ export const CEILINGS = new Map([ // is the whole addition; pinned AT the measurement, zero headroom. The // raising PR's body carries the same arithmetic. ['skills/objectstack-i18n/evals/bundles-locales-coverage.json', 1451], - // 1211 -> 1458 (card #26302): one eval for a demo whose seed names people — + // 1211 -> 1469 (card #26302): one eval for a demo whose seed names people — // expected: both in `demoStaff` with a declared `position` / // `permissionSets`, created by `os dev`; NO `role:` alias and NO platform // set such as `admin_full_access`. Same ruling as the `SKILL.md` row above // (2026-10-27, tap A: 「A:先削重复,余额按实测提高」); the file's six fixtures // share no sentence, so there was no duplicate to cut (0 bytes). On // `origin/main` the file was 4842 bytes (1211 tokens, headroom 0); the - // fixture adds +989 bytes, so the LANDED file is 5831 bytes -> 1458 tokens, - // ceiling +247, pinned AT the measurement. - // ceil($(wc -c < skills/objectstack-platform/evals/config-plugins-ops.json) / 4) == ceil(5831 / 4) - ['skills/objectstack-platform/evals/config-plugins-ops.json', 1458], + // fixture adds +1031 bytes, so the LANDED file is 5873 bytes -> 1469 tokens, + // ceiling +258, pinned AT the measurement. + // ceil($(wc -c < skills/objectstack-platform/evals/config-plugins-ops.json) / 4) == ceil(5873 / 4) + ['skills/objectstack-platform/evals/config-plugins-ops.json', 1469], ['skills/objectstack-query/evals/filters-pagination-search.json', 955], // 1505 -> 1789 (#26295): two eval prompts — list grouping with `orderBy`, and the copy hole // + `onSuccess` pair — +284 tokens in the file's shape; fixtures, nothing to delete, the diff --git a/skills/objectstack-platform/SKILL.md b/skills/objectstack-platform/SKILL.md index 4a212db40b3..9bba11f252f 100644 --- a/skills/objectstack-platform/SKILL.md +++ b/skills/objectstack-platform/SKILL.md @@ -443,10 +443,11 @@ definition: never write it by hand, and never hand-write a raw ### Demo accounts — `demoStaff` vs `devLogins` A seed deals records to people (`owner_id: 'Legal Counsel 1'`) but cannot -create one: a `sys_user` row in `data` is refused (ADR-0092). Declare the -people in `demoStaff`; `os dev` creates each account after the development -admin, signing in with the seed password (`--admin-password`, default -`admin123`) — an entry carries no `password`: +create one: a `sys_user` row written through `data` lands as a directory row +with no account, so nobody can sign in as it. Declare the people in +`demoStaff`; `os dev` creates each account after the development admin, +signing in with the seed password (`--admin-password`, default `admin123`) — +an entry carries no `password`: ```typescript demoStaff: [{ name: 'Legal Counsel 1', email: 'counsel1@example.com', diff --git a/skills/objectstack-platform/evals/config-plugins-ops.json b/skills/objectstack-platform/evals/config-plugins-ops.json index b5c9dca96cd..f25ed77b008 100644 --- a/skills/objectstack-platform/evals/config-plugins-ops.json +++ b/skills/objectstack-platform/evals/config-plugins-ops.json @@ -64,7 +64,7 @@ { "id": 7, "prompt": "Prepare a demo of our contracts app: the seed data assigns matters to 'Legal Counsel 1' and 'Paralegal 1', and the demo should open signed in as Legal Counsel 1.", - "expected_output": "Both people go in `demoStaff` — `name` exactly as the seed references them, `email`, and a `position` / `permissionSets` the stack itself declares — and `os dev` creates the accounts with the seed password (`admin123` by default): no `password` key, no `role:` alias, no platform set such as `admin_full_access`, and no hand-written `sys_user` seed row (refused). `devLogins` creates nothing: at most one entry naming Legal Counsel 1's address so the boot banner prints it. Notes that `os build` drops `demoStaff` and a production boot creates no demo account.", + "expected_output": "Both people go in `demoStaff` — `name` exactly as the seed references them, `email`, and a `position` / `permissionSets` the stack itself declares — and `os dev` creates the accounts with the seed password (`admin123` by default): no `password` key, no `role:` alias, no platform set such as `admin_full_access`, and no hand-written `sys_user` seed row (it lands as a directory row nobody can sign in as). `devLogins` creates nothing: at most one entry naming Legal Counsel 1's address so the boot banner prints it. Notes that `os build` drops `demoStaff` and a production boot creates no demo account.", "files": [], "assertions": { "must_contain": ["demoStaff", "position", "permissionSets", "os dev"], From 198e492de142495eae9ea9339445e66e4532f2e5 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 27 Oct 2026 03:50:18 +0000 Subject: [PATCH 2/2] docs(skills): the objectstack-platform ratchet rows read as a delta from main's values The two CEILINGS rows keep main's 5828 -> 5981 and 1211 -> 1458 records as they landed and add the follow-up's own line: 5981 -> 5997 (+61 bytes for the reworded reason) and 1458 -> 1469 (+42 bytes for eval 7's wording), each pinned at the measurement. Claude-Session: https://claude.ai/code/session_01JQwxbX1XjSzpntF9n85TgB Co-authored-by: Claude --- scripts/check-skills-token-ratchet.mjs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/scripts/check-skills-token-ratchet.mjs b/scripts/check-skills-token-ratchet.mjs index 7233686c098..b319921d3a7 100644 --- a/scripts/check-skills-token-ratchet.mjs +++ b/scripts/check-skills-token-ratchet.mjs @@ -431,7 +431,7 @@ export const CEILINGS = new Map([ // decision tables at 487 lines. // 5833 -> 5828: A2′ — the release-stamp line left the count (see // STAMP_LINE_REPIN); the file's count fell by the same 5, headroom unchanged. - // 5828 -> 5997 (card #26302, the objectstack-platform row of the skills gap + // 5828 -> 5981 (card #26302, the objectstack-platform row of the skills gap // audit): the Seed Data section gains `demoStaff` against `devLogins` — a // seed deals records to people and cannot create one, so the people are // declared in `demoStaff` and `os dev` creates the accounts (position and @@ -447,9 +447,15 @@ export const CEILINGS = new Map([ // sequence's "(see Ports & networking)" aside and the two cheat-sheet port // comments (the Port resolution paragraph says both). Arithmetic in bytes: // on `origin/main` the priced text was 23294 bytes (5824 tokens, headroom 4); - // the cuts remove 309 bytes and the section adds 1000, so the LANDED priced - // text is 23985 bytes -> 5997 tokens: the 4 tokens of headroom are absorbed - // and the ceiling moves 5828 -> 5997 (+169). Pinned AT the measurement. + // the cuts remove 309 bytes and the section adds 939, so the LANDED priced + // text is 23924 bytes -> 5981 tokens: the 4 tokens of headroom are absorbed + // and the ceiling moves 5828 -> 5981 (+153). Pinned AT the measurement. + // ceil(($(wc -c < skills/objectstack-platform/SKILL.md) - 20) / 4) == ceil(23924 / 4) + // 5981 -> 5997 (card #26302, the follow-up its contract review ordered): the + // section's opening reason reworded — a `sys_user` row written through + // `data` is not refused, it lands as a directory row with no account — +61 + // bytes, so the priced text is 23924 -> 23985 bytes -> 5997 tokens, ceiling + // +16, pinned AT the measurement. Same ruling, same arithmetic rule as above. // ceil(($(wc -c < skills/objectstack-platform/SKILL.md) - 20) / 4) == ceil(23985 / 4) ['skills/objectstack-platform/SKILL.md', 5997], // `skills/objectstack-pm-dispatch/SKILL.md` (9708) and its @@ -760,15 +766,20 @@ export const CEILINGS = new Map([ // is the whole addition; pinned AT the measurement, zero headroom. The // raising PR's body carries the same arithmetic. ['skills/objectstack-i18n/evals/bundles-locales-coverage.json', 1451], - // 1211 -> 1469 (card #26302): one eval for a demo whose seed names people — + // 1211 -> 1458 (card #26302): one eval for a demo whose seed names people — // expected: both in `demoStaff` with a declared `position` / // `permissionSets`, created by `os dev`; NO `role:` alias and NO platform // set such as `admin_full_access`. Same ruling as the `SKILL.md` row above // (2026-10-27, tap A: 「A:先削重复,余额按实测提高」); the file's six fixtures // share no sentence, so there was no duplicate to cut (0 bytes). On // `origin/main` the file was 4842 bytes (1211 tokens, headroom 0); the - // fixture adds +1031 bytes, so the LANDED file is 5873 bytes -> 1469 tokens, - // ceiling +258, pinned AT the measurement. + // fixture adds +989 bytes, so the LANDED file is 5831 bytes -> 1458 tokens, + // ceiling +247, pinned AT the measurement. + // ceil($(wc -c < skills/objectstack-platform/evals/config-plugins-ops.json) / 4) == ceil(5831 / 4) + // 1458 -> 1469 (card #26302 follow-up): eval 7's expected output says what a + // seeded `sys_user` row becomes instead of "(refused)" — +42 bytes, so the + // file is 5831 -> 5873 bytes -> 1469 tokens, ceiling +11, pinned AT the + // measurement. // ceil($(wc -c < skills/objectstack-platform/evals/config-plugins-ops.json) / 4) == ceil(5873 / 4) ['skills/objectstack-platform/evals/config-plugins-ops.json', 1469], ['skills/objectstack-query/evals/filters-pagination-search.json', 955],