Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-24 14:03 UTC

dotty-cps-async / dotty-cps-async

experimental CPS transformer for dotty

ScalaApache-2.0★ 195 Sterne⑂ 22 Forksseit Jan. 2020Auf GitHub ansehen ↗

dotty-cps-async/dotty-cps-async erreicht einen Gesundheitsindex von 64 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (83/100) ab, am schwächsten bei AI Readiness (44/100). Zuletzt vor 8 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

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

64
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

dotty-cps-asyncOrganisation
1 Follower8 öffentliche Reposseit Juli 2024

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Metriken nach Kategorie

Vitalität

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

83Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
28.8/36Push-Aktualität — letzter Push vor 8 Tagen
14.5/36Commit-Rhythmus — 21/52 Wochen mit Commits
18/18Commit-Volumen — 132 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year132
human_commit_share0,99
days_since_last_push8
active_weeks_last_year21

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 20 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 6 Tagen
27/27Release-Rhythmus — ein Release etwa alle 44,3 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count20
latest_release_tag1.3.4
releases_from_tagsnein
days_since_latest_release6
mean_days_between_releases44,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?

68Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
37.1/60Stars — 195 Stars
11/25Forks — 22 Forks
5.6/15Watcher — 11 Watcher
Verwendete Eingangsdaten
forks22
stars195
watchers11
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
18/18CONTRIBUTING-Leitfaden
13.5/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductja
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

51Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
1.1/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 95 % der Commits
13.5/13.5Breite der Beitragenden — 10 Beitragende
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Verwendete Eingangsdaten
bus_factor1
contributors_sampled10
top_contributor_share0,951
Wie die Bewertung erfolgt
44.5/46.8Issue-Lösungsquote — 95 % der Issues geschlossen
38.2/38.3PR-Annahme — 49/49 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/21 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs49
open_issues3
closed_issues60
issue_closed_ratio0,952
closed_unmerged_prs0
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
2.2/25Reichweite des Inhabers — 1 Follower von dotty-cps-async
10.9/25Kontohistorie — 8 öffentliche Repos, Kontoalter ca. 1 Jahre
Verwendete Eingangsdaten
followers1
owner_typeOrganization
is_verified
owner_logindotty-cps-async
public_repos8
account_age_days722

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

72Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 6 out of 7 merged PRs checked by a CI test -- score normalized to 8
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

85Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 9 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsscala, async, dotty, cps, transformation, monad, continuation, scala-async, scala-js
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?

45Gefährdet · 16 % des Gesamtindex

Sicherheitslage

45Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
2/2.5CI-Tests — 6 out of 7 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/21 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
7.5/7.5Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, 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.

44Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
31.2/40Lesbare Commit-Historie — 58 von 99 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,586
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Scala (statisch typisiert)
0/10Reproduzierbare Umgebung
2/10Belegte Agentenpraxis — 1 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,01
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Scala (statisch typisiert)
54.8/55Handhabbare Dateigrößen — 2/620 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageScala
largest_source_bytes80.940
source_files_sampled620
oversized_source_files2
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

195GitHub-Sterne
10Mitwirkende
132Commits, letzte 12 Monate
8Tage seit letztem Push
20Releases
1Bus-Faktor
3offene Issues
Paket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 22 ⇿
0Sterne
22Forks
8Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

048121620242222020-012022-072025-01
Major 1Minor 0Patch 6

Jeder Punkt umfasst 5 Tage.

OpenSSF Scorecard 4.5 / 10
4.5Gesamtwert

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-24 14:03 UTC

10Binary-Artifactsno binaries found in the repo
k. A.Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
8CI-Tests6 out of 7 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/21 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
10Maintained30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Alle Abhängigkeiten 0

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 0 direkte und 0 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
Abhängigkeits-Advisories nicht bewertet

Der Advisory-Abgleich konnte für diesen Bericht nicht ausgeführt werden: No resolved dependencies to assess

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "scala",
        "async",
        "dotty",
        "cps",
        "transformation",
        "monad",
        "continuation",
        "scala-async",
        "scala-js"
      ],
      "is_fork": false,
      "size_kb": 20386,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Scala": 1633371
      },
      "pushed_at": "2026-07-16T12:47:32Z",
      "created_at": "2020-01-01T06:44:14Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-13T08:36:16Z",
      "description": "experimental CPS transformer for dotty",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "master",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Scala",
      "significant_languages": [
        "Scala"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "dotty-cps-async",
      "company": null,
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/177147019?v=4",
      "created_at": "2024-07-31T16:38:31Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 722
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "1.3.4",
          "kind": "patch",
          "published_at": "2026-07-18T12:30:14Z"
        },
        {
          "tag": "1.3.3",
          "kind": "patch",
          "published_at": "2026-05-17T07:19:14Z"
        },
        {
          "tag": "1.3.2",
          "kind": "patch",
          "published_at": "2026-04-11T17:29:45Z"
        },
        {
          "tag": "1.3.1",
          "kind": "patch",
          "published_at": "2026-03-02T15:48:04Z"
        },
        {
          "tag": "1.3.0",
          "kind": "minor",
          "published_at": "2026-02-01T10:15:43Z"
        },
        {
          "tag": "1.2.0",
          "kind": "minor",
          "published_at": "2025-12-28T18:47:37Z"
        },
        {
          "tag": "1.1.5",
          "kind": "patch",
          "published_at": "2025-11-15T14:53:56Z"
        },
        {
          "tag": "1.1.4",
          "kind": "patch",
          "published_at": "2025-09-11T20:56:32Z"
        },
        {
          "tag": "1.1.2",
          "kind": "patch",
          "published_at": "2025-06-16T07:12:44Z"
        },
        {
          "tag": "1.1.0",
          "kind": "minor",
          "published_at": "2025-06-14T09:56:08Z"
        },
        {
          "tag": "1.0.3",
          "kind": "patch",
          "published_at": "2025-06-12T06:47:58Z"
        },
        {
          "tag": "1.0.2",
          "kind": "patch",
          "published_at": "2025-05-06T18:04:27Z"
        },
        {
          "tag": "1.0.0",
          "kind": "major",
          "published_at": "2025-01-19T10:31:06Z"
        },
        {
          "tag": "0.9.22",
          "kind": "patch",
          "published_at": "2024-09-07T17:43:27Z"
        },
        {
          "tag": "0.9.22-lts",
          "kind": "prerelease",
          "published_at": "2024-09-07T17:44:55Z"
        },
        {
          "tag": "0.9.21",
          "kind": "patch",
          "published_at": "2024-04-02T17:20:09Z"
        },
        {
          "tag": "0.9.20",
          "kind": "patch",
          "published_at": "2024-01-30T17:17:56Z"
        },
        {
          "tag": "0.9.19",
          "kind": "patch",
          "published_at": "2023-10-02T06:27:24Z"
        },
        {
          "tag": "0.9.18",
          "kind": "patch",
          "published_at": "2023-08-21T11:29:02Z"
        },
        {
          "tag": "0.9.17",
          "kind": "patch",
          "published_at": "2023-06-11T11:14:40Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b94d412120228af5321c20223c633a54c153ebe7",
          "body": null,
          "is_bot": false,
          "headline": "bump version to 1.3.4",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-07-13T08:35:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc8ece190ceb2491c29dcd05f4470a191ef82cec",
          "body": null,
          "is_bot": false,
          "headline": "update sbt to 1.12.12",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-07-13T08:35:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2170e4fa543b6c48eec2e32bee5b26867aed53d5",
          "body": null,
          "is_bot": false,
          "headline": "docs: bump version references to 1.3.4, add 1.3.4 changelog",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-07-13T08:34:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aea0f480e2f0d4d57a2246439d8cd5038e52d2bf",
          "body": "…karound",
          "is_bot": false,
          "headline": "docs: scaladoc parallel-doc bug fixed in 3.3.8, drop publishLocal wor…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-07-12T19:47:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90797a4cb9bb0e2a9342a346778a6e750fe05e95",
          "body": null,
          "is_bot": false,
          "headline": "add .sbtopts with 8g heap: sbt default 1g GC-thrashes on native build",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-07-12T19:47:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "594c5e449c143dddf6d3c3024e2ade4e1189bfb5",
          "body": null,
          "is_bot": false,
          "headline": "update scala to 3.3.8, cross-versions to 3.8.3/3.8.4",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-07-12T19:36:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afd39c8741305914fa7aaf037bc3273e275af012",
          "body": null,
          "is_bot": false,
          "headline": "update scala-native to 0.5.12",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-07-12T19:36:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d63748f8e739fa00013d1d5ae134d580b29c7f1d",
          "body": null,
          "is_bot": false,
          "headline": "bump scala-js to 1.22.0, scalajs-env-nodejs to 1.6.0",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-07-12T17:30:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fb5e5a1b340980531173f285738f0bc7dd8a980",
          "body": null,
          "is_bot": false,
          "headline": "changelog: mention PoorManEffect test deadlock fix",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-16T19:07:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ce23c26952947ccc13c75c87814a673fa46f7b7",
          "body": "Replace local 'blocked' flag with a global activeCarriers AtomicInteger\non Runner. blockOn decrements before parking and spawns a virtual-thread\nreplacement when no carrier remains; increments back after unparking.\nawait keeps a 500ms timeout poll as defensive backstop via rt.activate().",
          "is_bot": false,
          "headline": "fix PoorManEffect Runner deadlock when carrier exits between awaits",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-16T19:06:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c24b08091d02988f4b58a7feb458e27610fd9a8b",
          "body": null,
          "is_bot": false,
          "headline": "add changelog for 1.3.2",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-16T16:06:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b657b59dcd9860bcad9402d5f2349ed7fac91e8d",
          "body": null,
          "is_bot": false,
          "headline": "1.3.3",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-16T16:06:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6992097d555db8a392acd612a48f2f58b485f44",
          "body": null,
          "is_bot": false,
          "headline": "bump sbt-scala-native to 0.5.11",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-16T16:04:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8acc490173105a78b44f273b8947faf23aea1ee8",
          "body": null,
          "is_bot": false,
          "headline": "bump sbt to 1.12.11",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-16T16:04:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adf3f214350d00ddb8f92d679077dc0ad54849d8",
          "body": "Fix breaks asyncshift",
          "is_bot": false,
          "headline": "Merge pull request #135 from dotty-cps-async/fix-breaks-asyncshift",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-11T06:40:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97e8e16264d9af7f04cd6de273a567a911fe5982",
          "body": "Mirror the macro-side rewrite of `Breaks.break()` and `Breaks.breakable { ... }`\non the compiler-plugin path. Four tests in `cps.TestBS1ShiftBreaks`\n(`testBreakableHonoursBreak`, `testBreakableMultipleAwaitsBeforeBreak`,\n`testBreakableThroughStableAlias`, `testUserNonFatalCatchInsideBodyDoesNotSwall\n[…]\ns on `qual.tpe <:< Breaks.termRef` to accept the companion and\n  stable aliases but reject per-instance `new Breaks` (out of scope, per #134).\n\n`sbt compilerPluginTestsJVM/test`: 521 passed, 0 failed.",
          "is_bot": false,
          "headline": "Add Breaks support to the compiler plugin",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-11T06:25:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fbe7cc3ca5b444f748e1cc0eb93a59cd10b0231d",
          "body": "`Wait.flatMapTry` and `Thunk.flatMapTry` on JS invoked the continuation\ndirectly, so a synchronous throw from `op(x)` / `f1(x)` escaped the\nComputationBound boundary instead of becoming an `Error`. The JVM\ncounterpart already guards both call sites with `ComputationBound.tryOp`.\n\nThis was latent unt\n[…]\nkable`'s\nunwrap branch and surfaced as a plain `Failure(wrapper)`.\n\nMirror the JVM definition: introduce `ComputationBound.tryOp` and wrap\nthe inner `op(x)` / `f1(x)` calls in both `flatMapTry` paths.",
          "is_bot": false,
          "headline": "Catch synchronous throws in JS ComputationBound flatMapTry",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-11T05:13:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d383f9cae31eec5bde2d887ffc2d71cc32c0247a",
          "body": "Route Breaks.break() through BreaksAsyncShift end-to-end",
          "is_bot": false,
          "headline": "Merge pull request #134 from dotty-cps-async/route-break-through-shift",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-11T04:41:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd48f806b0011d57bd963a3690fafa0e2fece3c4",
          "body": "The earlier dispatch matched only direct Breaks.break() / Breaks.breakable\ncalls. Stable aliases of the singleton (val b = Breaks; b.break()) were\nmissed even though they refer to the exact same object, because b.symbol\nis the local val, not the module symbol.\n\nMatch obj.tpe <:< Breaks.type instead.\n[…]\ntype is the class Breaks, not the singleton) are still\nexcluded, as intended.\n\nAdd testBreakableThroughStableAlias as a regression.\n\nPer review feedback from @copilot-pull-request-reviewer on PR #134.",
          "is_bot": false,
          "headline": "Match Breaks dispatch by qualifier type, not by qualifier symbol",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T21:40:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ee8e5cf5193373f944523efd4025bcefe17c3103",
          "body": "Fix ArrayOpsAsyncShift.lastIndexWhere not clamping end",
          "is_bot": false,
          "headline": "Merge pull request #133 from dotty-cps-async/fix-last-index-where-clamp",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-10T20:17:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5d6e36c3ae7d8fee4d18070da2327eaecf2aad3",
          "body": "Fix BreaksAsyncShift.breakable discarding the body computation",
          "is_bot": false,
          "headline": "Merge pull request #131 from dotty-cps-async/fix-breaks-asyncshift",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-10T20:17:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4532d27db6de3866db9936dc0c22829e7ed4a9b1",
          "body": "Follow-up to PR #131. BreakControl extends ControlThrowable, which NonFatal\nexcludes; so a Breaks.break() thrown inside a flatMap callback escapes the\nmonad before the shift's failure branch can route it. Mirror the existing\nNonLocalReturns machinery:\n\n- Runtime: add BreaksAsyncShift.break(o: Breaks\n[…]\nt swallow\n  the wrapper.\n\n- ApplyTreeTransform dispatches the two new cases by symbol identity,\n  restricted to the Breaks companion (per-instance Breaks remains out\n  of scope per #132).\n\nCloses #132",
          "is_bot": false,
          "headline": "Route Breaks.break() through BreaksAsyncShift end-to-end",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T19:55:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a2271c13b20267aa6b46fd83ddb2b853c510c31",
          "body": "- Restore class BreaksAsyncShift and add object BreaksAsyncShift extends\n  BreaksAsyncShift (FutureCMAsyncShift pattern) so changing class to object\n  is no longer a binary-incompat for downstream code that did\n  new BreaksAsyncShift.\n- Wrap op() in try/catch so a synchronous throw from the body is \n[…]\n propagate instead of\n  being smuggled into m.error.\n- Add testBreakableHonoursSynchronousBreak covering the case where break()\n  fires before any await — exercises the new sync ControlThrowable path.",
          "is_bot": false,
          "headline": "Address review feedback on PR #131",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T19:33:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9089c517a54e325c9f62f9428fe370273412ef6f",
          "body": "Fix UsingAsyncShift.apply leaking the resource on the failure path",
          "is_bot": false,
          "headline": "Merge pull request #129 from dotty-cps-async/fix-using-apply-leak",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-10T19:22:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df9b25d00caa2083151199bd19c1fe061bdd32d0",
          "body": "The shifted lastIndexWhere passed the user-supplied end straight into the\nrecursion, so an end past the last index threw IndexOutOfBoundsException on\nthe first view(i) instead of behaving like the standard library, which\nclamps end to length - 1.\n\nThanks to @haskiindahouse for the bug report and proposed fix.\n\nCloses #125",
          "is_bot": false,
          "headline": "Fix ArrayOpsAsyncShift.lastIndexWhere not clamping end",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T19:16:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47b73a8c97d3d979568ee1fdd9b50ce125937d0e",
          "body": "…sion\n\nPer review feedback from @copilot-pull-request-reviewer on PR #129.",
          "is_bot": false,
          "headline": "testUsingApplyClosesOnFailure: drop unused val and unreachable expres…",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T19:12:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0e98cce7bc0ec5b60b6094901c7537722529915",
          "body": "Fix TryAsyncShift.recover/recoverWith MatchError on unhandled exceptions",
          "is_bot": false,
          "headline": "Merge pull request #128 from dotty-cps-async/fix-try-recover-isdefinedat",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-10T19:10:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b81e1fabaa989de4e62d6ac07440e01020e83fb9",
          "body": "The shifted breakable invoked Breaks.breakable({ op() }), which value-discards\nop()'s F[Unit] to Unit, so the monadic body never participated in the\ncomputation chain. Run op() through flatMapTry, then route any thrown\nexception through Breaks.breakable so a real BreakControl is swallowed and\nother \n[…]\ndling\nthat requires the same ControlThrowableAsyncWrapper surgery\nNonLocalReturnsAsyncShift uses, and is out of scope here.\n\nThanks to @haskiindahouse for the bug report and proposed fix.\n\nCloses #124",
          "is_bot": false,
          "headline": "Fix BreaksAsyncShift.breakable discarding the body computation",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T19:05:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e03238663669a6936a371b625c762bb70c4d1e4",
          "body": "Fix IndexedSeqAsyncShift.indexWhere ignoring the from parameter",
          "is_bot": false,
          "headline": "Merge pull request #130 from dotty-cps-async/fix-indexwhere-from",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-10T19:03:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51cc54d936ecba37e76b82c0bcf0dcddcc7e3464",
          "body": "scala.util.Try.recoverWith uses the same applyOrElse form. recover keeps the\nisDefinedAt shape because the matched and fallback branches have different\nresult types (F[U] vs F[Try[U]]) and applyOrElse cannot unify them cleanly —\nthis matches stdlib's Try.recover.\n\nPer review feedback from @copilot-pull-request-reviewer on PR #128.",
          "is_bot": false,
          "headline": "recoverWith: use applyOrElse to avoid double pattern match",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T18:57:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb47d0b16b44bac3f1b4e72c35b6bf4f8cccb121",
          "body": "The IndexedSeq-optimised override accepted from in its signature but started\nthe inner recursion at run(0), so the result could be smaller than from. Use\nrun(math.max(0, from)) to honour from while still treating negative values as\n0, matching the standard library.\n\nThanks to @haskiindahouse for the bug report and proposed fix.\n\nCloses #122",
          "is_bot": false,
          "headline": "Fix IndexedSeqAsyncShift.indexWhere ignoring the from parameter",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T18:53:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88e0e33399992d2082b4ce0ee15163d84fb9506f",
          "body": "The success continuation released the resource but the m.restore error\ncontinuation did not, so a failing body left the resource open. Switch to\nm.withAction(...)(release) — the same pattern the sibling resource/resources\nmethods already use — which releases on both success and failure.\n\nThanks to @haskiindahouse for the bug report and proposed fix.\n\nCloses #121",
          "is_bot": false,
          "headline": "Fix UsingAsyncShift.apply leaking the resource on the failure path",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T18:51:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9515e3d45d8b7e23133466ea59141d25b57f4759",
          "body": "Fix EitherAsyncShift.forall returning false for Left",
          "is_bot": false,
          "headline": "Merge pull request #127 from dotty-cps-async/fix-either-forall-left",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-10T18:50:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83a331abcb4932c20871e712d1b2e75a86d7453c",
          "body": "Both recover and recoverWith called pf(ex) without an isDefinedAt guard,\nturning an unmatched exception into a MatchError instead of preserving the\noriginal Failure as the standard library does.\n\nThanks to @haskiindahouse for the bug report and proposed fix.\n\nCloses #120",
          "is_bot": false,
          "headline": "Fix TryAsyncShift.recover/recoverWith MatchError on unhandled exceptions",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T18:45:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff2e91217f56f1db3f446e7675cec9f064ab0d50",
          "body": "Fix ArrayOpsAsyncShift.dropWhile returning head instead of empty when all match",
          "is_bot": false,
          "headline": "Merge pull request #126 from dotty-cps-async/fix-dropwhile-all-match",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-05-10T18:45:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cbdf7c3a456cf16c45219201f7cfaf2d4fc2cf2",
          "body": "scala.util.Either.forall is vacuously true for Left, but the async-shifted\nversion returned m.pure(false), silently flipping the result for any\nsomeEither.forall(asyncPredicate) inside async.\n\nThanks to @haskiindahouse for the bug report and proposed fix.\n\nCloses #119",
          "is_bot": false,
          "headline": "Fix EitherAsyncShift.forall returning false for Left",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T18:39:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95545fbd58fa931f47020140612c51029cd572dd",
          "body": "Agent-Logs-Url: https://github.com/dotty-cps-async/dotty-cps-async/sessions/fe10e656-4226-4538-98b3-e2426c59ea3f\n\nCo-authored-by: rssh <191250+rssh@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Fix typo in dropWhile empty-array assertion message",
          "author_name": "copilot-swe-agent[bot]",
          "author_login": "Copilot",
          "committed_at": "2026-05-10T18:34:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2fd1976da4b035d0ced0259c02bb42329474ce4",
          "body": "… all match\n\nThe iterator-exhausted branch used arr.slice(0, 1) where slice(0, 0) was\nintended, so dropWhile on an array whose every element matches the predicate\nreturned a one-element prefix instead of an empty array.\n\nThanks to @haskiindahouse for the bug report and proposed fix.\n\nCloses #123",
          "is_bot": false,
          "headline": "Fix ArrayOpsAsyncShift.dropWhile returning head instead of empty when…",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-05-10T18:29:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "636274a3ddb59b0e918b449d04155db7c8081588",
          "body": null,
          "is_bot": false,
          "headline": " 1.3.2",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-04-11T17:00:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdb374040ea05cce8862cab80e0af60851a8eebd",
          "body": null,
          "is_bot": false,
          "headline": "Fix flattenObserver stack overflow on Scala Native",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-04-11T13:53:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d285d009bd2827be538a30f4eb995aad6d6603fa",
          "body": "…pe tests",
          "is_bot": false,
          "headline": "Add Option.filterNot async shift, fix unchecked warnings in opaque ty…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-04-11T13:17:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3c5378f8ee73408193dd49bbf420618d280cb4a",
          "body": null,
          "is_bot": false,
          "headline": "Add 3.8.3 to cross-compilation, update js.await TODO note",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-04-11T11:09:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8a49b22b9b413091fac9718804c58d517141ad2",
          "body": null,
          "is_bot": false,
          "headline": "Update sbt to 1.12.7",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-04-11T10:28:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7fdcaaa7fe8ea96aa883d993fff2006f89cf77af",
          "body": null,
          "is_bot": false,
          "headline": "Update Scala.js to 1.21.0",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-04-11T10:24:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df8a93588194aa9c758cd2d14116aa9af8854015",
          "body": null,
          "is_bot": false,
          "headline": "Add changelog for 1.3.1 release",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-03-02T14:47:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3695eb8576e2471bbae9c5b08c370852eb0d2d84",
          "body": null,
          "is_bot": false,
          "headline": "Remove stray debug printlns from tests",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-03-01T22:08:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdb20e12ca8f52ecf80e28169d627d4d0f72fffd",
          "body": null,
          "is_bot": false,
          "headline": "Buffer debug cancellation log, only dump on test failure",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-03-01T21:56:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e742b1517979bc27db8748f319623236e41aa5ce",
          "body": "…3.7/3.8.2",
          "is_bot": false,
          "headline": "Add collect, fold to OptionAsyncShift; update cross-compilation to 3.…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-03-01T21:01:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5dad4deb93781d6e776ff292058c87155cde84f",
          "body": null,
          "is_bot": false,
          "headline": " added note in test",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-14T14:10:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0060658b1c69316320a94d4d08804b2086591dbf",
          "body": null,
          "is_bot": false,
          "headline": " 1.3.1-SNAPSHOT",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-14T14:10:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1346d364dfd0aa87b26b8ab0845902a925c6ebab",
          "body": "Avoid Select.copy in changeSymsInTree which converts DerivedName\n(DefaultGetterName) to SimpleName, causing -Xcheck-macros failure.\nUse Select(qualifier, symbol) to preserve the original name kind.\n\nEnables case class copy with named args inside async blocks.",
          "is_bot": false,
          "headline": "Workaround for scala3#17445: preserve Select name kind in TreeMap",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-14T14:05:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38c9e335065be7e7a74b134f2946e49d0b02cdb8",
          "body": "… for scala3#17445\n\nDisable tests using case class copy with named args inside async\n(triggers TreeChecker \"symbols differ for p.copy$default$N\" with -Xcheck-macros).\nAdd standalone scala-cli reproduction in tests-cli/t2026_02_10_default_getter/.",
          "is_bot": false,
          "headline": "Add commented-out copy default getter tests and standalone reproducer…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-10T15:04:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47d4e481ff530f53201ad6361bab1e710a5cacde",
          "body": null,
          "is_bot": false,
          "headline": " 1.4.0-SNAPSHOT",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-10T09:22:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c121ab8bac34053668c25c2be99f5828ecc645f",
          "body": "These methods were missing from OptionAsyncShift while being available\nin EitherAsyncShift, IterableAsyncShift, and ArrayOpsAsyncShift.",
          "is_bot": false,
          "headline": "feat: add exists, forall, find to OptionAsyncShift",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-10T09:21:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccc3631ac2384a7b3c03066f4137bdfba5ab2eca",
          "body": null,
          "is_bot": false,
          "headline": "Update version references in docs to 1.3.0",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T10:30:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c841a25a67ac65396f68fcb6303aa914da968690",
          "body": null,
          "is_bot": false,
          "headline": "Move AutomaticColoring into Deprecated Features section",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T10:28:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d40b574431f0a74cc2a7073255fbdda5aaf2e739",
          "body": "Covers the CpsMonad typeclass hierarchy, minimal implementation example,\nconcurrent effect monads (CpsConcurrentEffectMonad), and stack-safe\ntailRecM with notes on why identity-like monads need an override.",
          "is_bot": false,
          "headline": "Add \"Writing your own monad\" documentation chapter",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T10:17:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d243dc8361b9cb4e454a6d22ebce656ece4640a3",
          "body": null,
          "is_bot": false,
          "headline": " 1.3.0",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T10:12:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca67db9d4cb18e3201687ffd7f2ae1d0c582b054",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 1.3.0 with build and dependency updates",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T09:42:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbb3f17ffc5b993b8b1cb0c5f49ec24e72c8daae",
          "body": "…unit-test-runtime\n\n- Cross-compile cps.jvm and cps.js for 3.8.1 to resolve scala.caps.retains\n  classpath conflict when building the compiler plugin with 3.8.1\n- Move cps.js dependency to test-only scope in compiler plugin\n- Skip publishing cps library for non-primary Scala versions\n- Update scalajs-junit-test-runtime 1.9.0 -> 1.20.2\n- Clean up compiler plugin crossScalaVersions (drop 3.7.2, 3.7.3; add 3.8.1)",
          "is_bot": false,
          "headline": "Add Scala 3.8.1 cross-compilation for compiler plugin, bump scalajs-j…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T09:27:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34e6b09d6d324fd1433eea9599102e0c292c540c",
          "body": null,
          "is_bot": false,
          "headline": " sbt 1.12.1",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T08:40:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b345d4d4dcd86ddb03a7e68cecfff7ac82a210ca",
          "body": null,
          "is_bot": false,
          "headline": " scala-native 0.5.10",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T08:33:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cfe4d8cd5aea58f08c25d9b528b19d7a45feda5",
          "body": null,
          "is_bot": false,
          "headline": "Disable debug logging in CompileIssue112 test",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T08:18:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2bba2ebd6cd4896710bbf90bf7540014c67a269",
          "body": null,
          "is_bot": false,
          "headline": "scala-js 1.20.2",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-02-01T08:17:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "862ce299c3b385195360cacac08a8c971979cc17",
          "body": null,
          "is_bot": false,
          "headline": "Add changelog for 1.3.0 release",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-31T21:27:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c10d75eca81246066d9eca4256b904e95843ae6",
          "body": "…rrides\n\nChange CpsLogicMonad.mObserveOne to propagate errors via\nobserverCpsMonad.error instead of silently returning None via toOption.\n\nRemove mObserveOne and mFoldLeftWhileObserveM overrides from\nCpsLogicStreamMonadBase — they were identical to the base trait\nimplementations.",
          "is_bot": false,
          "headline": "Propagate errors in mObserveOne and remove redundant LogicStreamT ove…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-31T20:56:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32fd58f8a0a73d5f91424c6415fee1a62adcad22",
          "body": "Add publishLocal section to CONTRIBUTING.md documenting the Scala 3.3.7\nscaladoc thread-safety bug and the workaround for local publishing.\n\nFix mFoldM type parameter order in LazyListCpsLogicMonad from [S, A] to\n[A, S] to match the base trait definition.",
          "is_bot": false,
          "headline": "Document scaladoc workaround and fix mFoldM type parameter order",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-31T20:50:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "409df289f6029969a021d6f6347951d62f7e1336",
          "body": "…sally\n\nReplace all flatMap(msplit(a)) { f } calls with withMsplit(a) { f } which\nuses flattenObserver(observerCpsMonad.map(fsplit(c))(f)). For LazyList\n(Observer=Identity) this becomes a direct call f(fsplit(c)), eliminating\nthe singleton flatMap that caused deep iterator chain buildup and stack\nov\n[…]\ngoes through trampolined fsplit.\n\nThis fixes the LazyList filter stack overflow and makes the per-operation\noverrides (interleave, fairFlatMap, ifte, once, limit) in\nLazyListCpsLogicMonad unnecessary.",
          "is_bot": false,
          "headline": "Add withMsplit to CpsLogicMonad to eliminate singleton flatMap univer…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-31T19:44:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5e1dcd268559304af3baaecda706fc3b6284a772",
          "body": "…safe fsplit\n\nRoute LogicStreamT.fsplit through a new lazyFsplit method that builds\nCpsLazyT nodes instead of recurring on the JVM stack. The CpsLazyT\ninterpreter uses tailRecM to evaluate the tree, making interleave\nobservation stack-safe for arbitrarily deep streams.",
          "is_bot": false,
          "headline": "Add SuspendableObserverProvider and trampolined lazyFsplit for stack-…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-31T19:01:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0f90ffb58acb9b95470ef6f70327be17783f7f2",
          "body": "- Add CpsLazyT[F[_], +A] sealed trait ADT with stack-safe interpreter\n  using FM.tailRecM, CpsTryEffectMonad instance, and CpsLazy type alias\n  for CpsLazyT[CpsIdentity, A]\n\n- Rewrite mFoldLeftWhileObserveM in CpsLogicMonad and\n  CpsLogicStreamMonadBase to use observerCpsMonad.tailRecM instead of\n  \n[…]\n\n  to Iterable and use lazy head/tail recursion instead of capturing a\n  mutable Iterator in by-name thunks (which caused element loss on\n  re-observation). Same fix applied to `all` and related APIs.",
          "is_bot": false,
          "headline": "Add CpsLazyT monad transformer and fix observer fold stack safety",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-31T18:16:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "37a845f63ce0c255c50fc0051933a776ea2ec9fb",
          "body": "Uses an explicit pending stack to avoid JVM stack overflow while\npreserving laziness through LazyList.cons/#::. Includes comprehensive\ntests for stack safety, branching, and lazy evaluation.",
          "is_bot": false,
          "headline": "Add stack-safe tailRecM implementation for LazyListCpsLogicMonad",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-20T08:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f002cd8d4f67730ebacfe54c097029092a657671",
          "body": "- Add debugCancellation flag to FutureScopeContext to log all cancel() calls\n- Enable debug logging in testRandomBehavious test\n- Remove impossible TimeoutException branch (timeout should never trigger\n  with 57 success URLs and 5 second timeout)\n- Add diagnostic output for any failure to help debug race condition\n\nWith ~57 success URLs (0-100ms delay), getting 10 should take <100ms.\nThe 5 second timeout should never trigger. CI failure suggests a race\ncondition that needs investigation.",
          "is_bot": false,
          "headline": "Add diagnostic logging for flaky TestTenUrls.testRandomBehavious",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T21:50:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f19b93bcd934a11e7943002d48babf32cbd795d",
          "body": "…e-either\n\nAdd stack-safe tailRecM for IterableCpsMonad and EitherCpsMonad",
          "is_bot": false,
          "headline": "Merge pull request #118 from dotty-cps-async/feature/tailRecM-iterabl…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T18:55:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d1c73945bc1610ec832693938d40f9c1ca81c5f",
          "body": null,
          "is_bot": false,
          "headline": "Fix style: remove parentheses from builder.result for consistency",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T18:54:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d8a90dd13f70bca52c3f50429b12f8eac714021",
          "body": "Override tailRecM in both EitherCpsMonad and EitherCpsTryMonad with\ntail-recursive implementations. Either is a single-value monad like\nIdentity, so the default flatMap-based implementation would overflow.\n\nAdded tests for:\n- Simple countdown\n- Early error termination (Left case)\n- Stack safety with 100K iterations",
          "is_bot": false,
          "headline": "Add stack-safe tailRecM implementation for EitherCpsMonad",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T18:41:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "475f3c9963e60a14282823b5eeadf8c2eaf0787b",
          "body": "Override tailRecM in IterableCpsMonad with an explicit pending stack\nto handle branching computations safely. Unlike identity monads,\ncollection monads can branch (one f(a) call returns multiple Either\nvalues), so we track all Left values in a pending list.\n\nAdded tests for:\n- Simple countdown in List context\n- Branching computations (binary tree traversal)\n- Stack safety with 100K iterations\n- Mixed results (some branches terminate early)\n- Empty branch pruning\n- All branches returning empty",
          "is_bot": false,
          "headline": "Add stack-safe tailRecM implementation for IterableCpsMonad",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T18:41:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6352d43e06c291d8ae4150ce652aa9e91df1707",
          "body": "Refactor tailRecM to use tail recursion instead of deprecated Either …",
          "is_bot": false,
          "headline": "Merge pull request #117 from dotty-cps-async/feature/tailRecM",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T17:00:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c24e09d3b9fee57ad1f28e186fe8a0949a41f035",
          "body": "…methods\n\nReplace `left.get` and `right.get` with pattern matching as suggested\nin PR review. Uses @annotation.tailrec for a more idiomatic Scala\nimplementation that avoids deprecated methods.",
          "is_bot": false,
          "headline": "Refactor tailRecM to use tail recursion instead of deprecated Either …",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T16:48:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fa74da3b70008e4c90340693572a6178fc9fb6c",
          "body": "Add tailRecM to CpsMonad for stack-safe monadic recursion",
          "is_bot": false,
          "headline": "Merge pull request #116 from dotty-cps-async/feature/tailRecM",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T15:37:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e3a6b99c29b6c864c2c171f583eed5dcbb9415c",
          "body": "…methods\n\nReplace `left.get` and `right.get` with pattern matching as suggested\nin PR review. Uses @annotation.tailrec for a more idiomatic Scala\nimplementation that avoids deprecated methods.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Refactor tailRecM to use tail recursion instead of deprecated Either …",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T14:56:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cf4bf1412e46288b6ea321213a4a5c67a1bbcd92",
          "body": "Adds tailRecM method to CpsMonad trait with a default flatMap-based\nimplementation. This enables stack-safe recursive computations for\nmonads that support it (TailRec, IO, Future, etc.).\n\nCpsIdentityMonad overrides with a while-loop implementation to ensure\nstack safety for the identity monad case.\n\nBinary compatible: existing CpsMonad implementations get the default.",
          "is_bot": false,
          "headline": "Add tailRecM to CpsMonad for stack-safe monadic recursion",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-19T13:57:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "850d194ca038dd8b3692dd75606af8d72f386650",
          "body": "- Change CpsThrowMonad[TailRec] to CpsTryMonad[TailRec]\n- Add flatMapTry method for proper Try support\n- Make error stack-safe with tailcall(done(throw e))\n- Add TestCBS1TailRec with 12 tests for try/catch/finally",
          "is_bot": false,
          "headline": "Upgrade TailRec monad to CpsTryMonad with try/catch/finally support",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-01-10T09:01:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e77cc9af2bc32f9de590971f165ae51d5d84c24",
          "body": "Add limit[A](a: M[A], n: Int): M[A] method to CpsLogicMonad trait that\nreturns a computation limited to the first N values, discarding the rest.\nAlso add corresponding extension method limit(n: Int) on M[A]",
          "is_bot": false,
          "headline": "Add limit method to CpsLogicMonad for taking first N elements",
          "author_name": "rssh",
          "author_login": "rssh",
          "committed_at": "2026-01-06T08:55:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cf30cfe1b2c02730d5901655d6a3736b869481f",
          "body": null,
          "is_bot": false,
          "headline": " 1.2.0 - SNAPSHOT",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2026-01-06T08:01:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a227b05d06b1305f26e5fba972eb036e188ec28",
          "body": "- Update dependency versions in BasicUsage.rst to 1.2.0\n- Update release version in conf.py to 1.2.0\n- Add changelog-1.2.0.md documenting CpsPreprocessor feature",
          "is_bot": false,
          "headline": "docs: update version references to 1.2.0 and add changelog",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-12-28T18:26:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc1cd5e38c6d2b8f2eb9579e7cfbc3e155b865a7",
          "body": "- Bump version to 1.2.0-SNAPSHOT\n- Disable debug output in macro code (set DEBUG = false)\n- Comment out @CpsDebugLevel annotations in test files\n- Remove unused inferAsyncArgApplyImpl function\n- Remove debug exception handling that only printed diagnostics\n- Fix typos in comments and error messages (denotations, caught, looks)\n- Guard remaining debug prints with debugLevel checks",
          "is_bot": false,
          "headline": "Prepare for 1.2.0 release: cleanup debug output and fix typos",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-12-28T17:24:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3eece1091e130a7aa9cfc519e476f7b90d454318",
          "body": "- Add docs/CpsPreprocessor.rst with user-facing documentation\n- Include complete tracing preprocessor example showing val logging\n- Add working test implementation (TracingPreprocessor, TracingPreprocessorMacro)\n- Add tests covering simple vals, await, strings, and reify/reflect syntax\n- Link documentation from docs/index.rst",
          "is_bot": false,
          "headline": "Add CpsPreprocessor user documentation with tracing example",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-12-24T09:30:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbe33bba18a8836e740b4c047267c758d3fd93db",
          "body": "…proach\n\nThe preprocessor's transparent inline macro was not expanding before CPS\ntransform analyzed the body. Fixed by restructuring async macro into:\n- Stage 1: transparent inline that applies preprocessor.preprocess inline\n- Stage 2: macro that does CPS transform on already-preprocessed body\n\nThis allows preprocessors to insert await calls that are properly recognized\nand transformed by the CPS transformation.",
          "is_bot": false,
          "headline": "Fix CpsPreprocessor to expand before CPS transform using two-stage ap…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-12-12T06:42:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee110102d216ab256561c84b4bd0a7688057e082",
          "body": "Verify that CpsPreprocessor is correctly invoked when using the\nreify[F] { ... .reflect } alternative syntax for async/await.",
          "is_bot": false,
          "headline": "Add tests for CpsPreprocessor with reify/reflect syntax",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-12-10T20:18:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd27ffea0c48de813457e6347902c977e2a66cec",
          "body": "…eprocessing\n\nChange CpsPreprocessor[F] to CpsPreprocessor[F, C] where C is the context type.\nThe preprocess method now receives ctx explicitly: preprocess[A](body: A, ctx: C): A\n\nThis enables preprocessors to use context-specific methods (e.g., DurableContext.cached)\nwithout requiring summon calls, since the context is passed directly to the macro.",
          "is_bot": false,
          "headline": "Add context type parameter to CpsPreprocessor for context-specific pr…",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-12-10T13:02:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3c9de17a2516f63656372b0245a16828d8ff8e7",
          "body": "Implements a preprocessing mechanism that allows monads to transform\nexpressions inside async blocks before CPS transformation occurs.\nPrimary use case is the Durable monad for replay-based execution.\n\nKey changes:\n- Add CpsPreprocessor[F[_]] trait with inline def preprocess[A](body: A): A\n- Macro p\n[…]\n Add helper methods in CpsTransformHelper for finding CpsPreprocessor\n- Add documentation in docs/design/CpsPreprocessor.md\n- Add tests for both macro path (cpsJVM) and plugin path (set24preprocessor)",
          "is_bot": false,
          "headline": "Add CpsPreprocessor typeclass for preprocessing async block bodies",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-12-09T21:49:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd63e89fd22108a7d635c20aa0a79537404d1834",
          "body": null,
          "is_bot": false,
          "headline": " 1.1.6-SNAPSHOT",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T16:30:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a24c8a181c894ff674f536dbfb43c5817263d82",
          "body": null,
          "is_bot": false,
          "headline": " berrer formatting fix",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T16:29:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c743b61edc6fc93326757335d7fabae83d54448",
          "body": null,
          "is_bot": false,
          "headline": " fixed code block formatting",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T16:28:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9b1ebf6994b5920f4e4f1b23f3990290ad75523",
          "body": null,
          "is_bot": false,
          "headline": "docs: update dependency versions in BasicUsage.rst to 1.1.5",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T16:25:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ada01c202d7c457c1916a699abcd40ba386e97b",
          "body": null,
          "is_bot": false,
          "headline": "docs: update release references",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T16:15:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b6cdb004caa2268d3432e28db309ad2468ffded",
          "body": null,
          "is_bot": false,
          "headline": "docs: add changelog for v1.1.5 and new process",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T14:37:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e8c6f5e32137dec125df6c4378c7f7756fd1594",
          "body": null,
          "is_bot": false,
          "headline": " relese 1.1.5",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T12:17:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "115707286a2c5db663c8ffe07b04661d2ea06009",
          "body": null,
          "is_bot": false,
          "headline": " attempt to fix potential race condition",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T12:00:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0790808259d9bfd62d3800f18647699275bcdc9e",
          "body": null,
          "is_bot": false,
          "headline": " added cross-compilation of compiler plugin to 3.7.4",
          "author_name": "Ruslan Shevchenko",
          "author_login": "rssh",
          "committed_at": "2025-11-15T11:59:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 20,
      "commits_last_year": 132,
      "latest_release_at": "2026-07-18T12:30:14Z",
      "latest_release_tag": "1.3.4",
      "releases_from_tags": false,
      "days_since_last_push": 8,
      "active_weeks_last_year": 21,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 44.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 22,
      "stars": 195,
      "watchers": 11,
      "fork_history": {
        "days": [
          {
            "date": "2020-01-16",
            "count": 1
          },
          {
            "date": "2020-04-27",
            "count": 1
          },
          {
            "date": "2020-06-05",
            "count": 1
          },
          {
            "date": "2020-09-01",
            "count": 1
          },
          {
            "date": "2020-11-17",
            "count": 1
          },
          {
            "date": "2020-12-24",
            "count": 1
          },
          {
            "date": "2021-04-20",
            "count": 1
          },
          {
            "date": "2021-04-23",
            "count": 1
          },
          {
            "date": "2021-04-27",
            "count": 1
          },
          {
            "date": "2021-07-26",
            "count": 1
          },
          {
            "date": "2022-01-17",
            "count": 1
          },
          {
            "date": "2022-02-22",
            "count": 1
          },
          {
            "date": "2022-12-30",
            "count": 1
          },
          {
            "date": "2023-02-23",
            "count": 1
          },
          {
            "date": "2023-03-10",
            "count": 1
          },
          {
            "date": "2023-05-27",
            "count": 1
          },
          {
            "date": "2023-11-26",
            "count": 1
          },
          {
            "date": "2024-01-31",
            "count": 1
          },
          {
            "date": "2024-06-01",
            "count": 1
          },
          {
            "date": "2024-08-26",
            "count": 1
          },
          {
            "date": "2024-12-20",
            "count": 1
          },
          {
            "date": "2025-01-27",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 22,
        "total_forks": 22
      },
      "star_history": null,
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 80940,
      "source_files_sampled": 620,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "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": [],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 49,
        "open_issues": 3,
        "closed_ratio": 0.952,
        "closed_issues": 60,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "rssh",
          "commits": 1640,
          "avatar_url": "https://avatars.githubusercontent.com/u/191250?v=4"
        },
        {
          "type": "User",
          "login": "olnkravchenko",
          "commits": 54,
          "avatar_url": "https://avatars.githubusercontent.com/u/53938870?v=4"
        },
        {
          "type": "User",
          "login": "nicolasstucki",
          "commits": 16,
          "avatar_url": "https://avatars.githubusercontent.com/u/3648029?v=4"
        },
        {
          "type": "User",
          "login": "michelou",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/1260870?v=4"
        },
        {
          "type": "User",
          "login": "piazzesiNiccolo",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/49978195?v=4"
        },
        {
          "type": "User",
          "login": "odersky",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/795990?v=4"
        },
        {
          "type": "User",
          "login": "ritschwumm",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/547138?v=4"
        },
        {
          "type": "User",
          "login": "mio-19",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/57285379?v=4"
        },
        {
          "type": "User",
          "login": "amitport",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1131991?v=4"
        },
        {
          "type": "User",
          "login": "WojciechMazur",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/19353690?v=4"
        }
      ],
      "contributors_sampled": 10,
      "top_contributor_share": 0.951
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "scala.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 8,
            "reason": "6 out of 7 merged PRs checked by a CI test -- score normalized to 8",
            "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/21 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": 10,
            "reason": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "b94d412120228af5321c20223c633a54c153ebe7",
        "ran_at": "2026-07-24T14:03:31Z",
        "aggregate_score": 4.5,
        "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-13T08:43:45Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-05-11T06:42:16Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 48,
          "created_at": "2021-07-28T04:45:34Z",
          "last_comment_at": "2021-08-01T19:28:29Z",
          "last_comment_author": "ScoreUnder"
        },
        {
          "number": 60,
          "created_at": "2022-07-09T09:55:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 109,
          "created_at": "2025-08-27T20:31:38Z",
          "last_comment_at": "2025-11-19T00:24:12Z",
          "last_comment_author": "benhutchison"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dotty-cps-async/dotty-cps-async",
    "host": "github.com",
    "name": "dotty-cps-async",
    "owner": "dotty-cps-async"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 64,
      "inputs": {
        "security": 45,
        "vitality": 83,
        "community": 68,
        "governance": 51,
        "engineering": 72
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 132,
              "human_commit_share": 0.99,
              "days_since_last_push": 8,
              "active_weeks_last_year": 21
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 8 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "21/52 weeks with commits",
                "points": 14.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 21
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "132 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 132
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "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": 20,
              "latest_release_tag": "1.3.4",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 44.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "20 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~44.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 44.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": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 11,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 11 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 11
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 68,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "forks": 22,
              "stars": 195,
              "watchers": 11,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "195 stars",
                "points": 37.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 195
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "22 forks",
                "points": 11,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 22
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "11 watchers",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "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 (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 51,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 10,
              "top_contributor_share": 0.951
            },
            "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 95% of commits",
                "points": 1.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "10 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "merged_prs": 49,
              "open_issues": 3,
              "closed_issues": 60,
              "issue_closed_ratio": 0.952,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "95% of issues closed",
                "points": 44.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "49/49 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 49,
                      "decided": 49
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/21 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "followers": 1,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "dotty-cps-async",
              "public_repos": 8,
              "account_age_days": 722
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1 followers of dotty-cps-async",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "dotty-cps-async"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~1 yr old",
                "points": 10.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 72,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "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": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "6 out of 7 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "scala",
                "async",
                "dotty",
                "cps",
                "transformation",
                "monad",
                "continuation",
                "scala-async",
                "scala-js"
              ],
              "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": "9 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 45,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.5
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "6 out of 7 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/21 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": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "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": 7
            },
            "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": "at_risk",
        "name": "AI Readiness",
        "value": 44,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.586,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "58 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 31.2,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 58,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.01,
              "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": "Scala (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Scala"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Scala",
              "largest_source_bytes": 80940,
              "source_files_sampled": 620,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Scala (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Scala"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/620 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 620,
                      "oversized": 2
                    }
                  }
                ],
                "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T14:03:47.700644Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dotty-cps-async/dotty-cps-async.svg",
  "full_name": "dotty-cps-async/dotty-cps-async",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistiken.