Release 2.0.0¶
See GitHub Release.
Viaduct 2.0.0 is a major release. The headline work is named fragments and pre-validated GraphQL operations, tenant-local fields supporting better encapsulation, @parent supporting access to fields of parent object, and a settings-topology Gradle model for multi-project builds (as well as on-going work on selective resolvers and the Java Tenant API).
Two changes affect every consumer's build regardless of what else they use: the published artifact set is now fat JARs only (no BOM) and Gradle project plugins now require explicit import of Viaduct modules. Start with Breaking Changes below.
Breaking Changes¶
Build and packaging — affects every consumer¶
- Thin JARs and the BOM are no longer published; all consumers move to fat JARs (364f479b) by @nmarsollier —
com.airbnb.viaduct:bomand the 22core/*thin-JAR coordinates no longer resolve. - The five
com.airbnb.viaduct.shared:*thin JARs are no longer published (graphql,viaductschema,apiannotations,invariants,utils) — they are bundled inside the fat JARs and plugin JARs instead;service:api's POM was cleaned up (4e59880f) by @nmarsollier — a build naming these fails at dependency resolution, not compilation. - Gradle project plugins now require a settings-declared topology (6aa74cad) by @rstata — module plugins validate that the project is declared as a module in topology before wiring.
- The project-level package DSL was removed (442c8816) by @rstata
- Schema extension correctness is now enforced, and
validateViaductSchemaExtensionswas added (a675d8d7) by @gokhan-ozgozen — previously-tolerated schema extensions now fail the build.
Service and tenant API¶
- The Viaduct execution API was redesigned around Kotlin and Java idioms (0b6914f9) by @geovannefduarte —
Viaduct.execute/executeAsyncsignatures changed;SchemaId.Fullwas removed. - Tenant bootstrapper APIs were renamed (c0cdf7a9) by @andimarek —
TenantAPIBootstrapper,TenantAPIBootstrapperBuilder,TenantModuleBootstrapper,SharedTenantModuleBootstrapperandNaiveTenantModuleBootstrapperare all gone from the public surface. - Scanner-based tenant bootstrappers were removed (6145a783) by @junjinp
- The Java tenant API replaced classpath-scanning bootstrap with the file-based execution registry (74b8b7af) by @catacraciun
ViaductBuilder.withScopedSchemasFromSdlreplaces the publicwithSchemaConfiguration(14548217) by @geovannefduarte —withSchemaConfigurationandwithTenantModuleBootstrapperwere removed.- Schema scoping configuration is now explicit (8421bae3) by @andimarek —
SchemaScopeInfowas removed. - The
Selectionsannotation moved to the newviaduct.api.documentspackage (981db90b) by @kristileka —viaduct.api.select.Selectionsno longer exists. Part of the 2.0 API package reorganization. GlobalIDCodec.deserializenow has a named return type instead ofPair(e35fe079) by @geovannefduarteFlagManagersingleton objects were renamed to UpperCamelCase (13234296) by @geovannefduarte —FlagManager.default/FlagManager.disabledare nowDefault/Disabled.- Service factories and constants are exposed via
@JvmStatic, and the service API was reshaped for Java callers (9ba69a36, 228fa352) by @geovannefduarte — note for Java callers: the GraphiQL helper's JVM class is nowGraphiQLHtml, notGraphiQLHtmlKt. The functions themselves are unchanged; Kotlin callers are unaffected. TemporaryBypassAccessCheckSPI was retired in favour of a static engine config flag (834e009e) by @amity177FlagManager.Flags.EXECUTE_ACCESS_CHECKSwas removed; access checks now run unconditionally (2fed1507) by @amity177
Engine SPI — affects advanced integrators¶
resolveSelectionSetSyncwas renamed toresolveSelectionSet, the backward-compatibility shim was deleted, and the async path plusProxyEngineObjectDatawere removed (108134ad, c72ecde1, 42ace572) by @vickeyyehDataFetchingEnvironmentwas removed from node instrumentation params (b991d9e4) by @jbellengerinstrumentFetchSelectionandshouldInstrumentFetchSelectionswere removed (d8bd388d) by @vickeyyehobjectValue/queryValuewere removed fromFieldResolverExecutor.Selector(b6a4e36c) by @vickeyyeh- Selective OER keys were removed (6e9e0b8e) by @jbellenger
Experimental — x/remoteresolvers, not covered by the API stability contract¶
- Explicit resolver selection is now required (10d44e93) by @njlynch
- Remote-resolver enablement is now explicit (87741205) by @junjinp
- The in-process remote resolver transport was removed (236a5efc) by @cetinsahin
Features¶
Named fragments and pre-validated GraphQL operations¶
- Tenant-facing API surface for named GraphQL fragments and pre-validated operations — first phase of the Named Fragments RFC (ff51065e) by @kristileka
@GraphQLOperationstrings are executable at the tenant boundary with no engine change (f66a3c23) by @kristileka- Every declared
@GraphQLOperationis schema-validated at assembly time, so an invalid operation fails the build instead of failing at runtime (1cdeb38b) by @kristileka - KSP codegen plumbing for
@GraphQLOperation(QueryFromAnnotation/MutationFromAnnotation) (82b76bc2) by @kristileka - Propagation and validation layer for
@GraphQLFragment(f4b00368) by @kristileka - Two assembly-time validations for
@GraphQLFragment, closing a gap where an invalid fragment could reach runtime undetected (9978d5c2) by @kristileka - End-to-end contract tests for
@GraphQLOperation(1362350a) by @kristileka ctx.query/ctx.mutationtaking a selection string are now deprecated — they accept a string that can be invalid and unsafe. The overloads taking anOperationFromAnnotationare the new stable API (aaa3dc7c) by @kristileka@GraphQLOperationdocs, Star Wars demoapp examples and example-tenant examples (27b719d6) by @kristileka- A type-safe public way for tenants to check whether an input or argument field was explicitly provided rather than left unset (c8cf50ef) by @kristileka
@oneOf(exactly one field set) is enforced at the builder level in both the Java and Kotlin tenant APIs (022cdccd) by @catacraciun- Two new Viaduct tenant tutorials, continuing the series after tutorial 13 (887dd86c) by @kristileka
Tenant-local fields, @parent fields and schema scoping¶
- Tenant-local base schema support (0e074c46) by @andimarek
- Schema-backed
@parentfields in resolver and checker required selection sets (574d19af) by @andimarek - Build-time validation for schema-backed
@parentfields (b75aa2d6) by @andimarek - Enforce tenant-local RSS ownership (7ecddce6) by @andimarek
SchemaScopingdata class and DSL accumulation surface (#367) by @183565386+xyu307- Validate the
viaductApplicationschema-scoping DSL (#393) by @183565386+xyu307 NodeInterfaceIdConsistencyRulefor schema validation (369c21ff) by @gokhan-ozgozen- Require resolvers for argument fields (fbbef961) by @andimarek
- Make base schema registration explicit (c7af237b) by @andimarek
Gradle settings topology and build plugins¶
- Settings topology plugin (7c174a5f) by @rstata
- Wire projects through topology (9a1499a0) by @rstata
- Derive module packages from topology (04797a96) by @rstata
- Viaduct modules bucket (c526268e) by @rstata
- Module Viaduct application bucket (b8606d27) by @rstata
- Support application projects below the Gradle root (#383) by @rstata
- Allow modern resolver generation to use a custom Kotlin package (8646fcdc) by @gummybug
Selective resolvers¶
Background: discussion #399. Gated behind ENABLE_MAT_RESOLUTION and expected to have no production impact until enabled.
- Selective field resolvers (cfdcf463) by @jbellenger
- Selective node resolvers (63e78019) by @jbellenger
- An SPI for field selectivity, integrated into how selective fields are discovered at runtime (ebdd3be0) by @jbellenger
orcombinator forFieldSelectivityProvider(46df1ab7) by @alexanderuv- Materialization layer interfaces, including the mergeable
KeyTreeselection-set representation (9581ebb7) by @jbellenger MatLedgerimplementation, tracking which parts of aKeyTreehave been materialized (7f867555) by @viaduct-maintainers- QueryPlan-to-KeyTree projection and filtering (9b2939ac) by @jbellenger
ExecutionSelectionSet, anEngineSelectionSetbacked directly by the executing QueryPlan (4f199fe6) by @jbellenger- Preserve child-plan execution context and keep selection traversal within its concrete parent scope — two correctness fixes needed for selective resolvers (1aa154bd) by @jbellenger
- Configurable batching and determinism (89446479) by @jbellenger
- Normalized child plans (b9a45eea) by @jbellenger
- Even lazier field-type child plans (36de3259) by @jbellenger
Java tenant API¶
- Connections and pagination for the Java tenant API (e6be8ad0) by @catacraciun
- Named fragments and typed GraphQL operations in the Java tenant API (06b86521) by @catacraciun
- Root field references in the Java tenant API (b60f3806) by @catacraciun
- Type-safe Java input-field presence checks (f7799fac) by @catacraciun
- Complete Java scalar type mappings (7dd836c5) by @catacraciun
- Generate Java GRT reflection metadata (54902b46) by @catacraciun
- Typed
GlobalID<T>support in Java GRT codegen for@idOf-annotated fields (9cfdb138) by @catacraciun --applied_scopessupport in the Java GRT/resolver codegen (ff3f7401) by @catacraciun- Thread an immutable
InternalContextthrough Java tenant-API GRT constructors, mirroring Kotlin (91dd8175) by @catacraciun TenantModuleInjectorFactoryis implementable from Java (252a4cce) by @geovannefduarte- Extract
JavaEngineContextDelegateto de-duplicate the Java runtime contexts (5b2c7d0d) by @catacraciun - Share Tenant API input-value normalization via a new tenant-runtime-support module (f4a2faea) by @catacraciun
- Share Viaduct runtime variable-decoding helpers across the Java and Kotlin tenant APIs (413bc959) by @catacraciun
- Converge the Java Viaduct runtime onto the shared variable-decoding helpers (972bb802) by @catacraciun
- Shared language-neutral
SchemaAnalysisinshared/codegen; Java codegen delegates to it (6fccb839) by @catacraciun - Kotlin codegen schema predicates delegate to shared
SchemaAnalysis(7d52b98b) by @catacraciun - Centralize resolver class and arguments-type naming in
SchemaAnalysis(d5ea7ef3) by @catacraciun - Golden-output characterization tests for Java and Kotlin GRT/resolver codegen (1c4eb8e9) by @catacraciun
- Extend Java tenant API contract-test coverage across error handling, field resolvers, subqueries, mutations, variables and default node resolvers (f07b7289) by @catacraciun
- Unify the Kotlin and Java feature-app contract test plugins into one bilingual plugin (906dd534) by @catacraciun
File-based bootstrapping and hotswap¶
- File-based bootstrapping, part 1: new
ModuleConfigSourceabstraction (601d8fc8) by @kristileka - File-based bootstrapping, part 2: orchestration and compatibility (68c74265) by @kristileka
- File-based bootstrapping, part 3: classic and shims file-based refactor (536b2db5) by @kristileka
- Bootstrap scanner tenants with registry config (47e385a1) by @pclowes
- Filesystem execution registry sources for code hotswap (ea988a1b) by @njlynch
- Tenant-scoped bytecode for local schema hotswap (78a1ca81) by @njlynch
- Named stream-backed executor registry configs (40677f20) by @rstata
EngineTestModulefor therunFeatureTestexecution-registry path (38fb7569) by @rstata
Remote resolvers (experimental)¶
- Remote resolvers in NETWORK mode, with
rrs-serverfor remote resolver execution (d4c78e50) by @cetinsahin - Field-resolver remote-execution substrate: RPC, serializer, registry, executor (0e73564a) by @cetinsahin
- Opt-in remote field-resolver execution via
VIADUCT_REMOTE_RESOLVER_FIELDS(95850160) by @cetinsahin - Remote field resolvers are proxied by default, like node resolvers (a8eb4194) by @cetinsahin
- Remote field resolvers can return objects, node references and lists (opt-in) (6af855f1) by @cetinsahin
- Remote field resolvers with composite and node-reference returns work in network mode (0c6eabce) by @cetinsahin
- Bootstrap selected Viaduct tenant resolver code in the remote resolver server (29ec9a13) by @junjinp
- Host-defined request context carrier (5833354d) by @cetinsahin
- Bidirectional-streaming proto schema (f4b9e1df) by @vickeyyeh
- VS-side streaming wireframe (e1ada684) by @vickeyyeh
- RRS-side streaming wireframe (8324dbd3) by @vickeyyeh
- Real node resolution over the streaming transport (147a7fff) by @vickeyyeh
- Real node resolution in the VS-side streaming proxy (e4c7e9ee) by @vickeyyeh
Property-based testing¶
Arb.viaduct(bd3a5519) by @jbellengerCheckedArb(c8e151d0) by @jbellenger- Deep selection set coverage (ba6b1b27) by @jbellenger
- Deep arb suite (541c98d2) by @jbellenger
Engine, instrumentation and tooling¶
- Synchronous
EngineObjectDatapresence checks (ec71118e) by @fireboy1919 - Context-keyed node batch resolver results (dc357ac7) by @alexanderuv
beginFetchSelectioncallback SPI for fetch-selection instrumentation (22e65fab) by @vickeyyeh- Fire fetch-selection instrumentation for
ctx.query()/ctx.mutation()subqueries (09765120) by @vickeyyeh - QueryPlan cache metrics (861d855b) by @jbellenger
Viaduct.dump(f6dc3a56) by @jbellengerRootFieldRefStubtesting API for stubbingctx.rootFieldRef(2b16a9cc) by @alexanderuv- Public API stability contract (6c6a0e29) by @gokhan-ozgozen
- Semantic binary schema diff tooling (d1bb0fd6) by @njlynch
- Migrate available experience IDs to modern resolver (d23b4e6b) by @andimarek
- Retire the tenant
featuretestsframework, migrating coverage to the engine and contract test suites (4fc0f6fe) by @kristileka - Argument, mutation and introspection test coverage in the starters (#370) by @jtuchscherer
demoappsStandaloneTestorchestration task (78c55b6e) by @gokhan-ozgozen- Advisory CVE-parity security scanning: convention plugin and comparison script (926e6c86, 598653c2) by @geovannefduarte
InvalidDependencyRulektlint rule for banned catalog aliases (7aad631e) by @nmarsollier- Contract tests extending
KotlinFeatureAppTestContractBasewere silently skipped when the KSP registry wasn't on the classpath; the missing registry is now a failure, not "not applicable" (64f931ab) by @kristileka
Bug Fixes¶
Schema validation and scoping¶
- Safely hide
BackingDataand@parentfields from client schemas (cdd6458b) by @andimarek - Validate
BackingDataand@parentfields as tenant-local-equivalent (14e16ae3) by @andimarek - Enforce tenant-local field constraints across Viaduct (a87a3bf6) by @andimarek
- Validate tenant-local resolver selections in Gradle builds (4db2a266) by @rstata
- Reject
@parentfields declared on interfaces during schema validation (a0d3acd4) by @andimarek - Reject resolver directives on interface fields (9b6060d1) by @andimarek
- Reject object and interface scopes without fields (80005ff7) by @andimarek
- Validate Viaduct scope directives in a single OSS rule (74ab70c4) by @andimarek
- Clarify namespace directive conflict diagnostics (472861a5) by @amity177
- Reject empty tenant module names (3d37eb2e) by @rstata
- Use a distinct schema ID for the internal full-schema document provider (635dacac) by @andimarek
- Define
PageInfoin schemabase, not a module partition (63a3442f) by @geovannefduarte - Declare schema scopes in the ktor and micronaut starters (0ec1ed95) by @geovannefduarte
Execution and engine correctness¶
ctx.query()was leaking cell-level resolver errors instead of storing them per field (13734093) by @vickeyyeh- Allow selection-set merge across interface and implementor parent types (e89c0aec) by @vickeyyeh
- Forward
CompletionException-wrapped cancellations as cancellations (e7d4c3c3) by @skevy - Reject unresolved
RootFieldReferencevalues instead of hanging during serialization (c91ccfcd) by @vickeyyeh - Serialize namespaced mutation fields (e6da5342) by @andimarek
- Reject object fragments on mutation namespaces (99f98396) by @andimarek
- Implement
valueToLiteralforLongscalars (6fd6c03f) by @jbellenger - Preserve type constraints for widened selections (e071e113) by @jbellenger
- Fix conditional dropped fragments (839896db) by @jbellenger
- Fix the type checker variable RSS target (1533c522) by @jbellenger
- Pass directive context for resolver reads (c0124646) by @bhavanapallempati
- Reject selective resolvers on mutation fields (afc730ba) by @alexanderuv
- Selective field resolver fixes (454e1dc8) by @jbellenger
- Reduce selective resolver weight (bfa9e591) by @jbellenger
- Improve deterministic value generation (a7fff90b) by @jbellenger
- Miscellaneous arb fixes (4df163d3) by @jbellenger
Build plugins, bootstrap and codegen¶
- Make
application-gradle-pluginorder-independent (e6864bb1) by @gokhan-ozgozen - Fix orphaned
TenantModuleBootstrapperin the file-based bootstrap path (49173510) by @pclowes - Prefer hotswap-aware Viaduct bootstrappers over generated registry resources (55f7a4d6) by @njlynch
- Make
kspKotlinsensitive to resolver-bases output and tenant package inputs (52e07a14) by @gokhan-ozgozen - Emit JVM binary names from KSP to fix nested class loading (f10d85c5) by @gokhan-ozgozen
- Emit LF newlines in generated source on all platforms (afb6e119) by @geovannefduarte
- Validate direct module deps from topology paths (e1fa23d0) by @rstata
- Consolidate schema resource scanning on ClassGraph (f0ebd617) by @fireboy1919
- Restore Micronaut standalone demo compatibility (baf503f3) by @rstata
- Instantiate non-bean field resolvers in the main-server demo injector (2bfaa316) by @cetinsahin
- Remove stale
storageKeyshorthand and an undefinedgradlew runinstruction (dd0171ae) by @fireboy1919 - Resolve Kotlin compiler warnings (ab81045c) by @geovannefduarte
- Restore
GraphQLSchemaParserTestas Java with AssertJ (7aee122a) by @nmarsollier - Downgrade
foojay-resolver-conventionto 0.8.0 for Java 11 compatibility (abea5938) by @fireboy1919
Performance Improvements¶
- Tune the query plan cache default size (58525211) by @jbellenger
Documentation¶
- Document tenant-local fields and executable schema views (98c94fcb) by @andimarek
- Document Viaduct named fragments (
@GraphQLFragment) with runnable Star Wars examples (14151e9e) by @kristileka - Document
ctx.rootFieldRef()in the OSS resolver docs (e06fe1ce) by @gummybug - Document namespace types (8f1476a3) by @gummybug
- Clarify global ID best practices and add tenant API design principles (c1732e97) by @rstata
- Clarify JSON resolver value conventions (9b0a92ae) by @rstata
- Refresh Viaduct service-engineering documentation (60e0cd90) by @rstata
- Document the remote resolver architecture (1d91f125) by @cetinsahin
- Document KSP pipeline incrementality and stale-output cleanup (520ea770) by @nmarsollier
- Add comments describing the dedup logic in
DispatcherRegistryFactory(dbe5b346) by @junjinp - Clarify execution origins and child QueryPlan targets (da582ba3) by @andimarek
- Make standalone Maven-local the primary demoapp test path (7e801666) by @gokhan-ozgozen
- Note that the demoapps composite is not a design objective (958b9830) by @gokhan-ozgozen
- Indent subsections in doc navigation (#356) by @ryantanner
- Remove a stray
{.mt-5}attribute from the roadmap page (15973824) by @gokhan-ozgozen
Testing¶
- Java coverage harness for the service API (e1b0d743) by @geovannefduarte
gradletestappsend-to-end coverage (9ae3d7e5) by @rstata- Extend
StandardViaduct.Builderto take developer-controlled sources for bootstrap config data (d2c304f4) by @rstata - Exercise
installDistin micronaut-starter (#390) by @geovannefduarte - Migrate feature app contract tests to file-based bootstrap (725873a4) by @gokhan-ozgozen
- Drop
@singletonfrom schema root-detection test fixtures (daf0e2c0) by @amity177 - Replace em-dashes in Kotlin test method names with hyphens (37994791) by @viaduct-maintainers
Refactoring¶
- Invoke resolvers through generated base contracts (de3843c9) by @alexanderuv
- Generate base resolver contracts (c1df79fe) by @alexanderuv
- Retype
EngineObjectDataBuilder.build()toEngineObjectData.Sync(4db5a2a8) by @vickeyyeh - Retype the checker chain
objectDataMaptoEngineObjectData.Sync(ebef7648) by @vickeyyeh - Introduce
EngineObjectDataMaterializerto decouple materialization from instrumentation (9c761f76) by @vickeyyeh - Move checker RSS materialization under the access-check instrumentation boundary (29e0efcd) by @vickeyyeh
- Remove coroutine-context coupling from
SyncEngineObjectDataFactoryinstrumentation (c7848d9c) by @vickeyyeh - Replace
ProxyEngineObjectData/CheckerProxyEngineObjectDataconstruction sites withSyncEngineObjectDataFactory(c86b32f9) by @vickeyyeh - Use sync object data for variable resolution (338439f5) by @bhavanapallempati
- Resolve re-entrant callback queries via
resolveSelectionSetSync(aa543707) by @vickeyyeh - Resolve root field references via
resolveSelectionSetSync(46f9ee2e) by @vickeyyeh - Migrate
RemoteEngineExecutionContexttoresolveSelectionSetSync(b527ed4d) by @vickeyyeh - Migrate the query/mutation bridge to
resolveSelectionSetSync; deletematerializeToSync(5b1688d4) by @vickeyyeh - Align instrumentation nullability to match graphql-java nullability (aec2f004) by @jbellenger
- Move helper methods to
FieldExecutionHelpers(66561233) by @jbellenger - Build
QueryPlanIndexwithQueryPlan(3f3c9bda) by @jbellenger - Prepare execution parameters object ancestry (abab2c47) by @andimarek
- Stop re-reading the module registry file during executor bootstrap (c5ee255f) by @geovannefduarte
- Decouple
grtPackagePrefixfrom the engine bootstrap layer (dc00b1a0) by @gokhan-ozgozen - Rename
ExecutionRegistrydata model classes with aConfigsuffix (263df595) by @gokhan-ozgozen - Complete per-tenant DI via Micronaut (59055646) by @gokhan-ozgozen
- Replace
com.google.inject.Inject/Singletonwithjavax.injectequivalents (1b6579a3) by @fireboy1919 - Make the remote-resolvers library include-only and its demo self-contained (d76a5c30) by @cetinsahin
rrs-serverbuilds node executors from the tenant manifest via the file-based bootstrapper (d9d4901c) by @cetinsahin- Rename the remote-resolver demo servers (
rrp-server→main-server,rrs-server→remote-server) and group them underx/remoteresolvers/starwars/(e618be20) by @cetinsahin - Inject the greeting message via
@Valuein the micronaut-starter demoapp (5b82f2a0) by @nmarsollier - Remove
viaduct.apiannotationsusages from non-BCV-api modules (4a71d950) by @nmarsollier - Migrate test assertions off assertj-core, strikt-core, kotlin-test and guava-testlib (a41b57d5) by @nmarsollier
- Make the Java codegen golden test tolerant of line endings (38efe37c) by @geovannefduarte
- Remove dead
grtPackageNameconfiguration fromViaductApplicationExtension(345bc7b9) by @nmarsollier - Remove root logging binding dependencies (8cacdb70) by @rstata
- Use
kotlinx-coroutines-coreconsistently (0364e732) by @rstata - Remove redundant repository declarations from settings files (937afeac) by @rstata
- Remove a stale README (e235442a) by @rstata
Build System¶
- Upgrade language and API targets to 1.9 (367894bb) by @viaduct-maintainers
- Wire
checkto depend ondemoappsStandaloneTest(1d6b0363) by @gokhan-ozgozen - Enable Kotlin
-Werrorfor Viaduct OSS, the Gradle core build, build-logic andx/remoteresolvers, then consolidate it into the Kotlin conventions (d7c59431, 14f4186d, 91ca83ba, e830ddaa, 703312c7) by @geovannefduarte - Make ktlint, detekt and checkstyle fail the build rather than warn (c8ce81aa, 0ab4ce8d, 292cfeb6) by @geovannefduarte
- Enforce detekt in build-logic (31364539) by @geovannefduarte
- Drop redundant
ignoreFailuresandremoteresolvers-Werrorsettings (ae352d31) by @geovannefduarte - Remove the SpotBugs plugin and annotations in favour of ErrorProne for Java and detekt for Kotlin (80074353) by @nmarsollier
- Consolidate Jackson deps with a bundle alias in the Gradle catalog (933645d5) by @nmarsollier
- Preserve Viaduct OSS fat-JAR metadata for binary CVE scanners (c3152d85) by @geovannefduarte
- Retry flaky tests on CI via the Gradle test-retry plugin (#384) by @geovannefduarte
- Remove demoapps from the root composite build (7cd40930) by @gokhan-ozgozen
- Avoid duplicate jar filenames in composite demoapp builds (50e4f64c) by @geovannefduarte
- Resolve demoapp Viaduct deps from a fresh mavenLocal (fa453725) by @geovannefduarte
- Suppress a deprecation warning in the
Arb.viaductgenerator (a8ea52bd) by @geovannefduarte - Add detekt lint rules preventing
com.google.inject.Inject/Singleton(7664b1a5) by @fireboy1919 - Pin the OSS docs djlint below 1.39 (b60e0b4f) by @andimarek
Continuous Integration¶
- Compile and test in one job to stop flaky cache handoff (#400) by @geovannefduarte
- Advisory CVE-parity security-scan workflow (d9bf5b18) by @geovannefduarte
- Surface CycloneDX SBOMs in the security-scan job summary (#382) by @geovannefduarte
- Surface the security-scan report in the job summary for fork PRs (#388) by @geovannefduarte
- Windows Gradle check jobs, with Windows-specific compatibility fixes (#368) by @gokhan.ozgozen
- Pre-publication SBOM inspection gate (#389) by @geovannefduarte
- Verify all published demo apps post-publication (#391) by @geovannefduarte
- Stop polling unpublished artifacts in the release workflow (a23a8ddf) by @geovannefduarte
- Make the demoapp pipeline re-run-safe and reap stale tmp branches (#387) by @geovannefduarte
- Skip demoapp cleanup when the tmp branch is already deleted (#386) by @geovannefduarte
- Skip coverage-summary when coverage-reports is cancelled (7f2ba535) by @fireboy1919
- Replace
jacoco-report-aggregationwith per-module exec data and a hierarchical HTML report (91edb8da) by @fireboy1919 - Route CI and demoapp Gradle resolution through the configured Artifactory mirror (794a2915, 2d7f5bd6, e91e45f1, 94259b53, a1f5ff94, 60c778f0) by @geovannefduarte, @andimarek, @vickeyyeh, @gokhan-ozgozen, @fireboy1919