Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 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 Sterne⑂ 0 Forksseit Juni 2026Auf GitHub ansehen ↗

zoyluoblue/cronova erreicht einen Gesundheitsindex von 43 von 100 und liegt damit im Bereich Gefährdet. Am stärksten schneidet es bei AI Readiness (80/100) ab, am schwächsten bei Sustainability & Governance (16/100). Zuletzt vor 6 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

43
gesamt / 100
Gefährdet

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

43
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

ZoyLuoPersönliches Konto
23 Follower16 öffentliche Reposseit Jan. 2026

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

68Mittel · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 6 Tagen
2.1/36Commit-Rhythmus — 3/52 Wochen mit Commits
15.6/18Commit-Volumen — 54 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year54
human_commit_share1
days_since_last_push6
active_weeks_last_year3
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 8 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 13 Tagen
27/27Release-Rhythmus — ein Release etwa alle 0,7 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count8
latest_release_tagv0.5.0
releases_from_tagsnein
days_since_latest_release13
mean_days_between_releases0,7

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

24Kritisch · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 0 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

16Kritisch · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
0/38.3PR-Annahme — 0/1 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
9.9/25Reichweite des Inhabers — 23 Follower von zoyluoblue
10.1/25Kontohistorie — 16 öffentliche Repos, Kontoalter ca. 0 Jahre
Verwendete Eingangsdaten
followers23
owner_typeUser
is_verified
owner_loginzoyluoblue
public_repos16
account_age_days200
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

70Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.

Dokumentation

85Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 20 Topics
10/10Wiki
Verwendete Eingangsdaten
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_wikija
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

37Gefährdet · 16 % des Gesamtindex

Sicherheitslage

37Gefährdet
Wie die Bewertung erfolgt
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 — keine Daten
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.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — keine Daten
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
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, packaging. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

80Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — docs/AGENTS.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 54 von 54 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_filesdocs/AGENTS.md
agent_instruction_max_bytes4.645
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 52 der letzten 54 Commits von Agenten verfasst oder ihnen zugeschrieben
5/8Automatisierte Wartung — Abhängigkeits-Automatisierung konfiguriert, in den erfassten Commits nicht beobachtet
8/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 8
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languageja
bootstrap_filesMakefile
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,963
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
53/55Handhabbare Dateigrößen — 4/110 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes1.097.271
source_files_sampled110
oversized_source_files4
Wie die Bewertung erfolgt
40/40API-Schema (OpenAPI/GraphQL/proto) — proto/cronova/executor/v1/executor.proto
0/20MCP-Server
0/40Lauffähige Beispiele
Verwendete Eingangsdaten
example_dirs
has_mcp_signalnein
api_schema_filesproto/cronova/executor/v1/executor.proto

Eckdaten

0GitHub-Sterne
1Mitwirkende
54Commits, letzte 12 Monate
6Tage seit letztem Push
8Releases
1Bus-Faktor
0offene Issues
Go, PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

OpenSSF Scorecard 3.7 / 10
3.7Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
k. A.CI-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
k. A.Packagingpackaging 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
Direkte Abhängigkeiten 5
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistiken.