Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-23 01:20 UTC

jonny981 / loops

A small, nestable agent-loop job primitive: loop(body→until→review) composed with dag, pluggable engines, agent-judge gates, budget + run records. TypeScript.

TypeScriptMIT★ 11 Sterne⑂ 0 Forksseit Juni 2026Auf GitHub ansehen ↗

jonny981/loops erreicht einen Gesundheitsindex von 50 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (75/100) ab, am schwächsten bei Security (27/100). Zuletzt vor 1 Tag aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

50
gesamt / 100
Mittel

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.

50
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

Jonny NeillPersönliches Konto
11 Follower4 öffentliche Reposseit Dez. 2014amps.ai

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.

Paket-Ökosysteme

Metriken nach Kategorie

Vitalität

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

75Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 1 Tagen
3.5/36Commit-Rhythmus — 5/52 Wochen mit Commits
18/18Commit-Volumen — 208 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_year208
human_commit_share1
days_since_last_push1
active_weeks_last_year5

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 7 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 5 Tagen
27/27Release-Rhythmus — ein Release etwa alle 1,3 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count7
latest_release_tagv0.10.0
releases_from_tagsnein
days_since_latest_release5
mean_days_between_releases1,3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

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

38Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
16.2/60Stars — 11 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars11
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
Wie die Bewertung erfolgt
45/80Downloads pro Monat — 2.383 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packages@loops-adk/core
dependents
ecosystemsnpm
total_downloads
monthly_downloads2.383
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

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

38Gefährdet · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
5.2/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 77 % der Commits
2.7/13.5Breite der Beitragenden — 2 Beitragende
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Verwendete Eingangsdaten
bus_factor1
contributors_sampled2
top_contributor_share0,769
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
0/38.3PR-Annahme — keine entschiedenen Pull Requests oder keine Daten
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_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote, PR-Annahme. 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
7.8/25Reichweite des Inhabers — 11 Follower von jonny981
17.1/25Kontohistorie — 4 öffentliche Repos, Kontoalter ca. 11 Jahre
Verwendete Eingangsdaten
followers11
owner_typeUser
is_verified
owner_loginjonny981
public_repos4
account_age_days4.225
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 5 Tagen
20/20Versionshistorie — 14 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packages@loops-adk/core
ecosystemsnpm
any_deprecatednein
min_days_since_publish5

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

66Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 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.
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
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?

27Kritisch · 16 % des Gesamtindex

Sicherheitslage

27Kritisch
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
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — keine Daten
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
2.2/7.5Vulnerabilities — 7 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2,8
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, packaging, signed_releases. 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.

73Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
15/15Maschinenlesbare Doku (llms.txt) — llms.txt vorhanden
40/40Lesbare Commit-Historie — 97 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtja
legible_history_share0,97
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes18.614
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — bench/tsconfig.json, tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 35 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configsbench/tsconfig.json, tsconfig.json
agent_commit_share0,35
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/227 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes58.100
source_files_sampled227
oversized_source_files0
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

11GitHub-Sterne
2Mitwirkende
208Commits, letzte 12 Monate
1Tage seit letztem Push
7Releases
1Bus-Faktor
0offene Issues
npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@loops-adk/core@0.10.0; advisories assessed against the repository dependency graph instead

Weitere Details

OpenSSF Scorecard 2.8 / 10
2.8Gesamtwert

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 01:20 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
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
k. A.Packagingpackaging workflow not detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
3Vulnerabilities7 existing vulnerabilities detected
Direkte Abhängigkeiten 15
RegistryPaketVersionsvorgabeManifest
npm@anthropic-ai/claude-agent-sdk^0.3.185package.json
npm@anthropic-ai/sdk^0.105.0package.json
npmcommander^15.0.0package.json
npmexeca^9.6.1package.json
npmink^7.1.0package.json
npmms^2.1.3package.json
npmp-limit^7.3.0package.json
npmp-retry^8.0.0package.json
npmp-timeout^7.0.1package.json
npmpicocolors^1.1.1package.json
npmreact^19.2.7package.json
npmtoposort^2.0.2package.json
npmtsx^4.22.4package.json
npmyaml^2.9.0package.json
npmzod^4.4.3package.json
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": [],
      "is_fork": false,
      "size_kb": 2114,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Shell": 2907,
        "Python": 11406,
        "JavaScript": 26318,
        "TypeScript": 1378727
      },
      "pushed_at": "2026-07-21T22:57:05Z",
      "created_at": "2026-06-23T15:33:47Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T22:36:31Z",
      "description": "A small, nestable agent-loop job primitive: loop(body→until→review) composed with dag, pluggable engines, agent-judge gates, budget + run records. TypeScript.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Jonny Neill",
      "type": "User",
      "login": "jonny981",
      "company": "amps.ai",
      "location": "United Kingdom",
      "followers": 11,
      "avatar_url": "https://avatars.githubusercontent.com/u/10325708?v=4",
      "created_at": "2014-12-27T20:32:12Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 4225
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-17T18:34:59Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-17T10:00:50Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-16T09:58:50Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-16T07:33:24Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-12T21:21:18Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-09T22:35:45Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-09T22:06:30Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "04b2df1b6b74c5525b2012bea665e648e9510dcf",
          "body": "The convergence framing predates the code. The README carries the\nessay's line (execution is cheap, convergence is expensive) with a link;\ndocs/theory.md gains an Origin section tracing the thesis from Lean Six\nSigma process discipline through the essay to the library's gates,\nreview batteries, and \n[…]\nt; the roadmap names convergence\ncount as a first-class reported metric.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: cite the origin essay — Convergence Count (February 2026)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T22:36:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22c04a02160e7e3e3c1c7501160b954af59f435d",
          "body": "Use the defensible theorem phrasing from docs/theory.md, credit\nDijkstra where his argument is used, carry the completeness line\n(Turing complete where it must be, decidable where it can be), and\npoint readers at the full engineer file for the two helper conditions\nthe snippet references.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: align README with its own receipts",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:13:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c4bcc9e44795dff6738283035050b8a6cdf622f5",
          "body": "Split the attribution correctly: Böhm & Jacopini proved the reduction\npossible (1966); Dijkstra's 'Go To Statement Considered Harmful' (1968)\nargued it was necessary — text must map onto behaviour. The theorem is\nthe license; the letter is the motive.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: give Dijkstra his sentence in the theory notes",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:06:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "199371be63d11ea8bebd8f891ccc48dabd1741df",
          "body": "Everywhere the line appears, say what kind of win it is: not\ncapability — back-edges compute everything while does, just as goto\ndid. Structured programming's win was reasoning, and it's the same win\nre-run: same computations, but the shape of the run is knowable before\nit starts.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: state the honest version of the goto/while win",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:05:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e4673201b57d3cfdbf0066e8802cbe36211f3ee",
          "body": "State the structural win where the theorem is already doing the\narguing: back-edges over shared state are goto, loop() is while, and\nthe graph stays analyzable because it never jumps. Kept generic in the\nREADME; the comparison doc names LangGraph and now describes its\nrecursion limit accurately — a global step ceiling, not a gate.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: the goto/while line in the README; harden the comparison claim",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:04:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39d40e75b33aeb90d93b07c264a614577e232237",
          "body": "docs/theory.md carries the claims with their caveats: the theorem's\nstandard reading plus its honest footnotes (auxiliary variables, Harel's\nfolk-theorem lineage), structured cycles vs back-edges (while, not\ngoto), the three-level Turing completeness argument, and halting as the\nreason the brakes ex\n[…]\nces the\npredicate. The comparison doc gains the structured-cycles point.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: theory notes with receipts; fix the selection conflation",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:57:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a19b4a491236b3aa9d806a91b582af11c48c9783",
          "body": "Cite the structured program theorem (Böhm & Jacopini, 1966) where the\nloop/graph pairing is introduced: all control flow reduces to sequence,\nselection, and iteration — the graph carries the first two, the loop the\nthird. A new 'Iterate, depend, judge' section maps the triple onto a\nworking engineer\n[…]\n.md anchors the terminology so future\nchanges keep the language aligned.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: iterate, depend, judge — ground the philosophy in the 1966 theorem",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:47:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "840d60037c61353a04b5bca508726c775573a695",
          "body": "'A node can be a loop. A loop can be a node.' Loops and graphs are not\nmutually exclusive — the section intro above the pipeline example now\nsays why: real work isn't linear, some steps run once and some iterate,\nand combining the two shapes is the simplest model of how people\nactually work. The determinism thesis keeps its paragraph in the\nopening.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: the distillation as the tagline",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:32:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f46b48baade327b30ba410c916ec32f38d7829c6",
          "body": "Show the two-memory pattern: a small agent curates business context\nfrom the company knowledge base (qmd) into a brief, and later steps\nground on that brief plus the commit history's decisions, constraints,\nand reasoning — using declared sources with a cheap curation turn.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: building block for knowledge-base grounding beside the git log",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T09:45:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9bd47d3bb72daa62469e7679ef670b4f496f4643",
          "body": "One sentence: any model can sit in any seat — cheap for research,\nstrong for building, a different vendor for review.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: multiple models in the first paragraph",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:28:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "94f9e4f32ccb2afe95843676d3155be467c5523b",
          "body": "'Write a plan' becomes 'write a plan a person can veto'; 'get reviewed'\nbecomes 'rework until the reviewers are satisfied' — the enforcement\nlives in the verbs, at the same length. 'That flow' becomes 'that\ndiscipline'.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: first sentence describes the discipline, not the happy path",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:26:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a412ce4edf0e883cfe710ddc0987419dfb5071a9",
          "body": "The first paragraph now says what the flow is — a DAG of steps with\nloops nested inside — and a fourth paragraph states the memory model:\ngit is the memory, read fresh each step and written back on landing,\nwith no vector store, database, or extra infrastructure.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: name the DAG and the git-native memory in the opening",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:23:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9317522a617a304d6bc530237b01d8722a9ab11",
          "body": "… agents\n\nNew tagline and a second paragraph stating the core idea: the LLM can't\nbe deterministic and software rarely has one right answer, but the\nprocess of building it can be exact — steps, order, gates, reviewers,\nhuman checkpoints — enforced as code, with the agent creative inside\neach step.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: lead with the thesis — deterministic process, non-deterministic…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:19:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6e3869ea3f758c98c44260c8f218f27b9f9975d1",
          "body": "Three short paragraphs: the pipeline that runs real work unattended,\nthe gates and git-backed resumability that keep a long run honest, and\nthe two nesting shapes everything is built from.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: opening paragraphs that carry the whole story",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:17:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "deaba0ea434f3bb731c68c926411609a8b4ff1af",
          "body": "Drop the validate/run block that sat directly under the pipeline\nexample; the CLI section after the code-focused sections already covers\nit. Readers now see how to build the thing before how to execute it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: keep CLI commands out of the build-it sections",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:12:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9be3c78e2b52afe8ad580e12ce1e1fd1489c4814",
          "body": "Lead with the end-to-end issue-to-PR pipeline as the first code in the\nfile; the single gated loop moves below it as 'The unit' it's built\nfrom. Tagline and intro now describe repeating agent pipelines rather\nthan running an agent in a loop.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: frame the README around orchestration, not a bare loop",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:10:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bd5afdfb9a483148877e3d0f30a02f40bffa9ef3",
          "body": "Convert the examples table to a bulleted list and cover every file in\nexamples/ — adding feedback, contracted-agent, params, helm-offline,\nand engine-smoke — with one-line descriptions checked against each\nfile's own header.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: complete the README examples list as bullets",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:05:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a1ca2dd58f758f340cd46f2f561dda27b67cff17",
          "body": "Open on the use case — a full issue-to-PR flow — instead of an abstract\ndefinition. Move the engineer example up as the centerpiece, and replace\nthe reference prose (conditions, memory, limits, parallelism,\nenvironments) with a Building blocks section of one-snippet entries so\neach idea is shown rather than described. Plainer words throughout.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: lead the README with real work; explain by snippet, not prose",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:04:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "53fc886673c571dcf3d12a55dc94268126d85c45",
          "body": "A Tend ∘ Converge example that works a backlog the way an engineer\nwould: pick up the next ready GitHub issue, research and plan it, pause\nat a human gate when the plan is marked high-complexity, build to green\nlint and tests against an adversarial three-seat review battery\n(different vendor on the \n[…]\nwcased in the README with a\ncondensed version and an examples-table row.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: add engineer.loop.ts — an engineer, end to end",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T06:01:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e55ac50fc74ab0fe3de2a1c0ed49a5f153c9bac7",
          "body": "Replace the pitch-style tagline and section names with plain ones\n(A first loop, Composition, Conditions, Memory, Limits, Scope), trim\nthe prose to short declarative sentences, and let the examples carry\nthe weight. Content and structure otherwise unchanged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: quieter README voice — simple and plain over salesy",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T05:53:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "887ce55f037a3c966662a24b6a7f80761c15d1dd",
          "body": "Cut the README from ~9,700 to ~2,300 words. Lead with a 30-second hero\nloop, then showcase examples for the things that sell the library:\na DAG containing a loop with a quorum gate, a loop containing a DAG,\nand adversarial review with kickbacks across two vendors. Reference\nsections stay brief and l\n[…]\nent unchanged) and fix the stale composition anchor in\ndocs/concepts.md.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01W2G3gwotMCyHX9r8xJxvCP",
          "is_bot": false,
          "headline": "docs: rewrite README as example-first developer docs",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T05:51:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "234ff4ffd11125b9a24e8f93e985b872e17ea711",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.10.0",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-17T18:31:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6b748fb585c21abe7f59f038be841a08e00bd48",
          "body": null,
          "is_bot": false,
          "headline": "docs(release): date 0.10.0 for publication",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-17T18:31:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc883890beec528158bd59e17268fc1220c8110e",
          "body": "Skip speculative repair turns and reuse high-confidence reviewer passes only while their scoped evidence remains unchanged.\n\nBound and meter retrieval, review evidence, and reader memory so resumed pipelines spend tokens on invalidated work without weakening deterministic gates.",
          "is_bot": false,
          "headline": "feat(runtime): make pipeline reruns token-efficient",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-17T18:31:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffcf78ecb311bb4b81fafac6a250f2ebe0cbc5a7",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.9.2",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T22:05:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b2b11ca2649df689cc54eba4039531665333656",
          "body": null,
          "is_bot": false,
          "headline": "docs(release): date 0.9.2 for publication",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T22:04:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cd543e68b92364d62e469ae4150b8fa7161cb02",
          "body": "Provider session limits and wrapped reviewer errors were being scored as work\nfailures, while absolute write scopes wedged on dirt that predated a fix loop.\nPreserve infrastructure provenance, scope pending changes to loop entry, and\nretain classified CLI diagnostics so unattended runs pause or retry for the\nright reason.",
          "is_bot": false,
          "headline": "fix(runtime): keep OEM pipeline failures actionable",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T22:03:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6cf460edfcfe9387eb36d4add4e1e2cb15c36b77",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.9.1",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:58:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88d0d59d9c377a8e3ad67e67322632586663bcf3",
          "body": null,
          "is_bot": false,
          "headline": "docs(release): date 0.9.1 for publication",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:57:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df4c992256d57f81954d4547999de95435f5ffd2",
          "body": "…sionLine\n\n## Why\n\nThe ampsai-monorepo island's 0.9.0 adoption pass proved the field-note\n§3 divergence live with a parity test: core\nlastDecisionLine(\"VERDICT: pass\", 'VERDICT', ['PASS','CONCERNS'],\n{mode:'last-match'}) returned \"pass\" while the island's fork uppercases\nto \"PASS\", and the island's \n[…]\ntas (confidenceCondition's percent-unanimity\ncomposition, the prompt loader's fail-loud-on-unused-var guarantee) are\nisland-contract choices layered above core, not core defects, and stay\nisland-side.",
          "is_bot": false,
          "headline": "fix(decision): return the vocabulary's canonical casing from lastDeci…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:55:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8c7683aa244af01acf0de14463824bfa81ca07c",
          "body": "## Why\n\nA codex agent invoked from inside a claude-launched loop could complete\nits turn yet never return a resolution: the loop hung with the work\nalready done. The trivial live case passed, so the hang was conditional.\nA fake engine binary that exits after writing its result but leaves a\ndetached \n[…]\neserve their own decision, so it is deliberately not folded in here.\nexamples/engine-smoke.loop.ts is the loop-level live smoke for any\nengine lane (LOOPS_SMOKE_ENGINE), complementing loops preflight.",
          "is_bot": false,
          "headline": "fix(engines): settle CLI engine turns on process exit, not stream close",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:45:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e33ff4a3f210549c9827041a2bf225b49d32feb",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.9.0",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:29:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6b24f4faa7e5b2e1013f67e00d7344f36848a28",
          "body": null,
          "is_bot": false,
          "headline": "docs(release): date 0.9.0 for publication",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:28:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "928ce5c7b734ddbc57499a159e14ac035850fc67",
          "body": "Keep the release record aligned with the frozen semantic contract and with the\nactual scope of CheckRun provenance and Codex warning surfacing. Document the\nstricter checkpoint validation so operators can evaluate trusted resume from\nthe public contract.",
          "is_bot": false,
          "headline": "docs(review): narrow the 0.9.0 guarantees",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59dbf4e2faf9bdfc579df63f13ca81ac38d98c3a",
          "body": "The fragments directory promises a contained include root, so lexical path\nchecks are insufficient when a directory or fragment is a symlink. Enforce\nreal-path containment only for the additive option to preserve legacy prompt\nbank behavior.",
          "is_bot": false,
          "headline": "fix(prompts): contain configured fragment symlinks",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70895bbdde3212999b4b320b3ec0ddd8ab914d0c",
          "body": "An explicitly trusted changed workspace has no honest representation in the\npublished v1 checkpoint vocabulary. Keep the detailed runtime event and omit\nthat transition from semantic v1 instead of widening or mislabeling it.",
          "is_bot": false,
          "headline": "fix(semantic): preserve the frozen v1 restore contract",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4298dce978ab173692aba61fa8850307cc90752",
          "body": "Trusted resume must not turn arbitrary checkpoint strings into permission to\nreuse cached work. Accept only fingerprints and attempts that the runtime can\ngenerate, while preserving valid siblings and legacy checkpoints without a\nfingerprint.",
          "is_bot": false,
          "headline": "fix(checkpoint): reject invalid restore trust data",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44f354f8c5ca75e29646d581fc2a52c33dc254dc",
          "body": "Keep the regression runnable in a clean checkout without committing the large\ndownstream outcome payload from the ignored field artifact. Preserve the\nmalformed nested DAG shape that triggered resume failure.",
          "is_bot": false,
          "headline": "test(checkpoint): track the signal abort repro fixture",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8715b7349fcd3e372985c6669249346aa0761154",
          "body": "Keep the field evidence, public contracts, and release ledger aligned so\ndownstream cleanup can distinguish removable workarounds from orchestration\nthat remains island-owned. Leave the package version at 0.8.0 for the\nhuman-controlled release step.",
          "is_bot": false,
          "headline": "docs(release): record the 0.9.0 sig run hardening batch",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2cef7b1466efe85e0bf7521387400bd955dbad2",
          "body": "Keep renderable prompt templates at the bank root while allowing reusable partials to follow a contained fragments convention. Resolved-path cycle identity prevents false cycles when a root template and fragment share a name.",
          "is_bot": false,
          "headline": "feat(prompts): support a fragments directory",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e8e7cf328217d40e6116d3d5369d9db836410fc",
          "body": null,
          "is_bot": false,
          "headline": "feat(condition): extend decision token handling",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "193593250c22647e398345b8e9919c164876cb21",
          "body": "A substantive recovery commit changes both HEAD and the committed tree, so a tree fingerprint cannot preserve cached nodes across the fix. Write lanes describe permitted outputs rather than node input and dependency provenance, which makes lane-scoped reuse unsafe without a larger provenance model.\n\n[…]\nt and require an explicit API or CLI trust decision before graph-filtered green nodes are reused. Malformed fingerprints remain fail-closed, and restore events record the changed fingerprint honestly.",
          "is_bot": false,
          "headline": "feat(runtime): allow explicit trusted workspace resume",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7532ed4fffc28c88f89ade91c715667de92b9a4b",
          "body": "Downstream deterministic gates need terminal evidence in the gate reason because one-line consumers do not render ConditionResult.output. Keep the tail opt-in so existing summaries remain stable, and redact the full stream before slicing so boundary-crossing credentials cannot leak fragments.",
          "is_bot": false,
          "headline": "feat(condition): add command failure output tails",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5da6df25e0c55daa5aa3b7dfb9baa6f5c70f86dc",
          "body": "A conflicting pull request can expose only external status contexts while required-check queries report no failures. Require a mergeable PR and at least one CheckRun before accepting the existing required-check result so missing core CI cannot produce a false green.",
          "is_bot": false,
          "headline": "fix(forge): reject incomplete pull request checks",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72e1512eb5a73ecc09359cbfac4f5c5b0dd7935a",
          "body": null,
          "is_bot": false,
          "headline": "fix(codex): preserve completed results on teardown failure",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0a573db4a1a92e93e4c66b07c992db1c44eb5a9",
          "body": "Signal-abort snapshots could omit repeated nested outcomes because alias detection treated every repeated reference as a cycle. Resume then trusted missing outcomes and crashed.\n\nSerialize only ancestor cycles and validate checkpoint DAG entries independently so valid siblings remain reusable while malformed records fall back with bounded diagnostics.",
          "is_bot": false,
          "headline": "fix(checkpoint): make resume tolerant of malformed entries",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-16T07:27:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab89efb6e5b15a7e1a1bd841d0eac66b389adfaa",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.8.0",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-12T21:18:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67c5c983e478f1d75a1c5c77421b50e6d0b8bd72",
          "body": "Freeze the stable semantic event schema release notes as the single source used by the release workflow and GitHub Release.",
          "is_bot": false,
          "headline": "docs: prepare 0.8.0 changelog",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-12T21:18:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "233ed89ca8e6941307dd01b7e072608c8b14fc44",
          "body": "Reviewer reproductions exposed missing Condition verdicts, contradictory resume history, and validation paths that could affect successful work. Make lifecycle and unit variants structurally coherent while keeping observation fully best-effort.",
          "is_bot": false,
          "headline": "fix(runtime): enforce semantic record invariants",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-11T11:58:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcf7857976ae35df905e55123cd1592b5d672d74",
          "body": "Give archives, adapters, benchmarks, and supervision clients one strict versioned artifact while keeping raw runtime events diagnostic. A generated package schema, canonical filter vocabulary, and explicit legacy rules prevent downstream shape drift.",
          "is_bot": false,
          "headline": "feat(runtime): publish semantic record contract",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-11T11:27:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2dafe278d0c62121bb96a186729a62c658827343",
          "body": "Project runtime-owned decisions into the strict v1 contract and validate records at both write and read boundaries. Supervised streams gain stable run lifecycle markers without turning semantic artifacts into orchestration state.",
          "is_bot": false,
          "headline": "feat(runtime): version semantic record streams",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-11T11:18:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9fa2ef26b62a0e4ea2338a7dadd934913a3956c",
          "body": "Keep preflight and lifecycle records internally coherent, and limit compatibility adaptation to the unversioned 0.7 record family. This preserves strict v1 round trips while retaining explicit legacy support.",
          "is_bot": false,
          "headline": "fix(runtime): tighten semantic schema invariants",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-11T11:13:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4eef917c80ad73ca60b554641cb122f8f0ec66c4",
          "body": "Semantic records had accumulated without a stable contract, leaving archives and future report layers to infer shapes independently. Zod is the runtime source of truth, and known 0.7.0 records adapt in memory so old evidence remains readable without being rewritten.",
          "is_bot": false,
          "headline": "feat(runtime): define semantic record schema",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-11T10:22:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83b99a196dd17f0b1d858509ce6bee630a02f146",
          "body": "## Why\n\nThe abandoned docs/ai-discovery-seo branch carried an 18-keyword\nexpansion; this takes the curated half. npm search runs on\nname/description/keywords and main carried only nine thin ones.\n\n## Alternatives\n\nThe branch also rewrote the description to 'a small TypeScript\nworkflow engine', which\n[…]\nllms.txt landed\nfresh (e328842), the discovery doc and README section were judged\nredundant with llms.txt and the comparison matrix. The branch itself\nis now unharvested-value-free and can be deleted.",
          "is_bot": false,
          "headline": "chore: broaden npm keywords for discovery",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-10T14:13:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e3288426ab89aa91eeb80a4a456a625c557079ed",
          "body": "## Why\n\nAn abandoned branch (docs/ai-discovery-seo, two commits based on 0.4.0)\ncarried an AI-discovery push: llms.txt, a discovery guide doc, keyword\nstuffing, and a README section. The branch predated d0fcd03 ('remove\nbullshit AI language'), linked two docs that commit deleted, and half\nits conten\n[…]\nrry.\n\n## What Next\n\nThe source branch still holds the package.json keyword expansion and\nthe longer discovery doc; those remain unharvested pending a decision\non whether they clear the same taste bar.",
          "is_bot": false,
          "headline": "docs: add an llms.txt discovery manifest",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-10T14:10:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2619c35cffd61fbb17d9848f5f7978ba99e4d196",
          "body": "## Why\n\nThe README's quick-reach table (loops vs durable workflow engines vs raw\nSDKs) answers where loops sits, but not how it compares row by row with\nthe frameworks a reader is most likely weighing it against. A docs study\nof mastra.ai and the LangGraph docs (docs.langchain.com) produced the\nevid\n[…]\nWhat Next\n\nThe single-LLM-judge done-check both frameworks default to is the\ndocumented field-default arm in the benchmark plans: the matrix's\ncentral claim becomes measurable when that ablation runs.",
          "is_bot": false,
          "headline": "docs: compare loops with Mastra and LangGraph in depth",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-10T11:42:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c73cae0070f049d9acb9f24030d4a6c8dab462e",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.7.0",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-09T22:33:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ef6444a694673927cf64c30be761e49934e2165",
          "body": "Implements the 2026-07-08 SigEnergy observation backlog as library primitives rather than island glue: graph-shaped params, recipe config, bounded scratch, stdin prompt delivery, decision helpers, prompt banks, reader leaves, leaf metadata, and bounded advisor consults.\n\nReviewer findings from the .\n[…]\nfocused Vitest suites; npm test 572 tests across 64 files; npm run build; supervised temp recipe run sig-run-final-live-post-review; feature-dev checkpoint resume run sig-run-observations-post-review.",
          "is_bot": false,
          "headline": "feat(core): fold in sig run primitives",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-09T22:33:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84a7713e337752559462e765fde8d9cba17e38e5",
          "body": "npm@latest now resolves to npm 12, which refuses Node 20 (EBADENGINE:\nrequires node ^22.22.2 || ^24.15.0 || >=26). The runner stays on Node 20\ndeliberately — the package's supported minimum (engines: node >= 20) — so\nthe publish job pins the upgrade to npm@11, which satisfies the OIDC\ntrusted-publis\n[…]\ng floor (>= 11.5.1) and installs on Node 20. This is\nwhat killed the first v0.6.0 release run after the tag step; the decide\njob's tagged-but-no-Release branch re-enters and completes it on this\npush.",
          "is_bot": false,
          "headline": "ci: pin the OIDC npm upgrade to the 11.x line",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-09T22:05:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f030e2509a8dc7c107c95c0ea0203ad9c2ac6573",
          "body": "…p idempotent\n\nThe Release workflow finishes by creating the GitHub Release for the\ntag, with the version's CHANGELOG.md section as the body\n(scripts/changelog-section.mjs) — one source of truth, no hand-written\nrelease notes, and the changelog gate already guarantees the section is\nnon-empty.\n\nEver\n[…]\nleted by the next push\ninstead of leaving the release half-done forever.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVLiFRYQtDPM95NmfrnVkE",
          "is_bot": false,
          "headline": "ci: create GitHub Releases from the changelog; make every publish ste…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:02:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c40631313d853b9303fdac12b0a97b25e80a2c9e",
          "body": "On a push to main, the Release workflow checks whether package.json\ncarries a version with no v* tag yet; if so it runs the changelog gate,\ntypecheck, and tests, creates and pushes the tag itself, and publishes.\nA push that does not bump the version is a no-op. Hand-pushed v* tags\nand the manual tri\n[…]\nunblocks releasing from environments that can push commits\nbut not tags.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVLiFRYQtDPM95NmfrnVkE",
          "is_bot": false,
          "headline": "ci: key releases to the version bump, not a hand-pushed tag",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:00:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c3e3a429099373deecbda9e7cc7cfb485d7f235",
          "body": null,
          "is_bot": false,
          "headline": "0.6.0",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T21:48:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e46d1e63a605894688c3b20a6f28325f65806143",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVLiFRYQtDPM95NmfrnVkE",
          "is_bot": false,
          "headline": "docs: retitle Unreleased to 0.6.0 for release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T21:48:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7f670a3b8eed61434d5dcb3d494afd8c0dc500bf",
          "body": "scripts/changelog-gate.mjs refuses to publish a version CHANGELOG.md does\nnot describe: it requires a \"## [<version>]\" heading with at least one\nsubstantive line, and — on a version tag — that the tag matches\npackage.json (a mismatched tag would publish one version and document\nanother). Dependency-\n[…]\nds, so a release-day miss surfaces in\nnpm test, not in CI after tagging.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVLiFRYQtDPM95NmfrnVkE",
          "is_bot": false,
          "headline": "ci: gate publishes on the changelog",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T21:40:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b75f76ece239f20f173f522b48bad7fb7ad60cf",
          "body": "CHANGELOG.md in Keep a Changelog format: an Unreleased section carrying\nthis branch's additions (the helm harness, hardening gates, provider\nresilience, cost receipts, curated grounding + the ladder, the yardstick\nbench, run-id and semantic-read seams), and backfilled entries for\n0.1.1 through 0.5.1\n[…]\ns in the npm tarball and the README links it from the alpha\nstatus note.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVLiFRYQtDPM95NmfrnVkE",
          "is_bot": false,
          "headline": "docs: publish a changelog",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T21:32:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd3f3285266dacd80b84f0b539f32eb427eaaba0",
          "body": "…able by flag\n\nThe grounding read graduates from \"prepend the recent ledger\" to \"a cheap\nagent composes the right context\", in three layers that are each inert\nunless the recipe opts in:\n\n- ground.sources: declared files beside the commit log (the spec, ADRs, a\n  TASK.md) — workspace-contained paths\n[…]\nt\nsources, chosen rung) so tail/status show why a turn ran where it ran.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVLiFRYQtDPM95NmfrnVkE",
          "is_bot": false,
          "headline": "feat(core): curated grounding and the ladder — inert by default, A/B-…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T21:19:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ed9964932b42c37260d3f12b8b04fd5dda1aac0d",
          "body": "…ceipts, and a benchmark yardstick\n\nOne branch, four areas, one theme: make loops drivable in plain English and\nharder to fool, cheaper to run unattended, and measurable against external\nyardsticks.\n\nhelm — the conversational harness (src/helm/, `loops helm`, docs/helm.md):\n- A driver model (any Eng\n[…]\ntSemanticRecord on the public surface, RunOptions.cost → RunResult.cost.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GVLiFRYQtDPM95NmfrnVkE",
          "is_bot": false,
          "headline": "feat: the helm harness, hardening gates, provider resilience, cost re…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T20:36:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e1f0449ac5d1013325cf24672599efbce6fc9915",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.5.1",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-08T19:43:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d558d5b863208f04e4c9327f7f93abe556a295c",
          "body": "SigEnergy run observations showed that operators were carrying recipe inputs and boilerplate through env vars, hand-written records, and redundant resume flags. This makes recipe inputs first-class, keeps fresh runs bounded, and makes resume behavior visible without changing the workspace-as-state m\n[…]\nssertions\n- supervised feature-dev pause/resume loop with restore diagnostics\n- .claude reviewer panel with fix-up waves for TypeScript, security, correctness, simplification, and adversarial findings",
          "is_bot": false,
          "headline": "feat(runtime): add recipe params and safer resume",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-08T19:43:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aaac8423be290d71380de0cdf4abf5020ddff3c6",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.5.0",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-06T20:42:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c0bcbdc5dd8b1c0d6a4b089e99cbf58011f8dec",
          "body": "Adds production feature-development primitives for bounded fan-out, checkpointed DAG resume, hardened review panels, proof/evidence records, timeout metadata, fallback routing, and supervisor visibility.\n\nAdds the reusable feature-dev example and wrapper so adversarial reviewer engine/model selection is explicit from the CLI.\n\nVerified with npm run typecheck and npm test.",
          "is_bot": false,
          "headline": "feat(workflow): add native feature development workflow",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-06T20:41:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff7801789c149c0545271dbe0687d0ded5ebe38a",
          "body": "The opening framed loops as \"running an agent in a convergence loop\" —\nsingular, loop-only. It is a system for building agentic workflows that\nconverge, scaling from a single retry loop to a nested, multi-agent team\nbecause loop() and dag() return the same Job. Say that up front.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BpLhy52GC3R7RWRMemrwXf",
          "is_bot": false,
          "headline": "docs: broaden the README intro to the whole system",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T09:00:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3b5451daadfcc20a06722188c16c0ab9ce057cb0",
          "body": "withEnv + the redaction pass is a real capability, not a minor one: pin\nvariables over a job subtree with clear precedence (stack vars < overlay <\nper-call), and pinned values are scrubbed from captured gate output, judge\nreplies, and the run records, so a credential handed to a gate never lands\nin \n[…]\nerlay.ts (layering) and redact.ts\n(scrubCapture at every capture site).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BpLhy52GC3R7RWRMemrwXf",
          "is_bot": false,
          "headline": "docs: add safe scoped env injection to Features",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T08:51:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45bc93b5a2dccd68766e28a53126f00e86d40bc1",
          "body": "…ifferently\"\n\nAdd the four capabilities the pillar list had missed, all backed by the\npublic API: parallelism (worktree isolation + tournament), environments\n(gate on the running thing), bounded-and-resumable runs (max/budget/stall\n+ pause-resume across limits), and ship-via-PR (Ledger survives a sq\n[…]\n its out-of-scope\nnote at the close, and delete the standalone section.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BpLhy52GC3R7RWRMemrwXf",
          "is_bot": false,
          "headline": "docs: expand Features to the full surface, fold in \"what loops does d…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T08:48:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1f647e792db6a974b966fbde26f2e18fa72d7a98",
          "body": "The per-pillar sections existed but nothing tied them into one picture up\nfront. Add a scannable Features list right after the intro: the seven\nparts that share one substrate (git + workspace), one unit of work (the\nJob), and one control model (conditions + outcomes), each linking to its\ndeeper section.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BpLhy52GC3R7RWRMemrwXf",
          "is_bot": false,
          "headline": "docs: add a Features section to the README front door",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T08:42:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9e4f1e946afc83cf250b276e9075363ad8bfa231",
          "body": "concepts.md read as a memory doc with everything else lumped into an\n\"enforcement half,\" and called the memory itself \"the commodity\" a git\ndump replicates. Reframe the closing section as \"The whole system\": the\nseven pillars that compose into one substrate (git + workspace), one unit\nof work (the J\n[…]\nipline and replicates none of the rest, so it was\nnever the comparison.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BpLhy52GC3R7RWRMemrwXf",
          "is_bot": false,
          "headline": "docs: frame concepts around the whole system, not just memory",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T08:38:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "75ed5c0669348b413c38a1e32a19f3a611b2b882",
          "body": "The README named the substrate half of the memory claim (git, no extra\narchitecture) but not the discipline half. Add it: curated deterministic\nwrites to commit bodies as work converges, deliberate curated reads\n(recent, selected, or consolidated), never a raw whole-log dump. Nobody\nruns an agent off a pasted git log; that was never the comparison.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BpLhy52GC3R7RWRMemrwXf",
          "is_bot": false,
          "headline": "docs: state the memory thesis, not the strawman",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T08:27:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0fcd03d66f5ce2cce5f3e14ea68033794f4e5de",
          "body": "Strip the self-congratulatory framing and marketing scaffolding that had\naccreted around the library, and let the code speak plainly.\n\n- Delete marketing docs: positioning, messaging, competitive-landscape,\n  measured-metrics.\n- Remove \"small\", \"honest\", and \"seam\" framing from README, CLAUDE.md,\n  \n[…]\nion\n  (memory on vs off) already lives in bench/RESULTS.md, now linked.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BpLhy52GC3R7RWRMemrwXf",
          "is_bot": false,
          "headline": "remove bullshit AI language",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T08:23:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "61685a3d45754bad2a02138f7553cc147b224829",
          "body": null,
          "is_bot": false,
          "headline": "0.4.0",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-03T01:20:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bddca33d5cdf1f10ffe3c2d7c233020b4aee6963",
          "body": "…iews could not see\n\n## Why\n\nThe final whole-diff review panel (five lenses over the entire 0.4.0 diff)\nsurfaced seven issues that only exist BETWEEN waves. The pattern in every one:\ntwo waves each correct alone, incoherent together. (1) The work agent's own\nreply — the sink most likely to echo a pi\n[…]\nxt helper and\n  unifying the three JSONL readers.\n\n## What Next\n\nGate is green: 395 tests across 49 files, typecheck, tsup build, offline\nexample, CLI smoke. Release follows: version 0.4.0, tag, push.",
          "is_bot": false,
          "headline": "fix(core): release-gate hardening — cross-wave seams the per-wave rev…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-03T01:20:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2536ff278ee781f4bf52f09653a6767f60b5dd8f",
          "body": "…dge JSON reasons\n\n## Why\n\nSix implementation waves landed 13 features with their reference docs in\ntsdoc; the tour documents (README, CLAUDE.md, the authoring skills) still\ndescribed the 0.3.0 surface — including statements the waves made false\n(humanGates as \"metadata only\", optional producers blo\n[…]\n.tsx is not on\n  the package's public surface (exports \".\" maps to api.ts).\n\n## What Next\n\nDocs complete the 0.4.0 build. Next: the full-diff release gate, then\nnpm version minor + push --follow-tags.",
          "is_bot": false,
          "headline": "docs: document the 0.4.0 surface; version from package.json; scrub ju…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-03T00:34:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1839eb0201dd97c3df937c52cb582b858c5e6912",
          "body": "…rogress rollup, tool pacing\n\n## Why\n\nFour smaller field-note gaps, each previously hand-rolled by the consumer.\ndefineAgentFromMarkdown loads a Claude Code .claude/agents/*.md (frontmatter →\nAgentDef, body → system) — the consumer's from-def.ts glue was duplicated\nbyte-for-byte across two recipe is\n[…]\nh — the\n  message is the API.\n\n## What Next\n\nAll 13 field-note items are implemented. Next: the docs wave (README,\nCLAUDE.md source map, author-loop skill), then the full-diff release gate\nand v0.4.0.",
          "is_bot": false,
          "headline": "feat(core): DX layer — markdown agent loader, graph assertions, run-p…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-03T00:04:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2473221cfdac79b1580f3bb2e07bf2c511350323",
          "body": "…entDef.humanGates\n\n## Why\n\nInteractive steps (a portal login, a prod approval) could not live in the\ngraph: AgentDef.humanGates was metadata with no runtime behind it, and the\nfield notes' pipeline ran its human step outside the detached run. Worse, the\n'paused' status was silently destroyed mid-gr\n[…]\nting pause (exit 130 over 75).\n\n## What Next\n\nWave 5 of the 0.4.0 field-notes build. Next: the DX cluster — markdown agent\nloader, graph-shape assertions, supervisor progress rollup, tool-call pacing.",
          "is_bot": false,
          "headline": "feat(core): human gates — a deliberate pause/resume node, wired to Ag…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-02T23:25:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "002d20b555ff67eca25e88a0344bf8aebdc2a5ff",
          "body": "…arts; run-level ground default\n\n## Why\n\nTwo more consumer workarounds absorbed. First, the handoff protocol was\nhalf-owned: the library appends the ===HANDOFF=== instruction and parses the\nreply internally, but consumers writing an outcome mapper received the raw\ntext with the handoff block still e\n[…]\nct the handoff contract into it.\n\n## What Next\n\nWave 4 of the 0.4.0 field-notes build. Next: the human gate — a deliberate\npause/resume node, which requires paused-status propagation through loop/dag.",
          "is_bot": false,
          "headline": "feat(core): export the handoff contract; outcome mapper gets parsed p…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-02T22:49:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab0ca0c632fc18c449e80419846b1bd8403558c4",
          "body": "… threading\n\n## Why\n\nThe heaviest workaround in the field notes: to pin DATABASE_URL/REDIS_URL for\none pipeline stage the consumer dropped to raw execFileSync with a custom env,\nand for the stage whose subprocess is spawned by an agent leaf they mutated\nglobal process.env before the run — the framew\n[…]\n that trade-off needs its own decision.\n\n## What Next\n\nWave 3 of the 0.4.0 field-notes build. Next: export the handoff parser and\ngive the outcome mapper pre-handoff text; run-level grounding default.",
          "is_bot": false,
          "headline": "feat(core): env overlay — withEnv(), per-call env options, engine env…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-02T22:33:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c25a756d0ffdc160b3308eaf645b742bf25bc2a",
          "body": "…ons; gate-failure stall channel\n\n## Why\n\nThree field-note gaps from the first large consumer, all one theme: the loop\nknew WHY it was not converging but threw that evidence away. (1) When a\ndeterministic until gate failed (tests red), the next body iteration had to\nre-run the command itself to lear\n[…]\nnotes build. The gate channel + lastGate compose:\na fix-up body reads ctx.lastGate.output instead of re-running the gate, and\nthe stall detector can now catch same-failure flailing. Next: env overlay.",
          "is_bot": false,
          "headline": "feat(core): thread gate diagnostics to the next iteration; judge opti…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-02T22:06:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "398faf3d60029321ca3010731eed3293d6c857be",
          "body": "… block dependents\n\n## Why\n\nField notes from the first large consumer (a 24-stage OEM connector pipeline\nbuilt on 0.3.0) surfaced two dag-layer gaps. First, the consumer hand-rolled an\nentire stage-descriptor + composer layer (ordered named stages, linear needs\nchaining, per-stage when/optional, a m\n[…]\ns). Later waves thread\ngate output into the loop body, add an env overlay, wire human gates to a real\npause/resume, and build the DX layer (markdown agent loader, graph assertions,\nsupervisor rollup).",
          "is_bot": false,
          "headline": "feat(core): pipeline() stages primitive; optional producers no longer…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-02T21:41:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "58c63c6e632e1e0a52072ed49357e8d3cfec877d",
          "body": "The npmjs.com package settings name this repo + workflow as a trusted\npublisher, so the NPM_TOKEN plumbing goes away — and has to: setup-node's\nregistry-url writes an .npmrc token line that shadows OIDC, and with no\nsecret it resolves to an empty token that fails ENEEDAUTH before OIDC is\nattempted. OIDC publish also needs npm >= 11.5.1, which the Node 20\nrunner's bundled npm 10 predates, hence the upgrade step.",
          "is_bot": false,
          "headline": "ci: switch the release publish to npm trusted publishing (OIDC)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T11:45:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a566af4aad59c91f5c9bab1367ee3e870baadfd",
          "body": "The tag-push trigger stays the primary path; the manual trigger covers\nre-running a failed publish and releasing from an environment whose git\nremote accepts commit pushes but rejects tag refs.",
          "is_bot": false,
          "headline": "ci: allow manual release runs via workflow_dispatch",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T11:40:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8a897b0bb784b0c26a991ac7582ddac703787b4",
          "body": null,
          "is_bot": false,
          "headline": "0.3.0",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T11:38:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "501d5919a8ef8819cd2b468f0aa43430b8aba8bb",
          "body": "The gate detects success; max and budget bound attempts and cost. None of\nthem can tell slow-but-real convergence from the same failure five turns\nrunning, so a doomed loop burns everything it was given before stopping.\n`LoopConfig.noProgress` is that missing sensor: the loop ends `exhausted`\nonce `\n[…]\nommander's `--no-`\nnegation), `loops describe` renders the cap, ProgressTracker +\nworkspaceFingerprint exported for custom harnesses. Offline demo:\n`npm run example:stall`. 27 new deterministic tests.",
          "is_bot": false,
          "headline": "feat(core): no-progress (stall) detection — the third hard stop",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T10:23:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76ca7767661ead7e5a3f25991728a832aeb6fbfc",
          "body": "The npm version bump wrote 0.2.0 into the lockfile too; commit it alongside the\npackage.json bump so the two never drift.",
          "is_bot": false,
          "headline": "chore: sync package-lock.json to 0.2.0",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T13:25:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3351ddfbce0a56b5a14282f2d1dd101865196dcc",
          "body": "The prior correction wrongly documented `npm publish` by hand as the release\npath. The canonical flow is CI: npm version + git push --follow-tags fires\nrelease.yml, which typechecks, tests, and publishes with provenance. It needs an\nNPM_TOKEN secret; until that is set the CI publish fails and a hand publish is the\nfallback (no provenance). Note that gap so it is not mistaken for a version\nconflict.",
          "is_bot": false,
          "headline": "docs: describe the CI release flow (release.yml), not manual publish",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T13:23:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2bef831aa5cca612c99bfb91b323061742e4df39",
          "body": "The Develop/Consumption sections described the pre-release state (private:true\nguard, no build step, exports at src/api.ts, npm release still pending). After\nthe 0.2.0 publish those are wrong: the published package is built with tsup to\ndist/ and its exports point there, and @loops-adk/core is on npm. Document\nbuildless dev via tsx vs the built published artifact, the real release flow, and\nconsumption as either an npm install or a git submodule.",
          "is_bot": false,
          "headline": "docs: correct the publish and build notes in the agent guide",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T13:20:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0faa99b6d4933e59e0debde4816755b99f8f0c6d",
          "body": "Publish the first release carrying the feedback-protocol reshape (breaking:\nOutcome.kickback removed, reviewPanel severity dropped, graphContext boolean),\nthe honest records stream, the dag-node attempt records, the agent skills, and\nthe benchmark harness. 0.1.1 was already on npm; 0.2.0 signals the breaking\nchanges in 0.x.",
          "is_bot": false,
          "headline": "chore(release): v0.2.0",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T13:17:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "056845464da5f02f3bd1d37b86499e7ae294ed7f",
          "body": "Brings feat/benchmark-harness (a benchmark harness plus demos, and codex-engine\nwiring for live runs) onto main after the feedback-protocol work landed. The two\nlines were independent apart from README.md and src/cli.tsx, which git auto-merged\ncleanly; verified green (main + bench typecheck, 227 tes\n[…]\n-gates reviewPanel docs. src/cli.tsx combines the branch's\nengine-help-text edits with the new records command. No conflict markers; the\nbenchmark work and the git-memory refactor touch disjoint code.",
          "is_bot": false,
          "headline": "merge: benchmark harness + codex engine into main",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T13:06:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ebabf2053956997b8e3fa8cd0ef6030b05e78b5f",
          "body": "… and README\n\n## Why\nThe branch added an agent-facing surface (AgentDef contracts, reviewPanel and\nconsumeFeedback, describe --json, supervised runs with a records stream) that the\nauthoring guide did not teach, and author-loop was stale: it told agents to parse\n`run --json` and only mentioned list/\n[…]\ntion, and cross-links the two new skills.\n- README: an end-to-end agent-workflow block; the reviewPanel and graphContext docs\n  updated for the every-reviewer-gates model and the boolean graphContext.",
          "is_bot": false,
          "headline": "docs: add supervise and design-agent-team skills, refresh author-loop…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T12:51:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35f9dcec26eb7c8483620c4ed00967a8d3fe7077",
          "body": "## Why\nThe feedback/records reshape needed runnable, deterministic proof, not just\npassing tests, that each behaviour holds end to end with no API key.\n\n## What\n- feedback-pipeline.loop.ts: a DAG that in one offline run shows a bare-function\n  node getting a completion, a `when`-skipped node staying\n[…]\ne body reads\n  ctx.lastReview.revision.\n- contracted-agent.loop.ts updated for the dropped severity tier and the boolean\n  graphContext; its simplicity reviewer now passes so the loop still converges.",
          "is_bot": false,
          "headline": "docs(examples): offline proofs for the feedback and records model",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T12:51:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b63bc79d50a81fdd81bd85532e29ae6abc74ba7d",
          "body": "…ecords honest\n\n## Why\nA max-effort review of this branch found the semantic records stream, the\ndocumented primary agent read API, was dishonest: a loop review that EXHAUSTED\nthe loop (hit max/maxReviewRestarts and never re-ran) was still recorded\ndecision:'accepted', so a supervisor reading `loops\n[…]\nemoved (use Outcome.revision); reviewPanel\nreviewers no longer take `severity` and every reviewer gates; an empty reviewPanel\nthrows; agentJob.graphContext is now a boolean, not the string 'position'.",
          "is_bot": false,
          "headline": "refactor(feedback)!: unify revisions, drop advisory reviewers, make r…",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T12:51:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2e3049b3a24e70e66ee001e5a82e3068c1bd7c8",
          "body": "Agents need to understand feedback routing while a run is live, without reconstructing it from raw logs or registry paths.\n\nRender DAG kickback decisions in tail, add path, since, and last filters to semantic records, and add a runnable contracted-agent example that shows contracts and feedback surfacing together.",
          "is_bot": false,
          "headline": "feat(cli): improve agent run inspection",
          "author_name": "Jonny Neill",
          "author_login": "jonny981",
          "committed_at": "2026-07-01T09:48:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 7,
      "commits_last_year": 208,
      "latest_release_at": "2026-07-17T18:34:59Z",
      "latest_release_tag": "v0.10.0",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 5,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 1.3
    },
    "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": [
        {
          "name": "@loops-adk/core",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "agent",
            "agents",
            "agent-loop",
            "agent-orchestration",
            "agent-workflow",
            "multi-agent",
            "agent-memory",
            "git-as-memory",
            "loop",
            "loops",
            "convergence",
            "convergence-loop",
            "done-gate",
            "ai",
            "llm",
            "claude",
            "codex",
            "orchestration",
            "typescript"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@loops-adk/core",
          "is_deprecated": false,
          "latest_version": "0.10.0",
          "repository_url": "https://github.com/jonny981/loops",
          "versions_count": 14,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2383,
          "first_published_at": "2026-06-26T18:20:42.530000Z",
          "latest_published_at": "2026-07-17T18:34:58.159000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 11,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "bench/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 58100,
      "source_files_sampled": 227,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 18614
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@anthropic-ai/claude-agent-sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.3.185"
        },
        {
          "name": "@anthropic-ai/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.105.0"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.0.0"
        },
        {
          "name": "execa",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.6.1"
        },
        {
          "name": "ink",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.1.0"
        },
        {
          "name": "ms",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.3"
        },
        {
          "name": "p-limit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.3.0"
        },
        {
          "name": "p-retry",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.0.0"
        },
        {
          "name": "p-timeout",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.1"
        },
        {
          "name": "picocolors",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.1"
        },
        {
          "name": "react",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.2.7"
        },
        {
          "name": "toposort",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.2"
        },
        {
          "name": "tsx",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.22.4"
        },
        {
          "name": "yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.9.0"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "jonny981",
          "commits": 160,
          "avatar_url": "https://avatars.githubusercontent.com/u/10325708?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 48,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.769
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "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": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 3,
            "reason": "7 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "04b2df1b6b74c5525b2012bea665e648e9510dcf",
        "ran_at": "2026-07-23T01:20:44Z",
        "aggregate_score": 2.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-18T22:36:36Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/jonny981/loops",
    "host": "github.com",
    "name": "loops",
    "owner": "jonny981"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 50,
      "inputs": {
        "security": 27,
        "vitality": 75,
        "community": 38,
        "governance": 38,
        "engineering": 66
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 208,
              "human_commit_share": 1,
              "days_since_last_push": 1,
              "active_weeks_last_year": 5
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "5/52 weeks with commits",
                "points": 3.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "208 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 208
                    }
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 7,
              "latest_release_tag": "v0.10.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 1.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "7 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 38,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "forks": 0,
              "stars": 11,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "11 stars",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "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
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 56,
            "inputs": {
              "packages": [
                "@loops-adk/core"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2383
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,383 downloads/month across npm",
                "points": 45,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2383,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 38,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 23,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.769
            },
            "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 77% of commits",
                "points": 5.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 77
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "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": 44,
            "inputs": {
              "followers": 11,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "jonny981",
              "public_repos": 4,
              "account_age_days": 4225
            },
            "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": "11 followers of jonny981",
                "points": 7.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 11,
                      "login": "jonny981"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~11 yr old",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@loops-adk/core"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "14 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 66,
        "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": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 27,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 2.8
            },
            "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 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "7 existing vulnerabilities detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 0.97,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 18614
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "97 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 97,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "bench/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.35,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "bench/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "bench/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "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": "35 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 35,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 58100,
              "source_files_sampled": 227,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/227 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 227,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@loops-adk/core@0.10.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T01:20:48.948863Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jonny981/loops.svg",
  "full_name": "jonny981/loops",
  "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 Statistikennpm.