Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 2 forksdesde feb 2025Ver en GitHub ↗

heyinc/exwiw tiene un índice de salud de 57 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (83/100) y la más baja, Community & Adoption (28/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

57
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

57
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

STORES, Inc.Organización
52 seguidores16 repositorios públicosdesde abr 2020

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
RubyGemsexwiwapunta a otro repositorio; no se puntúa0.9.13-70hace 0 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

83Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
8.3/36Cadencia de commits — 12/52 semanas con commits
18/18Volumen de commits — 572 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year572
human_commit_share0,86
days_since_last_push0
active_weeks_last_year12
Cómo se puntúa
27/27Publica versiones — 61 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~2,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count61
latest_release_tagv0.9.13
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases2,3
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

28Crítico · 18% del índice global
Cómo se puntúa
7.7/60Estrellas — 4 estrellas
0/25Forks — 2 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks2
stars4
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

57Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
10/22.5Distribución de commits — el principal contribuyente firma el 56% de los commits
8.1/13.5Amplitud de contribuyentes — 6 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 4 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled6
top_contributor_share0,556
Cómo se puntúa
31.2/46.8Resolución de issues — 67% de issues cerradas
37.5/38.3Aceptación de PR — 154/157 PR decididos fusionados
6/15OpenSSF Scorecard: Code-Review — Found 2/5 approved changesets -- score normalized to 4
Datos de entrada utilizados
merged_prs154
open_issues5
closed_issues10
issue_closed_ratio0,667
closed_unmerged_prs3
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
12.4/25Alcance del propietario — 52 seguidores de heyinc
21/25Trayectoria — 16 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers52
owner_typeOrganization
is_verified
owner_loginheyinc
public_repos16
account_age_days2303

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

62Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 4 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
12/20OpenSSF Scorecard: CI-Tests — 6 out of 10 merged PRs checked by a CI test -- score normalized to 6
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

65Moderado
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

48En riesgo · 16% del índice global
Cómo se puntúa
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.5Licencia — 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 — sin datos
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,8
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

52Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 76 de 86 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,884
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
18/18Arranque con un solo comando — mise.toml
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — Dockerfile
10/10Práctica demostrada con agentes — 45 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfile
typed_languageno
bootstrap_filesmise.toml
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,45
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Ruby sin configuración de verificación de tipos
55/55Tamaños de archivo manejables — 0/91 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRuby
largest_source_bytes59.497
source_files_sampled91
oversized_source_files0

Datos clave

4estrellas de GitHub
6contribuidores
572commits en los últimos 12 meses
0días desde el último push
61versiones publicadas
1factor bus
5issues abiertas
RubyGemsecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

Historial de estrellas y forks 0 ★ / 2 ⇿
0Estrellas
2Forks

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

111222212025-022025-092026-04

Cada punto abarca 2 días.

OpenSSF Scorecard 4.8 / 10
4.8agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dPackagingpackaging 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
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 10
RegistroPaqueteRestricción de versiónManifiesto
RubyGemsrakeGemfile
RubyGemsrake-compilerGemfile
RubyGemsrspecGemfile
RubyGemsmysql2Gemfile
RubyGemspgGemfile
RubyGemssqlite3Gemfile
RubyGemsmongoGemfile
RubyGemsmongoidGemfile
RubyGemsfakerGemfile
RubyGemsactiverecordGemfile
Todas las dependencias 13

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 10 paquetes directos y 3 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
RubyGemsactiverecorddirecta
RubyGemsfakerdirecta
RubyGemsmongodirecta
RubyGemsmongoiddirecta
RubyGemsmysql2directa
RubyGemspgdirecta
RubyGemsrakedirecta
RubyGemsrake-compilerdirecta
RubyGemsrspecdirecta
RubyGemssqlite3directa
RubyGemsactive_hashindirecta
RubyGemsserdesindirecta
RubyGemstrilogyindirecta
Avisos de dependencias sin evaluar

El cotejo de avisos no pudo ejecutarse para este informe: No resolved dependencies carried a version and a supported ecosystem

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasRubyGems.