Commit b398ad2
fix(objectql,metadata-protocol): a static
* wip(objectql,metadata-protocol): move the create-side static readonly strip into engine.insert
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* test(objectql,metadata-protocol): pin the in-engine create-side readonly strip and the ingress delegation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* test(objectql): the referential-integrity narrowing, split into its platform and author halves
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* fix(lint,metadata-protocol): drop the superseded INSERT-exempt premise; pin the reasoned refusal
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* docs(objectql,metadata-protocol,spec,lint): retire the ingress-strip prose; changeset for the create-side move
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* fix(objectql,rest): the create-path strip line states only what is true of a create
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* wip: suite runs
* chore(objectql,lint,scripts): self-contained prose, engine-double pin, doc-authoring baseline burn-down
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* docs(permissions): the system-context census loses the ingress row it no longer has
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* test(objectql): pin the create-path preserveAudit line by its remedy, not by an issue id
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* chore: regenerate the system-context census line anchors after merging origin/main
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* chore(changeset): answer the ADR-0087 disposition and re-derive the released package list
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* test(example-todo): bind the app's own hook in the recurrence harness and drop the stale completed_date create-seed
The harness claimed to boot the same stack as task-completion-trigger.test.ts
while binding no hooks, so task.hook.ts's beforeUpdate completion stamp never
ran in this file -- which is why it still carried a completed_date CREATE-seed
its sibling deleted when that stamp shipped. The seed was also a non-system
caller writing a readonly, server-owned column on create, which the engine now
strips. Binding the app's hook lets both completion cases travel the app's real
user path; the one fixture that must START completed seeds under isSystem,
the documented remedy. No assertion changed, nothing skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* docs(example-todo): the sibling's measurement table is history, not a live create-side escape
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* chore(docs): re-anchor the system-context census after merging origin/main
The `os-regen` merge driver declined to text-merge
`content/docs/permissions/system-context.mdx` and kept the branch's side, so
main's three re-anchorings of `domains/actions.ts` were dropped by the merge
commit. Regenerated from the merged tree with
`pnpm gen:system-context-census`, which re-derived exactly those three
anchors (404 -> 414 twice, 411 -> 421).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* fix(metadata-protocol,lint,docs): patch round — wire batchData upsert-create, retire every surviving "INSERT is exempt" statement, fix five census cross-references
Contract review 5548671173 (FAIL, patch round), items 1-4:
1. Every surviving statement of the superseded "INSERT is engine-exempt /
the ingress strips on create" premise is corrected to the 2026-09-03
ruling (option C): the verdict's five sites, plus the same statement
found by sweep in validate-flow-node-writes.test.ts, the kernel
contracts page, fields.mdx, the strictReadonlyWrites contract docblock,
the readonly liveness verdict (evidence pointed at the deleted ingress
strip), the authz conformance matrix row and two test headers. The
verdicts of the green control cases are unchanged; their justifications
now name the scan gap (#15394) instead of an exemption.
2. system-context.mdx: the five prose row references the 22→21 … 65→64
renumbering left behind (50→49, 30→29 twice, 22→21, 34→33), each checked
by eye against the renumbered table; the census gate reads none of them.
3. batchData's two upsert-create engine.insert calls forward onFieldsDropped
and hang the merged events on the row result exactly as case 'create'
does; pinned for both arms in protocol.readonly-insert.test.ts, the
firing control enumerates six calls, and cloneData's deliberate absence
is pinned against CloneDataResponseSchema (no droppedFields member).
4. Changeset body: the metadata-protocol bullet names which faces report
droppedFields and why cloneData does not; the lint bullet is true of all
three rules. Levels, BREAKING banner and ADR-0087 disposition unchanged.
origin/main is deliberately not merged this round; the p0 on engine.ts
(#15225) lands first and a separate merge round follows it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* test(objectql): rule-validator pin no longer justifies itself with the superseded insert exemption
The runtime-owned helper's "leaves author-declared readonly fields alone"
case kept its verdict but stated as its reason that the engine is not where
the static-readonly insert strip lives. Since the 2026-09-03 ruling it is;
the case now says why the verdict still holds (a separate pass with its own
gate, and preserveAudit must not leak across).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* chore(docs,qa): re-anchor the system-context census after the engine.ts note grew; close a string literal in the authz matrix
check-system-context-census --fix rewrote 9 line anchors (pure line rot: the
insert() standing note gained seven lines); the gate reads OK — 105 / 19 / 44
afterwards. The authz conformance matrix row gained an apostrophe inside a
single-quoted string in the previous commit; rephrased.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* docs(spec,rest,objectql,mcp,qa,scripts): the deleted ingress strip is no longer stated as live in schema text, code notes, test titles, the census gate's row annotations or the authz matrix
Patch round R3 on the contract re-review (5549250610), items 1-3 and 5. Prose only;
no behaviour change, no test deleted or skipped.
- N2 (a)-(e): the `preserveAudit`, `CreateDataResponseSchema.droppedFields`,
`CreateManyDataResponseSchema.droppedFields` and `BatchOperationResultSchema.droppedFields`
`.describe()` strings and the `CloneDataResponseSchema` TSDoc now state the ruled
state: the static `readonly` strip runs inside `engine.insert`, after `beforeInsert`,
`isSystem`-gated; the DataProtocol ingress copy is deleted. The generated
`content/docs/references/**` rows follow in the next commit via `check:generated --fix`.
- N2 (f)-(k): `rest-server.ts` batch-route note keeps the routing reason on what the
ingress still owns (object-existence gate, #7823 response strip, `droppedFields`
relay) and attributes the platform-object carve-out to the engine, where it lives
(`staticReadonlyInsertSubject`); the #3431 header note; `rule-validator.ts`'s
second-consumer sentence names `staticReadonlyInsertSubject`; the mcp stdio bridge's
divergence list drops the readonly strip and says why it is closed; two test
comments/titles in `engine-autonumber-runtime-owned.test.ts` and one title in
`rest-dropped-fields.test.ts`.
- N3: the seven `why` rows in `check-system-context-census.mjs` re-derived against the
head table (24->23 x2, 22->21 x2, 25->24, 34->33, 60->59). The gate never parses them.
- N4: the authz matrix row states the two mechanisms - a system context for identity
provisioning; the `sys_`/`managedBy` carve-out for the metadata repository's
`sys_metadata_history.recorded_by` provenance row - and re-derives "event-log
cursors" by name as `sys_metadata_history.event_seq` (same row, same mechanism).
Issue-id multiset of the row is byte-identical for the prose-id ledger.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* chore(docs): regenerate the reference rows the describe edits moved; re-anchor the system-context census after the mcp bridge note grew
`pnpm --filter @objectstack/spec build && pnpm --filter @objectstack/spec check:generated --fix`
reported exactly one stale artifact (`content/docs/references/**`) and regenerated it with
`gen:docs`: 12 rows of `references/data/data-engine.mdx`, one of
`references/kernel/execution-context.mdx`, and the `droppedFields` rows of
`references/api/protocol.mdx` and `references/api/batch.mdx`. A second `check:generated`
answers "All 15 generated artifacts are up to date" (fixed point); `check:api-surface`
answers "public API surface + factory signatures unchanged".
`check-system-context-census --fix` re-anchored one line (`stdio-data-bridge.ts:246` -> `:250`,
the header note in that file grew by four lines); the gate is 0 and a second `--fix`
rewrites nothing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* docs(spec,objectql,service-settings): the three PUBLISHED sites that still stated the superseded readonly-on-INSERT contract now state the ruled one
Maintainer ruling on E3 (2026-09-05, 「已发布必修,其余立卡」): published surfaces
are fixed in the round, non-published residue is carded. Measured against the
built dist, three of the third verdict's nine N5 sites reach a published
`.d.ts` and are corrected here:
- packages/spec/src/security/public-form.ts — TSDoc on the exported
PUBLIC_FORM_SERVER_MANAGED_FIELDS (dist/security/index.d.ts): the anonymous
surface no longer rests on "the static-readonly strip only covers UPDATE", and
the authenticated-write example no longer says an insert may seed readonly
columns; a non-system insert is stripped inside engine.insert since the
2026-09-03 ruling, an import seeds read-only columns only under a system
context (preserveAudit is UPDATE-only).
- packages/objectql/src/readonly-strict-errors.ts — the `operation` property
TSDoc of the exported ReadonlyFieldRejectedError (dist/index.d.ts): an INSERT
refusal is about a runtime-owned value OR, since the ruling, a static readonly
value from a non-system caller. buildRefusalMessage is untouched; the module
docblock at the top of the file reaches no published artefact and is carded.
- packages/services/service-settings/src/settings-service.ts — the upsertRow
docblock (dist/index.d.ts and dist/index.js): a sys_setting insert stays
outside the strip because the object is sys_-prefixed and engine-owned
(staticReadonlyInsertSubject's carve-out, #15719), not by the superseded row.
The changeset adds '@objectstack/service-settings': patch so the corrected
.d.ts ships. No behaviour change; no test touched.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
* docs(permissions): re-anchor the system-context census on the merged tree
`pnpm gen:system-context-census` on the merge commit. The first run refused
engine.ts (16 distinct page anchors vs 15 anchorable lines) because row 20
carried the branch tree's coordinate for the INSERT `isSystem` site while the
validation-row range carried main's coordinate for the same line; putting
row 20 on main's coordinate (the driver's "take either side") made the page
one coordinate system, after which the rerun rewrote 11 engine.ts anchors and
refused zero files. `pnpm check:system-context-census` is green: 106 sites in
19 packages across 44 files, 140 anchors resolve, 27 declared non-read.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
---------
Co-authored-by: Claude <noreply@anthropic.com>readonly field is stripped from a non-system INSERT inside engine.insert, and the boundary copy is deleted (#15395)1 parent 8c7b239 commit b398ad2
52 files changed
Lines changed: 1840 additions & 894 deletions
File tree
- .changeset
- content/docs
- automation
- data-modeling
- kernel/contracts
- permissions
- protocol/objectql
- references
- api
- data
- kernel
- docs/qa/platform-checklist/areas
- examples/app-todo/test
- packages
- lint/src
- mcp/src
- metadata-protocol/src
- objectql/src
- integrity
- validation
- qa/dogfood/test
- rest/src
- services
- service-automation/src/builtin
- service-settings/src
- spec
- liveness
- src
- api
- contracts
- data
- kernel
- security
- scripts
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
252 | 252 | | |
253 | 253 | | |
254 | 254 | | |
255 | | - | |
| 255 | + | |
256 | 256 | | |
257 | | - | |
| 257 | + | |
258 | 258 | | |
259 | 259 | | |
260 | 260 | | |
261 | 261 | | |
262 | 262 | | |
263 | 263 | | |
264 | | - | |
| 264 | + | |
265 | 265 | | |
266 | 266 | | |
267 | 267 | | |
268 | 268 | | |
269 | 269 | | |
270 | 270 | | |
271 | | - | |
| 271 | + | |
272 | 272 | | |
273 | 273 | | |
274 | 274 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
316 | 316 | | |
317 | 317 | | |
318 | 318 | | |
319 | | - | |
| 319 | + | |
320 | 320 | | |
321 | 321 | | |
322 | 322 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
303 | 303 | | |
304 | 304 | | |
305 | 305 | | |
306 | | - | |
| 306 | + | |
307 | 307 | | |
308 | 308 | | |
309 | 309 | | |
310 | 310 | | |
311 | | - | |
312 | | - | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
313 | 314 | | |
314 | 315 | | |
315 | 316 | | |
| |||
366 | 367 | | |
367 | 368 | | |
368 | 369 | | |
369 | | - | |
370 | | - | |
371 | | - | |
372 | | - | |
373 | | - | |
374 | | - | |
375 | | - | |
376 | | - | |
377 | | - | |
378 | | - | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
379 | 389 | | |
380 | 390 | | |
381 | | - | |
382 | | - | |
383 | | - | |
384 | | - | |
385 | | - | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
386 | 397 | | |
387 | 398 | | |
388 | 399 | | |
| |||
0 commit comments