Skip to content

Commit 541636e

Browse files
committed
docs(spec): name the recording comment and fix three prose claims (review F1-F4)
Four prose corrections from the delta contract review's non-blocking findings. No behaviour change, no contract change, no new argument. F1 — ADR-0058 Amendment II.3's ruling paragraph cited the date and the decision batch but not the recording comment. It now names comment `5560086928`, the comment on this card that records the maintainer reply the block quotes. F2 — round 3's rewrap left a stub line (`matched). So an`) mid-paragraph. The paragraph is rewrapped to the block's own idiom; the prose is word-identical. F3 — the block said it amends D3's closing SENTENCE. It amends the bullet's last two: the "rewrite *conditioned* on the row is out of contract" sentence is superseded for the in-place / same-key-set case alongside the "not so a rewrite can be aimed" one. Now "closing sentences". F4 — the changeset attributed the ruling to the director seat. The MAINTAINER ruled; the director seat recorded it. This text ships to consumers inside the package's CHANGELOG.md, so the misattribution was published. Now "Maintainer ruling (recorded by the director seat, decision batch #59, 2026-09-06)". Level re-derived rather than inherited: `packages/spec`'s files[] carries src/**/*.zod.ts and dist, while docs/adr/** is in no package's files[]. This round moves no published carrier and changes nothing behavioural, so the existing `@objectstack/spec: minor` stands. Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH Co-authored-by: Claude <noreply@anthropic.com>
1 parent 5e7e227 commit 541636e

2 files changed

Lines changed: 9 additions & 8 deletions

File tree

.changeset/hook-previous-row-invariant-rewrite.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
feat(spec): `HookContext` admits a row-invariant-in-effect rewrite by per-row `previous` on a predicate write, kept safe by the engine's key-divergence refusal (#16074)
66

7-
The `hook.zod.ts` contract said that on a predicate (`multi: true`) write the per-row `previous` is supplied *so a guard can REFUSE (throw), not so a rewrite can be aimed*. Three shipped `beforeUpdate` provenance stamps (`sys_email_template`, `sys_sharing_rule`, `sys_webhook`) read `ctx.previous` per row and write `customized: true` conditioned on it — inside the letter of what the engine allows, outside the stated purpose of the input they use. Director ruling, decision batch #59 (2026-09-06), option 1: **the contract admits the shape.**
7+
The `hook.zod.ts` contract said that on a predicate (`multi: true`) write the per-row `previous` is supplied *so a guard can REFUSE (throw), not so a rewrite can be aimed*. Three shipped `beforeUpdate` provenance stamps (`sys_email_template`, `sys_sharing_rule`, `sys_webhook`) read `ctx.previous` per row and write `customized: true` conditioned on it — inside the letter of what the engine allows, outside the stated purpose of the input they use. Maintainer ruling (recorded by the director seat, decision batch #59, 2026-09-06), option 1: **the contract admits the shape.**
88

99
The amended D3 clause (`HookContextSchema.input` TSDoc, mirrored in `bulk-write-hook-conformance.ts`) now states:
1010

docs/adr/0058-expression-and-predicate-surface.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -442,15 +442,16 @@
442442
> **Amendment II.3 (2026-09, #16074 maintainer ruling, decision batch #59) —
443443
> a ROW-INVARIANT-IN-EFFECT rewrite is ADMITTED, and the ENGINE is what makes
444444
> it safe.**
445-
> _Amends D3's closing sentence in Addendum II above by ADDITION: the 2026-08
445+
> _Amends D3's closing sentences in Addendum II above by ADDITION: the 2026-08
446446
> text is left standing as the dated record of what was decided then, carrying
447447
> a forward pointer to here. This block RECORDS a decision already taken; it
448448
> takes none._
449449
>
450450
> **The ruling.** Maintainer reply, verbatim: 「16063 c, 其他同意」
451-
> (2026-09-06, decision batch #59, on this card #16074). Option 1 adopted: the
452-
> CONTRACT admits the shape. The three shipped provenance stamps are made
453-
> conforming by amending the contract, not by being changed to fit it.
451+
> (2026-09-06, decision batch #59, recorded on this card #16074 in comment
452+
> `5560086928`). Option 1 adopted: the CONTRACT admits the shape. The three
453+
> shipped provenance stamps are made conforming by amending the contract, not
454+
> by being changed to fit it.
454455
>
455456
> **What the rule now is.** On a predicate write (`multi: true`), per-row
456457
> `previous` is supplied so a guard can REFUSE (throw) **and** so a `before*`
@@ -473,9 +474,9 @@
473474
> batch is not judged at all. To an operator that refusal is an ADR-0112
474475
> envelope, `status: 400`, carrying `keys` (the sorted keys some rows' hooks
475476
> wrote and other rows' did not) and `rows` (how many rows the predicate
476-
> matched). So an
477-
> author does not have to be TRUSTED to be row-invariant; a hook that is not
478-
> gets a loud, whole-batch 400 instead of a half-stamped table.
477+
> matched). So an author does not have to be TRUSTED to be row-invariant; a
478+
> hook that is not gets a loud, whole-batch 400 instead of a half-stamped
479+
> table.
479480
>
480481
> **The three shapes the rule does NOT admit.**
481482
>

0 commit comments

Comments
 (0)