Repository navigation
fix(skills): objectstack-platform — a seeded sys_user row lands as an account-less directory row, it is not refused (#26302 follow-up) - #26448
Conversation
…comes, not a refusal the runtime never makes 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 <noreply@anthropic.com>
…rom 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 <noreply@anthropic.com>
Contract reviewReviewed at 2026-10-27T04:15Z — independent contract review of PR #26448 (card #26302 follow-up, Served-tier: Landing state when read (2026-10-27T04:14Z): ① Derived judgments(a) The reworded sentence against the runtime — the first record's FAIL item
(b) Cuts — none in this PR; the four cuts of #26420 and their surviving homes are unchanged and already judged. (c) Ratchet rows pinned at the measurement; ruling quoted
(d) Eval
(e) Scope and readings
(f) PR body
(g) Report, claim, commits
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS — the FAIL item of record 6433051864 is repaired exactly as ordered: the sentence now states the measured behaviour (directory row with no account, no sign-in), the ADR citation and the eval's "(refused)" are gone, both ratchet rows are re-pinned at the recomputed measurement (5997 / 1469, headroom 0) with delta comments and the ruling quoted in the body, the diff is the three files and nothing else, and the body carries the readings. Every other finding of the first record stands unchanged. Generated by Claude Code |
维护者速读改了什么:把 #26420 刚合进 objectstack-platform 技能包的那一句改对——种子 席位核对ACCEPT ·
Generated by Claude Code |
…ide #26446) PR #26448 went dirty after #26446 (d1a31d0) raised the objectstack-automation rows of scripts/check-skills-token-ratchet.mjs beside the objectstack-platform rows this branch re-pins. Resolved by keeping both sides: main's sibling rows and this card's rows; nothing else conflicted. check:skills-token-ratchet exit 0, --self-test exit 0 (79 cases). Claude-Session: https://claude.ai/code/session_01JQwxbX1XjSzpntF9n85TgB Co-authored-by: Claude <noreply@anthropic.com>
席位核对ACCEPT (addendum, pinned to the merge head) · Generated by Claude Code |
Requested by Warren · project thread
Fixes #26302
Clause-②: no
Metadata-protocol: none
维护者速读
demoStaffand when to pick it overdevLogins#26420 刚合并进 objectstack-platform 技能包的那一小节里写错的一句改对:种子里写的sys_user行不是「被拒(ADR-0092)」,而是落成一条没有账号、谁也登不进的目录行;eval 7 的括号同改。两行天花板按实测重钉(5981→5997、1458→1469,headroom 0),注释写成相对 main 的增量。demoStaffand when to pick it overdevLogins#26420 的合同复核(PR 评论 6433051864)判 FAIL 就在这一句——种子写入走系统上下文,绕过 ADR-0092 的身份写保护,运行时测试钉住了这行会落库;队列在复核贴出前已把 skills(objectstack-platform): teachdemoStaffand when to pick it overdevLogins#26420 合进 main,所以这是同一张卡的补丁轮。skills/objectstack-platform/SKILL.md第 445–447 行那一句;②scripts/check-skills-token-ratchet.mjs两行(5997 / 1469)及其增量注释;③ eval 7 的expected_output。node scripts/check-skills-token-ratchet.mjs—— 全绿,objectstack-platform 的 SKILL.md 与 eval 文件 headroom 都是 0。skills/**是发布面)或「Merge when ready」。What changes
The patch round the contract review of PR #26420 ordered (PR comment 6433051864, VERDICT FAIL, ①(a) item 1). That PR landed on
mainas75afeffdwith the sentence in it, so this is a follow-up on the same card:skills/objectstack-platform/SKILL.md— the opening reason of Demo accounts —demoStaffvsdevLoginsnow says what the platform does: "asys_userrow written throughdatalands as a directory row with no account, so nobody can sign in as it". The former "is refused (ADR-0092)" was copied from thedemo-staff.zod.tsTSDoc and is false against the runtime: seed inserts run underSEED_WRITE_EXECUTION_CONTEXT(isSystem: true), the ADR-0092 identity write guard bypasses system-context writes (identity-write-guard.tsisUserContextWrite, pinned by its test), andapp-plugin.seed.test.tspins adata: [{ object: 'sys_user' }]row being inserted;dev-admin-seed-gate.tsmeasured the result as "a directory row with no account". The ADR citation is dropped.skills/objectstack-platform/evals/config-plugins-ops.json— eval 7's expected output says "(it lands as a directory row nobody can sign in as)" instead of "(refused)". Assertions unchanged.scripts/check-skills-token-ratchet.mjs— the twoobjectstack-platformrows re-pinned at the new measurement, each with a delta comment under the record that landed in skills(objectstack-platform): teachdemoStaffand when to pick it overdevLogins#26420.The spec prose that misled the section (
demo-staff.zod.tslines 14–16, and thedev-login.zod.tsguidance that tells an author to seed the user indata) is card #26424, filed by the seat; not touched here.Why
A published teaching that states a refusal the platform does not perform sends an AI author to expect a load-time failure where the row silently lands dead — the worse outcome, and exactly the "who pays" card #26302 names.
Line budget (
skills/**is a published surface)Whole-file, before → after, lines (before =
mainat75afeffd):skills/objectstack-platform/SKILL.mdskills/objectstack-platform/evals/config-plugins-ops.jsonWhole-package (
SKILL.md+references/**/*.md+rules/**/*.md): 2107 → 2108 (+1; the seven other.mdfiles are untouched;references/_index.mdgenerator-owned, 41).Token ratchet — maintainer ruling A, delta from
mainSame ruling as #26420 (the maintainer's tap on the seat thread's decision card 「skills 修复卡的教学和 eval 都撞 token 天花板,怎么付?」, 2026-10-27T01:21Z, verbatim and untranslated: 「A:先削重复,余额按实测提高」). Nothing duplicated was added, so there is nothing to cut; the remainder is the rewording itself:
mainSKILL.md(priced text, minus the 20-byte stamp line)evals/config-plugins-ops.jsonBoth rows pinned AT the measurement (headroom 0). No other row is touched; the diff against
mainis these three files only.Tests
No TypeScript changed; the reworded sentence is prose. The six-shape
defineStackprobe from #26420 still describes the schema (unchanged); the reworded reason is read offidentity-write-guard.ts,execution-context.zod.ts,app-plugin.seed.test.tsanddev-admin-seed-gate.tsas above. Dogfood battery: n/a — no!in the title and no(narrowing)arm.Acceptance notes
Fixes #26302because the seat reopened the card for this patch round; the rest of skills(objectstack-platform): teachdemoStaffand when to pick it overdevLogins#26420's review passed and is not re-done here.mainat75afeffd(GitHub deleted the merged head branch), so the history ismain+ two commits; no force-push.Verification
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon the branch tree at head198e492d(54 families, the same set as #26420), each command run locally with its exit code captured before any pipe, then reconciled.dispatch-gates --ranat head198e492d: 54 derived families accounted for — 53 run (exit 0), 1 NOT-MEASURED, 0 UNRUN. The one NOT-MEASURED ispnpm check:dual-build-cjs-loads, recorded exit 3 (PREREQUISITE NOT MET: it needs every package'sdist), so CI'sBuild Coreis its reading.Readings
node scripts/check-skills-token-ratchet.mjsexit 0 — "81 authored bundle file(s) within their ceilings";objectstack-platform/SKILL.md5997 / 5997 (headroom 0),evals/config-plugins-ops.json1469 / 1469 (headroom 0);--self-testexit 0 (79 cases).pnpm --filter @objectstack/spec check:skill-docsexit 0 ("Skill docs in sync");check:skill-refsexit 0 ("9 generated files in sync with packages/spec");check:skill-examplesexit 0 ("264 prose examples type-check across 3 surface(s)"); the client closure built underscripts/pm/os-verify-lock.sh(slotissue-26302), VERDICT command-exit 0 (246 s held).198e492d, includingpnpm check:pm-dispatch-gates(run detached),pnpm --filter @objectstack/lint run check:doc-formula-expressionsandpnpm check:lean-entry-closure.test/typecheck(no TypeScript changed);test:repo,pnpm lintand the whole-tree scans are CI's.Human Minimum
packages/specholds no runtime logic. (no schema touched)pnpm lintis CI's whole-tree run.main, one pull request.skills/**has nopackage.json;skip-changeset); both declaration lines are above.packages/specnot touched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code