Skip to content

fix(core): cross-schema $dynamicAnchor collision with circular $ref - #3447

Merged
melloware merged 5 commits into
orval-labs:masterfrom
aqeelat:fix/3439/cross-schema-dynamic-anchor-collision
May 28, 2026
Merged

fix(core): cross-schema $dynamicAnchor collision with circular $ref#3447
melloware merged 5 commits into
orval-labs:masterfrom
aqeelat:fix/3439/cross-schema-dynamic-anchor-collision

Conversation

@aqeelat

@aqeelat aqeelat commented May 26, 2026

Copy link
Copy Markdown
Contributor

Fix #3439

Note: This PR targets master but builds on the $dynamicAnchor/$dynamicRef feature from #3353 and the fallback fix from anchor-fallback. Those changes are prerequisites.

When two independent schemas both declare $dynamicAnchor with the same anchor name and reference each other via $ref, hasScopeAffectedDynamicRef incorrectly triggered inline materialization of one schema in the other's dynamic scope, producing wrong type output.

Reproduction

components:
  schemas:
    NodeA:
      $dynamicAnchor: node
      type: object
      properties:
        self:
          $dynamicRef: '#node'
        peer:
          $ref: '#/components/schemas/NodeB'
    NodeB:
      $dynamicAnchor: node
      type: object
      properties:
        self:
          $dynamicRef: '#node'
        peer:
          $ref: '#/components/schemas/NodeA'

Expected

export interface NodeA { self?: NodeA; peer?: NodeB; }
export interface NodeB { self?: NodeB; peer?: NodeA; }

Actual (before fix)

export interface NodeA {
  self?: NodeA;
  peer?: { self?: NodeA; peer?: NodeA }; // NodeB incorrectly inlined
}

Root cause

hasScopeAffectedDynamicRef cannot distinguish between:

  • Schema inclusion (allOf extension, e.g. LocalizedCategory extending BaseCategory) — materialization is correct and intended
  • Property reference (independent schemas referencing each other) — each schema defines its own $dynamicAnchor scope and should NOT be materialized

Fix

Adds a guard in resolveValue that checks whether the scope-source schema includes the referenced schema via allOf. If not (independent cross-reference), the colliding anchor is removed from the effective scope before checking for scope-affected dynamic refs. If it is in allOf (extension pattern), the scope is preserved.

Also updates two pre-existing tests that expected unknown for unbound $dynamicRef but now correctly resolve via the $dynamicAnchor fallback.

Tests

  • does not inline cross-schema $dynamicAnchor collision — verifies NodeA/NodeB generate correct independent types
  • still materializes allOf extension with colliding $dynamicAnchor — regression guard for LocalizedCategory/BaseCategory pattern

Summary by CodeRabbit

  • Bug Fixes

    • Improved dynamic reference handling for ambiguous or colliding anchors: searches all matches, falls back to unknown when ambiguous, and avoids inlining conflicting candidates.
    • Refined scope-aware resolution to correctly respect dynamic-scope bindings in composed schemas, preventing incorrect retention of bindings in some composition scenarios.
  • Tests

    • Added regression tests for anchor collisions, ambiguous matches, and preservation of expected peer types.
    • Relaxed order-dependent import assertions and expanded coverage for scope-related behaviors.

Review Change Stack

Copilot AI review requested due to automatic review settings May 26, 2026 12:01
@melloware melloware added the enhancement New feature or request label May 26, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Updates dynamic reference resolution to support JSON Schema Draft 2020-12 $dynamicAnchor fallback behavior, and aligns the dynamic-ref sample + generator output with the new resolution semantics.

Changes:

  • Implement $dynamicAnchor fallback lookup when $dynamicRef has no entry in dynamicScope.
  • Prevent incorrect inlining/materialization in cross-schema $dynamicAnchor collision cases (regression guards added).
  • Update sample Petstore dynamic-ref docs/output so Lizard.playmates resolves to Pet[] instead of unknown[].

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
samples/dynamic-ref/petstore-dynamic.yaml Updates sample description to reflect $dynamicAnchor fallback behavior.
samples/dynamic-ref/api/petstore.ts Updates generated sample types/docs (Lizard.playmates now Pet[]).
samples/dynamic-ref/snapshots/api/petstore.ts Updates snapshot to match new sample output.
packages/core/src/resolvers/value.ts Adjusts value materialization logic to avoid scope issues in anchor-collision scenarios.
packages/core/src/resolvers/ref.ts Adds $dynamicAnchor fallback search in components.schemas when scope has no binding.
packages/core/src/resolvers/dynamic-ref.test.ts Adds unit tests covering fallback behavior.
packages/core/src/generators/dynamic-ref.test.ts Updates expectations and adds regression tests for anchor collisions.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/core/src/resolvers/ref.ts
Comment thread packages/core/src/resolvers/ref.ts
Comment thread packages/core/src/resolvers/dynamic-ref.test.ts Outdated
@coderabbitai

coderabbitai Bot commented May 26, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a575ef58-ca2b-4e69-84f2-10bdc6b5a597

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5c678 and e0c5a62.

📒 Files selected for processing (4)
  • packages/core/src/generators/dynamic-ref.test.ts
  • packages/core/src/resolvers/dynamic-ref.test.ts
  • packages/core/src/resolvers/ref.ts
  • packages/core/src/resolvers/value.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • packages/core/src/resolvers/value.ts
  • packages/core/src/resolvers/dynamic-ref.test.ts
  • packages/core/src/resolvers/ref.ts
  • packages/core/src/generators/dynamic-ref.test.ts

📝 Walkthrough

Walkthrough

Adds a fallback lookup in resolveDynamicRef that scans components.schemas for a unique $dynamicAnchor match when dynamicScope lacks the anchor, and updates resolveValue to compute an effective context that filters dynamic-scope bindings to avoid cross-schema inlining. Tests added/updated to cover ambiguity, fallback, and regression #3439.

Changes

$dynamicAnchor Fallback Resolution & Collision Handling

Layer / File(s) Summary
$dynamicRef fallback lookup in resolveDynamicRef
packages/core/src/resolvers/ref.ts
When dynamicScope lacks an anchor, scan components.schemas for exactly one schema whose $dynamicAnchor matches the requested anchor name and derive the scope entry from that single match; zero or multiple matches leave scopeEntry undefined.
Effective context filtering in resolveValue
packages/core/src/resolvers/value.ts
Import getRefInfo and compute an effectiveContext by examining the referenced schema's $dynamicAnchor; conditionally remove conflicting dynamic scope bindings based on whether the scope source appears in an allOf that targets the current ref, and use effectiveContext for scope-affected dynamic-ref checks and scalar resolution.
Tests: fallback, ambiguity, and collision regressions
packages/core/src/generators/dynamic-ref.test.ts, packages/core/src/resolvers/dynamic-ref.test.ts
Update "BaseFolder shortcuts" to expect unknown[] when $dynamicAnchor is ambiguous; adjust "unbound $dynamicRef" to resolve to User when the anchor exists in the spec; add tests asserting multiple schemas sharing the same $dynamicAnchor fall back to unknown without inlining; add #3439 regression tests ensuring cross-schema collisions do not cause recursive inlining and that $allOf materialization still occurs.

Sequence Diagram(s)

sequenceDiagram
  participant resolveValue
  participant effectiveContext
  participant resolveDynamicRef
  participant dynamicScope
  participant componentsSchemas
  participant getRefInfo
  participant resolveRef
  resolveValue->>dynamicScope: check ref's dynamicAnchor binding
  alt binding present and candidate is parameter
    resolveValue->>resolveDynamicRef: proceed with original context
  else binding present and candidate not parameter
    resolveValue->>getRefInfo: inspect allOf refs for current refName
    getRefInfo-->>resolveValue: allOf targets include current ref?
    alt allOf targets include current ref
      resolveValue->>effectiveContext: keep dynamicScope binding
    else
      resolveValue->>effectiveContext: remove dynamicScope binding for anchor
    end
    resolveValue->>resolveDynamicRef: invoke with effectiveContext
  end
  resolveDynamicRef->>dynamicScope: lookup anchorName in effectiveContext
  alt found in effectiveContext
    resolveDynamicRef->>resolveRef: resolve target via scopeEntry
  else not found
    resolveDynamicRef->>componentsSchemas: search for schemas with matching $dynamicAnchor
    componentsSchemas-->>resolveDynamicRef: matchingSchemas
    alt exactly one match
      resolveDynamicRef->>getRefInfo: getRefInfo(matchedSchema)
      getRefInfo-->>resolveDynamicRef: scopeEntry
      resolveDynamicRef->>resolveRef: resolve target via scopeEntry
    else zero or many matches
      resolveDynamicRef-->>resolveValue: return unknown (ambiguous)
    end
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related issues

Possibly related PRs

  • orval-labs/orval#3353: Original implementation of $dynamicRef / $dynamicAnchor handling that these changes extend and correct.
  • orval-labs/orval#3446: Related changes to resolveDynamicRef to add $dynamicAnchor fallback scanning in components.schemas.
  • orval-labs/orval#3452: Overlaps on test updates asserting $dynamicRef fallback behavior when matching $dynamicAnchor exists in the spec.

Suggested labels

openapi

Suggested reviewers

  • anymaniax
  • soartec-lab
  • snebjorn
  • melloware

Poem

"I nibbled anchors in the code, so spry,
I hopped through scopes and mappings high.
When anchors clash, I take a stand —
keep each scope tidy, types unmanned.
A rabbit's cheer: no inline surprise!" 🐇

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main fix: preventing incorrect materialization when independent schemas share the same $dynamicAnchor and reference each other via $ref.
Linked Issues check ✅ Passed The PR implements all requirements from #3439: distinguishes schema inclusion via allOf from property references, prevents wrong inline materialization, and preserves correct behavior for allOf-based extensions.
Out of Scope Changes check ✅ Passed All changes are directly related to fixing #3439: test updates validate correct $dynamicAnchor collision behavior, ref.ts handles multiple anchor matches, and value.ts implements the core distinction between schema inclusion and property references.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/core/src/resolvers/ref.ts`:
- Around line 457-470: The current loop over schemas stops at the first schema
whose rec.$dynamicAnchor equals anchorName, making resolution order-dependent;
update the logic in the block that iterates schemas to detect multiple matches
for the same anchorName instead of picking the first: collect all schemaNames
where rec.$dynamicAnchor === anchorName, and if there is exactly one match use
getRefInfo(...) to populate scopeEntry (name and originalName) as now, but if
there are 0 or >1 matches treat the dynamic anchor as ambiguous and leave
scopeEntry unresolved (return unknown/skip setting it) and/or log/record the
ambiguity; adjust the code around getRefInfo, scopeEntry, and
encodeJsonPointerSegment references accordingly so behavior is deterministic.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6ccb7605-8fa6-42bf-b369-aef688192f3e

📥 Commits

Reviewing files that changed from the base of the PR and between 78e2ab4 and 531fbe1.

📒 Files selected for processing (7)
  • packages/core/src/generators/dynamic-ref.test.ts
  • packages/core/src/resolvers/dynamic-ref.test.ts
  • packages/core/src/resolvers/ref.ts
  • packages/core/src/resolvers/value.ts
  • samples/dynamic-ref/__snapshots__/api/petstore.ts
  • samples/dynamic-ref/api/petstore.ts
  • samples/dynamic-ref/petstore-dynamic.yaml

Comment thread packages/core/src/resolvers/ref.ts

@melloware melloware left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like merge conflicts and some AI feedback

@melloware

Copy link
Copy Markdown
Collaborator

@aqeelat also see: #3448

@melloware melloware left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like merge conflicts

@aqeelat
aqeelat force-pushed the fix/3439/cross-schema-dynamic-anchor-collision branch from 3637483 to 7d80d56 Compare May 26, 2026 18:46
@aqeelat
aqeelat requested a review from Copilot May 26, 2026 18:59

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated 4 comments.

Comment thread packages/core/src/resolvers/value.ts Outdated
Comment on lines +457 to +474
const matches: string[] = [];
for (const [schemaName, schemaObj] of Object.entries(schemas)) {
if (!schemaObj || typeof schemaObj !== 'object') continue;
const rec = schemaObj as Record<string, unknown>;
if (rec.$dynamicAnchor === anchorName) {
const refInfo = getRefInfo(
`#/components/schemas/${encodeJsonPointerSegment(schemaName)}`,
context,
);
scopeEntry = {
name: refInfo.name,
schemaName: refInfo.originalName,
};
break;
matches.push(schemaName);
}
}
if (matches.length === 1) {
const refInfo = getRefInfo(
`#/components/schemas/${encodeJsonPointerSegment(matches[0])}`,
context,
);
scopeEntry = {
name: refInfo.name,
schemaName: refInfo.originalName,
};
}
Comment thread packages/core/src/resolvers/ref.ts Outdated
Comment thread packages/core/src/generators/dynamic-ref.test.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/core/src/resolvers/value.ts`:
- Around line 302-307: The filtered dynamic scope stored in effectiveContext
isn't being used when computing hasReadonlyProps: update the subsequent
getScalar(...) call(s) that determine hasReadonlyProps to use effectiveContext
(which contains the filtered dynamicScope) instead of the original context so
nested $dynamicRef lookups cannot see the removed binding; locate the getScalar
invocation(s) around where hasReadonlyProps is computed and pass
effectiveContext (or replace context with effectiveContext in that call) so the
readonly-props probe evaluates against the filtered scope referencing refAnchor.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: d71efb58-982d-4386-a9d1-4b5699ad92e9

📥 Commits

Reviewing files that changed from the base of the PR and between 7d80d56 and 3e5c678.

📒 Files selected for processing (2)
  • packages/core/src/resolvers/dynamic-ref.test.ts
  • packages/core/src/resolvers/value.ts

Comment thread packages/core/src/resolvers/value.ts
aqeelat added 5 commits May 28, 2026 23:50
…rval-labs#3439)

When two independent schemas both declare $dynamicAnchor with the same
anchor name and reference each other via $ref, hasScopeAffectedDynamicRef
incorrectly triggered inline materialization of one schema in the other's
dynamic scope, producing wrong type output.

The fix adds a guard in resolveValue that checks whether the scope-source
schema includes the referenced schema via allOf (extension pattern). If
not, the colliding anchor is removed from the effective scope before
checking for scope-affected dynamic refs.

Also updates two pre-existing tests that expected 'unknown' for unbound
$dynamicRef but now correctly resolve via the $dynamicAnchor fallback
added in 95ba342.
…emas match

When multiple schemas declare the same $dynamicAnchor and the
referencing schema has no explicit binding, the fallback scan in
resolveDynamicRef was order-dependent (first Object.entries match
won). Now collects all matches and returns unknown when >1 schemas
declare the same anchor.
…solver

- Replace Array<T> with T[] and delete with destructuring in value.ts
- Use toContainEqual/arrayContaining instead of imports[0] index-based
  assertions in dynamic-ref.test.ts
…ext for readonly probe

- When multiple schemas share the same $dynamicAnchor, prefer the schema
  whose name matches the anchor name as the base definition
- Use effectiveContext (filtered dynamic scope) in getScalar call that
  computes hasReadonlyProps so nested $dynamicRef lookups respect the
  filtered scope
…ssertion

- Add typeof guard for allOf items to handle boolean schemas
- Add resolver-level test for ambiguous $dynamicAnchor returning unknown
- Tighten BaseFolder shortcuts assertion to match property name prefix
@aqeelat
aqeelat force-pushed the fix/3439/cross-schema-dynamic-anchor-collision branch from 3e5c678 to e0c5a62 Compare May 28, 2026 21:17
@aqeelat
aqeelat requested a review from Copilot May 28, 2026 21:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

Comment on lines +465 to +468
const match =
matches.length === 1
? matches[0]
: matches.find((m) => m === anchorName);
Comment on lines +270 to +278
const schemaRecord = schemaObject as Record<string, unknown>;
const refAnchor = schemaRecord.$dynamicAnchor as string | undefined;

if (
!context.parents?.includes(refName) &&
hasScopeAffectedDynamicRef(schemaObject, context, refName)
typeof refAnchor === 'string' &&
context.dynamicScope?.[refAnchor] &&
context.dynamicScope[refAnchor].name !== refName &&
!context.dynamicScope[refAnchor].isParameter
) {
Comment on lines +290 to +302
const allOf = scopeSource?.allOf as unknown[] | undefined;

const isInAllOf =
Array.isArray(allOf) &&
allOf.some((el) => {
if (!el || typeof el !== 'object') return false;
const rec = el as Record<string, unknown>;
if (typeof rec.$ref !== 'string' || !isComponentRef(rec.$ref))
return false;
const { name } = getRefInfo(rec.$ref, context);
return name === refName;
});

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/core/src/resolvers/dynamic-ref.test.ts`:
- Around line 622-625: The test "merges resolved imports with pre-existing
imports" never passes a pre-existing imports array into resolveDynamicRef, so
update the test to call resolveDynamicRef with an imports argument (e.g., [{
name: 'Existing', schemaName: 'Existing' }]) and then assert that result.imports
contains both the pre-existing import and the resolved import (e.g.,
containsEqual for { name: 'Existing', schemaName: 'Existing' } and { name:
'User', schemaName: 'User' }); ensure you still call resolveDynamicRef with the
same inputs otherwise and reference the resolveDynamicRef invocation and
result.imports in the assertion.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: dc99a7d5-1f01-44e6-9487-a4bb1fa96b87

📥 Commits

Reviewing files that changed from the base of the PR and between 3e5c678 and e0c5a62.

📒 Files selected for processing (4)
  • packages/core/src/generators/dynamic-ref.test.ts
  • packages/core/src/resolvers/dynamic-ref.test.ts
  • packages/core/src/resolvers/ref.ts
  • packages/core/src/resolvers/value.ts
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/core/src/resolvers/ref.ts
  • packages/core/src/generators/dynamic-ref.test.ts
  • packages/core/src/resolvers/value.ts

Comment on lines +622 to 625
expect(result.imports).toContainEqual({
name: 'User',
schemaName: 'User',
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

"merges resolved imports with pre-existing imports" does not pass pre-existing imports

This test never provides the imports argument to resolveDynamicRef, so it cannot validate merge behavior and now only checks a single contained entry.

Suggested test fix
   it('merges resolved imports with pre-existing imports', () => {
@@
-    const result = resolveDynamicRef('itemType', context);
+    const preExistingImports = [
+      { name: 'ExistingType', schemaName: 'ExistingType' },
+    ];
+    const result = resolveDynamicRef('itemType', context, preExistingImports);

-    expect(result.imports).toContainEqual({
-      name: 'User',
-      schemaName: 'User',
-    });
+    expect(result.imports).toEqual(
+      expect.arrayContaining([
+        { name: 'ExistingType', schemaName: 'ExistingType' },
+        { name: 'User', schemaName: 'User' },
+      ]),
+    );
+    expect(result.imports).toHaveLength(2);
   });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/core/src/resolvers/dynamic-ref.test.ts` around lines 622 - 625, The
test "merges resolved imports with pre-existing imports" never passes a
pre-existing imports array into resolveDynamicRef, so update the test to call
resolveDynamicRef with an imports argument (e.g., [{ name: 'Existing',
schemaName: 'Existing' }]) and then assert that result.imports contains both the
pre-existing import and the resolved import (e.g., containsEqual for { name:
'Existing', schemaName: 'Existing' } and { name: 'User', schemaName: 'User' });
ensure you still call resolveDynamicRef with the same inputs otherwise and
reference the resolveDynamicRef invocation and result.imports in the assertion.

@aqeelat

aqeelat commented May 28, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai resume
@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

@aqeelat: Sure! Resuming reviews and kicking off a review of this PR now.

✅ Actions performed

Reviews resumed.


Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Actionable comments posted: 0

1 similar comment
@coderabbitai

coderabbitai Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Actionable comments posted: 0

@melloware
melloware merged commit cb897c3 into orval-labs:master May 28, 2026
5 checks passed
@aqeelat
aqeelat deleted the fix/3439/cross-schema-dynamic-anchor-collision branch July 15, 2026 09:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(core): cross-schema $dynamicAnchor collision with circular $ref produces wrong types

3 participants