Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 0 forksdesde may 2026Ver en GitHub ↗

KronosDB/kronos-ts tiene un índice de salud de 38 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (52/100) y la más baja, Security (24/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

38
global / 100
En riesgo

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

38
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

KronosOrganización
1 seguidor3 repositorios públicosdesde abr 2026

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@kronos-ts/app0.5.3173514hace 5 díaskronosevent-sourcingcqrsdcbtypescript
npm@kronos-ts/common0.1.210263hace 5 díaskronosevent-sourcingcqrsdcbtypescript
npm@kronos-ts/messaging0.9.2221614hace 5 díaskronosevent-sourcingcqrsdcbtypescript
npm@kronos-ts/modelling0.2.10221114hace 5 díaskronosevent-sourcingcqrsdcbtypescript
npm@kronos-ts/eventsourcing0.3.3221914hace 5 díaskronosevent-sourcingcqrsdcbtypescript

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

38En riesgo · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
8.3/36Cadencia de commits — 12/52 semanas con commits
18/18Volumen de commits — 186 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year186
human_commit_share0,89
days_since_last_push5
active_weeks_last_year12
Cómo se puntúa
0/27Publica versiones — sin versiones publicadas
0/36Recencia de las versiones — sin versiones
0/27Cadencia de publicación — sin versiones
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

26Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
0/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readmeno
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
53/80Descargas mensuales — 9407 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@kronos-ts/app, @kronos-ts/common, @kronos-ts/messaging, @kronos-ts/modelling, @kronos-ts/eventsourcing
dependents
ecosystemsnpm
total_downloads
monthly_downloads9407
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

51Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 17/17 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/18 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs17
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
2.2/25Alcance del propietario — 1 seguidores de KronosDB
5/25Trayectoria — 3 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers1
owner_typeOrganization
is_verified
owner_loginKronosDB
public_repos3
account_age_days104
Cómo se puntúa
25/25Publicado y resoluble — 5 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 14 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@kronos-ts/app, @kronos-ts/common, @kronos-ts/messaging, @kronos-ts/modelling, @kronos-ts/eventsourcing
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

44En riesgo · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
12/20OpenSSF Scorecard: CI-Tests — 11 out of 17 merged PRs checked by a CI test -- score normalized to 6
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

20Crítico
Cómo se puntúa
0/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readmeno
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

24Crítico · 16% del índice global
Cómo se puntúa
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.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 49 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,4
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

52Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 86 de 89 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,966
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — 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/10Entorno reproducible
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_language
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
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/325 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes49.851
source_files_sampled325
oversized_source_files0
Cómo se puntúa
40/40Esquema de API (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/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
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

Datos clave

0estrellas de GitHub
1contribuidores
186commits en los últimos 12 meses
5días desde el último push
0versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 2.4 / 10
2.4agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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/dPackagingpackaging 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/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities49 existing vulnerabilities detected
Dependencias directas 32
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.