Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-30 11:35 UTC

rdkal / nexus

Go · PythonMIT★ 0 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

rdkal/nexus tiene un índice de salud de 47 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (71/100) y la más baja, Community & Adoption (12/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

47
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.

47
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

rdkalCuenta personal
0 seguidores4 repositorios públicosdesde ene 2020

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/rdkal/nexusv0.1.8-9hace 2 días
PyPInexusapunta a otro repositorio; no se puntúa0.3.1348513hace 4204 días

Métricas por categoría

Vitalidad

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

71Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
4.8/36Cadencia de commits — 7/52 semanas con commits
18/18Volumen de commits — 162 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_year162
human_commit_share1
days_since_last_push0
active_weeks_last_year7
Cómo se puntúa
27/27Publica versiones — 9 versiones publicadas
36/36Recencia de las versiones — última versión hace 2 días
27/27Cadencia de publicación — una versión cada ~1 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count9
latest_release_tagv0.1.8
releases_from_tagsno
days_since_latest_release2
mean_days_between_releases1

Comunidad y Adopción

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

12Crí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 (MIT)
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

Sostenibilidad y Gobernanza

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

57Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
7.4/22.5Distribución de commits — el principal contribuyente firma el 67% de los commits
4.1/13.5Amplitud de contribuyentes — 3 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled3
top_contributor_share0,671
Cómo se puntúa
46.8/46.8Resolución de issues — 100% de issues cerradas
37.5/38.3Aceptación de PR — 52/53 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/12 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs52
open_issues0
closed_issues14
issue_closed_ratio1
closed_unmerged_prs1
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
0/25Alcance del propietario — 0 seguidores de rdkal
17.1/25Trayectoria — 4 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_loginrdkal
public_repos4
account_age_days2381
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 2 días
20/20Historial de versiones — 9 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/rdkal/nexus
ecosystemsgo
any_deprecatedno
min_days_since_publish2

Calidad de Ingeniería

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

54Moderado · 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
18/20OpenSSF Scorecard: CI-Tests — 10 out of 11 merged PRs checked by a CI test -- score normalized to 9
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

35En riesgo
Cómo se puntúa
0/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readmeno
has_docs_dir
has_descriptionno

Seguridad

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

30En riesgo · 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
2.2/2.5CI-Tests — 10 out of 11 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/12 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 — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3
Excluidos de la puntuación (sin datos o no aplicable): packaging. 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.

63Moderado · 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 — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 55 de los últimos 100 commits con autoría o crédito de agente
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
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,55
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/71 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes30.302
source_files_sampled71
oversized_source_files0

Datos clave

0estrellas de GitHub
3contribuidores
162commits en los últimos 12 meses
0días desde el último push
9versiones publicadas
1factor bus
0issues abiertas
Go, PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • pypi package 'nexus' points at a different repository (https://github.com/disqus/nexus); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.0 / 10
3.0agregado

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-30 11:35 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
9CI-Tests10 out of 11 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/12 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
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/spf13/cobrav1.8.1go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gomodernc.org/sqlitev1.34.5go.mod
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": 740,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 271315,
        "Shell": 9711,
        "Python": 113266
      },
      "pushed_at": "2026-07-30T10:26:36Z",
      "created_at": "2026-06-04T16:26:14Z",
      "owner_type": "User",
      "updated_at": "2026-07-30T10:27:36Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "rdkal",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/60157543?v=4",
      "created_at": "2020-01-21T20:54:51Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 2381
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-07-28T04:57:32Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-07-24T07:17:38Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-07-24T05:47:40Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-07-23T13:05:16Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-07-23T08:50:03Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-07-20T08:19:57Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-07-20T07:58:28Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-07-19T23:19:45Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-19T20:05:24Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "218249956ea3cb54c44a34fcb4caa8958dd7f229",
          "body": "Run tasks under nexus-pm with poll-and-recover across a runtime restart",
          "is_bot": false,
          "headline": "Merge pull request #67 from rdkal/tasks-under-pm",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-30T10:26:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0344d8e75400e2ba3af68c61a3cf60e9c1169038",
          "body": "The blocking /run design lost a task's exit code (and its after: cascade)\nif the runtime restarted mid-task. Replace it with a non-blocking,\nrecoverable protocol keyed by the task_runs row id:\n\n- supervisor: a task-run registry (StartRun/PollRun/AckRun) — start a\n  one-shot keyed by id, poll its sta\n[…]\nvet, tasks +\nself-update/core/stop-start e2e pass. DESIGN/TODO updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Poll-and-recover task runs so a runtime restart never loses the outcome",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-30T09:17:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1d2a9ea2ff8cfc0fd5cd048cc96e0a293e8bf1f",
          "body": "Task execution was runtime-direct: the nexus runtime shelled out to the\ntask command itself, so a runtime restart (self-update) would kill an\nin-flight task. Move execution to the process manager, matching how user\nservices already survive self-update.\n\n- supervisor: add Supervisor.RunOnce(spec) — s\n[…]\n (tasks run under nexus-pm; the pm-oneshot\nfollow-up item is now done).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Run tasks under nexus-pm so they survive a runtime restart",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-29T11:57:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8506c1a5832d6d65a13357b536f2a0c7c890b059",
          "body": "Implement v1 tasks: scheduled & triggered one-shot commands",
          "is_bot": false,
          "headline": "Merge pull request #66 from rdkal/implement-tasks",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-29T11:49:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63072a1027b9c2881badf783d81a106fa47c175c",
          "body": "Adds a second execution primitive alongside services (see DESIGN \"Tasks\").\nA task is a one-shot command triggered by a cron/@every schedule, by\nanother task's success (after:), or manually — pipelines emerge from the\nafter: edges, with no separate flow object.\n\n- config: `tasks:` (run/schedule/after\n[…]\net (incl. self-update/nested/stop-start/env) pass. DESIGN/TODO updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Implement v1 tasks: scheduled & triggered one-shot commands",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-29T11:17:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3fcaef1709621df4fc0f906745aef2e4af72e18d",
          "body": "design: tasks (scheduled & triggered)",
          "is_bot": false,
          "headline": "Merge pull request #65 from rdkal/design-tasks",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-29T10:59:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2eafede4b8c88c43f648619c919396d6889e60ed",
          "body": "Previously only root projects could be paused/resumed (nexus project\nstop/start); a nested sub-project could only be \"stopped\" by editing its\nparent's nexus.yaml (as done for retu/ingest), and there was no way to\npause a single service without touching its siblings.\n\nGeneralizes `nexus project stop/\n[…]\nly via\nthe existing notify-daemon reconcile path, no redeploy required.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VUB7X6ZhtrMFiZLMjBtZfG",
          "is_bot": false,
          "headline": "Add start/stop for nested sub-projects and individual services",
          "author_name": "rdkal",
          "author_login": "JOKAL",
          "committed_at": "2026-07-28T04:55:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b1929e01a15167520580b608c8f631892676bb72",
          "body": "Add a DESIGN.md \"Tasks (scheduled & triggered)\" section: a second\nexecution primitive alongside services — a one-shot command triggered by\na cron schedule, by another task's success (after:), or manually. There\nis deliberately no separate flow/pipeline object; a pipeline is just the\ngraph of after: \n[…]\n. TODO.md gains matching rows (v1 designed;\nextensions to be designed).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "design: tasks (scheduled & triggered) — the trigger is the primitive",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-26T18:12:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d1fb45f00b5300332acd023f07e61b8bed1e381",
          "body": "Re-spawn services skipped during recovery for cross-project env ordering (#62)",
          "is_bot": false,
          "headline": "Merge pull request #64 from rdkal/fix-recovery-env-ordering",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-24T07:13:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9bf3408965fdd3a97c73eac0719590c1ff82188",
          "body": "…ing (#62)\n\nOn daemon restart, external sub-projects recover in arbitrary order, so a\nchild whose environment: references a sibling's NEXUS_<PROJECT>_<VOLUME>\nvar (e.g. authelia → NEXUS_RETU_TRAEFIK_DYNAMIC) could recover before its\nprovider. Its env failed to resolve, flattenedSpecs silently skippe\n[…]\nbled and\npass with it. Full Go suite, go vet, and e2e pass.\n\nCloses #62\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Re-spawn services skipped during recovery for cross-project env order…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-24T07:09:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17a8ad789913a83cfc45925ea310a7768d3d00fd",
          "body": "Fix self-update: match self by transport-independent spec key (#61)",
          "is_bot": false,
          "headline": "Merge pull request #63 from rdkal/fix-isself-selfupdate",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-24T07:01:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8ead17ebb840d2fa4618830c8e9a5e66675fe6b",
          "body": "isSelf compared the project's stored specPath — the *resolved* clone URL\n(https://github.com/rdkal/nexus, git@github.com:…) written at add-time\ntransport resolution — against the bare SelfSpecPath\n(\"github.com/rdkal/nexus\"). They never matched, so d.isSelf(...) always\nreturned false, restartRuntime \n[…]\ncover\nhttps/ssh/scp/bare forms. Full Go suite and e2e pass.\n\nCloses #61\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Fix self-update: match self by transport-independent spec key (#61)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-24T06:26:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "78dd4cf014d588632efea920a8ca0c11cb69e8f5",
          "body": "Retry failed deploys with capped exponential backoff (#56)",
          "is_bot": false,
          "headline": "Merge pull request #60 from rdkal/fix-deploy-retry",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-24T05:38:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38e3f715d333b492002401c5741c4737be2dac44",
          "body": "Rebuild external sub-projects when parent-supplied config changes (#57, #58)",
          "is_bot": false,
          "headline": "Merge pull request #59 from rdkal/fix-external-env-propagation",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-24T05:38:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5399d0b785d68be88a952acdc4b3b61615b2d61",
          "body": "The poller advances its local last-seen SHA as soon as it enqueues one, so\na failed deploy's SHA was treated as \"seen\" and never retried until a new\ncommit landed. A transient failure — a flaky clone, a build dependency\nbriefly unavailable, or (the sharp case) a self-update racing the release\nworkfl\n[…]\nretry with no new commit. Full Go suite, vet, and e2e pass.\n\nCloses #56\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Retry failed deploys with capped exponential backoff (#56)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T20:05:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9599a6a5de6994b46ba6fca781af04a255ed0d60",
          "body": "…7, #58)\n\n#51 injected a parent's projects:-entry environment: into an external\nchild, but only ever at child *creation*: reconcileChildren diffed\nsub-projects by alias presence alone, so changing an override (or ref/src)\non an already-running child was silently ignored — the child kept the\nvalues i\n[…]\nue. Full Go suite, vet, and nested/env e2e pass.\n\nCloses #57\nCloses #58\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Rebuild external sub-projects when parent-supplied config changes (#5…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T19:58:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5416e7a0f9cc533fd8d66874a01cf4b9ad00f977",
          "body": "docs: add Environment variables and CLI commands sections",
          "is_bot": false,
          "headline": "Merge pull request #55 from rdkal/docs-env-cli",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-23T12:57:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "758e611e376d780401ec2180a6404fc142da821b",
          "body": "Add `nexus project stop` / `start` for maintenance pauses (#52)",
          "is_bot": false,
          "headline": "Merge pull request #54 from rdkal/project-stop-start",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-23T12:56:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da979e69dbc6c21c09db1f84818aec2904324014",
          "body": "Honor environment: on external sub-projects (composer override) (#51)",
          "is_bot": false,
          "headline": "Merge pull request #53 from rdkal/env-parent-override",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-23T12:56:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fe167590ad6a7b3cfd751322d94cbcf07dafa1f",
          "body": "Two new sections on the docs page:\n\n- Environment variables: the three levels (project-wide, per service,\n  and the composer's projects: entry), the two .env files, ${VAR} /\n  ${VAR:-default} interpolation with undefined-fails-the-deploy, the\n  cross-project NEXUS_<PROJECT>_<VOLUME> vars and the inj\n[…]\nhe running daemon live and accept --home.\n\nRegenerated docs/index.html.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: add Environment variables and CLI commands sections to the site",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T12:53:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2d32efa2c7179fb9b7c03e4c8941e8d3fd380c7d",
          "body": "`add`/`remove`/`list` were the whole project command surface; there was\nno way to take a project tree down for a maintenance window without\n`remove`-ing it (losing its registration + SHA and forcing a fresh re-add\nand rebuild afterward).\n\nAdd `project stop <name>` / `start <name>`, backed by a persi\n[…]\na\nfull daemon restart. Full Go suite, go vet, and e2e pass.\n\nCloses #52\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add `nexus project stop` / `start` for maintenance pauses (#52)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T12:43:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b8a1a7cc4508534e38efa055284dd2b6dd1e9e2",
          "body": "environment: set on a projects: entry was applied to inline sub-projects\n(via Flatten) but silently dropped for external ones — so a parent could\nnot configure a nested reusable project's secret, nor remap a\ncross-project volume variable whose NEXUS_<ADDR>_<VOL> name changes with\nnesting depth.\n\nNow\n[…]\nte, go vet,\nand all 30 e2e pass. DESIGN.md/TODO.md updated.\n\nCloses #51\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Honor environment: on external sub-projects (composer override) (#51)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T12:19:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a4e845c9c279d0b10b907655561138ec0412c88",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #50 from rdkal/env-injection",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-23T08:26:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38843826fa71a4dde9648624b872deb921a66913",
          "body": "The undefined-variable error is strict by default; these compose-style\nforms give an explicit escape hatch for genuinely optional variables:\n\n  ${VAR:-default}   default when VAR is unset OR empty\n  ${VAR-default}    default only when VAR is unset (empty stays empty)\n\nA reference carrying a default \n[…]\nFull Go suite, go vet, and all\ne2e pass. DESIGN.md and TODO.md updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add ${VAR:-default} / ${VAR-default} interpolation opt-out",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T08:20:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d56d65437ac76b9c1071787cc95f7fa82e88cf0",
          "body": "Interpolating ${VAR} used to expand an undefined variable to empty,\nsilently hiding typos and forgotten secrets. Now penv.Build returns an\nerror naming the missing variable(s) and pointing at where to set them\n(environment:, the repo .env, or $NEXUS_HOME/env/<project>.env). A\nvariable that is define\n[…]\noys and runs nothing.\nFull Go suite, go vet, and all 28 e2e tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Error on undefined environment variable references",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T08:14:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ea1f1b8b074a261b8e39edf42d4c086db1559f2",
          "body": "- Docs site: note that host secrets go in ~/.nexus/env/<project>.env,\n  alongside the existing environment:/.env mention (kept to one comment).\n- DESIGN: remove the now-moot bind: references. Cross-project volume paths\n  are solved by the NEXUS_<PROJECT>_<VOLUME> env vars, so that open\n  question an\n[…]\nl is narrowed to encryption\n  at rest (per-project env already exists).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: mention operator .env on the docs page; drop bind: from DESIGN",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T07:57:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f3526b2f398b5eb4774ebde4953dfb7f2f461d3d",
          "body": "The only .env loaded so far lived in the git worktree — committed and\nrebuilt every deploy, so no good for host-specific secrets. Add a second,\noperator-owned location that is not in git and persists across deploys:\n\n    $NEXUS_HOME/env/<project>.env\n\nIt is loaded automatically for that project and \n[…]\nt\nenv/ (like volumes/) must be backed up. Full Go suite + all e2e pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add an operator .env at $NEXUS_HOME/env/<project>.env",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T07:50:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9fc7a95537710fc810a6ef0347fc6a15281f3359",
          "body": "Previously every build/service process inherited the daemon's entire\nenvironment, so a secret set for one project was readable by every other\nproject. Now processes get only:\n\n  - an allowlist of essentials from the daemon (PATH, HOME, locale, …),\n  - the NEXUS_* contract (now including NEXUS_HOME, \n[…]\nEXUS_HOME/NEXUS_SHA). Full Go\nsuite, go vet, and all 26 e2e tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Isolate project environments: pass only allowlisted + declared vars",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T07:35:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7d7d6fc65a38359fd201f96cd7aa2d0b0949a64",
          "body": "Trim the environment section to a single compact example (showing the\ncross-project volume reference inline) plus the precedence line, and\ntighten the NEXUS_<PROJECT>_<VOLUME> note and the docs-page comment.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: simplify environment: docs in DESIGN.md and the docs site",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T07:20:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "114bf21d2ca6ddbdc18a1cca1854efcfe3f030a4",
          "body": "…#48, #49)\n\nReusable projects (Traefik/Authelia in nexus-infra) surfaced two gaps:\nno way to set per-project env, and no way for one project to reference\nanother's volume path without hardcoding it. Both are addressed with a\nsingle, compose-familiar mechanism — environment variables — rather than\na \n[…]\nw with interpolation. Full Go\nsuite, go vet, and all 25 e2e tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add docker-compose-style environment: and cross-project volume vars (…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-23T07:02:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4d95bc57799ecf982c40c1b61b98504ca7eb5a8",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #47 from rdkal/add-version-and-socket-errors",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-21T05:25:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72e37b949c1db997f071ee64420fba4f9d6f33f8",
          "body": "… paths\n\nTwo follow-ups from the v0.1.2 user test:\n\n- `nexus version` / `nexus --version`: there was no way to confirm which\n  release you'd installed or self-updated to. The release tag is now\n  injected at build time via `-ldflags \"-X main.version=<tag>\"`\n  (release.yml), with a fallback to the Go\n[…]\nersion resolution\n(injected + fallback). Full Go suite and go vet pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add `nexus version` and a clear error for over-long NEXUS_HOME socket…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T08:23:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46f0cc1ce9a59db88d8ad8a8593d53f961123e96",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #46 from rdkal/fix-install-docs",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-20T08:17:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cd2157b9ac4e5a5fd9d7584e33c2972cd2ada21",
          "body": "The documented install command was:\n\n    curl https://github.com/rdkal/nexus/raw/main/install.sh | sh\n\n`github.com/…/raw/main/…` returns a 302 to raw.githubusercontent.com.\nWithout -L, curl follows nothing and emits a 0-byte body, so `| sh`\nruns an empty script and exits 0 — the install silently doe\n[…]\n in the docs page\nsource, the generated docs/index.html, and DESIGN.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: install one-liner needs -fsSL to follow the raw redirect",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T08:11:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff9f7abdb03d93cddf4ea8e5442304398506bd73",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #45 from rdkal/fix-web-uv-build",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-20T07:51:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09102130191fb6359038cb4e3e859b553cce790c",
          "body": "The web project's nexus.yaml built with `pip install -r requirements.txt`\nand ran `python -m nexus_web`. On a server meeting nexus's stated bar\n(git + curl only), `pip` is often absent (exit 127) and `python` vs\n`python3` is ambiguous — so the flagship example failed to deploy (#44).\n\nBuild with uv \n[…]\n from git + PyPI) and\n`.venv/bin/python -m nexus_web` imports and runs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "web: build with uv so the dashboard deploys on a git+curl-only host",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T07:43:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5a59ccc14e1c583e6d22f4b70aa883d03fc628b",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #43 from rdkal/fix-onboarding",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T23:07:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23177ec5a7c8ace6da44209a7e9dd7dd52a586fc",
          "body": "…add-time errors\n\nA user test surfaced four issues (#39–#42) that made the quickstart\nunusable for a fresh install. This addresses all four:\n\n- Transport resolution (#39): scheme-less spec paths now resolve their\n  transport at `project add` time — tried as-is (honouring any git\n  `insteadOf`), then\n[…]\nts/test_live_add.py for live add/remove; full Go suite and 22 e2e pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Fix new-user onboarding: transport resolution, live reconcile, PATH, …",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T22:20:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "740574ab9b1194bc97c542060baa65204473065e",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #34 from rdkal/todo-followups",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T19:58:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e97f073d75fd8b17e8877ef623cc9f257bd3fc8",
          "body": "Records the follow-ups surfaced from the docs review, now all implemented:\n\n- Install & self-update without host Go — CI (release.yml) builds release\n  binaries; install.sh and self-update download them, prebuilt only (#36).\n- Install registers no projects — nexus project add is a separate step (#38\n[…]\ng (#35).\n\nAlso captures the Monorepo section and the Docs site section.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: track install/config follow-ups (all done)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T17:32:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a3a23dfda3fce335ad89d3d8e2798a3c8f2a8721",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #38 from rdkal/install-no-project",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T17:15:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cb0cf56ae07f1885b07c35a405c01d694018a86",
          "body": "The curl install now sets up nexus only — it no longer takes --project. Projects\nare added as a separate step with `nexus project add`, which the installer prints\nas the next step (with the web dashboard as a concrete example).\n\n- install.sh: drop --project parsing and the registration loop; a stale\n[…]\nhe\n  --project references and the \"registers each --project repo\" step.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "install: don't register projects; add them afterwards",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T17:12:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ecbe44c6c76eb54532bffad458105bed12d03ab",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #37 from rdkal/config-shorthand",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T16:48:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7486b17ffb25e86b9719a30fc855878f72246ab1",
          "body": "A projects: entry can now be a bare string \"<spec>@<ref>\" (or just \"<spec>\")\ninstead of a {src, ref} map, and refs no longer require a leading @ — the @ is\nonly a separator in the shorthand, never a standalone prefix.\n\n- config: SubProject.UnmarshalYAML accepts a scalar (external, split on '@') or\n \n[…]\nred with the shorthand.\nFull Go suite + ref/nested/subfolder e2e green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "config: projects string shorthand; drop mandatory @ ref prefix",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T16:45:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "704cd87dda7cedec55658db0927316650df2c066",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #36 from rdkal/install-prebuilt",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T16:34:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf0157774e56c0dcc234bcc0c5480ccb68cbb2fa",
          "body": "Per review: there is no source-build path. install.sh and scripts/build.sh\nalways use the prebuilt release binaries and fail with a clear message if the\nrelease is missing, rather than falling back to `go build`.\n\n- install.sh: drop NEXUS_SRC / --from-source / go install and the inside-repo\n  detect\n[…]\nast with actionable errors when no release exists,\nand never invoke go.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "install/self-update: prebuilt only, no source fallback",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T16:17:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8cc1b9a936da58645bc868df9fd67257f27b9835",
          "body": "Removes the Go toolchain as a hard requirement — for both the initial install\nand self-update. nexus uses pure-Go SQLite (modernc), so binaries cross-compile\nwith CGO_ENABLED=0 for linux/darwin × amd64/arm64.\n\n- .github/workflows/release.yml: on a v* tag, build all four platforms and\n  publish nexus\n[…]\n → download\nloop is exercised on GitHub after the first tagged release.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "install/self-update: prebuilt binaries, no Go required",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T16:08:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "138d085a66e51acc32759127c6f728cc1803f320",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #35 from rdkal/docs-code-scroll",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T15:08:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09a7f303edbd9056d89113a66503140431c3fc48",
          "body": "iris ships no <pre> styling, so the browser default (white-space: pre,\noverflow: visible) let long lines in the install / nexus.yaml blocks overflow\nthe panel and scroll the whole page sideways. Add a small override so code\nblocks stay full-width and scroll on the x-axis instead:\n\n  pre.code { margi\n[…]\nplies to all five code blocks. Implements the docs item tracked in #34.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: code blocks scroll horizontally instead of overflowing",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T14:59:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc6a3adf9aecddc7b0121d9ddf7c83c4af2f71c8",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #33 from rdkal/docs-web-ui",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T14:26:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8772fe41f4ee22961d8c4612ee32bbff0c14595",
          "body": "github.com/rdkal/nexus-web does not exist — the web UI lives in this repo\nunder web/. Correct the docs command and design accordingly, and fix the\nself-identity check that the correct command exposes.\n\n- docs: the Web UI section now uses `nexus project add\n  github.com/rdkal/nexus/web` (the subdirec\n[…]\nd the self-identity subdir rule.\n\nFull suite green: go test -race ./...\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: correct web UI add path (in-repo, not a separate repo)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T13:13:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9c09714bdbdc299007c856f9334e33dea7ef150b",
          "body": "Adds a short \"Web UI (optional)\" section explaining that the dashboard is\nitself a nexus project — you add it with `nexus project add\ngithub.com/rdkal/nexus-web`, and it runs on port 7777 against the daemon\nsocket, showing the project tree, deployment history, and per-service status\nwith live logs p\n[…]\n/restart.\n\nUpdates docs-src/build.py and the generated docs/index.html.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: add Web UI section to the site",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T13:05:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bf44dafd9704d8e9ccba8194da29e10e29e74917",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #32 from rdkal/docs-site",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T12:57:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9df3a81587e77a23ba720a16fbd357cb727a3c00",
          "body": "A super-simple docs landing page built with iris, served by GitHub Pages from\n/docs. Shows the one-line install and the nexus.yaml syntax.\n\n- docs-src/build.py renders a single self-contained index.html (inline CSS via\n  iris's light theme, no external assets) plus a .nojekyll marker into /docs.\n- d\n[…]\nb).\n\nTo publish: Settings → Pages → Deploy from a branch → main, /docs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: static GitHub Pages site (iris)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T12:07:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d97851cf338d76c2911993fd93ace90ed440355",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #31 from rdkal/implement/external-subdir",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T10:43:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e07f83699c340db15f65e02ea5c1a1d63fc538aa",
          "body": "Extends subdirectory support to nested externals: a parent's projects: entry\nwhose src points at a subdirectory of a repo (e.g. src: <repo>/db) now resolves\nthe same way root projects do. startChild walks up ext.Src with ResolveRepoRoot\nto split it into repo root + subdir and sets both on the child \n[…]\nits store service runs.\n\nFull suite green: go test -race ./..., 20 e2e.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Support subdirectory src for external sub-projects",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T10:33:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f8569070cb802a2b36f6b69f775e75cee25ad4d2",
          "body": "Support subdirectory (monorepo) spec paths",
          "is_bot": false,
          "headline": "Merge pull request #30 from rdkal/implement/subfolder",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T09:23:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0ffd86d741263b9a6308c558289f0a78a3e3d34",
          "body": "A spec path may now point at a subdirectory of a repo, so several apps can\nshare one repo and deploy independently — the Go-modules model, where the path\nidentifies the app and nexus discovers the repo boundary by walking up. With\nthe wildcard tag ref, one line adds a monorepo app tracking only its \n[…]\ning app is not started.\n\nFull suite green: go test -race ./..., 19 e2e.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Support subdirectory (monorepo) spec paths",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T08:12:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "74d7c63350a9c384c150e22db537088d5fa6c077",
          "body": "git: wildcard tag refs (@&lt;glob&gt;)",
          "is_bot": false,
          "headline": "Merge pull request #29 from rdkal/implement/ref-glob",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-19T07:51:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b59bfdeabc5f6fc3f09048e4fcb3f9095247a54",
          "body": "Adds a fourth ref form so a project can track the highest semver tag matching\na glob — e.g. @web-v* or @web/v2.* — using whatever tag scheme the user\nalready has. nexus imposes no convention; the user encodes their app's prefix\nin the pattern. This is the tag half of monorepo support: one app in a s\n[…]\nher tag (other-v9.0.0) does not redeploy it; a newer app-v*\n  tag does.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "git: wildcard tag refs (@<glob>)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-19T06:38:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2d3bdd458904d720363e95032490339e455f3944",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #28 from rdkal/implement/web-dogfood",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-18T19:35:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ab59eef1f50e88a8e4cb8448cfd7997215f8905",
          "body": "Proves the design's central claim that nexus-web is a normal nexus project,\nnot special-cased: stage the actual nexus_web package into a git repo with a\nnexus.yaml (build installs deps, service runs `python -m nexus_web` against\nthe daemon socket), `nexus project add` it, and assert nexus builds and\n[…]\nn ~20s).\n\nCloses the last web e2e row. Full suite: 19 web unit, 17 e2e.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "test: dogfood e2e — nexus deploys and runs nexus-web itself",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T19:32:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f7ad49a9dde89c139fee47df874e3254b2ec208",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #27 from rdkal/implement/build-log-route",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-18T19:19:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd4b7c97f9184c4d3a751bacda75a7722a5ab7c3",
          "body": "Surfaces build logs, the one page from the design's spec the web UI couldn't\nyet reach (there was no socket route for build output).\n\nDaemon:\n- GET /projects/<address>/builds/<sha>/log serves the build log at\n  Paths.BuildLog(address, sha), tailing the last 64 KiB. splitRoute gains a\n  \"buildlog\" ca\n[…]\nhe output.\n\nFull suite green: go test -race ./..., 19 web unit, 16 e2e.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add build-log route and web build-log page",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T19:14:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "07c85ad43c588b6af6a174954eadfa9e03ee6a2f",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #26 from rdkal/implement/web-actions",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-18T19:04:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c033ded0efce08eddf7378dfe4c9b3218a39c632",
          "body": "PR2 of the web UI. Adds write actions and a live log to nexus-web (still no\nnew daemon routes — all over the existing socket API).\n\n- POST on a page URL performs its action: POST /<address> redeploys the\n  project, POST /<address>/<service> restarts the service. The handler returns\n  an iris Banner \n[…]\nplemented + tested. Build-log surfacing still pending its socket route.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "web: redeploy/restart actions and auto-polling log tail",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T17:18:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b88946a9eb764302e25cb5b686cc214a258a1637",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #25 from rdkal/implement/web-ui",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-18T17:11:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0750ca4eedda8e2e2d09e75bce8aab64ac2d9f48",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #24 from rdkal/docs/todo-web-monorepo",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-18T17:10:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2143752916193103a20d82bcfe9f4cecf8cd07dd",
          "body": "nexus-web is the optional web UI — a normal nexus project (web/nexus.yaml:\nbuild with pip, run `python -m nexus_web`) that connects to the daemon's Unix\nsocket and serves the public HTTP interface on port 7777. The daemon never\nbinds a public port; this process is the sole HTTP interface.\n\nPackage (\n[…]\ntail, and\nbuild-log surfacing (needs a new socket route) follow in PR2.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add nexus-web: Python/iris web UI (read-only core)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T15:45:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ac89c59ec588452783ac1044693c12803aa7dc2a",
          "body": "- Expand the Web UI (Python/iris) rows to match the planned nexus-web build:\n  socket client over UDS, address-tree/path resolution, overview + project +\n  service pages, redeploy/restart actions, and build-log surfacing (noted as\n  needing a new socket route). Add the two web e2e rows.\n- Add a Mono\n[…]\n app redeploying the others. Not yet designed; captured as future work.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: refine Web UI TODO and add Monorepo support section",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T15:30:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8260808d77ea3b3f88f1c71a32976cbb439a73f0",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #23 from rdkal/implement/nested-socket-routes",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-05T12:55:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07b15fd1358841d7371229c8f007022801fb0af2",
          "body": "Project addresses (external sub-projects like \"root/db\") and inline service\nnames (like \"metrics/exporter\") contain slashes, which Go 1.22's router can\nonly capture with a trailing {rest...} wildcard. So the parametric\nsub-routes are replaced with one wildcard route per method, dispatched by\nsplitRo\n[…]\n restart).\n\nFull suite green: go test -race ./... and all 13 e2e tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Support nested addresses in the socket API",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-05T12:21:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8adc5be4fcb6801a84ebc777596176daee84a897",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #22 from rdkal/implement/inline-subprojects",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-05T12:08:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90d46e6017ea6ff7bf4c140706f6070bc12161db",
          "body": "Inline sub-projects (projects: entries without a src:) now deploy. They\nshare the parent's worktree and deploy atomically with it, rather than\ngetting their own repo, ref, and poller like external sub-projects.\n\nconfig:\n- Flatten walks a project's inline subtree, returning the inline units to\n  depl\n[…]\non — external (independent) and inline (atomic)\nsub-projects both work.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Implement inline sub-project deployment",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-05T05:44:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fd520090782d1eaddb6cd1864ca869fffe044005",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #21 from rdkal/implement/nested-projects",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-04T15:04:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ec0171d20370c53a9f5454487b78e7b6420a90e",
          "body": "Recursive project composition now works at runtime. Previously the daemon\nparsed a nexus.yaml's projects: field but ignored it — only the root\nproject deployed. Now each external sub-project (a projects: entry with a\nsrc:) is deployed as an independent project addressed <root>/<alias>.\n\nDaemon:\n- pr\n[…]\narent worktree) are the\nremaining half and are deferred to a follow-up.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Implement external nested project deployment",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T07:55:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0a58b5e047750962cc18bb4048a8a1c7c0d2016",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #20 from rdkal/implement/self-update",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-03T20:40:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0336671745338f785d64005196d15b580d376e8",
          "body": "Nexus can now update its own runtime binary without disturbing user\nservices, because nexus-pm — not nexus — owns the user service processes.\n\nSelf-update mechanism:\n- scripts/build.sh: the build step of nexus's own nexus.yaml. Rebuilds the\n  runtime from the worktree and atomically swaps $NEXUS_HOM\n[…]\nks the self-update, DB-concurrency, and idempotent-\ncheckout work done.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Implement nexus self-update",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-03T20:30:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f5cd0c31756dfd86a0d1c72c46afd2fe7b65641",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #19 from rdkal/claude/nexus-app-design-od9ac0",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-03T20:29:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06f24d75fa47dba4739e2b8552d2b00a8878e107",
          "body": "Redeploy fix (internal/lifecycle):\nPOST /projects/{name}/redeploy pushes the currently-active SHA back onto\nthe queue, so the deploy loop runs with NewSHA == PrevSHA. Three steps\nbroke in that case: CHECKOUT called `git worktree add` at a path that\nalready exists (hard error, deployment never promot\n[…]\nchctl/volume-creation and shipped e2e tests done;\ncorrects stale rows).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Fix same-SHA redeploy and add install script",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-03T17:04:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3d6ff2bc97b1cd90d0812daea69c30f5389327e8",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #18 from rdkal/implement/e2e-tests",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-07-03T15:14:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8bec303a2d18768faa04870596ece491d562816f",
          "body": "Runs pytest tests/ in a separate job after the Go job. The e2e job builds\nthe nexus and nexus-pm binaries via go build (via the built_binaries session\nfixture in conftest.py), then drives a real nexus-pm + nexus-runtime stack.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add e2e job to CI pipeline",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-03T15:08:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3da1fdad674ada3b50613f77ff161785cd4c1d1c",
          "body": "- Fix nexus-pm to create nexus-pm.sock before spawning the nexus\n  runtime, so nexus can reach the socket immediately on startup\n- Add NEXUS_POLL_INTERVAL env var to override the 30s git poll interval,\n  enabling tests to run with 2s intervals\n- Add tests/conftest.py: NexusClient (HTTP over Unix soc\n[…]\nand set\n  testpaths = [\"tests\"]\n\nAll four tests pass locally in ~30s.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "Add pytest e2e tests for the nexus daemon stack",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-27T08:20:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "959b0cfc64f699f5f39593253f3df03916ebf726",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #17 from rdkal/implement/ci",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-06-23T04:14:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e2c71051c787dcf7db9f9bf4b375ecab9199864",
          "body": "…r close\n\ncrashProc() closed exitCh directly, bypassing sync.Once. When the supervisor\nlater called Signal() during Stop(), once.Do tried to close an already-closed\nchannel → panic. Use once.Do in the constructor so the Once is marked done\nand subsequent Signal() calls are correctly treated as no-ops.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "fix: crashProc test helper panics when Signal called after constructo…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-23T03:53:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0efb12e57a5450414cfc7f19a0f1c8ac0a0b5d14",
          "body": "Runs on push and PR to main:\n- go vet ./...\n- go build ./...\n- go test -race -count=1 ./...\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "ci: add GitHub Actions workflow for Go tests",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-23T03:39:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "30fdef906e70c18de13a09a39ad594865092c660",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #16 from rdkal/implement/daemon",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-06-23T03:37:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0e42e5505dc6b5f91769c2c22b903595fd1af08",
          "body": "…s-web)\n\nReplace the nexus-launcher shell script with nexus-pm, a thin Go process manager\nthat is the sole systemd target. nexus-pm supervises the nexus runtime as a\nhardcoded service and manages user services via nexus-pm.sock. The nexus runtime\nholds no OS process handles — it delegates all Spawn/\n[…]\npervisor items;\n  drop \"skip STARTUP\" special case (no longer needed)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "design: introduce three-process architecture (nexus-pm / nexus / nexu…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-22T18:50:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5196c669e6ba335e49bf8785a2c48328c2148ad1",
          "body": "- Add Queue.WaitPop to block the deploy loop until a new SHA arrives\n- Add db.GetProject, db.Deployment, db.ListDeployments for history endpoint\n- internal/daemon: Daemon struct wires poller → deploy loop → supervisor;\n  recovers services from last known-good worktree on restart\n- internal/daemon/so\n[…]\ns: replace select{} stub with real daemon.Run wired to signal context\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "feat: implement daemon main loop and Unix socket API",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-22T14:30:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fa3fd73f9aa4ddcc6a8d56a5718e3f5579d54a7c",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #15 from rdkal/implement/lifecycle",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-06-22T14:07:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5047f8556c79ea8cf4741e8de717bb129da17670",
          "body": "Adds internal/lifecycle.Deployer orchestrating the full build-and-swap\nsequence: FETCH → CHECKOUT → BUILD → SHUTDOWN → STARTUP → VERIFY → PROMOTE\n→ CLEANUP, with ROLLBACK on verify failure.\n\nAll external I/O is injected for testability:\n  DB (DBWriter interface: SetCurrentSHA / AddDeployment / Finis\n[…]\nent history\n\n5 new lifecycle tests + 1 new DB test; 60 total passing.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "feat: implement deployment lifecycle with injected dependencies",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-22T13:40:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cbe0c6704b636f5d409b254db8415832a053aa84",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #14 from rdkal/implement/supervisor",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-06-21T14:31:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cf80861dc747c3b367ac1db7ada28c700de4395",
          "body": "Adds internal/supervisor with a clean two-interface design that lets the\nruntime be swapped without touching restart/backoff logic:\n\n  Runner.Start(ServiceSpec) Process  — create and launch a service instance\n  Process.{Wait,Signal,ID}           — observe and control a running instance\n\nOSRunner is \n[…]\nrvice becomes degraded or is stopped\n\n11 new tests; 52 total passing.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "feat: implement process supervisor with swappable Runner interface",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-21T10:54:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "500f05ac445cb8cb7d1a95aa4ae16977b93b08c9",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #13 from rdkal/implement/git-layer",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-06-21T10:41:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9d7db20b2abc97d9cab6253bdc71a2a70c29b7e",
          "body": "…t queue)\n\nAdds internal/git and internal/poller packages:\n- internal/git: EnsureBareClone, Fetch, WorktreeAdd/Remove, ResolveRef\n  (@branch tries refs/heads then refs/tags; @latest uses --sort=-version:refname)\n- internal/poller: Queue (latest-wins, thread-safe) and Poller (30s loop,\n  polls immedi\n[…]\nng (pure unit) and\ngit integration (local bare repos in t.TempDir()).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "feat: implement git layer (bare clone, ref resolution, polling, commi…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-21T08:58:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4052834eb707431bf0ac49682642fccad64f0f86",
          "body": "Adds the four core Go packages and wires them into the CLI:\n- internal/spec: Path type, ProjectName inference, ParseAddArg\n- internal/config: nexus.yaml parser (external/inline/recursive projects)\n- internal/home: NEXUS_HOME resolution, well-known paths (volumes, logs, repos, worktrees)\n- internal/d\n[…]\n6 unit tests, all passing. TODO.md updated to reflect completed work.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "feat: implement foundation packages (spec, config, home, db, CLI)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-21T08:52:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ddb15dfde282c54c6e238462774c51452a2ce922",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #12 from rdkal/claude/nexus-app-design-od9ac0",
          "author_name": "rdkal",
          "author_login": "rdkal",
          "committed_at": "2026-06-21T08:42:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af5646743ba2a39e212f6c377b1946d9c35d35bf",
          "body": "One row per deliverable across foundation, config, git layer,\ndeployment lifecycle, process supervision, volumes, state persistence,\ndaemon socket, self-update, web UI, Go unit tests, and pytest e2e.\n\nColumns: Designed / Implemented / Tested.\nnexus.db schema is the only item not yet fully designed.\n\nhttps://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: add TODO.md with full task breakdown",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-21T05:23:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a3f6229278ef2ed9826bd80ae3d57ebe61610dd",
          "body": "Architecture:\n- Go daemon owns process supervision, git polling, deployments, SQLite.\n  Never binds a public port.\n- Python/iris web UI is a nexus-managed service that connects to the\n  daemon via HTTP over a Unix socket ($NEXUS_HOME/nexus.sock) and\n  serves the public interface on port 7777.\n- nexu\n[…]\nion.\n- pytest e2e: real daemon subprocess, local file:// repos, socket-based\n  assertions. Covers full deployment flow, crash/restart behavior.\n\nhttps://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: add Implementation and Testing sections, Python UI via Unix socket",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-20T15:52:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "868e3f7e97f306638fb86f83d4d2224503718526",
          "body": "Services no longer declare dependencies — they crash-loop until their\ndependencies are available (same model as Kubernetes). This removes\ndepends_on, bind:, the entire Dependency Resolution section, the Bind\ncore concept, and startup/shutdown ordering from the lifecycle.\n\nAlso fixes the run: field d\n[…]\n paths.\n\nOpen Questions updated: depends_on noted as intentionally deferred\n(not forgotten), cross-deployment volume paths noted without bind:.\n\nhttps://claude.ai/code/session_01B82LiEWmsJVVqP145tyb2h",
          "is_bot": false,
          "headline": "docs: drop depends_on and bind:, fix run working directory",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-17T06:40:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 9,
      "commits_last_year": 162,
      "latest_release_at": "2026-07-28T04:57:32Z",
      "latest_release_tag": "v0.1.8",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 7,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 1
    },
    "community": {
      "has_readme": false,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 14,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/rdkal/nexus",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/rdkal/nexus",
          "is_deprecated": false,
          "latest_version": "v0.1.8",
          "repository_url": "https://github.com/rdkal/nexus",
          "versions_count": 9,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-28T04:55:41Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 2
        },
        {
          "name": "nexus",
          "exists": true,
          "license": "UNKNOWN",
          "keywords": [
            "Framework :: Django",
            "Intended Audience :: Developers",
            "Intended Audience :: System Administrators",
            "Operating System :: OS Independent",
            "Topic :: Software Development"
          ],
          "ecosystem": "pypi",
          "matches_repo": false,
          "registry_url": "https://pypi.org/project/nexus/",
          "is_deprecated": false,
          "latest_version": "0.3.1",
          "repository_url": "https://github.com/disqus/nexus",
          "versions_count": 13,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 3485,
          "first_published_at": "2010-12-20T22:21:54.131167Z",
          "latest_published_at": "2015-01-24T22:53:14.340567Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4204
        }
      ]
    },
    "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": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 30302,
      "source_files_sampled": 71,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "docs-src/requirements.txt",
        "go.mod",
        "pyproject.toml",
        "web/requirements-dev.txt",
        "web/requirements.txt"
      ],
      "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": [
        "go",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.1"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.34.5"
        }
      ],
      "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": 52,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 14,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "claude",
          "commits": 110,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "rdkal",
          "commits": 53,
          "avatar_url": "https://avatars.githubusercontent.com/u/60157543?v=4"
        },
        {
          "type": "User",
          "login": "JOKAL",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/2956981?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.671
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": 9,
            "reason": "10 out of 11 merged PRs checked by a CI test -- score normalized to 9",
            "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/12 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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "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": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "218249956ea3cb54c44a34fcb4caa8958dd7f229",
        "ran_at": "2026-07-30T11:35:26Z",
        "aggregate_score": 3,
        "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-30T10:32:45Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-30T10:26:36Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/rdkal/nexus",
    "host": "github.com",
    "name": "nexus",
    "owner": "rdkal"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 47,
      "inputs": {
        "security": 30,
        "vitality": 71,
        "community": 12,
        "governance": 57,
        "engineering": 54
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 71,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "commits_last_year": 162,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 7
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "7/52 weeks with commits",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "162 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 162
                    }
                  }
                ],
                "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": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 9,
              "latest_release_tag": "v0.1.8",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 12,
        "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 (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.671
            },
            "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 67% of commits",
                "points": 7.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 67
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 52,
              "open_issues": 0,
              "closed_issues": 14,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "52/53 decided PRs merged",
                "points": 37.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 52,
                      "decided": 53
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/12 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 34,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "rdkal",
              "public_repos": 4,
              "account_age_days": 2381
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of rdkal",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "rdkal"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~6 yr old",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/rdkal/nexus"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 2
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 2 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "9 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 54,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 66,
            "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": "10 out of 11 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": false,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "at_risk",
        "name": "Security",
        "value": 30,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3
            },
            "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": "10 out of 11 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "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/12 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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "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": 63,
        "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": 1,
              "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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.55,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "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": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "55 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 55,
                      "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": "Go",
              "largest_source_bytes": 30302,
              "source_files_sampled": 71,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/71 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 71,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "pypi package 'nexus' points at a different repository (https://github.com/disqus/nexus); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T11:35:41.503747Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/rdkal/nexus.svg",
  "full_name": "rdkal/nexus",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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 agregadasGo, PyPI.