Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 00:48 UTC

acesuares / inline_forms

Inline Forms

Ruby · HTMLMIT★ 24 estrellas⑂ 15 forksdesde ene 2011Ver en GitHub ↗

acesuares/inline_forms tiene un índice de salud de 54 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (77/100) y la más baja, Security (39/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

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

54
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

Ace SuaresCuenta personal
33 seguidores48 repositorios públicosdesde mar 2008Suares & Co

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
RubyGemsinline_forms8.1.43-427hace 0 días
RubyGemsinline_forms_installer8.1.43-36hace 0 días
RubyGemsinline_forms_schema_edit8.1.43-2hace 0 días

Métricas por categoría

Vitalidad

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

77Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
6.2/36Cadencia de commits — 9/52 semanas con commits
18/18Volumen de commits — 165 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year165
human_commit_share1
days_since_last_push0
active_weeks_last_year9
Cómo se puntúa
16.2/27Publica versiones — 100 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~6,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count100
latest_release_tagv8.1.43
releases_from_tags
days_since_latest_release0
mean_days_between_releases6,1
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?

50Moderado · 18% del índice global
Cómo se puntúa
22.1/60Estrellas — 24 estrellas
9.6/25Forks — 15 forks
0/15Observadores — 2 observadores
Datos de entrada utilizados
forks15
stars24
watchers2
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
Cómo se puntúa
63/80Descargas totales — 1.150.026 descargas históricas en rubygems
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesinline_forms, inline_forms_installer, inline_forms_schema_edit
dependents
ecosystemsrubygems
total_downloads1.150.026
monthly_downloads
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

51Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
1.5/22.5Distribución de commits — el principal contribuyente firma el 93% de los commits
6.8/13.5Amplitud de contribuyentes — 5 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled5
top_contributor_share0,933
Cómo se puntúa
5.8/46.8Resolución de issues — 12% de issues cerradas
33.3/38.3Aceptación de PR — 34/39 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs34
open_issues7
closed_issues1
issue_closed_ratio0,125
closed_unmerged_prs5
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
11/25Alcance del propietario — 33 seguidores de acesuares
24.3/25Trayectoria — 48 repos públicos, cuenta de ~18 años
Datos de entrada utilizados
followers33
owner_typeUser
is_verified
owner_loginacesuares
public_repos48
account_age_days6707
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 3 paquete(s) en rubygems
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 427 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesinline_forms, inline_forms_installer, inline_forms_schema_edit
ecosystemsrubygems
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

50Moderado · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
16/16Configuración de linter — .rubocop.yml
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
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?

39En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
0/10Dangerous-Workflow — sin datos
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 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — sin datos
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate3,9
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. 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.

46En riesgo · 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 — 92 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,92
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .rubocop.yml
0/11Verificación estática de tipos
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 96 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 — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,96
toolchain_manifests
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
0/45Código verificable por tipos — Ruby sin configuración de verificación de tipos
54.7/55Tamaños de archivo manejables — 1/175 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRuby
largest_source_bytes74.312
source_files_sampled175
oversized_source_files1

Datos clave

24estrellas de GitHub
5contribuidores
165commits en los últimos 12 meses
0días desde el último push
100versiones publicadas
1factor bus
7issues abiertas
RubyGemsecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

Más detalle

Historial de estrellas y forks 0 ★ / 15 ⇿
0Estrellas
15Forks
11Versiones

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.

03581013151592012-052015-022017-10
Mayor 1Menor 0Parche 10

Cada punto abarca 5 días.

OpenSSF Scorecard 3.9 / 10
3.9agregado

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-23 00:48 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
n/dDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 1
RegistroPaqueteRestricción de versiónManifiesto
RubyGemsvalidation_hintsGemfile
Todas las dependencias 12

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

RegistroPaqueteVersiónRelación
RubyGemsvalidation_hintsdirecta
RubyGemsinline_formsindirecta
RubyGemsinline_forms_schema_editindirecta
RubyGemsminitestindirecta
RubyGemspaper_trailindirecta
RubyGemsrailsindirecta
RubyGemsrails-i18nindirecta
RubyGemsrubocop-rails-omakaseindirecta
RubyGemssqlite3indirecta
RubyGemsthorindirecta
RubyGemsturbo-railsindirecta
RubyGemswill_paginateindirecta
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": 5510,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 64,
        "HTML": 71062,
        "Ruby": 585315,
        "SCSS": 44976,
        "JavaScript": 3906
      },
      "pushed_at": "2026-07-22T23:33:23Z",
      "created_at": "2011-01-27T17:47:53Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T23:33:26Z",
      "description": "Inline Forms",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Ruby",
      "significant_languages": [
        "Ruby",
        "HTML"
      ]
    },
    "owner": {
      "blog": "http://opencuracao.com",
      "name": "Ace Suares",
      "type": "User",
      "login": "acesuares",
      "company": "Suares & Co",
      "location": "Willemstad, Netherlands Antilles",
      "followers": 33,
      "avatar_url": "https://avatars.githubusercontent.com/u/2784?v=4",
      "created_at": "2008-03-11T01:33:20Z",
      "is_verified": null,
      "public_repos": 48,
      "account_age_days": 6707
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v8.1.43",
          "kind": "patch",
          "published_at": "2026-07-22T23:31:52Z"
        },
        {
          "tag": "v8.1.42",
          "kind": "patch",
          "published_at": "2026-07-22T23:21:28Z"
        },
        {
          "tag": "v8.1.40",
          "kind": "patch",
          "published_at": "2026-07-10T18:28:25Z"
        },
        {
          "tag": "v8.1.21",
          "kind": "patch",
          "published_at": "2026-06-03T10:35:15Z"
        },
        {
          "tag": "v8.1.20",
          "kind": "patch",
          "published_at": "2026-05-29T21:25:53Z"
        },
        {
          "tag": "v8.1.19",
          "kind": "patch",
          "published_at": "2026-05-29T01:39:18Z"
        },
        {
          "tag": "v8.1.18",
          "kind": "patch",
          "published_at": "2026-05-28T23:54:13Z"
        },
        {
          "tag": "v8.1.17",
          "kind": "patch",
          "published_at": "2026-05-28T22:57:45Z"
        },
        {
          "tag": "v8.1.16",
          "kind": "patch",
          "published_at": "2026-05-28T22:31:12Z"
        },
        {
          "tag": "v8.1.15",
          "kind": "patch",
          "published_at": "2026-05-28T22:15:36Z"
        },
        {
          "tag": "v8.1.13",
          "kind": "patch",
          "published_at": "2026-05-28T19:00:40Z"
        },
        {
          "tag": "v8.1.11",
          "kind": "patch",
          "published_at": "2026-05-28T18:41:25Z"
        },
        {
          "tag": "v8.1.10",
          "kind": "patch",
          "published_at": "2026-05-28T00:49:47Z"
        },
        {
          "tag": "v8.1.9",
          "kind": "patch",
          "published_at": "2026-05-27T22:45:24Z"
        },
        {
          "tag": "v8.1.8",
          "kind": "patch",
          "published_at": "2026-05-27T20:24:09Z"
        },
        {
          "tag": "v8.1.6",
          "kind": "patch",
          "published_at": "2026-05-27T14:37:41Z"
        },
        {
          "tag": "v8.1.5",
          "kind": "patch",
          "published_at": "2026-05-27T10:48:24Z"
        },
        {
          "tag": "v8.1.4",
          "kind": "patch",
          "published_at": "2026-05-26T22:22:14Z"
        },
        {
          "tag": "v8.1.3",
          "kind": "patch",
          "published_at": "2026-05-26T22:04:00Z"
        },
        {
          "tag": "v8.1.2",
          "kind": "patch",
          "published_at": "2026-05-26T21:25:11Z"
        },
        {
          "tag": "v8.1.1",
          "kind": "patch",
          "published_at": "2026-05-26T15:16:23Z"
        },
        {
          "tag": "v8.1.0",
          "kind": "minor",
          "published_at": "2026-05-26T00:50:25Z"
        },
        {
          "tag": "v8.0.4",
          "kind": "patch",
          "published_at": "2026-05-24T19:06:02Z"
        },
        {
          "tag": "v8.0.3",
          "kind": "patch",
          "published_at": "2026-05-22T22:37:16Z"
        },
        {
          "tag": "v8.0.2",
          "kind": "patch",
          "published_at": "2026-05-22T21:47:35Z"
        },
        {
          "tag": "v8.0.0",
          "kind": "major",
          "published_at": "2026-05-22T20:21:39Z"
        },
        {
          "tag": "v7.13.18",
          "kind": "patch",
          "published_at": "2026-05-22T16:44:25Z"
        },
        {
          "tag": "v7.13.17",
          "kind": "patch",
          "published_at": "2026-05-21T23:54:30Z"
        },
        {
          "tag": "v7.13.16",
          "kind": "patch",
          "published_at": "2026-05-21T23:27:28Z"
        },
        {
          "tag": "v7.13.15",
          "kind": "patch",
          "published_at": "2026-05-21T23:10:10Z"
        },
        {
          "tag": "v7.13.14",
          "kind": "patch",
          "published_at": "2026-05-21T12:45:51Z"
        },
        {
          "tag": "v7.13.13",
          "kind": "patch",
          "published_at": "2026-05-21T10:26:38Z"
        },
        {
          "tag": "v7.13.12",
          "kind": "patch",
          "published_at": "2026-05-21T01:57:22Z"
        },
        {
          "tag": "v7.13.11",
          "kind": "patch",
          "published_at": "2026-05-21T00:41:36Z"
        },
        {
          "tag": "v7.13.10",
          "kind": "patch",
          "published_at": "2026-05-21T00:32:47Z"
        },
        {
          "tag": "v7.13.8",
          "kind": "patch",
          "published_at": "2026-05-20T14:31:59Z"
        },
        {
          "tag": "v7.13.5",
          "kind": "patch",
          "published_at": "2026-05-20T12:25:12Z"
        },
        {
          "tag": "v7.13.4",
          "kind": "patch",
          "published_at": "2026-05-19T21:47:18Z"
        },
        {
          "tag": "v7.13.3",
          "kind": "patch",
          "published_at": "2026-05-19T21:09:21Z"
        },
        {
          "tag": "v7.13.2",
          "kind": "patch",
          "published_at": "2026-05-19T20:54:09Z"
        },
        {
          "tag": "v7.11.0",
          "kind": "minor",
          "published_at": "2026-05-19T18:53:13Z"
        },
        {
          "tag": "v7.10.2",
          "kind": "patch",
          "published_at": "2026-05-19T16:27:46Z"
        },
        {
          "tag": "v7.9.6",
          "kind": "patch",
          "published_at": "2026-05-17T21:47:05Z"
        },
        {
          "tag": "v7.9.3",
          "kind": "patch",
          "published_at": "2026-05-17T19:28:51Z"
        },
        {
          "tag": "v7.9.1",
          "kind": "patch",
          "published_at": "2026-05-17T15:41:27Z"
        },
        {
          "tag": "v7.5.2",
          "kind": "patch",
          "published_at": "2026-05-16T14:27:51Z"
        },
        {
          "tag": "v7.5.0",
          "kind": "minor",
          "published_at": "2026-05-19T18:48:11Z"
        },
        {
          "tag": "v7.2.11",
          "kind": "patch",
          "published_at": "2026-05-07T11:43:26Z"
        },
        {
          "tag": "v7.2.10",
          "kind": "patch",
          "published_at": "2026-05-06T21:04:09Z"
        },
        {
          "tag": "v7.0.4",
          "kind": "patch",
          "published_at": "2026-05-05T21:33:21Z"
        },
        {
          "tag": "v6.3.3",
          "kind": "patch",
          "published_at": "2026-05-03T18:09:34Z"
        },
        {
          "tag": "v6.2.14",
          "kind": "patch",
          "published_at": "2024-04-23T13:27:46Z"
        },
        {
          "tag": "v6.2.12",
          "kind": "patch",
          "published_at": "2024-03-25T21:03:53Z"
        },
        {
          "tag": "v6.2.11",
          "kind": "patch",
          "published_at": "2024-03-24T19:24:57Z"
        },
        {
          "tag": "v6.2.10",
          "kind": "patch",
          "published_at": "2024-03-24T16:11:31Z"
        },
        {
          "tag": "v6.2.9",
          "kind": "patch",
          "published_at": "2024-02-28T11:01:08Z"
        },
        {
          "tag": "v6.2.7",
          "kind": "patch",
          "published_at": "2024-02-08T13:26:52Z"
        },
        {
          "tag": "v6.2.6",
          "kind": "patch",
          "published_at": "2024-02-07T15:25:06Z"
        },
        {
          "tag": "v6.2.5",
          "kind": "patch",
          "published_at": "2023-04-14T18:07:25Z"
        },
        {
          "tag": "v6.2.4",
          "kind": "patch",
          "published_at": "2021-08-06T12:11:27Z"
        },
        {
          "tag": "v6.2.3",
          "kind": "patch",
          "published_at": "2021-08-05T20:08:44Z"
        },
        {
          "tag": "v6.2.2",
          "kind": "patch",
          "published_at": "2021-04-12T18:41:26Z"
        },
        {
          "tag": "v6.2.1",
          "kind": "patch",
          "published_at": "2021-04-11T15:50:44Z"
        },
        {
          "tag": "v6.1.1",
          "kind": "patch",
          "published_at": "2021-01-02T16:33:49Z"
        },
        {
          "tag": "v6.1.0",
          "kind": "minor",
          "published_at": "2020-07-05T23:24:54Z"
        },
        {
          "tag": "v6.0.8",
          "kind": "patch",
          "published_at": "2020-07-01T16:35:21Z"
        },
        {
          "tag": "v6.0.7",
          "kind": "patch",
          "published_at": "2020-06-30T18:32:21Z"
        },
        {
          "tag": "v6.0.6",
          "kind": "patch",
          "published_at": "2020-06-10T19:31:28Z"
        },
        {
          "tag": "v6.0.5",
          "kind": "patch",
          "published_at": "2020-06-10T18:48:52Z"
        },
        {
          "tag": "v6.0.4",
          "kind": "patch",
          "published_at": "2020-06-10T18:22:11Z"
        },
        {
          "tag": "v6.0.3",
          "kind": "patch",
          "published_at": "2020-06-10T18:04:45Z"
        },
        {
          "tag": "v6.0.2",
          "kind": "patch",
          "published_at": "2020-06-10T17:42:24Z"
        },
        {
          "tag": "v6.0.1",
          "kind": "patch",
          "published_at": "2020-06-08T18:44:50Z"
        },
        {
          "tag": "v5.2.8",
          "kind": "patch",
          "published_at": "2019-12-24T13:51:05Z"
        },
        {
          "tag": "v5.2.7",
          "kind": "patch",
          "published_at": "2019-12-24T13:34:26Z"
        },
        {
          "tag": "v5.2.6",
          "kind": "patch",
          "published_at": "2019-12-24T13:20:11Z"
        },
        {
          "tag": "v5.2.5",
          "kind": "patch",
          "published_at": "2019-12-18T18:53:18Z"
        },
        {
          "tag": "v5.2.4",
          "kind": "patch",
          "published_at": "2018-10-07T02:14:20Z"
        },
        {
          "tag": "v5.2.3",
          "kind": "patch",
          "published_at": "2018-09-23T11:50:25Z"
        },
        {
          "tag": "v5.2.2",
          "kind": "patch",
          "published_at": "2018-09-20T04:24:14Z"
        },
        {
          "tag": "v5.2.1",
          "kind": "patch",
          "published_at": "2018-09-18T14:47:50Z"
        },
        {
          "tag": "v5.1.4",
          "kind": "patch",
          "published_at": "2018-09-18T14:42:35Z"
        },
        {
          "tag": "v5.1.3",
          "kind": "patch",
          "published_at": "2018-09-18T13:44:58Z"
        },
        {
          "tag": "v5.1.2",
          "kind": "patch",
          "published_at": "2018-09-18T13:38:50Z"
        },
        {
          "tag": "v5.1.1",
          "kind": "patch",
          "published_at": "2018-02-12T23:13:33Z"
        },
        {
          "tag": "v5.1.0",
          "kind": "minor",
          "published_at": "2018-02-06T13:53:05Z"
        },
        {
          "tag": "v5.0.23",
          "kind": "patch",
          "published_at": "2018-02-04T01:35:23Z"
        },
        {
          "tag": "v5.0.22",
          "kind": "patch",
          "published_at": "2017-12-23T13:17:11Z"
        },
        {
          "tag": "v5.0.21",
          "kind": "patch",
          "published_at": "2017-11-15T17:03:52Z"
        },
        {
          "tag": "v5.0.20",
          "kind": "patch",
          "published_at": "2017-10-28T20:29:31Z"
        },
        {
          "tag": "v5.0.19",
          "kind": "patch",
          "published_at": "2017-10-28T19:39:49Z"
        },
        {
          "tag": "v5.0.18",
          "kind": "patch",
          "published_at": "2017-10-28T19:33:02Z"
        },
        {
          "tag": "v5.0.17",
          "kind": "patch",
          "published_at": "2017-08-21T00:48:45Z"
        },
        {
          "tag": "v5.0.16",
          "kind": "patch",
          "published_at": "2017-07-25T19:57:30Z"
        },
        {
          "tag": "v5.0.15",
          "kind": "patch",
          "published_at": "2017-07-23T19:41:43Z"
        },
        {
          "tag": "v5.0.6",
          "kind": "patch",
          "published_at": "2017-07-23T14:12:08Z"
        },
        {
          "tag": "v5.0.4",
          "kind": "patch",
          "published_at": "2017-07-23T13:47:06Z"
        },
        {
          "tag": "v5.0.0",
          "kind": "major",
          "published_at": "2017-07-23T12:52:18Z"
        },
        {
          "tag": "v3.2.11",
          "kind": "patch",
          "published_at": "2017-05-31T02:45:04Z"
        },
        {
          "tag": "v3.2.10",
          "kind": "patch",
          "published_at": "2017-05-18T02:47:17Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a719826280d2d0396a1d67d4ff6ca4aa0481ace6",
          "body": "Post-merge release bump: master now carries the schema-GUI pipeline\n(published as 8.1.42) plus the date/time/colour picker fix. Bump\ninline_forms, inline_forms_installer and inline_forms_schema_edit to\n8.1.43 (validation_hints bumped in its own repo). 8.1.42 is already on\nRubyGems, so this is the releasable version.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump to 8.1.43 (all four gems in lockstep)",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-22T23:31:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "70a3649b2cf970422d76870511adee00e28dec83",
          "body": "# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge branch 'feature/schema-gui-pipeline'",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-22T23:30:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0366ec658b4093aaf1bbdd2faf7ff6aa753dbb7e",
          "body": "Override the stock `release` task (not just release:all) so a stray\n`rake release` can't push to a feature branch's forgejo tracking\nremote. Both entry points now push git to origin only.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release: also route the bare `release` task through origin push",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-22T23:21:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0dbb47e6dc46315c2b47465b2b3cf882a3f5fb12",
          "body": "Bundler's release:source_control_push pushes to the current branch's\ntracking remote (branch.<branch>.remote). Feature branches here track\nforgejo (CI), so `rake release:all` from a feature branch pushed the\nrelease commit + tag to forgejo instead of GitHub.\n\nReplace it in release:all with release:p\n[…]\n(if\nneeded) and pushes the commit + version tag to origin only. Idempotent\non the tag so a re-run after a failed push still lands it on origin.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release: always push git to origin, never the branch's tracking remote",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-22T23:18:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1777fd511177b7ca490960fea8962b322f8ef8ac",
          "body": "gem_files sweeps untracked files, so keeping stuff/ out of the gem\nrelied on it being git-ignored. That ignore lived only in the\nper-machine global excludes file, absent on the release box, so\nstuff/forgejo-token (mode 0600) got swept into s.files and\n`gem build` died with Errno::EACCES during `rake\n[…]\ngitignore as a second guard.\nBump the inline_forms trio 8.1.41 -> 8.1.42 to restore lockstep\nwith the already-released validation_hints 8.1.42.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix gem_files packaging the stuff/ scratch dir; bump to 8.1.42",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-22T23:12:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a460f6854ed7b98f9de64ae9c908e79b8fbec0bb",
          "body": "stuff/ is ignored globally via ~/.config/git/ignore, so the per-repo\nentry is unnecessary.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop redundant stuff/ ignore; now covered by global git excludes",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-21T11:56:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6317d134a1d96f28baed99ccad3b66b4ede674f0",
          "body": "Module InlineFormsSchemaEdit, installer flag --schema-edit, rake namespace\nschema_edit:, generator inline_forms_schema_edit:install. Nothing was\nreleased under the old working name. Verified: engine suite, rubocop, and\nthe full example-app gate (171 runs green) under the new name.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Rename the gem: inline_forms_schema_gui -> inline_forms_schema_edit.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-12T05:44:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "425e087b46b56eb65d84dbb3c007e958817fea37",
          "body": "…n-submit, export/import replay, CI endpoints, apply windows.\n\nPhase 1: InlineForms::SchemaBatch + SchemaIntentRecord (install generator\nwrites the tables; installer runs it for --schema-gui apps). Drafts\naccumulate in a batch; submit freezes it (model-enforced immutability,\nsha256 content digest se\n[…]\n restart\ncommand.\n\nRoutes now come from InlineFormsSchemaGui.draw_routes(self) — one line in\nthe app, so gem upgrades can add routes without app edits.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Schema pipeline phases 1-4 (tenant side): persisted batches, freeze-o…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T21:59:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3d78d96722a4d8933c897dd35199999df63ee9bb",
          "body": "…n phase 0).\n\nThe web surface (InlineForms::SchemaController, its views, the\ninline_forms_schema layout) moves to a mountable engine gem in its own\nsubdirectory; the staging services (SchemaIntent/Preview/Apply/Label) stay\nin inline_forms. The installer gains --schema-gui (default off, implied by\n--\n[…]\nce at all. Gem joins the lockstep versioning; CI full gate builds and\ninstalls it.\n\nSee stuff/2026-07-11-schema-gui-gem-and-automated-pipeline-plan.md.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Extract the schema GUI into its own gem: inline_forms_schema_gui (pla…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T21:26:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "01816145957d68b8fb8b833dcc6a237856e385c3",
          "body": "…icators.\n\nFoundation's form reset applies `appearance: none` to date/datetime-local/\nmonth/week/time/color inputs, stripping the browser's native picker control\nfor the native pickers added in 8.1.25/8.1.26. inline_forms.scss now restores\n`appearance: auto` for those input types so the picker indicator shows again.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.42: restore native date/time/month/week/colour picker ind…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T19:10:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "25401a22a169bf371c0ce8dd7520c564c8daca88",
          "body": "…hash.\n\nChoice elements (dropdown_with_values, *_with_stars, radio_button, check_box,\nscale_*, slider_with_values, ...) require a values hash as row index 2 or their\n_edit/_show helper raises \"no values defined\". The GUI offered them but the\npreview built the row without values, so previewing e.g.\nd\n[…]\ne preview/apply pages note that a\nplaceholder is used and to edit real values in the model afterwards.\n\nFast suite + example-app gate green (170 runs).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Schema GUI: value-bearing elements preview with a placeholder values …",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T17:31:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "043bfe953488371e43da75dbf12de1662e63044c",
          "body": "Headers: a :header is a display separator with no column, so it needs no\nmigration and therefore no db:migrate (and no CheckPending block) -- it appears\non the next reload. Two parts:\n- inline_forms_addto no longer emits a migration column for :header (it wrongly\n  created a pointless string column \n[…]\ne! returns only newly-created migrations. Fast suite + example-app gate\ngreen (170 runs); header apply + label write smoke-verified in a generated app.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Schema GUI: add :header (no migration) and an optional label/locale.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T15:37:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42e4b460e3e09712cf504bc093b4ab00b5ed4150",
          "body": "… dev flow.\n\n- :header and :info slipped into SchemaPreview.supported_form_elements (both\n  map to :string), so the GUI offered them as addable fields. Picking :header\n  made addto emit a pointless string column plus a header row. Exclude both\n  (they are not scalar fields: :header is a display sepa\n[…]\na/new after migrate + restart.\n- Tests: header/info excluded from the offered list and rejected on preview;\n  assert the data-turbo opt-out is present.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Schema GUI: stop offering :header/:info as fields; clarify post-apply…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T15:24:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91133001575b400cd76525c66e035f030b8b26d6",
          "body": "The \"+ field\" link is intercepted by the host app's Turbo Drive session, so\nthe schema forms POSTed as turbo-stream; Turbo ignores a 200 HTML response to\na non-GET form (it only acts on turbo_stream/redirect), so Preview/Apply\nsilently did nothing despite the server rendering correctly. Set\ndata-turbo=\"false\" on the utility's <body> (and on both forms + the \"+ field\"\nlink) so the standalone dev utility does plain full-page navigations.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix schema GUI: opt out of Turbo so Preview/Apply POSTs navigate.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T15:03:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c366136b889af0b1171ca80c51f24bf99d218ce",
          "body": "…ld to a model.\n\nInlineForms::SchemaController (new -> preview -> create) lets you add a scalar\nattribute through the browser, building on the schema-staging services:\n\n- new: pick model (text + best-effort datalist), attribute name, form element\n  (the SchemaPreview-supported scalar set), optional \n[…]\nl in-process\ngenerate! smoke-verified in a generated app (migration written, model edited,\ncolumn absent until migrate). No version bump on the branch.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add a dev-only schema-change GUI (example app only): add a scalar fie…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T14:54:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "29e11147412940a7844d914a8c74bd9c9244fc4a",
          "body": "… / apply).\n\nA first, tested foundation for the staging architecture in\nstuff/2026-07-11-end-user-schema-changes-staging-and-pending-gate.md. Three\nengine service objects, no UI/DB yet (persistence + controller are app-level):\n\n- InlineForms::SchemaIntent: value object for a proposed change (model,\n\n[…]\n Widget (virtual attribute readable/\nwritable with no column, row spliced at --after, base record seeded, real\ntable never altered, supported? matrix).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Stab at the end-user schema-change staging pipeline (intent / preview…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T12:40:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8734db945848e7d57b1c7bb454dac0b42feb7fa9",
          "body": "…gration).\n\nBetween `rails g inline_forms_addto Model attr:type` and `rails db:migrate`\nthe model file has the new attribute_list row but its column does not exist,\nso _show/_new (object[attr]) and #create/#update (send #{fe}_update) raise on\nthe missing column. Add InlineForms.attribute_pending_mig\n[…]\n8 runs, 0 failures) with zero\nfalse \"pending\" flags across the full form-element set (money_field,\nimage_field, devise_password_field, rich_text, ...).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Gate attribute_list rows whose column is not migrated yet (pending-mi…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T12:36:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "79f3591697169d88b32767667f2af0825dc18d3f",
          "body": "…e attribute list.\n\nIntroduces InlineForms::AttributeList < Array so it IS a valid\ninline_forms_attribute_list everywhere the old literal array was (views\nstill destructure |attribute, form_element|; helpers/validator still read\nlist.assoc(attr)[2]) — zero migration for existing models — while addin\n[…]\n merge).\n\ntest/attribute_list_test.rb covers array compatibility (destructure +\nassoc[2]), the builder, every mutator, missing-anchor errors, and wrap.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add InlineForms::AttributeList: array-compatible DSL/container for th…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T12:20:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da6a10a490f9f20697f9d74778ed287afc3f8d44",
          "body": "…test process.\n\nThe migration-apply test established a connection on ActiveRecord::Base\npointing at :memory:, which hijacked the dummy app's connection and made the\nengine integration tests error (delete_all against a schema-less DB). Run the\ngenerated migration on a dedicated, lazily-created named \n[…]\n not trip the dummy\napp's railtie into resolving the wrong Rails env, and named (not anonymous)\nbecause establish_connection rejects anonymous classes.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix inline_forms_addto scratch-sqlite test to not pollute the shared …",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T09:32:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a80e3ba3a74c2e0c566effee2608b395c659300",
          "body": "- Smart row placement: new inline_forms_attribute_list rows land above the\n  trailing metadata block (first :info / created_at / updated_at, and a\n  :header directly above it) instead of at the very end; new --before/--after\n  options place the row explicitly and warn + fall back when the anchor is\n\n[…]\nmestamp uniqueness, and applying the generated\n  migration to an in-memory sqlite DB.\n\nLockstep: validation_hints 8.1.41, inline_forms_installer 8.1.41.\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.41: harden inline_forms_addto against the unhandled dangers.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T09:27:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8e0a370e45d6010366ac4d4a464b10aa3ec8e24e",
          "body": "…(workflow.md wants every commit through CI; feature branches were silently skipped).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "CI: run the test workflow on pushes to every branch, not just master …",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-10T18:28:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1e2991058e0a193c4d83a8dde0d0ddf40965294",
          "body": "…ment model (body:text_area, belongs_to :photo, not HTML-accessible) with Photo gaining comments:has_many comments:associated, seed migration puts two comments on each apartment's first photo, and example_app_photo_comments_test covers the second-level panel, nested create, and row open/close.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.40: example app demonstrates nesting-in-nesting — new Com…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-10T16:04:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ccb6d66d29f4b2a8a46614a0ed8ddfbbd69b4a8b",
          "body": "…an :associated panel now opens the new row via Turbo Streams (Option A of stuff/2026-07-10-nested-creation-options.md), landing the user where the has_many panel is immediately usable. Dummy host app gained minimal full-layout chrome (user stub, tabs partial, MODEL_TABS) plus Machine/Part models so create/new HTML flows are testable in the engine suite.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.39: open after create — top-level create of a model with …",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-10T13:06:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "272a92ad55daed54bb93f79cba8797970310fc17",
          "body": "… safe-autocorrected (batched, tests green each step); heredoc-bearing files (generated-app code) deliberately untouched, TrailingWhitespace now AllowInHeredoc.",
          "is_bot": false,
          "headline": "Release 8.1.38: RuboCop todo shrunk 590→196 — every heredoc-free file…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-07T05:43:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "612915e6f9ce4705979ef63453a8d72ccd81b79b",
          "body": "…do eliminated; no changes here).",
          "is_bot": false,
          "headline": "Release 8.1.37: lockstep with validation_hints 8.1.37 (its RuboCop to…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T20:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ac4b7d517739f0ecebb37037ea51eb9fc127981",
          "body": "…ly Brakeman baseline finding); Brakeman default checks now enforcing in full-gate CI.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.36: generated apps force SSL in production (closes the on…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T18:03:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "be738d2ebcee24692fb15fb19798704b34db8fbd",
          "body": "…gitignored pics/ folder only existed on the maintainer box; CI full-gate seeded zero photos and failed 12 tests).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.35: ship the 9 seed gallery images inside the installer (…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T17:23:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e9297f0497818f4f964c7b24445f195095f47c35",
          "body": "…itial commit failed without one).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "full-gate CI: set a git identity in the job container (installer's in…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T16:58:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "01d1e04bede0c1dac9b0a750bac41786ada9beb5",
          "body": "…cret Ace created).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "CI: sibling-checkout secret is named VALIDATION_HINTS (matches the se…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T16:49:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "10b62ece7f8e9336de962137b1828cf3420ce89d",
          "body": "…Brakeman on the generated app), RuboCop omakase baseline; remove GitHub workflows.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.34: Forgejo Actions CI (per-push + weekly full gate with …",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T14:23:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cf613fc996f682ac344d8d8a7eafa72b9a2abc0e",
          "body": "…r theming/locale, showcase model).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.33: README refresh (vendored tabs, native inputs, per-use…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T13:11:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bcda1e92b52834f3d8f51c70f5e6ac3e67aa7250",
          "body": "…lor_field form element.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.32: theming Pattern 2 (per-user color overrides) + new co…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T13:06:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8400e8409594351e1dce26577654676858bb46da",
          "body": "… clobbering I18n.available_locales.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.31: per-user locale via around_action switch_locale; stop…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:58:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51a6a07f97cb46e89d224b64134ed9788a86c605",
          "body": "…m elements.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.30: archive app-specific question_list and dnsrecords for…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:53:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2174d9832637912c88d9d9e1612c0ae7053fd780",
          "body": "…the CSS-variable bridge.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.29: per-user preset themes (dark/sepia/high-contrast) on …",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:49:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "17c44717eba576d1a0501262218a3e319ae3b87e",
          "body": "…pload fixes; attribute_values error-path fix.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.28: multi_image_field showcase gallery + array/multiple-u…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:39:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0eb692e7c0b359d7227b9b0d49e92bfa578e7ae7",
          "body": "…ent cancan-less and role-less host crashes found by the harness.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.27: test/dummy integration harness + CI workflow; fix lat…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:31:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "55fc8550f2fdb79b102a5b3d78d4bc2b21bb3941",
          "body": "…down_with_other, native range slider); drop jquery-ui-rails and rails-jquery-autocomplete.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.26: remove jQuery UI entirely (datalist combobox for drop…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:15:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1e2ebf2045cb57cf310d019ee54803ece62610ff",
          "body": "…rs; drop jquery-timepicker-rails.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.25: native date/time/month inputs replace jQuery UI picke…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:06:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fb862d3e610791f6cdd0385226dcd021f797857e",
          "body": "…dation_icons via @use; color.adjust.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.24: CSS custom-property theme bridge (--if-color-*); foun…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T11:58:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6e1029d0af04e2199a4522a4ad651d6753b2fd61",
          "body": "…ained tabs_on_rails dependency.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.23: vendor tabs support (InlineForms::Tabs), drop unmaint…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T11:44:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "387c59453aba9d12d166f33c5218b1829d95b5b8",
          "body": "…ons font 404, pin cancancan/will_paginate.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.22: vendor Trix 2, self-host Open Sans, fix Foundation Ic…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T11:36:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a79797803317dab68015da7ed6489729b5ea3ec5",
          "body": "…_area_without_ckeditor.\n\nModels still declaring either symbol now raise ArchivedFormElementError at boot; migrate to :rich_text or :plain_text / :plain_text_area.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.21: retire CKEditor-era form elements :ckeditor and :text…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-06-03T10:35:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2ceaf7666007d466b6991df4e60e512eb99e783",
          "body": "…nts.\n\nThe FormElementShowcase price (bare numericality: true) and amount\n(money-rails monetize) labels rendered an empty validation-hints-source\ndiv. With validation_hints 8.1.20 fixing the bare-numericality dead-code\nbug, price now shows \"must be a number\" and amount shows \"must be a valid\namount\"\n[…]\n\n8.1.19 edit-stays-open-on-failure behavior.\n\nAdds example_app_showcase_validation_hints_test.rb asserting non-empty\nhint lists for count/price/amount.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.20: price/amount showcase labels now render validation hi…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-29T21:25:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "96721406a8627e3cb9c54bbce0f4a2341f3aa085",
          "body": "InlineFormsController#update ignored the return value of @object.save and\nalways re-rendered field_show from the in-memory @object. When a save\nfailed validation the user saw a \"saved\" show of the unsaved value while\nthe DB kept the old value; re-opening the edit revealed the stale value.\n\nupdate no\n[…]\ny-rails refusing \"99.ace99\") stays visible instead of silently\nreverting. General fix for every form element, not just money_field.\n\nAdds example_app_showcase_money_update_test.rb regression coverage.",
          "is_bot": false,
          "headline": "Release 8.1.19: inline update no longer fakes success on save failure.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-29T01:39:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "481db396cba1883b2e72305048f2fd2ab3e3a895",
          "body": "…_select revert.\n\nRVM decoupling (now a real choice, not a hard requirement):\n- inline_forms_installer no longer hard-depends on the `rvm` gem, and\n  `inline_forms create` no longer unconditionally `require`s it (new memoized\n  Creator#rvm_active? guards the require). RVM gemset integration runs onl\n[…]\n\n  (revert) and round-trips its changeset (versions panel) without raising.\n\nExample-app gate: 136 runs, 843 assertions, 0 failures, 0 errors, 0 skips.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.18: make RVM optional; fix Psych::DisallowedClass on time…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T23:54:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a2da41f840bd6d9e6e5a959464df925514ae1702",
          "body": "Reverting a PaperTrail destroy version reifies a record with the original\nprimary key and new_record? == true. The normal undo (row deleted) path\nINSERTs it correctly, but the versions panel also offers Restore on destroy\nrows (non-empty changeset), and once the row is already restored a blind\nsave!\n[…]\nto it\nand saved in place, so restoring a destroy version is idempotent.\n\nAdds a regression test restoring a Photo destroy version while the row exists.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.17: fix duplicate photos.id on destroy-version restore.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T22:57:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "adc57c21a54c8d3be27bf1356cbebb4e7e9f8b8a",
          "body": "Upsert rich text by record+name and apply only the latest destroy version.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.16: fix duplicate ActionText id on repeat undo.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T22:31:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a50d4d59c2c56446c69a19f271b95dc61325694a",
          "body": "Apartment/Photo description lives in action_text_rich_texts; undoing a\nparent destroy must reify matching ActionText::RichText destroy versions.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.15: restore ActionText on parent destroy undo.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T22:15:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca5cf52cc2dcef7522742d3d32591524f72029b1",
          "body": "The Empty-demo regression used /revert/:id but routes are\n/form_element_showcases/:id/revert, which broke --example installs.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.14: fix showcase undo test URL assertion.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T22:08:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "081b0ff8861b9eb1bbd60b0a7ecddc8cadb56062",
          "body": "Capturing versions.last before destroy pointed undo at the latest update,\nso revert rolled back plain_text_area edits instead of restoring the row.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.13: undo targets destroy PaperTrail version.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T19:00:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da440351fb6275e02a2a9fa01feb2413e3462549",
          "body": "revert excluded load_and_authorize_resource but authorize! only ran on\nsome branches; post-delete undo now requests turbo_stream like Restore.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.12: fix CanCan authorization on revert/undo.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T18:52:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "14cdd0865e553672f4a56e28ba3fe56eb6a991fa",
          "body": "Fixed\n- Installer's prerelease gem discovery now looks in pkg/ too.\n  Bundler::GemHelper.install_tasks (the standard Rakefile boilerplate)\n  puts `rake build` output in pkg/, not in the checkout root where\n  `gem build` writes. 8.1.10's dev_checkout_with_gems and\n  install_prerelease_gems_from_roots\n[…]\nere only to keep the version trio in step.\n\nGate: 128 runs / 782 assertions / 0 failures / 0 errors / 0 skips\n(73s wall-clock with PARALLEL_WORKERS=2).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.11: installer pkg/ discovery + capped test parallelism.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T18:41:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ce2b2e48664c4dde38539bab1b4b07957bcbe97d",
          "body": "Changed\n- :decimal_field maps to :decimal (was :string) in FormElementRegistry.\n  rails g inline_forms Foo price:decimal_field now emits\n  t.decimal :price, precision: 10, scale: 2 — the sensible default for\n  invoice/balance-shaped data up to 99,999,999.99. Closes the\n  long-standing inconsistency \n[…]\nforms / inline_forms_installer / validation_hints all bumped\n  from 8.1.9 to 8.1.10.\n\nGate: 128 runs / 782 assertions / 0 failures / 0 errors / 0 skips.\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.10: decimal_field becomes a real decimal(p,s) column.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T00:49:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "83ef47352dec272335e110ca39efee887dfe72a5",
          "body": "…M showcase.\n\nFixed\n- `dropdown_with_values_show` / `dropdown_with_values_info` no longer\n  double-translate labels (`attribute_values` already runs `t()`). The\n  second `t()` call was using the already-translated string as an i18n\n  key, so a missing translation rendered the bizarre\n  `<span class=\n[…]\n_forms / inline_forms_installer / validation_hints all bumped\n  from 8.1.8 to 8.1.9.\n\nGate: 119 runs / 742 assertions / 0 failures / 0 errors / 0 skips.\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.9: dropdown double-translation, money cents, locales HABT…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T22:45:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3e624cb69d4d9fb8a67264b54de342c8ed85354",
          "body": "…es to FormElementShowcase.\n\n8.1.6 dropped these three Tier 1 helpers from the example showcase because\ntheir `_show` methods crashed on any non-trivial value. 8.1.7 repaired the\ntwo scale helpers (`Array#assoc` instead of positional `Array#[N]` against\nthe `[[key,label],…]` pairs returned by `attri\n[…]\n errors, 0 skips\n(was 113 / 706 in 8.1.7). Versions bumped 8.1.7 → 8.1.8 across\ninline_forms, inline_forms_installer, and validation_hints in lockstep.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.8: re-add money_field/scale_with_integers/scale_with_valu…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T20:24:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "58d24ad51431a488e5b30df9d00217d2a7eb258e",
          "body": "…ker.\n\nThree Tier 1 `_show` helpers (`dropdown_with_integers`, `scale_with_integers`,\n`scale_with_values`) used `Array#[N]` against the `[[key, label], …]` array\nreturned by `attribute_values` and indexed positionally instead of by key,\nso the stored integer was treated as an offset. `rating_int = 3\n[…]\nassertions, 0 failures, 0 errors, 0 skips.\nVersions bumped 8.1.6 → 8.1.7 across inline_forms, inline_forms_installer,\nand validation_hints in lockstep.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.7: fix three crashing show helpers + Versions header flic…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T18:50:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cac0852e04047007c517a4d834309f4e917fb314",
          "body": "Adds a fourth example resource, FormElementShowcase, to the\n--example install that exercises every kept Tier 1 form_element\nhelper on a single object (text_field, plain_text_area,\ninteger_field, decimal_field, date_select, time_select,\nmonth_select, month_year_picker, check_box, radio_button,\ndropdo\n[…]\nshly built 8.1.6 gem trio.\n\nDropped (helpers broken; documented in CHANGELOG): money_field\n(needs money-rails), scale_with_integers, scale_with_values.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.6: FormElementShowcase example resource.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T14:37:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "228f0e427ece707ff814403fd7f752f102504635",
          "body": "Hard-breaking change. Each row in `inline_forms_attribute_list` is now\n2 elements (was 3), and 4-/5-element rows for dropdown_with_values /\nradio_button / scale_* / slider_* / check_box / simple_file_field drop\ntheir empty 2nd element. Labels have come from\n`Klass.human_attribute_name(attribute)` vi\n[…]\nm trio: install in ~73s, bundle\ncheck: ok, 88 runs, 502 assertions, 0 failures, 0 errors, 0 skips.\nGem unit tests: 42 runs, 240 assertions, 0 failures.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.5: drop empty label from inline_forms_attribute_list rows.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T10:48:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "135fa4f021f484202148d57b710a8c647d41bbfa",
          "body": "Fixes two long-standing bugs in the installer-generated app, both\nexposed when running the 8.1.3 example app:\n\n1) Search on /users (or /members with -U Member) silently no-op'd\n2) The top-bar \"More\" dropdown was always empty\n\nUser-model search scope\n-----------------------\n`lib/inline_forms_installe\n[…]\ntall in\n~79s, same green suite, initializer carries\n`MODEL_TABS = %w(owners apartments roles locales members )`,\nMember model carries the search scope.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.4: search scope on User/Member + populate MODEL_TABS.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T22:22:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bc76ef804f555efec1381f511b2b8414ad87881d",
          "body": "PaperTrail 17.0 (generated app Gemfile)\n---------------------------------------\n`lib/inline_forms_installer/installer_core.rb`: bump\n`gem 'paper_trail', '~> 16.0'` -> `'~> 17.0'`. PT 17 officially\nsupports Rails 8.1 (it drops Rails 6.1 / 7.0 and Ruby 3.0 / 3.1,\nall out of scope for this gem) and sil\n[…]\ntall in ~71s.\nExample regression suite: 88 runs, 502 assertions, 0 failures,\n0 errors, 0 skips. Engine unit suite: 42 runs, 240 assertions,\n0 failures.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.3: PaperTrail 17.0 + -U collision check.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T22:04:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "457082bd54df42c00a0c4162f27878b087ac8390",
          "body": "Engine + installer move from `rails ~> 8.0` to `rails ~> 8.1`\n(Bundler resolves 8.1.3). Companion gem `validation_hints` is bumped\nin lockstep and constrained to `>= 8.1.2, < 9.0` so Active Record\n8.1 satisfies its dependency.\n\nEngine (`inline_forms`):\n- gemspec: `rails >= 8.1, < 8.2`, `rails-i18n >\n[…]\nduring `--example`: 88 runs, 502\n  assertions, 0 failures, 0 errors, 0 skips. Standalone\n  `bundle exec rails test` reproduces the same result (~1.9s).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.2: migrate to Rails 8.1.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T21:25:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "024b1921719fdd9893278f61b30896e979f3a687",
          "body": "…ng models.\n\nNew generator emits an additive migration (add_column / add_reference /\nsingle :string for image_field) and edits the model file (associations,\nhas_rich_text, mount_uploader, new rows in inline_forms_attribute_list)\nwithout touching routes, controller, or MODEL_TABS. Handles both the\nge\n[…]\nd by both generators.\n\nVerified: 42 unit tests, 88/502 example-app tests at inline_forms 8.1.1\n+ inline_forms_installer 8.1.1 + validation_hints 8.1.1.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.1: rails g inline_forms_addto for adding fields to existi…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T15:16:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4fd5167e167f3fb928ad7733179bcb246fe407c4",
          "body": "…_by_clause with inline_forms_list/inline_forms_search scopes.\n\n- ApplicationRecord template carries has_paper_trail, attr_writer\n  :inline_forms_attribute_list, self.per_page = 7, human_attribute_name\n  wrapper, default not_accessible_through_html?. Generated models only\n  emit per-model difference\n[…]\n_forms.scss`\n  mirror. inline_forms_devise.css stays (host-app override hook).\n- Bump gemspec dep: validation_hints >= 8.1.0, < 9.0 (lockstep release).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.0: ApplicationRecord shared model behavior; replace order…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T00:50:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93c19fcf93fae358e3b94d0c60e011f93300886a",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Require validation_hints >= 8.0.4 for 8.0.4 release line.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-24T19:06:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "31cdc8ac40a923db742a72e6e9b66a4596a25672",
          "body": "Lets installers generate Member (or other) auth models while keeping\nDevise mapping :users so current_user and inline_forms helpers work.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add --user-model to inline_forms create (8.0.4).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-24T11:05:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2001c6904c92c523b7025c93820b9246d6a9349e",
          "body": "Add release and zeitwerk guides; fix gemspec summary; record example app gate.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Phase 5: Rails 8 release docs, Zeitwerk audit, gemspec copy.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T23:44:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1aeca3fc66d1a9086e2b3601ea1db17ec109710",
          "body": "Document framework defaults, fix Unicorn connection_pool disconnect,\nupdate README for Rails 8 stack, and tighten validation_hints pin.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.0.3: Rails 8 Phase 4 framework audit and cleanup.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T22:37:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b6c0bd9b6451dfba05c91f84f8e621cc5332ca43",
          "body": "inline_forms create uses rails 8.0.x, load_defaults 8.0, Migration[8.0],\nand sqlite3 >= 2.1; pre-installs local .gem builds before bundle; adds\nSprockets manifest.js for Rails 8 importmap apps.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.0.2: Rails 8 installer (Phase 3).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T21:47:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1344626594d9f423ec5cfcd389a06bfaaf4cd0b",
          "body": "Gemspec: rails and rails-i18n >= 8.0, < 8.1/9; validation_hints >= 8.0.1.\nGenerator migrations use [8.0]. Installer template still 7.2 until Phase 3.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Phase 2: inline_forms engine on Rails 8.0 (8.0.1).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T21:26:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "452d7df74ea4ade186ac0b5ea7ed49f4e57de3ab",
          "body": "Bump inline_forms and inline_forms_installer to 8.0.0; pin validation_hints\nand inline_forms at ~> 8 in gemspecs and installer (Rails stack still 7.2.x).\nFix generator tests (Gemfile, test_helper, add_tab destination_root).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.0.0: 8.x version line, Phase 0 baseline fixes.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T20:21:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a9c8c852b1cb893891ff1744573d873d731a015",
          "body": "Generated apps no longer scaffold locale/key/translation tables or the\ntranslations SQL view. Drop TranslationRecord, extract_translations, and\nrelated installer/controller code; use Rails I18n YAML only.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Remove DB-backed translations; release 7.13.18.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T16:44:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c5103c02c510d73b9f2e15734410d1391ed87169",
          "body": "The \"Creating MyApp with inline_forms vX...\" banner used\n`Gem::Specification.find_by_name(\"inline_forms\").version`, i.e. whatever\nhappened to be in the Creator's own gemset, which can differ from what\nBundler actually resolves for the new app (the Gemfile pins `~> 7`).\n\n- Banner now says `inline_for\n[…]\n banner reports `~> 7`,\nsummary reports the locked engine version (7.13.16 today since 7.13.17\nis not yet on RubyGems), bundle check ok, 91 tests pass.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Report Bundler-locked versions in create banner + summary (7.13.17).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T23:54:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d0c637247d5798ca164bc6bab6e0ab141e52cf00",
          "body": "The 7.13.15 helper guarded with `defined?(RVM) && RVM.current` BEFORE\n`require \"rvm\"`. Inside the `rails new` subprocess (which has not loaded\nthe rvm gem) that returned early and the gemset was never switched, so\n`bundle install` and the example tests installed gems into the parent\ngemset (e.g. @te\n[…]\nuby-gemset` is written. Verified with\n`inline_forms create MyApp -d sqlite --example`: gems land in @MyApp,\nbundle check ok, 91/505 example tests pass.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix RVM gemset switch in installer subprocess (7.13.16).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T23:27:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f52270436f585e83d6df450ff28ec24f8eee2a0",
          "body": "Switch to the app gemset only after .ruby-gemset exists so bundle\ninstall targets @MyApp, and run the install-summary bundle check there.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix RVM gemset activation during inline_forms create (7.13.15).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T23:10:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b265d13afb2025619c894764019075c45f3286a",
          "body": "Read the install log file instead of splitting the path string, tee all\noutput through one temp log before moving to MyApp/log, and write the\nheader/summary into the log the terminal shows.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix install log summary and test result parsing (7.13.14).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T12:45:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f688be99865831593aa629a3ac0010d86c1b940",
          "body": "Timestamped MyApp/log/inline_forms_create-*.log with start/end path and\nsummary; foreman in Gemfile; validation_hints only via VALIDATION_HINTS_ROOT;\ngenerator tab idempotency; Rails 8 checklist Sass note.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.13: install log, --example runs tests, installer UX picks.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T10:26:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b0f41dd00e666403699891896759d45828905a3",
          "body": "bundle_install! runs bundle check after install; Creator reminds to\nrvm use . before rails test. Three-gem lockstep with validation_hints.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.12: abort create when bundle install fails.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T01:57:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eda8441bf36f8315735dc6b7c677c329841f2805",
          "body": "Document that release does not generate MyApp; validation_hints is a\nseparate repo release.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix release:all: build and push only, no install:local.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T00:41:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3042840480d898b57260cc3ee773a23908677825",
          "body": "Install freshly built gems from pkg/ so inline_forms create uses the\ncurrent installer template, not an old RubyGems inline_forms_installer.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.11: rake install:local before release:all.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T00:36:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a24312c0caecd738b5ced32629d864ca06d90f86",
          "body": "Generated apps resolve the highest 7.x for inline_forms and\nvalidation_hints; drop installer/engine version match at install time.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.10: Gemfile and gemspec pins at ~> 7.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T00:32:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "487a79714262d0167925dfd24323eaf5ccae5dd7",
          "body": "Align inline_forms and inline_forms_installer at 7.13.9; installer depends on\nmatching inline_forms; Creator aborts on version skew; README documents CLI\ninstall and validation_hints pairing.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.9: three-gem lockstep, installer/engine version guard.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T00:26:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7544567a16ba7a4dceb7066ef86d766928b66aee",
          "body": "- README.rdoc: new \"Where to put the tabs_tag block (five patterns)\"\n  subsection under == Per-resource Turbo tabs. Each pattern ships a\n  runnable code snippet + a \"best when ...\" line: (1) inlined in the\n  show view, (2) dedicated tab-strip partial -- the --example app's\n  pattern, (3) helper-driv\n[…]\nler set_tab +\n  params[:tab]) and that InlineForms::TurboTabsBuilder is\n  independent of the partial layout chosen.\n- CHANGELOG.md / VERSION -> 7.13.8.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.8: README five-pattern guide for Turbo tab strips.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-20T14:31:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c6f75f79e899a914e73597d49fa37db8fe52c35",
          "body": "… tabs + check_list.\n\n- installer_core.rb: drop SeedKonferenshaPhotos, generate\n  SeedExampleApartmentsAndOwners (3 apartments Apt 1/2/3 with\n  per-apartment photo galleries; 3 owners -- Maria owns Apt 1+2,\n  Jean-Pierre owns Apt 3, Akira owns none) so the new per-owner\n  check_list panel has zero /\n[…]\nr seed sets).\n- README.rdoc documents seed data, the :check_list switch, and the\n  Foundation tabs markup contract.\n- CHANGELOG.md / VERSION -> 7.13.7.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.7: seeded Owner/Apartment demo + Foundation-styled Turbo…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-20T13:57:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bb56a762c858bf8ce466d795f039f6639b22a9c5",
          "body": "Adds an Owner model to the --example app along with a per-resource Turbo\nsub-tab UI for /owners/:id. An Owner has_many Apartments; an Apartment\nbelongs_to a single (optional) Owner and surfaces the owner as a\n:dropdown in its inline_forms_attribute_list. The two sub-tabs (\"naw\"\nand \"apartments\") ren\n[…]\nd at /owners/:id: tabs partial-swap\nvia Turbo (no full page reload), shared :name field appears on both\ntabs, /apartments shows the new Owner dropdown.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.6: Owner example + InlineForms::TurboTabsBuilder.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-20T13:17:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "14008d00ca8ee9a4e7a547978a569d4a07c3dc76",
          "body": "Generated apps use RubyGems tabs_on_rails ~> 3.0 and InlineForms::TranslationRecord\ninstead of acesuares git deps; will_paginate fork comment removed.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.5: drop git forks for tabs_on_rails and i18n-active_record.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-20T12:25:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "64a80e80d5b91bfb15c1709b51d05709908e23b2",
          "body": "…t row (symmetry fix).\n\nUser-reported asymmetry: \"If I make a rich text description in Apartments\nI can restore the empty value. If I make a rich text description in the\nnested Photo, then I can not restore the empty value.\"\n\nRoot cause: the visible difference was a side effect of how each example\nf\n[…]\nler::VERSION` -> 7.13.4.\n\nVerified: `inline_forms create MyApp -d sqlite --example` ->\n`bundle exec rails test` -- 83 runs, 461 assertions, 0 failures.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.4: Restore on rich_text create now destroys the rich_tex…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T21:47:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f651c045ed841e3a8df1c60e67c221ca052b763",
          "body": "…ty changesets.\n\nAfter a record with a `rich_text` attribute is saved (e.g. creating a Photo\nwith a `description`), the parent gained a spurious PaperTrail `update`\nversion whose changeset was `{}`. Restoring that row reified the same\nstate and persisted it — a visible no-op in the versions panel. R\n[…]\nrmed in `bundle exec rails runner`: `Photo.create!(... description: ...)`\nyields only a single `create` version on Photo (no empty `update` follow-up).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.3: suppress PaperTrail :touch noise; hide Restore on emp…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T21:09:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d5b806bed17652c66a3047dc11148757c67da10",
          "body": "…ersion.\n\nPaperTrail::Version#reify returns nil for `create` events (no prior state),\nso InlineFormsController#revert was falling through to `@parent.save!` on\nnil and raising `NoMethodError: undefined method 'save!' for nil`. The\ncrash was most visible when reverting an ActionText (`rich_text`) cre\n[…]\n into generated Gemfiles).\n\nVerified: `inline_forms create MyApp -d sqlite --example` →\n`bundle exec rails test` — 79 runs, 441 assertions, 0 failures.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.2: fix NoMethodError when reverting a rich_text create v…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T20:54:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f80e0b044ec91d6d9ac5e92e2d45f0e96dd1177",
          "body": "Rails 7.2 rackup only auto-selects puma/falcon/webrick; thin and unicorn require -u.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.1: add puma so generated apps boot with rails s.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T20:02:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1e283973eaa5bbd6017eb160a097f3156b95920f",
          "body": "Move form elements into InlineForms::FormElements::*Helper modules with explicit boot loading and registry-based SPECIAL_COLUMN_TYPES; views and controllers keep the same *_show/*_update API.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.0: Track B Zeitwerk form elements refactor.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T19:38:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "34c300626548e6926cab028534b34765bb33261d",
          "body": "… and Ruby 4.0.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.12.0 for inline_forms and inline_forms_installer: Rails 7.2…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T19:18:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c94b2e3830bb5ee24224c51bb74d6c9db263c8c0",
          "body": "Correct the mistaken 7.5.0 bump (below 7.10.2 and reusing an old tag);\n7.11.0 is the next minor after 7.10.x for the installer split.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.11.0 for inline_forms and inline_forms_installer.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T18:53:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "07742f7b984a0b27b973d12097e6c52aa61e2a81",
          "body": "Specify inline_forms as the default gem name and add installer:* plus\nrelease:all for publishing both gems from one tag.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix rake release for monorepo with two gemspecs.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T18:48:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7d132c87f45b89059e16ebe521c6bbf77d2739e1",
          "body": "Align both gem versions after splitting the installer out of the engine.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.5.0 for inline_forms and inline_forms_installer.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T18:46:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f999165baad9eccbfd095ec8d8359f27937a09b2",
          "body": "Separate the CLI and Rails app template from the engine so runtime\ndependencies stay lean and releases can move independently.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Split app installer into inline_forms_installer gem.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T17:27:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "26d704a1043c6ee4dee9844b0c95275ac680d514",
          "body": "Generator pins opening_date:date on Apartment, Konferensha seed sets a sample date, and new integration test asserts the datepicker class hook on show, inline edit, and new form. Browser-verified end-to-end.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add opening_date (date) to example Apartment for datepicker coverage.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T16:27:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd28117e2c287c98f5fef5378b0f1a162e111d55",
          "body": "Pin Rails 7.1 in gemspec/installer; install local validation_hints gem before first bundle when ~> 6.3 is not on RubyGems yet.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Rails 7.1 example app and validation_hints 6.3 install hook (Phase 5).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T01:14:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "299f8cdfd6f3662cb9f486808d13cac7d87a95d7",
          "body": "initInlineFormsWidgets binds datepicker, month/year picker, timepicker,\nTrix, and validation-hint Tippy on DOM ready, turbo:load, and\nturbo:frame-load. Date/time/month_year_picker edit helpers no longer\nemit inline script tags.\n\nAdd docs/jquery-widgets.md tracking remaining jQuery dependencies.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.9.8: Phase 4 centralized jQuery widget init.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T00:59:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4c78cd263a1deefb98896de6c508bcc9c827c93e",
          "body": "Document current format.turbo_stream usage in docs/turbo-stream-audit.md.\nNote built *.gem artifacts stay gitignored.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.9.7: Phase 3 hygiene (turbo-stream audit doc).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T00:56:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 100,
      "commits_last_year": 165,
      "latest_release_at": "2026-07-22T23:31:52Z",
      "latest_release_tag": "v8.1.43",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 9,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 6.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "inline_forms",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/inline_forms",
          "is_deprecated": false,
          "latest_version": "8.1.43",
          "repository_url": "http://github.com/acesuares/inline_forms",
          "versions_count": 427,
          "total_downloads": 1143265,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2011-01-27T14:10:39.790000Z",
          "latest_published_at": "2026-07-22T23:33:24.935000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "inline_forms_installer",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/inline_forms_installer",
          "is_deprecated": false,
          "latest_version": "8.1.43",
          "repository_url": "http://github.com/acesuares/inline_forms",
          "versions_count": 36,
          "total_downloads": 6502,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-05-19T19:00:27.222000Z",
          "latest_published_at": "2026-07-22T23:33:28.047000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "inline_forms_schema_edit",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/inline_forms_schema_edit",
          "is_deprecated": false,
          "latest_version": "8.1.43",
          "repository_url": "http://github.com/acesuares/inline_forms",
          "versions_count": 2,
          "total_downloads": 259,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-07-22T23:24:18.072000Z",
          "latest_published_at": "2026-07-22T23:33:30.308000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 15,
      "stars": 24,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2012-05-28",
            "count": 1
          },
          {
            "date": "2012-12-01",
            "count": 9
          },
          {
            "date": "2013-06-10",
            "count": 1
          },
          {
            "date": "2014-12-23",
            "count": 1
          },
          {
            "date": "2015-01-24",
            "count": 1
          },
          {
            "date": "2015-03-14",
            "count": 1
          },
          {
            "date": "2017-10-29",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 15,
        "total_forks": 15
      },
      "star_history": null,
      "open_issues_and_prs": 7
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 74312,
      "source_files_sampled": 175,
      "oversized_source_files": 1,
      "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": 12,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "validation_hints",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "validation_hints",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "inline_forms",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "inline_forms_schema_edit",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "paper_trail",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rails",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rails-i18n",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-rails-omakase",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "sqlite3",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "thor",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "turbo-rails",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "will_paginate",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 12,
        "direct_count": 1,
        "indirect_count": 11
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 34,
        "open_issues": 7,
        "closed_ratio": 0.125,
        "closed_issues": 1,
        "closed_unmerged_prs": 5
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "acesuares",
          "commits": 278,
          "avatar_url": "https://avatars.githubusercontent.com/u/2784?v=4"
        },
        {
          "type": "User",
          "login": "royendgel",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/1261046?v=4"
        },
        {
          "type": "User",
          "login": "rhymiz",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/7029352?v=4"
        },
        {
          "type": "User",
          "login": "careljonkhout",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/301439?v=4"
        },
        {
          "type": "User",
          "login": "coryschires",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/104563?v=4"
        }
      ],
      "contributors_sampled": 5,
      "top_contributor_share": 0.933
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [
        ".rubocop.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "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": "a719826280d2d0396a1d67d4ff6ca4aa0481ace6",
        "ran_at": "2026-07-23T00:48:54Z",
        "aggregate_score": 3.9,
        "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": null,
      "oldest_open_prs": [],
      "last_merged_pr_at": "2018-02-09T20:21:46Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 14,
          "created_at": "2014-09-03T18:13:08Z",
          "last_comment_at": "2014-09-03T21:01:07Z",
          "last_comment_author": "acesuares"
        },
        {
          "number": 42,
          "created_at": "2018-09-19T14:20:15Z",
          "last_comment_at": "2018-09-19T14:24:12Z",
          "last_comment_author": "ortegacmanuel"
        },
        {
          "number": 43,
          "created_at": "2018-09-24T10:57:42Z",
          "last_comment_at": "2018-09-27T15:41:59Z",
          "last_comment_author": "ortegacmanuel"
        },
        {
          "number": 44,
          "created_at": "2018-09-24T12:11:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 45,
          "created_at": "2018-09-27T13:37:05Z",
          "last_comment_at": "2018-09-27T16:00:31Z",
          "last_comment_author": "ortegacmanuel"
        },
        {
          "number": 46,
          "created_at": "2018-09-27T14:34:41Z",
          "last_comment_at": "2018-09-27T15:51:48Z",
          "last_comment_author": "ortegacmanuel"
        },
        {
          "number": 47,
          "created_at": "2018-09-27T15:58:14Z",
          "last_comment_at": "2018-09-27T15:58:57Z",
          "last_comment_author": "ortegacmanuel"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/acesuares/inline_forms",
    "host": "github.com",
    "name": "inline_forms",
    "owner": "acesuares"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 39,
        "vitality": 77,
        "community": 50,
        "governance": 51,
        "engineering": 50
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 77,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 165,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 9
            },
            "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": "9/52 weeks with commits",
                "points": 6.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "165 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 165
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "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": 88,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v8.1.43",
              "releases_from_tags": true,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 6.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "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 ~6.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 6.1
                    }
                  }
                ],
                "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": "moderate",
        "name": "Community & Adoption",
        "value": 50,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "forks": 15,
              "stars": 24,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "24 stars",
                "points": 22.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "15 forks",
                "points": 9.6,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 79,
            "inputs": {
              "packages": [
                "inline_forms",
                "inline_forms_installer",
                "inline_forms_schema_edit"
              ],
              "dependents": null,
              "ecosystems": "rubygems",
              "total_downloads": 1150026,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "1,150,026 downloads all-time across rubygems",
                "points": 63,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 1150026,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 51,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 23,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 5,
              "top_contributor_share": 0.933
            },
            "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 93% of commits",
                "points": 1.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 93
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "5 contributors",
                "points": 6.8,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "merged_prs": 34,
              "open_issues": 7,
              "closed_issues": 1,
              "issue_closed_ratio": 0.125,
              "closed_unmerged_prs": 5
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "12% of issues closed",
                "points": 5.8,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 12
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "34/39 decided PRs merged",
                "points": 33.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 34,
                      "decided": 39
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "followers": 33,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "acesuares",
              "public_repos": 48,
              "account_age_days": 6707
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "33 followers of acesuares",
                "points": 11,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 33,
                      "login": "acesuares"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "48 public repos, account ~18 yr old",
                "points": 24.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 48
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 18
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "inline_forms",
                "inline_forms_installer",
                "inline_forms_schema_edit"
              ],
              "ecosystems": "rubygems",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "3 package(s) on rubygems",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 3,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "427 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 427
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 50,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": ".rubocop.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 39,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 3.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "at_risk",
        "name": "AI Readiness",
        "value": 46,
        "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.92,
              "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": "92 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 92,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.96,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".rubocop.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "96 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 96,
                      "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 74312,
              "source_files_sampled": 175,
              "oversized_source_files": 1
            },
            "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": "1/175 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 175,
                      "oversized": 1
                    }
                  }
                ],
                "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",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T00:48:59.995989Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/acesuares/inline_forms.svg",
  "full_name": "acesuares/inline_forms",
  "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.