tag:github.com,2008:https://github.com/blueprint-platform/openapi-generics/releases
Release notes from openapi-generics
2026-06-27T14:08:37Z
tag:github.com,2008:Repository/1045192298/v1.2.0
2026-06-27T14:13:17Z
v1.2.0 — Application-Defined Generic Containers and Deterministic Generated Source Hygiene
<p>This release extends the container-aware infrastructure introduced in 1.1.0 by allowing applications to register their own generic container contracts.</p>
<p>OpenAPI Generics can now preserve and reconstruct both built-in containers and application-defined containers through the same contract-first projection and deterministic client generation pipeline.</p>
<p>This release also improves projection metadata by preserving Java container identity and adds generated-source hygiene for cleaner Java client artifacts.</p>
<p>All 1.1.x contracts remain fully supported.</p>
<p>No migration is required for existing users.</p>
<hr>
<h2>What This Release Adds</h2>
<h3>Application-Defined Generic Containers</h3>
<p>OpenAPI Generics previously supported built-in container shapes such as:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponse<List<T>>
ServiceResponse<Set<T>>
ServiceResponse<Page<T>>"><pre><span class="pl-s1">ServiceResponse</span><<span class="pl-s1">List</span><<span class="pl-s1">T</span>>>
<span class="pl-s1">ServiceResponse</span><<span class="pl-s1">Set</span><<span class="pl-s1">T</span>>>
<span class="pl-smi">ServiceResponse</span><<span class="pl-smi">Page</span><<span class="pl-smi">T</span>>></pre></div>
<p>and equivalent BYOE shapes:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponse<List<T>>
ApiResponse<Set<T>>
ApiResponse<Page<T>>"><pre><span class="pl-s1">ApiResponse</span><<span class="pl-s1">List</span><<span class="pl-s1">T</span>>>
<span class="pl-s1">ApiResponse</span><<span class="pl-s1">Set</span><<span class="pl-s1">T</span>>>
<span class="pl-smi">ApiResponse</span><<span class="pl-smi">Page</span><<span class="pl-smi">T</span>>></pre></div>
<p>Version 1.2.0 allows applications to register their own generic container contracts.</p>
<p>Example:</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="openapi-generics:
envelope:
type: io.example.contract.ApiResponse
containers:
- type: io.example.contract.Paging
item-property: content
- type: io.example.contract.Window
item-property: items"><pre><span class="pl-ent">openapi-generics</span>:
<span class="pl-ent">envelope</span>:
<span class="pl-ent">type</span>: <span class="pl-s">io.example.contract.ApiResponse</span>
<span class="pl-ent">containers</span>:
- <span class="pl-ent">type</span>: <span class="pl-s">io.example.contract.Paging</span>
<span class="pl-ent">item-property</span>: <span class="pl-s">content</span>
- <span class="pl-ent">type</span>: <span class="pl-s">io.example.contract.Window</span>
<span class="pl-ent">item-property</span>: <span class="pl-s">items</span></pre></div>
<p>These containers participate in the same projection and reconstruction pipeline as built-in <code>List<T></code>, <code>Set<T></code>, and platform <code>Page<T></code> containers.</p>
<p>Example supported shapes now include:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponse<Paging<CustomerDto>>
ApiResponse<Window<CustomerDto>>"><pre><span class="pl-s1">ApiResponse</span><<span class="pl-s1">Paging</span><<span class="pl-s1">CustomerDto</span>>>
<span class="pl-smi">ApiResponse</span><<span class="pl-smi">Window</span><<span class="pl-smi">CustomerDto</span>>></pre></div>
<p>Configured containers are validated during startup to ensure the container contract is structurally supported.</p>
<hr>
<h2>Java Container Identity in Projection Metadata</h2>
<p>Projection metadata now preserves the resolved Java container type through:</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="x-data-container-type"><pre><span class="pl-s">x-data-container-type</span></pre></div>
<p>Built-in container example:</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="x-api-wrapper: true
x-api-wrapper-datatype: PageCustomerDto
x-data-container: Page
x-data-container-type: io.github.blueprintplatform.openapi.generics.contract.paging.Page
x-data-item: CustomerDto"><pre><span class="pl-ent">x-api-wrapper</span>: <span class="pl-c1">true</span>
<span class="pl-ent">x-api-wrapper-datatype</span>: <span class="pl-s">PageCustomerDto</span>
<span class="pl-ent">x-data-container</span>: <span class="pl-s">Page</span>
<span class="pl-ent">x-data-container-type</span>: <span class="pl-s">io.github.blueprintplatform.openapi.generics.contract.paging.Page</span>
<span class="pl-ent">x-data-item</span>: <span class="pl-s">CustomerDto</span></pre></div>
<p>Application-defined container example:</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="x-api-wrapper: true
x-api-wrapper-datatype: PagingCustomerDto
x-data-container: Paging
x-data-container-type: io.example.contract.Paging
x-data-item: CustomerDto"><pre><span class="pl-ent">x-api-wrapper</span>: <span class="pl-c1">true</span>
<span class="pl-ent">x-api-wrapper-datatype</span>: <span class="pl-s">PagingCustomerDto</span>
<span class="pl-ent">x-data-container</span>: <span class="pl-s">Paging</span>
<span class="pl-ent">x-data-container-type</span>: <span class="pl-s">io.example.contract.Paging</span>
<span class="pl-ent">x-data-item</span>: <span class="pl-s">CustomerDto</span></pre></div>
<p>This makes container metadata more explicit and deterministic while preserving backward compatibility with the existing <code>x-data-container</code> and <code>x-data-item</code> model.</p>
<hr>
<h2>Generated-Source Hygiene</h2>
<p>The Java code generation parent now includes a deterministic generated-source hygiene phase.</p>
<p>After generation, OpenAPI Generics cleans generated Java sources by removing duplicate and unused imports and applying consistent formatting.</p>
<p>This improves generated artifact quality without changing contract semantics or runtime behavior.</p>
<p>The generation lifecycle now becomes:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="OpenAPI Generator
↓
Template overlays
↓
Generated sources
↓
Generated-source hygiene
↓
Compilation"><pre lang="text" class="notranslate"><code>OpenAPI Generator
↓
Template overlays
↓
Generated sources
↓
Generated-source hygiene
↓
Compilation
</code></pre></div>
<hr>
<h2>Platform Improvements</h2>
<ul>
<li>Added application-defined generic container registration through <code>openapi-generics.containers</code>.</li>
<li>Added startup validation for configured generic containers.</li>
<li>Added configurable item-property support for custom container contracts.</li>
<li>Added <code>x-data-container-type</code> projection metadata.</li>
<li>Preserved Java container identity across introspection, projection, and reconstruction.</li>
<li>Unified built-in and configured containers under the same descriptor model.</li>
<li>Added generated-source hygiene to the Java client generation parent.</li>
<li>Removed duplicate and unused generated Java imports deterministically.</li>
<li>Updated README, GitHub Pages documentation, module documentation, compatibility policy, security policy, and contributing guidance for 1.2.0.</li>
<li>Expanded type coverage samples for BYOE and application-defined generic containers.</li>
</ul>
<hr>
<h2>Quality & Verification</h2>
<ul>
<li>Added regression coverage for configured container registration and validation.</li>
<li>Added metadata validation for <code>x-data-container-type</code>.</li>
<li>Added projection and reconstruction coverage for <code>Paging<T></code> and <code>Window<T></code> sample containers.</li>
<li>Added generated-source hygiene verification.</li>
<li>Verified producer → OpenAPI → generated client → consumer flows for:
<ul>
<li>built-in containers</li>
<li>BYOE envelopes</li>
<li>application-defined generic containers</li>
</ul>
</li>
<li>Verified backward compatibility with all 1.1.x response contracts.</li>
</ul>
<hr>
<h2>Compatibility</h2>
<p>Fully backward compatible with all 1.1.x releases.</p>
<p>Supported platforms:</p>
<ul>
<li>Java 17+</li>
<li>Spring Boot 3.x</li>
<li>Spring Boot 4.x</li>
<li>OpenAPI Generator 7.x</li>
<li>Maven-based client generation</li>
</ul>
<hr>
<h2>Impact</h2>
<ul>
<li>No migration required</li>
<li>No breaking contract changes</li>
<li>Application-owned generic containers are now supported</li>
<li>Projection metadata is more explicit and deterministic</li>
<li>Generated Java clients are cleaner and easier to inspect</li>
<li>BYOE scenarios are significantly more flexible</li>
<li>Contract-first architecture remains unchanged</li>
</ul>
<hr>
<h2>Closed Issues</h2>
<ul>
<li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4730107489" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/27" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/27/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/27">#27</a> Preserve Java container type in projection metadata</li>
<li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4736980376" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/28" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/28/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/28">#28</a> Introduce generated-source hygiene phase</li>
<li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4758216004" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/29" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/29/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/29">#29</a> Support application-defined generic containers</li>
</ul>
<hr>
<h2>Summary</h2>
<p>v1.2.0 turns the container model introduced in 1.1.0 into an extensible platform capability.</p>
<p>The release adds:</p>
<ul>
<li>configurable application-defined generic containers</li>
<li>Java container identity preservation through <code>x-data-container-type</code></li>
<li>deterministic generated-source hygiene</li>
<li>expanded BYOE type coverage</li>
<li>updated documentation and release guidance</li>
</ul>
<p>while keeping all existing 1.1.x contracts fully compatible.</p>
bsayli
tag:github.com,2008:Repository/1045192298/v1.1.0
2026-06-21T15:42:37Z
v1.1.0 — Container-Aware Generic Infrastructure and Deterministic Contract Validation
<p>This release introduces the first major capability expansion since the 1.0.0 GA release.</p>
<p>OpenAPI Generics now supports container-aware contract reconstruction through a dedicated generic container infrastructure and introduces deterministic OpenAPI specification validation across sample projects.</p>
<p>All 1.0.x contracts remain fully supported.</p>
<p>No migration is required for existing users.</p>
<hr>
<h2>What This Release Adds</h2>
<h3>Container-Aware Generic Infrastructure</h3>
<p>OpenAPI Generics previously focused on canonical response shapes such as:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponse<T>
ServiceResponse<Page<T>>"><pre><span class="pl-s1">ServiceResponse</span><<span class="pl-s1">T</span>>
<span class="pl-smi">ServiceResponse</span><<span class="pl-smi">Page</span><<span class="pl-smi">T</span>>></pre></div>
<p>Version 1.1.0 introduces a dedicated container model that treats generic containers as a first-class platform capability.</p>
<p>Supported response shapes now include:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponse<T>
ServiceResponse<List<T>>
ServiceResponse<Set<T>>
ServiceResponse<Page<T>>"><pre><span class="pl-s1">ServiceResponse</span><<span class="pl-s1">T</span>>
<span class="pl-s1">ServiceResponse</span><<span class="pl-s1">List</span><<span class="pl-s1">T</span>>>
<span class="pl-s1">ServiceResponse</span><<span class="pl-s1">Set</span><<span class="pl-s1">T</span>>>
<span class="pl-smi">ServiceResponse</span><<span class="pl-smi">Page</span><<span class="pl-smi">T</span>>></pre></div>
<p>The same capability is available for custom BYOE envelopes:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponse<T>
ApiResponse<List<T>>
ApiResponse<Set<T>>
ApiResponse<Page<T>>"><pre><span class="pl-s1">ApiResponse</span><<span class="pl-s1">T</span>>
<span class="pl-s1">ApiResponse</span><<span class="pl-s1">List</span><<span class="pl-s1">T</span>>>
<span class="pl-s1">ApiResponse</span><<span class="pl-s1">Set</span><<span class="pl-s1">T</span>>>
<span class="pl-smi">ApiResponse</span><<span class="pl-smi">Page</span><<span class="pl-smi">T</span>>></pre></div>
<p>Container handling is now resolved through shared metadata rather than container-specific implementations.</p>
<hr>
<h2>Unified Projection and Reconstruction</h2>
<p>Container metadata now participates consistently across:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Java Contract
↓
Projection
↓
OpenAPI Schema
↓
Vendor Extensions
↓
Code Generation
↓
Runtime Reconstruction"><pre lang="text" class="notranslate"><code>Java Contract
↓
Projection
↓
OpenAPI Schema
↓
Vendor Extensions
↓
Code Generation
↓
Runtime Reconstruction
</code></pre></div>
<p>This eliminates container-specific branching and establishes a single reconstruction model for supported generic response types.</p>
<p>Generated wrapper examples:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponseCustomerDto
ServiceResponseListCustomerDto
ServiceResponseSetCustomerDto
ServiceResponsePageCustomerDto"><pre><span class="pl-smi">ServiceResponseCustomerDto</span>
<span class="pl-s1">ServiceResponseListCustomerDto</span>
<span class="pl-smi">ServiceResponseSetCustomerDto</span>
<span class="pl-s1">ServiceResponsePageCustomerDto</span></pre></div>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponseCustomerDto
ApiResponseListCustomerDto
ApiResponseSetCustomerDto
ApiResponsePageCustomerDto"><pre><span class="pl-smi">ApiResponseCustomerDto</span>
<span class="pl-s1">ApiResponseListCustomerDto</span>
<span class="pl-smi">ApiResponseSetCustomerDto</span>
<span class="pl-s1">ApiResponsePageCustomerDto</span></pre></div>
<p>All wrappers are reconstructed through the same container-aware infrastructure.</p>
<hr>
<h2>Deterministic OpenAPI Snapshot Validation</h2>
<p>Generated OpenAPI specifications are now treated as validation artifacts.</p>
<p>Sample projects now:</p>
<ul>
<li>generate OpenAPI specifications during validation</li>
<li>commit deterministic specification snapshots</li>
<li>validate projection metadata through automated assertions</li>
<li>detect specification drift through CI verification</li>
</ul>
<p>This makes projection changes visible immediately and significantly reduces regression risk when evolving projection logic, metadata generation, schema naming, or reconstruction behavior.</p>
<hr>
<h2>Type Coverage Expansion</h2>
<p>Validation coverage has been expanded across both canonical and BYOE contracts.</p>
<p>Covered scenarios include:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponse<T>
ServiceResponse<List<T>>
ServiceResponse<Set<T>>
ServiceResponse<Page<T>>"><pre><span class="pl-s1">ServiceResponse</span><<span class="pl-s1">T</span>>
<span class="pl-s1">ServiceResponse</span><<span class="pl-s1">List</span><<span class="pl-s1">T</span>>>
<span class="pl-s1">ServiceResponse</span><<span class="pl-s1">Set</span><<span class="pl-s1">T</span>>>
<span class="pl-smi">ServiceResponse</span><<span class="pl-smi">Page</span><<span class="pl-smi">T</span>>></pre></div>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponse<T>
ApiResponse<List<T>>
ApiResponse<Set<T>>
ApiResponse<Page<T>>"><pre><span class="pl-s1">ApiResponse</span><<span class="pl-s1">T</span>>
<span class="pl-s1">ApiResponse</span><<span class="pl-s1">List</span><<span class="pl-s1">T</span>>>
<span class="pl-s1">ApiResponse</span><<span class="pl-s1">Set</span><<span class="pl-s1">T</span>>>
<span class="pl-smi">ApiResponse</span><<span class="pl-smi">Page</span><<span class="pl-smi">T</span>>></pre></div>
<p>Validation includes:</p>
<ul>
<li>scalar payloads</li>
<li>value payloads</li>
<li>enum payloads</li>
<li>DTO payloads</li>
<li>collection payloads</li>
<li>paged payloads</li>
<li>generated client reconstruction</li>
<li>runtime deserialization</li>
<li>consumer integration</li>
</ul>
<p>All scenarios are verified through producer → OpenAPI → generated client → consumer pipelines.</p>
<hr>
<h2>Platform Improvements</h2>
<ul>
<li>Introduced extensible generic container metadata model.</li>
<li>Unified container handling across projection and generation.</li>
<li>Added descriptor-based container resolution.</li>
<li>Added deterministic OpenAPI snapshot verification.</li>
<li>Added specification drift detection to CI validation.</li>
<li>Reorganized sample hierarchy and aggregators.</li>
<li>Expanded architecture, adoption, compatibility, and release documentation.</li>
<li>Updated all project documentation for the 1.1.0 release line.</li>
</ul>
<hr>
<h2>Compatibility</h2>
<p>Fully backward compatible with all 1.0.x releases.</p>
<p>Supported platforms:</p>
<ul>
<li>Java 17+</li>
<li>Spring Boot 3.x</li>
<li>Spring Boot 4.x</li>
<li>OpenAPI Generator 7.x</li>
<li>Maven-based client generation</li>
</ul>
<hr>
<h2>Impact</h2>
<ul>
<li>No migration required</li>
<li>No breaking contract changes</li>
<li>Expanded supported generic response shapes</li>
<li>BYOE nested container support</li>
<li>Stronger projection guarantees</li>
<li>Deterministic specification validation</li>
<li>Improved long-term maintainability of projection and reconstruction logic</li>
</ul>
<hr>
<h2>Closed Issues</h2>
<ul>
<li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4706728239" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/24" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/24/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/24">#24</a> Introduce extensible generic container infrastructure</li>
<li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4707977956" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/25" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/25/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/25">#25</a> Establish deterministic OpenAPI specification validation</li>
</ul>
<hr>
<h2>Summary</h2>
<p>v1.1.0 expands OpenAPI Generics from a Page-oriented generic reconstruction model into a container-aware platform architecture.</p>
<p>The release introduces:</p>
<ul>
<li>extensible generic container support</li>
<li>List, Set, and Page reconstruction</li>
<li>BYOE container support</li>
<li>deterministic OpenAPI snapshot validation</li>
<li>expanded end-to-end verification coverage</li>
</ul>
<p>while preserving the contract-first architecture and backward compatibility established in the 1.0.x GA line.</p>
bsayli
tag:github.com,2008:Repository/1045192298/v1.0.3
2026-06-13T10:25:05Z
v1.0.3 — Type Coverage Validation, Platform Hardening and Generator Alignment
<p>This release is a <strong>patch-level update</strong> for the 1.0.x GA line, focusing on platform correctness, validation coverage, generation consistency, and end-to-end verification.</p>
<p>No contract changes.<br>
No public API behavior changes.<br>
No generated client structure changes.</p>
<p>Fully compatible with the <strong>1.0.0, 1.0.1, and 1.0.2 GA contracts</strong>.</p>
<hr>
<h2>What This Release Improves</h2>
<ul>
<li>Generic wrapper reconstruction is now validated through dedicated type coverage suites</li>
<li>Direct enum payload support is formally enforced and documented</li>
<li>OpenAPI Generator version alignment is now deterministic across the entire generation pipeline</li>
<li>Ignored model handling is aligned with upstream OpenAPI Generator processing lifecycle</li>
<li>Spring Boot 3 and Spring Boot 4 sample verification has been refreshed and upgraded</li>
</ul>
<hr>
<h2>Type Coverage Validation</h2>
<p>This release introduces dedicated type coverage samples that verify the complete contract-to-client lifecycle.</p>
<p>The new validation suites cover:</p>
<ul>
<li>Canonical <code>ServiceResponse<T></code> usage</li>
<li>Custom BYOE response envelopes</li>
<li>Generic wrapper reconstruction</li>
<li>OpenAPI projection correctness</li>
<li>Generated client compatibility</li>
<li>End-to-end producer/client/consumer verification</li>
</ul>
<p>These samples provide a focused environment for validating supported generic response patterns and preventing regressions in future releases.</p>
<hr>
<h2>Enum Payload Validation</h2>
<p>Direct enum payload support is now explicitly validated.</p>
<p>OpenAPI Generics relies on stable OpenAPI component identities for generic wrapper reconstruction.</p>
<p>As a result:</p>
<ul>
<li>Direct enum payloads are supported only when exposed as reusable OpenAPI schema components</li>
<li><code>@Schema(enumAsRef = true)</code> is now required for enum payload reconstruction</li>
<li>Unsupported inline enum payloads are rejected during response type discovery</li>
<li>DTOs containing enum fields remain fully supported</li>
</ul>
<p>This change enforces an existing architectural boundary rather than introducing a new capability.</p>
<hr>
<h2>Generator Consistency</h2>
<p>Generator version alignment has been hardened across the full client-generation lifecycle.</p>
<p>The configured OpenAPI Generator version now consistently drives:</p>
<ul>
<li>plugin execution</li>
<li>generator runtime dependencies</li>
<li>upstream template extraction</li>
<li>internal generation behavior</li>
</ul>
<p>This removes version drift scenarios and improves reproducibility for advanced customization and generator upgrades.</p>
<hr>
<h2>Generator Lifecycle Hardening</h2>
<p>Ignored models are now removed before upstream OpenAPI Generator global model processing begins.</p>
<p>This prevents intentionally excluded schemas from participating in model graph traversal and eliminates misleading warning messages during generation.</p>
<p>Benefits include:</p>
<ul>
<li>cleaner generation output</li>
<li>improved CI/CD log quality</li>
<li>better alignment with upstream generator lifecycle expectations</li>
</ul>
<p>Generated source behavior remains unchanged.</p>
<hr>
<h2>Platform & Sample Updates</h2>
<ul>
<li>Upgraded platform modules and samples to Spring Boot 3.5.15</li>
<li>Upgraded OpenAPI Generator alignment to 7.23.0</li>
<li>Upgraded Spring Boot 4 samples to Spring Boot 4.0.7</li>
<li>Simplified sample module structure and metadata</li>
<li>Expanded sample documentation and verification workflows</li>
</ul>
<hr>
<h2>Quality & Verification</h2>
<ul>
<li>Added regression coverage for enum payload discovery</li>
<li>Added regression coverage for ignored model lifecycle handling</li>
<li>Added regression coverage for generator version consistency</li>
<li>Verified Spring Boot 3 sample pipeline</li>
<li>Verified Spring Boot 4 sample pipeline</li>
<li>Verified Docker-based sample execution</li>
<li>Verified end-to-end producer/client/consumer flows</li>
</ul>
<hr>
<h2>Impact</h2>
<ul>
<li>No migration required</li>
<li>No contract changes</li>
<li>No generated client changes</li>
<li>More deterministic generation behavior</li>
<li>Stronger validation of supported response patterns</li>
<li>Improved sample-based verification coverage</li>
<li>Cleaner and more predictable build output</li>
</ul>
<hr>
<h2>Summary</h2>
<p>v1.0.3 is a <strong>platform hardening, validation, and verification update</strong>.</p>
<p>It strengthens the platform by:</p>
<ul>
<li>validating generic response reconstruction through dedicated coverage suites</li>
<li>enforcing supported enum payload boundaries</li>
<li>eliminating generator lifecycle inconsistencies</li>
<li>guaranteeing generator version alignment</li>
<li>improving reproducibility across local, CI, and sample verification environments</li>
</ul>
<p>Without changing the contract-first architecture introduced in <strong>1.0.0 GA</strong>.</p>
<h2>Closed Issues</h2>
<ul>
<li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4654567978" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/23" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/23/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/23">#23</a> Enforce reusable enum component requirement for direct enum payloads</li>
<li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4528294530" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/22" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/22/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/22">#22</a> Prevent ignored models from entering upstream global model post-processing</li>
<li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4508017993" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/21" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/21/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/21">#21</a> Honor configured OpenAPI Generator version across generation pipeline</li>
</ul>
bsayli
tag:github.com,2008:Repository/1045192298/v1.0.2
2026-05-16T14:32:29Z
v1.0.2 — Documentation Clarity, BYOC Hardening and Verified Build Quality
<p>This release is a <strong>patch-level update</strong> for the 1.0.x GA line, focusing on documentation clarity, defensive validation, and build verification.</p>
<p>No contract changes.<br>
No public API behavior changes.<br>
No generated client structure changes.</p>
<p>Fully compatible with the <strong>1.0.0 and 1.0.1 GA contracts</strong>.</p>
<hr>
<h2>What This Release Improves</h2>
<ul>
<li>Documentation now follows a clearer <strong>problem → proof → adoption</strong> flow</li>
<li>Server and client adoption guides are more explicit and easier to follow</li>
<li>BYOE and BYOC configuration semantics are clarified</li>
<li>External model validation is more defensive and provides better diagnostics</li>
<li>Sample pipelines and CI verification are more robust and reproducible</li>
</ul>
<hr>
<h2>Documentation & Adoption Clarity</h2>
<ul>
<li>Reworked README and documentation site structure for faster evaluation and onboarding</li>
<li>Clarified server-side and client-side adoption guides</li>
<li>Documented that <code>openapi-generics-server-starter</code> runs <strong>only during Springdoc OpenAPI document generation</strong> (<code>/v3/api-docs</code> and CI generation)</li>
<li>Clarified Bring Your Own Envelope (BYOE) configuration and constraints</li>
<li>Clarified Bring Your Own Contract (BYOC) usage and shared-contract patterns</li>
<li>Clarified fallback behavior for reverting to standard OpenAPI Generator output</li>
<li>Improved sample documentation and run-and-verify instructions</li>
</ul>
<hr>
<h2>Build & Dependency Quality</h2>
<ul>
<li>Centralized version management and strengthened parent POM alignment</li>
<li>Added Spotless-based source formatting to the build</li>
<li>Improved Docker-based sample builds for self-contained local verification</li>
<li>Strengthened CI workflows for snapshot and local-install validation</li>
</ul>
<hr>
<h2>BYOC Hardening</h2>
<p>External model registration is now more defensive.</p>
<ul>
<li>Ignores null, blank, and invalid FQCN mappings</li>
<li>Emits clear diagnostic warnings for invalid configuration</li>
<li>Prevents accidental registration of malformed external model definitions</li>
</ul>
<p>This improves reliability when reusing DTOs from shared contract modules.</p>
<hr>
<h2>Quality & Verification</h2>
<ul>
<li>Added unit tests for invalid and edge-case external model configurations</li>
<li>Stabilized Spring Boot 3 and Spring Boot 4 sample pipelines</li>
<li>Verified end-to-end Docker-based sample execution</li>
</ul>
<hr>
<h2>Impact</h2>
<ul>
<li>No migration required</li>
<li>No behavior changes for existing users</li>
<li>Improved clarity of adoption and configuration</li>
<li>More robust BYOC diagnostics</li>
<li>Stronger reproducibility across local and CI builds</li>
</ul>
<hr>
<h2>Summary</h2>
<p>v1.0.2 is a <strong>documentation, diagnostics, and build quality update</strong>.</p>
<p>It makes the platform:</p>
<ul>
<li>easier to understand</li>
<li>easier to adopt</li>
<li>more defensive in BYOC configuration</li>
<li>more reproducible across build and verification pipelines</li>
</ul>
<p>Without changing the contract-first architecture introduced in <strong>1.0.0 GA</strong>.</p>
bsayli
tag:github.com,2008:Repository/1045192298/v1.0.1
2026-05-01T13:26:29Z
v1.0.1 — Build Hygiene, Dependency Alignment and Verified Release Stability
<p>This release is a <strong>patch-level update</strong> for the 1.0.x GA line, focusing on build correctness, dependency alignment, and release readiness.</p>
<p>No contract changes.<br>
No public API behavior changes.<br>
No generated client structure changes.</p>
<p>Fully compatible with the <strong>1.0.0 GA contract</strong>.</p>
<hr>
<h2>What This Release Improves</h2>
<ul>
<li>Maven build structure is now <strong>cleanly partitioned between aggregator and modules</strong></li>
<li>Plugin execution boundaries are <strong>strictly enforced</strong></li>
<li>Dependency alignment is <strong>deterministic across all modules</strong></li>
<li>Release pipeline is <strong>fully verified and reproducible</strong></li>
</ul>
<hr>
<h2>Build & Dependency Alignment</h2>
<ul>
<li>Refined Maven POM hygiene across all platform modules</li>
<li>Ensured root aggregator remains lifecycle-safe (no unintended plugin execution)</li>
<li>Scoped build orchestration strictly to child modules</li>
<li>Strengthened dependency management and explicitly controlled transitive versions</li>
<li>Updated OpenAPI Generator alignment to <strong>7.22.0</strong></li>
<li>Upgraded Spring Boot baseline to <strong>3.5.14</strong> across platform modules and samples</li>
</ul>
<hr>
<h2>Template Governance (Zero-Drift Guarantee)</h2>
<p>The platform continues to enforce a <strong>no-fork, no-drift strategy</strong> for OpenAPI Generator templates.</p>
<ul>
<li>Upstream templates are dynamically extracted during build</li>
<li>A targeted, non-destructive patch injects generics-aware wrapper logic</li>
<li>The patch is <strong>signature-validated at build time</strong></li>
</ul>
<p>If upstream structure changes:</p>
<blockquote>
<p>The build fails fast instead of producing invalid clients</p>
</blockquote>
<p>This guarantees long-term alignment with the OpenAPI Generator <strong>7.x</strong> line without template divergence.</p>
<hr>
<h2>Quality & Verification</h2>
<ul>
<li>
<p>Integrated JaCoCo + Codecov for coverage visibility</p>
</li>
<li>
<p>Added unit and edge-case coverage for:</p>
<ul>
<li>server-side projection</li>
<li>wrapper enrichment logic</li>
</ul>
</li>
<li>
<p>Verified full pipelines across:</p>
<ul>
<li>Spring Boot 3</li>
<li>Spring Boot 4</li>
</ul>
</li>
</ul>
<hr>
<h2>Impact</h2>
<ul>
<li>
<p>No behavioral change for existing users</p>
</li>
<li>
<p>No migration required</p>
</li>
<li>
<p>Improved reliability of:</p>
<ul>
<li>build lifecycle</li>
<li>dependency resolution</li>
<li>release publishing</li>
</ul>
</li>
</ul>
<hr>
<h2>Summary</h2>
<p>v1.0.1 is a <strong>release-hygiene and alignment update</strong>.</p>
<p>It ensures that the platform is:</p>
<ul>
<li>structurally clean</li>
<li>dependency-stable</li>
<li>reproducible in build and release pipelines</li>
</ul>
<p>Without altering the core contract model introduced in <strong>1.0.0 GA</strong>.</p>
bsayli
tag:github.com,2008:Repository/1045192298/v1.0.0
2026-04-22T20:23:26Z
v1.0.0 — Contract-First Generics Platform with Bring Your Own Envelope (BYOE) and End-to-End Stability
<p>This release marks the <strong>General Availability</strong> of the openapi-generics platform.</p>
<p>The architecture is now <strong>complete, stable, and adoption-ready</strong>.</p>
<blockquote>
<p>The platform no longer defines how you should build APIs —<br>
it adapts to how you already build them.</p>
</blockquote>
<hr>
<h2>What This Release Establishes</h2>
<ul>
<li>Contract-first architecture is now <strong>fully enforced and stable</strong></li>
<li>Custom response envelopes (<strong>BYOE</strong>) are now <strong>fully supported</strong></li>
<li>External contract reuse (<strong>BYOC</strong>) is <strong>first-class</strong></li>
<li>OpenAPI is strictly a <strong>projection layer (not a contract source)</strong></li>
<li>The full pipeline is <strong>deterministic and validated end-to-end</strong></li>
</ul>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Contract → Server → OpenAPI → Client → Consumer"><pre class="notranslate"><code>Contract → Server → OpenAPI → Client → Consumer
</code></pre></div>
<hr>
<h2>Key Feature — BYOE (Bring Your Own Envelope)</h2>
<p>The platform no longer requires <code>ServiceResponse<T></code>.</p>
<p>Teams can now use their <strong>existing envelope</strong> without migration.</p>
<h3>Server</h3>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="openapi-generics:
envelope:
type: io.example.ApiResponse"><pre><span class="pl-ent">openapi-generics</span>:
<span class="pl-ent">envelope</span>:
<span class="pl-ent">type</span>: <span class="pl-s">io.example.ApiResponse</span></pre></div>
<h3>Client (Codegen)</h3>
<div class="highlight highlight-text-xml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="<additionalProperty>
openapi-generics.envelope=io.example.ApiResponse
</additionalProperty>"><pre><<span class="pl-ent">additionalProperty</span>>
openapi-generics.envelope=io.example.ApiResponse
</<span class="pl-ent">additionalProperty</span>></pre></div>
<h3>Behavior</h3>
<ul>
<li>Default → <code>ServiceResponse<T></code> (no change)</li>
<li>Configured → custom envelope fully replaces default</li>
</ul>
<h3>Scope</h3>
<ul>
<li><code>ApiResponse<T></code> ✅</li>
<li><code>ApiResponse<Page<T>></code> ❌ (intentionally out of scope)</li>
</ul>
<hr>
<h2>What Changed</h2>
<h3>Envelope Abstraction Becomes Configurable</h3>
<ul>
<li>
<p>Introduced <code>EnvelopeMetadataResolver</code></p>
</li>
<li>
<p>Injects:</p>
<ul>
<li><code>x-envelope-import</code></li>
<li><code>x-envelope-type</code></li>
</ul>
</li>
<li>
<p><code>api_wrapper.mustache</code> is now fully dynamic</p>
</li>
</ul>
<p>Result:</p>
<blockquote>
<p>Envelope is no longer hardcoded — it is resolved at generation time</p>
</blockquote>
<hr>
<h3>Server Projection Refinement</h3>
<ul>
<li>
<p>Removed class-level annotation injection from projection</p>
</li>
<li>
<p>Projection is now strictly:</p>
<ul>
<li>language-agnostic</li>
<li>semantic-only</li>
</ul>
</li>
<li>
<p>Wrapper processing is now <strong>non-destructive</strong>:</p>
<ul>
<li>no schema overrides</li>
<li>only enrichment</li>
</ul>
</li>
<li>
<p>Relaxed validation constraints:</p>
<ul>
<li><code>allOf</code> no longer required</li>
</ul>
</li>
</ul>
<p>Result:</p>
<blockquote>
<p>OpenAPI remains a clean projection of the contract</p>
</blockquote>
<hr>
<h3>Codegen Alignment</h3>
<ul>
<li>Full support for BYOE in generator layer</li>
<li>Wrapper models dynamically extend configured envelope</li>
<li>External models + envelope now resolved consistently</li>
</ul>
<p>Result:</p>
<blockquote>
<p>Client generation remains deterministic under customization</p>
</blockquote>
<hr>
<h3>Documentation Overhaul</h3>
<p>All sample documentation rewritten to be:</p>
<ul>
<li>minimal</li>
<li>action-oriented</li>
<li>usage-first</li>
</ul>
<p>Removed:</p>
<ul>
<li>narrative explanations</li>
<li>redundant architecture descriptions</li>
</ul>
<p>Result:</p>
<blockquote>
<p>Faster onboarding, clearer intent</p>
</blockquote>
<hr>
<h3>Pipeline Stabilization</h3>
<p>The full system is now verified as:</p>
<ul>
<li>deterministic</li>
<li>reproducible</li>
<li>contract-aligned</li>
</ul>
<p>Across:</p>
<ul>
<li>Server projection</li>
<li>OpenAPI output</li>
<li>Client generation</li>
<li>Consumer integration</li>
</ul>
<hr>
<h2>Impact</h2>
<ul>
<li>
<p>No forced envelope migration</p>
</li>
<li>
<p>Existing systems can adopt incrementally</p>
</li>
<li>
<p>No model duplication in clients</p>
</li>
<li>
<p>Clear separation of concerns:</p>
<ul>
<li>contract</li>
<li>projection</li>
<li>generation</li>
<li>consumption</li>
</ul>
</li>
<li>
<p>Reduced cognitive load for adopters</p>
</li>
</ul>
<hr>
<h2>🔐 Compatibility</h2>
<table>
<thead>
<tr>
<th>Component</th>
<th>Supported Versions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Java</td>
<td>17+</td>
</tr>
<tr>
<td>Spring Boot</td>
<td>3.x / 4.x</td>
</tr>
</tbody>
</table>
<hr>
<h2>Context</h2>
<p>Previous releases established:</p>
<ul>
<li>modular platform structure</li>
<li>contract-first baseline</li>
<li>generics-aware generation</li>
<li>BYOC (Bring Your Own Contract)</li>
</ul>
<p>This release completes the model by introducing:</p>
<blockquote>
<p>BYOE — making the platform adaptable to existing systems</p>
</blockquote>
<hr>
<h2>Summary</h2>
<p>v1.0.0 is a <strong>stability and adoption release</strong>.</p>
<p>The platform is now:</p>
<ul>
<li>contract-first</li>
<li>projection-driven</li>
<li>generator-aligned</li>
<li>envelope-agnostic</li>
</ul>
<p>No hidden behavior.<br>
No forced abstractions.</p>
<p>Just:</p>
<blockquote>
<p>deterministic contracts, adaptable integration, and end-to-end alignment.</p>
</blockquote>
bsayli
tag:github.com,2008:Repository/1045192298/v0.9.0
2026-04-12T16:15:46Z
v0.9.0 — Contract-First Generics Platform, BYOC, and End-to-End Validation
<p>This release formalizes the architecture that has been evolving across previous versions.</p>
<p>The platform is now <strong>explicitly contract-first</strong>, supports <strong>external contract reuse (BYOC)</strong>, and is <strong>validated end-to-end</strong> with real consumer modules.</p>
<blockquote>
<p>This is the release where the architecture is no longer a concept — it runs.</p>
</blockquote>
<hr>
<h2>🎯 What This Release Establishes</h2>
<ul>
<li>Contract-first generation is now <strong>explicit and enforced</strong></li>
<li>External contract reuse (<strong>Bring Your Own Contract - BYOC</strong>) is now <strong>first-class</strong></li>
<li>The full pipeline is <strong>proven end-to-end</strong>:</li>
</ul>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Contract → OpenAPI → Generated Client → Consumer"><pre class="notranslate"><code>Contract → OpenAPI → Generated Client → Consumer
</code></pre></div>
<ul>
<li>Both <strong>Spring Boot 3</strong> and <strong>Spring Boot 4</strong> stacks are validated</li>
</ul>
<hr>
<h2>🔧 What Changed</h2>
<h3>Explicit Generator Activation</h3>
<ul>
<li><code>generatorName=java-generics-contract</code> is now required</li>
<li>implicit activation removed from parent configuration</li>
</ul>
<p>This makes generation behavior:</p>
<blockquote>
<p>explicit, predictable, and debuggable</p>
</blockquote>
<hr>
<h3>External Contract Reuse (BYOC)</h3>
<ul>
<li>Introduced <code>openapiGenerics.responseContract.*</code> mapping</li>
<li>Enabled reuse of externally owned DTOs</li>
<li>Prevented duplicate model generation</li>
<li>Ensured correct import injection in generated wrappers</li>
</ul>
<p>This establishes:</p>
<blockquote>
<p>contract ownership outside the generator, without drift</p>
</blockquote>
<hr>
<h3>Codegen Refactoring</h3>
<p>Generator internals were decomposed for clarity and control:</p>
<ul>
<li><code>ExternalModelRegistry</code></li>
<li><code>ModelIgnoreDecider</code></li>
<li><code>ExternalImportResolver</code></li>
</ul>
<p><code>GenericAwareJavaCodegen</code> is now focused on orchestration only.</p>
<hr>
<h3>Spring Boot 4 Client Support</h3>
<ul>
<li>RestClient-based client generation</li>
<li>Jackson 3 compatibility</li>
<li>Fixed compile-time issues in SB4 client</li>
</ul>
<hr>
<h3>Consumer Module (NEW)</h3>
<ul>
<li>Added <code>customer-service-consumer</code> (SB3 & SB4)</li>
<li>Demonstrates real client usage</li>
<li>Validates full pipeline integration</li>
</ul>
<p>This provides:</p>
<blockquote>
<p>executable proof that contract alignment holds in real usage</p>
</blockquote>
<hr>
<h3>CI & Coverage Updates</h3>
<ul>
<li>Coverage scoped to sample modules</li>
<li>Baseline adjusted to 50%</li>
<li>Workflows updated for SB3 / SB4 structure</li>
</ul>
<hr>
<h3>Documentation Updates</h3>
<ul>
<li>Aligned client adoption guide with explicit configuration model</li>
<li>Clarified generator usage</li>
<li>Documented contract reuse approach</li>
</ul>
<hr>
<h2>📦 Impact</h2>
<ul>
<li>Client generation is now <strong>explicit and deterministic</strong></li>
<li>External contract models are <strong>reused (no duplication)</strong></li>
<li>Generator behavior is <strong>easier to reason about and debug</strong></li>
<li>Architecture is <strong>validated with real consumer integration</strong></li>
<li>Documentation reflects <strong>actual system behavior</strong></li>
</ul>
<hr>
<h2>🔐 Compatibility</h2>
<table>
<thead>
<tr>
<th>Component</th>
<th>Supported Versions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Java</td>
<td>17+</td>
</tr>
<tr>
<td>Spring Boot</td>
<td>3.x / 4.x</td>
</tr>
</tbody>
</table>
<hr>
<h2>🧭 Context</h2>
<p>Previous releases established:</p>
<ul>
<li>platform modularization</li>
<li>Maven Central publishing</li>
<li>generics-aware generation baseline</li>
</ul>
<p>This release completes the picture by ensuring:</p>
<blockquote>
<p>contract definition, projection, generation, and consumption are aligned and verifiable</p>
</blockquote>
<hr>
<h2>🎯 Summary</h2>
<p>v0.9.0 is an <strong>architecture consolidation release</strong>.</p>
<p>No shortcuts. No implicit behavior.</p>
<p>Just:</p>
<blockquote>
<p>explicit contracts, deterministic generation, and proven end-to-end alignment.</p>
</blockquote>
bsayli
tag:github.com,2008:Repository/1045192298/v0.8.2
2026-04-05T21:58:17Z
v0.8.2 — Java 17 Baseline & Compatibility Alignment
<p>This release focuses on <strong>broadening runtime compatibility</strong> by aligning the platform to a <strong>Java 17 baseline</strong>.</p>
<p>No architectural changes are introduced.</p>
<blockquote>
<p>This is a follow-up release to v0.8.1, which established the platform structure and Maven Central distribution.</p>
</blockquote>
<hr>
<h2>🔧 What Changed</h2>
<h3>Java Baseline Alignment</h3>
<p>All core modules are now:</p>
<ul>
<li>compiled with <strong>Java 17</strong></li>
<li>compatible with <strong>Java 17+ runtimes</strong></li>
</ul>
<p>This allows the platform to be used in:</p>
<ul>
<li>enterprise environments still on Java 17</li>
<li>newer runtimes (Java 21, 25+) without restriction</li>
</ul>
<hr>
<h2>📦 Impact</h2>
<ul>
<li>no changes to public API</li>
<li>no changes to contract semantics</li>
<li>no changes to OpenAPI generation behavior</li>
<li>no changes to client generation</li>
</ul>
<p>Only:</p>
<blockquote>
<p>compilation baseline is lowered for wider adoption</p>
</blockquote>
<hr>
<h2>🔐 Compatibility</h2>
<table>
<thead>
<tr>
<th>Component</th>
<th>Supported Versions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Java</td>
<td>17+</td>
</tr>
</tbody>
</table>
<hr>
<h2>🧭 Context</h2>
<p>Release <strong>0.8.1</strong> introduced:</p>
<ul>
<li>platform modularization</li>
<li>Maven Central publishing</li>
<li>contract-first architecture</li>
</ul>
<p>This release ensures that foundation is:</p>
<blockquote>
<p>accessible to a broader Java ecosystem</p>
</blockquote>
<hr>
<h2>🎯 Summary</h2>
<p>v0.8.2 is a <strong>compatibility refinement release</strong>.</p>
<p>No new features. No behavioral changes.</p>
<p>Just:</p>
<blockquote>
<p>wider reach, same architecture.</p>
</blockquote>
bsayli
tag:github.com,2008:Repository/1045192298/v0.8.1
2026-04-04T17:03:14Z
v0.8.1 — Platform Modularization & Maven Central Publishing
<h1>OpenAPI Generics v0.8.1 — Platform Modularization & Maven Central Publishing</h1>
<p>Release <strong>0.8.1</strong> marks the point where the project transitions from a reference implementation into a <strong>publishable, dependency-driven platform</strong>.</p>
<p>All core capabilities are now packaged as modular artifacts and <strong>available on Maven Central</strong>, enabling direct adoption without copying code or maintaining local templates.</p>
<blockquote>
<p>Define your contract once. Depend on the platform. Generate clients deterministically.</p>
</blockquote>
<hr>
<h1>✨ Highlights</h1>
<h2>📦 Maven Central Publishing (First-Class Distribution)</h2>
<p>All platform modules are now published and versioned:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="io.github.blueprint-platform
version: 0.8.x"><pre class="notranslate"><code>io.github.blueprint-platform
version: 0.8.x
</code></pre></div>
<p>Available artifacts:</p>
<ul>
<li><code>openapi-generics</code></li>
<li><code>openapi-generics-contract</code></li>
<li><code>openapi-generics-server-starter</code></li>
<li><code>openapi-generics-java-codegen</code></li>
<li><code>openapi-generics-java-codegen-parent</code></li>
<li><code>openapi-generics-platform-bom</code></li>
</ul>
<p>This establishes the platform as a <strong>consumable dependency</strong>, not a codebase to replicate.</p>
<hr>
<h2>🧱 Platform Modularization (Clear Ownership Boundaries)</h2>
<p>The system is now decomposed into <strong>independently versioned modules</strong> with explicit responsibilities:</p>
<ul>
<li><strong>Contract</strong> → <code>openapi-generics-contract</code></li>
<li><strong>Projection (OpenAPI)</strong> → <code>openapi-generics-server-starter</code></li>
<li><strong>Generation</strong> → <code>openapi-generics-java-codegen</code></li>
<li><strong>Build orchestration</strong> → <code>openapi-generics-java-codegen-parent</code></li>
<li><strong>Dependency alignment</strong> → <code>openapi-generics-platform-bom</code></li>
</ul>
<p>Ownership is no longer implicit.</p>
<blockquote>
<p>Contract defines truth → OpenAPI represents it → Generator reconstructs it.</p>
</blockquote>
<hr>
<h2>🚀 Dependency-Based Usage (No Copying, No Templates)</h2>
<p>The platform is designed for <strong>direct integration via dependencies</strong>.</p>
<h3>Server (producer)</h3>
<div class="highlight highlight-text-xml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="<dependency>
<groupId>io.github.blueprint-platform</groupId>
<artifactId>openapi-generics-server-starter</artifactId>
<version>0.8.x</version>
</dependency>"><pre><<span class="pl-ent">dependency</span>>
<<span class="pl-ent">groupId</span>>io.github.blueprint-platform</<span class="pl-ent">groupId</span>>
<<span class="pl-ent">artifactId</span>>openapi-generics-server-starter</<span class="pl-ent">artifactId</span>>
<<span class="pl-ent">version</span>>0.8.x</<span class="pl-ent">version</span>>
</<span class="pl-ent">dependency</span>></pre></div>
<h3>Client (consumer)</h3>
<div class="highlight highlight-text-xml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="<parent>
<groupId>io.github.blueprint-platform</groupId>
<artifactId>openapi-generics-java-codegen-parent</artifactId>
<version>0.8.x</version>
</parent>"><pre><<span class="pl-ent">parent</span>>
<<span class="pl-ent">groupId</span>>io.github.blueprint-platform</<span class="pl-ent">groupId</span>>
<<span class="pl-ent">artifactId</span>>openapi-generics-java-codegen-parent</<span class="pl-ent">artifactId</span>>
<<span class="pl-ent">version</span>>0.8.x</<span class="pl-ent">version</span>>
</<span class="pl-ent">parent</span>></pre></div>
<p>That’s it.</p>
<p>Everything else in this repository is a <strong>reference implementation</strong> of this setup.</p>
<hr>
<h2>🧱 First-Class Canonical Contract (SSOT)</h2>
<p>The response model is now a dedicated artifact:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="openapi-generics-contract"><pre class="notranslate"><code>openapi-generics-contract
</code></pre></div>
<p>It defines:</p>
<ul>
<li><code>ServiceResponse<T></code> as the canonical envelope</li>
<li><code>Page<T></code> and pagination primitives</li>
<li>a consistent RFC 9457-aligned error model</li>
</ul>
<p>The contract is now explicit and reusable.</p>
<blockquote>
<p>It is the <strong>single source of truth (SSOT)</strong> across all layers.</p>
</blockquote>
<hr>
<h2>⚙️ Deterministic OpenAPI Projection Pipeline</h2>
<p>OpenAPI generation is implemented as a <strong>single orchestrated pipeline</strong>:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Discovery → Introspection → Wrapper Processing → Ignore Marking → Validation"><pre class="notranslate"><code>Discovery → Introspection → Wrapper Processing → Ignore Marking → Validation
</code></pre></div>
<p>Guarantees:</p>
<ul>
<li>deterministic output (same input → same OpenAPI)</li>
<li>single execution path (no fragmented lifecycle)</li>
<li>fail-fast validation</li>
<li>framework isolation (MVC/WebFlux via strategy)</li>
</ul>
<hr>
<h2>🧩 Contract-Aware Client Generation</h2>
<p>Client generation is now <strong>aligned with the contract</strong>, not template hacks.</p>
<p>Behavior:</p>
<ul>
<li>contract-owned models are <strong>never generated</strong></li>
<li><code>x-ignore-model</code> is enforced</li>
<li>only <strong>thin wrapper types</strong> are emitted</li>
<li>imports bind directly to canonical types</li>
</ul>
<p>Example:</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="public class ServiceResponsePageCustomerDto
extends ServiceResponse<Page<CustomerDto>> {}"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-smi">ServiceResponsePageCustomerDto</span>
<span class="pl-k">extends</span> <span class="pl-smi">ServiceResponse</span><<span class="pl-smi">Page</span><<span class="pl-smi">CustomerDto</span>>> {}</pre></div>
<p>Result:</p>
<ul>
<li>generics preserved end-to-end</li>
<li>zero duplication</li>
<li>stable type system</li>
</ul>
<hr>
<h2>🚫 Elimination of Generation Hacks</h2>
<p>Removed completely:</p>
<ul>
<li><code>.openapi-generator-ignore</code></li>
<li>DTO cleanup steps</li>
<li>formatter-based import fixes</li>
<li>scattered template overrides</li>
</ul>
<p>Replaced by:</p>
<ul>
<li>contract ownership</li>
<li>projection-time semantics</li>
<li>generator-level enforcement</li>
</ul>
<blockquote>
<p>No post-processing. No cleanup. No hidden behavior.</p>
</blockquote>
<hr>
<h2>🧠 Vendor Extensions as a Formal DSL</h2>
<p>Contract semantics are expressed via a deterministic extension model:</p>
<ul>
<li><code>x-api-wrapper</code></li>
<li><code>x-api-wrapper-datatype</code></li>
<li><code>x-data-container</code></li>
<li><code>x-data-item</code></li>
<li><code>x-ignore-model</code></li>
</ul>
<p>These are:</p>
<ul>
<li>defined during projection</li>
<li>carried through OpenAPI</li>
<li>enforced during generation</li>
</ul>
<hr>
<h2>🧪 Samples Decoupled from Runtime</h2>
<p>Samples are moved to <code>/samples</code> and act as:</p>
<blockquote>
<p>external consumers validating the platform</p>
</blockquote>
<p>This separates platform logic from usage examples.</p>
<hr>
<h2>📘 Documentation Realignment</h2>
<p>Docs are restructured around a <strong>contract lifecycle model</strong>:</p>
<ul>
<li>problem → solution → proof → usage</li>
<li>clear server vs client responsibilities</li>
<li>projection vs authority distinction</li>
<li>mental model: <em>thin adapters, not models</em></li>
</ul>
<hr>
<h1>🎯 Outcome</h1>
<p>Release <strong>0.8.1</strong> establishes the platform foundation:</p>
<ul>
<li>platform is consumable via Maven Central</li>
<li>contract is defined once and reused everywhere</li>
<li>OpenAPI is a deterministic projection (not authority)</li>
<li>clients reconstruct contract shape instead of redefining it</li>
<li>build pipelines are predictable and maintainable</li>
</ul>
<hr>
<h1>🔐 Compatibility</h1>
<p>No breaking changes to:</p>
<ul>
<li>response envelope semantics</li>
<li>OpenAPI schema meaning</li>
<li>runtime behavior</li>
</ul>
<p>Changes are architectural and structural.</p>
<hr>
<h1>🧭 Direction</h1>
<p>The platform now follows a strict principle:</p>
<blockquote>
<p>define semantic contracts once — project, reconstruct, and consume them without reinterpretation</p>
</blockquote>
<p>Everything else is infrastructure.</p>
<hr>
<h1>🚀 Looking Ahead</h1>
<p>Next iterations will focus on:</p>
<ul>
<li>expanding reusable contract tooling</li>
<li>validating multi-service adoption</li>
<li>preparing for <strong>1.0.0</strong> stabilization</li>
</ul>
<p>The direction remains unchanged:</p>
<p><strong>contract integrity, deterministic pipelines, and dependency-driven adoption.</strong></p>
bsayli
tag:github.com,2008:Repository/1045192298/v0.7.9
2026-03-25T14:48:21Z
v0.7.9 — Deterministic Client Generation & OpenAPI Template Governance
<p>Release <strong>0.7.9</strong> focuses on making generics‑aware client generation <strong>upgrade‑safe, deterministic, and operationally maintainable</strong>.</p>
<p>While earlier versions demonstrated the architectural pattern and stabilized runtime contract behavior, this release delivers a key engineering improvement:</p>
<blockquote>
<p><strong>Automated, fail‑fast governance of upstream OpenAPI Generator template changes.</strong></p>
</blockquote>
<p>The result is a significantly more robust client build pipeline that removes manual template maintenance risks and improves long‑term evolution safety.</p>
<p>No breaking changes were introduced to response envelope semantics or canonical contract usage.</p>
<hr>
<h1>✨ Highlights</h1>
<h2>⚙️ Fail‑Fast Governed OpenAPI Template Patching</h2>
<p>Client generation now applies a <strong>deterministic build‑time patch</strong> to the upstream <code>model.mustache</code> template using Maven Antrun.</p>
<p>This replaces the previous approach where modified templates had to be:</p>
<ul>
<li>manually copied</li>
<li>locally maintained</li>
<li>periodically re‑aligned with upstream generator changes</li>
</ul>
<p>The new mechanism:</p>
<ul>
<li>automatically extracts the upstream template during build</li>
<li>applies a controlled semantic patch targeting wrapper rendering</li>
<li>verifies the patch signature</li>
<li><strong>fails the build immediately</strong> if upstream template structure changes</li>
</ul>
<p>This establishes a safer upgrade path for OpenAPI Generator versions while preserving the generics‑aware wrapper model.</p>
<hr>
<h2>🧩 Simplified Generics Wrapper Rendering Strategy</h2>
<p>Wrapper generation logic has been streamlined to reduce template surface area and eliminate redundant overlay complexity.</p>
<p>The client build now:</p>
<ul>
<li>intercepts only the <strong>model rendering branch</strong> relevant to canonical response envelopes</li>
<li>keeps local template overlays minimal and declarative</li>
<li>preserves thin inheritance‑based wrappers bound to the shared <code>api‑contract</code></li>
</ul>
<p>This reduces maintenance burden and improves architectural clarity.</p>
<hr>
<h2>🔁 Deterministic Client Build Pipeline</h2>
<p>The effective template generation process has been redesigned for reproducibility and developer ergonomics.</p>
<p>Key improvements include:</p>
<ul>
<li>removal of unused upstream template copying stages</li>
<li>clearer separation between upstream extraction and local semantic governance</li>
<li>stable effective template directory structure</li>
<li>reduced risk of silent drift across generator upgrades</li>
</ul>
<p>Client regeneration behaviour is now <strong>more predictable and observable</strong>.</p>
<hr>
<h2>🚀 Platform Stack Alignment</h2>
<p>This release also aligns the example client module with updated platform components:</p>
<ul>
<li>Spring Boot <strong>3.5.12</strong></li>
<li>OpenAPI Generator <strong>7.21.0</strong></li>
</ul>
<p>These upgrades are incorporated within the new governed template pipeline to ensure compatibility and forward evolution safety.</p>
<hr>
<h2>📘 Architecture Documentation Refinement</h2>
<p>Documentation has been restructured to better communicate the project as a <strong>contract lifecycle reference architecture</strong>.</p>
<p>Updates include:</p>
<ul>
<li>clearer explanation of server vs client lifecycle responsibilities</li>
<li>explicit scoping of supported generic response shapes</li>
<li>improved conceptual flow across README and adoption guides</li>
</ul>
<p>These changes improve onboarding clarity without affecting runtime behaviour.</p>
<hr>
<h1>🎯 Outcome</h1>
<p>Release <strong>0.7.9</strong> represents an important engineering maturity milestone:</p>
<ul>
<li>generics‑aware client generation becomes <strong>upgrade‑safe by design</strong></li>
<li>manual template maintenance is eliminated</li>
<li>build failures surface upstream generator incompatibilities early</li>
<li>contract‑driven integration patterns become easier to operationalize</li>
</ul>
<p>This strengthens the project’s long‑term goal:</p>
<p><strong>stable response contracts, deterministic client regeneration, and architecture‑aware API integration boundaries for Spring ecosystems.</strong></p>
<hr>
<h1>🧭 Looking Ahead</h1>
<p>With governed template evolution now in place, future iterations are expected to focus on:</p>
<ul>
<li>further modularization of reusable contract tooling</li>
<li>broader validation of the lifecycle pattern in multi‑service scenarios</li>
<li>incremental preparation for structural evolution in the upcoming <strong>0.8.x</strong> line</li>
</ul>
<p>The architectural direction remains consistent:</p>
<p><strong>publish semantic contracts once — interpret and consume them safely across system boundaries.</strong></p>
bsayli