Skip to content

spec: a child collection can outlive its master's lock - #9

Merged
delchev merged 1 commit into
mainfrom
spec/child-outlives-master-lock
Aug 14, 2026
Merged

spec: a child collection can outlive its master's lock#9
delchev merged 1 commit into
mainfrom
spec/child-outlives-master-lock

Conversation

@delchev

@delchev delchev commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

An entity's immutability covers that entity, but the specification never said whether it reaches a composition child — so a generator could freeze every child collection of a locked master and still claim conformance.

That is what one did: an issued invoice's payment allocations became unreachable exactly when allocations start to matter, even though the child's own write surface accepted them (verified: master mutable:false and a header PUT 409, while a POST to the child controller returned 200 and the roll-up recomputed).

Change

Adds locksWithMaster (default true, so nothing changes for a model that says nothing):

- name: Invoice
  immutableWhen: "Status == 3"        # ISSUED: the document's own content freezes
- name: InvoiceAllocation
  locksWithMaster: false              # ...but money keeps being recorded against it

Content and settlement are different lifecycles on the same document.

The normative half that is easy to miss

A generator MUST NOT extend a master's user-write immutability to a child collection declared locksWithMaster: falseincluding the affordances it renders for that collection, not merely the writes it accepts. A read-only rendering that the server would have permitted is the same defect as a refused write.

Plus: it is only meaningful on a composition child of a master that actually locks, and MUST be rejected elsewhere rather than ignored — an inert declaration is indistinguishable from a working one until someone needs it. A document's own line items are unaffected; they are the content.

Reference implementation

eclipse-dirigible/dirigible#6700.

🤖 Generated with Claude Code

An entity's immutability covers THAT entity, but the specification never said
whether it reaches a composition child - so a generator could freeze every child
collection of a locked master and still claim conformance. That is what one did:
an issued invoice's payment allocations became unreachable exactly when
allocations start to matter, even though the child's own write surface accepted
them.

Adds `locksWithMaster` (default true) and states the boundary normatively,
including the half that is easy to miss: the prohibition covers the AFFORDANCES
a generator renders, not only the writes it accepts - a read-only rendering of
something the server would have permitted is the same defect as a refused write.

Requires a composition child of a master that actually locks, and must be
rejected elsewhere rather than ignored: an inert declaration is
indistinguishable from a working one until someone needs it. A document's own
line items are unaffected - they are the content.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant