You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit cfb2d2c
Browse filesBrowse the repository at this point in the historyBrowse files
docs: the jsonb ladder can now recommend a value object to a Java consumer
The ladder tells an author to convert an untyped jsonb bag to an `object.value`,
and until bc591b7 that advice was wrong for anyone whose Java code CONSTRUCTS
the result: the generated data class offered Java only the full N-arg
constructor and a no-arg one yielding an all-null instance of an immutable
class. The ladder never said so, because nothing had tried it.
Adds that to the "Port coverage, stated plainly" section as a VERSION question,
matching how the #362 caveat is framed two paragraphs up — the same shape of
fact, and the same thing an author needs to check before recommending a rung.
It is explicitly marked UNRELEASED, because it is: the builder is on `main` and
ships in the next JVM cut. Reading was never affected on any version (Kotlin
`val` emits Java getters), so a bag that is only READ converts safely today.
A doc that hedges on an unreleased capability becomes a lie the moment the cut
lands, which is the [[version-forecast]] trap in miniature — so
`docs/RELEASING-docs-checklist.md` §A grows an item to grep for that hedge and
flip it, regenerating the agent-context corpus in the same commit.
CHANGELOG [Unreleased] carries the entry, including why a builder rather than
`@JvmOverloads`, why not Lombok, why `object.projection` gets none, and that
`metamodelVersion` does not move.
Corpus regenerated (the authoring skill lands in all five stacks). Gates green.
Copy file name to clipboardExpand all lines: fixtures/agent-context-conformance/java-kotlin-react-tanstack/expected/.claude/skills/metaobjects-authoring/SKILL.md
+13Lines changed: 13 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -585,6 +585,19 @@ Python's `ObjectManager` encodes a map today; `runtime-ts`, Java's OMDB and the
585
585
lane carry no map handling at all. So a map you intend to read back through a PORT RUNTIME is
586
586
still better declared as a value object, and a genuinely dynamic key set stays a bag.
587
587
588
+
**One more version question, if a JAVA caller CONSTRUCTS the value object.** Kotlin's default
589
+
arguments are a compiler feature, not a bytecode one, so a generated data class used to offer
590
+
Java only the full N-arg constructor and a no-arg one yielding an all-null instance of an
591
+
immutable class — a caller setting 3 of 14 members had to pass 14 arguments with 11 nulls. A
592
+
generated VO replacing a hand-written builder therefore made its Java call sites *worse*.
593
+
Generated entities and value objects now emit a nested `Builder` plus a `@JvmStatic builder()`
594
+
(`Money.builder().currency("USD").build()`), so partial construction from Java works — but that
595
+
is **UNRELEASED at the time of writing: it is on `main`, shipping in the next JVM cut.** Check
596
+
the adopter's pinned version. Reading is unaffected on every version (Kotlin `val` emits Java
597
+
getters), so a bag that is only READ converts safely today; it is construction that was blocked.
598
+
`object.projection` deliberately gets no builder — it is derived and read-only, and nothing
599
+
constructs one.
600
+
588
601
**One sharp edge where generated code IS the consumer, and it is now a VERSION question rather
589
602
than a port question: nested map values.** As of **1.0.1** every port validates them on every
590
603
write path ([#362](https://github.com/metaobjectsdev/metaobjects/issues/362)). On **1.0.0 the
Copy file name to clipboardExpand all lines: fixtures/agent-context-conformance/ts-react-tanstack/expected/.claude/skills/metaobjects-authoring/SKILL.md
+13Lines changed: 13 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -585,6 +585,19 @@ Python's `ObjectManager` encodes a map today; `runtime-ts`, Java's OMDB and the
585
585
lane carry no map handling at all. So a map you intend to read back through a PORT RUNTIME is
586
586
still better declared as a value object, and a genuinely dynamic key set stays a bag.
587
587
588
+
**One more version question, if a JAVA caller CONSTRUCTS the value object.** Kotlin's default
589
+
arguments are a compiler feature, not a bytecode one, so a generated data class used to offer
590
+
Java only the full N-arg constructor and a no-arg one yielding an all-null instance of an
591
+
immutable class — a caller setting 3 of 14 members had to pass 14 arguments with 11 nulls. A
592
+
generated VO replacing a hand-written builder therefore made its Java call sites *worse*.
593
+
Generated entities and value objects now emit a nested `Builder` plus a `@JvmStatic builder()`
594
+
(`Money.builder().currency("USD").build()`), so partial construction from Java works — but that
595
+
is **UNRELEASED at the time of writing: it is on `main`, shipping in the next JVM cut.** Check
596
+
the adopter's pinned version. Reading is unaffected on every version (Kotlin `val` emits Java
597
+
getters), so a bag that is only READ converts safely today; it is construction that was blocked.
598
+
`object.projection` deliberately gets no builder — it is derived and read-only, and nothing
599
+
constructs one.
600
+
588
601
**One sharp edge where generated code IS the consumer, and it is now a VERSION question rather
589
602
than a port question: nested map values.** As of **1.0.1** every port validates them on every
590
603
write path ([#362](https://github.com/metaobjectsdev/metaobjects/issues/362)). On **1.0.0 the
0 commit comments