docs(skills): readonly is stripped from any non-system write, not only an UPDATE payload - #15382
Draft
claude[bot] wants to merge 1 commit into
Draft
docs(skills): readonly is stripped from any non-system write, not only an UPDATE payload#15382claude[bot] wants to merge 1 commit into
readonly is stripped from any non-system write, not only an UPDATE payload#15382claude[bot] wants to merge 1 commit into
Conversation
…y an update The published catalog told application authors that a non-system write has a readonly field stripped from an UPDATE payload. As of the 2026-09-03 ruling the engine applies the same strip on the create path, so the sentence understated the rule on exactly the write where an author is most likely to seed a protected column. Both files say 'any non-system write' now, and the automation skill names create_record beside update_record and the step warning that reports the drop. Paid inside the token ratchet by deleting 'silently' -- which the same ruling made false: the drop is reported through droppedFields and a step warning. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
os-zhuang
approved these changes
Sep 4, 2026
Contributor
Author
|
Cross-link: the code half of #14147 is #15395 — engine + metadata-protocol + lint + service-automation. It is draft, labelled The sentence these files now carry is pinned by that PR, not by prose: Generated by Claude Code |
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.
Part of #14147 — the governed-prose half, landing separately by the ruling's own
instruction (comment 5522734749: the two
skills/**edits "are a governed surfaceand land as a separate draft PR requesting review from
os-zhuangandhotlong,human merge, cross-linked from the code PR").
⛔ Human merge. Not to be flipped ready, enqueued or auto-merged by an agent.
What changed, and why the old sentence is now false
The maintainer ruled on 2026-09-03 (option C, verbatim 「同意」, presented as
overturning their own 2026-07-24 "INSERT (all callers) exempt" row) that a static
readonlyfield is stripped from a non-system caller's INSERT payload insideengine.insert, by the samestripReadonlyFieldsthat already runs onengine.update. The published catalog described the strip as an UPDATE-payloadrule, which understated it on exactly the write where an author is most likely to
seed a protected column — a create.
skills/objectstack-data/SKILL.mdskills/objectstack-automation/SKILL.mdreadonlyfield from anupdate_recordpayload"readonlyfield from any non-system write —create_recordandupdate_recordalike … and the drop is named in the step's warnings"silentlyis deleted rather than reworded: the same ruling made it false. Anon-system create now reports the drop through
droppedFieldsand, in a flow,through the step's own warnings.
Ratchet accounting
New text is paid for by deleting text in the same file — never by re-wrapping.
skills/objectstack-data/SKILL.md(lines)skills/objectstack-automation/SKILL.md(lines)SKILL.md(lines)skills/objectstack-data/SKILL.md(tokens)skills/objectstack-automation/SKILL.md(tokens)The token ratchet is the one that gates (
check:skills-token-ratchet), and thedata skill is now 5 tokens under its ceiling rather than at it. An earlier draft
of this edit measured 10021 — 12 over — and was rewritten down rather than
granted a ceiling raise; ceilings here are shrink-only and MAINTAINER-ONLY.
Gates — per family, with exit codes
43 families derived from the actual change set with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, all runindividually. 40 exit 0, including every skills family:
check:pm-skill-ratchet0 ·check:skills-token-ratchet0 (run directly) ·check:skill-compatibility0 ·check:skill-frame-sync0 ·check:skill-identifier-liveness0 ·check:pm-governed-prose0 ·check:doc-authoring0 ·check:nul-bytes0 ·check:spec-changes0 ·check:partof-closing-keyword0 ·check:corpus-claim-drift0.Three did not measure, none of them a verdict on this diff:
check:doc-formula-expressions@objectstack/formulaunbuilt in this worktreecheck:react-declaration-paritycheck:published-readme-exportsdist/*.d.tsof packages this fresh worktree has not builtCI builds first and runs the farm exactly once, which is where these three get
their real reading.
Verification
The behaviour these two paragraphs now describe is pinned by the code PR, not by
prose:
packages/objectql/src/engine-insert-static-readonly-strip.test.ts(16cases, real ObjectQL) and
packages/services/service-automation/src/builtin/create-record-readonly-drop.test.ts(a real flow run whose
create_recordstep reports the drop, and whoserunAs: 'system'sibling still seeds the column).Generated by Claude Code