Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-25 20:50 UTC

clojure-emacs / clj-refactor.el

A CIDER extension that provides powerful commands for refactoring Clojure code.

Emacs Lisp · GherkinGPL-3.0★ 785 Sterne⑂ 111 Forksseit Jan. 2013Auf GitHub ansehen ↗

clojure-emacs/clj-refactor.el erreicht einen Gesundheitsindex von 64 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Community & Adoption (78/100) ab, am schwächsten bei AI Readiness (32/100). Zuletzt vor 9 Tagen aktualisiert. 2 Mitwirkende tragen 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

clojure-emacsOrganisation
91 Follower31 öffentliche Reposseit Juli 2013

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?

65Mittel · 22 % des Gesamtindex
Wie die Bewertung erfolgt
28.8/36Push-Aktualität — letzter Push vor 9 Tagen
2.8/36Commit-Rhythmus — 4/52 Wochen mit Commits
16.2/18Commit-Volumen — 63 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year63
human_commit_share1
days_since_last_push9
active_weeks_last_year4
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 4 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 9 Tagen
5.4/27Release-Rhythmus — ein Release etwa alle 776,4 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count4
latest_release_tagv4.0.0
releases_from_tagsnein
days_since_latest_release9
mean_days_between_releases776,4
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?

78Gut · 18 % des Gesamtindex
Wie die Bewertung erfolgt
46.9/60Stars — 785 Stars
17/25Forks — 111 Forks
7.7/15Watcher — 25 Watcher
Verwendete Eingangsdaten
forks111
stars785
watchers25
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (GPL-3.0)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
7.2/7.2Issue-Vorlage
6.3/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templateja
has_code_of_conductnein
has_pull_request_templateja

Nachhaltigkeit & Governance

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

68Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
25.2/54Bus-Faktor — 2 Beitragende decken die Hälfte aller Commits ab
14.2/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 37 % der Commits
13.5/13.5Breite der Beitragenden — 53 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 11 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor2
contributors_sampled53
top_contributor_share0,368
Wie die Bewertung erfolgt
43.2/46.8Issue-Lösungsquote — 92 % der Issues geschlossen
33.1/38.3PR-Annahme — 193/223 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/23 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs193
open_issues29
closed_issues347
issue_closed_ratio0,923
closed_unmerged_prs30
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
14.1/25Reichweite des Inhabers — 91 Follower von clojure-emacs
23/25Kontohistorie — 31 öffentliche Repos, Kontoalter ca. 13 Jahre
Verwendete Eingangsdaten
followers91
owner_typeOrganization
is_verified
owner_loginclojure-emacs
public_repos31
account_age_days4.749

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

63Mittel · 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
0/20OpenSSF Scorecard: CI-Tests — 0 out of 22 merged PRs checked by a CI test -- score normalized to 0
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 — 8 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsrefactorings, refactoring-functions, clojure, emacs, emacs-mode, emacs-lisp, cider, nrepl
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?

44Gefährdet · 16 % des Gesamtindex

Sicherheitslage

44Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
0/2.5CI-Tests — 0 out of 22 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/23 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 11 contributing companies or organizations
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 0 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,4
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.

32Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
32.5/40Lesbare Commit-Historie — 61 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,61
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
0/10Reproduzierbare Umgebung
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
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_languagenein
bootstrap_filesMakefile
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Emacs Lisp ohne Typprüfungs-Konfiguration
0/55Handhabbare Dateigrößen — keine Quelldateien erkannt
Verwendete Eingangsdaten
primary_languageEmacs Lisp
largest_source_bytes
source_files_sampled0
oversized_source_files0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Handhabbare Dateigrößen. Die verbleibenden Gewichte wurden renormalisiert.
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

785GitHub-Sterne
53Mitwirkende
63Commits, letzte 12 Monate
9Tage seit letztem Push
4Releases
2Bus-Faktor
29offene 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 ★ / 111 ⇿
0Sterne
111Forks
3Releases

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.

02040608010012011142013-012019-062025-10
Major 1Minor 1Patch 1

Jeder Punkt umfasst 12 Tage.

OpenSSF Scorecard 4.4 / 10
4.4Gesamtwert

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-25 20:49 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
0CI-Tests0 out of 22 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/23 approved changesets -- score normalized to 0
10Contributorsproject has 11 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 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": [
        "refactorings",
        "refactoring-functions",
        "clojure",
        "emacs",
        "emacs-mode",
        "emacs-lisp",
        "cider",
        "nrepl"
      ],
      "is_fork": false,
      "size_kb": 6796,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Gherkin": 90714,
        "Makefile": 605,
        "Emacs Lisp": 291005
      },
      "pushed_at": "2026-07-16T15:45:55Z",
      "created_at": "2013-01-30T06:44:10Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-16T15:46:26Z",
      "description": "A CIDER extension that provides powerful commands for refactoring Clojure code.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "GPL-3.0",
      "default_branch": "master",
      "license_spdx_raw": "GPL-3.0",
      "primary_language": "Emacs Lisp",
      "significant_languages": [
        "Emacs Lisp",
        "Gherkin"
      ]
    },
    "owner": {
      "blog": "https://cider.mx",
      "name": null,
      "type": "Organization",
      "login": "clojure-emacs",
      "company": null,
      "location": null,
      "followers": 91,
      "avatar_url": "https://avatars.githubusercontent.com/u/5080083?v=4",
      "created_at": "2013-07-24T09:34:37Z",
      "is_verified": null,
      "public_repos": 31,
      "account_age_days": 4749
    },
    "license": {
      "state": "standard",
      "spdx_id": "GPL-3.0",
      "raw_spdx": "GPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2026-07-16T15:46:13Z"
        },
        {
          "tag": "3.0.0",
          "kind": "major",
          "published_at": "2021-10-26T06:02:30Z"
        },
        {
          "tag": "v2.5.1",
          "kind": "patch",
          "published_at": "2021-02-16T09:58:24Z"
        },
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2020-02-29T11:07:34Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "2805bd5f505fdb199a8c5a25fca398ec9c161e5b",
          "body": null,
          "is_bot": false,
          "headline": "Release 4.0.0",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:45:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f759387d8ddede6dd768c08266476086efca80aa",
          "body": "With CIDER 2.0 out the door there's little reason to keep supporting\nyear-old CIDER releases in a new major version of clj-refactor. Bump\nPackage-Requires and drop the load-time defaliases that papered over\nthe pre-2.0 API names (cider-nrepl-send-sync-request,\ncider-ensure-connected).",
          "is_bot": false,
          "headline": "Require CIDER 2.0",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:28:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0171a1bfb00bb5c47403917c221e56bedc59ec9",
          "body": "The dep-slimming and alias removal shipped with the 4.0 work, and the\necukes suite is in fact wired into CI. Add the clojure-ts-mode vetting\nsweep and the eventual jack-in injection API migration as known work.",
          "is_bot": false,
          "headline": "ROADMAP: mark the finished cleanup items, add two new ones",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:13:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d6abf9aea4cd21f3c6067d521deca73f3833c6b",
          "body": "The setup instructions only mentioned clojure-mode-hook, so\nclojure-ts-mode users following them never got clj-refactor-mode\nenabled.",
          "is_bot": false,
          "headline": "README: document enabling clj-refactor-mode with clojure-ts-mode",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:13:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03dcf8b3ce41827fd644398d3d2d3273ff28fde0",
          "body": "The Version header said 3.12.0, cljr-version said 3.11.3, and the\nREADME compatibility table already talks about 4.0.0+. Set both to\n4.0.0-snapshot (the convention CIDER uses between releases); the\n-snapshot suffix gets dropped at the release cut. cljr-version is\nuser-visible - the middleware out-of-sync warning prints it.",
          "is_bot": false,
          "headline": "Align the version metadata ahead of 4.0",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:13:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61d131b96f19dc1b4ecb4ed401c26d19e55ec6fd",
          "body": "clojure-ts-mode installs a tree-sitter forward-sexp-function, which\nturns clojure-sort-ns's syntax-table-based walk into a silent no-op:\ncljr-clean-ns without a REPL reported success while leaving the ns\nform untouched (same for cljr-auto-sort-ns). Force the default sexp\nmovement around the sort. The proper fix belongs in clojure-sort-ns\nitself; this shields our two call sites until that lands.",
          "is_bot": false,
          "headline": "Fix the offline ns sort doing nothing in clojure-ts-mode",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T15:13:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c267fd9858e54d100d276d77e6eef03bb0689239",
          "body": null,
          "is_bot": false,
          "headline": "README: old refactor-nrepl works again, 3.13.0+ is just recommended",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1afc013c4bfadb6848d251c07ec5cc9f627d7d5a",
          "body": "CIDER 2.0's senders reject unsupported ops client-side, so when\nrefactor-nrepl isn't on the classpath the connect-time version probe\nsignaled a user-error from cider-connected-hook: the out-of-sync\nwarning never fired, the artifact-cache init was skipped, and the echo\narea showed a cryptic message blaming cider-nrepl. Report a failed\nprobe as a message and return nil, so the existing warning path kicks\nin instead.",
          "is_bot": false,
          "headline": "Don't error out of cider-connected-hook when the middleware is missing",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c76af580b59c3ba481247e66b477a36e7f7dce2",
          "body": "The switch to namespaced middleware ops silently broke every command\nagainst refactor-nrepl < 3.13.0, which only advertises the bare names.\nWorst hit was cljr-slash: its middleware-unavailable fallback is\ndeliberately quiet, so magic requires for project aliases just stopped\ndoing anything.\n\nResolve each op against the connection instead: prefer the canonical\nrefactor/ form and fall back to the bare name when only that is\nadvertised, mirroring what CIDER 2.0 does for its own legacy op names.",
          "is_bot": false,
          "headline": "Fall back to bare op names on old refactor-nrepl",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fda7cffff635facf057d4bf4901a8ad22184aae",
          "body": "Normalize all bullets to dashes, disable the line-length and\nduplicate-heading rules that don't fit a changelog, and wrap one\nbare issue URL.",
          "is_bot": false,
          "headline": "Make the changelog pass markdownlint",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c889b207b26ade7ba5917a0cfcd13fec333939f2",
          "body": "Mirrors the config used in CIDER.",
          "is_bot": false,
          "headline": "Add markdownlint config",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-16T12:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f11383b643a46bb41f657455a55900682e6baf1c",
          "body": "Three improvements found while auditing the middleware request/response\nshapes:\n\n- Use refactor-nrepl's namespaced op names (refactor/find-symbol, etc.)\n  instead of the bare ones. refactor-nrepl registers every op under both\n  forms, treats the namespaced one as canonical, and plans to drop the\n  b\n[…]\ner-language-context /\n  input-language-context since 3.7.0.\n\nValidated live against refactor-nrepl 3.14.0: op-support, version,\nrename, clean-ns and suggest-libspecs all work under the namespaced ops.",
          "is_bot": false,
          "headline": "Use namespaced middleware ops; tidy two request params",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T14:23:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9bdd019975fd2033d2c83e7129ddfeb9958c3739",
          "body": "The async operations (cljr-rename-symbol, cljr-change-function-signature,\ncljr-rename-file-or-dir) now run a mode-line spinner while the middleware\nis working, so it's obvious the command is still in progress rather than\nhaving silently done nothing.\n\nThe spinner is started in the calling buffer whe\n[…]\neuses\nCIDER's spinner (cider-spinner-start), so it respects cider-show-spinner\nand the related settings. Adds spinner to Package-Requires - it's a tiny\nlibrary already pulled in transitively by cider.",
          "is_bot": false,
          "headline": "Show a mode-line spinner during async refactorings",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T10:37:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af61112d51720c81488b96368c84f23ac4753da9",
          "body": "cljr-rename-symbol and cljr-change-function-signature located every\noccurrence with the blocking cljr--find-symbol-sync, freezing Emacs while\nthe middleware analysed the whole project - which on a cold cache or a\nlarge project could be a long time.\n\nThey now use a new cljr--find-symbol-occurrences, \n[…]\nied across two files on confirm (left\nthem untouched on decline); change-signature returned before its edit\nbuffer existed, the deferred callback opened it, and commit swapped params\nacross two files.",
          "is_bot": false,
          "headline": "Find occurrences asynchronously in rename and change-signature",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T09:54:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a0cf1d8716c4b8bb829e4664f1b1da3b9f6c876",
          "body": "Renaming a file rewrites references to it across the whole project, which\ncan take a while. It used a blocking cljr--call-middleware-sync, freezing\nEmacs until the middleware responded. It now fires the request through a\nnew cljr--call-middleware-async-collect helper and does the rest - the\ncompleti\n[…]\n\nValidated live against a real refactor-nrepl connection: the command\nreturns immediately, then renames the file, updates its ns, and rewrites\na requiring file's :require once the middleware responds.",
          "is_bot": false,
          "headline": "Run cljr-rename-file-or-dir asynchronously",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T09:34:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa49bbddca4adeddb3e93aeba2ae795b0feef65e",
          "body": "Route cljr-inline-symbol through cljr--run-previewable-refactoring, like\nrename and change-signature: gather the edits, show a diff, and write\nonly on confirm. Its two save-buffer calls (after the occurrence loop and\nin cljr--delete-definition) become cljr--save-buffer so they defer during\na preview\n[…]\nactually being applied.\n\nValidated live against a real refactor-nrepl connection: inlining a def\n(both usages replaced, definition removed) previewed and applied on\nconfirm, left untouched on decline.",
          "is_bot": false,
          "headline": "Preview cljr-inline-symbol too",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T09:16:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4022852ce0c7a630e158f1d6f54156cb0f7def7",
          "body": "cljr-rename-symbol and cljr-change-function-signature rewrite files\nacross the whole project and used to save each one immediately, with no\nway to see the changes first or take them back.\n\nThey now run through cljr--run-previewable-refactoring: the edits are\ngathered in-memory (cljr--save-buffer def\n[…]\nr's unrelated\nunsaved work is never silently lost or written out.\n\nValidated live against a real refactor-nrepl connection (rename across\ntwo files: confirm applied both, decline left both untouched).",
          "is_bot": false,
          "headline": "Preview project-wide refactorings before applying them",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T07:48:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7ac3c832d0b91f66dd9571b57543478378985550",
          "body": "Building on the tagged add/remove model, the command now handles\nmulti-arity defns. It prompts for which arity to change (cljr--choose-arity\nover cljr--get-function-arities) and edits just that one: the definition's\nmatching lambda list plus the call sites whose argument count matches.\n\ncljr--goto-a\n[…]\neal refactor-nrepl connection: reordering a chosen arity\nswapped its lambda list, an internal recursive call, and external calls\nof that arity, while the other arity and its call sites were untouched.",
          "is_bot": false,
          "headline": "Support multi-arity functions in cljr-change-function-signature",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T07:01:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ccf45d6a1983ac0a42a26f97f9bf0cbf996a5dfd",
          "body": "Extends the refactor beyond reorder/rename. The signature-changes model\nis now tagged with an :op per entry - :keep (reorder/rename, the default\nwhen absent, for backward compatibility), :add (a new parameter, with a\nplaceholder for call sites), and :remove. The edit buffer gains `a` to\nadd a parame\n[…]\nked test suite never exercised the\nreal format.\n\nValidated end to end against a live refactor-nrepl connection: add,\nremove and reorder across multiple files, including a cross-file aliased\ncall site.",
          "is_bot": false,
          "headline": "Add and remove parameters in cljr-change-function-signature",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-12T06:30:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e961de4ad9b339e4192b511cf8857b14f598750e",
          "body": "cljr-clean-ns errored out whenever the clean-ns middleware op wasn't\navailable. Pruning unused libspecs does need analysis, but sorting the\nns form is purely syntactic - so when the op is unavailable, fall back\nto clojure-mode's clojure-sort-ns and skip pruning, instead of failing\noutright.\n\nSame fallback for the auto-sort hook (cljr-auto-sort-ns): it now sorts\nthe ns form offline rather than doing nothing until a REPL is connected.",
          "is_bot": false,
          "headline": "Make cljr-clean-ns degrade gracefully without a REPL",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T07:07:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80f4df309889719108b6913673fceb2a99c6fbec",
          "body": "cljr--op-supported-p delegates to cider-nrepl-op-supported-p, which\nresolves the REPL with the `ensure' flag and signals \"No linked CIDER\nsessions\" when nothing is connected. So the offline fallbacks that gate\non this predicate never got a chance to run: typing `/' offline\n(cljr-slash) or invoking c\n[…]\nalling back to the static cljr-magic-require-namespaces\ntable.\n\nGuard on cider-connected-p first so the predicate returns a plain nil\nwhen disconnected, matching how it's used everywhere as a boolean.",
          "is_bot": false,
          "headline": "Don't error in cljr--op-supported-p when no REPL is connected",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T07:07:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18a3f605a30800a64ff21327321e3a75605cb80f",
          "body": "cljr--init-artifact-cache / cljr--update-artifact-cache fire an async\nartifact-list request on REPL connect (governed by\ncljr-populate-artifact-cache-on-startup, on by default), but their\ncallbacks only logged and threw the response away. That warmed\nrefactor-nrepl's server-side cache, yet the Emacs\n[…]\nll blocked on the full artifact-list\ntransfer and parse.\n\nHave both warmers populate cljr--artifacts-cache from the response, so\nthe common case is served from cache without any middleware round-trip.",
          "is_bot": false,
          "headline": "Populate the Emacs-side artifact cache from the async warmer",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T06:48:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eec36894551dfe1a0e4341fcb7b53dc658dfcfe0",
          "body": "cljr-slash has defaulted to the language-context-aware suggest-libspecs\nop (with a static offline fallback) for a while now, gated behind\ncljr-slash-uses-suggest-libspec. Drop the old namespace-aliases code\npath entirely, along with that flag and the two options that only fed\nit: cljr-suggest-namesp\n[…]\ns at the live path (stub\ncljr--call-middleware-suggest-libspec instead of the old op) so the\nintegration coverage of the guards, keyword aliases and reader-\nconditional context detection carries over.",
          "is_bot": false,
          "headline": "Remove the deprecated namespace-aliases path from cljr-slash",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T06:24:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fefbcaf34f5704dbf2b35a4f47e488a64ee08bf2",
          "body": "Removing a let and inlining its bindings is a purely local structural\nedit, but cljr-remove-let drove cljr-inline-symbol once per binding -\nrequiring the extract-definition middleware op and showing the\n\"the project will be evaluated\" warning each time.\n\nReimplement it locally: inline each binding's\n[…]\n refers to an earlier one resolves), then\nsplice the let with the existing cljr--eliminate-let. Reuses clojure-mode's\nsexp matching, so it's no less accurate than the move-to-let direction it\nmirrors.",
          "is_bot": false,
          "headline": "Make cljr-remove-let work without a REPL",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T06:14:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0337057a742275b5fbb781d3fb6c2f05bc30439c",
          "body": "cljr-promote-function required the find-used-locals middleware op (and\nshowed the scary \"the project will be evaluated\" warning) even to turn a\n#() literal into an fn - a purely local edit. And its literal converter\nduplicated, less robustly, clojure-mode's clojure-promote-fn-literal.\n\nDelegate the \n[…]\nning) and gate the middleware/warning only on the fn->defn\npromotion, which genuinely needs captured-locals analysis. Removes the\nnow-dead cljr--promote-function-literal and cljr--append-fn-parameter.",
          "is_bot": false,
          "headline": "Promote #() literals without a REPL",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-11T06:10:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a305a4e78ea535ebaddbdd3ea1b366d58975dd7a",
          "body": "Audit follow-up:\n\n- cljr-introduce-let / cljr-move-to-let were one-line pass-throughs to\n  clojure-introduce-let / clojure-move-to-let; make them obsolete aliases\n  and point the keybindings and menu at the clojure-* commands directly\n  (the thread/unwind/cycle/convert commands already work this way\n[…]\ning.\n\n- Surface cljr-reify-to-defrecord in clj-refactor-menu (it had no binding\n  or menu entry).\n\n- Delete the dead cljr--goto-if (leftover from before cljr-cycle-if\n  delegated to clojure-cycle-if).",
          "is_bot": false,
          "headline": "Clean up redundant wrappers and small UX gaps",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T11:35:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9afc99b448d6a813d85cddbca1c3f45fc5d9f620",
          "body": "From an audit of the public command surface:\n\n- cljr-add-declaration: cljr--already-declared-p fed the def name to\n  re-search-backward as a regexp without quoting or symbol boundaries, so\n  names with regexp specials (*db*, valid?, +, ...) matched wrong and\n  substrings of a symbol counted as decla\n[…]\ndependency: bound the\n  :deps/:dependencies searches and error clearly when absent instead of a\n  raw \"search failed\"; remove a stray no-op op-check after hotloading;\n  note deps.edn in the docstring.",
          "is_bot": false,
          "headline": "Fix correctness issues in several commands",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T11:32:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c3b32b52679c83d2af720198584204baa3a5416",
          "body": "cljr-add-missing-libspec hard-required the resolve-missing middleware op,\nso it errored without a REPL, and dead-ended with \"Can't find on\nclasspath\" when a referenced library wasn't a dependency.\n\nKeep the resolve-missing path (its main, symbol-based resolution), but\nwhen the op is unavailable or f\n[…]\nng library (cljr-slash-add-missing-libs).\n\nThis folds the two genuinely-useful bits of the reverted\ncljr-require-alias-at-point into the existing command instead of adding a\nseparate, overlapping one.",
          "is_bot": false,
          "headline": "Give cljr-add-missing-libspec an offline fallback",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T10:49:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b84b88950ab9c7dcf385f4c5b78cfe9f38b09b78",
          "body": "This reverts commit db214d1. The command overlaps with the existing\ncljr-add-missing-libspec, which already requires the aliased symbol at\npoint (str/join -> aliases the ns to str). The only thing the new command\nadded was working without a REPL, which is too niche to justify a second,\noverlapping command.",
          "is_bot": false,
          "headline": "Revert \"Add cljr-require-alias-at-point\"",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T10:32:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db214d19f162f54f821fd68753379d0c8fe68ee1",
          "body": "cljr-slash only adds a require as you type the / after an alias, so it\ncan't help code you pasted (where the / is already there). Add a command\nthat requires the unresolved alias of the symbol at point - point can be\nanywhere in the aliased symbol, e.g. on str/join. It reuses cljr-slash's\nresolution (offline-capable via cljr-magic-require-namespaces, and can add\na missing lib), and is bound to ra and listed in clj-refactor-menu.",
          "is_bot": false,
          "headline": "Add cljr-require-alias-at-point",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T08:28:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0f62e880c4a13e09dc3ebaf661c4eeb35a0615b",
          "body": "Extend cljr-magic-require-namespaces so an entry can carry an :artifact\ncoordinate, e.g. (\"json\" \"cheshire.core\" :artifact \"cheshire/cheshire\").\nWhen cljr-slash resolves an alias to such an entry and the namespace\nisn't on the classpath, it offers (with confirmation) to add that\nartifact at its late\n[…]\n on) and only\nfires for aliases explicitly configured with an :artifact. The runtime\nadd/hotload composes existing, tested commands; unit tests cover the\nconfig parsing and the orchestration (mocked).",
          "is_bot": false,
          "headline": "Let cljr-slash add and hotload a missing library",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T05:27:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b86ffebef337007a9d586c7b243485fadd6bff7",
          "body": "cljr-slash resolves an unresolved alias to a require via the\nsuggest-libspecs middleware op. When no REPL is connected, that op check\n(cljr--ensure-op-supported -> cljr--assert-middleware) signals a\nuser-error, so typing / after an alias did nothing but complain.\n\nFall back to the static cljr-magic-\n[…]\nlanguage context) and insert the libspec directly - no network, no error.\nCommon aliases (str, io, set, ...) now work before you jack in, and the\nmiddleware path is unchanged when a REPL is connected.",
          "is_bot": false,
          "headline": "Make cljr-slash work without a running REPL",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-10T05:24:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bcb9b72dab69d7f310f132e84d614d31f2c63255",
          "body": "Captures the plan for add/remove parameters and multi-arity support:\nthe current permutation-only model, why add/remove/multi-arity break it,\nthe proposed tagged signature-changes model, edit-buffer UI, call-site\nsemantics (placeholders for adds, manual-intervention for removes), the\nmulti-arity phase, risks, testing strategy and phasing. To be revisited\nwhen we implement it (needs a live REPL for integration testing).",
          "is_bot": false,
          "headline": "Add a design doc for extending change-function-signature",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-08T07:13:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fc45d4ca4db73d12260d1b6d80da9439abc5162",
          "body": "clojure-mode already provides clojure-convert-collection-to-list/map/\nvector/set/quoted-list (the old cljr-cycle-coll was removed in 2.3.0 in\nfavor of these), so rather than reimplement, add a \"Convert collection\nto\" group to clj-refactor-menu that invokes them - making them\ndiscoverable from clj-refactor without duplicating the logic.",
          "is_bot": false,
          "headline": "Surface collection-type conversions in the menu",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-08T07:13:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c3396455a07b8ae1f34e01b9fe737555d10c4da",
          "body": "cljr-slash fires on every / keystroke and, for an unresolved alias, did a\nsynchronous suggest-libspecs middleware round-trip each time - felt\ndirectly while typing str/, io/, etc. Cache the suggestions per (alias,\nlanguage-context), expiring per cljr-artifact-cache-ttl, so repeated use\nof the same a\n[…]\nsn't queried\nagain, keeping the cache correct.\n\nFull async was avoided on purpose: the flow can prompt for a libspec, and\nfiring that prompt from an async callback would interrupt the user\nmid-typing.",
          "is_bot": false,
          "headline": "Cache cljr-slash libspec suggestions per alias",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-08T07:12:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e0075eff0c5337573d8843cc59054f5695f44ac",
          "body": "Three focused improvements to how project-wide and network-bound\ncommands behave:\n\n- Don't leak buffers. Rename symbol, inline symbol and change function\n  signature opened every affected file with find-file-noselect and never\n  killed the ones they opened, accumulating buffers (and slowing Emacs)\n \n[…]\nhe dependency commands\n  (new cljr-artifact-cache-ttl, default 300s) so they aren't re-fetched\n  from the middleware on every invocation.\n\nAdds unit tests for the buffer-tracking helper and the cache.",
          "is_bot": false,
          "headline": "Responsiveness quick wins",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T17:02:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f7909baec7fd92e6ac3d98c0a166a00631c8c5ec",
          "body": "Restore the discoverability the hydra menus used to provide, using a\nbuilt-in transient instead of the dropped hydra dependency.\n\nclj-refactor-menu groups every command by category (namespace, code,\ntop-level form, project) keyed by the same two-letter mnemonics as the\nkeybindings, so the menu doubl\n[…]\nrs)\nfor the session. It's bound to hh under the user's prefix (the old hydra\nkey).\n\nA drift test asserts every command in cljr--all-helpers is reachable in\nthe menu, so the two can't fall out of sync.",
          "is_bot": false,
          "headline": "Add a transient menu for the command surface",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T12:58:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f55d2e6ff7ccd62147f2392a1317d4e6880a6821",
          "body": "Bump the example refactor-nrepl/cider-nrepl plugin versions (3.10.0 ->\n3.14.0, 0.45.0 -> 0.61.0), which were years out of date, and add a\ncompatibility-table row for the 4.0 line plus a note about the Emacs 28.1+\nrequirement.",
          "is_bot": false,
          "headline": "Refresh the README",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T12:18:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c99141cad0369e8a92913095d34fb7d3e08edc6",
          "body": "- Inline cl-evenp at its one call site and drop the pointless\n  cljr--evenp alias.\n- Remove the dead &optional _for-compat arg from cljr--version (all\n  callers already pass no args).\n- Use with-eval-after-load instead of the old eval-after-load + quoted\n  form for the jack-in dependency injection.\n\n[…]\nngs wrappers around cider-current-repl and\n  cider-nrepl-eval-session; both are current, defined CIDER functions, so\n  the suppression is no longer needed (compiles clean with\n  --warnings-as-errors).",
          "is_bot": false,
          "headline": "Tidy up remaining dead code",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T12:18:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8852c2cfc84b48b42884cb3beb13341c1a0429a4",
          "body": "The hydra menus were removed along with the hydra dependency, so the\npointer to them (and the Hydra wiki page) no longer applies.",
          "is_bot": false,
          "headline": "Drop the README reference to the hydra popup menus",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T10:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0845975856f18b2b902776c595a2da17f6eecee0",
          "body": "Add a short list of the inherent limitations of the AST-based commands\n(need a live REPL, don't work on uncompilable code or ClojureScript, slow\nfirst use, macros only approximated), with pointers to\ncljr-ignore-analyzer-errors, refactor-nrepl's fuller writeup, and\nclojure-lsp for the static/cljs/no-REPL cases.",
          "is_bot": false,
          "headline": "Document what to expect from the AST-based refactorings",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T10:15:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "628e246037fa92f51cde6465dfb9c493102e6f20",
          "body": "These are niche these days and pulled real weight for narrow features:\n\n- hydra backed only the discoverability menus, which just mirror bindings\n  that already exist in the keymap. Drop the menus and the hh/hn/... keys.\n- multiple-cursors backed an optional interactive mode for the let, extract\n  a\n[…]\nead.\n\nUpdate the ecukes let-binding scenarios to drive the name prompt via an\naction chain (as the promote-function feature already does), and drop the\nnow-defunct \"I don't use multiple-cursors\" step.",
          "is_bot": false,
          "headline": "Drop the multiple-cursors, hydra and inflections dependencies",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-07-01T10:15:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b725cc39bfff17a949daa147eb37f391cfbb5591",
          "body": "Track a released tag instead of master, matching what CIDER does. Keeps\nCI reproducible and avoids surprise changes from the action's master\nbranch.",
          "is_bot": false,
          "headline": "Pin the setup-emacs action to v3",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T14:09:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac0af32d1cbd0548442ee9859f1882286f4393db",
          "body": "The threading and cycling refactorings moved to clojure-mode years ago,\nand these cljr- aliases have carried obsolescence warnings since 2.3.0.\nAt this point they're just dead surface, so drop them along with the\n2.3.0 cljr-find-usages-ignore-analyzer-errors variable alias. Users\nshould call the clojure-* commands (or cljr-ignore-analyzer-errors)\ndirectly.",
          "is_bot": false,
          "headline": "Remove the long-obsolete 2.3.0-era aliases",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:28:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f30f85d35deb8f7044dacf547888253ae625b3b8",
          "body": "The command was stubbed out years ago because the old Alembic-based\nmiddleware didn't work on Java 9/10. refactor-nrepl since reimplemented\nhotloading on top of clojure.tools.deps (refactor-nrepl #231), so restore\nthe real implementation and flip cljr-hotload-dependencies back to its\noriginal default of t. The backend now also accepts deps.edn-style\ncoordinate maps, not just Leiningen vectors.",
          "is_bot": false,
          "headline": "Re-enable cljr-hotload-dependency",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:27:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7c31736b824a980c0366ca7a73d2540979cf83e",
          "body": "There's no run-tests.sh in the repo; tests run via make test (as the\nREADME already documents).",
          "is_bot": false,
          "headline": "Fix the test command in the PR template",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:26:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08be5f155cf9617623e16af37f52d23fb474d50e",
          "body": "Spell out where clj-refactor.el and refactor-nrepl are headed: slim down\nthe Emacs client, move the analysis-free features into CIDER, and replace\nthe tools.analyzer index with a faster, static clj-kondo-based one. Mirrors\nthe CIDER 2.0 direction (see CIDER #3356).",
          "is_bot": false,
          "headline": "Add a project roadmap",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:26:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "394d273e0dc3e087c0c3eb58322e887ed5cf2dc4",
          "body": "CIDER 1.23 deprecated cider-nrepl-send-sync-request (now\ncider-nrepl-sync-request) and cider-ensure-connected (now\ncider-ensure-session), which turned our byte-compilation red against\nrecent CIDER. Alias to the modern names when they're available and fall\nback to the old ones, so we keep working wit\n[…]\npported check in cljr--ns-path:\nit checked the bare \"ns-path\" op while the request actually sends the\nnamespaced \"cider/ns-path\", whose support modern CIDER enforces in the\nnREPL sender automatically.",
          "is_bot": false,
          "headline": "Use CIDER 1.23's renamed nREPL API with a fallback",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-06-28T13:23:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39c9688c79e1d00965621d04c04fe1ddde4b571f",
          "body": "- Fix docstring typos (\"in in\" -> \"in\")\n- Fix variable name typo (cjr--occurrence-count -> cljr--occurrence-count)\n- Replace cljr--evenp with cl-evenp (already using cl-lib)\n- Replace cljr--aget with alist-get (built-in)\n- Replace seq-elt with seq-first and remove outdated compat comment\n- Make cljr--empty-buffer-p more efficient (search instead of\n  copying entire buffer contents into a string)",
          "is_bot": false,
          "headline": "Misc code cleanup: fix typos, remove compat shims, simplify helpers",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-04-03T08:30:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa18cd463568b2710eabf1a664ab11e260d0c777",
          "body": "… 24)",
          "is_bot": false,
          "headline": "Simplify cljr--pkg-version (package-get-version available since Emacs…",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-04-03T08:30:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "578d918aec74c213d6ec1a43cfb3d689759a947b",
          "body": null,
          "is_bot": false,
          "headline": "Remove seq from Package-Requires (built-in since Emacs 25)",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-04-03T08:30:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30a9d2716097b825e0cc00cd298dcb9547bcc78d",
          "body": null,
          "is_bot": false,
          "headline": "Update actions/checkout to v5 to fix Node.js 20 deprecation warning",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T16:19:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19d16e2722b76ce1dc5a2f0365fd263d98de905c",
          "body": null,
          "is_bot": false,
          "headline": "Fix remaining indentation in clean-ns form",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T16:16:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f255ebb4febc68fe75ccbc80352e19693dfedad",
          "body": null,
          "is_bot": false,
          "headline": "Fix indentation for if-let*/when-let* and run lint only on Emacs 30",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T16:14:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2c2b30e9416346fe20222b53fadb2d11aea5e73",
          "body": "This reverts commit 2ad77b07aeb9fa965861d46392aede40f55b15e8.",
          "is_bot": false,
          "headline": "Revert \"Fix indentation after if-let*/when-let* migration\"",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T16:11:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ad77b07aeb9fa965861d46392aede40f55b15e8",
          "body": null,
          "is_bot": false,
          "headline": "Fix indentation after if-let*/when-let* migration",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T15:57:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "683f84a77f5bce19f97ee8102cd2c25fd1a66869",
          "body": null,
          "is_bot": false,
          "headline": "Fix if-let*/when-let* binding syntax for compat with Emacs 28+",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T15:43:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ac21b9b34f9b3c732c0e6ab3850df5275b8f7ee",
          "body": null,
          "is_bot": false,
          "headline": "Replace if-let/when-let with starred variants for Emacs 31 compat",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T15:24:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48eb2cab291e9a0506d9cdc3d99c6cf05f56b0a7",
          "body": null,
          "is_bot": false,
          "headline": "Fix CI: use exact Emacs versions and add lexical-binding to tests",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T15:21:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8021ef279fc64f858041f5c3781e7051a76aba31",
          "body": null,
          "is_bot": false,
          "headline": "Bump minimum Emacs version to 28.1",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T14:13:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfeec69a94118991821be3d1362307afcd1845b1",
          "body": null,
          "is_bot": false,
          "headline": "Replace CircleCI with GitHub Actions",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T14:12:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85d040c40cad6e9e2d6b6c11e25fb9721e03652d",
          "body": null,
          "is_bot": false,
          "headline": "Replace Cask references with Eldev in contribution docs",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T14:10:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6687f032c883a7d8e46c123254e899441f8774e9",
          "body": null,
          "is_bot": false,
          "headline": "Fix typos and grammar mistakes in docs",
          "author_name": "Bozhidar Batsov",
          "author_login": "bbatsov",
          "committed_at": "2026-03-30T14:08:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "362cb46bf808dc42d2aaf022afe93048439680c4",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade refactor-nrepl to version 3.11.0",
          "author_name": "Roman Rudakov",
          "author_login": "rrudakov",
          "committed_at": "2025-05-14T19:03:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc1bbc8cdaa723bdbb6669ea7d280625c370755d",
          "body": "This allows for cleaning up whitespace even if there are no structural changes.",
          "is_bot": false,
          "headline": "Pass :always-return-ns-form true to clean-ns (#558)",
          "author_name": "Moritz Heidkamp",
          "author_login": "DerGuteMoritz",
          "committed_at": "2024-03-10T20:54:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa3efe18e7150df5153a7d05c54e96d59398a0a8",
          "body": "…g `cljr-suggest-libspecs`",
          "is_bot": false,
          "headline": "v3.11.3: Fix incorrectly serialized values for `cljr-slash` when usin…",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2024-01-16T11:19:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3b5238345e0991785e5170112f5db9c9663b7fb",
          "body": "Fixes https://github.com/clojure-emacs/clj-refactor.el/issues/556",
          "is_bot": false,
          "headline": "3.11.2",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-12-03T18:47:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0207665fce979fa88a35555b1902b8262aa37b85",
          "body": null,
          "is_bot": false,
          "headline": "3.11.1",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-12-02T04:45:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47a9a5c48f2dfe1437d1d5b02ce2299bb187ebce",
          "body": "* alias `edn` to clojure.edn\r\n\r\n* Add minimal documentation of `:only` keyword\r\n\r\n* limit `io` to `clj`\r\n\r\n* backport `:only` keyword support for `cljr-magic-require-namespaces`\r\n\r\nThis is handled by the suggest-libspec middleware automatically, so should not\r\nbe user visible on latest versions. How\n[…]\normat was broken with an :only keyword when parsed by\r\ncljr--magic-requires-lookup-alias. This fixes that lookup and extracts the\r\nlibspec from the first element of the list if it's not a dotted pair.",
          "is_bot": false,
          "headline": "Expand cljr magic require namespaces documentation (#555)",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-12-02T04:41:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a2a6cbc2e29177f4f55730637a357433a03fa38",
          "body": null,
          "is_bot": false,
          "headline": "3.11.0",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-11-24T07:24:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b390a17a2b0db2bb7d2b0d1cf014513cc1346e4c",
          "body": "…in test",
          "is_bot": false,
          "headline": "Fix missing lexical-binding issue during feature/feature compilation …",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-11-16T05:25:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a90ecec7ae324a7c42d815c47e82ab950460355c",
          "body": null,
          "is_bot": false,
          "headline": "Add ecukes steps to set the defcustom for each buffer",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-11-16T05:25:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05e90bd9a0f24027011aab1bf041c16a24797e0c",
          "body": "Also mark functions that will be deprecated once suggest-libspec is the only\npath.",
          "is_bot": false,
          "headline": "Enable `cljr-slash-uses-suggest-libspec` by default",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-11-16T05:25:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b476345c580ae7cbc6b356ba0157db782684c47f",
          "body": "Fixes https://github.com/clojure-emacs/clj-refactor.el/issues/552",
          "is_bot": false,
          "headline": "Support TRAMP connections",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-10-09T11:04:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d006e2e14a43705f520660de95975acc5e3fe1fa",
          "body": null,
          "is_bot": false,
          "headline": "3.9.4",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-18T10:17:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb8c75bb5d0c4bbffb7adab1ad3084da50b93ece",
          "body": null,
          "is_bot": false,
          "headline": "Remove Discord badge",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-16T05:55:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5555fab8e02f567d67a3c982ab178be5485310db",
          "body": null,
          "is_bot": false,
          "headline": "3.9.3",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-16T05:30:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed3a15a969eb17c6c7741a2728b45fc3d320aa66",
          "body": "Fixes #550",
          "is_bot": false,
          "headline": "Add and satisfy linting (#551)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-16T04:34:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "038ad6664482b3f9e253383efce25ab24ae876fe",
          "body": null,
          "is_bot": false,
          "headline": "3.9.2",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-15T18:51:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59d5b64e4053b58e0977bb76d262238b41b8dcc9",
          "body": null,
          "is_bot": false,
          "headline": "Modernize build (#549)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-09-15T18:48:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0f488206290acd83315f6d22171dcb9e671b7e7",
          "body": "Fixes #523",
          "is_bot": false,
          "headline": "Increase `js/` namespace detection accuracy for .cljc files (#546)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-08-01T10:30:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fdc95a479406a83865d06f43122354c0dd2b93f",
          "body": "…terned into the current namespace (#545)\n\ne.g. the class `Thread` or the var `+` are already interned by default in Clojure namespaces, so they are redundant to suggest or insert into the `ns` form.",
          "is_bot": false,
          "headline": "`cljr-add-missing-libspec`: don't suggest members that are already in…",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-26T13:57:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4336323e32b5522b02639ed2aa4dd65c3b3d29ef",
          "body": "Closes #430",
          "is_bot": false,
          "headline": "`cljr-add-missing-libspec`: produce more friendly prompts (#544)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-26T13:33:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a2719be5f0af0d478b37007f3a716bccd708450",
          "body": null,
          "is_bot": false,
          "headline": "Use refactor-nrepl 3.9.0",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-24T19:59:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "740747dc175f578b255dae6ed87bf8a438431096",
          "body": null,
          "is_bot": false,
          "headline": "Use refactor-nrepl 3.8.0",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-21T06:15:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af97aca1acc607dffcae9e932d926dc6482426bb",
          "body": null,
          "is_bot": false,
          "headline": "Avoid `seq-first`",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-15T11:14:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30c9ad11b53ddf1e4c88c9cf9b714f38ce604ad3",
          "body": null,
          "is_bot": false,
          "headline": "3.7.1",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-06T13:15:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c63dfa94f68f9a24bb3a1d989e1f439242de6818",
          "body": "Previously the function would report a successful renaming without\ractually having renamed anything.\n\nFixes #537\nCloses https://github.com/clojure-emacs/clj-refactor.el/pull/538",
          "is_bot": false,
          "headline": "Fail early in cljr-rename-symbol if narrowing is in effect",
          "author_name": "rechvs",
          "author_login": "rechvs",
          "committed_at": "2023-07-04T15:41:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cac47dc0217c96203457531949b4f0472e6bbaa3",
          "body": null,
          "is_bot": false,
          "headline": "Use refactor-nrepl 3.7.0 (#543)",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2023-07-04T15:31:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfd184e93b9ab63f003fb2cf54a396e7b932a049",
          "body": "…#542)",
          "is_bot": false,
          "headline": "Deprecate unused reader-conditional functions and transition to new (…",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-05-20T15:50:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffc6be1ef170402d25b068fb98a5a934cc5a5c36",
          "body": "Addresses problems identified in\r\nhttps://github.com/clojure-emacs/clj-refactor.el/issues/533.\r\n\r\nPreviously, `cljr--goto-reader-conditional` and\r\n`cljr--point-in-reader-conditional-branch-p` appeared to have problems with\r\ninfinite loops as they looked for specific language values in the reader\r\nco\n[…]\nbol it can identify.\r\n\r\n`cljr--language-context-at-point` has been amended to use the\r\n`cljr--reader-conditional-context` to return both the language of the file & the\r\ncurrent context to search from.",
          "is_bot": false,
          "headline": "Introduce `cljr--reader-conditional-context` (#541)",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2023-04-23T21:47:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5abe655e572a6ecfed02bb8164b64716ef76b8e",
          "body": "Clojure 1.11.0 provides the new clojure.math namespace.\nUsers will expect that it's magically required by \"math\", analog to\nthe other builtins.",
          "is_bot": false,
          "headline": "Add clojure.math to magic require namespaces",
          "author_name": "adrech",
          "author_login": "vroide",
          "committed_at": "2023-02-02T06:37:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8300d5cab861668f313fbbbb3e2926e3e5130e86",
          "body": null,
          "is_bot": false,
          "headline": "3.6.0",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2022-10-23T16:44:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db89b558710d31d4b9dfe7c4d2a07df9b498d4a6",
          "body": "`cljr-slash` using `suggest-libspecs` middleware op",
          "is_bot": false,
          "headline": "Merge pull request #532 from dgtized/cljr-slash-using-suggest-libspecs",
          "author_name": "vemv",
          "author_login": "vemv",
          "committed_at": "2022-10-11T19:08:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23c58cc98c2cd0384f0f24a5c372054c2158f5d1",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' into cljr-slash-using-suggest-libspecs",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T20:35:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e53606b782550a41ad407992d978d38d300eda43",
          "body": null,
          "is_bot": false,
          "headline": "Add Changelog entry introducing #532",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T20:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c8d8182de7c08e4f846cca6976db5c3e1aae647",
          "body": "…nt`.\n\nSee https://github.com/clojure-emacs/clj-refactor.el/issues/533 for explanation\nof what needs to happen to re-enable.",
          "is_bot": false,
          "headline": "Disable the reader-conditional term of `cljr--language-context-at-poi…",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T19:55:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3c0cb4f1bcd232c4e14ed466876b47cfe8bcd18",
          "body": null,
          "is_bot": false,
          "headline": "Prefer explicit parsing instead of destructuring binding per reviewer",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T19:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c28773dfd380907375c5b39744b5f2099e7f9da5",
          "body": null,
          "is_bot": false,
          "headline": "Document feature paths inside `cljr-slash`",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T19:17:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16da22c355b9de0d7777155ca2f973b6505743bd",
          "body": "… `cljr--language-context-at-point`",
          "is_bot": false,
          "headline": "Improve documentation for `cljr--call-middleware-suggest-libspec` and…",
          "author_name": "Charles Comstock",
          "author_login": "dgtized",
          "committed_at": "2022-09-07T19:08:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 4,
      "commits_last_year": 63,
      "latest_release_at": "2026-07-16T15:46:13Z",
      "latest_release_tag": "v4.0.0",
      "releases_from_tags": false,
      "days_since_last_push": 9,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 776.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": true,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 111,
      "stars": 785,
      "watchers": 25,
      "fork_history": {
        "days": [
          {
            "date": "2013-01-31",
            "count": 1
          },
          {
            "date": "2013-02-01",
            "count": 1
          },
          {
            "date": "2013-10-30",
            "count": 1
          },
          {
            "date": "2013-12-15",
            "count": 1
          },
          {
            "date": "2013-12-31",
            "count": 1
          },
          {
            "date": "2014-01-23",
            "count": 1
          },
          {
            "date": "2014-02-01",
            "count": 1
          },
          {
            "date": "2014-02-07",
            "count": 1
          },
          {
            "date": "2014-03-25",
            "count": 1
          },
          {
            "date": "2014-06-09",
            "count": 1
          },
          {
            "date": "2014-08-23",
            "count": 1
          },
          {
            "date": "2014-08-25",
            "count": 1
          },
          {
            "date": "2014-09-02",
            "count": 1
          },
          {
            "date": "2014-12-13",
            "count": 1
          },
          {
            "date": "2014-12-16",
            "count": 1
          },
          {
            "date": "2015-01-31",
            "count": 1
          },
          {
            "date": "2015-02-20",
            "count": 1
          },
          {
            "date": "2015-03-31",
            "count": 1
          },
          {
            "date": "2015-04-09",
            "count": 1
          },
          {
            "date": "2015-04-24",
            "count": 1
          },
          {
            "date": "2015-05-29",
            "count": 1
          },
          {
            "date": "2015-05-30",
            "count": 1
          },
          {
            "date": "2015-06-29",
            "count": 1
          },
          {
            "date": "2015-07-08",
            "count": 1
          },
          {
            "date": "2015-07-16",
            "count": 1
          },
          {
            "date": "2015-08-10",
            "count": 1
          },
          {
            "date": "2015-08-18",
            "count": 1
          },
          {
            "date": "2015-08-24",
            "count": 1
          },
          {
            "date": "2015-09-10",
            "count": 1
          },
          {
            "date": "2015-09-24",
            "count": 1
          },
          {
            "date": "2015-09-28",
            "count": 1
          },
          {
            "date": "2015-10-26",
            "count": 1
          },
          {
            "date": "2015-12-11",
            "count": 1
          },
          {
            "date": "2015-12-27",
            "count": 1
          },
          {
            "date": "2016-01-26",
            "count": 1
          },
          {
            "date": "2016-02-03",
            "count": 1
          },
          {
            "date": "2016-03-14",
            "count": 1
          },
          {
            "date": "2016-03-20",
            "count": 1
          },
          {
            "date": "2016-03-23",
            "count": 1
          },
          {
            "date": "2016-05-21",
            "count": 1
          },
          {
            "date": "2016-06-21",
            "count": 1
          },
          {
            "date": "2016-07-11",
            "count": 1
          },
          {
            "date": "2016-10-16",
            "count": 1
          },
          {
            "date": "2016-10-18",
            "count": 1
          },
          {
            "date": "2016-10-19",
            "count": 1
          },
          {
            "date": "2016-11-25",
            "count": 1
          },
          {
            "date": "2017-01-10",
            "count": 1
          },
          {
            "date": "2017-01-13",
            "count": 1
          },
          {
            "date": "2017-01-20",
            "count": 1
          },
          {
            "date": "2017-01-21",
            "count": 1
          },
          {
            "date": "2017-03-24",
            "count": 1
          },
          {
            "date": "2017-04-01",
            "count": 1
          },
          {
            "date": "2017-04-22",
            "count": 1
          },
          {
            "date": "2017-04-25",
            "count": 1
          },
          {
            "date": "2017-11-07",
            "count": 1
          },
          {
            "date": "2017-12-20",
            "count": 1
          },
          {
            "date": "2018-01-20",
            "count": 1
          },
          {
            "date": "2018-03-05",
            "count": 1
          },
          {
            "date": "2018-03-26",
            "count": 1
          },
          {
            "date": "2018-03-30",
            "count": 1
          },
          {
            "date": "2018-05-12",
            "count": 1
          },
          {
            "date": "2018-05-26",
            "count": 1
          },
          {
            "date": "2018-06-28",
            "count": 1
          },
          {
            "date": "2018-07-08",
            "count": 1
          },
          {
            "date": "2018-11-14",
            "count": 1
          },
          {
            "date": "2018-11-23",
            "count": 1
          },
          {
            "date": "2019-03-18",
            "count": 1
          },
          {
            "date": "2019-04-18",
            "count": 1
          },
          {
            "date": "2019-04-22",
            "count": 1
          },
          {
            "date": "2019-05-16",
            "count": 1
          },
          {
            "date": "2019-07-14",
            "count": 1
          },
          {
            "date": "2019-07-16",
            "count": 1
          },
          {
            "date": "2019-07-19",
            "count": 1
          },
          {
            "date": "2019-07-31",
            "count": 1
          },
          {
            "date": "2019-08-03",
            "count": 1
          },
          {
            "date": "2019-10-17",
            "count": 1
          },
          {
            "date": "2019-10-31",
            "count": 1
          },
          {
            "date": "2019-12-08",
            "count": 1
          },
          {
            "date": "2020-02-17",
            "count": 1
          },
          {
            "date": "2020-02-20",
            "count": 1
          },
          {
            "date": "2020-04-04",
            "count": 1
          },
          {
            "date": "2020-04-15",
            "count": 1
          },
          {
            "date": "2020-05-24",
            "count": 1
          },
          {
            "date": "2020-06-18",
            "count": 1
          },
          {
            "date": "2020-07-18",
            "count": 1
          },
          {
            "date": "2020-07-28",
            "count": 1
          },
          {
            "date": "2020-08-31",
            "count": 1
          },
          {
            "date": "2020-09-01",
            "count": 1
          },
          {
            "date": "2020-12-30",
            "count": 1
          },
          {
            "date": "2021-01-12",
            "count": 1
          },
          {
            "date": "2021-02-27",
            "count": 1
          },
          {
            "date": "2021-03-10",
            "count": 1
          },
          {
            "date": "2021-03-18",
            "count": 1
          },
          {
            "date": "2021-03-19",
            "count": 1
          },
          {
            "date": "2021-03-26",
            "count": 1
          },
          {
            "date": "2021-05-09",
            "count": 1
          },
          {
            "date": "2021-05-12",
            "count": 1
          },
          {
            "date": "2021-07-24",
            "count": 1
          },
          {
            "date": "2021-10-25",
            "count": 1
          },
          {
            "date": "2022-06-12",
            "count": 1
          },
          {
            "date": "2022-07-05",
            "count": 1
          },
          {
            "date": "2022-09-12",
            "count": 1
          },
          {
            "date": "2023-01-17",
            "count": 1
          },
          {
            "date": "2023-02-01",
            "count": 1
          },
          {
            "date": "2023-07-10",
            "count": 1
          },
          {
            "date": "2024-01-28",
            "count": 1
          },
          {
            "date": "2024-02-29",
            "count": 1
          },
          {
            "date": "2024-07-24",
            "count": 1
          },
          {
            "date": "2024-07-26",
            "count": 1
          },
          {
            "date": "2025-01-18",
            "count": 1
          },
          {
            "date": "2025-11-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 111,
        "total_forks": 111
      },
      "star_history": null,
      "open_issues_and_prs": 29
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": null,
      "source_files_sampled": 0,
      "oversized_source_files": 0,
      "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": 193,
        "open_issues": 29,
        "closed_ratio": 0.923,
        "closed_issues": 347,
        "closed_unmerged_prs": 30
      },
      "bus_factor": 2,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "expez",
          "commits": 371,
          "avatar_url": "https://avatars.githubusercontent.com/u/1006557?v=4"
        },
        {
          "type": "User",
          "login": "magnars",
          "commits": 210,
          "avatar_url": "https://avatars.githubusercontent.com/u/265785?v=4"
        },
        {
          "type": "User",
          "login": "benedekfazekas",
          "commits": 140,
          "avatar_url": "https://avatars.githubusercontent.com/u/1003422?v=4"
        },
        {
          "type": "User",
          "login": "bbatsov",
          "commits": 120,
          "avatar_url": "https://avatars.githubusercontent.com/u/103882?v=4"
        },
        {
          "type": "User",
          "login": "vemv",
          "commits": 64,
          "avatar_url": "https://avatars.githubusercontent.com/u/1162994?v=4"
        },
        {
          "type": "User",
          "login": "dgtized",
          "commits": 30,
          "avatar_url": "https://avatars.githubusercontent.com/u/6784?v=4"
        },
        {
          "type": "User",
          "login": "Malabarba",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/453029?v=4"
        },
        {
          "type": "User",
          "login": "areina",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/10852?v=4"
        },
        {
          "type": "User",
          "login": "yuhan0",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/22216124?v=4"
        },
        {
          "type": "User",
          "login": "mbuczko",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/586537?v=4"
        }
      ],
      "contributors_sampled": 53,
      "top_contributor_share": 0.368
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.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": 0,
            "reason": "0 out of 22 merged PRs checked by a CI test -- score normalized to 0",
            "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/23 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 11 contributing companies or organizations",
            "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 0 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": "2805bd5f505fdb199a8c5a25fca398ec9c161e5b",
        "ran_at": "2026-07-25T20:49:39Z",
        "aggregate_score": 4.4,
        "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-16T15:47:33Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-16T15:28:38Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 182,
          "created_at": "2015-07-03T15:05:13Z",
          "last_comment_at": "2015-10-12T12:44:15Z",
          "last_comment_author": "expez"
        },
        {
          "number": 199,
          "created_at": "2015-07-24T14:37:41Z",
          "last_comment_at": "2015-07-24T16:07:00Z",
          "last_comment_author": "Malabarba"
        },
        {
          "number": 273,
          "created_at": "2015-12-16T08:21:06Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 296,
          "created_at": "2016-02-16T16:06:53Z",
          "last_comment_at": "2019-08-07T14:45:06Z",
          "last_comment_author": "expez"
        },
        {
          "number": 308,
          "created_at": "2016-03-15T14:17:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 383,
          "created_at": "2017-07-07T09:54:08Z",
          "last_comment_at": "2017-07-07T10:57:46Z",
          "last_comment_author": "sooheon"
        },
        {
          "number": 384,
          "created_at": "2017-07-18T04:43:45Z",
          "last_comment_at": "2017-07-18T19:33:42Z",
          "last_comment_author": "raxod502"
        },
        {
          "number": 401,
          "created_at": "2017-12-14T20:07:10Z",
          "last_comment_at": "2017-12-14T22:51:07Z",
          "last_comment_author": "developer2019"
        },
        {
          "number": 404,
          "created_at": "2018-01-18T02:19:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 407,
          "created_at": "2018-01-21T03:53:42Z",
          "last_comment_at": "2018-01-21T16:03:59Z",
          "last_comment_author": "orb"
        },
        {
          "number": 429,
          "created_at": "2018-08-18T09:54:37Z",
          "last_comment_at": "2019-04-01T01:33:53Z",
          "last_comment_author": "JAremko"
        },
        {
          "number": 433,
          "created_at": "2019-01-24T16:09:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 436,
          "created_at": "2019-04-08T08:18:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 437,
          "created_at": "2019-04-10T13:25:15Z",
          "last_comment_at": "2019-08-09T08:53:47Z",
          "last_comment_author": "vemv"
        },
        {
          "number": 451,
          "created_at": "2019-11-06T14:07:43Z",
          "last_comment_at": "2023-04-20T13:39:03Z",
          "last_comment_author": "vemv"
        },
        {
          "number": 461,
          "created_at": "2020-02-16T21:38:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 467,
          "created_at": "2020-04-04T10:48:22Z",
          "last_comment_at": "2020-04-30T11:56:00Z",
          "last_comment_author": "expez"
        },
        {
          "number": 479,
          "created_at": "2021-02-02T05:33:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 488,
          "created_at": "2021-04-30T19:46:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 492,
          "created_at": "2021-07-04T13:18:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/clojure-emacs/clj-refactor.el",
    "host": "github.com",
    "name": "clj-refactor.el",
    "owner": "clojure-emacs"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 64,
      "inputs": {
        "security": 44,
        "vitality": 65,
        "community": 78,
        "governance": 68,
        "engineering": 63
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 65,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 63,
              "human_commit_share": 1,
              "days_since_last_push": 9,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 9 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "63 commits in the last year",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 63
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "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": 76,
            "inputs": {
              "releases_count": 4,
              "latest_release_tag": "v4.0.0",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 776.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "4 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~776.4 days",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 776.4
                    }
                  }
                ],
                "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": 9,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 9 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 78,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "forks": 111,
              "stars": 785,
              "watchers": 25,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "785 stars",
                "points": 46.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 785
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "111 forks",
                "points": 17,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 111
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "25 watchers",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 25
                    }
                  }
                ],
                "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": true,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (GPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "GPL-3.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": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 7.2,
                "status": "met",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "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": 68,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 63,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 53,
              "top_contributor_share": 0.368
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 37% of commits",
                "points": 14.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 37
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "53 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 53
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 11 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "merged_prs": 193,
              "open_issues": 29,
              "closed_issues": 347,
              "issue_closed_ratio": 0.923,
              "closed_unmerged_prs": 30
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "92% of issues closed",
                "points": 43.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "193/223 decided PRs merged",
                "points": 33.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 193,
                      "decided": 223
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "followers": 91,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "clojure-emacs",
              "public_repos": 31,
              "account_age_days": 4749
            },
            "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": "91 followers of clojure-emacs",
                "points": 14.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 91,
                      "login": "clojure-emacs"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "31 public repos, account ~13 yr old",
                "points": 23,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 31
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 63,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 48,
            "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": "0 out of 22 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "refactorings",
                "refactoring-functions",
                "clojure",
                "emacs",
                "emacs-mode",
                "emacs-lisp",
                "cider",
                "nrepl"
              ],
              "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": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "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": 44,
        "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": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.4
            },
            "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": "0 out of 22 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 11 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "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 0 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": 13
            },
            "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": 32,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.61,
              "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": "61 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 32.5,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 61,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "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": "critical",
            "name": "Code legibility for models",
            "note": "Excluded from scoring (no data or not applicable): Manageable file sizes. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "manageable_file_sizes"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "primary_language": "Emacs Lisp",
              "largest_source_bytes": null,
              "source_files_sampled": 0,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Emacs Lisp without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Emacs Lisp"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "no source files detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_source_files",
                    "params": {}
                  }
                ],
                "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-25T20:50:04.920019Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/clojure-emacs/clj-refactor.el.svg",
  "full_name": "clojure-emacs/clj-refactor.el",
  "license_state": "standard",
  "license_spdx": "GPL-3.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.