Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [
"cloud-events",
"event-sourcing",
"java",
"kotlin"
],
"is_fork": false,
"size_kb": 12582,
"has_wiki": true,
"homepage": "https://occurrent.org",
"languages": {
"CSS": 1829,
"HTML": 14026,
"Java": 5781964,
"Shell": 2497,
"Kotlin": 1358681
},
"pushed_at": "2026-07-25T15:00:11Z",
"created_at": "2020-07-06T17:14:59Z",
"owner_type": "User",
"updated_at": "2026-07-25T14:11:05Z",
"description": "Unintrusive Event Sourcing Library for the JVM",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "Java",
"significant_languages": [
"Java",
"Kotlin"
]
},
"owner": {
"blog": "https://code.haleby.se",
"name": "Johan Haleby",
"type": "User",
"login": "johanhaleby",
"company": "Parkster",
"location": "Sweden",
"followers": 414,
"avatar_url": "https://avatars.githubusercontent.com/u/187029?v=4",
"created_at": "2010-01-21T16:06:56Z",
"is_verified": null,
"public_repos": 72,
"account_age_days": 6029
},
"license": {
"state": "standard",
"spdx_id": "Apache-2.0",
"raw_spdx": "Apache-2.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [],
"recent_commits": [
{
"oid": "8cc4e9ab11cc3496a98b4315352845ce200ee152",
"body": "* Let a domain-event feed carry metadata on the live path\n\nA projection keyed by event metadata caught up correctly from a domain-event\nfeed and then broke on every live event. The replay reads the event store so it\nhas CloudEvents and real metadata, but a live domain event has none and folded\nwith \n[…]\n\nreturns and then instructed callers to use accept(...), which is a method on\nCatchupProjectionFeed and DomainEventFeed rather than on that sink.\n\nAlso fixes a duplicated \"and and\" in ORCHESTRATOR.md.",
"is_bot": false,
"headline": "Let a domain-event feed carry event metadata on the live path (#424)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-25T14:10:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d29f682f11e67827c9b2bf8f41c47d99dbc2b931",
"body": "…422)\n\nFixedSizeCache (blocking stream catch-up, also reached by the DCB catch-up\nmodel through the shared package) and HandoverCache (reactor stream catch-up)\nwere independent implementations of the bounded, insertion-ordered event-id set\nthat BoundedIdCache already provides. Both are deleted and e\n[…]\nles. It pins the eviction order the consolidation depends on.\nThe three consuming modules now declare occurrent-subscription-core explicitly.\n\nNo public API or behaviour change, so no changelog entry.",
"is_bot": false,
"headline": "Consolidate the catch-up de-duplication caches into BoundedIdCache (#…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-25T12:00:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "017c09e7f9f35ac17855ce17fed0866331c5b7e8",
"body": "The file still listed DCB under unreleased capabilities and used \"DCB is\nunreleased\" to justify keeping DCB churn out of the changelog's Changes\nsection. DCB shipped in 0.30.0 on 2026-07-13, so a change to released DCB\nbehavior belongs in Changes like any other. The changelog rule itself still\nholds\n[…]\n386 invalidated by splitting\nthe Mongo stores into their own mongodb-spring-blocking and\nmongodb-spring-reactor modules, and records the open dcb.events PR that adds\nOccurrent to their libraries page.",
"is_bot": false,
"headline": "[ci skip] Correct the orchestrator memory on DCB's release status",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-25T11:47:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c6d7ab7ef287643cb969efb6e15abcf81114b9cd",
"body": "* Keep only stack-neutral types in the common modules\n\nA blocking-only port sat in a common module that the reactor module also\ndepends on, so the reactor stack transitively imported an interface it can\nnever call, and the blocking half got the unprefixed name by accident of\nplacement rather than by\n[…]\ning it:\nthis ADR had placed SnapshotStore in common, which left the reactor stack\nimporting a blocking interface it can never call. The amendment also records\nthat SnapshotPolicies must not follow it.",
"is_bot": false,
"headline": "Keep only stack-neutral types in the common modules (#386)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-25T10:58:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7cb81822806c7c837d1f200c1766cb6a441b8c16",
"body": "The file is re-read at every session start, so its size is the dominant\nrecurring token cost. It had accumulated per-branch build narration for work\nthat has all merged: test counts, which container runs flaked, stopgaps applied\nand later dropped, per-file LOC deltas, and which review threads were r\n[…]\nng\nlessons) with every do-not-regress invariant preserved verbatim in substance.\n\nAlso drops a bullet that appeared twice and refreshes the module inventory.\n\n63.9K from 102.8K, 7.9k words from 12.4k.",
"is_bot": false,
"headline": "[ci skip] Compact the orchestrator memory file",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-25T10:53:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5df9073348b1332eec0d4bb797efa07c533597b7",
"body": "* Thread event metadata through the reactor catch-up replay\n\nThe reactor CatchupProjectionFeed folded replayed events through a\nFunction<E, Mono<Void>> built by Projections.reactiveUpdate, which\nhardwires EventMetadata.empty(). A projection keyed via\nProjection.idWithMetadata() therefore mis-keyed e\n[…]\nt instead.\n\nRenamed to name the accessor it actually covers, and the comment now records\nboth failure modes and points at the issue tracking support for metadata on the\nlive path. No behaviour change.",
"is_bot": false,
"headline": "Extract the catch-up handover into one engine per stack (#387)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-25T10:43:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "82c5195083eae16dfafcfe2af562cad8707fb952",
"body": "…ion epics in orchestrator memory\n\nIssues #392, #393 and #388 (plus children) were filed with no code yet. Captures the\nissue map and the four decisions that constrain the work: CDC rather than position\npolling as the SQL live source and its coupling to the position strategy, the broker\nconsume side as a bridge into Pushable rather than a new SubscriptionModel, the\nannotation-machinery move needed before a SQL starter, and DDL ownership as an\nexplicit decision.",
"is_bot": false,
"headline": "[ci skip] Record the planned TCK, SQL event store and broker integrat…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-25T10:34:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2f1939aeff0a1ce9013270478599599c3eb288df",
"body": "… reactor stack (#385)\n\n* Thread event metadata through the reactor catch-up replay\n\nThe reactor CatchupProjectionFeed folded replayed events through a\nFunction<E, Mono<Void>> built by Projections.reactiveUpdate, which\nhardwires EventMetadata.empty(). A projection keyed via\nProjection.idWithMetadata\n[…]\nt instead.\n\nRenamed to name the accessor it actually covers, and the comment now records\nboth failure modes and points at the issue tracking support for metadata on the\nlive path. No behaviour change.",
"is_bot": false,
"headline": "Fix metadata-keyed projections mis-keying every replayed event on the…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-25T10:27:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5b59c4a8ecfb33d122a27d6c5780275ccdf549bc",
"body": "…he decider (#384)\n\nRecords the rationale for keying DCB snapshots by the resolved DcbCriteria\nrather than the decider, so the decision is discoverable and not reversed later\nby mistake. Adds a dated amendment to ADR 0061 (which owns the DCB-key\ndecision): the decider is a per-type constant, so deci\n[…]\nent from ADR 0069 and adds terse \"see ADR 0061\"\npointers to the SnapshotDcbDecider / ReactiveSnapshotDcbDecider keyFunction\njavadoc and DcbSnapshotKeys.\n\nDocumentation only, no API or behavior change.",
"is_bot": false,
"headline": "Document why the DCB snapshot key is derived from the criteria, not t…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-24T16:46:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "96588c1cbe5e0e1f89004f6ec585775b1fb3049d",
"body": "… registrars (#383)\n\nSplit the blocking and reactive MongoDB annotation bean-post-processors into thin coordinators plus package-private per-annotation registrars over a shared StartPositionSupport, lift the identical shouldWaitUntilStarted helper to common, add characterization tests, and fix two pre-existing Copilot-flagged nits. Behavior-preserving.",
"is_bot": false,
"headline": "Decompose MongoDB annotation bean-post-processors into per-annotation…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-24T16:01:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce84350fb6f04606e21f70d7bdc657c5018775b7",
"body": "…ec (#381)\n\n* Reshape programmatic snapshot API to global facade + per-aggregate spec\n\nThe snapshot executors (SnapshotDeciderApplicationService,\nSnapshotDcbDeciderApplicationService) and the SnapshotViews reader, plus their\nreactor twins, are now constructed once around only the shared infrastructu\n[…]\ned a null value\" NPE. The guard sits in the fold (seed and\naccumulator), mirroring requireNonNullState in the reactor decider services.\n\nAddresses a Copilot review comment on the snapshot API reshape.",
"is_bot": false,
"headline": "Reshape programmatic snapshot API to global facade + per-aggregate sp…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-24T14:55:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "907e9d5861acc798097c80a0abcfa9135e1459ad",
"body": "….position is unset (#382)\n\n* Fix NullPointerException when occurrent.event-store.stream.position is unset\n\nThe blocking OccurrentMongoAutoConfiguration unboxed the stream.position\nproperty with `if (streamPosition)`, which throws when the property is unset\n(null), so the Mongo starter's Application\n[…]\nc branch of the stream-position auto-config guard, where\na false position property is skipped (withoutStreamPosition() is rejected with\nDCB) so the context still loads and the default position stands.",
"is_bot": false,
"headline": "Fix ApplicationContext load failure when occurrent.event-store.stream…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-24T14:42:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5fd95d2b5d1a4c9cd1068cc8e5dc5afde5f3c7a7",
"body": null,
"is_bot": false,
"headline": "Some minor cleanup",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-24T11:00:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8198a003908af0012ac15d2851a8ce85bdf83f8f",
"body": "…esh) (#380)\n\n* Make SnapshotViews an instance facade with a pure readState and explicit refresh\n\nSnapshotViews was a static six-argument utility whose readState secretly\nwrote a snapshot per a SnapshotPolicy, so a plain read demanded a when-to-save\ntrigger. Replace it with an instance built once vi\n[…]\nrites-when-already-up-to-date test only checked snapshot equality, so\nit would pass even if refresh skipped save. Count save invocations with a\nwrapping store and assert it runs twice, on both stacks.",
"is_bot": false,
"headline": "Make SnapshotViews an instance facade (pure readState + explicit refr…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-24T08:18:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "378fbe9c7145176b54ca7243748c80ec906b4d42",
"body": "…m clarification in Closing the Books docs",
"is_bot": false,
"headline": "[ci skip] Orchestrator memory: note inline example + per-period-strea…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-24T08:04:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5408a9aef159f49266721e5f3e7405c541d1f206",
"body": "* Move the saga CompetingConsumerStrategy from run(...) onto the SagaRunner\n\nAdd a fluent SagaRunner.competingConsumerStrategy(strategy) that returns a\nconfigured copy, and drop the strategy parameter from run(...). The strategy is\ntimer-poller infrastructure that belongs with the subscription model\n[…]\ngy, leaseKey, and holderId can legitimately be null, so mark them\n@Nullable in this @NullMarked class. The lambda captures the narrowed non-null\nkey/holder locals, keeping the hasLock deref null-safe.",
"is_bot": false,
"headline": "Move the saga CompetingConsumerStrategy onto the SagaRunner (#379)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-23T09:08:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d3006375da21590fb92909bb9844865ead8a08e3",
"body": "…le package (#378)",
"is_bot": false,
"headline": "Rename saga 'machine core' naming to 'core' in javadoc/kdoc and examp…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-23T07:05:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b22ccea0722cfff43a6d7b84a48c8661c1c127ae",
"body": "…B twin merged (PR #374)",
"is_bot": false,
"headline": "[ci skip] Orchestrator memory: record command-dispatch factories + DC…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T17:59:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49d69ccab49934d7c70b57446f76fee4e308ab75",
"body": "…a DCB dispatcher factory (#374)\n\n* Move CommandDispatchers into occurrent-command-dispatch and add a DCB twin\n\nRelocate the stream CommandDispatchers.decider factory out of the saga DSL\ninto occurrent-command-dispatch (its natural home, package\norg.occurrent.command), so command dispatch is a self-\n[…]\nexecute(command, dcbDecider) directly instead of wrapping it in\nList.of(command). Avoids a per-dispatch list allocation and mirrors the\nsingle-command call the stream CommandDispatchers.decider makes.",
"is_bot": false,
"headline": "Relocate CommandDispatchers into the command-dispatch module and add …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T17:57:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "982c7d4578f1c6b192e08461f1c278f5fafbaab5",
"body": "… (#376)\n\n* Move command-dispatch modules from application-service to application\n\nCommandDispatcher and StreamIdResolver (package org.occurrent.command) are a\ncommand-production concern, not the application-service write engine, and\ncommand-dispatch has no dependency on application-service-common. \n[…]\n the no-stale-reference claim to build files to avoid a self-contradiction.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Move command-dispatch modules from application-service to application…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T17:30:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a19fe90cd4d5169f974a390dddb02e7942f40bc4",
"body": "* Hide flow-saga bookkeeping behind a narrow FlowState interface\n\nFlowState was a record, so all eight components were public accessors,\nexposing five transition-bookkeeping fields (windowStart, stepEntryIndex,\npreviousStep, lastAction, matchedBranchIndex) to anyone holding the state.\n\nSplit it into\n[…]\nImpl javadoc: author via FlowSaga, not a FlowState builder\n\nFlowState has no builder; flow sagas are authored through FlowSaga (or the\nKotlin saga block) and their state is observed through FlowState.",
"is_bot": false,
"headline": "Hide flow-saga bookkeeping behind a narrow FlowState interface (#375)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T16:56:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3b894e245c1df795e129762898a915edeaed370f",
"body": "* Add correlateAll to the saga flow DSL\n\nThe flow DSL (saga { } / FlowSaga.Builder) only offered per-event-type\ncorrelate<T>, while the machine-core builder already had a correlateAll\nfallback. For a sealed event hierarchy with a shared id that meant\nrepeating the same { it.orderId } on every event \n[…]\nderId(), matching the concrete-record\naccess used elsewhere in the example.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add correlateAll to the saga flow DSL (#373)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T16:26:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "aa0cb6b7f235702022aabc97e3475360e2b27ee9",
"body": "The Continuation.GoTo record, its goTo(..) factory, and the Kotlin\nStepScope.goTo receiver method become TransitionTo / transitionTo(..).\ntransitionTo reads as state-machine vocabulary alongside next and end,\nand sidesteps the reserved Java keyword goto that blocks a lowercase form.",
"is_bot": false,
"headline": "Rename flow-saga goTo continuation to transitionTo (#372)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T15:49:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f50447f40834f3257f007148226d70f5df72ed0",
"body": "* Harden the flaky example-domain MongoDB tests\n\nTwo distinct root causes behind the intermittent example-domain shard\nfailures.\n\nStartup readiness: the example @ServiceConnection tests start a fresh\nper-class MongoDBContainer.withReplicaSet() with no host-side readiness\ngate, so on a loaded runner \n[…]\nout to the\nsame 2s so a mid-handshake stall also fails within the deadline.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Harden the flaky example-domain MongoDB tests (#371)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T15:23:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8d0c466bca9167ddefbc6a40e13eba15214bbc0f",
"body": null,
"is_bot": false,
"headline": "Add a join example that reads the joined events in whenFulfilled",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T15:22:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "02f1f5f28d58b6c3fbdd0a293dd7e2a3989fd4c2",
"body": "Change the signature from vararg-only to a leading required Expectation\nplus vararg, so join() with zero expectations no longer compiles. A join\nwith nothing to wait for is degenerate. Add a test proving a single\nexpectation builds and fulfils.",
"is_bot": false,
"headline": "Require at least one expectation for StepScope.join",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T15:05:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c1351d306410418fa726ac8c12da3f04acfdfae7",
"body": "The Kotlin first() extension returned Optional<T>, leaking a Java-interop\ntype through the Kotlin-facing surface. Return T? instead (via orElse(null))\nso callers can use ?., ?: and let. Add a reified any(): Boolean that\nshort-circuits via first(type).isPresent rather than scanning with count.\nCover all five reified extensions with unit tests.",
"is_bot": false,
"headline": "Return T? from first() and add any() to ReceivedEvents extensions",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T14:58:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49062ce368423d3ebbf7ebec935de006e5de1173",
"body": "The GameStartJoin scenario declared expect<PlayerJoined>(2) but no test\nisolated the count: every unfulfilled case was also missing the move, so\ndropping the count to 1 left all tests green. Add two tests that pin the\ncount > 1 semantics: one PlayerJoined plus the move does not fulfil, and\nthe second PlayerJoined tips the join over regardless of arrival order.",
"is_bot": false,
"headline": "Prove the join expect(count) multiplicity is enforced",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T14:55:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "76cfeefe08a00b9e4dbecd2195fb5b9d8ae63c79",
"body": null,
"is_bot": false,
"headline": "Cleanup to SagaFlowExtensions",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T14:32:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f8e2d77ac3caf1b168c316db08efbb48aea4ba4",
"body": "* Extract the shared annotated-member reflection scanner\n\nAnnotationTagGenerator (dcb-annotation) and AnnotationStreamIdResolver\n(command-dispatch-annotation) carried ~150 near-verbatim lines of reflection:\nthe record-component/getter/field traversal, getter-preferred dedup, hierarchy\nwalk, MethodHa\n[…]\ned order, so the\ngetter/field path cannot promise source declaration order.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Extract the shared annotated-member reflection scanner (#370)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T13:35:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2338bf92f3070d562fcb441c6fea8b9a2dc1489d",
"body": "The annotated command member holds a stream id (a String), not a stream, and it\nfeeds StreamIdResolver, so naming it for the id it carries is more precise and\nconsistent than @TargetStream. Unreleased (0.31.0), so this is a free rename.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Rename @TargetStream to @TargetStreamId (#369)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T12:39:32Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "31bfc1ee9ad50e04215380cf50c07296708e5eaa",
"body": "…(#368)\n\n* Extract a reusable command-dispatch module with stream-id resolution\n\nCommandDispatcher<C> was the Saga DSL's producer-facing port for issuing a\ncommand, but it is useful to any command producer, not just a saga. Move it into\na new dependency-light occurrent-command-dispatch module (org.o\n[…]\nhe\nexisting AnnotationTagGenerator and needs a shared-module-home decision.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Extract a reusable command-dispatch module with stream-id resolution …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T12:13:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9433ff890f1eef5ad3f5a80e4ee5c4415d7dfe07",
"body": "…without the starter (#367)\n\n* Fix EventMetadata references missed when it moved to cloudevents-extension (#366)\n\n#366 relocated EventMetadata from org.occurrent.dsl.subscription to\norg.occurrent.cloudevents and updated the SubscriptionAnnotations class, but two\ntest imports (SubscriptionAnnotations\n[…]\n.31.0 features, so there\nis no OpenRewrite recipe or migration-guide entry.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make the Spring saga/snapshot stores and transaction executor usable …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T09:41:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b4f8ffa5b62d6db06bd9b2039b64b89fae34be05",
"body": null,
"is_bot": false,
"headline": "[ci skip] Minor test improvements",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T09:07:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fdf67570c599b389eedd90c6c9b3b48d59fe130c",
"body": "…seKey\n\nPlainer wording throughout the class and run() javadoc: drop the\ncolon-introductions, \"gated by\", \"no-op\", and \"head-of-line blocking\" jargon\nfor direct phrasing, without losing the two-path failure-handling contrast.\n\nAdd a pointer for DCB: to receive DCB-appended events use agnostic. Expla\n[…]\nom public to package-private. It is only called by\nrun() and by SagaRunnerTest, both in this package, so it need not be part of\nthe public API.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Simplify SagaRunner javadoc, add DCB pointer, hide timerLea…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T08:58:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "64b3c147a617ad31598142ae19a56d33637a6f4b",
"body": "\"A saga folds both kinds through the same evolve and react\" described the\nmechanism in the abstract. Say it plainly: both go to the same evolve and\nreact, and there is no separate method for timers.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Plainer wording in the SagaInput javadoc",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T08:25:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8e25477a25cb53e0a839758d22766adafd98a158",
"body": "\"The closed input alphabet of a Saga\" is automata-theory jargon that does not\nsay what the type is. Lead with the plain statement (what a saga reacts to: a\ndomain event or one of its own fired timers) and add a note on who meets the\ntype: most sagas never touch it because the builder and flow DSL di\n[…]\naga.create form or when\nfeeding a saga inputs in a test. Also clarify that the E type parameter is the\nevent type carried by the Event variant.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Simplify the SagaInput javadoc",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T08:21:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b2f1bcc8d90123b94361be37789df544608e9ce7",
"body": "The class javadoc opened by defining a saga as the mirror of Decider, so\nunderstanding a saga required knowing Decider first. Reorder it: lead with a\nstandalone definition of the process manager (reacts to events and its own\ntimeouts by issuing commands, pure data and functions, executor does the I/\n[…]\nmove the Decider duality into a skippable\n\"If you already know Decider\" section. No content lost, the duality is just no\nlonger a prerequisite.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Lead the Saga javadoc with a self-contained definition",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T08:18:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c9026e0cb0103258647c2437de84377f6fd3e483",
"body": null,
"is_bot": false,
"headline": "[ci skip] Suppressing false nullable issues",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T08:13:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b54d41f6269f5f52db2b2b14a5bb3edf014093a0",
"body": "…(#366)\n\n* Relocate EventMetadata to cloudevents-extension as a Java type\n\nEventMetadata became the shared metadata currency across the saga,\nprojection, view, and DCB DSLs (ADR 65) but lived in and was named for the\nsubscription DSL. Move it to org.occurrent.cloudevents.EventMetadata, next\nto the C\n[…]\ne\n description, which previously described only the annotation enum moves.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Move EventMetadata to cloudevents-extension (0.31.0 breaking change) …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T07:50:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8f63d30011c44fc0e3beba23db52164eff49094b",
"body": "…tion (#365)\n\n* Add @StreamId and @StreamVersion subscription-handler parameter injection\n\nA subscription handler can now receive the delivered event's stream id or stream\nversion directly by annotating a parameter, so\n\n void on(MyEvent event, @StreamId String streamId, @StreamVersion long stream\n[…]\nguous handler signature. Fail\nfast at startup with a clear message instead.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add @StreamId and @StreamVersion subscription-handler parameter injec…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-22T07:49:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "edeff03ef0c152c66edc36a6685abd12d821d49c",
"body": "Two ADRs shared number 0065 during the unreleased 0.31.0 cycle:\nevent-metadata-in-the-dsls (#363) and rename-checkpoint-storage-module-\ncoordinates (#362). Renumber the less-referenced one to the next free\nnumber and update its heading and the changelog reference. 0065 now\nuniquely belongs to the checkpoint-storage rename ADR.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Renumber duplicate ADR 0065 (event-metadata DSLs) to 0068",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-21T17:57:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7c29c530cdc06a592a69f814a8f3814c2f07672d",
"body": "…s (#364)\n\n* Allow configuring batchSize and maxAwaitTime for MongoDB subscriptions\n\nExpose the two change-stream cursor tuning knobs on the subscription\nconfig, opt-in and defaulting to unset so the driver/server defaults are\npreserved and no existing subscription changes behavior on upgrade:\n\n* Na\n[…]\ntions\nthat truncate to 0 ms; the ADR text still said non-zero/non-negative.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Allow configuring batchSize and maxAwaitTime for MongoDB subscription…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-21T16:25:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a800aa2bc81f014af78ba7744dc052a7f771246f",
"body": "* Add EventMetadata.empty() for metadata-less fold and replay paths\n\nShared foundation for threading event metadata into the saga and\nprojection/view DSLs: the delegating event-only overloads and the\non-demand query-replay path (which has no CloudEvent) fold with this\nempty metadata.\n\nCo-Authored-By\n[…]\n and the metadata reactiveUpdateWithMetadata(..., singletonKey) overloads.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Expose event metadata to the saga and projection/view DSLs (#363)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-21T14:21:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "52bc8c799f4f50de4b5efb1c70a95c2bbb8e01d8",
"body": "…efinement (#347)\n\nConvert DcbCriteriaBuilder to Kotlin so type<A>()/types<A,B>()/types<A,B,C>() are reified members with the base event type inferred, add the KClass forms type(A::class)/types(first, vararg rest), and add criteria(boundary: DcbCriterion) on DcbDomainEventQueries and DcbSubscription\n[…]\n0066 to resolve the collision with 0063-saga-dsl.md (0064/0065 were also taken); updated the changelog and ORCHESTRATOR references accordingly.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Kotlin ergonomics for DCB criteria: reified type/types and boundary r…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-21T09:38:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ec7a505961643da31926ed8b0f85113871e97953",
"body": "…pointStorage type (#362)\n\nADR 46 renamed the SubscriptionPosition type family to Checkpoint in 0.30.0,\nincluding the storage adapter classes (NativeMongoCheckpointStorage and the\nothers), but left the four modules that ship them named -position-storage. This\nfinishes that rename for the module coor\n[…]\nr link in NativeMongoSubscriptionModel.\n\nDocs-site changes are held on the docs/checkpoint-storage-module-rename branch\nfor the 0.31.0 release.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Rename the checkpoint-storage module coordinates to match their Check…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-21T09:11:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6f68898c910cd252030d65a4dd47da66348d6731",
"body": "…ntime flag\n\nThe interface javadoc claimed it is \"only implemented by stores where\nwritesPosition() is true\", which contradicts the next sentence and the\nimplementations. A STREAM-only store implements PositionOrderedReader\nunconditionally and reports writesPosition() == false when configured withou\n[…]\neck\nwritesPosition() before the read methods, and note that an instanceof check\nalone does not tell you whether the instance writes a position.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Fix PositionOrderedReader javadoc: writesPosition() is a ru…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T17:07:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0959440cfd3f580e6d11b0d496a11dcdf24fea0f",
"body": "The \"Changelog next version\" section had standalone entries describing\nrefinements to features that debut in this same release: the flow-saga bounded\nwindow, the saga timer poller gating, snapshot reset-handling, snapshot module\nlayering, projection hardening, and saga footgun guards. Framed as \"now\n[…]\ndevelopment history. Record the\nrule in AGENTS.md so future refinements to still-unreleased features are folded\nin instead of added as changes.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fold unreleased-feature refinements into their changelog entries (#360)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T16:59:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "814acd7e9b0a55d8f25e745c79915d3734c3bac1",
"body": "* Default the saga timer poll interval to 15s instead of 1s\n\nThe poll interval only bounds how late a due timer fires, not event delivery,\nand saga timeouts run at a minutes-to-days timescale, so polling the state\nstore every second was mostly empty queries. Raise the default to 15 seconds,\nthe same\n[…]\njavadoc in\nSagaRunnerConfig and OccurrentProperties to read more naturally.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Default the saga timer poll interval to 15s instead of 1s (#359)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T16:40:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5b12bd1a7734ec6ca96f71fec2b6645b5f4f8726",
"body": "The saga event path is already single-active across instances by default\n(the injected Subscribable is a competing-consumer subscription model), but\nthe timer poller was not: SagaRunner.run starts a ScheduledExecutorService on\nevery instance that queries SagaStateStore.findWithDueTimers each interva\n[…]\nnt\ndispatch, ADR 63); this removes the redundant query load. The residual\ncross-node duplicate-dispatch race is unchanged. Rationale in ADR 64.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Lease-gate the saga timer poller for multi-instance deployments (#358)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T14:48:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "768ff4b1e7d1e8e77b13309aac8d9ec9a83a6312",
"body": "* Snapshot layering + cross-module + doc reframes (PR6)\n\nRestores ADR 61's stated layering: SnapshotPolicies.whenTerminal(Decider) moves\nout of snapshot-dsl-common into the blocking and reactor executor modules, and\ncommon's pom.xml drops its occurrent-decider dependency, so a SnapshotView-only\ncons\n[…]\n4.8 <noreply@anthropic.com>\n\n* Replace an em-dash in SnapshotPolicy javadoc\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Snapshot module layering and API-review polish (#357)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T11:54:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f99ae9cc0ae65ea21c2a31b2282081bd13930274",
"body": "* Harden the Projection DSL: duplicate-id guard, Java project(), DcbProjection filter rejection\n\n- DomainEventFeed.register (blocking + reactor) rejects a second registration\n under an id already in use, mirroring RegisteringSubscribable's checkpoint-key\n uniqueness guard.\n- Projections.project(pr\n[…]\ne, race-safe gate, this is\nan optimization on top of it, not a replacement.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Harden the projection DSL against silent misuse (#356)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T11:42:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "76df74838afb988afd2200feb628fa86f037b84a",
"body": "* Saga hardening: guards and delivery-contract docs (PR3, G2)\n\nG1: warn when a fired timer resolves to no handler (typo stall) instead of\nstalling the instance silently, in SagaExecutionSupport. Adds slf4j-api to\nsaga-dsl-common.\n\nG7: FlowSaga.Builder.startsOn now rejects a type already registered b\n[…]\nlarge and could misalign a join or throw\nIndexOutOfBounds after an upgrade.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bound the flow-saga event log and close saga DSL footguns (#355)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T11:28:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4a22975959b8b300b06d31eab18788eee38bac67",
"body": "* Fix snapshot version drift on a reset stream (S1)\n\nA snapshot whose version is ahead of the stream's true head means the stream\nwas reset (truncated) below a snapshot written against the longer stream.\nResuming from it folds onto state the stream no longer holds. Only stream paths\nare affected; a \n[…]\n that residual window. Noted in ADR 61 as a tried and reverted\nalternative.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Stop trusting a stale snapshot after a stream reset (#351)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T11:09:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "23ab64816b507a3a6c35f9e1b27aaa1f40d00609",
"body": "…. (#350)\n\nThe synchronous-subscription modules (blocking and reactor) and the\napplication-service native-transaction and reactor modules are now\nmanaged versions in the BOM, matching the existing entry shape.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add four published-but-unmanaged modules to BOM dependency management…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-20T10:47:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9bbb382379d0189727390244e9082a9be4ff2c85",
"body": "…name\n\nReplace the two inline org.occurrent.dsl.saga.internal.TypeDispatch references\nwith a plain import, the only gratuitous FQN in the saga code. The remaining\nqualified names are deliberate: the @Saga/@Projection/@Snapshot annotations share\na simple name with their DSL descriptor types, so one of each pair must stay\nqualified.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Import TypeDispatch in FlowSaga instead of using its fully-qualified …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-19T20:25:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5c4adfafe252a4ced9ff201dc88d305be84332b6",
"body": "Add a Current State entry and module-boundary note for the saga-dsl family,\ncapturing the durable decisions (executor-polled timers over the deadline module,\nat-least-once dispatch with the outbox deferred, both authoring surfaces on one\ndescriptor, docs held on the release-gated docs/saga-dsl branch).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record the merged Saga DSL (PR #348) in ORCHESTRATOR.md",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-19T20:19:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d909f096381e30a3ac0bda1bdeb8a6cefdd7be9c",
"body": "* Add saga DSL machine-core descriptor (occurrent-saga-dsl-common)\n\nIntroduce the pure saga (process-manager) descriptor: the command-issuing\ndual of Decider. Saga<E, S, C> folds events and its own timeouts into\ncommands via a strict evolve/react split, so replay (which folds evolve\nonly) never re-i\n[…]\nhing the guarantee Builder.build() already gives for\na missing startsOn(...).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add a Saga DSL for event-driven process managers (#348)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-19T20:17:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f63ee362929d674e68740340d74abc6c7c279e01",
"body": "A student deregistered while still enrolled lingered in the course-detail\nread and on the dashboard, and their seat stayed occupied in the enrollment\nwrite model, so the freed seat could not be reused.\n\nAdd a WhenStudentDeregisteredThenUnenrollFromAllCourses policy: a durable\n@DcbSubscription on Stu\n[…]\nrolledInCourseException, and so on), and have the policy catch\nonly StudentNotEnrolledInCourseException so an unrelated error is not\nswallowed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Unenroll deregistered students from their courses",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-19T09:26:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e1cdb70194dac3dc1101c1d6e0853fe5151f963f",
"body": "… AGENTS.md",
"is_bot": false,
"headline": "[ci skip] Move durable Testcontainers gotchas from ORCHESTRATOR.md to…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-19T08:54:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7732270e28f3316d747f234a052ec3200e64de19",
"body": "…ame in ORCHESTRATOR.md",
"is_bot": false,
"headline": "[ci skip] Mark PR #345 merged and record PR #346 follow-up + docs ren…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-19T08:39:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5d0afe73887c43600bd92ca6c60c5f74855b6d0",
"body": "Add a Testcontainers test for a @Projection(source = PUSH) whose store is a\nMaterializedView rather than a ViewStateRepository, covering the reactive\nbean-post-processor branch that drives the view with a reactive fold and uses the\nprojection only for the replay filter. Follow-up to #345, which added the branch\nbut only tested the ViewStateRepository path.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Test the reactor domain-push MaterializedView store branch (#346)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-19T08:31:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2df6988a5b9b43ed3a4df452cb88528228987d5e",
"body": "…ly change streams (#345)\n\n* Add a generic push subscription model for feeding projections from external sources\n\nExtract the shared register-and-route machinery of SynchronousSubscriptionModel\ninto RegisteringSubscribable (blocking + reactor api modules) and add a new\nPushSubscriptionModel driven b\n[…]\nProjectionFeed.accept and CatchupThenPushSubscriptionModel's live handover.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Feed projections from external push sources (RabbitMQ, Kafka), not on…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-19T07:28:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1595ae8f2441f115a2b1b9f2986ed072b62cb50e",
"body": "…ntally (post-0.30.0 review) (#344)\n\n- C4: project(projection) now throws on a keyed projection instead of silently\n blending every instance into one state, and a new project(projection,\n instanceId) overload folds a single instance (stream pull reader, blocking and\n reactor). A singleton project\n[…]\nStream) folds incrementally in one pass instead of collecting\n the whole history first, and the snapshot readState tail is folded the same way\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix keyed on-demand projection reads and fold on-demand reads increme…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-18T06:16:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "408e1372e0a0c74bd58c3fc009039cc9696f8dc7",
"body": "The maintained DCB snapshot read and materialized the whole boundary range\nbefore checking the everyNEvents throttle, so a higher throttle read more, not\nless. Gate first on the position delta, since the number of matching events\ncannot exceed position minus base.version(). The exact range.size() check stays,\nso the save cadence is unchanged, and it is a no-op at the default\neveryNEvents = 1.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Gate the DCB @Snapshot maintain path before the range read (P1) (#343)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-18T06:16:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "485657f727fe3d6decfc0a2cb41fcb8658c1905a",
"body": "… review) (#342)\n\n- C2/C7: one uniform execute* matrix across all four decider facades (execute\n plus executeAndReturnDecision/State/Events, single and list, stream adds\n String/UUID id). The snapshot facades hold store/options/keyFunction in the\n constructor and are generic in the state type, so\n[…]\niption, covered by the\n UpgradeToOccurrent_0_31 OpenRewrite recipe\n- D2: @Projection/@Snapshot rename startAtPosition to startAtGlobalPosition\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Unify the decider facades and hoist the annotation enums (post-0.30.0…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-18T06:04:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "efb70933eb761207251691e70704a607428f226b",
"body": "…(#341)\n\nAll of these touch unreleased code, so there is no changelog entry.\n\n- C1: drop the nullable-state bound on the reactor snapshot state-returning\n methods so a Mono<S> no longer promises a null it cannot carry\n- B1: preserve sideEffect and fromStreamVersion across the stream ExecuteOptions\n\n[…]\nadable snapshot\n- reject startupMode combined with mode = SYNCHRONOUS\n- ADR 0057 to 0061 corrections and @Snapshot/SnapshotPolicy javadoc fixes\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix correctness and API-hygiene findings from the post-0.30.0 review …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-18T05:48:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e245a1da6fc13c2b50c9e745dd8817c728ab56bb",
"body": "…ORCHESTRATOR.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record the settled reactor snapshot null-state contract in …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-18T05:30:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4fb8ad6f8f1bc5b4ba3888d6fcb60d604ce5f9ab",
"body": "…44) in ORCHESTRATOR.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record the post-0.30.0 review remediation stack (PRs #341-3…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-17T22:36:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "109648ce99c981aa31cc62bb28c55629a056bee3",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Mark first-class snapshots merged (PR #340) in ORCHESTRATOR.md",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-17T18:49:16Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8b6c9ffd57911a4991b536e19407fcf6792adbdd",
"body": "* Add first-class snapshot support (stream + DCB, decider- and view-based)\n\nAn opt-in replay optimization: a command execute folds only the events\nwritten after a saved state instead of the whole history. A snapshot is a\ndiscardable, schema-versioned cache of a fold result at a known version, so\na c\n[…]\nn before). @Projection\nis unreleased, and the pairing was always a footgun.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add first-class snapshot support (#340)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-17T17:41:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "272626b12ef693c3628f79d54ac99c5d90bd74d9",
"body": "…R.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record PR #339 (javadoc/kdoc simplification) in ORCHESTRATO…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-17T09:15:54Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "010553d6922a2272f5b2c93020f5eb00bf1fd22b",
"body": "* Simplify projection DSL and @Projection javadoc/kdoc\n\nTighten the verbose javadoc/kdoc across the projection DSL and the\n@Projection annotation per the code-comment style: lead with what the\ntype does, cut internal-mechanism narration and roadmap asides, drop\nprose semicolons, and bias toward shor\n[…]\nan em-dash or semicolon,\nmatching the prose style used across the codebase.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Simplify the javadoc and kdoc added since 0.30.0 (#339)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-17T09:15:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a4442554a2ff286f81617f7f02d616879574cba4",
"body": "…R.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record the public-library reasoning learning in ORCHESTRATO…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-17T08:19:54Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f94c5f4e0ded104c553d6754f21706d89a3c897a",
"body": "…in ORCHESTRATOR.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record PR #338 (optional projection id / singleton) merged …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-17T08:18:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5d84f04a6724f4ee0dc3ec94d71b4826f3d2b4cb",
"body": "* Make the projection id optional with a single-instance default\n\nThe projection id function is now optional. A single-instance read model\ndeclares singleton() on the Java Projection.Builder, or uses the dedicated\nKotlin builders singletonProjection/dcbSingletonProjection, dropping the\nper-event id.\n[…]\n.md note to singletonBuilder(...) for the Java\nsingle-instance entry point.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make the projection id optional with a single-instance default (#338)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-17T08:17:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1c23317f52c1f8635522ab2ab64aef10788a975c",
"body": "…vadoc fix in ORCHESTRATOR.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record DcbProjectionRunner factory PR #337 and the retry-ja…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T13:24:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6a7c2fabb8393eeb584210d385f8f5a7d3e5d547",
"body": "ProjectionRunner is built with static factories (agnostic/stream) but\nDcbProjectionRunner exposed a public constructor, so the two runner\nfamilies were created two different ways. Give DcbProjectionRunner and\nReactiveDcbProjectionRunner a static create(...) factory and make the\nconstructor private, matching the non-DCB runners. Update the two call\nsites and the javadoc. No behaviour change.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Create DcbProjectionRunner through a static factory (#337)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T13:23:40Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "589c2cc3fa795c973550afbaf578e6cd6788b2cb",
"body": "The ViewStateRepository overloads said \"no optimistic-locking retry is\napplied\", which read as if a failed update is dropped. Clarify that the\nsubscription model's retry strategy still redelivers a failed event, and\nthat the fine-grained re-read-and-reapply retry is what materialized(...)\nadds for concurrent writers to the same instance. Doc only.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Clarify projection materialization retry javadoc",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T12:53:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b30d2a8bf2734321ed5d44f5f3b1377ac95374d3",
"body": "…TOR.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record ProjectionFilters internal move PR #336 in ORCHESTRA…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T11:09:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "98bb61d0f05ee770260024b9a1133041617e005a",
"body": "ProjectionFilters is plumbing shared by the blocking and reactor runners\nand the annotation registrar, not something callers construct like the\nProjection and DcbProjection descriptors. Move it from\norg.occurrent.dsl.projection to org.occurrent.dsl.projection.internal so\nexternal users see it is not part of the public API, matching the repo's\ninternal-package convention. Pure move, no behaviour change.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Move ProjectionFilters into an internal package (#336)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T11:09:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c5dd837b6a3eaca5110bbfaeb023ce53786b1983",
"body": "…R.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record @Component projection example PR #335 in ORCHESTRATO…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T10:31:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e5e1a3a9d3267a5591641ce74f8d024aef2d1d40",
"body": "The @Projection factory method does not need to be a @Bean in a\n@Configuration class: the registrar scans every Spring bean's methods\nfor @Projection. Move the course dashboard to a plain @Component (renamed\nCourseDashboardProjectionConfiguration to CourseDashboardProjection),\nwhich reads better for\n[…]\ntion and avoids the extra\nunused descriptor bean plus double factory invocation the @Bean form\ncauses. Note the same in the annotation Javadoc.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Show @Projection on a @Component in the course-enrollment example (#335)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T10:31:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "68855c4757c4195106053118346f0bdc08de56d8",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record store-by-Class PR #334 merged in ORCHESTRATOR.md",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T09:41:05Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "edacc94c2bfd7cc55f925a7d8fbde88513821a78",
"body": "…disambiguator (#334)\n\n* Reference the @Projection store by Class, not only by bean name\n\n@Projection.store() changes from a String bean name to a Class<?> that\nselects the store bean by type (Void.class means unset). A new\nstoreName() gives the optional bean name, used on its own or as a\ndisambigua\n[…]\ning, so the test no longer collides with a local MongoDB or a\nparallel run.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Reference the @Projection store by Class, with an optional bean-name …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T09:40:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2047965a6d6d991f30003373db2b421110e79411",
"body": "* Move the projection-dsl example to example-projection\n\nRelocates example/domain/projection-dsl to example/projection/projection-dsl\nand renames its package from org.occurrent.example.domain.projection to\norg.occurrent.example.projection.dsl, matching the example-projection group's\nnaming (for exam\n[…]\nprojection-dsl and\norg.occurrent.example.projection.dsl to match this move.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Move the projection-dsl example to example-projection (#333)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T07:09:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "363edb74aa054ef9ec9d758767434c2053bc136d",
"body": "…RATOR.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record PR #332 merged and #2 store-by-Class plan in ORCHEST…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T07:00:07Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c1c9587c3b31e13c734f419d177054e4352f4372",
"body": "…hboard (#332)\n\n* Reject a second call to single-assignment projection builder methods\n\nThe Projection.Builder id and filter setters and the Kotlin\nDcbProjectionBuilder criteria setter silently overwrote a prior value\nwhen called twice. Make each throw IllegalStateException on a second\ncall so a dup\n[…]\nequired. It rebuilds from the whole\nevent history regardless of write path.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Reject duplicate projection builder calls and simplify the course das…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T06:58:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2600f0939943f2063f0d620d5941299269f9574a",
"body": "…HESTRATOR.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Note singleton Projection DSL follow-up (issue #331) in ORC…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-16T06:07:11Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "6b5dc400a72e514754d438f11b7e484d164af7dd",
"body": "…TRATOR.md\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record annotation enum unification PR #330 merged in ORCHES…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-15T19:48:32Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "61a11cf1f36284b3002c1215774eb542dfdaef84",
"body": "…ms (#330)\n\n* Unify annotation ResumeBehavior/StartupMode into shared top-level enums\n\n@Subscription, @StreamSubscription, @DcbSubscription, and @Projection each\ndeclared their own identical nested ResumeBehavior { SAME_AS_START_AT, DEFAULT }\nand StartupMode { DEFAULT, WAIT_UNTIL_STARTED, BACKGROUND\n[…]\nFAULT/WAIT_UNTIL_STARTED/BACKGROUND so\nthe test mirrors the real migration.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Unify annotation ResumeBehavior/StartupMode into shared top-level enu…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-15T19:46:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "14f6c80145db14561bbeb56b5c88cbcbccc6d80b",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record @Projection PR #329 merged in ORCHESTRATOR.md",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-15T17:25:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5105146a7d7ec839f3ad87829e0269c4ecebab7f",
"body": "* Add @Projection annotation and the Spring-free resume-gate helper\n\nFoundation for the @Projection follow-up. @Projection (framework/annotations) is a method annotation for a factory returning a Projection/DcbProjection descriptor, with id/startAt/startAtPosition/resumeBehavior/startupMode/capabili\n[…]\ntrol of the key. The store adapters intentionally mirror the view DSL here.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add a @Projection annotation for declarative catch-up read models (#329)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-15T17:22:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "29e7a479e677ab8c7dbad98308cf63d58c17eeca",
"body": "* Add a higher-level read-model Projection DSL\n\nIntroduce a read-side counterpart to DcbDecider: a Projection couples the existing pure View with an id-derivation, its handled event types, and an optional Filter; a DcbProjection adds a DcbCriteria read boundary. A type-safe per-event-type handler bu\n[…]\nProjection DSL, fixed here because this PR's CI is the first to surface it.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add a higher-level read-model Projection DSL (#328)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-15T13:05:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f7f6ef4437e6d513612283e87ccc1b877e860209",
"body": "* Add synchronous subscriptions: core seam + blocking model\n\nIntroduce the foundation for invoking subscription handlers synchronously from\nthe application service before execute returns, so a projection can be updated\nin the write path and, with a transaction, atomically with the event write.\n\n- Tr\n[…]\nact violation fails fast rather than passing\nthrough. Blocking and reactor.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add synchronous subscriptions (#327)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-15T09:20:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4481e961c2bef51f30a7b0b2a873610af36f70fb",
"body": "* Shard CI tests across parallel runners after a shared build\n\nThe single `mvn -B package` over the whole reactor ran ~13-14 min per JDK\nleg, dominated by sequential Testcontainers/Awaitility tests (compile is a\nsmall fraction). Split CI into a cheap `build` job (`install -DskipTests`,\nper JDK) that\n[…]\ns) so each runner does about half the churn. The retry stays as a\nbackstop.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Shard CI tests across parallel runners after a shared build (#326)",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-15T05:40:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f45a90193b78e72154d0067733cd5be590227804",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Note dcb-patterns examples-table follow-up on next release",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-14T14:42:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2728b2b2f4bc3ab2214e79eb4d2a3114f26e4ec3",
"body": "…work\n\nCorrect the upkeep rule: fold the memory update into the same pull request or\npush as the change it describes, so it lands atomically. The direct-to-main\n[ci skip] commit is only the fallback for work that already merged or a\nstandalone memory refresh.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Prefer updating ORCHESTRATOR.md in the same PR/push as the …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-14T14:22:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b1af3e32041db1ad6bb7c9b556380ab4dd4c7222",
"body": "…upkeep rule to AGENTS.md\n\nORCHESTRATOR.md: add the 2026-07-14 Java decider facades entry (PR #325,\nunreleased on main) plus the held docs PR occurrent-org.github.io#5 reminder\nwith release-detection signals, and note it in the header.\n\nAGENTS.md: under \"Deeper context\", require updating .context/OR\n[…]\nerge to main when the change warrants it, note it may be\ncommitted straight to main without a PR, and that such commits use a [ci skip]\nprefix.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "[ci skip] Record Java decider facades in ORCHESTRATOR.md and add its …",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-14T14:20:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "15310eaa51be4f06280dcfc13a41ee99ac456131",
"body": "…les (#324)\n\n* Add DCB read direction/limit and a dcb-patterns example catalog\n\nExtend DcbReadOptions with an optional Direction (FORWARD/BACKWARD) and a\nlimit, plus the backwardsLimited(n) factory, implemented across the\nin-memory, native, Spring blocking, and Spring reactor DCB stores.\nDirection a\n[…]\nhreads or hang. Refresh the\norchestrator note now that the work is in a PR.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add DCB read direction/limit and cover the remaining dcb.events examp…",
"author_name": "Johan Haleby",
"author_login": "johanhaleby",
"committed_at": "2026-07-14T14:12:50Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 0,
"commits_last_year": 415,
"latest_release_at": null,
"latest_release_tag": null,
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 23,
"days_since_latest_release": null,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "org.occurrent:occurrent-rewrite",
"exists": true,
"license": "Apache 2.0",
"keywords": [],
"ecosystem": "maven",
"matches_repo": true,
"registry_url": "https://central.sonatype.com/artifact/org.occurrent/occurrent-rewrite",
"is_deprecated": false,
"latest_version": "0.30.0",
"repository_url": "https://github.com/johanhaleby/occurrent.git/occurrent-rewrite",
"versions_count": 1,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-13T09:30:05Z",
"latest_version_yanked": null,
"days_since_latest_publish": 12
},
{
"name": "org.occurrent:test-support",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "maven",
"matches_repo": null,
"registry_url": "https://central.sonatype.com/artifact/org.occurrent/test-support",
"is_deprecated": false,
"latest_version": "0.16.6",
"repository_url": null,
"versions_count": 41,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2023-08-15T06:46:06Z",
"latest_version_yanked": null,
"days_since_latest_publish": 1075
},
{
"name": "org.occurrent:occurrent-cloudevents-extension",
"exists": true,
"license": "Apache 2.0",
"keywords": [],
"ecosystem": "maven",
"matches_repo": true,
"registry_url": "https://central.sonatype.com/artifact/org.occurrent/occurrent-cloudevents-extension",
"is_deprecated": false,
"latest_version": "0.30.0",
"repository_url": "https://github.com/johanhaleby/occurrent.git/occurrent-cloudevents-extension",
"versions_count": 1,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-13T09:29:34Z",
"latest_version_yanked": null,
"days_since_latest_publish": 12
}
]
},
"popularity": {
"forks": 20,
"stars": 161,
"watchers": 4,
"fork_history": {
"days": [
{
"date": "2020-09-12",
"count": 1
},
{
"date": "2020-09-20",
"count": 1
},
{
"date": "2020-09-29",
"count": 1
},
{
"date": "2020-09-30",
"count": 1
},
{
"date": "2020-11-11",
"count": 1
},
{
"date": "2021-02-05",
"count": 1
},
{
"date": "2021-08-02",
"count": 1
},
{
"date": "2021-08-05",
"count": 1
},
{
"date": "2021-08-13",
"count": 1
},
{
"date": "2021-08-30",
"count": 1
},
{
"date": "2021-11-04",
"count": 1
},
{
"date": "2022-07-11",
"count": 1
},
{
"date": "2023-02-07",
"count": 1
},
{
"date": "2023-04-05",
"count": 1
},
{
"date": "2024-03-19",
"count": 1
},
{
"date": "2024-10-16",
"count": 1
},
{
"date": "2025-05-23",
"count": 1
},
{
"date": "2025-11-08",
"count": 1
},
{
"date": "2026-05-03",
"count": 1
},
{
"date": "2026-07-25",
"count": 1
}
],
"complete": true,
"collected": 20,
"total_forks": 20
},
"star_history": null,
"open_issues_and_prs": 96
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"example"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"application/cloudevent-converter/api/pom.xml",
"application/cloudevent-converter/core/pom.xml",
"application/cloudevent-converter/generic/pom.xml",
"application/cloudevent-converter/jackson/pom.xml",
"application/cloudevent-converter/jackson3/pom.xml",
"application/cloudevent-converter/pom.xml",
"application/cloudevent-converter/xstream/pom.xml",
"application/cloudevent-type-mapper/api/pom.xml",
"application/cloudevent-type-mapper/pom.xml",
"application/cloudevent-type-mapper/reflection/pom.xml",
"application/command-composition/pom.xml",
"application/command-dispatch-annotation/pom.xml",
"application/command-dispatch-dcb/pom.xml",
"application/command-dispatch/pom.xml",
"application/pom.xml",
"application/service/blocking/pom.xml",
"application/service/common/pom.xml",
"application/service/dcb-annotation/pom.xml",
"application/service/pom.xml",
"application/service/reactor/pom.xml",
"application/service/transaction-mongodb-native/pom.xml",
"application/service/transaction-spring-reactor/pom.xml",
"application/service/transaction-spring/pom.xml",
"bom/pom.xml",
"cloudevents-extension/pom.xml",
"common/annotation-support/pom.xml",
"common/eventstore-capability/pom.xml",
"common/filter/pom.xml",
"common/functional-support/pom.xml",
"common/inmemory/filter-matching/pom.xml",
"common/inmemory/pom.xml",
"common/mongodb/native/filter-bsonfilter-conversion/pom.xml",
"common/mongodb/native/pom.xml",
"common/mongodb/pom.xml",
"common/mongodb/specialfilterhandling/pom.xml",
"common/mongodb/spring/filter-query-conversion/pom.xml",
"common/mongodb/spring/pom.xml",
"common/mongodb/spring/sort-conversion/pom.xml",
"common/mongodb/timerepresentation/pom.xml",
"common/pom.xml",
"common/retry/pom.xml",
"common/time/pom.xml",
"deadline/api/blocking/pom.xml",
"deadline/api/pom.xml",
"deadline/inmemory/pom.xml",
"deadline/jobrunr/pom.xml",
"deadline/pom.xml",
"dsl/dcb-dsl/blocking/pom.xml",
"dsl/dcb-dsl/common/pom.xml",
"dsl/dcb-dsl/pom.xml",
"dsl/dcb-dsl/reactor/pom.xml",
"dsl/decider-arrow/pom.xml",
"dsl/decider/pom.xml",
"dsl/module-dsl/blocking/pom.xml",
"dsl/module-dsl/pom.xml",
"dsl/pom.xml",
"dsl/projection-dsl/blocking/pom.xml",
"dsl/projection-dsl/common/pom.xml",
"dsl/projection-dsl/pom.xml",
"dsl/projection-dsl/reactor/pom.xml",
"dsl/query-dsl/blocking/pom.xml",
"dsl/query-dsl/pom.xml",
"dsl/query-dsl/reactor/pom.xml",
"dsl/saga-dsl/blocking/pom.xml",
"dsl/saga-dsl/common/pom.xml",
"dsl/saga-dsl/mongodb-spring/pom.xml",
"dsl/saga-dsl/pom.xml",
"dsl/snapshot-dsl/blocking/pom.xml",
"dsl/snapshot-dsl/common/pom.xml",
"dsl/snapshot-dsl/mongodb-spring-blocking/pom.xml",
"dsl/snapshot-dsl/mongodb-spring-reactor/pom.xml",
"dsl/snapshot-dsl/pom.xml",
"dsl/snapshot-dsl/reactor/pom.xml",
"dsl/subscription-dsl/blocking/pom.xml",
"dsl/subscription-dsl/common/pom.xml",
"dsl/subscription-dsl/pom.xml",
"dsl/subscription-dsl/reactor/pom.xml",
"dsl/view-dsl/pom.xml",
"eventstore/api/blocking/pom.xml",
"eventstore/api/common/pom.xml",
"eventstore/api/dcb-reactor/pom.xml",
"eventstore/api/dcb/pom.xml",
"eventstore/api/pom.xml",
"eventstore/api/reactor/pom.xml",
"eventstore/inmemory/pom.xml",
"eventstore/migration/pom.xml",
"eventstore/migration/position-backfill/pom.xml",
"eventstore/mongodb/common/pom.xml",
"eventstore/mongodb/dcb-common/pom.xml",
"eventstore/mongodb/native/pom.xml",
"eventstore/mongodb/pom.xml",
"eventstore/mongodb/spring/blocking/pom.xml",
"eventstore/mongodb/spring/pom.xml",
"eventstore/mongodb/spring/reactor/pom.xml",
"eventstore/pom.xml",
"example/domain/appointment-scheduling/pom.xml",
"example/domain/course-enrollment/pom.xml",
"example/domain/dcb-patterns/pom.xml",
"example/domain/hotel-booking/pom.xml",
"example/domain/mastermind/decider-model-kotlin/pom.xml",
"example/domain/mastermind/pom.xml",
"example/domain/number-guessing-game/model/pom.xml",
"example/domain/number-guessing-game/mongodb/native/pom.xml",
"example/domain/number-guessing-game/mongodb/pom.xml",
"example/domain/number-guessing-game/mongodb/spring/blocking/pom.xml",
"example/domain/number-guessing-game/mongodb/spring/pom.xml",
"example/domain/number-guessing-game/pom.xml",
"example/domain/pom.xml",
"example/domain/rps/decider-model/pom.xml",
"example/domain/rps/decider-web/pom.xml",
"example/domain/rps/model/pom.xml",
"example/domain/rps/multiround-decider-model/pom.xml",
"example/domain/rps/pom.xml",
"example/domain/rps/pragmatic-model/pom.xml",
"example/domain/uno/model/pom.xml",
"example/domain/uno/mongodb/common/pom.xml",
"example/domain/uno/mongodb/native/pom.xml",
"example/domain/uno/mongodb/pom.xml",
"example/domain/uno/mongodb/spring/blocking/pom.xml",
"example/domain/uno/mongodb/spring/pom.xml",
"example/domain/uno/pom.xml",
"example/domain/word-guessing-game/model/pom.xml",
"example/domain/word-guessing-game/mongodb/pom.xml",
"example/domain/word-guessing-game/mongodb/spring/blocking/pom.xml",
"example/domain/word-guessing-game/mongodb/spring/dcb-autoconfig/pom.xml",
"example/domain/word-guessing-game/mongodb/spring/dcb/pom.xml",
"example/domain/word-guessing-game/mongodb/spring/pom.xml",
"example/domain/word-guessing-game/pom.xml",
"example/forwarder/mongodb-subscription-to-spring-event/pom.xml",
"example/forwarder/pom.xml",
"example/pom.xml",
"example/projection/global-position-catchup/pom.xml",
"example/projection/pom.xml",
"example/projection/projection-dsl/pom.xml",
"example/projection/spring-adhoc-eventstore-mongodb-queries/pom.xml",
"example/projection/spring-reactor-transactional-projection-mongodb/pom.xml",
"example/projection/spring-subscription-based-mongodb-projections/pom.xml",
"example/projection/spring-transactional-projection-mongodb/pom.xml",
"example/saga/order-fulfillment/pom.xml",
"example/saga/pom.xml",
"example/snapshot/closing-the-books/pom.xml",
"example/snapshot/pom.xml",
"framework/annotations/pom.xml",
"framework/pom.xml",
"framework/spring-boot-autoconfigure-mongodb-common/pom.xml",
"framework/spring-boot-starter-mongodb-reactive/pom.xml",
"framework/spring-boot-starter-mongodb/pom.xml",
"library/hederlig/pom.xml",
"library/pom.xml",
"pom.xml",
"rewrite/pom.xml",
"subscription/api/blocking/pom.xml",
"subscription/api/pom.xml",
"subscription/api/reactor/pom.xml",
"subscription/core/pom.xml",
"subscription/inmemory/pom.xml",
"subscription/mongodb/common/base/pom.xml",
"subscription/mongodb/common/blocking/competing-consumer-strategy/pom.xml",
"subscription/mongodb/common/blocking/pom.xml",
"subscription/mongodb/common/pom.xml",
"subscription/mongodb/native/blocking-checkpoint-storage/pom.xml",
"subscription/mongodb/native/blocking-competing-consumer-strategy/pom.xml",
"subscription/mongodb/native/blocking/pom.xml",
"subscription/mongodb/native/pom.xml",
"subscription/mongodb/pom.xml",
"subscription/mongodb/spring/blocking-checkpoint-storage/pom.xml",
"subscription/mongodb/spring/blocking-competing-consumer-strategy/pom.xml",
"subscription/mongodb/spring/blocking/pom.xml",
"subscription/mongodb/spring/common/pom.xml",
"subscription/mongodb/spring/pom.xml",
"subscription/mongodb/spring/reactor-checkpoint-storage/pom.xml",
"subscription/mongodb/spring/reactor/pom.xml",
"subscription/pom.xml",
"subscription/push/blocking/pom.xml",
"subscription/push/pom.xml",
"subscription/push/reactor/pom.xml",
"subscription/redis/pom.xml",
"subscription/redis/spring/blocking-checkpoint-storage/pom.xml",
"subscription/redis/spring/pom.xml",
"subscription/synchronous/blocking/pom.xml",
"subscription/synchronous/pom.xml",
"subscription/synchronous/reactor/pom.xml",
"subscription/util/blocking/catchup-subscription/pom.xml",
"subscription/util/blocking/competing-consumer-subscription/pom.xml",
"subscription/util/blocking/durable-subscription/pom.xml",
"subscription/util/blocking/pom.xml",
"subscription/util/blocking/stream-catchup-subscription/pom.xml",
"subscription/util/pom.xml",
"subscription/util/predicates/pom.xml",
"subscription/util/reactor/catchup-subscription/pom.xml",
"subscription/util/reactor/durable-subscription/pom.xml",
"subscription/util/reactor/pom.xml",
"subscription/util/reactor/stream-catchup-subscription/pom.xml",
"test-support/pom.xml"
],
"largest_source_bytes": 100013,
"source_files_sampled": 1243,
"oversized_source_files": 5,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 9428
},
"dependencies": {
"manifests": [
"application/pom.xml",
"bom/pom.xml",
"cloudevents-extension/pom.xml",
"common/pom.xml",
"deadline/pom.xml",
"dsl/pom.xml",
"eventstore/pom.xml",
"example/pom.xml",
"framework/pom.xml",
"library/pom.xml",
"pom.xml",
"rewrite/pom.xml",
"subscription/pom.xml",
"test-support/pom.xml"
],
"advisories": {
"error": null,
"scope": "published_package",
"source": "osv",
"findings": [
{
"name": "com.fasterxml.jackson.core:jackson-databind",
"direct": false,
"version": "2.21.4",
"severity": "moderate",
"ecosystem": "maven",
"cvss_score": 6.5,
"advisory_ids": [
"GHSA-5gvw-p9qm-jgwh",
"GHSA-5jmj-h7xm-6q6v",
"GHSA-mhm7-754m-9p8w"
],
"fixed_version": "3.2.1",
"advisory_count": 3,
"oldest_advisory_days": 31
}
],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {
"moderate": 1
},
"advisory_count": 3,
"affected_count": 1,
"assessed_count": 58,
"malicious_count": 0,
"assessed_package": "maven:org.occurrent:occurrent-rewrite@0.30.0",
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"maven"
],
"dependencies": [
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "application/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "org.occurrent:occurrent-cloudevents-extension",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-capability",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-filter",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-functional-support",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-annotation-support",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-api-common",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-api-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-api-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-common-inmemory-filter-matching",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-inmemory",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-time",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-common-mongodb-timerepresentation",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-common",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-common-mongodb-specialfilterhandling",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-common-mongodb-native-filter-bsonfilter-conversion",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-retry",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-native",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-common-mongodb-spring-filter-query-conversion",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-common-mongodb-spring-sort-conversion",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-spring-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-spring-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-core",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-common-base",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-api-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-native-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-common-blocking-competing-consumer-strategy",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-api-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-push-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-push-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-synchronous-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-synchronous-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-common",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-reactor-checkpoint-storage",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-util-predicates",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-durable-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-blocking-checkpoint-storage",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-blocking-competing-consumer-strategy",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-native-blocking-checkpoint-storage",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-native-blocking-competing-consumer-strategy",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-redis-spring-blocking-checkpoint-storage",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-durable-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-stream-catchup-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-catchup-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-competing-consumer-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-inmemory",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-api",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-command-composition",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-cloudevent-type-mapper-api",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-generic",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-application-service-common",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-application-service-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-application-service-transaction-mongodb-native",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-application-service-transaction-spring",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-application-service-transaction-spring-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-application-service-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-dcb-annotation-taggenerator",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-command-dispatch",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-command-dispatch-annotation",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-command-dispatch-dcb",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-xstream",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-cloudevent-type-mapper-reflection",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-jackson",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-jackson3",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-dsl-common",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-dsl-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-subscription-dsl-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-module-dsl-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-query-dsl-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-query-dsl-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-decider",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-decider-arrow",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-view-dsl",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-projection-dsl-common",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-projection-dsl-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-projection-dsl-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-saga-dsl-common",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-saga-dsl-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-saga-dsl-mongodb-spring",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-common",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-mongodb-spring-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-mongodb-spring-reactor",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-annotations",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-mongodb-spring-boot-autoconfigure",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-mongodb-spring-boot-starter",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-mongodb-reactive-spring-boot-starter",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-deadline-api-blocking",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-deadline-jobrunr",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-deadline-inmemory",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.occurrent:occurrent-hederlig",
"manifest": "bom/pom.xml",
"ecosystem": "maven",
"version_constraint": "${project.version}"
},
{
"name": "org.jspecify:jspecify",
"manifest": "cloudevents-extension/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "io.cloudevents:cloudevents-core",
"manifest": "cloudevents-extension/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "common/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "deadline/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "dsl/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "eventstore/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "framework/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "library/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "io.cloudevents:cloudevents-bom",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${cloudevents.version}"
},
{
"name": "com.thoughtworks.xstream:xstream",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "1.4.21"
},
{
"name": "org.slf4j:slf4j-api",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "2.0.12"
},
{
"name": "io.javalin:javalin",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "3.9.1"
},
{
"name": "com.j2html:j2html",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "1.4.0"
},
{
"name": "com.rabbitmq:amqp-client",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "5.21.0"
},
{
"name": "jakarta.annotation:jakarta.annotation-api",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "2.1.1"
},
{
"name": "org.jetbrains.kotlin:kotlin-bom",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${kotlin.version}"
},
{
"name": "org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "0.3.7"
},
{
"name": "io.arrow-kt:arrow-stack",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "1.2.4"
},
{
"name": "org.springframework.boot:spring-boot-dependencies",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${spring-boot.version}"
},
{
"name": "org.jspecify:jspecify",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "1.0.0"
},
{
"name": "org.jobrunr:jobrunr",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${jobrunr.version}"
},
{
"name": "org.springframework.retry:spring-retry",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${spring-retry.version}"
},
{
"name": "org.openrewrite.recipe:rewrite-recipe-bom",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "3.34.0"
},
{
"name": "org.junit:junit-bom",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${junit.version}"
},
{
"name": "org.testcontainers:testcontainers-bom",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${test-containers.version}"
},
{
"name": "org.assertj:assertj-bom",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "3.27.4"
},
{
"name": "ch.qos.logback:logback-classic",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "1.5.32"
},
{
"name": "io.vavr:vavr",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "0.10.3"
},
{
"name": "org.awaitility:awaitility",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${awaitility.version}"
},
{
"name": "org.awaitility:awaitility-kotlin",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${awaitility.version}"
},
{
"name": "net.jqwik:jqwik",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "1.9.1"
},
{
"name": "io.github.artsok:rerunner-jupiter",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "2.1.6"
},
{
"name": "org.mockito:mockito-bom",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "5.14.2"
},
{
"name": "io.github.serpro69:kotlin-faker",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "2.0.0-rc.11"
},
{
"name": "org.jetbrains.kotlin:kotlin-maven-allopen",
"manifest": "pom.xml",
"ecosystem": "maven",
"version_constraint": "${kotlin.version}"
},
{
"name": "org.openrewrite:rewrite-java",
"manifest": "rewrite/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "org.openrewrite:rewrite-kotlin",
"manifest": "rewrite/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "org.openrewrite:rewrite-maven",
"manifest": "rewrite/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "org.openrewrite:rewrite-gradle",
"manifest": "rewrite/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "subscription/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"manifest": "test-support/pom.xml",
"ecosystem": "maven",
"version_constraint": "${jackson2.version}"
},
{
"name": "org.jspecify:jspecify",
"manifest": "test-support/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "org.mongodb:mongodb-driver-sync",
"manifest": "test-support/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "org.testcontainers:testcontainers-mongodb",
"manifest": "test-support/pom.xml",
"ecosystem": "maven",
"version_constraint": "${test-containers.version}"
},
{
"name": "org.junit.jupiter:junit-jupiter-engine",
"manifest": "test-support/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "io.cloudevents:cloudevents-core",
"manifest": "test-support/pom.xml",
"ecosystem": "maven",
"version_constraint": null
},
{
"name": "com.fasterxml.jackson.core:jackson-databind",
"manifest": "test-support/pom.xml",
"ecosystem": "maven",
"version_constraint": null
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "ch.qos.logback:logback-classic",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "ch.qos.logback:logback-classic",
"direct": true,
"version": "1.5.32",
"ecosystem": "maven"
},
{
"name": "com.fasterxml.jackson.core:jackson-databind",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "com.fasterxml.jackson:jackson-bom",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "com.j2html:j2html",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "com.j2html:j2html",
"direct": true,
"version": "1.4.0",
"ecosystem": "maven"
},
{
"name": "com.rabbitmq:amqp-client",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "com.rabbitmq:amqp-client",
"direct": true,
"version": "5.21.0",
"ecosystem": "maven"
},
{
"name": "com.thoughtworks.xstream:xstream",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "com.thoughtworks.xstream:xstream",
"direct": true,
"version": "1.4.21",
"ecosystem": "maven"
},
{
"name": "io.arrow-kt:arrow-stack",
"direct": true,
"version": "1.2.4",
"ecosystem": "maven"
},
{
"name": "io.cloudevents:cloudevents-bom",
"direct": true,
"version": "4.0.1",
"ecosystem": "maven"
},
{
"name": "io.cloudevents:cloudevents-core",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.github.artsok:rerunner-jupiter",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.github.artsok:rerunner-jupiter",
"direct": true,
"version": "2.1.6",
"ecosystem": "maven"
},
{
"name": "io.github.serpro69:kotlin-faker",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.github.serpro69:kotlin-faker",
"direct": true,
"version": "2.0.0-rc.11",
"ecosystem": "maven"
},
{
"name": "io.javalin:javalin",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.javalin:javalin",
"direct": true,
"version": "3.9.1",
"ecosystem": "maven"
},
{
"name": "io.vavr:vavr",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.vavr:vavr",
"direct": true,
"version": "0.10.3",
"ecosystem": "maven"
},
{
"name": "jakarta.annotation:jakarta.annotation-api",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "jakarta.annotation:jakarta.annotation-api",
"direct": true,
"version": "2.1.1",
"ecosystem": "maven"
},
{
"name": "net.jqwik:jqwik",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "net.jqwik:jqwik",
"direct": true,
"version": "1.9.1",
"ecosystem": "maven"
},
{
"name": "org.assertj:assertj-bom",
"direct": true,
"version": "3.27.4",
"ecosystem": "maven"
},
{
"name": "org.awaitility:awaitility",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.awaitility:awaitility",
"direct": true,
"version": "4.2.2",
"ecosystem": "maven"
},
{
"name": "org.awaitility:awaitility-kotlin",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.awaitility:awaitility-kotlin",
"direct": true,
"version": "4.2.2",
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlin:kotlin-bom",
"direct": true,
"version": "2.3.21",
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlin:kotlin-maven-allopen",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlin:kotlin-maven-allopen",
"direct": true,
"version": "2.3.21",
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm",
"direct": true,
"version": "0.3.4",
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm",
"direct": true,
"version": "0.3.7",
"ecosystem": "maven"
},
{
"name": "org.jobrunr:jobrunr",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.jobrunr:jobrunr",
"direct": true,
"version": "8.1.0",
"ecosystem": "maven"
},
{
"name": "org.jspecify:jspecify",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.jspecify:jspecify",
"direct": true,
"version": "1.0.0",
"ecosystem": "maven"
},
{
"name": "org.junit.jupiter:junit-jupiter-engine",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.junit:junit-bom",
"direct": true,
"version": "5.11.3",
"ecosystem": "maven"
},
{
"name": "org.mockito:mockito-bom",
"direct": true,
"version": "5.14.2",
"ecosystem": "maven"
},
{
"name": "org.mongodb:mongodb-driver-sync",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-annotation-support",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-annotations",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-application-service-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-application-service-common",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-application-service-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-application-service-transaction-mongodb-native",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-application-service-transaction-spring",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-application-service-transaction-spring-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-api",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-generic",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-jackson",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-jackson3",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-xstream",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevent-type-mapper-api",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevent-type-mapper-reflection",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevents-extension",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-command-composition",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-command-dispatch",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-command-dispatch-annotation",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-command-dispatch-dcb",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-common-inmemory-filter-matching",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-common-mongodb-native-filter-bsonfilter-conversion",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-common-mongodb-specialfilterhandling",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-common-mongodb-spring-filter-query-conversion",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-common-mongodb-spring-sort-conversion",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-common-mongodb-timerepresentation",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-dcb-annotation-taggenerator",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-deadline-api-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-deadline-inmemory",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-deadline-jobrunr",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-decider",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-decider-arrow",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-api-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-api-common",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-api-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-capability",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-inmemory",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-common",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-native",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-spring-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-spring-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-filter",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-functional-support",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-hederlig",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-module-dsl-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-mongodb-reactive-spring-boot-starter",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-mongodb-spring-boot-autoconfigure",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-mongodb-spring-boot-starter",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-projection-dsl-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-projection-dsl-common",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-projection-dsl-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-query-dsl-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-query-dsl-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-retry",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-saga-dsl-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-saga-dsl-common",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-saga-dsl-mongodb-spring",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-common",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-mongodb-spring-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-mongodb-spring-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-snapshot-dsl-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-api-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-api-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-catchup-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-competing-consumer-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-core",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-dsl-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-dsl-common",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-dsl-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-durable-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-durable-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-inmemory",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-common-base",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-common-blocking-competing-consumer-strategy",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-native-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-native-blocking-checkpoint-storage",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-native-blocking-competing-consumer-strategy",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-blocking-checkpoint-storage",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-blocking-competing-consumer-strategy",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-common",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-mongodb-spring-reactor-checkpoint-storage",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-push-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-push-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-redis-spring-blocking-checkpoint-storage",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-stream-catchup-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-synchronous-blocking",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-synchronous-reactor",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-util-predicates",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-time",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-view-dsl",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.openrewrite.recipe:rewrite-recipe-bom",
"direct": true,
"version": "3.34.0",
"ecosystem": "maven"
},
{
"name": "org.openrewrite:rewrite-gradle",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.openrewrite:rewrite-java",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.openrewrite:rewrite-kotlin",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.openrewrite:rewrite-maven",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.slf4j:slf4j-api",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.slf4j:slf4j-api",
"direct": true,
"version": "2.0.12",
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-dependencies",
"direct": true,
"version": "4.1.0",
"ecosystem": "maven"
},
{
"name": "org.springframework.retry:spring-retry",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.retry:spring-retry",
"direct": true,
"version": "2.0.12",
"ecosystem": "maven"
},
{
"name": "org.testcontainers:testcontainers-bom",
"direct": true,
"version": "2.0.5",
"ecosystem": "maven"
},
{
"name": "org.testcontainers:testcontainers-mongodb",
"direct": true,
"version": null,
"ecosystem": "maven"
},
{
"name": "com.fasterxml.jackson.core:jackson-annotations",
"direct": false,
"version": "2.21",
"ecosystem": "maven"
},
{
"name": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "com.fasterxml.jackson.module:jackson-module-kotlin",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.arrow-kt:arrow-core",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.cloudevents:cloudevents-api",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.cloudevents:cloudevents-json-jackson",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.lettuce:lettuce-core",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.projectreactor:reactor-core",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "io.projectreactor:reactor-test",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.apache.maven.plugins:maven-gpg-plugin",
"direct": false,
"version": "1.6",
"ecosystem": "maven"
},
{
"name": "org.apache.maven.plugins:maven-javadoc-plugin",
"direct": false,
"version": "3.5.0",
"ecosystem": "maven"
},
{
"name": "org.apache.maven.plugins:maven-shade-plugin",
"direct": false,
"version": "3.6.0",
"ecosystem": "maven"
},
{
"name": "org.apache.maven.plugins:maven-source-plugin",
"direct": false,
"version": "3.3.1",
"ecosystem": "maven"
},
{
"name": "org.apache.maven.plugins:maven-surefire-plugin",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.assertj:assertj-core",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.codehaus.mojo:build-helper-maven-plugin",
"direct": false,
"version": "3.6.1",
"ecosystem": "maven"
},
{
"name": "org.codehaus.mojo:flatten-maven-plugin",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.codehaus.mojo:flatten-maven-plugin",
"direct": false,
"version": "1.7.2",
"ecosystem": "maven"
},
{
"name": "org.jetbrains.dokka:dokka-maven-plugin",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.jetbrains.dokka:dokka-maven-plugin",
"direct": false,
"version": "2.0.0",
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlin:kotlin-maven-plugin",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlin:kotlin-maven-plugin",
"direct": false,
"version": "2.3.21",
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlin:kotlin-reflect",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlin:kotlin-stdlib",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlin:kotlin-test",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.jetbrains.kotlinx:kotlinx-html-jvm",
"direct": false,
"version": "0.11.0",
"ecosystem": "maven"
},
{
"name": "org.junit.jupiter:junit-jupiter",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.junit.jupiter:junit-jupiter-params",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.mockito:mockito-core",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.mongodb:mongodb-driver-core",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.mongodb:mongodb-driver-reactivestreams",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:example-domain-word-guessing-game-model",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:example-number-guessing-game-model",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:example-rps-decider-model",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:example-uno-eventstore-mongodb-common",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:example-uno-model",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-cloudevent-converter-core",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-dcb-dsl-blocking",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-dcb-dsl-common",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-dcb-dsl-reactor",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-api-dcb",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-api-dcb-reactor",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-eventstore-mongodb-dcb-common",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-catchup-reactor",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:occurrent-subscription-stream-catchup-reactor",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.occurrent:test-support",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.openrewrite:rewrite-java-21",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.openrewrite:rewrite-test",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.slf4j:slf4j-simple",
"direct": false,
"version": "2.0.12",
"ecosystem": "maven"
},
{
"name": "org.sonatype.central:central-publishing-maven-plugin",
"direct": false,
"version": "0.7.0",
"ecosystem": "maven"
},
{
"name": "org.sonatype.plugins:nexus-staging-maven-plugin",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.sonatype.plugins:nexus-staging-maven-plugin",
"direct": false,
"version": "1.6.13",
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-autoconfigure",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-configuration-processor",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-data-mongodb",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-devtools",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-maven-plugin",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-maven-plugin",
"direct": false,
"version": "4.1.0",
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-mongodb",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter-aspectj",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter-data-mongodb",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter-data-mongodb-reactive",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter-data-redis",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter-test",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter-thymeleaf",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter-webflux",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-starter-webmvc",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-test",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.boot:spring-boot-testcontainers",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.data:spring-data-mongodb",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.data:spring-data-redis",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework.hateoas:spring-hateoas",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework:spring-aspects",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.springframework:spring-tx",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.testcontainers:testcontainers",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.testcontainers:testcontainers-junit-jupiter",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.testcontainers:testcontainers-rabbitmq",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "org.webjars.npm:htmx-ext-sse",
"direct": false,
"version": "2.2.3",
"ecosystem": "maven"
},
{
"name": "org.webjars.npm:htmx.org",
"direct": false,
"version": "2.0.6",
"ecosystem": "maven"
},
{
"name": "org.webjars:webjars-locator-lite",
"direct": false,
"version": "1.1.0",
"ecosystem": "maven"
},
{
"name": "tools.jackson.core:jackson-databind",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "tools.jackson.module:jackson-module-kotlin",
"direct": false,
"version": null,
"ecosystem": "maven"
},
{
"name": "tools.jackson:jackson-bom",
"direct": false,
"version": null,
"ecosystem": "maven"
}
],
"collected": true,
"truncated": false,
"total_count": 232,
"direct_count": 148,
"indirect_count": 84
}
},
"maintainership": {
"issues": {
"open_prs": 1,
"merged_prs": 182,
"open_issues": 95,
"closed_ratio": 0.532,
"closed_issues": 108,
"closed_unmerged_prs": 39
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "johanhaleby",
"commits": 1763,
"avatar_url": "https://avatars.githubusercontent.com/u/187029?v=4"
},
{
"type": "User",
"login": "gavvvr",
"commits": 52,
"avatar_url": "https://avatars.githubusercontent.com/u/1719646?v=4"
},
{
"type": "User",
"login": "JanGroot",
"commits": 4,
"avatar_url": "https://avatars.githubusercontent.com/u/4427488?v=4"
},
{
"type": "User",
"login": "DaveOfMalmo",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/2962708?v=4"
},
{
"type": "User",
"login": "slinkydeveloper",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/6706544?v=4"
},
{
"type": "User",
"login": "MateuszNaKodach",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/18637116?v=4"
},
{
"type": "User",
"login": "chrisdginn",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/159921?v=4"
}
],
"contributors_sampled": 7,
"top_contributor_share": 0.967
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"maven.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 7,
"reason": "15 out of 19 merged PRs checked by a CI test -- score normalized to 7",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "8cc4e9ab11cc3496a98b4315352845ce200ee152",
"ran_at": "2026-07-25T16:40:26Z",
"aggregate_score": 4.9,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-25T14:17:00Z",
"oldest_open_prs": [
{
"number": 426,
"created_at": "2026-07-25T14:16:14Z",
"last_comment_at": "2026-07-25T14:38:30Z",
"last_comment_author": "johanhaleby"
}
],
"last_merged_pr_at": "2026-07-25T14:10:34Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 6,
"created_at": "2020-09-04T06:05:22Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 7,
"created_at": "2020-09-04T07:09:13Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 11,
"created_at": "2020-09-14T10:31:47Z",
"last_comment_at": "2020-10-18T05:54:45Z",
"last_comment_author": "johanhaleby"
},
{
"number": 13,
"created_at": "2020-09-25T12:18:33Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 15,
"created_at": "2020-10-07T08:37:18Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 16,
"created_at": "2020-10-09T06:49:29Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 19,
"created_at": "2020-10-20T05:00:36Z",
"last_comment_at": "2020-10-20T05:41:22Z",
"last_comment_author": "johanhaleby"
},
{
"number": 22,
"created_at": "2020-10-23T04:57:44Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 23,
"created_at": "2020-10-27T08:27:14Z",
"last_comment_at": "2020-11-28T17:43:50Z",
"last_comment_author": "johanhaleby"
},
{
"number": 24,
"created_at": "2020-10-29T06:48:05Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 27,
"created_at": "2020-11-02T08:28:33Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 31,
"created_at": "2020-11-03T08:00:34Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 32,
"created_at": "2020-11-03T08:02:05Z",
"last_comment_at": "2020-11-28T17:41:36Z",
"last_comment_author": "johanhaleby"
},
{
"number": 34,
"created_at": "2020-11-09T11:09:54Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 49,
"created_at": "2020-12-21T08:46:04Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 50,
"created_at": "2020-12-21T13:30:15Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 54,
"created_at": "2020-12-22T14:36:54Z",
"last_comment_at": "2020-12-22T14:37:50Z",
"last_comment_author": "johanhaleby"
},
{
"number": 55,
"created_at": "2020-12-22T14:37:33Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 56,
"created_at": "2020-12-23T08:48:57Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 58,
"created_at": "2020-12-31T11:06:43Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/johanhaleby/occurrent",
"host": "github.com",
"name": "occurrent",
"owner": "johanhaleby"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"security": 57,
"vitality": 48,
"community": 49,
"governance": 57,
"engineering": 77
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 48,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"commits_last_year": 415,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 23
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "23/52 weeks with commits",
"points": 15.9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 23
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "415 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 415
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "critical",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"releases_count": 0
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "no releases published",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases_published",
"params": {}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 0,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 0 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 0
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 49,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "at_risk",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 49,
"inputs": {
"forks": 20,
"stars": 161,
"watchers": 4,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "161 stars",
"points": 35.8,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 161
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "20 forks",
"points": 10.7,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 20
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "4 watchers",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 4
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 57,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 22,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 7,
"top_contributor_share": 0.967
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 97% of commits",
"points": 0.7,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 97
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "7 contributors",
"points": 9.5,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 7
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"merged_prs": 182,
"open_issues": 95,
"closed_issues": 108,
"issue_closed_ratio": 0.532,
"closed_unmerged_prs": 39
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "53% of issues closed",
"points": 24.9,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 53
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "182/221 decided PRs merged",
"points": 31.5,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 182,
"decided": 221
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 67,
"inputs": {
"followers": 414,
"owner_type": "User",
"is_verified": null,
"owner_login": "johanhaleby",
"public_repos": 72,
"account_age_days": 6029
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "414 followers of johanhaleby",
"points": 18.8,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 414,
"login": "johanhaleby"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "72 public repos, account ~16 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 72
}
},
{
"code": "account_age_years",
"params": {
"years": 16
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"org.occurrent:occurrent-rewrite",
"org.occurrent:test-support",
"org.occurrent:occurrent-cloudevents-extension"
],
"ecosystems": "maven",
"any_deprecated": false,
"min_days_since_publish": 12
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "3 package(s) on maven",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 3,
"ecosystems": "maven"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 12 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 12
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "41 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 41
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 77,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "15 out of 19 merged PRs checked by a CI test -- score normalized to 7",
"points": 14,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"topics": [
"cloud-events",
"event-sourcing",
"java",
"kotlin"
],
"has_wiki": true,
"homepage": "https://occurrent.org",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://occurrent.org",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "4 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 4
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 57,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 49,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4.9
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "15 out of 19 merged PRs checked by a CI test -- score normalized to 7",
"points": 1.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Matched the maven:org.occurrent:occurrent-rewrite@0.30.0 runtime dependency closure — what installing the published package pulls in — 58 packages. Reachability is not analyzed.",
"notes": [
{
"code": "advisories_scope_published",
"params": {
"package": "maven:org.occurrent:occurrent-rewrite@0.30.0",
"assessed": 58
}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 87,
"inputs": {
"source": "osv",
"advisories": 3,
"affected_packages": 1,
"assessed_packages": 58,
"unassessed_packages": 0,
"affected_by_severity": "moderate 1",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "1 affected: com.fasterxml.jackson.core:jackson-databind 2.21.4 (moderate 6.5)",
"points": 12,
"status": "partial",
"details": [
{
"code": "advisories_affected",
"params": {
"count": 1,
"packages": "com.fasterxml.jackson.core:jackson-databind 2.21.4 (moderate 6.5)"
}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory has been public longer than 90 days",
"points": 40,
"status": "met",
"details": [
{
"code": "advisories_none_stale",
"params": {
"days": 90
}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 58,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 8
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 69,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.88,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 9428
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "88 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 88,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.7,
"toolchain_manifests": [
"application/cloudevent-converter/api/pom.xml",
"application/cloudevent-converter/core/pom.xml",
"application/cloudevent-converter/generic/pom.xml",
"application/cloudevent-converter/jackson/pom.xml",
"application/cloudevent-converter/jackson3/pom.xml",
"application/cloudevent-converter/pom.xml",
"application/cloudevent-converter/xstream/pom.xml",
"application/cloudevent-type-mapper/api/pom.xml",
"application/cloudevent-type-mapper/pom.xml",
"application/cloudevent-type-mapper/reflection/pom.xml",
"application/command-composition/pom.xml",
"application/command-dispatch-annotation/pom.xml",
"application/command-dispatch-dcb/pom.xml",
"application/command-dispatch/pom.xml",
"application/pom.xml",
"application/service/blocking/pom.xml",
"application/service/common/pom.xml",
"application/service/dcb-annotation/pom.xml",
"application/service/pom.xml",
"application/service/reactor/pom.xml",
"application/service/transaction-mongodb-native/pom.xml",
"application/service/transaction-spring-reactor/pom.xml",
"application/service/transaction-spring/pom.xml",
"bom/pom.xml",
"cloudevents-extension/pom.xml",
"common/annotation-support/pom.xml",
"common/eventstore-capability/pom.xml",
"common/filter/pom.xml",
"common/functional-support/pom.xml",
"common/inmemory/filter-matching/pom.xml",
"common/inmemory/pom.xml",
"common/mongodb/native/filter-bsonfilter-conversion/pom.xml",
"common/mongodb/native/pom.xml",
"common/mongodb/pom.xml",
"common/mongodb/specialfilterhandling/pom.xml",
"common/mongodb/spring/filter-query-conversion/pom.xml",
"common/mongodb/spring/pom.xml",
"common/mongodb/spring/sort-conversion/pom.xml",
"common/mongodb/timerepresentation/pom.xml",
"common/pom.xml",
"common/retry/pom.xml",
"common/time/pom.xml",
"deadline/api/blocking/pom.xml",
"deadline/api/pom.xml",
"deadline/inmemory/pom.xml",
"deadline/jobrunr/pom.xml",
"deadline/pom.xml",
"dsl/dcb-dsl/blocking/pom.xml",
"dsl/dcb-dsl/common/pom.xml",
"dsl/dcb-dsl/pom.xml",
"dsl/dcb-dsl/reactor/pom.xml",
"dsl/decider-arrow/pom.xml",
"dsl/decider/pom.xml",
"dsl/module-dsl/blocking/pom.xml",
"dsl/module-dsl/pom.xml",
"dsl/pom.xml",
"dsl/projection-dsl/blocking/pom.xml",
"dsl/projection-dsl/common/pom.xml",
"dsl/projection-dsl/pom.xml",
"dsl/projection-dsl/reactor/pom.xml",
"dsl/query-dsl/blocking/pom.xml",
"dsl/query-dsl/pom.xml",
"dsl/query-dsl/reactor/pom.xml",
"dsl/saga-dsl/blocking/pom.xml",
"dsl/saga-dsl/common/pom.xml",
"dsl/saga-dsl/mongodb-spring/pom.xml",
"dsl/saga-dsl/pom.xml",
"dsl/snapshot-dsl/blocking/pom.xml",
"dsl/snapshot-dsl/common/pom.xml",
"dsl/snapshot-dsl/mongodb-spring-blocking/pom.xml",
"dsl/snapshot-dsl/mongodb-spring-reactor/pom.xml",
"dsl/snapshot-dsl/pom.xml",
"dsl/snapshot-dsl/reactor/pom.xml",
"dsl/subscription-dsl/blocking/pom.xml",
"dsl/subscription-dsl/common/pom.xml",
"dsl/subscription-dsl/pom.xml",
"dsl/subscription-dsl/reactor/pom.xml",
"dsl/view-dsl/pom.xml",
"eventstore/api/blocking/pom.xml",
"eventstore/api/common/pom.xml",
"eventstore/api/dcb-reactor/pom.xml",
"eventstore/api/dcb/pom.xml",
"eventstore/api/pom.xml",
"eventstore/api/reactor/pom.xml",
"eventstore/inmemory/pom.xml",
"eventstore/migration/pom.xml",
"eventstore/migration/position-backfill/pom.xml",
"eventstore/mongodb/common/pom.xml",
"eventstore/mongodb/dcb-common/pom.xml",
"eventstore/mongodb/native/pom.xml",
"eventstore/mongodb/pom.xml",
"eventstore/mongodb/spring/blocking/pom.xml",
"eventstore/mongodb/spring/pom.xml",
"eventstore/mongodb/spring/reactor/pom.xml",
"eventstore/pom.xml",
"example/domain/appointment-scheduling/pom.xml",
"example/domain/course-enrollment/pom.xml",
"example/domain/dcb-patterns/pom.xml",
"example/domain/hotel-booking/pom.xml",
"example/domain/mastermind/decider-model-kotlin/pom.xml",
"example/domain/mastermind/pom.xml",
"example/domain/number-guessing-game/model/pom.xml",
"example/domain/number-guessing-game/mongodb/native/pom.xml",
"example/domain/number-guessing-game/mongodb/pom.xml",
"example/domain/number-guessing-game/mongodb/spring/blocking/pom.xml",
"example/domain/number-guessing-game/mongodb/spring/pom.xml",
"example/domain/number-guessing-game/pom.xml",
"example/domain/pom.xml",
"example/domain/rps/decider-model/pom.xml",
"example/domain/rps/decider-web/pom.xml",
"example/domain/rps/model/pom.xml",
"example/domain/rps/multiround-decider-model/pom.xml",
"example/domain/rps/pom.xml",
"example/domain/rps/pragmatic-model/pom.xml",
"example/domain/uno/model/pom.xml",
"example/domain/uno/mongodb/common/pom.xml",
"example/domain/uno/mongodb/native/pom.xml",
"example/domain/uno/mongodb/pom.xml",
"example/domain/uno/mongodb/spring/blocking/pom.xml",
"example/domain/uno/mongodb/spring/pom.xml",
"example/domain/uno/pom.xml",
"example/domain/word-guessing-game/model/pom.xml",
"example/domain/word-guessing-game/mongodb/pom.xml",
"example/domain/word-guessing-game/mongodb/spring/blocking/pom.xml",
"example/domain/word-guessing-game/mongodb/spring/dcb-autoconfig/pom.xml",
"example/domain/word-guessing-game/mongodb/spring/dcb/pom.xml",
"example/domain/word-guessing-game/mongodb/spring/pom.xml",
"example/domain/word-guessing-game/pom.xml",
"example/forwarder/mongodb-subscription-to-spring-event/pom.xml",
"example/forwarder/pom.xml",
"example/pom.xml",
"example/projection/global-position-catchup/pom.xml",
"example/projection/pom.xml",
"example/projection/projection-dsl/pom.xml",
"example/projection/spring-adhoc-eventstore-mongodb-queries/pom.xml",
"example/projection/spring-reactor-transactional-projection-mongodb/pom.xml",
"example/projection/spring-subscription-based-mongodb-projections/pom.xml",
"example/projection/spring-transactional-projection-mongodb/pom.xml",
"example/saga/order-fulfillment/pom.xml",
"example/saga/pom.xml",
"example/snapshot/closing-the-books/pom.xml",
"example/snapshot/pom.xml",
"framework/annotations/pom.xml",
"framework/pom.xml",
"framework/spring-boot-autoconfigure-mongodb-common/pom.xml",
"framework/spring-boot-starter-mongodb-reactive/pom.xml",
"framework/spring-boot-starter-mongodb/pom.xml",
"library/hederlig/pom.xml",
"library/pom.xml",
"pom.xml",
"rewrite/pom.xml",
"subscription/api/blocking/pom.xml",
"subscription/api/pom.xml",
"subscription/api/reactor/pom.xml",
"subscription/core/pom.xml",
"subscription/inmemory/pom.xml",
"subscription/mongodb/common/base/pom.xml",
"subscription/mongodb/common/blocking/competing-consumer-strategy/pom.xml",
"subscription/mongodb/common/blocking/pom.xml",
"subscription/mongodb/common/pom.xml",
"subscription/mongodb/native/blocking-checkpoint-storage/pom.xml",
"subscription/mongodb/native/blocking-competing-consumer-strategy/pom.xml",
"subscription/mongodb/native/blocking/pom.xml",
"subscription/mongodb/native/pom.xml",
"subscription/mongodb/pom.xml",
"subscription/mongodb/spring/blocking-checkpoint-storage/pom.xml",
"subscription/mongodb/spring/blocking-competing-consumer-strategy/pom.xml",
"subscription/mongodb/spring/blocking/pom.xml",
"subscription/mongodb/spring/common/pom.xml",
"subscription/mongodb/spring/pom.xml",
"subscription/mongodb/spring/reactor-checkpoint-storage/pom.xml",
"subscription/mongodb/spring/reactor/pom.xml",
"subscription/pom.xml",
"subscription/push/blocking/pom.xml",
"subscription/push/pom.xml",
"subscription/push/reactor/pom.xml",
"subscription/redis/pom.xml",
"subscription/redis/spring/blocking-checkpoint-storage/pom.xml",
"subscription/redis/spring/pom.xml",
"subscription/synchronous/blocking/pom.xml",
"subscription/synchronous/pom.xml",
"subscription/synchronous/reactor/pom.xml",
"subscription/util/blocking/catchup-subscription/pom.xml",
"subscription/util/blocking/competing-consumer-subscription/pom.xml",
"subscription/util/blocking/durable-subscription/pom.xml",
"subscription/util/blocking/pom.xml",
"subscription/util/blocking/stream-catchup-subscription/pom.xml",
"subscription/util/pom.xml",
"subscription/util/predicates/pom.xml",
"subscription/util/reactor/catchup-subscription/pom.xml",
"subscription/util/reactor/durable-subscription/pom.xml",
"subscription/util/reactor/pom.xml",
"subscription/util/reactor/stream-catchup-subscription/pom.xml",
"test-support/pom.xml"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "application/cloudevent-converter/api/pom.xml, application/cloudevent-converter/core/pom.xml, application/cloudevent-converter/generic/pom.xml (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "application/cloudevent-converter/api/pom.xml, application/cloudevent-converter/core/pom.xml, application/cloudevent-converter/generic/pom.xml"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Java (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Java"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "70 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 70,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Java",
"largest_source_bytes": 100013,
"source_files_sampled": 1243,
"oversized_source_files": 5
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Java (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Java"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "5/1243 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 1243,
"oversized": 5
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"example"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "example",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "example"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-25T16:41:37.896394Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/johanhaleby/occurrent.svg",
"full_name": "johanhaleby/occurrent",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}