From 03797673140f01fc196bdab2fd66a0fcf8c7df71 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 4 Sep 2026 13:38:50 +0000 Subject: [PATCH] docs(skills): readonly is stripped from any non-system write, not only 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 Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ --- skills/objectstack-automation/SKILL.md | 5 +++-- skills/objectstack-data/SKILL.md | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/skills/objectstack-automation/SKILL.md b/skills/objectstack-automation/SKILL.md index 8824aa3f97..7dd60c059c 100644 --- a/skills/objectstack-automation/SKILL.md +++ b/skills/objectstack-automation/SKILL.md @@ -233,8 +233,9 @@ run reports success. `objectstack validate` names the offending template. > **Writing a `readonly` field? Set `runAs: 'system'`.** `readonly: true` > governs the end-user surface: under the default `runAs: 'user'`, the engine -> **silently strips** a `readonly` field from an `update_record` payload -> — the step reports success but the value never lands. A flow that +> **strips** a `readonly` field from any non-system write — `create_record` and +> `update_record` alike — the step reports success but the value never lands, +> and the drop is named in the step's warnings. A flow that > maintains a `readonly` field (approval stamps, conversion flags, SLA > markers, rollups) must run `runAs: 'system'`, the trusted-writer channel. > `os validate` / `os build` fail a `runAs:'user'` `update_record` that writes diff --git a/skills/objectstack-data/SKILL.md b/skills/objectstack-data/SKILL.md index bfe1c3037c..23ba8b35a3 100644 --- a/skills/objectstack-data/SKILL.md +++ b/skills/objectstack-data/SKILL.md @@ -271,7 +271,7 @@ export const Invoice = ObjectSchema.create({ incoming changes when the predicate is `TRUE`. - **`readonly: true` governs the end-user surface, not trusted system writers.** A non-system write (REST/UI, and any `runAs:'user'` flow — the default) has - the field **silently stripped** from an UPDATE payload; the write reports + the field **stripped** from any non-system write; the write reports success but the value never lands. System-context writes — `runAs:'system'` flows, system hooks, seeds, imports, migrations — are exempt and DO write it. So the pattern "users can't edit this, but automation