Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 16:15 UTC

zoyluoblue / cronova

Lightweight self-hosted workflow scheduler in a single Go binary — an open-source Airflow/Azkaban alternative. Embedded SQLite, DAGs (cron + dependencies + backfill), polyglot tasks (shell/Python/SQL/JAR/HTTP), web console, REST API, and a built-in MCP server for AI agents. Linux & macOS.

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

zoyluoblue/cronova tiene un índice de salud de 43 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (80/100) y la más baja, Sustainability & Governance (16/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

43
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

ZoyLuoCuenta personal
23 seguidores16 repositorios públicosdesde ene 2026

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.

Métricas por categoría

Vitalidad

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

68Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
2.1/36Cadencia de commits — 3/52 semanas con commits
15.6/18Volumen de commits — 54 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_year54
human_commit_share1
days_since_last_push6
active_weeks_last_year3
Cómo se puntúa
27/27Publica versiones — 8 versiones publicadas
36/36Recencia de las versiones — última versión hace 13 días
27/27Cadencia de publicación — una versión cada ~0,7 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count8
latest_release_tagv0.5.0
releases_from_tagsno
days_since_latest_release13
mean_days_between_releases0,7

Comunidad y Adopción

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

24Crí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
22.5/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_readme
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?

16Crítico · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — 0/1 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
9.9/25Alcance del propietario — 23 seguidores de zoyluoblue
10.1/25Trayectoria — 16 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers23
owner_typeUser
is_verified
owner_loginzoyluoblue
public_repos16
account_age_days200
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.

Calidad de Ingeniería

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

70Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

85Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 20 topics
10/10Wiki
Datos de entrada utilizados
topicsai-agents, airflow-alternative, automation, cron, dag, data-engineering, data-pipeline, devops, etl, go, golang, job-scheduler, mcp, orchestration, scheduler, self-hosted, sqlite, task-scheduler, workflow-orchestration, workflow-scheduler
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

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

37En 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
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
5/5Fuzzing — project is 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
4/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 8
0/5SAST — no SAST tool detected
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
0/7.5Vulnerabilities — 10 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,7
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, 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.

80Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — docs/AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 54 de 54 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesdocs/AGENTS.md
agent_instruction_max_bytes4645
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
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 — 52 de los últimos 54 commits con autoría o crédito de agente
5/8Mantenimiento automatizado — automatización de dependencias configurada, no observada en los commits muestreados
8/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 8
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,963
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
53/55Tamaños de archivo manejables — 4/110 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes1.097.271
source_files_sampled110
oversized_source_files4
Cómo se puntúa
40/40Esquema de API (OpenAPI/GraphQL/proto) — proto/cronova/executor/v1/executor.proto
0/20Servidor MCP
0/40Ejemplos ejecutables
Datos de entrada utilizados
example_dirs
has_mcp_signalno
api_schema_filesproto/cronova/executor/v1/executor.proto

Datos clave

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

Advertencias de recopilación de datos

  • Could not fetch go package 'github.com/zoyluo/cronova' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.7 / 10
3.7agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-23 16:15 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
8Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 8
0SASTno SAST tool detected
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
0Vulnerabilities10 existing vulnerabilities detected
Dependencias directas 5
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/robfig/cron/v3v3.0.1go.mod
Gogoogle.golang.org/grpcv1.81.1go.mod
Gogoogle.golang.org/protobufv1.36.11go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gomodernc.org/sqlitev1.53.0go.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": [
        "ai-agents",
        "airflow-alternative",
        "automation",
        "cron",
        "dag",
        "data-engineering",
        "data-pipeline",
        "devops",
        "etl",
        "go",
        "golang",
        "job-scheduler",
        "mcp",
        "orchestration",
        "scheduler",
        "self-hosted",
        "sqlite",
        "task-scheduler",
        "workflow-orchestration",
        "workflow-scheduler"
      ],
      "is_fork": false,
      "size_kb": 4679,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 786976,
        "CSS": 53612,
        "HTML": 3554,
        "Shell": 21356,
        "Makefile": 2805,
        "JavaScript": 216267
      },
      "pushed_at": "2026-07-17T09:44:41Z",
      "created_at": "2026-06-24T07:17:58Z",
      "owner_type": "User",
      "updated_at": "2026-07-10T08:39:34Z",
      "description": "Lightweight self-hosted workflow scheduler in a single Go binary — an open-source Airflow/Azkaban alternative. Embedded SQLite, DAGs (cron + dependencies + backfill), polyglot tasks (shell/Python/SQL/JAR/HTTP), web console, REST API, and a built-in MCP server for AI agents. Linux & macOS.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "https://www.zoytown.com",
      "name": "ZoyLuo",
      "type": "User",
      "login": "zoyluoblue",
      "company": null,
      "location": null,
      "followers": 23,
      "avatar_url": "https://avatars.githubusercontent.com/u/252904981?v=4",
      "created_at": "2026-01-04T15:48:28Z",
      "is_verified": null,
      "public_repos": 16,
      "account_age_days": 200
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-10T08:44:45Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-09T13:21:02Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-09T08:37:58Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-07-07T11:51:17Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-07T10:16:29Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-07-05T16:12:50Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-07-05T09:37:44Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-05T05:49:40Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8e982e4a6761781da244b8f3c25468527d6ae6a4",
          "body": null,
          "is_bot": false,
          "headline": "feat: harden scheduling and release operations",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-10T08:39:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e73d63538495559b1063395c6385d62be340fdc",
          "body": null,
          "is_bot": false,
          "headline": "feat: harden runtime security boundaries",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-10T02:48:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3e9f388912adce6c2d28e79c82b024a4423a0f3",
          "body": "…recovery races\n\nAdversarial-review round (4 verification passes, independent skeptics each round):\n\n- state machine: timed_out/cancelled now count as task failure in\n  EvalTriggerRule and run finalize, so a downstream is decisively blocked and a\n  run never wedges in `running` after a partial retry\n[…]\nBearer-token clients exempt).\n\nRegenerated executor proto (repeated redact). Full `go test -race ./...` green;\nadded guard tests for every fix.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: harden state-machine, secret log redaction, pause consistency & …",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-09T13:13:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6dbe2602a359bcdd9cf0b905080f5702e1d6a3b1",
          "body": "…its & more\n\nAn eight-feature hardening batch, adversarially reviewed (31 agents, 23\nconfirmed findings — all fixed here) with new guard tests for every fix.\n\nFeatures:\n- retention: finished runs + their log dirs are pruned after 90 days by\n  default (-retention / CRONOVA_RETENTION / retention:, 0 =\n[…]\nd scheduling); a test CI workflow runs\ngofmt+vet+race on every push/PR; internal/api test coverage 66% → 88.6%;\ndocs updated throughout (EN+zh).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: retention, backfill, exponential backoff, encryption, login lim…",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-09T08:30:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a775d96852ce0d38ac66329935ff531d5fb9234",
          "body": "Address the two biggest gaps in the docs — the web UI and the CLI — both written\nfrom the actual source, in English + Simplified Chinese.\n\n- docs/console/: a six-page Console guide (overview, dashboard & creating DAGs,\n  working with a DAG, the visual task editor, runs/logs/recovery, and\n  graph/poo\n[…]\nutput and command sources.\n- Cross-links from the site home, README (EN/zh), and docs index; zh mirror of\n  every new page. Strict build clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: full Web Console guide + complete per-command CLI reference",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T17:10:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4ffa7db6707ae44f89e868ffd259b30a9056d7c",
          "body": "setup-python cache: pip looked for requirements.txt/pyproject.toml and failed the\nbuild; pin cache-dependency-path to our actual deps file.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(docs): point pip cache at requirements-docs.txt",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T16:22:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "93eaae6ed456682e3fa6cc67b399a265e2b6a3ba",
          "body": "Publish the docs as a Material for MkDocs site at\nhttps://zoyluoblue.github.io/cronova/ , auto-deployed by GitHub Actions on push\nto main. Same docs/*.md that render on GitHub — one source of truth.\n\n- An 11-chapter progressive tutorial (install → first DAG → scheduling → deps &\n  trigger rules → te\n[…]\neference-page links to repo-root files (README, dags/) rewritten to absolute\n  GitHub URLs so they resolve both on GitHub and on the docs site.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: MkDocs documentation site on GitHub Pages (FastAPI-style tutorial)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T16:20:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b3f5bc2198055d6264b3e22aa8e61336784725d",
          "body": "… report\n\n- README.md / README.zh-CN.md: a stars badge plus a top and a footer star CTA.\n- remove the tracked design-qa.md working report (superseded scratch doc).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add GitHub star call-to-action to READMEs; drop stale design-qa…",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T14:24:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d949f06fc1adf7b0622a6dce9d4417d71458d194",
          "body": "Rework the project front page and documentation for discoverability and clarity.\n\n- README.md: a polished, keyword-rich English landing page positioned on four\n  angles (lightweight Airflow/Azkaban alternative, single self-hosted binary,\n  AI-native/MCP, polyglot tasks + project upload), with a \"Wha\n[…]\n language deep-linkable (and\n  shareable), on top of the saved preference.\n\nRepo description and topics were set separately via the GitHub API.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: bilingual SEO README, in-repo docs site, screenshots, MIT license",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T14:11:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cd1447da8b0b8c1bb6ac409087dc75e1f163409b",
          "body": "The task command box is now a contenteditable token editor instead of a plain\ntextarea: every {{ dotted.name }} renders as an atomic, color-coded \"pill\" and a\ngrouped palette (built-in / variables / connections / params) inserts variables\nby click, keyboard, or drag — no need to type the {{ }} synta\n[…]\nS() honors CRONOVA_WEB_DIR to serve console assets from disk (hot\nreload, no rebuild); added a cronova-dev launch config and web FS unit tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): visual variable pill editor with click/drag palette",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T13:15:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a21e6fcca9722a37972b8f19e7715d37dba70595",
          "body": "`cronova update -proxy http://127.0.0.1:7890` (or socks5://…) routes the release\ndownload through a proxy — a bare host:port defaults to an http proxy. Also\nhonors CRONOVA_UPDATE_PROXY and the standard HTTPS_PROXY / HTTP_PROXY / ALL_PROXY\nenv vars, which now survive the automatic sudo escalation (en\n[…]\noxy-URL normalization, transport wiring, and an end-to-end forward proxy\nthat asserts the download actually routes through it. Docs: DEPLOY.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(update): route the download through a proxy (-proxy / *_PROXY)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T11:48:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22761e52bfd4389424ccd82991c815dadfcd51b1",
          "body": "From an honest cross-cutting audit, fixed and then verified end to end on real\nmacOS and a real Linux/systemd container:\n\n- update now refreshes the service definition (plist / systemd unit) from the\n  release, not just the binary — a binary-only swap pinned the host to its\n  bootstrap-era plist for\n[…]\nt/stop/restart → auto-sudo escalation → uninstall --purge), and a\nlive-service `cronova update` that swapped the binary AND refreshed the unit.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: harden update / executor / validate (stability-audit findings)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T10:09:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7bfbed3d41fc514374319fb1e7e8fa3931b103f",
          "body": "Let an AI agent drive cronova through the SAME token-authenticated, role-gated\nREST API a browser uses (viewer=read, admin=write) — two front ends over one\nshared client. Tokens are minted locally, never via the API/MCP, so an agent\ncan't self-escalate.\n\n- internal/client: typed REST client (Call: {\n[…]\nwn, client response cap, remote `pools set` query-vs-body, blank-line\nhandling). Security review: CLEAN. Tests: internal/client + internal/mcp.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: AI integration — MCP server + remote/JSON CLI over the REST API",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T05:37:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aed7aee3b26a579e7e356c23a90b3d6ab08be838",
          "body": "Two features from this session, interleaved through cmd/cronova and docs, so\nthey land in one build-clean commit.\n\nProject upload — attach an uploaded project to a shell task:\n- Upload a script / whole folder / zip / inline snippet in the console (task\n  editor -> Project). The scheduler stages a fr\n[…]\nworkspace deletion, drag-drop nesting, GC keep-set,\nchecksum/rollback, project round-trip). Docs: README, docs/DEPLOY.md,\ncronova.yaml.example.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: per-task project upload + self-managing CLI (update/uninstall)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-07T03:34:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c6b27864bdb3638e78bb69b22c81040739723681",
          "body": "The tmp/*.png design-QA screenshots were accidentally committed in 5c6f6e9\n(git add -A swept the untracked scratch dir). Untrack them and ignore /tmp/\nso working-tree screenshots don't get committed again. The blobs remain in\nhistory (removing them would require a rewrite + force-push).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: stop tracking scratch screenshots; gitignore /tmp/",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-05T16:04:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c6f6e96e91623dcea18d52a0215df04d87a21ab",
          "body": "Add service-control subcommands so operators don't have to remember the\nplatform-specific systemctl/launchctl incantations:\n\n- Linux  -> systemctl start|stop|restart cronova, systemctl --no-pager status\n- macOS  -> launchctl bootstrap/bootout/kickstart against system/com.cronova\n\nstart (re)starts an\n[…]\n status is\nread-only (sudo only on macOS, which launchd's system domain requires).\n\nREADME + docs/DEPLOY.md: \"Controlling the service\" section.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): cronova start/stop/restart/status wrap the OS service manager",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-05T15:57:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "47cdf774e2dc20aac8f0f9036d79245ffae9645b",
          "body": "…ettable config\n\nExtend the single `curl | sudo bash` installer to macOS alongside Linux, and let\na non-interactive install preset server config via env.\n\n- bootstrap.sh detects OS+arch and dispatches to the platform installer\n  (install.sh / install-macos.sh); portable SHA256 check (sha256sum|shasu\n[…]\nnstead of silently re-enabling it. Unit-tested.\n- README + docs/DEPLOY.md: macOS section, platform-layout table, config-preset\n  env reference.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(deploy): cross-platform one-click install (macOS launchd) + pres…",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-05T09:34:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a61c8ebf6fd2661ecc423f2dd9e3344b8c2c6d3",
          "body": "…k mode\n\nRedoc's standalone bundle ships a light theme only (black text). The /docs\npage declared no background, so under a dark-mode OS/browser the transparent\nbody revealed the UA's dark canvas and the black text became unreadable.\nPin html/body to a white background with color-scheme:light.\n\nFound during live verification (emulated prefers-color-scheme: dark).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): force light surface on /docs so Redoc stays legible in dar…",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-05T08:09:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "808811d66a1a1f2a2e1160744af3ff8f5b66bc22",
          "body": "Add a `cronova init` wizard that walks through port, bind scope, admin\naccount and auth (each with an Enter-to-accept default), writing a\ncommented cronova.yaml plus a 0600 cronova.env holding the seed admin.\nNon-interactive (-yes / no TTY) falls back to defaults + CRONOVA_* env\nand generates a strong admin password. Wire it into install.sh and the\ndeploy docs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: interactive first-time setup via `cronova init`",
          "author_name": "zoyluo",
          "author_login": "zoyluoblue",
          "committed_at": "2026-07-05T06:44:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb9e3cf488535a3a38d7e88450bc5ea96121d980",
          "body": "…nstall\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): add release/platform/go badges and top-level one-line i…",
          "author_name": "zoyluo",
          "author_login": "zoyluoblue",
          "committed_at": "2026-07-05T05:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "82374a0f81b227c485645c13c45ed30eedb744a9",
          "body": "Prebuilt static binaries are published to GitHub Releases by a tag-triggered\nActions workflow, and a remote bootstrap script installs them with zero build\ntools on the target — the true \"one-click\" path for other people.\n\n- .github/workflows/release.yml: on tag v*, cross-compile static linux\n  amd64\n[…]\ncksum OK -> install -> systemd autostart -> login with the\ngenerated password -> shell + python tasks succeed as the cronova user.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(deploy): one-click install via curl|bash + GitHub Releases",
          "author_name": "zoyluo",
          "author_login": "zoyluoblue",
          "committed_at": "2026-07-05T05:47:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f2b25e532b73927ede3bf4fe41b699d2b665625",
          "body": "cronova is a scheduler that runs tasks as host subprocesses (Azkaban-style),\nso containerising it either bloats the image with every runtime or cuts tasks\noff from the host's interpreters. The distroless image had no /bin/sh at all,\nso no task of any type could execute. Pivot to native + systemd.\n\n-\n[…]\n enable --now, auth login via\ncronova.env, shell + python tasks run to success under the cronova user using\nthe host's sh/python3.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(deploy): native systemd deployment; drop Docker",
          "author_name": "zoyluo",
          "author_login": "zoyluoblue",
          "committed_at": "2026-07-05T05:22:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11184a5f7dfb1112e2fb4278b54a1c1798f5cca1",
          "body": "Expose the full HTTP API for programmatic integration:\n\n- OpenAPI 3 spec at /openapi.json, generated from a single endpoint\n  catalog so docs can't drift from routes. Per-endpoint code samples\n  (curl/Go/Python/Java) auto-generated into x-codeSamples.\n- Embedded Redoc reference UI at /docs (offline \n[…]\n\n.POST(HttpRequest.BodyPublishers.noBody()) instead of a non-compiling\nbare .POST (caught by adversarial review); guarded by a regression test.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: public API — OpenAPI 3 docs, Redoc /docs, and Bearer API tokens",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-05T04:06:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d878bd6df69880383d7cba22d6709df57e292bb",
          "body": "Add two complementary observability surfaces.\n\n/metrics — a Prometheus text-format endpoint on an unauthenticated non-/api/ path\n(like /healthz, which scrapers expect). All values are derived from the store at\nscrape time (no in-process counters → no drift, survives restarts): cronova_up,\nuptime, da\n[…]\nil. End-to-end\nverified: unauthenticated /metrics format, audit recording incl. create/delete/\nrevive, and the audit view + language re-render.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: observability — Prometheus /metrics + operations audit log",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-04T05:44:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "13b9b3b90ba8c3134e65b93c29645f8951590aba",
          "body": "Extend typed operators (after http) with native `sql` and `python` task types,\nrun the same way — via a `cronova run-op <type>` subprocess that reuses the\nexecutor's launch/probe/cancel/timeout/log path, with the resolved spec passed in\nCRONOVA_OP_SPEC (never in the shell string).\n\n- type: python — \n[…]\nented-SELECT), parser (sql needs conn, python parse). End-to-end verified\n(python + chained sql CREATE/INSERT/SELECT over a sqlite connection).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: SQL and Python typed operators",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-04T04:48:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2bad0a7ef0c2d94fc3621d8e2edb543c52ece2d",
          "body": "Add the first typed operator so a task can make a native HTTP request instead of\nshelling out. A task with `type: http` carries an `http:` block (method, url,\nheaders, body, expected_status) whose url/header/body values support the usual\n{{ var. }} / {{ conn. }} templates (resolved server-side at di\n[…]\neduler (resolveHTTPSpec templating). Known limit:\nopBinary = os.Executable(), so a remote gRPC-executor host needs the binary at\nthe same path.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: HTTP typed operator (type: http tasks)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-04T03:53:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "579770f804a035ff3411392a8441c0f259eeeb28",
          "body": "Close the observability gap where a hung or overrunning run was silent\n(alerting only fired on terminal states). Deadlines are measured from run start:\n\n- Run SLA (soft): a run past `sla` seconds fires one sla_miss alert and keeps\n  running. Task SLA: a still-pending task past its `sla` fires one ta\n[…]\n timeout\nalerts with empty notify_on, run/task SLA fire once, retry a timed_out run, retry\ngets a fresh deadline window). All pass under -race.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: run/task SLA + dagrun_timeout (deadline enforcement)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-04T02:34:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb42a15ed15ef75d21110c9c98ffa57a2d008da3",
          "body": "Add operator overrides to the run page, complementing cancel + retry:\n- MarkTask(success/failed/skipped): forces a task's terminal state, killing a\n  still-running process first. Marking to a non-blocking state (success/skipped)\n  releases downstream tasks that were upstream_failed and re-drives the\n[…]\ntify-suppress, bad-state) + a concurrency stress test hammering mark/retry\nagainst the live tick loop asserting no wedge. All pass under -race.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: manually mark task/run state (operations console)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-03T16:07:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0a2ea4fc2a1cf56cb5015d31841056312915808f",
          "body": "Add outbound webhook alerting (the #1 gap vs Airflow/Azkaban): a per-DAG\nnotify_url + notify_on ([failure]/[success]) stored in the DAG YAML (parsed,\nnot a DB column — same pattern as trigger_after). When a run finalizes in a\nselected state, the scheduler POSTs an honest JSON payload asynchronously\n\n[…]\nrect, log-no-leak).\nAll pass under -race.\n\nAlso fix stale \"bcrypt\" comments (auth is PBKDF2-HMAC-SHA256) in schema.sql,\nmodel.go, and store.go.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: per-DAG webhook notifications on run success/failure",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-03T10:56:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d431b8bb262db6eaeb074ca623dff90b8ca81df7",
          "body": "- [high] Click-to-copy is dead on any non-localhost HTTP origin (navigator.clipboard\n  is undefined in insecure contexts, and the console serves plain HTTP). Add a\n  copyText() helper with a hidden-textarea + execCommand fallback; route both the\n  new copy handler and the existing YAML copy through \n[…]\n/↓ and clears on Esc; #dh-stats patch container present; inline retry\nbutton disabled on first click. go build + gofmt clean; no console errors.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(console): resolve 7 findings from the convenience-pass review",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-03T08:43:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "99128599b1f618946c11fb4ded255c82378c8df2",
          "body": "…inline ops\n\nFour ergonomics upgrades to the existing console (no new backend):\n\n- Click-to-copy: run ids, DAG names, logical dates, and task commands are\n  click-to-copy (copySpan + a delegated capture-phase [data-copy] handler with a\n  toast; keyboard-activatable, stopPropagation so a copyable ins\n[…]\n 排队→成功 with no refresh and poll self-stop; inline cancel on\nactive, inline retry re-runs a failed run. gofmt + go test clean; no console errors.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): interaction-convenience pass — copy, jump, live runs, …",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-03T07:30:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9afca2003fee69f9a474ee1ccdc79603f924424",
          "body": "Adversarial review found real concurrency/correctness bugs (5 high). Fixes:\n\nConcurrency (high) — the root cause was a blind UPDATE-by-id with no CAS, letting\na polling goroutine clobber a concurrent cancel/retry:\n- Add store.UpdateTaskInstanceGuarded — an optimistic CAS (WHERE id=? AND\n  executor_r\n[…]\nt finished first as success, cancel→retry→fresh success, retry 409 on active\nrun, ↻ confirm dialog, focus-preserving actions. No console errors.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scheduler): resolve 14 findings from the cancel/retry review",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-03T04:29:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "94c8cf23a224e442276abb27fa50605aa20be915",
          "body": "The run page was read-only; you could watch a run but not act on it. Now it is\nan operations surface.\n\nCancel:\n- New honest terminal state `cancelled` (run + task) — distinct from a failure,\n  with its own label, badge, graph/Gantt/activity color. CancelRun marks the run\n  cancelled FIRST, then kill\n[…]\nw transitions. go test -race + gofmt clean. Verified live:\ncancel mid-run → all cancelled; retry → fresh success; per-task ↻; no console errors.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: cancel a running run + retry failed tasks (run page → operations)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-03T04:08:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "98eb2b43e0321b4dc814ef063b4e4c6e4303e973",
          "body": "Adversarial review (security dimension clean — password masking / write-only /\nonly-referenced-secrets all verified sound). Fixes:\n\n- [medium] conn.ID.extra.KEY silently failed when the connection's extra JSON\n  held any non-string value: unmarshalling into map[string]string poisoned the\n  whole obj\n[…]\nbreadcrump label, lang re-render, sibling-row edit preserved;\nconnField mixed-type unit test; go build + gofmt + tests clean; no console errors.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve 5 findings from the vars/connections review",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-03T03:10:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ecf43e21ab02fe7917415a777dd9147d9c5ec879",
          "body": "A scheduler needs shared config and per-run inputs without hardcoding them into\ncommands. This adds both, managed entirely in the console (0-code), and extends\nthe template engine to resolve them at execution.\n\nBackend:\n- Tables variables(key,value) and connections(id,type,host,port,login,password,\n\n[…]\nndo host=dbhost pw=<secret> who=earth; params recorded on the run; API\nnever leaks the password. go test -race + gofmt clean; no console errors.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: UI-managed variables & connections + parameterized trigger",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-03T02:59:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc40701e837488c911faec05fb480b41768a4a98",
          "body": "Adversarial review of the hero+tabs+click-to-edit restructure (2 verify\nlanes hit the spend limit; every confirmed finding addressed):\n\nCorrectness / data-loss (medium):\n- Back-button trap: tab-hash canonicalization now uses history.replaceState\n  (setHash replace mode) instead of pushing, so Back l\n[…]\neshes post-trigger, SCHED rebinds after the\nmodal detour, cron popover unclipped, settings tab renders clean. No console\nerrors; go build green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(console): resolve 12 findings from the DAG-page IA review",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T17:16:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2e5e20989e4e73defcac68d8fd4d2dac0f2ab349",
          "body": "…tings\n\nAddresses the density/focus complaint: the DAG page flattened seven co-equal\nsections (bare setting inputs in the prime spot, run history buried at the\nbottom) onto one scroll, and the New-DAG modal asked four questions at once.\n\n- Hero card: name + type + paused tag + savestate, three hones\n[…]\no appends the queued run,\nsimplified modal fold, dark+light, no console errors. DESIGN.md documents the\nhero+tabs and click-to-edit conventions.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): DAG page IA redesign — hero + tabs + click-to-edit set…",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T16:47:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "237753f8e302010a3de3a8702e43535a1e3c83c5",
          "body": "Adversarial security review finding (low): /api/info was in the public\nallowlist, so an unauthenticated client could read the configured executor\ntarget, tick, and timezone once auth was enabled. The pre-auth flow never needs\nit — the login decision keys off /api/me's 401, and loadInfo() runs only i\n[…]\nat. Drop /api/info from\nthe public paths; only /api/login and the health probes stay public. Test now\nasserts /api/info → 401 without a session.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auth): require a session for /api/info when auth is enabled",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T16:16:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c64df8d32ba1e3027fb24b4b232fbf77b412601f",
          "body": "…ness)\n\n- Dockerfile: multi-stage, pure-Go static build (CGO disabled — modernc sqlite)\n  into a distroless/static runtime. Self-contained HEALTHCHECK via a new\n  `cronova healthcheck` subcommand (probes /readyz) so a shell-less image still\n  reports health.\n- docker-compose.yml: persists data/ + lo\n[…]\nbox), but the binary, the\nhealthcheck subcommand (exit 0 ready / 1 down), and the compose YAML are all\nverified. go build + go test ./... green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(deploy): Dockerfile + compose + config example (production readi…",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T16:09:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9fffd87991450aca4eb8b78dde731ee90e06cfbf",
          "body": "Completes the multi-user auth loop on the frontend:\n- Boot gates on GET /api/me: 200 → start app; 401 → full-screen login overlay\n  (#login-root). startApp() runs only after a successful POST /api/login.\n- When auth is disabled the server returns an implicit admin (auth:false), so\n  the console open\n[…]\nord → error; viewer → role chip, hidden CTA, write blocked 403;\nauth-disabled → boots straight to the dashboard. No console errors; gofmt clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): login screen + user chip + role-aware UI (auth frontend)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T16:06:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8accf8f2af19c87d0b4582f6bc2aa91505f244fe",
          "body": "Production-readiness groundwork (auth is opt-in; default off keeps the local\ndev flow unchanged). Console login UI (frontend) lands next.\n\nAuth:\n- users + sessions tables; model.User/Session/Role (admin|viewer).\n- internal/auth: PBKDF2-HMAC-SHA256 password hashing (stdlib crypto/pbkdf2,\n  Go 1.24+ —\n[…]\nnd-to-end via the built binary: users CLI, then serve -auth with the\nfull login→authed→logout→revoked curl flow. go build + go test ./... green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(auth): multi-user login backend + YAML config + health probes",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T15:56:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18fd2485530366c1f1d836e13f1491c9604304aa",
          "body": "…line\n\nExtend GET /api/overview with per-run timing and power two dashboard views:\n- Sparklines now HONESTLY encode real run duration as bar height, scaled\n  against a dashboard-wide max so \"taller = slower\" reads consistently across\n  DAG rows. No-run/skipped stay short stubs; running/queued get a \n[…]\nct newest-first ordering against real data, cluster separation,\nduration heights across DAGs, tick click→run, both themes; gofmt/vet/race clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): dashboard duration-trend sparklines + recent-runs time…",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T15:02:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b3beaf6ec98c7c47efd80cd86c7044d3c8c3338",
          "body": "Every renderGraph surface (editable builder, global dependency, live run)\nis now pannable and zoomable via a CSS transform on the inner <svg> — vectors\nstay crisp, node click handlers and live run-graph rect-fill patching are\nuntouched. Drag to pan; Ctrl/⌘+wheel to zoom (plain wheel still scrolls th\n[…]\nd), persist-across-re-render, latch fix, and that pure node clicks\nstill connect while drags suppress. No console errors; gofmt/vet/build clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): graph pan/zoom/fit across all three graph surfaces",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T14:38:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a959fb5e31871c435150fd04cb8cbe2b8d247bed",
          "body": "Run detail now updates in place while a run is queued/running:\n- showRun renders a static shell; a self-terminating 2s poll patches only\n  the leaf containers (badge, duration, \"N/M · K running\" progress) and the\n  graph node fills, so nodes light up with the CSS fill transition and the\n  running no\n[…]\nrowser (nodes lighting up,\nparallel transform/validate, terminal toast, poll stop on nav-away) across\ndark/light; gofmt/vet/go test -race clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): live run view + honest Gantt timeline",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T14:03:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca2a9981beae1c23331e5da92645906ad9df0f67",
          "body": "…cates, guided start\n\n- Plain-language schedule summary + server-computed next-3-fires under the\n  schedule editor (350ms debounce, stale-response + expression-snapshot guards,\n  honest error state for invalid cron); UTC label in the topbar.\n- YAML drawer on the DAG page (view/copy/download the defi\n[…]\nsharing one\n  global scope — complexity budget before the visualization phase; DESIGN.md\n  updated (script layout, motion ruling, UTC honesty).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): Phase-1 UX — linkable pages, YAML drawer/import, dupli…",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T07:53:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9ef85f7d411d6ceb313e5b113718fd38223e3b43",
          "body": "GET /api/schedule/preview?schedule=&start_date=&n= returns the next n fire\ntimes computed by the engine's own cron parser, so the console never does\nclient-side cron math. /api/info now carries tz: \"UTC\" — the engine evaluates\nschedules against UTC anchors, so UTC (not the server wall clock) is the\ntruthful label for what cron fields mean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(api): stateless schedule preview + honest UTC timezone label",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T07:53:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "06553364596d3a2e377977b1a475a9725e2ed485",
          "body": "Typed command builders — the task type (shell/python/sql/jar) now drives a\nstructured form that composes the command string (python: interpreter +\nmodule/script + args; jar: jar/main-class + args; sql: client + quoted query),\nwith a live tinted \"Will run:\" preview, eager fallback to the raw editor f\n[…]\n-value trigger_rule description, pool hint). Pure frontend — the command\nstring stays the stored source of truth. Bilingual zh/en, both themes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(console): 0-code authoring suite",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-07-02T02:51:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dff98e45b744c99d08e65694742c766145d60b67",
          "body": "The generated proto/cronova/executor/v1 code (used by the executor) was\ninitially masked by the unanchored gitignore pattern fixed in the core commit;\nadd it so the module builds from a fresh clone.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add generated executor gRPC protocol",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-06-24T17:50:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fba0ac3853b8f55a00c31dac678fcad150455163",
          "body": "Sample workflow definitions: a multi-task ETL, a scheduled ticker, and an\nupstream/downstream trigger_after pair.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: example DAGs",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-06-24T17:49:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "756ff84def5e3dfd813fadde666111eeb5248a77",
          "body": "ARCHITECTURE.md (scheduler/executor/store design) and DESIGN.md (console\ndesign principles, CSS-variable foundations, component conventions, and the\nexplicit anti-over-engineering \"not doing\" list).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: architecture + console design system",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-06-24T17:49:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff36e53b2083153300a599aaa6def1df2c24d1a4",
          "body": "JSON REST API (overview, DAG CRUD + structured build, runs, SSE live logs,\npools, cross-DAG graph, soft-delete) and the embedded vanilla-JS console:\ndrill-down DAG list -> operation page -> task editor with immediate save,\nvisual dependency graph with click-to-connect, schedule builder, trigger_rule\n[…]\n focus-visible + keyboard operation, honest sparkline, bilingual zh/en,\ndark/light). Plus cmd/cronova wiring the scheduler + executor + server.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(api+web): REST API + embedded drill-down console",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-06-24T17:49:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "edfcf2b60402d4cab5134b2034dc6251c28b6f66",
          "body": "Cron/manual/dependency run creation, the per-tick task state machine\n(dispatch, trigger_rule join semantics, failure propagation, retries with\ndelay, timeouts, pools, catchup with logical_date injection), crash recovery,\nand the DAG lifecycle: CreateDAG, soft-delete with cache eviction, and 0-task\n\"shell\" DAGs that are never scheduled/triggered until they have a task.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scheduler): scheduling engine",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-06-24T17:49:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "32b49dfc5a257629c37985d1eaa6e6b5c3a4c563",
          "body": "Domain types + state machines (model), the pure-Go SQLite store (DELETE\njournal, single-connection, soft-delete via deleted_at), and the standalone\ngRPC executor process (cmd/cronova-executor) for crash-isolated task execution.\nAlso anchors the binary-ignore patterns so cmd/cronova* source dirs aren't ignored.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): domain model, SQLite store, decoupled executor",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-06-24T17:48:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1c4f82f3f75855cf7e665ceed8df7c9d4fc2d25d",
          "body": "Go module + dependencies, buf codegen config and the generated gRPC\nexecutor protocol, .gitignore, README, and the Claude Preview launch config.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: project scaffold (module, buf/proto, gitignore, README)",
          "author_name": "robbe_in",
          "author_login": null,
          "committed_at": "2026-06-24T17:48:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 8,
      "commits_last_year": 54,
      "latest_release_at": "2026-07-10T08:44:45Z",
      "latest_release_tag": "v0.5.0",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 13,
      "mean_days_between_releases": 0.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "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": 8
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [
        "proto/cronova/executor/v1/executor.proto"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 1097271,
      "source_files_sampled": 110,
      "oversized_source_files": 4,
      "agent_instruction_files": [
        "docs/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 4645
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "requirements-docs.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/robfig/cron/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "google.golang.org/grpc",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.81.1"
        },
        {
          "name": "google.golang.org/protobuf",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.36.11"
        },
        {
          "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.53.0"
        }
      ],
      "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": 8,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "zoyluoblue",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/252904981?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "docs.yml",
        "release.yml",
        "test.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": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 10,
            "reason": "project is 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": 8,
            "reason": "dependency not pinned by hash detected -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": 0,
            "reason": "10 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8e982e4a6761781da244b8f3c25468527d6ae6a4",
        "ran_at": "2026-07-23T16:15:31Z",
        "aggregate_score": 3.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T09:44:40Z",
      "oldest_open_prs": [
        {
          "number": 1,
          "created_at": "2026-07-10T08:40:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2,
          "created_at": "2026-07-10T08:40:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3,
          "created_at": "2026-07-10T08:40:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 4,
          "created_at": "2026-07-10T08:40:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 6,
          "created_at": "2026-07-10T08:40:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 7,
          "created_at": "2026-07-10T08:40:24Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 8,
          "created_at": "2026-07-17T09:44:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 9,
          "created_at": "2026-07-17T09:44:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/zoyluoblue/cronova",
    "host": "github.com",
    "name": "cronova",
    "owner": "zoyluoblue"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 43,
      "inputs": {
        "security": 37,
        "vitality": 68,
        "community": 24,
        "governance": 16,
        "engineering": 70
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "commits_last_year": 54,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 3
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "3/52 weeks with commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "54 commits in the last year",
                "points": 15.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 54
                    }
                  }
                ],
                "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": 8,
              "latest_release_tag": "v0.5.0",
              "releases_from_tags": false,
              "days_since_latest_release": 13,
              "mean_days_between_releases": 0.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "8 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 13 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.7
                    }
                  }
                ],
                "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": 24,
        "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": "critical",
        "name": "Sustainability & Governance",
        "value": 16,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "0/1 decided PRs merged",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 0,
                      "decided": 1
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "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": 38,
            "inputs": {
              "followers": 23,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "zoyluoblue",
              "public_repos": 16,
              "account_age_days": 200
            },
            "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": "23 followers of zoyluoblue",
                "points": 9.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 23,
                      "login": "zoyluoblue"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "16 public repos, account ~0 yr old",
                "points": 10.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 16
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 70,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "ai-agents",
                "airflow-alternative",
                "automation",
                "cron",
                "dag",
                "data-engineering",
                "data-pipeline",
                "devops",
                "etl",
                "go",
                "golang",
                "job-scheduler",
                "mcp",
                "orchestration",
                "scheduler",
                "self-hosted",
                "sqlite",
                "task-scheduler",
                "workflow-orchestration",
                "workflow-scheduler"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "20 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "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": 37,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.7
            },
            "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is fuzzed",
                "points": 5,
                "status": "met",
                "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 8",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "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": "10 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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": "good",
        "name": "AI Readiness",
        "value": 80,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "docs/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 4645
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "docs/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "docs/AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "54 of 54 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 54,
                      "sampled": 54
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.963,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": "52 of the last 54 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 52,
                      "sampled": 54
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 8",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 1097271,
              "source_files_sampled": 110,
              "oversized_source_files": 4
            },
            "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": "4/110 source files over 60KB",
                "points": 53,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 110,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": false,
              "api_schema_files": [
                "proto/cronova/executor/v1/executor.proto"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "proto/cronova/executor/v1/executor.proto",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "proto/cronova/executor/v1/executor.proto"
                    }
                  }
                ],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Could not fetch go package 'github.com/zoyluo/cronova' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T16:15:36.552218Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/z/zoyluoblue/cronova.svg",
  "full_name": "zoyluoblue/cronova",
  "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 agregadas.