Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 12:10 UTC

KronosDB / kronos-ts

A event sourcing framework for typescript inspired by Axon Framework 5

TypeScriptApache-2.0★ 0 stars⑂ 0 forkssince May 2026View on GitHub ↗

KronosDB/kronos-ts holds a health index of 38 out of 100, placing it in the At risk band. It scores highest on AI Readiness (52/100) and lowest on Security (24/100). It was last updated 5 days ago. A single contributor accounts for most of its recent work.

38
overall / 100
At risk

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

38
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

KronosOrganization
1 follower3 public repossince Apr 2026

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

38At risk · 22% of overall
How it's scored
36/36Push recency — last push 5 days ago
8.3/36Commit cadence — 12/52 weeks with commits
18/18Commit volume — 186 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year186
human_commit_share0.89
days_since_last_push5
active_weeks_last_year12
How it's scored
0/27Ships releases — no releases published
0/36Release recency — no releases
0/27Release cadence — no releases
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count0
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

26Critical · 18% of overall
How it's scored
0/60Stars — 0 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
0/22.5README
22.5/22.5License — recognized license (Apache-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeno
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
53/80Monthly downloads — 9,407 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packages@kronos-ts/app, @kronos-ts/common, @kronos-ts/messaging, @kronos-ts/modelling, @kronos-ts/eventsourcing
dependents
ecosystemsnpm
total_downloads
monthly_downloads9,407
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

51Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
0/46.8Issue resolution — no issues or no data
38.2/38.3PR acceptance — 17/17 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/18 approved changesets -- score normalized to 0
Inputs used
merged_prs17
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
2.2/25Owner reach — 1 followers of KronosDB
5/25Track record — 3 public repos, account ~0 yr old
Inputs used
followers1
owner_typeOrganization
is_verified
owner_loginKronosDB
public_repos3
account_age_days104
How it's scored
25/25Published & resolvable — 5 package(s) on npm
35/35Publish recency — latest publish 5 days ago
20/20Version history — 14 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packages@kronos-ts/app, @kronos-ts/common, @kronos-ts/messaging, @kronos-ts/modelling, @kronos-ts/eventsourcing
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Engineering Quality

Are baseline engineering and documentation practices in place?

44At risk · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
12/20OpenSSF Scorecard: CI-Tests — 11 out of 17 merged PRs checked by a CI test -- score normalized to 6
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

20Critical
How it's scored
0/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeno
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

24Critical · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
1.5/2.5CI-Tests — 11 out of 17 merged PRs checked by a CI test -- score normalized to 6
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/18 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 49 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2.4
Excluded from scoring (no data or not applicable): packaging, signed_releases. Remaining weights renormalized.

AI Readiness

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.

52Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 86 of 89 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.966
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — 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
0/10Reproducible environment
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configspackages/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_share0
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
55/55Manageable file sizes — 0/325 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes49,851
source_files_sampled325
oversized_source_files0
How it's scored
40/40API schema (OpenAPI/GraphQL/proto) — 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
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_filespackages/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

Key facts

0GitHub stars
1contributors
186commits, last 12 months
5days since last push
0releases
1bus factor
0open issues
npmpackage ecosystems

Data collection 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

More detail

OpenSSF Scorecard 2.4 / 10
2.4aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-23 12:10 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
6CI-Tests11 out of 17 merged PRs checked by a CI test -- score normalized to 6
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/18 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities49 existing vulnerabilities detected
Direct dependencies 32
RegistryPackageVersion constraintManifest
npm@kronos-ts/commonworkspace:*integrationtests/package.json
npm@kronos-ts/appworkspace:*integrationtests/package.json
npm@kronos-ts/messagingworkspace:*integrationtests/package.json
npm@kronos-ts/modellingworkspace:*integrationtests/package.json
npm@kronos-ts/eventsourcingworkspace:*integrationtests/package.json
npm@kronos-ts/testworkspace:*integrationtests/package.json
npm@kronos-ts/axon-serverworkspace:*integrationtests/package.json
npm@kronos-ts/kronosdbworkspace:*integrationtests/package.json
npm@kronos-ts/postgresworkspace:*integrationtests/package.json
npm@kronos-ts/prismaworkspace:*integrationtests/package.json
npm@kronos-ts/drizzleworkspace:*integrationtests/package.json
npm@kronos-ts/knexworkspace:*integrationtests/package.json
npm@kronos-ts/kyselyworkspace:*integrationtests/package.json
npm@kronos-ts/opentelemetryworkspace:*integrationtests/package.json
npmzod^4.3.6integrationtests/package.json
npm@kronos-ts/commonworkspace:*packages/app/package.json
npm@kronos-ts/messagingworkspace:*packages/app/package.json
npm@kronos-ts/eventsourcingworkspace:*packages/app/package.json
npm@kronos-ts/modellingworkspace:*packages/app/package.json
npmzod^4.3.6packages/app/package.json
npmuuid^11packages/common/package.json
npmzod^4.3.6packages/common/package.json
npm@kronos-ts/commonworkspace:*packages/eventsourcing/package.json
npm@kronos-ts/messagingworkspace:*packages/eventsourcing/package.json
npm@kronos-ts/modellingworkspace:*packages/eventsourcing/package.json
npmzod^4.3.6packages/eventsourcing/package.json
npm@kronos-ts/commonworkspace:*packages/messaging/package.json
npm@kronos-ts/eventsourcingworkspace:*packages/messaging/package.json
npmzod^4.3.6packages/messaging/package.json
npm@kronos-ts/commonworkspace:*packages/modelling/package.json
npm@kronos-ts/messagingworkspace:*packages/modelling/package.json
npmzod^4.3.6packages/modelling/package.json
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.