Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 1331,
"has_wiki": true,
"homepage": null,
"languages": {
"Shell": 2461,
"JavaScript": 2617,
"TypeScript": 1775154
},
"pushed_at": "2026-07-18T03:18:22Z",
"created_at": "2026-05-18T15:22:43Z",
"owner_type": "Organization",
"updated_at": "2026-07-18T03:18:25Z",
"description": "A event sourcing framework for typescript inspired by Axon Framework 5",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript"
]
},
"owner": {
"blog": null,
"name": "Kronos",
"type": "Organization",
"login": "KronosDB",
"company": null,
"location": "Sweden",
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/274892491?v=4",
"created_at": "2026-04-09T18:30:49Z",
"is_verified": null,
"public_repos": 3,
"account_age_days": 104
},
"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": "c267eedd0b481b584f358bdddb50ad6762e1d235",
"body": "Publish corrected compiled entrypoints for @kronos-ts/kronosdb@0.3.1 and its workspace dependency closure.",
"is_bot": true,
"headline": "chore: version packages",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-18T03:18:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f3f9fbc84abf713cddb0f81da39d832eafa9386e",
"body": "Publish compiled dist entrypoints, retain concrete workspace dependency versions, and add regression coverage for package manifest preparation.",
"is_bot": false,
"headline": "Fix npm package entrypoints",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-07-18T02:53:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cbf03797ada0d29cc6861f84a118825857647995",
"body": "Release @kronos-ts/kronosdb@0.3.0 with batched Source/Stream support and optional distributed messaging.",
"is_bot": true,
"headline": "chore: version packages",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-18T02:46:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3a95169b264a63337ab25375bbbe59ff693d270f",
"body": null,
"is_bot": false,
"headline": "Merge branch 'main' of github.com:KronosDB/kronos-ts",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-07-17T12:25:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e71323ea689abbe9a0103d96baea5e0292c4af8e",
"body": "Sync protos with kronosdb 0.5: SourceResponse/StreamResponse carry\nSequencedEventBatch (per-event fields reserved); batchSize on requests,\n0 = server default. source() and the event-processor stream unpack\nbatches internally — no API change. Permit accounting is per-event.\ngenerate-proto gains importSuffix=.js so regeneration matches\nmoduleResolution node16.",
"is_bot": false,
"headline": "kronosdb extension: batched Source/Stream wire format (server >= 0.5)",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-07-17T12:24:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3651f7a9880312e9115b991eba4b0efd4b3d10b8",
"body": "… use",
"is_bot": false,
"headline": "Add a messaging option to the kronosDb extension for event-store-only…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-07-16T20:09:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "80adf8ca0521ad7a020b9296ad8f842b1ee227bf",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#14)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-07-01T09:27:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad944b969673dd41e669841dc9ca6bbf59529c00",
"body": "The token_type label change shipped to main without a changeset, so it was\nnever versioned or published. This releases it as a messaging patch.",
"is_bot": false,
"headline": "Add changeset for the PascalCase token_type labels",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-07-01T09:25:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b31631ff09b6e91fc3d42109890967c454bb72c1",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#13)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-30T21:34:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3246b679ac8dbf41a24f449d60899652ab3980bd",
"body": "The streaming query aliases transaction_id::text AS transaction_id, so\nORDER BY transaction_id bound to the text alias and sorted the xid8 cursor\nlexically. When a working set's transaction ids cross a power-of-ten boundary\n(\"1000\" < \"999\" as text) the tail delivered events out of commit order while\n[…]\nequence_position) resume comparison disagreed,\nstranding events on reopen from a tracking token. ORDER BY now references the\ncolumns directly so it sorts by the xid8 value, matching the resume cursor.",
"is_bot": false,
"headline": "Order the postgres gap-free tail by transaction_id numerically",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-30T21:33:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "68450d9f8f4555310a7a8d56342f507833e7d0c1",
"body": "The shared serializer wrote the kebab-case token kind into the token_type\ncolumn, leaving gap-aware sitting next to legacy GlobalSequenceToken rows.\nEmit GlobalSequenceToken / GapAwareToken so the column stays uniform — the\nlabel is informational and deserialization is unchanged (it keys off the\ngapKey in the body, not the type string).",
"is_bot": false,
"headline": "Use PascalCase token_type labels in the token serializer",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-30T14:01:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "991b43131ca54ebf78b0b66eda08a11d96e91c2b",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#12)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-30T13:49:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9eb84ff6caa840eda96d2280a7a2a44485a38fca",
"body": "…sume\n\nPostgres tails events ordered by (transaction_id, sequence_position), but\ndurable tokens stored only sequence_position. Reopening a stream filtered by\nposition alone could permanently skip an event with a lower sequence_position\nbut a higher transaction_id.\n\n- messaging: add gapAwareToken plu\n[…]\nequence_position) tuple cursor from it on reopen.\n- knex/kysely/drizzle/prisma/typeorm token stores round-trip the commit-order\n key through the shared serializer instead of flattening to a position.",
"is_bot": false,
"headline": "Carry the commit-order key in durable tracking tokens for gap-free re…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-30T13:46:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4d1ae1c8b97901aae42dc773ef390e565424afc8",
"body": null,
"is_bot": false,
"headline": "chore: remove outdated docs",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-29T17:42:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb806d025bc83505ef93d9811024a947526f75dd",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#11)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-29T17:40:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56bfb6d600bc5f8db021af9632c799ea5e3090e5",
"body": "…uled-event correlation (#10)\n\n- Scheduled events capture the active unit of work's correlation data at schedule-time, so the fired event carries correlationId/causationId.\n- Per-transaction safety timeouts move onto the database adapters (pg / postgres.js / bun-sql); the drizzle and knex transactio\n[…]\nstatus() snapshot (running / error / position / caughtUp / replaying).\n- Event processors default to propagating handler errors (rollback + redeliver); the swallowing logging error handler is removed.",
"is_bot": false,
"headline": "Add event-processor controls, adapter transaction timeouts, and sched…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-29T17:37:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "553be2fb1a071f1626db0e1f75ee870858a5dfe3",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#9)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-26T15:26:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dafdf1259ac75d651097ba6bbd71a4b2edbb3322",
"body": "- MetricsRecorder (counter/histogram instruments with attributes) and\n noOpMetricsRecorder() in the messaging core, the metrics analogue of\n SpanFactory.\n- meteringHandlerEnhancerDefinition(recorder) records per-invocation metrics\n for command/query/event handlers: messages.handled (counter, outc\n[…]\nlemetry adds createOpenTelemetryMetricsRecorder() over the\n OpenTelemetry Metrics API and an openTelemetryMetrics() extension that wires\n the metering enhancer, composable alongside openTelemetry().",
"is_bot": false,
"headline": "Add a metrics seam and OpenTelemetry metrics extension",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-26T15:22:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "da0ccaed993b749cdd024e06bf65e493f6851729",
"body": "- Drop the unused recorded_at column from the events table\n- Rename message_timestamp to timestamp on the events and scheduled-events tables",
"is_bot": false,
"headline": "Simplify postgres event-store time columns",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-26T15:20:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aa995d466f73977bf047ea5a93314b72c9b56c7a",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#8)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-26T13:15:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "291acd27983829a3c1093767050ac0414d3a1598",
"body": "…ropagation\n\nTwo changesets, intermixed in shared files (e.g. append.ts), so committed together:\n\nmessage.kind + postgres round-trip\n- Message gains a readonly `kind` discriminator (\"command\" | \"event\" | \"query\"),\n exported as MessageKind and narrowed per message type; set by gateways, send(),\n ap\n[…]\n. SpanFactory gains createLinkedHandlerSpan and currentTraceContext. The\n command bus traces dispatch only, so commands no longer get a duplicate handle span.\n\nSee .changeset/ for full release notes.",
"is_bot": false,
"headline": "Add message kind + postgres round-trip parity and correlation/trace p…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-26T13:13:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "118a34d59c760f11773d81d8b331d382a7f83576",
"body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore: version packages (#7)",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-23T14:13:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ac26c0f93864a5179e5fa1ab05f2c36bef39513",
"body": "- schedule()/scheduleAfter() reject an invalid Date / non-finite delay;\n a past time or negative delay is still allowed and fires ASAP\n- postgresTransactionManager arms idle_in_transaction_session_timeout\n (default 30s) and an optional statement_timeout via SET LOCAL, tunable\n through postgres({ transaction: { idleInTransactionTimeoutMs,\n statementTimeoutMs } })\n- begin() rejects instead of hanging when the transaction callback fails\n before returning the handle",
"is_bot": false,
"headline": "Validate schedule inputs and bound postgres transaction lifetime (#6)",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-23T09:51:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fd2eb15d25253730a0446ce74647b533f605d237",
"body": null,
"is_bot": true,
"headline": "chore: version packages",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-22T16:34:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6a3dca48c76a5f498b61b45b9ed641447daee39f",
"body": "…handler helpers\n\nSchedule an event from inside a handler the same way as append()/send(): pass\nan event descriptor + payload and a fire time, and the helper builds the event\nmessage and uses the configured EventScheduler — no manual lookup or message\nconstruction. schedule() takes an absolute Date,\n[…]\nected into the active UnitOfWork at handler-invocation entry\n(event processors and command handlers), so a schedule participates in the\nhandler's transaction and the fired event inherits its metadata.",
"is_bot": false,
"headline": "feat(eventsourcing): add schedule()/scheduleAfter()/cancelSchedule() …",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-22T16:33:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ef3e00882be08932343d3617e3fd28dd0d644b6d",
"body": "bun publish does not implement npm Trusted Publishing, so the release failed\nwith \"missing authentication\". Resolve workspace:* specifiers to concrete\nversions, then publish with npm (which performs the OIDC token exchange), and\nrestore each manifest afterwards.",
"is_bot": false,
"headline": "fix(ci): publish with npm + resolve workspace deps so OIDC auth works",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-22T13:31:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "498c191ee2843e60d20ee38ef370cf5311845ae4",
"body": null,
"is_bot": true,
"headline": "chore: version packages",
"author_name": "github-actions[bot]",
"author_login": "github-actions[bot]",
"committed_at": "2026-06-22T13:23:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f5ed7dac203b3849dc867647228c20426ccbfc36",
"body": "State ids are objects, so the per-UnitOfWork cache key\n`${module.name}:${String(id)}` was \"[object Object]\" for every id,\ncollapsing distinct ids of a module to one entry — the second load() for a\ndifferent id returned the first's state. Serialize the id structurally\n(sorted keys, bigint-safe) so distinct ids get distinct entries.",
"is_bot": false,
"headline": "fix(eventsourcing): key load() cache by structural id, not String(id)",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-22T12:38:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc0f67e6de007f364472f99e658edfffc514f1c4",
"body": "Park a failing event instead of redelivering its batch: the batch commits,\nthe token advances past the poison pill, and later events in the same\nsequence are blocked to preserve ordering. Adds sequencing and enqueue\npolicies, a reprocessor, a DeadLetterListener (with an OpenTelemetry\nlistener), and \n[…]\nzle/kysely/knex/typeorm/prisma backends that enqueue\ninside the active UnitOfWork transaction. The event-processor batchSize\ndefault changes from 100 to 1 so per-entity load() decisions stay isolated.",
"is_bot": false,
"headline": "feat(messaging): add dead-letter queue for event processors",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-22T12:38:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d5c6f33ccf075a945dffe04128b99234192a6b02",
"body": null,
"is_bot": false,
"headline": "chore: version packages",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-17T10:56:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b8faa5b93579ec21c1dec8a6e649cb23398bc27",
"body": "…l restart\n\nWhen a handler batch aborted (UnitOfWork failed before PREPARE_COMMIT), the\ntracking token was held back but the live MessageStream cursor had already\nadvanced past the batch during accumulation. Nothing realigned the stream to\nthe un-committed checkpoint, so the next poll read the next \n[…]\nut a restart — matching Axon's\nclose-and-reopen-from-token recovery. The streaming processor gains an\nerrorBackoffMs option (default 1000ms) to throttle retries of a\ndeterministically failing handler.",
"is_bot": false,
"headline": "fix(messaging): redeliver failed event batch instead of skipping unti…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-17T10:20:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "00815cccccbc24c67171ad030e657046c0eb9875",
"body": null,
"is_bot": false,
"headline": "chore: version packages",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-07T17:35:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "654af973eae92171b9d63a04b38db4e29fc2fc97",
"body": "A breaking change in a pre-1.0 package (@kronos-ts/modelling 0.1.x) belongs\nin the minor slot (0.1.x -> 0.2.0), not a major bump that would prematurely\ncut a 1.0.0. Matches the repo convention of minor-for-breaking under 0.x.",
"is_bot": false,
"headline": "chore: correct state-evolve-builder changeset bump to minor",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-07T17:31:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "74dc43dcc676b917f743404030fa8feae306c41b",
"body": "Command handlers now run through the configured unitOfWorkFactory, so a\nhandler's appended events and any other writes it makes commit — or roll\nback — together.\n\n- messaging: createSimpleCommandBus takes a UoWRunner and runs handlers\n through it (matching the distributed buses); createCommandGatew\n[…]\n handlers are transactional (lazy); PostgresAdapter-\n Transaction.unwrap() exposes the live driver connection so user SQL or an\n ORM can ride the same transaction as the events. README documents it.",
"is_bot": false,
"headline": "feat: run command handlers inside the UnitOfWork transaction",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-07T17:16:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c1a1cf5d297c17cb7a0c2d06065c4f4207853618",
"body": "state() now registers evolvers through a builder — evolve: (on) => [...] —\nwhere `on` is bound to the state type. Evolver callbacks no longer need a\n(s: State) annotation or `as` cast: the state type is fixed by `initial` before\nthe evolvers are checked, so they are validated against it instead of c\n[…]\nd every state block across the workspace and removed 26 dead `on`\nimports. Verified: full build green, main typecheck green, tests-included\ntypecheck shows zero new errors vs baseline, 587 tests pass.",
"is_bot": false,
"headline": "feat(modelling)!: builder form for state() evolvers",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-06-04T07:53:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "891658627b1cfd32b1326ebd5097d9dab00b486c",
"body": null,
"is_bot": false,
"headline": "refactor handler APIs around messages",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-30T19:44:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "459a7100b77d972c734518d6594e5bba9ed34588",
"body": "Minor bumps for the unreleased features:\n- messaging 0.2.0, app 0.2.0, postgres 0.2.0 — durable EventScheduler\n- messaging 0.2.0 — structured subscription filters\n- rabbitmq 0.3.0, kronosdb 0.2.0, axon-server 0.2.0 — distributed\n subscription queries\n\nDependents patch-bumped to 0.1.2 via internal dependency propagation.",
"is_bot": false,
"headline": "chore: version packages — subscription queries + EventScheduler",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-28T07:25:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2179559cd8fff275b59bf9d1a787a7a9993d8116",
"body": "Record the already-published 0.1.1 / rabbitmq 0.2.1 release — the\npublish-via-bun-publish patch. Versions and changelogs were generated by\nchangeset version but never committed; this brings the repo in sync with npm.",
"is_bot": false,
"headline": "chore: version packages (0.1.1)",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-28T07:23:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04e580a89b2b639af3db4087ab6bff67a812c904",
"body": "changeset publish shells out to npm publish, which does not understand\nBun's workspace protocol — published manifests kept literal \"workspace:*\"\nstrings and broke installs for consumers. Replace the release step with\nscripts/publish.sh, which runs bun publish per package (resolving\nworkspace:* to concrete versions) and skips versions already on npm.",
"is_bot": false,
"headline": "chore(release): publish via bun publish to resolve workspace protocol",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-28T07:18:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "259d3226213f1012b6c0f84267166b5ee13e103b",
"body": "…kends\n\nAdd an EventScheduler abstraction for deferring events to a future time,\ncallable only inside a UnitOfWork so schedules commit/roll back atomically\nwith the originating command.\n\n- messaging: EventScheduler contract (schedule/cancel, CancelResult union),\n setTimeout-backed in-memory impleme\n[…]\nto join the active UoW transaction. Worker starts in \"processors\"\n and stops in \"connect\". schedule_id is reused as event_id so re-fires after\n a crash dedupe via the events table UNIQUE constraint.",
"is_bot": false,
"headline": "feat(messaging): durable EventScheduler with in-memory + postgres bac…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-28T07:15:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "03208bd34c95f5ce60ed1898a3ddf68c1083a5e7",
"body": "…ubscription queries\n\nReplaces the broadcast-by-query-name updates transport with a distributed\nsubscriber registry. Every subscribe publishes a claim over a fanout gossip\nexchange; every instance maintains a cluster-wide Map<subId, SubscriberRecord>\nmirror. emitUpdate walks the mirror locally — whe\n[…]\ne out of scope\nfor this change. The caller of bus.subscribe owns the subscription; if its\nprocess dies, the subscriber's stream closes via the normal connection-loss\npath and the caller re-subscribes.",
"is_bot": false,
"headline": "feat(rabbitmq): gossip-mirror subscriber registry for cross-process s…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-27T11:41:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4ff42cf891745cb44ffcb9c29f0d501487b22e41",
"body": "…vice stream\n\nBroker-routed model — Axon Server holds the subscriptionId↔handler mapping,\nso each handler tracks the server-injected subscribers it has been given\nand targets emits directly by subscriptionIdentifier. Structurally mirrors\nthe kronosdb implementation; differs only in the metaData (cap\n[…]\ns cover initialResult, payloadEquals routing, function-filter\nrouting, unsubscribe, complete, and completeExceptionally — driven through\na controllable inbound iterable + fake QueryService connection.",
"is_bot": false,
"headline": "feat(axon-server): distributed subscription queries over the QuerySer…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-26T11:19:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6501ee8f8b108f84647b22bcbaa77bbda7bbaddf",
"body": "…e stream\n\nBroker-routed model — the KronosDB server holds the subscriptionId↔handler\nmapping, so each handler tracks the server-injected subscribers it has been\ngiven and targets emits directly by subscriptionIdentifier.\n\n- handleSubscriptionQueryRequest processes inbound subscribe (runs the\n hand\n[…]\ns cover initialResult, payloadEquals routing, function-filter\nrouting, unsubscribe, complete, and completeExceptionally — driven through\na controllable inbound iterable + fake QueryService connection.",
"is_bot": false,
"headline": "feat(kronosdb): distributed subscription queries over the QueryServic…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-26T11:19:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e28b852a96568836d40ce68f90879afe02b45f23",
"body": "…s transport\n\nBrokerless model — no central subscriptionId registry. Each instance owns an\nexclusive auto-delete queue bound by query name on a shared topic exchange.\nemitUpdate broadcasts a single envelope keyed by query name, and every\nreceiver re-evaluates the SubscriptionFilter against its local\n[…]\nry name binds the\n routing key, last unsubscribe unbinds.\n- Function-shape filters travel via extractStructuredFilter; payloadEquals\n serializes; emitter-local function filters fan out locally only.",
"is_bot": false,
"headline": "feat(rabbitmq): distributed subscription queries over a shared update…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-26T11:19:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2191eb882a763650bcc96d6d754f55438b9c0d06",
"body": "…uting\n\nIntroduce SubscriptionFilter<P> = ((payload) => boolean) | { payloadEquals: Partial<P> }\nso subscription-query emit filters can be evaluated by remote receivers that\nhave no access to the emitter's function closure. Function filters keep\nworking as in-process fallbacks; payloadEquals is the \n[…]\nucturedFilter / matchesPayloadEquals\nhelpers and threads the new type through emitUpdate, completeSubscription,\ncompleteSubscriptionExceptionally on QueryBus, SimpleQueryBus, and\nInterceptingQueryBus.",
"is_bot": false,
"headline": "feat(messaging): structured subscription filters for cross-process ro…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-26T11:17:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fec5807043c8700c88c4171028bcbeed58131cda",
"body": null,
"is_bot": false,
"headline": "chore: remove @kronos-ts/nestjs extension",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T21:01:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4821b07763224d4e1433d9cd296fb82cfe1a6e21",
"body": null,
"is_bot": false,
"headline": "chore: version @kronos-ts/rabbitmq 0.2.0",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T21:00:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f50be5e45e3953847ca3e2bcb21d23643406f0f5",
"body": "Decorate the queryBus alongside the commandBus. Direct request/reply\nqueries route over a dedicated kronos.queries exchange with per-query\nhandler queues and a per-process reply queue, mirroring the command\ntransport. Inbound queries run in a fresh UnitOfWork (AF5 parity).\nSubscription queries stay \n[…]\n transport takes its own\nchannel; the connection owner closes it. Topology gains queriesExchange,\nqueryRoutingKey, queryQueue and queryReplyQueue; replyQueue is renamed\ncommandReplyQueue for symmetry.",
"is_bot": false,
"headline": "feat(rabbitmq): distributed query transport over a shared connection",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T20:59:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "258d817c825db05da12118c77e4cb4692ca03930",
"body": "…port\n\nThe extension provides distributed command and query transport, not\nevent transport. Bumped to 0.1.1 and republished so the corrected\ndescription reaches npm.",
"is_bot": false,
"headline": "fix(rabbitmq): correct package description to command and query trans…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T20:12:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c27a1da2fc5493af79b8a38eef89578d035ec966",
"body": "Configure the monorepo for publishing to the @kronos-ts npm scope:\n\n- Per-package tsconfig.json (plain tsc, no project references — the\n messaging<->eventsourcing import cycle rules them out) plus a shared\n tsconfig.base.json and a root noEmit typecheck config.\n- publishConfig on all 17 packages (\n[…]\nent stores\n implement the EventBus publish/subscribe contract.\n- postgres: canonical Serializer import; adapter param typing.\n\nAll 17 packages build clean; root typecheck passes; 734 unit tests pass.",
"is_bot": false,
"headline": "chore: npm publishing setup + tsc-clean all 17 packages",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T19:54:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "30eb5a174de6e46450572af9216556d00d3ad895",
"body": "…scope\n\nSix packages were named @kronos-ts/extensions/<name> — two slashes, which\nis not a valid npm package name (scoped names allow exactly one). They\nresolved only because Bun matches workspace packages by string.\n\nFlatten drizzle, knex, kysely, nestjs, prisma and opentelemetry to\n@kronos-ts/<nam\n[…]\natching axon-server/kronosdb/postgres/rabbitmq which\nwere already correct. Directories stay under packages/extensions/ — only\nthe package name needed to change. Updated all imports and workspace deps.",
"is_bot": false,
"headline": "refactor: flatten @kronos-ts/extensions/* package names to valid npm …",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T14:54:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e1e1f100898ca3aea34f596e15a68ee2e8a84b77",
"body": "The package was named 'core' but sat at the top of the dependency graph\nas the application container — kronos(), App, RunningApp, the slot system,\nlifecycle and decorators — while the actual foundation leaf is common.\n'core' wearing a foundation name inverted the usual intuition.\n\nRename packages/co\n[…]\n @kronos-ts/app\nacross all 38 referencing files (imports, workspace deps, README). The\npackage name now matches its surface: kronos() builds an App, start()\nyields a RunningApp. No behavioural change.",
"is_bot": false,
"headline": "refactor: rename @kronos-ts/core package to @kronos-ts/app",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T13:26:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "32e5e8fb6c35cf0bfb2eebd1bd773613b6a4edfc",
"body": "Every remaining item is implemented in the codebase. The two outstanding\nextensions are dropped by design rather than built:\n\n- nextjs: a thin lifecycle wrapper around a framework, same reasoning as\n the fastify/express/hono removal — Kronos stays decoupled from the HTTP\n layer and users wire the \n[…]\nlves.\n- mikro-orm: low real-world usage; drizzle/knex/prisma/typeorm/kysely\n already provide ORM integration coverage.\n\nTracking now lives in git history and the issue tracker, not a checked-in\nfile.",
"is_bot": false,
"headline": "chore: remove todo.md — all work items shipped or dropped",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T12:52:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0a5797e4d12ff1119188965b90c39e1a649b99dd",
"body": "Kronos composability is decoupled from the HTTP layer. The framework\nextensions saved roughly one line over plain wiring while adding a\ndeferred-decorator footgun (gateways absent until the serve lifecycle\nstage). Remove all three packages.\n\nThe e2e suite now wires Express directly: start the app, r\n[…]\n Routes are co-located with\ntheir domain slice (registerCourseHttp) so a slice bundles both its\nKronos handlers and its HTTP surface. Renamed the test accordingly and\nadded real HTTP request coverage.",
"is_bot": false,
"headline": "refactor: drop fastify/express/hono framework extensions",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-19T12:51:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2563de5d270ff70c7497f88f96a2d41a5a1c97b9",
"body": "…onfigs\n\nCommand dispatch & UnitOfWork model now aligns fully with Axon Framework 5:\n- single send() helper; commandBus.dispatch always starts a fresh UnitOfWork\n- removed the distributed-processing-context snapshot layer (rabbitmq,\n kronosdb, axon-server carry only message metadata across transpor\n[…]\ncontainers instead of requiring a local server.\n\nAlso folds in in-progress milestone work: entity -> state rename, removal of\nthe legacy Java integration-test tree, and the rabbitmq extension package.",
"is_bot": false,
"headline": "feat: AF5-aligned command dispatch + stateful automation across e2e c…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-18T15:19:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1af7a34097e83cfd55adbd13e0d95e6815eca03f",
"body": "…stgres\n\n- postgres-university-enrollment.ts: full CQRS slice on top of the\n postgres extension. Write side uses bunSqlAdapter, read side uses\n drizzle-orm/bun-sql against the same database, with a tracking\n processor projecting events into course_views. Demonstrates multi-\n entity DCB (Course +\n[…]\nom\n @kronos-ts/postgres so users running their own migrations (and the\n bench) don't need deep imports.\n- Wire @kronos-ts/postgres into integrationtests as a workspace dep so\n the examples resolve.",
"is_bot": false,
"headline": "docs(12): worked example + conditional-append bench for @kronos-ts/po…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-12T14:27:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b3c6e7fbe99fb3d70a0beb31cf60df997e2f8121",
"body": "bunSqlAdapter\n- .unsafe(text, params) doesn't auto-encode JS arrays as Postgres array\n literals; single-element arrays were unwrapped to a scalar and bound as\n TEXT, failing on TEXT[] columns. Pre-encode any plain Array param to\n {\"v1\",\"v2\"} canonical literal form (Buffer/Uint8Array untouched).\n-\n[…]\n/eventsourcing,\n streaming example rewritten against MessageStream's pull API,\n source() example uses the real {events,marker} shape, FAQ on\n custom migrations points at the schema.ts DDL builders.",
"is_bot": false,
"headline": "fix(12): bunSqlAdapter array/JSONB handling + snapshot store correctness",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-12T14:26:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4c38b6c33592e48d10ba00026632b45275e373dd",
"body": "- Ports kraken-tech concurrent-commit-gap scenario: W1 (smaller xid8) holds tx\n open via pg_sleep while W2 commits; subscriber must see BOTH events in xid8 order\n- 20-trial loop with 400ms hold window reliably catches gap-bug if xid8 watermark regresses\n- README documents: install, pgAdapter/postgresAdapter/bunSqlAdapter, bootstrap flag,\n DCB semantics, gap-free streaming explanation, schema, SQLSTATE, FAQ\n- Full suite: 114 tests green across 13 files (Plans 01-06)",
"is_bot": false,
"headline": "feat(12-06): concurrent-commit-gap regression test (20 trials) + README",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T15:35:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7387a924e180fde5aa93ce8e653c84d15a2571fa",
"body": "- Implements all PostgresAdapter methods via globalThis.Bun.SQL (Node-safe compile)\n- Uses Bun.SQL.begin('ISOLATION LEVEL ...') for transaction isolation\n- Feature-detects native LISTEN; falls back to 250ms polling shim if unavailable\n- Normalizes Bun.SQL errors: errno (SQLSTATE) copied to .code to \n[…]\n cleanly if Bun.SQL unavailable\n\n[Rule 1 - Bug] Bun.SQL surfaces SQLSTATE in err.errno not err.code — normalized via\nnormalizeBunSqlError() to satisfy the adapter contract (isDcbViolation reads .code)",
"is_bot": false,
"headline": "feat(12-06): bunSqlAdapter (Bun.sql built-in) + integration test",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T15:32:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6c657a37f76fbf960213018db8f57239dc9f14d9",
"body": "- Implements all PostgresAdapter methods: query, queryOne, transaction, listen, connect, disconnect\n- Disables snake_case->camelCase column transform (transform.column.from: undefined) so SQL column names work verbatim\n- Uses sql.begin('ISOLATION LEVEL ...') for transactions with proper isolation level support\n- Channel safelist /^[A-Za-z0-9_]+$/ guards LISTEN against SQL injection\n- Passes 10-case integration suite (same contract as pgAdapter)",
"is_bot": false,
"headline": "feat(12-06): postgresAdapter (porsager/postgres 3.4) + integration test",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T15:29:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b88e45942341df585ffe27fcc86272f8345b44c1",
"body": "…lifecycle hooks\n\n- Populates eventStore + snapshotStore slots via createPostgresEventStore/SnapshotStore\n- app.onStart('connect'): adapter.connect() + bootstrapSchema via withRetry\n- app.onStop('connect'): adapter.disconnect()\n- bootstrap: false opt-out for users managing their own migrations\n- Export postgres + PostgresConfig from index barrel\n- 2 integration tests green (slot wiring + bootstrap-false)",
"is_bot": false,
"headline": "feat(12-05): add postgres() Extension factory with slot population + …",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T15:24:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be304effc99cef79db8800deea3d73d44df50bd6",
"body": "… + BYTEA payload\n\n- Store/load/deleteSnapshots against kronos_snapshots table\n- INSERT ... ON CONFLICT (entity_name, entity_id) DO UPDATE for idempotent upserts\n- BYTEA payload roundtrip via framework Serializer slot\n- bigint position preserved via text/cast (no precision loss at 2^53+)\n- Export createPostgresSnapshotStore + PostgresSnapshotStoreConfig from index.ts\n- 7 integration tests green against Postgres 16 testcontainer",
"is_bot": false,
"headline": "feat(12-05): add createPostgresSnapshotStore with composite-PK upsert…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T15:21:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "24afa74a4763e0412fa420870231c842e1cb9f39",
"body": "…tSource methods\n\n- Add gap-free streaming via xid8 + pg_snapshot_xmin watermark (D-12.14)\n- Implement getHeadPosition, firstToken, latestToken, publish, subscribe\n- LISTEN/NOTIFY wake-up on kronos_events_${tables.events} channel\n- Immediate poll + 250ms interval fallback for missed notifications\n- Change return type from PartialEventStorageEngine to EventStore\n- Add streaming integration tests (9 green, incl. gap-free + bookmark-resume)",
"is_bot": false,
"headline": "feat(12-05): extend postgres-event-store with open() + StreamableEven…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T15:20:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c5560799c73a4dcde6f2ab4c8364775257df276",
"body": "…th DCB conflict check against testcontainer\n\n- createPostgresEventStore({adapter, serializer, tagResolver, tableNames}) returning partial EventStorageEngine\n- source(): criteria-filtered event query with @> contains-all semantics and ConsistencyMarker\n- append(): atomic conflict-check + INSERT with\n[…]\nPostgresEventStore + PostgresEventStoreConfig + Serializer + TagResolver\n- 9 integration tests green: shape, append+source, two-phase tx, DCB conflict, same-tag race (10 trials), disjoint-tag parallel",
"is_bot": false,
"headline": "feat(12-04): createPostgresEventStore — source/appendEvents/append wi…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T15:09:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "63c3c1bf1a395d92188de6a8b77bcb1780acaa71",
"body": "…extension to schema.ts\n\n- buildCriteriaWhere: EventCriteria discriminated union → parameterised WHERE fragment\n- Tags use @> (contains-all), never && (overlap) — matches in-memory store semantics\n- U+001F delimiter encodes key:value tag strings preventing boundary-shift collisions\n- buildAppendStor\n[…]\n - INSERTs event_id from event_ids[i] (UNIQUE constraint idempotency)\n- bootstrapSchema now applies SP DDL after table/index DDL\n- 7 criteria-sql tests + 3 new schema SP tests green (23 schema total)",
"is_bot": false,
"headline": "feat(12-04): criteria-sql builder + buildAppendStoredProcedureDDL SP …",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T15:02:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a82c4ddbd777d9c62603dad542ba2d545e699e2e",
"body": "…intent/global-intent keyspaces + acquire helpers\n\n- FNV-1a 64-bit hash with signed two's-complement reinterpretation for pg_advisory_xact_lock(BIGINT)\n- Three keyspaces: leaf K(T,t) X-lock for writers; type-intent K(T,ε) and global-intent K(ε,ε) S-lock for writers\n- acquireWriteLocks: X on leaves (\n[…]\nintent (asymmetric inverse)\n- U+001F delimiter prevents tuple-collision hashing (\"ab\",\"c\") vs (\"a\",\"bc\")\n- 14 tests green (canonical FNV-1a vectors; fixed plan spec computation error for foobar value)",
"is_bot": false,
"headline": "feat(12-04): advisory-lock taxonomy — FNV-1a 64-bit hash + leaf/type-…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:59:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6d493ac58c5269417550d14c5fcb4851ca4468d6",
"body": "…s + update index.ts exports\n\n- pgAdapter(config): pool-based PostgresAdapter implementation using node-postgres 8.20\n- LISTEN uses dedicated pinned PoolClient (never released to pool), notification dispatch via listenSlots map\n- transaction(): pinned client per tx with BEGIN ISOLATION LEVEL / COMMI\n[…]\ntainer (TDD RED->GREEN)\n- SQLSTATE KR001 preserved on .code (D-12.12 wiring verified end-to-end)\n- index.ts: re-exports IsolationLevel + adapter types; pgAdapter NOT in barrel (sub-path only, D-12.08)",
"is_bot": false,
"headline": "feat(12-03): implement pgAdapter reference adapter + integration test…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:52:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e3a60d02a89e09af72e84cd28b9732d9c1ebca6b",
"body": "…ation tests\n\n- startPostgresContainer() returns RunningPostgres with connectionString + host/port/db/user/password split\n- postgres:16-alpine image with second 'ready to accept connections' wait (avoids racy first-query failures)\n- Idempotent stop() with stopped flag\n- TESTCONTAINERS_REUSE=1 opt-in for fast local re-runs\n- Used by Plans 04/05/06 integration tests — no test boots its own container directly",
"is_bot": false,
"headline": "feat(12-03): add shared Postgres-16 testcontainers fixture for integr…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:49:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d2ae493195a540473f7a1b78cd5f4c2c5df9f8f7",
"body": "…n adapter.ts\n\n- PostgresAdapter interface: query, queryOne, transaction(isolationLevel, fn), listen, connect, disconnect\n- PostgresAdapterTransaction sub-interface: query only (no nested transactions per D-12.07)\n- IsolationLevel const enum: READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE (verbatim SQL strings)\n- ListenSubscription interface with unlisten() returning Promise<void>\n- QueryRow type alias for Record<string, unknown>\n- 6 adapter contract tests green (TDD RED->GREEN)",
"is_bot": false,
"headline": "feat(12-03): author PostgresAdapter interface + IsolationLevel enum i…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:49:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bbf373a658b8bb73ecbe9b04582656dfe316b58c",
"body": "- buildEventsTableDDL: xid8, BIGSERIAL PK, event_id UUID UNIQUE, JSONB payload, GIN tags, FILLFACTOR=100\n- buildEventsIndexesDDL: unique (type, sequence_position DESC) + GIN(tags) fastupdate=off\n- buildSnapshotsTableDDL: BYTEA payload, composite PK (entity_name, entity_id)\n- KRONOS_SCHEMA_LOCK_KEY =\n[…]\nfinally-release on error, table name substitution\n- SchemaBootstrapAdapter structural interface (Plan 12-03 will satisfy it)\n- 20 pure-unit tests: 14 DDL shape assertions + 6 bootstrap flow assertions",
"is_bot": false,
"headline": "feat(12-02): DDL builder functions in schema.ts with bootstrapSchema()",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:45:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8f66e5ea0fb56bc98785360ee219773901fda780",
"body": "…postgres\n\n- exports AppendConditionError, KRONOS_DCB_VIOLATION_SQLSTATE, isDcbViolation from errors.js\n- documents Wave-2/3/4 plans that will extend this barrel\n- no stubs: adapter sub-paths remain in package.json exports map only",
"is_bot": false,
"headline": "feat(12-01): author public index.ts re-export surface for @kronos-ts/…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:44:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7ebb3850cb5ab585f50798e4a6f2b93695787b4d",
"body": "…STATE, isDcbViolation\n\n- SQLSTATE KR001 in user-defined range, distinct from P0001 generic RAISE\n- AppendConditionError mirrors eventsourcing class with static fromConflictCount factory\n- isDcbViolation adapter-agnostic helper checks err.code against KR001\n- all 6 tests green",
"is_bot": false,
"headline": "feat(12-01): implement AppendConditionError, KRONOS_DCB_VIOLATION_SQL…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:43:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5ece17ae8171c91d5e9f0194c4fcae227902a661",
"body": "…helpers",
"is_bot": false,
"headline": "test(12-01): add failing tests for AppendConditionError and SQLSTATE …",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:43:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "014979c173b2f550a1eb43ca8f8c1fbbaf2a7090",
"body": "- package.json: peer-optional pg/postgres, devDep testcontainers 11.14.0\n- exports map with sub-path adapters (pg, postgres, bun-sql) per D-12.08\n- tsconfig.json: extends workspace base, mirrors kronosdb sibling\n- bun install: workspace symlink materialised",
"is_bot": false,
"headline": "chore(12-01): scaffold @kronos-ts/postgres package manifest and tsconfig",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:43:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5406df0fa29bf96f33d2be014e490a55a36f52cd",
"body": "…ID() v4 to uuid v7\n\n- Import v7 as uuidv7 from uuid package\n- Update JSDoc to describe v7 time-ordered property and btree index benefit\n- All 3 identifier tests pass: shape (version nibble=7), monotonicity, uniqueness",
"is_bot": false,
"headline": "feat(260511-mks-01): switch generateIdentifier() from crypto.randomUU…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:19:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b9b7443600745ef306e157a650955045d857ade",
"body": "…nerateIdentifier\n\n- Add uuid ^11 to packages/common dependencies\n- Create identifier.test.ts with 3 tests: v7 shape, monotonicity, uniqueness\n- RED: shape + monotonicity fail against crypto.randomUUID() v4 output",
"is_bot": false,
"headline": "test(260511-mks-01): add failing v7 shape + monotonicity tests for ge…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T14:19:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1ca9b4e4e322a5936e6d70f7b2cfabd18af98897",
"body": "…ides\n\n- Guard uses \"meta\" in existing (key-presence) not existing.meta === undefined\n so all 3 stateless defaults (serializer/unitOfWorkFactory/tagResolver) are\n also treated as default-override paths and stay silent\n- Genuine collisions (set-over-set, set-over-forceSet) still warn\n- 3 new provenance tests: A (set-over-default with meta), B (set-over-default\n without meta), C (set-over-forceSet warns) — 11/11 green\n- kronosdb e2e: 7/7 green, zero slot override warnings at startup",
"is_bot": false,
"headline": "fix(260511-kwi): silence SlotRegistry.set() warnings on default overr…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T13:06:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "094f074aacb3b55f09fcf4289b2f95de99a41989",
"body": "…r handlers\n\nFinal consumer migration for the Plan 11 API-symmetry hard cutover:\n\n- integrationtests/courses.ts already migrated in mid-Task-3; reaffirmed\n- integrationtests e2e-inmemory: createProjection() now returns flat\n queryHandlers array; all 5 callsites use `.queries(...queryHandlers)`\n- in\n[…]\nefinition,\nQueryHandlersDefinition, registerEventHandler, eventHandlerGroups,\nqueryHandlerGroups, App.events) returns zero matches in src.\n\nFull repo bun test: 756 pass / 0 fail / 1428 expect() calls.",
"is_bot": false,
"headline": "refactor(11-04): migrate remaining grouped-factory callers to singula…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T12:34:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "033bb45a5c2cd04a4d8648e9663a34e8eb42a68d",
"body": "… grouped types\n\n- registerQueryHandlersNatively now consumes flat ReadonlyArray<QueryHandlerDefinition>\n- App.queries(...handlers: QueryHandlerDefinition[]) singular varargs\n- App.events(...) method, AppState.eventHandlerGroups field, and the\n events()-to-subscribing-processor synthesis shim DELET\n[…]\nterEventHandler is GONE' negative-assertion test cases that\n referenced the legacy method name verbatim\n- Touch up the historical registerEventHandlers comment in the eventsourcing\n integration test",
"is_bot": false,
"headline": "feat(11-04): flat App.queries() varargs; delete App.events() + shim +…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T12:28:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f50247b7c81b2b14cbf31ed5f4305e6fbe299dcb",
"body": "…ypes\n\n- Remove EventHandlersDefinition + eventHandlers() factory from event-handler.ts\n- Remove QueryHandlersDefinition + queryHandlers() factory from query-handler.ts\n- Drop deleted symbols from @kronos-ts/messaging index re-exports\n- Strip 'old grouped factory survival' cases + imports from per-f\n[…]\ntory tests\n (those cases referenced the just-deleted grouped factory)\n\nOnly singular eventHandler() / queryHandler() + EventHandlerDefinition /\nQueryHandlerDefinition remain on the messaging surface.",
"is_bot": false,
"headline": "feat(11-04): delete grouped eventHandlers/queryHandlers factories + t…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T12:26:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a0992ad6cddced96f0bdff85cec79b41a203e689",
"body": "…ourses.ts\n\n- Delete configuration.ts, projections.ts, command-handlers.ts, entity.ts, messages.ts.\n- university.integration.test.ts: 3 imports collapsed into a single import from \"../domain/courses/courses.js\".\n- Domain directory now contains exactly one canonical slice file.\n- 20/20 university.integration tests green.",
"is_bot": false,
"headline": "refactor(11-03): delete 5 legacy courses files; redirect imports to c…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T12:19:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "13db0d0a80da9e5cbd1b2921c7db950debfb7bbf",
"body": "- All messages, entity, command/event handlers, projection state, and query handlers private const.\n- Public surface: configureCourses(app: App): void + getCourseViews / clearCourseViews test helpers.\n- Re-exports message descriptors / CourseEntity for integration-test inspection only.\n- Query handlers kept as transitional grouped queryHandlers({...}) — Plan 11-04 flips to singular.",
"is_bot": false,
"headline": "feat(11-03): consolidate courses slice into single courses.ts file",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T12:18:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0fbe8ea4b6b4474ffd53da75e96c3ccc3500d3c2",
"body": "…lat eventHandlers shape\n\nTask 3b — completes the framework-wide migration from grouped to flat\nhandler shape. Plan 11-02 internal contradiction resolved in favor of\nsuccess criterion #4 (bun test green) by extending Task 3b scope to\ninclude integrationtests/ (originally deferred to Plan 11-03).\n\n- \n[…]\niness in\naxon-server.integration.test.ts beforeAll bootstrap, unrelated to handler\nmigration (axon-server source untouched by this plan, verified via grep\nno handler-API references in that test file).",
"is_bot": false,
"headline": "feat(11-02): migrate core/opentelemetry tests + integrationtests to f…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T12:12:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "432eb790d57ba6c825ccdd699122e3face0bec6d",
"body": "…andlers shape\n\n- packages/core/src/app.ts: synthesized SubscribingProcessorModule from\n app.events() uses flat eventHandlers field; createTrackingEventProcessor\n + createSubscribingEventProcessor calls read proc.eventHandlers (+\n proc.onReset for tracking).\n- packages/messaging/src/__tests__/han\n[…]\n same migration; makeProjection helper rewritten as makeOnThingCreated.\n- packages/eventsourcing/src/__tests__/streaming-event-processor.test.ts:\n same migration; onReset lifted to top-level option.",
"is_bot": false,
"headline": "feat(11-02): migrate app.ts wiring + 6 framework tests to flat eventH…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:47:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d4403c68ef41237d403c9818e0cb917598a0f1f1",
"body": "- TrackingEventProcessorOptions / SubscribingEventProcessorOptions /\n StreamingEventProcessorOptions carry eventHandlers: ReadonlyArray<\n EventHandlerDefinition> instead of handlerGroups\n- Handler-map build loop flattened: single 'for (const reg of\n eventHandlers)' loop replaces nested 'for (grou\n[…]\nfor (const group of handlerGroups) group.onReset()' loop at\n tracking-event-processor.ts:330-332 and streaming-event-processor.ts:\n 325-329 replaced with a single 'if (onReset) await onReset()' call",
"is_bot": false,
"headline": "feat(11-02): consume flat eventHandlers option in 3 processor impls",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:43:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d8295a7c6a19aa687cc4fafe78a325fc191266fb",
"body": "- TrackingProcessorBuilder.eventHandlers(...handlers) varargs replaces\n registerEventHandler(group)\n- TrackingProcessorBuilder.onReset(fn) carries the reset callback that\n previously lived on EventHandlersDefinition.onReset\n- SubscribingProcessorBuilder.eventHandlers(...handlers) varargs; no\n .on\n[…]\nd to non-optional number\n- EventProcessorBase.handlerGroups replaced with flat eventHandlers:\n ReadonlyArray<EventHandlerDefinition>\n- 'register' prefix dropped (only registerEventHandler carried it)",
"is_bot": false,
"headline": "feat(11-02): refactor processor builders to flat singular-handler shape",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:41:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "345c1d5b97579d9f59f8c7afd1bf3476f9ae09cf",
"body": "- .eventHandlers(...) varargs builder on tracking + subscribing\n- .onReset(fn) on tracking builder only\n- TrackingProcessorModule.initialSegmentCount defaults to 16\n- registerEventHandler deleted from both builders",
"is_bot": false,
"headline": "test(11-02): add failing test for processor builder flat-handler shape",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:40:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "279758b2dd6ec0b185157f29be0a350702c3e8d5",
"body": "…n types\n\nAdds the four new symbols (eventHandler, queryHandler, EventHandlerDefinition, QueryHandlerDefinition) alongside the old grouped exports in @kronos-ts/messaging. Old EventHandlersDefinition/eventHandlers/QueryHandlersDefinition/queryHandlers remain exported (deletion deferred to Plan 11-04). Full repo test suite green (751/751).",
"is_bot": false,
"headline": "feat(11-01): re-export singular eventHandler/queryHandler + Definitio…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:35:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b61eb51b934a1a1ab87f33785abe45a2846d332e",
"body": "…tion\n\nAdds singular factory mirroring commandHandler structure for symmetric handler API. Result type R inferred from handler return (queries do not carry a result schema on the descriptor). Old queryHandlers({...}) grouped form preserved (deletion deferred to Plan 11-04 for green tree). New QueryHandlerDefinition.kind='query-handler' overlaps with QueryHandlerRegistration on purpose; collapse comes with grouped-form deletion.",
"is_bot": false,
"headline": "feat(11-01): add singular queryHandler() factory + QueryHandlerDefini…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:34:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8211fbd9f5deb33f000134f6e159ed7d13c79691",
"body": "RED step of TDD cycle for Task 2. Asserts queryHandler(Type, fn) returns a {kind:'query-handler', descriptor, handler} QueryHandlerDefinition with inferred result type R. Confirms grouped queryHandlers({...}) still exports (deletion deferred to Plan 11-04).",
"is_bot": false,
"headline": "test(11-01): add failing tests for singular queryHandler() factory",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:33:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab5138b089012e9c70fa16fb9704e310721b58d1",
"body": "…tion\n\nAdds singular factory mirroring commandHandler structure for symmetric handler API. Old eventHandlers({...}) grouped form preserved (deletion deferred to Plan 11-04 for green tree). New EventHandlerDefinition.kind='event-handler' overlaps with EventHandlerRegistration on purpose; collapse comes with grouped-form deletion.",
"is_bot": false,
"headline": "feat(11-01): add singular eventHandler() factory + EventHandlerDefini…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:33:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fb39e61891fd1a71dd4ca3c5885ac4b0ab32e4bc",
"body": "RED step of TDD cycle for Task 1. Asserts eventHandler(Type, fn) returns a {kind:'event-handler', descriptor, handler} EventHandlerDefinition mirroring commandHandler. Confirms grouped eventHandlers({...}) still exports (deletion deferred to Plan 11-04).",
"is_bot": false,
"headline": "test(11-01): add failing tests for singular eventHandler() factory",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-11T11:33:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc5e684fb47bf740810bd4e12e437e04c25aaf92",
"body": "…treamControl\n\n- Subscribe frame: yield { subscribe: { ... } } replacing { request: { $case, subscribe } }\n- Permits frame: controlQueue.push({ permits: { permits: BigInt(count) } }) replacing { request: { $case, permits } }\n- initialPermits: BigInt(PERMIT_BATCH) — explicit coercion for ts-proto v2.x bigint type\n- Added rationale comment at startReading() heartbeat-skip guard (KDB-03)\n- No $case token survives in the file",
"is_bot": false,
"headline": "fix(09.1-02): replace $case wire shape with flat optional fields in S…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-10T15:28:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7f0de4e29534f8c63b042604b673c547eeddfe1c",
"body": "… TopologyNotification tolerance\n\n- Hoist parseInstruction from createPlatformConnection closure to module scope\n- Export parseInstruction so tests can import it directly\n- Add __tests__/platform-service.test.ts: 2 topologyNotification cases (KDB-04), 6 known-instruction regression cases, 1 priority-order doc case\n- All 9 tests pass without a live KronosDB container",
"is_bot": false,
"headline": "test(09.1-03): export parseInstruction + add 9-case Bun unit test for…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-10T15:28:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6d7cf56fdd4e4c9a417230ab83257928b81af7ba",
"body": "- Copy upstream eventstore.proto: StreamResponse gains StreamHeartbeat as second oneof arm (field 2)\n- Copy upstream platform.proto: PlatformOutbound gains TopologyNotification at field 11\n- Copy command/common/query/snapshot.proto (no functional changes)\n- Regenerate all generated/*.ts via bun run generate-proto (ts-proto v2.11.6)\n- Generated eventstore.ts exposes heartbeat?: StreamHeartbeat on StreamResponse\n- Generated platform.ts exposes topologyNotification field on PlatformOutbound",
"is_bot": false,
"headline": "chore(09.1-01): sync kronosdb protos + regenerate TS bindings",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-10T15:24:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "14c59f10e3c6b6b5a4fddc3738c5c0d11c2c4c28",
"body": "…ronosdb\n\nResolves the slot-resolution-vs-connect-hook ordering bug introduced by\nPlan 09-03 and documented as out-of-scope by Plan 09-04. KronosDB slot\nfactories were dereferencing getConnection() at construction time, but\nAppImpl.start() resolves slots before any onStart('connect') hook runs.\n\nMir\n[…]\ned wrapper with `connected` promise +\npendingSubs replay for commandBus/queryBus, resolveConnected() at the\nend of the connect hook.\n\nCloses the regression detected by execute-phase's regression gate.",
"is_bot": false,
"headline": "fix(09): port deferred-bus + lazy-Proxy pattern from axon-server to k…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-10T13:20:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "14a45e584099a2d2f146d8d0098a74fb2c7da23a",
"body": "…rical doc references\n\n- packages/core/src/app.ts: remove imports of ConfigurationEnhancer + applyEnhancerToApp\n from the deleted legacy-enhancer-bridge module\n- Collapse App.use() dual overload to single-shape: use(extension: Extension): App (D-104)\n- Delete _builtSlots field + _resolvedSlot() met\n[…]\n kronosdb.ts, command-handling-module.ts,\n transactional-event-processing.test.ts so the repo-wide grep audit is clean\n\nVerification: core 102/102, messaging 326/326, eventsourcing 70/70 — all green.",
"is_bot": false,
"headline": "refactor(09-05): strip bridge imports, transitional fields, and histo…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-09T13:54:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "04214ec45dfa5f38673f60d10efac263c595a645",
"body": "… exports map\n\n- Remove packages/core/src/legacy-enhancer-bridge.ts (494 LOC)\n- Remove packages/core/src/__tests__/legacy-enhancer-bridge.test.ts (212 LOC)\n- Trim packages/core/package.json exports map to single '.' entry (D-94)\n- Pre-deletion grep audit confirmed only known sites referenced the bridge\n (file itself, its test, app.ts, package.json) — no surprise consumers\n- Repo intentionally left in dangling-import state for app.ts; Task 2 resolves",
"is_bot": false,
"headline": "refactor(09-05): delete legacy-enhancer-bridge file + test; trim core…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-09T13:52:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a8eda6b2a425b7f5e91aca461d8e4f9d34c9d3b1",
"body": "…reen on native extension\n\nRewrites the placeholder describe.skip into 6 testcontainers-driven\nscenarios exercising the native axonServer({...}) extension end-to-end:\n\n 1. command dispatch round-trip + sourcing the resulting event back\n 2. business-rule enforcement from event-sourced state (duplic\n[…]\ne hook to cover this.\n Structurally this is the Axon Server equivalent of kronosdb D-102:\n same withRetry({event: \"per-operation\"}) shape, adapted to the\n underlying protocol's ack semantics.",
"is_bot": false,
"headline": "test(09-04): close Phase 8 deferred — axon-server integration suite g…",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-09T13:47:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "433f5bbbc362e43a687c503b3eb9af847a65bfd3",
"body": "- New packages/extensions/axon-server/src/axon-server.ts (~870 LOC)\n exporting axonServer(serverConfig): (app: App) => void per D-95.\n Slot factories populate eventStore / snapshotStore / commandBus /\n queryBus via app.set(...) and read the canonical\n resolved.unitOfWorkFactory slot (NOT unitOfW\n[…]\nerverExtensionConfig; legacy\n axonServerConfigurationEnhancer export dropped.\n- integrationtests/src/__tests__/e2e-express-axonserver-drizzle.integration.test.ts\n rewired to .use(axonServer({...})).",
"is_bot": false,
"headline": "feat(09-04): migrate Axon Server extension to native (app: App) => void",
"author_name": "Theo Emanuelsson",
"author_login": "theoema",
"committed_at": "2026-05-09T13:19:29Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 0,
"commits_last_year": 186,
"latest_release_at": null,
"latest_release_tag": null,
"releases_from_tags": false,
"days_since_last_push": 5,
"active_weeks_last_year": 12,
"days_since_latest_release": null,
"mean_days_between_releases": null
},
"community": {
"has_readme": false,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 37,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "@kronos-ts/app",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"kronos",
"event-sourcing",
"cqrs",
"dcb",
"typescript"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@kronos-ts/app",
"is_deprecated": false,
"latest_version": "0.5.3",
"repository_url": "https://github.com/KronosDB/kronos-ts",
"versions_count": 14,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1735,
"first_published_at": "2026-05-19T20:02:24.367000Z",
"latest_published_at": "2026-07-18T03:19:31.996000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@kronos-ts/common",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"kronos",
"event-sourcing",
"cqrs",
"dcb",
"typescript"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@kronos-ts/common",
"is_deprecated": false,
"latest_version": "0.1.2",
"repository_url": "https://github.com/KronosDB/kronos-ts",
"versions_count": 3,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1026,
"first_published_at": "2026-05-19T20:02:23.858000Z",
"latest_published_at": "2026-07-18T03:19:12.917000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@kronos-ts/messaging",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"kronos",
"event-sourcing",
"cqrs",
"dcb",
"typescript"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@kronos-ts/messaging",
"is_deprecated": false,
"latest_version": "0.9.2",
"repository_url": "https://github.com/KronosDB/kronos-ts",
"versions_count": 14,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 2216,
"first_published_at": "2026-05-19T20:02:26.874000Z",
"latest_published_at": "2026-07-18T03:19:17.932000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@kronos-ts/modelling",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"kronos",
"event-sourcing",
"cqrs",
"dcb",
"typescript"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@kronos-ts/modelling",
"is_deprecated": false,
"latest_version": "0.2.10",
"repository_url": "https://github.com/KronosDB/kronos-ts",
"versions_count": 14,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 2211,
"first_published_at": "2026-05-19T20:02:26.576000Z",
"latest_published_at": "2026-07-18T03:19:22.401000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
},
{
"name": "@kronos-ts/eventsourcing",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"kronos",
"event-sourcing",
"cqrs",
"dcb",
"typescript"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@kronos-ts/eventsourcing",
"is_deprecated": false,
"latest_version": "0.3.3",
"repository_url": "https://github.com/KronosDB/kronos-ts",
"versions_count": 14,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 2219,
"first_published_at": "2026-05-19T20:02:24.074000Z",
"latest_published_at": "2026-07-18T03:19:27.282000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [
"packages/extensions/axon-server/proto/command.proto",
"packages/extensions/axon-server/proto/common.proto",
"packages/extensions/axon-server/proto/control.proto",
"packages/extensions/axon-server/proto/dcb.proto",
"packages/extensions/axon-server/proto/event.proto",
"packages/extensions/axon-server/proto/query.proto",
"packages/extensions/kronosdb/proto/command.proto",
"packages/extensions/kronosdb/proto/common.proto",
"packages/extensions/kronosdb/proto/eventstore.proto",
"packages/extensions/kronosdb/proto/platform.proto",
"packages/extensions/kronosdb/proto/query.proto",
"packages/extensions/kronosdb/proto/snapshot.proto"
],
"has_devcontainer": false,
"typecheck_configs": [
"packages/app/tsconfig.json",
"packages/common/tsconfig.json",
"packages/eventsourcing/tsconfig.json",
"packages/extensions/axon-server/tsconfig.json",
"packages/extensions/drizzle/tsconfig.json",
"packages/extensions/knex/tsconfig.json",
"packages/extensions/kronosdb/tsconfig.json",
"packages/extensions/kysely/tsconfig.json",
"packages/extensions/opentelemetry/tsconfig.json",
"packages/extensions/postgres/tsconfig.json",
"packages/extensions/prisma/tsconfig.json",
"packages/extensions/rabbitmq/tsconfig.json",
"packages/extensions/typeorm/tsconfig.json",
"packages/messaging/tsconfig.json",
"packages/modelling/tsconfig.json",
"packages/test/tsconfig.json",
"tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 49851,
"source_files_sampled": 325,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"integrationtests/package.json",
"package.json"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "@kronos-ts/common",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/app",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/messaging",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/modelling",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/eventsourcing",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/test",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/axon-server",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/kronosdb",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/postgres",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/prisma",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/drizzle",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/knex",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/kysely",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/opentelemetry",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "zod",
"manifest": "integrationtests/package.json",
"ecosystem": "npm",
"version_constraint": "^4.3.6"
},
{
"name": "@kronos-ts/common",
"manifest": "packages/app/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/messaging",
"manifest": "packages/app/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/eventsourcing",
"manifest": "packages/app/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/modelling",
"manifest": "packages/app/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "zod",
"manifest": "packages/app/package.json",
"ecosystem": "npm",
"version_constraint": "^4.3.6"
},
{
"name": "uuid",
"manifest": "packages/common/package.json",
"ecosystem": "npm",
"version_constraint": "^11"
},
{
"name": "zod",
"manifest": "packages/common/package.json",
"ecosystem": "npm",
"version_constraint": "^4.3.6"
},
{
"name": "@kronos-ts/common",
"manifest": "packages/eventsourcing/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/messaging",
"manifest": "packages/eventsourcing/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/modelling",
"manifest": "packages/eventsourcing/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "zod",
"manifest": "packages/eventsourcing/package.json",
"ecosystem": "npm",
"version_constraint": "^4.3.6"
},
{
"name": "@kronos-ts/common",
"manifest": "packages/messaging/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/eventsourcing",
"manifest": "packages/messaging/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "zod",
"manifest": "packages/messaging/package.json",
"ecosystem": "npm",
"version_constraint": "^4.3.6"
},
{
"name": "@kronos-ts/common",
"manifest": "packages/modelling/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@kronos-ts/messaging",
"manifest": "packages/modelling/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "zod",
"manifest": "packages/modelling/package.json",
"ecosystem": "npm",
"version_constraint": "^4.3.6"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 17,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "theoema",
"commits": 175,
"avatar_url": "https://avatars.githubusercontent.com/u/48862559?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml"
],
"has_docs_dir": false,
"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": 6,
"reason": "11 out of 17 merged PRs checked by a CI test -- score normalized to 6",
"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/18 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": 0,
"reason": "no 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": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"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": 0,
"reason": "49 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "c267eedd0b481b584f358bdddb50ad6762e1d235",
"ran_at": "2026-07-23T12:10:07Z",
"aggregate_score": 2.4,
"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-18T03:19:28Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-18T03:18:21Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/KronosDB/kronos-ts",
"host": "github.com",
"name": "kronos-ts",
"owner": "KronosDB"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 38,
"inputs": {
"security": 24,
"vitality": 38,
"community": 26,
"governance": 51,
"engineering": 44
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "at_risk",
"name": "Vitality",
"value": 38,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"commits_last_year": 186,
"human_commit_share": 0.89,
"days_since_last_push": 5,
"active_weeks_last_year": 12
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "12/52 weeks with commits",
"points": 8.3,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 12
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "186 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 186
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"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": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 26,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "critical",
"name": "Community health",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"has_readme": false,
"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": 0,
"status": "missed",
"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
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 66,
"inputs": {
"packages": [
"@kronos-ts/app",
"@kronos-ts/common",
"@kronos-ts/messaging",
"@kronos-ts/modelling",
"@kronos-ts/eventsourcing"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 9407
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "9,407 downloads/month across npm",
"points": 53,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 9407,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 51,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"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 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"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": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 17,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "17/17 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 17,
"decided": 17
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/18 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 37,
"inputs": {
"followers": 1,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "KronosDB",
"public_repos": 3,
"account_age_days": 104
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1 followers of KronosDB",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "KronosDB"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "3 public repos, account ~0 yr old",
"points": 5,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 3
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@kronos-ts/app",
"@kronos-ts/common",
"@kronos-ts/messaging",
"@kronos-ts/modelling",
"@kronos-ts/eventsourcing"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 5
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "5 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 5,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 5 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 5
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "14 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 14
}
}
],
"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": "at_risk",
"name": "Engineering Quality",
"value": 44,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 60,
"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": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"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": "11 out of 17 merged PRs checked by a CI test -- score normalized to 6",
"points": 12,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "critical",
"name": "Documentation",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": false,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"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": null,
"points": 0,
"status": "missed",
"details": [],
"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": "critical",
"name": "Security",
"value": 24,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"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": 24,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 2.4
},
"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": "11 out of 17 merged PRs checked by a CI test -- score normalized to 6",
"points": 1.5,
"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/18 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": "no update tool detected",
"points": 0,
"status": "missed",
"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": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"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": "49 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"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": 2
},
"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": 52,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.966,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"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": "86 of 89 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 86,
"sampled": 89
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 33,
"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": [
"packages/app/tsconfig.json",
"packages/common/tsconfig.json",
"packages/eventsourcing/tsconfig.json",
"packages/extensions/axon-server/tsconfig.json",
"packages/extensions/drizzle/tsconfig.json",
"packages/extensions/knex/tsconfig.json",
"packages/extensions/kronosdb/tsconfig.json",
"packages/extensions/kysely/tsconfig.json",
"packages/extensions/opentelemetry/tsconfig.json",
"packages/extensions/postgres/tsconfig.json",
"packages/extensions/prisma/tsconfig.json",
"packages/extensions/rabbitmq/tsconfig.json",
"packages/extensions/typeorm/tsconfig.json",
"packages/messaging/tsconfig.json",
"packages/modelling/tsconfig.json",
"packages/test/tsconfig.json",
"tsconfig.json"
],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "packages/app/tsconfig.json, packages/common/tsconfig.json, packages/eventsourcing/tsconfig.json, packages/extensions/axon-server/tsconfig.json, packages/extensions/drizzle/tsconfig.json, packages/extensions/knex/tsconfig.json, packages/extensions/kronosdb/tsconfig.json, packages/extensions/kysely/tsconfig.json, packages/extensions/opentelemetry/tsconfig.json, packages/extensions/postgres/tsconfig.json, packages/extensions/prisma/tsconfig.json, packages/extensions/rabbitmq/tsconfig.json, packages/extensions/typeorm/tsconfig.json, packages/messaging/tsconfig.json, packages/modelling/tsconfig.json, packages/test/tsconfig.json, tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "packages/app/tsconfig.json, packages/common/tsconfig.json, packages/eventsourcing/tsconfig.json, packages/extensions/axon-server/tsconfig.json, packages/extensions/drizzle/tsconfig.json, packages/extensions/knex/tsconfig.json, packages/extensions/kronosdb/tsconfig.json, packages/extensions/kysely/tsconfig.json, packages/extensions/opentelemetry/tsconfig.json, packages/extensions/postgres/tsconfig.json, packages/extensions/prisma/tsconfig.json, packages/extensions/rabbitmq/tsconfig.json, packages/extensions/typeorm/tsconfig.json, packages/messaging/tsconfig.json, packages/modelling/tsconfig.json, packages/test/tsconfig.json, tsconfig.json"
}
}
],
"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": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"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": "TypeScript",
"largest_source_bytes": 49851,
"source_files_sampled": 325,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/325 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 325,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "good",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 80,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": [
"packages/extensions/axon-server/proto/command.proto",
"packages/extensions/axon-server/proto/common.proto",
"packages/extensions/axon-server/proto/control.proto",
"packages/extensions/axon-server/proto/dcb.proto",
"packages/extensions/axon-server/proto/event.proto",
"packages/extensions/axon-server/proto/query.proto",
"packages/extensions/kronosdb/proto/command.proto",
"packages/extensions/kronosdb/proto/common.proto",
"packages/extensions/kronosdb/proto/eventstore.proto",
"packages/extensions/kronosdb/proto/platform.proto",
"packages/extensions/kronosdb/proto/query.proto",
"packages/extensions/kronosdb/proto/snapshot.proto"
]
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": "packages/extensions/axon-server/proto/command.proto, packages/extensions/axon-server/proto/common.proto, packages/extensions/axon-server/proto/control.proto, packages/extensions/axon-server/proto/dcb.proto, packages/extensions/axon-server/proto/event.proto, packages/extensions/axon-server/proto/query.proto, packages/extensions/kronosdb/proto/command.proto, packages/extensions/kronosdb/proto/common.proto, packages/extensions/kronosdb/proto/eventstore.proto, packages/extensions/kronosdb/proto/platform.proto, packages/extensions/kronosdb/proto/query.proto, packages/extensions/kronosdb/proto/snapshot.proto",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "packages/extensions/axon-server/proto/command.proto, packages/extensions/axon-server/proto/common.proto, packages/extensions/axon-server/proto/control.proto, packages/extensions/axon-server/proto/dcb.proto, packages/extensions/axon-server/proto/event.proto, packages/extensions/axon-server/proto/query.proto, packages/extensions/kronosdb/proto/command.proto, packages/extensions/kronosdb/proto/common.proto, packages/extensions/kronosdb/proto/eventstore.proto, packages/extensions/kronosdb/proto/platform.proto, packages/extensions/kronosdb/proto/query.proto, packages/extensions/kronosdb/proto/snapshot.proto"
}
}
],
"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": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"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": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index npm:@kronos-ts/app@0.5.3; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-23T12:10:19.266353Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/KronosDB/kronos-ts.svg",
"full_name": "KronosDB/kronos-ts",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}