Skip to content

Commit 3a2944f

Browse files
dmealingclaude
andcommitted
feat(loader)!: ADR-0042 — bare references are package-local (TS reference port)
Implements the ADR-0042 contract in the TypeScript reference port: a bare reference resolves package-locally (the referrer's package, else a root-level object); an FQN resolves exactly on the resolution key. No unique-anywhere, no bare-tail fallback — the whole change is mostly removal. Loader (packages/metadata): - resolveObjectRef/refMatchesObject collapse to one package-local matcher with package-local-before-root-level precedence (mirrors the loader symbol table). - New fail-closed ERR_UNRESOLVED_OBJECT_REF for a dangling field.object / field.map @objectref (a registry reference-descriptor — the #191 root cause); retire ERR_AMBIGUOUS_REF and delete the validateCrossPackageRefs pass. - @through joins the desugar + ref set; thread referrerPkg through every bespoke resolver (origin @from/@of/@via heads + hops, M:N junction, template payload/response, @parameterRef, extends-owner); did-you-mean hints on unresolved refs. - Fix @Symmetric self-join to compare resolved node identity (an FQN other::Widget is not a self-join of app::Widget). Codegen (codegen-ts, cli): - Route all payload/nested-ref resolution through resolveObjectRef (removes a 9-way findObject duplication + two bare-tail fallbacks — the #191 masking bug). - A nested @objectref resolves in the DECLARING field's package (correct for a field.object inherited via extends across packages). - The docs builder resolves a cross-package FQN @payloadRef exactly (it used to strip it to bare and rely on the removed fallback). Conformance: re-expect error-xpkg-ambiguous-objectref → ERR_INVALID_RELATIONSHIP; add error-xpkg-bare-unique-elsewhere, error-field-objectref-unresolved (+field.map), error-xpkg-through-bare; ERROR-CODES.json updated. Two latent dangling-ref fixtures fixed (the fail-closed check now catches them). BREAKING CHANGE: unique-anywhere bare resolution is removed; a bare packaged cross-package ref in hand-written canonical JSON now resolves package-local; ERR_AMBIGUOUS_REF is retired; new ERR_UNRESOLVED_OBJECT_REF. No port-portable YAML-authored model changes meaning. Reference port only — the Python/Java/ Kotlin/C# ports and the coordinated release follow; the shared conformance corpus is on the new contract, so those ports' conformance is red until they land. Refs ADR-0042. Fixes #191. Plan: docs/superpowers/plans/2026-07-12-adr-0042-bare-references-package-local.md Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0112J37HSkXXcTwmL9PRTvjL
1 parent 8d750d7 commit 3a2944f

59 files changed

Lines changed: 865 additions & 290 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# ADR-0042 — Bare References Are Package-Local — Implementation Plan
2+
3+
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4+
5+
**Goal:** Implement the ADR-0042 reference-resolution contract in all five ports (TS reference port first) — a bare reference resolves package-locally (referrer's package, else root), FQN resolves exactly on the resolution key, no unique-anywhere, no ambiguity — fixing #191, then cut a coordinated breaking cross-port release.
6+
7+
**Architecture:** The change is mostly *removal*. One resolution primitive (`resolveObjectRef`) collapses to a single resolution-key matcher; the bare-tail fallbacks and the referrer-package ambiguity pass are deleted; `@through` joins the desugar+ref set; `field.object`/`field.map` `@objectRef` gains a fail-closed dangling check (`ERR_UNRESOLVED_OBJECT_REF`); `ERR_AMBIGUOUS_REF` is retired. TS is the reference port; the other four mirror it, gated by the shared `fixtures/conformance` corpus.
8+
9+
**Tech Stack:** TS (`server/typescript/packages/metadata`), Python (`server/python`), Java (`server/java`), Kotlin (`server/java/.../codegen-kotlin` + metadata), C# (`server/csharp`). Cross-port gate: `fixtures/conformance/`.
10+
11+
## Global Constraints
12+
13+
- **Contract (ADR-0042 §Decision), identical in all five ports:**
14+
1. FQN ref (contains `::`) → EXACT match on `resolutionKey()`. Never a bare-tail fallback.
15+
2. Bare ref (no `::`) → package-local ONLY: an object whose resolution key is `<referrerPkg>::<name>` (referrer's own package), or `<name>` (root-level / empty-package). No cross-package bare resolution, no unique scan, no first-match.
16+
3. Every cross-package reference must be FQN. YAML desugar sugar unchanged (bare→`<currentPkg>::Name`; `pkg::Name` absolute; `::Name` root; `..::` parent-relative).
17+
4. Uniform across every ref-bearing attr: `@objectRef` (relationship, `field.object`, `field.map`), `@references`, `@from`/`@of`/`@via` heads, `@payloadRef`/`@responseRef`/`@parameterRef`, and **`@through`** (newly included). `extends` unchanged (its super-resolver is already same-package-then-root-strict).
18+
5. Unresolved ref = hard load error, per attr, with a did-you-mean hint listing same-short-name objects in other packages. Existing per-attr codes kept (`ERR_INVALID_RELATIONSHIP` / `ERR_INVALID_REFERENCE` / `ERR_INVALID_ORIGIN` / `ERR_INVALID_TEMPLATE` / `ERR_PARAMETER_REF_UNRESOLVED` / `ERR_UNRESOLVED_SUPER`); `field.object`/`field.map` `@objectRef` gains **`ERR_UNRESOLVED_OBJECT_REF`** (new).
19+
6. `ERR_AMBIGUOUS_REF` is RETIRED (unreachable once bare = package-local).
20+
- **Metamodel string discipline:** named constants only (`packages/metadata/src/constants.ts` / per-port equivalent). New error code added to each port's error registry + `fixtures/conformance/ERROR-CODES.json`.
21+
- **Conformance-gated:** every behavior change carries a fixture; all five ports err/serialize byte-identically.
22+
- **TDD:** fixtures + failing tests first.
23+
- **Breaking release:** coordinated across npm/PyPI/NuGet/Maven with an explicit BREAKING CHANGELOG banner. Pre-1.0 mandatory (freezing unique-anywhere into 1.0 would make the fragility permanent).
24+
25+
---
26+
27+
## Ground truth (verified 2026-07-12, TS)
28+
29+
- `server/typescript/packages/metadata/src/naming-refs.ts``resolveObjectRef` (unique-anywhere + `ambiguous`), `refMatchesObject` (`resolutionKey||fqn||name` — the `name===ref` is the bare-tail fallback), `REF_BEARING_ATTR_NAMES` (excludes `@through`), `expandRef` (desugar primitive — already package-local, correct, unchanged).
30+
- `server/typescript/packages/metadata/src/core/yaml-desugar.ts:280-305` — expands `extends` + every `REF_BEARING_ATTR_NAMES` attr to FQN. Adding `@through` to the set auto-expands it (both `@through` and bare `through` paths).
31+
- `server/typescript/packages/metadata/src/loader/validation-passes.ts:285-334``validateCrossPackageRefs` (the ambiguity pass — DELETE). `field.object` dangling `@objectRef` currently has NO check (only `ERR_OBJECT_FIELD_WITHOUT_OBJECT_REF` for a missing ref). Relationship `@objectRef` dangling → `ERR_INVALID_RELATIONSHIP`; `identity.reference``ERR_INVALID_REFERENCE` (these are the models for the new field.object/map check). M:N `@through` junction validation lives here too (must match junction on FQN once `@through` is expanded).
32+
- `resolutionKey()` = `<package|fileDefaultPackage>::<name>` (root-level object → bare `name`). `fqn()` for an object stays BARE (FR5d) — so FQN matching must use `resolutionKey()`, not `fqn()`.
33+
- Error registry: `server/typescript/packages/metadata/src/errors.ts` + `fixtures/conformance/ERROR-CODES.json`.
34+
- TS render/verify payload-tree already resolves FQN/same-package with no bare-tail fallback (0.15.14 / #182). Confirm no residual bare-tail fallback in codegen-ts nested-ref / payload-VO resolution.
35+
- Existing fixtures: `error-xpkg-ambiguous-objectref` (relationship `@objectRef`, bare `Customer` from pkg `sales`, Customer only in vendor/crm → **re-expect `ERR_INVALID_RELATIONSHIP`**), `xpkg-collision-bare-same-package` (positive same-package guard — must stay green), `xpkg-*` FQN fixtures.
36+
37+
---
38+
39+
## Phase 1 — Conformance fixtures (the executable contract; write first)
40+
41+
Fixtures are JSON-input (canonical, NOT YAML — so they exercise the RESOLUTION layer's package-local bare handling directly, not just the desugar). Each has `input/*.json`, `providers.json`, `expected-errors.json` (or `expected-serialized.json` for positive).
42+
43+
### Task 1: Re-expect the retired ambiguity fixture
44+
**Files:** Modify `fixtures/conformance/error-xpkg-ambiguous-objectref/expected-errors.json`
45+
- [ ] Change `code` `ERR_AMBIGUOUS_REF``ERR_INVALID_RELATIONSHIP` (bare `Customer` on `sales::Order` now folds package-local to `sales::Customer`, which dangles). Keep `source` (referrer `Order`, target `Customer`). Consider renaming the dir to `error-xpkg-bare-dangling-objectref` for accuracy, or leave the name and note the semantic shift in a `README`/`notes`.
46+
- [ ] Verify against ADR did-you-mean phrasing (hint names `vendor::Customer`, `crm::Customer`).
47+
48+
### Task 2: New — bare unique-elsewhere now errors
49+
**Files:** Create `fixtures/conformance/error-xpkg-bare-unique-elsewhere/{input,expected-errors,providers}`
50+
- [ ] Object `app::a::Payload` with a `field.object thing objectRef: Thing`; a single `app::b::Thing` (unique, in ANOTHER package). Under ADR-0041 this resolved (unique-anywhere); under ADR-0042 bare folds to `app::a::Thing` which dangles → `ERR_UNRESOLVED_OBJECT_REF` with a did-you-mean naming `app::b::Thing`.
51+
52+
### Task 3: New — dangling field.object + field.map @objectRef
53+
**Files:** Create `fixtures/conformance/error-field-objectref-unresolved/…` and `error-field-map-objectref-unresolved/…`
54+
- [ ] `field.object` with `@objectRef` to a nonexistent object (same package) → `ERR_UNRESOLVED_OBJECT_REF`.
55+
- [ ] `field.map` with `@objectRef` to a nonexistent object → `ERR_UNRESOLVED_OBJECT_REF`.
56+
57+
### Task 4: New — @through FQN positive + bare cross-package negative
58+
**Files:** Create `fixtures/conformance/xpkg-through-fqn/…` (positive, `expected-serialized.json`) and `error-xpkg-through-bare/…` (negative)
59+
- [ ] `xpkg-through-fqn`: an M:N relationship whose `@through` is a FQN to a junction in another package resolves + serializes.
60+
- [ ] `error-xpkg-through-bare`: an M:N relationship whose `@through` is a bare name of a junction in another package → dangles package-local → `ERR_INVALID_RELATIONSHIP` (M:N junction-missing).
61+
62+
### Task 5: Positive load-order-independent bare-same-package guard
63+
**Files:** Confirm/extend `fixtures/conformance/xpkg-collision-bare-same-package`
64+
- [ ] Ensure it proves a bare ref binds the referrer's-own-package object regardless of file load order (two same-named objects in different packages; the referrer's package one wins; the other is never bound).
65+
66+
---
67+
68+
## Phase 2 — TS reference port
69+
70+
### Task 6: `resolveObjectRef` + `refMatchesObject` → package-local
71+
**Files:** Modify `server/typescript/packages/metadata/src/naming-refs.ts`
72+
- [ ] `resolveObjectRef`: FQN → `objects.find(c => c.resolutionKey() === ref)`. Bare → `objects.find(c => c.resolutionKey() === localKey || c.resolutionKey() === ref)` where `localKey = referrerPkg ? `${referrerPkg}::${ref}` : ref`. Return `{ node }` only — DROP the `ambiguous` field.
73+
- [ ] `refMatchesObject`: `return node.resolutionKey() === ref;` — drop `|| node.fqn() === ref || node.name === ref`.
74+
- [ ] Add `RELATIONSHIP_ATTR_THROUGH` to `REF_BEARING_ATTR_NAMES`; update the doc-comment (remove "@through intentionally NOT in this set").
75+
- [ ] Delete `objectPackage` if now unused; keep otherwise.
76+
- [ ] TDD: unit tests in `naming-refs.test.ts` — bare same-package resolves, bare unique-elsewhere returns `{}` (unresolved), FQN exact, FQN to wrong package returns `{}`.
77+
78+
### Task 7: Retire the ambiguity pass; add fail-closed field.object/map dangling check + did-you-mean
79+
**Files:** Modify `server/typescript/packages/metadata/src/loader/validation-passes.ts`, `validation-registry.ts`
80+
- [ ] DELETE `validateCrossPackageRefs` + its registration + import; remove `ERR_AMBIGUOUS_REF` usage.
81+
- [ ] Add `validateFieldObjectRefResolves` (mirrors relationship/identity dangling checks): for every `field.object`/`field.map` with an `@objectRef` that does not resolve (`resolveObjectRef(...).node === undefined`), emit `ERR_UNRESOLVED_OBJECT_REF` with a did-you-mean hint (`objectsNamed(shortName).map(resolutionKey)`). Register it.
82+
- [ ] Add a shared `didYouMeanHint(root, ref)` helper (short-name scan across other packages) and thread it into the unresolved messages for relationship `@objectRef`, identity `@references`, origin heads, template refs, `@parameterRef`, and the new field.object/map check.
83+
- [ ] Ensure `@through` (now FQN-expanded) resolves the junction via `resolveObjectRef`/`refMatchesObject` (FQN-exact); a bare/dangling `@through` → the existing M:N junction error.
84+
85+
### Task 8: Error registry + constants
86+
**Files:** Modify `server/typescript/packages/metadata/src/errors.ts`, `constants.ts`, `fixtures/conformance/ERROR-CODES.json`
87+
- [ ] Remove `ERR_AMBIGUOUS_REF`; add `ERR_UNRESOLVED_OBJECT_REF` (description: "A `field.object`/`field.map` `@objectRef` (bare→package-local, or FQN) resolves to no object in the loaded tree.").
88+
- [ ] Update `ERR_INVALID_RELATIONSHIP` / `ERR_INVALID_REFERENCE` descriptions to note `@through` is now FQN-in-the-ref-set and ambiguity is retired.
89+
90+
### Task 9: Codegen/runtime bare-tail residue sweep (TS)
91+
**Files:** grep `server/typescript/packages/codegen-ts/src`, `runtime-ts`, `migrate-ts`
92+
- [ ] Confirm no remaining bare-tail fallback in nested-ref / payload-VO / binding-site resolution (0.15.14 removed the render/verify one; verify none elsewhere). Where a resolver still short-name-matches a ref, switch it to `resolveObjectRef`/`refMatchesObject`.
93+
94+
### Task 10: Regen goldens + green the server suite
95+
- [ ] `cd server/typescript && bun test` — fix golden/accessor updates (ADR predicts ~25 of 2125). Regen any snapshot fixtures.
96+
- [ ] `bun run --filter '*' typecheck && bun run --filter '*' build`.
97+
- [ ] Run `/code-review` + `/simplify` on the TS diff; fix findings.
98+
- [ ] Commit to `main` (forward-only).
99+
100+
---
101+
102+
## Phase 3 — Port to Python / Java / Kotlin / C# (parallelizable; each gated by the shared corpus)
103+
104+
Each port task (dispatch as a subagent per port; use the **cross-language-porting** skill) applies the SAME contract:
105+
- Resolution primitive → package-local FQN/resolution-key matcher; delete unique-anywhere + bare-tail fallback (#191 named the Python `payload_vo_generator._resolve_object_field_type` rsplit fallback + `render_helper_generator._resolve_nested_object_ref`).
106+
- Retire `ERR_AMBIGUOUS_REF`; add `ERR_UNRESOLVED_OBJECT_REF` fail-closed check for `field.object`/`field.map`.
107+
- Add `@through` to the ref/desugar set; junction resolves FQN-exact.
108+
- did-you-mean hints.
109+
- Run that port's conformance corpus green (all Phase-1 fixtures) + registry-conformance (error-code manifest).
110+
- **C# gotcha (memory):** C# has a COMMITTED `SpecMetamodel/*.json` copy to sync (like Python); Java auto-refreshes. Sync it or conformance silently fails.
111+
112+
### Task 11: Python port ### Task 12: Java port ### Task 13: Kotlin port ### Task 14: C# port
113+
(Each: TDD against the shared corpus; run `scripts/ci-local.sh --only <port>`; review+simplify; commit forward.)
114+
115+
### Task 15: Cross-port conformance green
116+
- [ ] All five ports run `fixtures/conformance` + `fixtures/registry-conformance` byte-identical. `ERROR-CODES.json` matches every port's registry.
117+
118+
---
119+
120+
## Phase 4 — Coordinated breaking release
121+
122+
### Task 16: Release (use the **releasing** skill; Claude runs all four registries)
123+
- [ ] CHANGELOG: BREAKING banner (unique-anywhere removed; bare packaged cross-package ref in hand-written canonical JSON changes meaning; `ERR_AMBIGUOUS_REF` retired; new `ERR_UNRESOLVED_OBJECT_REF`; `@through` FQN). No port-portable YAML-authored model changes meaning.
124+
- [ ] Version bump on the current line (npm/PyPI/NuGet/Maven), lockstep per RELEASING.md; regen lockfile; `bun publish`.
125+
- [ ] Propagate version markers/docs; close #191 with the shipped fix; reopen if it was closed prematurely and re-close on release.
126+
127+
---
128+
129+
## Self-review checklist
130+
- [ ] Spec coverage: every ADR-0042 §Decision item (1-6) + §Consequences fixture list mapped to a task above. ✅
131+
- [ ] No placeholders in the TS (contract-defining) tasks; port tasks are declarative-by-design (they mirror TS + the shared corpus is the exact spec).
132+
- [ ] Type consistency: `resolveObjectRef` returns `{ node? }` (no `ambiguous`) everywhere after Task 6; all callers updated (grep `.ambiguous`).

fixtures/conformance/ERROR-CODES.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@
2929
"ERR_MALFORMED_YAML": "The YAML metadata input is not valid YAML, or cannot be desugared into canonical metadata.",
3030
"ERR_INVALID_ORIGIN": "A field origin (passthrough/aggregate) declares an invalid path or attribute.",
3131
"ERR_AMBIGUOUS_PATH": "FR-024 (ADR-0029): an implicit (omitted-@via) origin path is ambiguous — more than one single-hop relationship leads from the base entity to the @from/@of entity (the error names the candidates), or a projection's base entity cannot be derived because its fields extend multiple entities and no extended identity anchors the base.",
32-
"ERR_AMBIGUOUS_REF": "Cross-package reference contract — a BARE reference (no `::`) names an object that exists in more than one package and none is in the referrer's own package. The reference is ambiguous; qualify it with the package (FQN). Applies to every object-ref-bearing attribute (@objectRef, @references, @from/@of/@via heads, extends, @payloadRef/@responseRef, @through).",
3332
"ERR_ORIGIN_CARDINALITY": "FR-024 (ADR-0029): origin cardinality contract broken — a passthrough @via path crosses a to-many hop (row-multiplying passthrough — you meant aggregate), or an aggregate @via path is to-one at every hop (aggregating over a to-one path — you meant passthrough). Checked on explicit AND inferred paths.",
3433
"ERR_EXTENDS_ORIGIN_MISMATCH": "FR-024 (ADR-0029 decision 7): a field declares both an entity-nested extends (shape lineage) and an origin.passthrough @from (data lineage) and they disagree — the resolved @from target is not the field's resolved extends target (nor anywhere on its extends chain). Host-agnostic (projections, entities, values). origin.aggregate is never judged (it computes something new); a top-level abstract extends target is never judged (shape-only reuse makes no lineage claim).",
3534
"ERR_PASSTHROUGH_TYPE_MISMATCH": "#185: a field carrying origin.passthrough @from: \"Entity.field\" declares a field.<subType> or array-ness that differs from its resolved source field — a passthrough forwards the value unchanged, so its type must be identical. Host-agnostic (projections, entities, values, stored-proc parameter refs). Nullability is NOT judged (a view over an outer join legitimately widens NOT NULL → nullable). Opt out of a deliberate type change with @convert: true on the origin.passthrough (an acknowledgement — it does not generate a cast); real type-converting projections are origin.expression's job (#159).",
3635
"ERR_DERIVED_FIELD_NO_READ_SOURCE": "FR-024 (spec §7): an object.entity field carrying an origin.* child is derived (read-only) and must be providable — the entity must declare at least one source with a read-only @kind (view/materializedView/storedProc/tableFunction, e.g. a @role replica view beside the table primary). Table-only or source-less entities with origin-bearing fields error on the field. Projections and object.value hosts are exempt. Until the Phase-E B4b cutover removes view-primary entities, a read-only-kind PRIMARY source also counts as providable (legacy spelling).",
3736
"ERR_INVALID_TEMPLATE": "A template (prompt/output) declares a @payloadRef that does not resolve, or @requiredSlots that are not fields on its payload.",
38-
"ERR_INVALID_RELATIONSHIP": "FR-017: a M:N relationship's slim vocabulary is invalid — @through does not name a junction declaring two identity.reference children, @sourceRefField does not match one of them, or a M:N-only attr (@through/@sourceRefField/@symmetric) is set on a non-M:N (1:N / @cardinality:one) relationship; OR a relationship's @objectRef does not resolve to any object in the loaded tree (a dangling target).",
37+
"ERR_INVALID_RELATIONSHIP": "FR-017: a M:N relationship's slim vocabulary is invalid — @through does not resolve to a junction declaring two identity.reference children (ADR-0042: @through resolves package-locally when bare, exactly when FQN — a bare cross-package @through no longer binds elsewhere), @sourceRefField does not match one of them, or a M:N-only attr (@through/@sourceRefField/@symmetric) is set on a non-M:N (1:N / @cardinality:one) relationship; OR a relationship's @objectRef does not resolve to any object in the loaded tree (a dangling target).",
3938
"ERR_INVALID_REFERENCE": "An identity.reference @references names an FK target object that does not resolve to any object in the loaded tree (a dangling cross-reference between metadata).",
4039
"ERR_VAR_NOT_ON_PAYLOAD": "Build-time verify: a template variable references a field the (contextual) payload view-object does not declare.",
4140
"ERR_PARTIAL_UNRESOLVED": "Build-time verify: a template partial ({{> group/source}}) does not resolve in the configured provider.",
@@ -45,6 +44,7 @@
4544
"ERR_STORAGE_FLATTENED_ARRAY": "@storage \"flattened\" cannot be combined with isArray=true.",
4645
"ERR_STORAGE_WITHOUT_OBJECT_REF": "@storage was set on a field that has no @objectRef.",
4746
"ERR_OBJECT_FIELD_WITHOUT_OBJECT_REF": "ADR-0013: a field.object declares no @objectRef. A field.object models a typed nested value and REQUIRES @objectRef. For a genuinely open/untyped JSON map, use the physical escape hatch @dbColumnType: jsonb on a field.string instead of a bare object.",
47+
"ERR_UNRESOLVED_OBJECT_REF": "ADR-0042: a field.object / field.map @objectRef does not resolve to any object in the loaded tree (a dangling target). The ref resolves package-locally when bare (referrer's package, else root-level) and exactly when FQN — a bare cross-package ref no longer binds elsewhere. The error names same-short-name objects in other packages so the author can qualify it.",
4848
"ERR_RESERVED_ATTR": "An @-prefixed reserved structural keyword (e.g. @name, @isArray, @children) was used as an inline attribute.",
4949
"ERR_SOURCE_NO_PRIMARY": "An object declares source nodes but none has role=primary.",
5050
"ERR_SOURCE_MULTIPLE_PRIMARY": "An object declares more than one source node with role=primary.",
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"errors": [
3+
{
4+
"code": "ERR_UNRESOLVED_OBJECT_REF",
5+
"source": {
6+
"format": "json",
7+
"files": [
8+
"meta.json"
9+
],
10+
"jsonPath": "$['metadata.root'].children[0]['object.entity'].children[2]['field.map']"
11+
}
12+
}
13+
],
14+
"warnings": []
15+
}

0 commit comments

Comments
 (0)