Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-28 07:26 UTC

heyinc / exwiw

Export records from a database to a dump file on the specified conditions.

RubyMIT★ 4 Sterne⑂ 2 Forksseit Feb. 2025Auf GitHub ansehen ↗

heyinc/exwiw erreicht einen Gesundheitsindex von 57 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (83/100) ab, am schwächsten bei Community & Adoption (28/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

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

57
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

STORES, Inc.Organisation
52 Follower16 öffentliche Reposseit Apr. 2020

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

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
RubyGemsexwiwverweist auf ein anderes Repo — nicht bewertet0.9.13-70vor 0 Tagen

Metriken nach Kategorie

Vitalität

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

83Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
8.3/36Commit-Rhythmus — 12/52 Wochen mit Commits
18/18Commit-Volumen — 572 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year572
human_commit_share0,86
days_since_last_push0
active_weeks_last_year12

Release-Disziplin

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

Community & Verbreitung

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

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

Nachhaltigkeit & Governance

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

57Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
10/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 56 % der Commits
8.1/13.5Breite der Beitragenden — 6 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 4 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled6
top_contributor_share0,556
Wie die Bewertung erfolgt
31.2/46.8Issue-Lösungsquote — 67 % der Issues geschlossen
37.5/38.3PR-Annahme — 154/157 entschiedene PRs gemergt
6/15OpenSSF Scorecard: Code-Review — Found 2/5 approved changesets -- score normalized to 4
Verwendete Eingangsdaten
merged_prs154
open_issues5
closed_issues10
issue_closed_ratio0,667
closed_unmerged_prs3
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
12.4/25Reichweite des Inhabers — 52 Follower von heyinc
21/25Kontohistorie — 16 öffentliche Repos, Kontoalter ca. 6 Jahre
Verwendete Eingangsdaten
followers52
owner_typeOrganization
is_verified
owner_loginheyinc
public_repos16
account_age_days2.303

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

62Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
12/20OpenSSF Scorecard: CI-Tests — 6 out of 10 merged PRs checked by a CI test -- score normalized to 6
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
0/10Wiki
Verwendete Eingangsdaten
topics
has_wikinein
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

48Gefährdet · 16 % des Gesamtindex

Sicherheitslage

48Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
1.5/2.5CI-Tests — 6 out of 10 merged PRs checked by a CI test -- score normalized to 6
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3/7.5Code-Review — Found 2/5 approved changesets -- score normalized to 4
2.5/2.5Contributors — project has 4 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 15 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_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,8
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): 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.

52Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 76 von 86 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,884
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — mise.toml
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — Dockerfile
10/10Belegte Agentenpraxis — 45 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfileja
typed_languagenein
bootstrap_filesmise.toml
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,45
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Ruby ohne Typprüfungs-Konfiguration
55/55Handhabbare Dateigrößen — 0/91 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageRuby
largest_source_bytes59.497
source_files_sampled91
oversized_source_files0

Eckdaten

4GitHub-Sterne
6Mitwirkende
572Commits, letzte 12 Monate
0Tage seit letztem Push
61Releases
1Bus-Faktor
5offene Issues
RubyGemsPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • rubygems package 'exwiw' points at a different repository (https://github.com/riseshia/exwiw/tree/main); excluded from ecosystem scoring
  • No resolved dependencies carried a version and a supported ecosystem

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 2 ⇿
0Sterne
2Forks

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.

111222212025-022025-092026-04

Jeder Punkt umfasst 2 Tage.

OpenSSF Scorecard 4.8 / 10
4.8Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-28 07:26 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
6CI-Tests6 out of 10 merged PRs checked by a CI test -- score normalized to 6
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
4Code-ReviewFound 2/5 approved changesets -- score normalized to 4
10Contributorsproject has 4 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 15 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
Direkte Abhängigkeiten 10
RegistryPaketVersionsvorgabeManifest
RubyGemsrakeGemfile
RubyGemsrake-compilerGemfile
RubyGemsrspecGemfile
RubyGemsmysql2Gemfile
RubyGemspgGemfile
RubyGemssqlite3Gemfile
RubyGemsmongoGemfile
RubyGemsmongoidGemfile
RubyGemsfakerGemfile
RubyGemsactiverecordGemfile
Alle Abhängigkeiten 13

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

RegistryPaketVersionBeziehung
RubyGemsactiverecorddirekt
RubyGemsfakerdirekt
RubyGemsmongodirekt
RubyGemsmongoiddirekt
RubyGemsmysql2direkt
RubyGemspgdirekt
RubyGemsrakedirekt
RubyGemsrake-compilerdirekt
RubyGemsrspecdirekt
RubyGemssqlite3direkt
RubyGemsactive_hashindirekt
RubyGemsserdesindirekt
RubyGemstrilogyindirekt
Abhängigkeits-Advisories nicht bewertet

Der Advisory-Abgleich konnte für diesen Bericht nicht ausgeführt werden: No resolved dependencies carried a version and a supported ecosystem

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 1767,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "C": 10725,
        "Ruby": 996302,
        "Shell": 49131,
        "JavaScript": 1122
      },
      "pushed_at": "2026-07-28T07:16:17Z",
      "created_at": "2025-02-07T23:43:29Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-28T07:16:42Z",
      "description": "Export records from a database to a dump file on the specified conditions.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Ruby",
      "significant_languages": [
        "Ruby"
      ]
    },
    "owner": {
      "blog": "https://st.inc",
      "name": "STORES, Inc.",
      "type": "Organization",
      "login": "heyinc",
      "company": null,
      "location": null,
      "followers": 52,
      "avatar_url": "https://avatars.githubusercontent.com/u/63282837?v=4",
      "created_at": "2020-04-07T07:08:18Z",
      "is_verified": null,
      "public_repos": 16,
      "account_age_days": 2303
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.13",
          "kind": "patch",
          "published_at": "2026-07-28T07:16:53Z"
        },
        {
          "tag": "v0.9.12",
          "kind": "patch",
          "published_at": "2026-07-09T13:57:36Z"
        },
        {
          "tag": "v0.9.11",
          "kind": "patch",
          "published_at": "2026-07-09T13:47:12Z"
        },
        {
          "tag": "v0.9.10",
          "kind": "patch",
          "published_at": "2026-07-09T07:58:17Z"
        },
        {
          "tag": "v0.9.9",
          "kind": "patch",
          "published_at": "2026-07-09T05:44:20Z"
        },
        {
          "tag": "v0.9.8",
          "kind": "patch",
          "published_at": "2026-07-09T02:58:30Z"
        },
        {
          "tag": "v0.9.7",
          "kind": "patch",
          "published_at": "2026-07-08T06:16:24Z"
        },
        {
          "tag": "v0.9.6",
          "kind": "patch",
          "published_at": "2026-07-08T04:39:28Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-07-07T15:48:46Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-07-07T08:02:16Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-07-02T08:44:05Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-06-30T17:36:16Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-06-30T06:21:29Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-06-30T01:55:07Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-06-25T07:45:47Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-06-24T10:40:13Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-06-24T07:29:06Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-06-24T05:57:07Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-06-24T03:09:06Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-24T01:36:38Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-23T07:06:05Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-06-21T03:42:36Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-06-20T23:59:25Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-20T01:40:09Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-06-19T02:46:30Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-06-18T13:40:49Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-06-18T01:58:41Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-16T00:52:04Z"
        },
        {
          "tag": "v0.4.11",
          "kind": "patch",
          "published_at": "2026-06-15T08:00:41Z"
        },
        {
          "tag": "v0.4.10",
          "kind": "patch",
          "published_at": "2026-06-12T02:21:38Z"
        },
        {
          "tag": "v0.4.9",
          "kind": "patch",
          "published_at": "2026-06-11T08:56:35Z"
        },
        {
          "tag": "v0.4.8",
          "kind": "patch",
          "published_at": "2026-06-11T05:45:32Z"
        },
        {
          "tag": "v0.4.7",
          "kind": "patch",
          "published_at": "2026-06-10T16:03:44Z"
        },
        {
          "tag": "v0.4.6",
          "kind": "patch",
          "published_at": "2026-06-08T06:33:55Z"
        },
        {
          "tag": "v0.4.5",
          "kind": "patch",
          "published_at": "2026-06-08T01:03:09Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-06-05T08:20:34Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-06-05T01:55:20Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-06-05T00:14:53Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-06-04T14:42:37Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-04T09:15:02Z"
        },
        {
          "tag": "v0.3.9",
          "kind": "patch",
          "published_at": "2026-06-03T06:15:15Z"
        },
        {
          "tag": "v0.3.8",
          "kind": "patch",
          "published_at": "2026-06-02T01:53:52Z"
        },
        {
          "tag": "v0.3.7",
          "kind": "patch",
          "published_at": "2026-06-01T15:02:42Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2026-06-01T05:04:39Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-06-01T04:58:05Z"
        },
        {
          "tag": "v0.3.4",
          "kind": "patch",
          "published_at": "2026-05-31T17:50:08Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2026-05-31T13:47:57Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2026-05-31T09:47:40Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-05-31T08:34:29Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-31T07:27:25Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-05-31T07:01:23Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-05-31T03:55:04Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-05-30T05:30:17Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-05-29T09:51:50Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-05-29T08:07:01Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-05-28T02:28:43Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-05-27T01:46:14Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-05-26T07:59:17Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-05-23T13:50:17Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-05-22T04:00:53Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-05-21T11:34:43Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "105358f7ec40a1396843cdd9e1a437c7bda9dc64",
          "body": "chore(release): バージョンを 0.9.13 に bump",
          "is_bot": false,
          "headline": "Merge pull request #177 from heyinc/release/0.9.13",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-28T07:15:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dfe18d5b8ba6abf30c29df4826ae78291a91744",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.13 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-28T07:02:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd33dee95dade06bf5d2e94912798ccae39c2da7",
          "body": "Materialize scope id-sets into session temp tables (mysql adapter)",
          "is_bot": false,
          "headline": "Merge pull request #176 from heyinc/feat/materialize-scope-id-sets",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-28T07:01:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4da18bd78ef5b5652e3756ed5605782010616c9",
          "body": "Read-only replicas such as Aurora MySQL 3 reader instances cannot\ncreate InnoDB temporary tables; with NO_ENGINE_SUBSTITUTION in the\nsession sql_mode (part of the MySQL 8 server default) CREATE TEMPORARY\nTABLE fails with ERROR 3161 instead of substituting a permitted engine.\nStrip that flag once per session before the first materialization; it\nonly governs DDL engine fallback, not query semantics.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Support read-only replicas by stripping NO_ENGINE_SUBSTITUTION",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-28T05:05:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9846ce74e8776ca48c3d986acd2df27a87add298",
          "body": "COUNT(*) re-scanned the whole id-set purely for a log line; ROW_COUNT()\nreturns the CTAS insert count in O(1).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Read materialized id count via ROW_COUNT() instead of COUNT(*)",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-28T04:29:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d701bf217444758e55e283093bb8e738e7c950b8",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Document temp table lifetime on partial materialization failure",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-28T04:23:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ef75fb0c44fb9f12d2f2eea09cf3e0b47bb0172d",
          "body": "The live-server keyword-catalog spec fails against MySQL servers that\nreserve these words; add them to MYSQL_RESERVED_WORDS.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add newer MySQL reserved words: external, qualify, tablesample",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-28T04:23:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b40b36abb869bf5de5d1ef151cb35a8b4194684f",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update CHANGELOG for mysql scope id-set materialization",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-28T03:31:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a61e5f67bf417d4e1f11fed04ba8e1caa02ab00f",
          "body": "The same scope subquery (e.g. a multi-arm reverse_scope UNION over large\ntables) was embedded in every descendant table's extraction query and\nre-evaluated by the server once per table, dominating export time on\nlarge tenants. During export, compute each distinct id-set once into an\nindexed session \n[…]\nhe inline form and executes nothing. On temp-table creation\nfailure, disable materialization for the run and fall back to the\ninline subqueries.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Materialize scope id-sets into session temp tables in mysql adapter",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-28T03:31:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "550e664205c671d94191e40640d663db84ee417c",
          "body": "chore(release): バージョンを 0.9.12 に bump",
          "is_bot": false,
          "headline": "Merge pull request #172 from heyinc/release/0.9.12",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T13:56:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03d7ec6e7e859c462abf9059586c1225bc091124",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.12 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-09T13:53:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe9d965e482198d011d8577310159b6f85168ce1",
          "body": "feat: MongoDB adapter で replace_with_fake_data をサポート",
          "is_bot": false,
          "headline": "Merge pull request #170 from heyinc/feat/mongodb-replace-with-fake-data",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T13:53:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc52a15665631a4ed54b6b4227b31eae1af0b99c",
          "body": "あわせて 0.9.8 セクションに残っていたコンフリクトマーカーを除去。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: CHANGELOG に MongoDB replace_with_fake_data 対応を追記",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T13:47:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ccda4c127153dfcd1dd3341997f029d1907bf975",
          "body": "chore(release): バージョンを 0.9.11 に bump",
          "is_bot": false,
          "headline": "Merge pull request #171 from heyinc/release/0.9.11",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T13:46:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b417626d183bc544fcaea346008d7ec40a81d1d",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.11 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-09T13:45:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "278cb52f55092d7d19ca2b2a422f6fc9fea730ca",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into feat/mongodb-replace-with-fake-data",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T13:44:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e35f56e2acf2157310ce15f8b52308a4507fcff",
          "body": "force quote to reserve words",
          "is_bot": false,
          "headline": "Merge pull request #169 from heyinc/feature/force_quote_to_reserve_words",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T13:44:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "567d650f145dc4704b0d004c8d89bf2192cfb4e2",
          "body": "Updated changelog to include new features and fixes related to identifier quoting and PostgreSQL sequence synchronization.",
          "is_bot": false,
          "headline": "Update CHANGELOG.md for new features and fixes",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T13:42:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc8248ab8312e311577324e0d86b77b3b067d7a0",
          "body": "SQL adapter のみ対応していた replace_with_fake_data を MongoDB adapter でも\n利用可能にする。フェイク値生成ロジックを RowTransformer のクラスメソッド\n(build_value_deriver 等) に抽出し、SQL と MongoDB で共有することで、同一の\nseed 値から byte-identical なフェイク値を導出する。\n\n- MongodbField に replace_with_fake_data 属性を追加\n- MongodbCollectionConfig でバリデーション (replace_with と\n[…]\n MongodbAdapter の mask plan に faked_fields を追加し、replace_with の後に\n  document-side で適用 (埋め込みサブドキュメントにも再帰適用)\n- 対応する spec と README を更新\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: MongoDB adapter で replace_with_fake_data をサポート",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T13:32:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "291a27330c4a984adecf9bd5a75403ab93164976",
          "body": null,
          "is_bot": false,
          "headline": "resolve conflict",
          "author_name": "yu_yukk_y",
          "author_login": "Yoshino-Yukitaro",
          "committed_at": "2026-07-09T08:24:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71a0958eea6e031d2beeb7349bea35cb460414ca",
          "body": "chore(release): バージョンを 0.9.10 に bump",
          "is_bot": false,
          "headline": "Merge pull request #168 from heyinc/release/0.9.10",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T07:57:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "808dcb343df21b1d5bfc1191874637d74c89607a",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.10 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-09T07:55:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "326ab272aaf551c6b069ca168297a9d890823582",
          "body": "…oad-error\n\nfix: skip CREATE EXTENSION on internal_error (pglogical 等の preload 必須拡張)",
          "is_bot": false,
          "headline": "Merge pull request #167 from heyinc/fix/create-extension-swallow-prel…",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T07:54:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "424de42c52ce1aa6b3e404051cfbdf97f34f5b04",
          "body": "…ke pglogical)\n\nA whole-database schema restore aborted when the source dump carried a\npreload-required extension (e.g. pglogical) that the restore target does not\nhave in shared_preload_libraries. Such an extension raises a bare\nelog(ERROR, \"<name> is not in shared_preload_libraries\") whose default\n[…]\nalongside feature_not_supported / invalid_schema_name and\nre-raise as a WARNING, so the extension is skipped and the restore continues.\ninsufficient_privilege (42501) is still deliberately not caught.",
          "is_bot": false,
          "headline": "fix: skip CREATE EXTENSION on internal_error (preload-required ext li…",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T07:16:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e5a4e6fdce308b32dc96a4079014975d609d933",
          "body": "chore(release): バージョンを 0.9.9 に bump",
          "is_bot": false,
          "headline": "Merge pull request #165 from heyinc/release/0.9.9",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T05:43:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d10ad93d944c9da5cdc0a6148dd6cd0e67b5efff",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.9 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-09T05:30:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13099116c8bf608c5f3043a12a60811089d48b96",
          "body": "…e-data\n\nfeat: 人物系 fake data の同一人物整合と日本語カナ type",
          "is_bot": false,
          "headline": "Merge pull request #163 from heyinc/feat/coherent-person-and-kana-fak…",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T05:30:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "434efc392964031955749bdc7a537615b8c0b08d",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: CHANGELOG に予約語識別子クォート対応を追記",
          "author_name": "yu_yukk_y",
          "author_login": "Yoshino-Yukitaro",
          "committed_at": "2026-07-09T04:42:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4fd4d0fc3b71bfcff62442aae04ec1f32d3c6159",
          "body": "予約語リストがドリフトしたときに CI で検出できるよう、リスト自体を\n実エンジンに対して検証する spec を追加する。\n\n- mysql / postgresql: 稼働中サーバーの予約語カタログ\n  (INFORMATION_SCHEMA.KEYWORDS / pg_get_keywords())がリストに包含される\n  ことを assert(サーバー更新で予約語が増えたらビルドが落ちる。\n  mysql 9 の LIBRARY が前例)\n- sqlite: 全キーワードを exwiw の全 emission 位置で probe し、\n  SQLITE_RESERVED_WORDS と完\n[…]\n新予約語と\n  stale エントリの両方向のドリフトを検出)\n- quote_identifier / quote_table_name の単体検証: $ 入り名のベア維持、\n  予約語の大小文字保持、クォート文字の二重化、ドット入り名の\n  パート単位クォートとコンパイラ経由での出力\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: 予約語リストの実測検証 spec を追加",
          "author_name": "yu_yukk_y",
          "author_login": "Yoshino-Yukitaro",
          "committed_at": "2026-07-09T04:42:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "659b079ba0c822709a9161827e810c6e1a24c8b5",
          "body": "予約語だけで構成したテーブル(order / from / to / group / references)の\nAST ビルダーを ast_factory に追加し、3 アダプタそれぞれで検証する。\n\n- コンパイル結果: SELECT・マスキング・JOIN・scope JOIN・INSERT ヘッダ・\n  COPY ヘッダ(postgresql)・DELETE のクォート、および安全な識別子が\n  一切クォートされないこと(バイト同一出力の回帰)\n- live ラウンドトリップ: 実 DB(sqlite は一時ファイル、mysql / postgresql\n  は TEMPORARY テーブ\n[…]\n → 生成 DELETE 適用 → 生成 INSERT 復元を\n  段階ごとの context で検証\n- postgresql: serial PK を持つ予約語・大文字混じりテーブル(\"Order\")で\n  post_insert_sql が実行可能な setval を返すことを検証\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: 予約語識別子クォートのアダプタ spec を追加",
          "author_name": "yu_yukk_y",
          "author_login": "Yoshino-Yukitaro",
          "committed_at": "2026-07-09T04:42:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9fd60327f502e68cc3ad9c72a7ecb54ccd357d1f",
          "body": "予約語(order / from / group 等)やベア識別子として無効な文字を含む\nテーブル・カラム名を、必要な場合のみクォートする IdentifierQuoting を\n導入する(mysql はバッククォート、postgresql / sqlite はダブルクォート)。\nSELECT 射影・マスキング式・FROM/JOIN・WHERE・サブクエリ・scope JOIN・\nINSERT / COPY ヘッダ・DELETE の全 emission パスに適用する。\n\n- 通常の名前は素のまま出力し、既存 config のダンプ出力はバイト同一を\n  維持する(mysql INSERT ヘ\n[…]\nるため、クォート済みの名前を渡すよう修正\n- 各アダプタは dialect サブモジュール(IdentifierQuoting::Mysql 等)を\n  include 1 行で導入し、フック未定義の include は NotImplementedError で\n  契約違反を検出する\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: SQL アダプタで予約語・特殊文字識別子を条件付きクォート",
          "author_name": "yu_yukk_y",
          "author_login": "Yoshino-Yukitaro",
          "committed_at": "2026-07-09T04:42:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "61fe3917e33377784dccd72190f88ca94739d715",
          "body": "人物プールは POOL_SIZE と同じ 10,000 で、しかも重複ありサンプリングのため\n実効的な人物は約6,288種しかなかった。人物系専用の PERSON_POOL_SIZE=20,000 を\n導入し(他 type の seed→値マッピングは不変)、ja は全組み合わせ列挙+シャッフルで\n20,000種の別人を充填。名前データを 142x142=20,164 組に拡張。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: 人物プールを独立サイズ(PERSON_POOL_SIZE=2x)にし ja を重複なしで充填",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T03:57:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff9face33d21eba7fedf661595a4b3ecaaefe479",
          "body": "姓60・名61 (3,660組) はプールサイズ 10,000 を下回り種類が不足していた。\nfaker の ja 漢字セットに読み仮名を付けて姓100・名100 (=10,000組) に拡張。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: JapaneseNames を faker 相当の姓100・名100に拡張しプールを充填",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T03:41:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "15ff50eb2c454e60ebc7d688f20bd510b2b23dde",
          "body": "…and-kana-fake-data\n\n# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into feat/coherent-person-…",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T03:35:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "871714e07bdb08301aee063df40a516e6d0cf089",
          "body": "replace_with_fake_data の human_name/first_name/last_name が別々のプールから\n引かれ、1つの seed でも姓・名・フルネームが別人になっていた問題を修正。\n人物系 type をロケールごとの単一 Person プールに統合し、同じ seed は必ず\n同じ人物を引くようにした(name == 姓+名、フルネーム語順はロケール依存)。\n\nfaker の ja ロケールは漢字のみで読み仮名を持たないため、(漢字, カナ) ペアの\nExwiw::JapaneseNames を同梱し ja はここから生成。カナ type\n(human_name_kana/last_name_kana/first_name_kana) を追加した(ja 専用)。\nja 名前のみの config は faker 不要。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: 人物系 fake data を同一人物で整合させ、日本語カナ type を追加",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-09T03:34:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5099b601417a58d77264b1c261f4cc2be0a02313",
          "body": "chore(release): バージョンを 0.9.8 に bump",
          "is_bot": false,
          "headline": "Merge pull request #162 from heyinc/release/0.9.8",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-09T02:57:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "874059286dd946859dab5f4d2dd48f90df70c5d1",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.8 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-09T02:53:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c128f695955a06cd5f3bf52c117bb2e9af1b864b",
          "body": "…ict-keys\n\nfeat(mongodb): reverse_scope support + strict unknown-key validation for schema configs",
          "is_bot": false,
          "headline": "Merge pull request #161 from heyinc/feature/mongodb-reverse-scope-str…",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-09T02:49:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3c21c7e4a9703c166c4800f060cd3f7eece1fda",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-09T01:28:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "979cdb39a7de74399ffbdd0aeb4d46f80c371e98",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-09T01:28:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "922ce38e8fd7a6c22049de61ade21d91955e30f9",
          "body": "- README: new \"reverse_scope on collections\" subsection under MongoDB\n  notes (runtime capture, processing order, arm hygiene, precedence,\n  parallel fallback, explain), cross-linked from the SQL reverse_scope\n  section; new \"Unknown keys are rejected\" subsection under\n  Configuration, with the sile\n[…]\nnd a trailing comma) that the\n  strict validation would now correctly reject.\n- CHANGELOG: [Unreleased] Added/Changed entries for both features.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Document MongoDB reverse_scope support and strict unknown-key validation",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T10:15:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "112e442fc430d4721bfbd9b94b39cc1719854a6e",
          "body": "Serdes deserialization is lenient: a key that matches no declared\nattribute is silently dropped. For hand-maintained schema configs that\nturns a typo (`reverse_scop`, `bulk_insert_chunk_sise`) — or a key one\nadapter supports but another does not (`raw_sql`/`map` on a MongoDB\nfield, `reverse_scope` o\n[…]\nngs_to/column/field entries) still passes, so a config that\nonly uses supported keys is unaffected, and anything else was already\nbeing ignored.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Reject unknown keys in schema configs instead of silently dropping them",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T10:11:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4841524bef62e184269c1b776b31c63f7cdbaaed",
          "body": "The multi-referencer reverse scoping that TableConfig already offers for\nthe SQL adapters (constrain a global-identity table to the union of the\nids its enumerated referencers point at) was not available for MongoDB:\nMongodbCollectionConfig did not declare the key, so a reverse_scope in a\ncollection\n[…]\nen a reverse-scoped\ncollection is present (its schedule does not express the new ordering\nconstraint yet). Masking/fields behavior is unchanged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Support reverse_scope in the MongoDB adapter",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T10:06:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "38dad424eaf8696d581e2f7cbf4ed9bb3f993bb5",
          "body": "chore(release): バージョンを 0.9.7 に bump",
          "is_bot": false,
          "headline": "Merge pull request #160 from heyinc/release/0.9.7",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-08T06:15:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fefa1276b74f984a40cf075639948b695bc230d2",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.7 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-08T06:12:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98094837af90d8c86f43f29f56a37acabe626378",
          "body": "map / replace_with_fake_data マスキングモードの追加",
          "is_bot": false,
          "headline": "Merge pull request #159 from heyinc/add-map-and-fake-data-masking",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-08T06:11:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af7503ca0330128bbbaa5cda5cbdda648c8c93ec",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into add-map-and-fake-data-masking",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-08T05:57:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58b8f40403e4af05d1817a4840c196e303501150",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: README の map TODO を解消し replace_with_fake_data を記載",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-08T05:48:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19d76e19bb59693a6613bb68fdc3c9279cf0db8f",
          "body": "2M/5M 行で実測: fake 1列 +1.5〜1.6µs/row(5M行 ≈ +8s)、map +0.6〜0.8µs/row。\nRSS はフラットでストリーミング特性は維持。naive per-row faker(~30µs)を\n棄却しプール方式にした根拠と、計測の落とし穴(psサンプラのfork、\n初回計測のヒープ拡張吸収)も記録。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "bench: 行変換オーバーヘッドのベンチと計測ノートを追加",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-08T05:48:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ef803e5badaa22cd20e47688904aafe969a552e0",
          "body": "決定性は独立 build した transformer 同士の一致で検証し、faker の\nバージョンに依存する literal は固定しない。golden snapshot には\n決定的な map のみ追加(3アダプタ INSERT + pg COPY をカバー)。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: map / replace_with_fake_data の spec と golden snapshot を追加",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-08T05:48:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51a82454924317f6d23af060fca8179bc0bd12bb",
          "body": "map は config の proc 文字列を1回 eval して行ごとに適用。\nreplace_with_fake_data は seed 列値の SHA-256 から faker 生成の\nプール(type/locale ごとに固定 seed で1万件事前生成)を引く決定的な\n偽データ化。email/username は 64bit hex token を埋め込み unique index\nでも衝突しない。faker は lazy require で runtime 依存にはしない。\n未使用テーブルでは wrap 自体をスキップするので従来と完全に同一。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Ruby側マスキング map / replace_with_fake_data を追加(SQLアダプタ)",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-08T05:48:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e40b9424fb797c90e8dfa6506dfaaf46e59c3a8f",
          "body": "chore(release): バージョンを 0.9.6 に bump",
          "is_bot": false,
          "headline": "Merge pull request #158 from heyinc/release/0.9.6",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:38:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9be14ee129990873ea69d1ec32847e1806d1274",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.6 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-08T04:35:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfe782d7abd767ea6fcf57409e145be65794429f",
          "body": "feat(mongodb): collection-targeted output for the after-insert hook",
          "is_bot": false,
          "headline": "Merge pull request #157 from heyinc/feat/mongodb-hook-collection-output",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:32:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d89f3011e841128f99a70a30f8742eb4ca69dd8",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into feat/mongodb-hook-collection-output",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aced0d8ec0be822be648f4ddeac76936efbeb0d9",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:29:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bfa6c505566d096eb3e8950e089a0040a082b4b6",
          "body": "Escape newline and control characters in MySQL string values",
          "is_bot": false,
          "headline": "Merge pull request #154 from heyinc/fix-mysql-escape-newlines",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:29:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37faf4e4925385a0e953203bd5f036134d5365a7",
          "body": "…fix-mysql-escape-newlines",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/fix-mysql-escape-newlines' into …",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:26:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0db394c1b4711cb0f84532311c362558bb33b13",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:25:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d83e17f1add89b159f9ba60fdebbb8d0c0c03e0",
          "body": "…ines\n\n# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into fix-mysql-escape-newl…",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:24:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2613dc0734aa185763d7c519a5f799293be90475",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:17:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "16043dfb7f73a75700e269699e20461887bd7522",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document collection-targeted insert_jsonl in README and CHANGELOG",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:02:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c29465888e8a3f0e0eecc18a88984c920d9b3fe",
          "body": "… hook\n\nThe Ruby after-insert hook wrote all output to a single collection-less\ninsert-{N+1}-after_insert.{ext} file. SQL statements carry their table\nname in-band, so that is enough for the SQL adapters — but the MongoDB\nimport convention derives the target collection from the filename\n(insert-NNN-\n[…]\nename-based\nimport tooling works unchanged. The single-argument form is untouched,\nand the collection form raises ArgumentError on SQL adapters.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mongodb): support collection-targeted output in the after-insert…",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-08T04:02:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fe4a121b1392e6901299ddb03b946cf1b6c1c507",
          "body": "chore(release): バージョンを 0.9.5 に bump",
          "is_bot": false,
          "headline": "Merge pull request #156 from heyinc/release/0.9.5",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-07T15:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9146437c6a4df9fe33a6b84b4856d11007b4ad60",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.5 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-07T14:14:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa9773782c5bd4d48583810aeec934eee279b0dc",
          "body": "fix: スキップした extension の COMMENT ON EXTENSION でリストアが落ちないようにする",
          "is_bot": false,
          "headline": "Merge pull request #155 from heyinc/fix/comment-on-extension-skip",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-07T14:13:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ca26cb9d691dbfa2ee7d5915916cfe88c59ba0e",
          "body": "全DBスキーマダンプ導入後、pg_dump は CREATE EXTENSION に続けて\nCOMMENT ON EXTENSION も出力する。CREATE が feature_not_supported で\nスキップされた場合(AlloyDB の google_vacuum_mgmt を vanilla PostgreSQL に\n流す等)、裸の COMMENT が undefined_object でリストア全体を落としていた。\n\nCOMMENT ON EXTENSION を undefined_object を握りつぶす DO ブロックで囲む\n後処理パスを追加。拡張が存在すれば適用、無ければ no-op となり、\nmanaged-platform 拡張全般がクリーンにスキップされる。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: スキップした extension の COMMENT ON EXTENSION でリストアが落ちないようにする",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-07T14:07:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9a030106cded553ff7847aa592b3cf1d777091e",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-07-07T10:13:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4266ae5d2d66d20ee5936fa75e961df43c8f9bdb",
          "body": "The MySQL adapter wrote newlines and other control characters raw, so a\nstring value containing a newline was emitted with a literal line break\ninside its VALUES tuple. That is valid SQL, but it breaks consumers that\nsplit a dump into statements on a semicolon-newline boundary: a value\ncontaining ';\n[…]\nway mysqldump does so every tuple stays\non a single line. Single-quote doubling is unchanged; the SQLite and\nPostgreSQL adapters are unaffected.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Escape newline and control characters in MySQL string values",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-07-07T10:07:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b5802abaf582c51b95e156a0f8cb9ec9146d55f2",
          "body": "chore(release): バージョンを 0.9.4 に bump",
          "is_bot": false,
          "headline": "Merge pull request #153 from heyinc/release/0.9.4",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-07T08:01:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32763a6a25b0d3db14823c03a942650e9df6531d",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.4 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-07T07:58:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "362b511c39ace4919b705af28220391599cea9fe",
          "body": "schema dump: emit DDL for the whole database, not just config tables",
          "is_bot": false,
          "headline": "Merge pull request #152 from heyinc/feat/full-schema-dump",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-07T07:57:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed7b963bbb9ec54c684b14dfa366c70d41a03775",
          "body": "The SQL adapters restricted the schema dump to config-scoped tables\n(pg_dump --table / mysqldump <db> <t...> / sqlite_master filtered by\nordered_tables), so a table without a JSON config was absent from\ninsert-000-schema.sql and a restore target hit \"relation does not exist\".\n\nAll three SQL adapters\n[…]\nn place: enums in a\nduplicate_object DO block, extensions in a feature_not_supported /\ninvalid_schema_name warn-and-skip DO block.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "schema dump: emit DDL for the whole database, not just config tables",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-07T07:19:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f3d8b59946856574d31df5590b8b73490d3e40c",
          "body": "chore(release): バージョンを 0.9.3 に bump",
          "is_bot": false,
          "headline": "Merge pull request #151 from heyinc/release/0.9.3",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-02T08:43:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9265953d8c9160d62e31f8683a351dfcebc0176f",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.3 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-02T08:42:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68e5f7cc662792b88623da11caab94bbcd104404",
          "body": "fix(cli): STDOUT が pipe のとき進捗ログをリアルタイムに flush する",
          "is_bot": false,
          "headline": "Merge pull request #150 from heyinc/fix/stdout-sync-progress-logs",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-02T08:42:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84caedc704fee7ab2b4e6034798818bbbb63dfd4",
          "body": "親プロセスにキャプチャされる等で STDOUT が TTY でない場合、Logger.new(STDOUT)\nがブロックバッファリングされ、長時間の export/explain の per-collection 進捗が\nbuffer が埋まるかプロセス終了まで表示されず stall に見えていた。logger 構築前に\nSTDOUT.sync = true を設定し各ログ行を即時 flush する。データ出力はファイルに書かれ\nるため dump スループットには影響しない。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): STDOUT が pipe のとき進捗ログをリアルタイムに flush する",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-07-02T08:39:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bbefa3e2d71063005aab0d14ee97f1fb82a5a06a",
          "body": "chore(release): バージョンを 0.9.2 に bump",
          "is_bot": false,
          "headline": "Merge pull request #149 from heyinc/release/0.9.2",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-30T17:34:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b6f1d78268b5506ee5d4b17f40e97f8633faaf0",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.2 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-30T17:30:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4031e08e4267ae38332a5e7990f6ca7e672d59d",
          "body": "feat(mongodb): クエリ timeout を global + per-collection で設定可能に",
          "is_bot": false,
          "headline": "Merge pull request #148 from heyinc/feat/mongodb-query-timeout",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-30T17:30:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8a0fb569def3c4dc067c76de19c069a05f5f241",
          "body": "意図せず高負荷/未スコープなクエリが本番ソースを占有し続けるのを防ぐため、サーバ側強制の CSOT timeout を追加。global は --mongodb-query-timeout-ms(config の mongodb_query_timeout_ms)、per-collection は schema の query_timeout_ms で上書きする。timeout 発火時は run 全体を失敗させる。find cursor 全体・count・実行を伴う explain に適用し、fork-parallel dump も自動継承する。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mongodb): クエリ timeout を global + per-collection で設定可能に",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-30T17:25:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b19c014abd77d5be2afb5c80483717c0fe4ee023",
          "body": "chore(release): バージョンを 0.9.1 に bump",
          "is_bot": false,
          "headline": "Merge pull request #147 from heyinc/release/0.9.1",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-06-30T06:20:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c2cf6cfffefbdcbf1749e77841be5d6732e5b23",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.1 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-30T06:16:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31ada19df3e7c2e648e09b0cf6b66a970fbb5e99",
          "body": "…atellite-cascade\n\nFix reverse_scope satellite cascade in single-target mode",
          "is_bot": false,
          "headline": "Merge pull request #144 from heyinc/fix/single-target-reverse-scope-s…",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-06-30T06:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e31f466700aaaa6f2fa7ab2f600fae72eb990f67",
          "body": "…erse-scope-satellite-cascade",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into fix/single-target-rev…",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-06-30T06:12:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76599ca6baa2e2ebd5914420114c88259c457fa4",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): note single-target reverse_scope cascade fix",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-06-30T05:55:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d3508ca336e3d4f572b19a2dfad99f127e96fd6a",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-06-30T05:31:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d80997ebdc252c1c298e0372434ac90f78a85a2e",
          "body": "Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Potential fix for pull request finding",
          "author_name": "Satomi N",
          "author_login": "nyancat3",
          "committed_at": "2026-06-30T05:31:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "365dac7eb6f4cf4803a4052eb4463f0ad734e69f",
          "body": "#run can resolve the candidate list twice for the same table (once via\nbuild_belongs_to_scoped_clause, once for the ambiguous-parent warning), and\neach pass recursively builds every parent's query. Memoize per table name on\nthe builder instance to avoid duplicating that work on large schemas.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(query_ast_builder): memoize scopable_parent_candidates",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-06-30T05:22:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9dc388d886dca37579a44ac58406309ff48a34c5",
          "body": "chore(release): バージョンを 0.9.0 に bump",
          "is_bot": false,
          "headline": "Merge pull request #146 from heyinc/release/0.9.0",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-30T01:53:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b361ae25c7512c2d88cd0132304b405b07dfb4e2",
          "body": null,
          "is_bot": true,
          "headline": "chore(release): バージョンを 0.9.0 に bump",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-30T01:44:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "486bbc4318f925181de84ef368a00b1c604071a1",
          "body": "feat(mongodb): explain サブコマンド対応",
          "is_bot": false,
          "headline": "Merge pull request #145 from heyinc/feat/mongodb-explain",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-30T01:44:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52b4f407563d4072e6c731cd457d2d529ef2bc58",
          "body": "explain は実行しないため親idの実行時伝播が走らず、スコープ子コレクションが match-nothing(_id $in [])に潰れ、本来の foreign_key で index が効くか判定できなかった。explain 時のみ parent_state_for がプレースホルダ id を返すようにし、本来の foreign_key フィルタ形状(例 users -> {shop_id: {$in:[...]}})を再現。queryPlanner は値でなくフィールドで index を選ぶので IXSCAN/COLLSCAN は正しく出る。実dump側は無影響。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mongodb): explain でスコープ子をプレースホルダidで実態フィルタにする",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-30T01:40:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8f04a5bbc5ee3df5d09fd0b73b78b6e3d9209103",
          "body": "verbosity は EXWIW_MONGODB_EXPLAIN_VERBOSITY 環境変数または config の explain_verbosity で設定可能(queryPlanner / executionStats / allPlansExecution)。デフォルトの queryPlanner は実クエリを発行しない安全なモード。ExplainRunner は adapter 非依存の describe_query を出力するようにし、SQL adapter の出力は従来どおり。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mongodb): explain サブコマンドを mongodb adapter に対応",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-30T01:22:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6dc34f1ce33949514e01056c849899c41ded58fc",
          "body": "…y precedence\n\nNote that in single-target mode the reverse_scope satellite cascade has no\nscope-column pre-flight, so an unresolvable satellite is full-dumped with a\nwarning instead of aborting. Document that referenced-by scoping is preferred\nover the hub cascade, which can under-scope, and how to force the hub cascade.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): clarify single-target cascade behavior and referenced-b…",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-06-29T09:12:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca64df6788b052210594419d746b4cba2effc159",
          "body": "…dumped\n\nIn single-target mode the forward cascade requires a single unambiguous\nscopable parent. When a table belongs_to two or more scopable parents the\ncascade bails and the table is dumped in full, which in a multi-tenant schema\nis a silent cross-tenant dump.\n\nEmit a warning in that case so the \n[…]\nes so the cascade and the warning share the\nsame parent resolution; only an unscopable, non-exempt table at the top level\ntriggers the warning.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(query_ast_builder): warn when a single-target satellite is full-…",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-06-29T09:11:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a6bcd8a73d7cb22829ba56c251389aa0a2265e4",
          "body": "…rget mode\n\nA satellite (a table that belongs_to a reverse_scope'd hub) was only scoped\nin scope-column mode. In single-target / PK-anchor mode the hub itself was\nscoped via reverse_scope, but its belongs_to children fell through to a full\ndump because the forward \"scope via a scoped belongs_to pare\n[…]\n of #run when a non-target table has no path to the dump target, so its\nrows tighten to the parent's in-scope ids instead of dumping every row.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(query_ast_builder): cascade reverse_scope satellites in single-ta…",
          "author_name": "nyancat3",
          "author_login": "nyancat3",
          "committed_at": "2026-06-29T09:09:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "288d7b5bf171d0f0e324b79e78c798377e2f7c6b",
          "body": "…ion-summary\n\nfeat(mongodb): parallel dump で collection ごとの抽出件数サマリーを出力",
          "is_bot": false,
          "headline": "Merge pull request #143 from heyinc/feat/mongodb-parallel-per-collect…",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-25T14:42:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "485b8d90bf5d3d55181e1da9c3e50a734006e11e",
          "body": "fork 並列ダンプは集計値しかログに出さず、leaf/ref_bt は子プロセスで抽出されるため collection ごとの件数が親プロセスに戻っていなかった。各 worker が consumed-leaf @state と同じ Marshal sidecar IPC で件数を返し、親で genuine 分とマージして処理順に1行ずつログ出力する。出力ファイルには触れないので byte-identity は維持。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mongodb): parallel dump で collection ごとの抽出件数サマリーを出力",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-25T14:39:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "307a84c9fbc86508f6e36a7f368c51bdd30f4155",
          "body": "chore(release): バージョンを 0.8.5 に bump",
          "is_bot": false,
          "headline": "Merge pull request #142 from heyinc/release/0.8.5",
          "author_name": "ykpythemind",
          "author_login": "ykpythemind",
          "committed_at": "2026-06-25T07:44:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 61,
      "commits_last_year": 572,
      "latest_release_at": "2026-07-28T07:16:53Z",
      "latest_release_tag": "v0.9.13",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 2.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "exwiw",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": false,
          "registry_url": "https://rubygems.org/gems/exwiw",
          "is_deprecated": false,
          "latest_version": "0.9.13",
          "repository_url": "https://github.com/riseshia/exwiw/tree/main",
          "versions_count": 70,
          "total_downloads": 52553,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2025-02-17T11:51:53.286000Z",
          "latest_published_at": "2026-07-28T07:16:21.791000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 2,
      "stars": 4,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2025-02-08",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_forks": 2
      },
      "star_history": null,
      "open_issues_and_prs": 8
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "mise.toml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 59497,
      "source_files_sampled": 91,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Gemfile"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "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": 13,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "rake",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "rake-compiler",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "rspec",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "mysql2",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "pg",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "sqlite3",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "mongo",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "mongoid",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "faker",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "activerecord",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "activerecord",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "faker",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "mongo",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "mongoid",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "mysql2",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pg",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rake",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rake-compiler",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rspec",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "sqlite3",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "active_hash",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "serdes",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "trilogy",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 13,
        "direct_count": 10,
        "indirect_count": 3
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 154,
        "open_issues": 5,
        "closed_ratio": 0.667,
        "closed_issues": 10,
        "closed_unmerged_prs": 3
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "ykpythemind",
          "commits": 351,
          "avatar_url": "https://avatars.githubusercontent.com/u/22209702?v=4"
        },
        {
          "type": "User",
          "login": "riseshia",
          "commits": 143,
          "avatar_url": "https://avatars.githubusercontent.com/u/7338443?v=4"
        },
        {
          "type": "User",
          "login": "nyancat3",
          "commits": 123,
          "avatar_url": "https://avatars.githubusercontent.com/u/40054261?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "Yoshino-Yukitaro",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/67864326?v=4"
        },
        {
          "type": "User",
          "login": "ryoh827",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/15053874?v=4"
        }
      ],
      "contributors_sampled": 6,
      "top_contributor_share": 0.556
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "e2e.yml",
        "release-pr.yml",
        "release.yml",
        "rspec.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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 6,
            "reason": "6 out of 10 merged PRs checked by a CI test -- score normalized to 6",
            "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": 4,
            "reason": "Found 2/5 approved changesets -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 4 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 15 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": "105358f7ec40a1396843cdd9e1a437c7bda9dc64",
        "ran_at": "2026-07-28T07:26:08Z",
        "aggregate_score": 4.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-28T07:16:56Z",
      "oldest_open_prs": [
        {
          "number": 122,
          "created_at": "2026-06-20T01:46:10Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 164,
          "created_at": "2026-07-09T03:43:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 173,
          "created_at": "2026-07-16T00:12:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-28T07:15:39Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 65,
          "created_at": "2026-06-01T06:25:52Z",
          "last_comment_at": "2026-06-02T01:29:00Z",
          "last_comment_author": "ykpythemind"
        },
        {
          "number": 66,
          "created_at": "2026-06-01T06:46:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 101,
          "created_at": "2026-06-15T08:12:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 112,
          "created_at": "2026-06-18T14:39:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 166,
          "created_at": "2026-07-09T05:31:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/heyinc/exwiw",
    "host": "github.com",
    "name": "exwiw",
    "owner": "heyinc"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 48,
        "vitality": 83,
        "community": 28,
        "governance": 57,
        "engineering": 62
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "commits_last_year": 572,
              "human_commit_share": 0.86,
              "days_since_last_push": 0,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "572 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 572
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 61,
              "latest_release_tag": "v0.9.13",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 2.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "61 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 61
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 28,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 2,
              "stars": 4,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "2 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 6,
              "top_contributor_share": 0.556
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 56% of commits",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 56
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "6 contributors",
                "points": 8.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 4 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "merged_prs": 154,
              "open_issues": 5,
              "closed_issues": 10,
              "issue_closed_ratio": 0.667,
              "closed_unmerged_prs": 3
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "67% of issues closed",
                "points": 31.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 67
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "154/157 decided PRs merged",
                "points": 37.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 154,
                      "decided": 157
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/5 approved changesets -- score normalized to 4",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 63,
            "inputs": {
              "followers": 52,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "heyinc",
              "public_repos": 16,
              "account_age_days": 2303
            },
            "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": "52 followers of heyinc",
                "points": 12.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 52,
                      "login": "heyinc"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "16 public repos, account ~6 yr old",
                "points": 21,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 16
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "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": 62,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "6 out of 10 merged PRs checked by a CI test -- score normalized to 6",
                "points": 12,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 48,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "6 out of 10 merged PRs checked by a CI test -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 2/5 approved changesets -- score normalized to 4",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 4 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 15 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": 6
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 52,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.884,
              "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": "76 of 86 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 76,
                      "sampled": 86
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [
                "mise.toml"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.45,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "mise.toml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "mise.toml"
                    }
                  }
                ],
                "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": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "45 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 45,
                      "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": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Ruby",
              "largest_source_bytes": 59497,
              "source_files_sampled": 91,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Ruby without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Ruby"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/91 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 91,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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",
    "rubygems package 'exwiw' points at a different repository (https://github.com/riseshia/exwiw/tree/main); excluded from ecosystem scoring",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T07:26:27.216388Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/h/heyinc/exwiw.svg",
  "full_name": "heyinc/exwiw",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenRubyGems.