Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
3cf3a6a
docs(#228): implementation plan — extract-tier collision-scoped namin…
dmealing Jul 30, 2026
c644411
test(#228): add json xpkg-collision fixture for the extract/output-pa…
dmealing Jul 30, 2026
2b8e17a
refactor(#228): extract collision-name assignment into a shared module
dmealing Jul 30, 2026
3b30ab7
fix(#228): TS entity tier emits collision-scoped value-object names (…
dmealing Jul 30, 2026
8918b3a
fix(#228): collision-scope write-through/projection/view VO refs; sha…
dmealing Jul 30, 2026
360d8ab
fix(#228): TS extract/output-parser tier uses collision-scoped names
dmealing Jul 30, 2026
f53da20
fix(#228): Python extract tier collision-scoped naming + FQN resolution
dmealing Jul 30, 2026
355dabb
fix(#228): Python output-parser generated-runtime PAYLOAD_NAME collis…
dmealing Jul 30, 2026
f04a97b
fix(#228): Python build-time @payloadRef/@responseRef package-local r…
dmealing Jul 30, 2026
8476fa1
fix(#228): C# extract/output-parser tier collision-scoped naming
dmealing Jul 30, 2026
1aaf2cb
fix(#228): C# runtime PAYLOAD_FQN lookup wrong-node fix (round 1)
dmealing Jul 30, 2026
0aebb84
fix(#228): Java output-parser tier collision-scoped payload naming
dmealing Jul 30, 2026
ae6a99a
fix(#228): Kotlin extract/output-parser tier collision-scoped naming
dmealing Jul 30, 2026
d4399a0
fix(#228): route render-helper + output-prompt + apidocs @payloadRef …
dmealing Jul 31, 2026
cc174b6
docs(#228): CHANGELOG + ADR-0044 note for the extract-tier collision-…
dmealing Jul 31, 2026
b9422c2
refactor(#228): source ERR_PAYLOAD_NAME_COLLISION from the shared led…
dmealing Jul 31, 2026
672c8ac
no-mistakes(review): fix(#228): bring TS barrel into collision scope
dmealing Jul 31, 2026
3c1d4bc
no-mistakes(review): sync reference barrel collision scope
dmealing Jul 31, 2026
3f03af7
no-mistakes(document): docs(#228): reconcile stale error-code ledger …
dmealing Jul 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,62 @@ here. The format follows [Keep a Changelog](https://keepachangelog.com/), and
this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
(pre-1.0; MINOR bumps may introduce breaking changes with notice).

## [Unreleased]

**Coordinated PATCH (all 5 ports)** — will release across npm / PyPI / Maven Central / NuGet
together when cut; #228 is a cross-port fix. Existing `meta gen` output is byte-identical for
every model without a cross-package short-name collision.

### Fixed — extract/output-parser tier and build-time `@payloadRef`/`@responseRef` resolution under a cross-package payload collision (#228)

ADR-0044 (#219/#220) gave every port's *payload-record* emitter collision-scoped naming: two
cross-package `object.value`s sharing a bare short name (`acme::alpha::Note` /
`acme::beta::Note`) now each emit a distinct, package-qualified type instead of silently
colliding. The **extract tier** — the `template.output`/`template.toolcall` parser generator
that reads a rendered payload back off an LLM response — was a sibling generator ADR-0044
flagged as a recurrence risk but did not fix: it named and imported nested value-object
classes by bare short name, so under a real collision it referenced a class the payload
generator no longer emits. This half is **latent** — the only shipped collision fixture
(`fixtures/template-output-render-conformance/xpkg-collision/`) used `@format: html`, which the
extract tier never runs against (it only engages for `@format: json | xml`) — closed by a new
`xpkg-collision-json` fixture plus a hardcoded per-port collision test, all five ports.

A second, **reachable** bug surfaced auditing the fix: several build-time
`@payloadRef`/`@responseRef` resolvers — feeding the extract tier, the render-helper /
output-prompt generators, and (JVM ports) the `meta:verify` template-drift check — resolved a
bare ref package-blind (first-match by load order, or a bare-tail fallback), while the loader
validates the same ref package-local per ADR-0042. Under a genuine cross-package bare
collision this meant the loader accepted object A while codegen silently emitted against
object B. Fixed by routing every one of these resolvers through each port's canonical
package-local resolver, threading the referring template's package: Python
(`resolve_payload_vo` + `render_helper_generator` + `@responseRef`), C# (`VerifyCommand` /
`BuildPayloadFieldTree`), Java (five call sites consolidated into a new `SpringNaming` helper,
plus a `LlmTraceHelperGenerator` bare-tail fix), Kotlin (`KotlinGenUtil` — reusing the loader's
own `SymbolTable` — plus the render-helper, output-prompt, and api-docs generators, and the
shared `codegen-base/TemplateVerify.java` used by both JVM ports).

A third fix closes a **generated-runtime** analog: TS, Python, and C#'s generated
output-parser code resolved its *own* `@payloadRef` payload by a bare runtime lookup — wrong
under a cross-package bare collision between two `template.output`s (or a payload bare-name
colliding with another root object). All three now bake the fully-qualified name and resolve
package-locally only when the bare name is genuinely ambiguous; byte-identical when it isn't.
Java and Kotlin already baked the FQN in generated code and needed no change here.

TS additionally extended its entity-tier collision-scoped naming (previously payload-record
only) to cover every value-object *reference* site reachable from an entity module —
write-through read-views, projection declarations, and view declarations — plus a `runner.ts`
load-order package-binding misbind found in the same pass (the same class of bug #244 fixed
elsewhere), and fixed a reachable **runtime** wrong-data bug in `runtime-ts`'s
`extract-object.ts` (a bare-tail fallback resolver that extracted a nested colliding
value-object using the wrong package's shape).

Byte-identical for every non-colliding model, all ports. Gated by the new
`xpkg-collision-json` fixture plus a per-port collision test (compile-and-run proof where the
port's toolchain supports it). Reuses `ERR_PAYLOAD_NAME_COLLISION` — no new error code, no new
metamodel vocabulary (ADR-0023 unaffected). See
[ADR-0044](spec/decisions/ADR-0044-payload-record-naming-cross-package-collision.md), whose
Consequences section now marks this recurrence closed.

## [0.20.9] — 2026-07-28

**npm-only** — `migrate-ts` + `codegen-ts` (schema migrations and projection-view codegen
Expand Down
2 changes: 1 addition & 1 deletion docs/CONFORMANCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ regenerate with `ls -d fixtures/<corpus>/*/ | wc -l`.
| [`fixtures/object-model-conformance/`](../fixtures/object-model-conformance/) | 1 shared metadata fixture (per-port scenarios) | ✓ | ✓ | ✓ | ✓ | ✓ |
| [`fixtures/codegen-conformance/`](../fixtures/codegen-conformance/) | 4 | ✓ | ✓ | ✓ | ✓ | ✓ |
| [`fixtures/template-codegen-conformance/`](../fixtures/template-codegen-conformance/) | 3 | ✓ | ✓ | ✓ | ✓ | ✓ |
| [`fixtures/template-output-render-conformance/`](../fixtures/template-output-render-conformance/) | 4 | ✓ | ✓ | ✓ | ✓ | ✓ |
| [`fixtures/template-output-render-conformance/`](../fixtures/template-output-render-conformance/) | 5 | ✓ | ✓ | ✓ | ✓ | ✓ |
| [`fixtures/generator-registry-conformance/`](../fixtures/generator-registry-conformance/) | 1 canonical manifest | ✓ | ✓ | ✓ | ✓ | ✓ |
| [`fixtures/provider-composition-conformance/`](../fixtures/provider-composition-conformance/) | 5 cases | ✓ | ✓ | — (JVM registry via Java) | ✓ | ✓ |
| [`fixtures/agent-context-conformance/`](../fixtures/agent-context-conformance/) | 4 | ✓ (the emitter is TS-owned) | — | — | — | — |
Expand Down
Loading
Loading