Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-30 09:18 UTC

asciidoctor / asciidoctor-reveal.js

:crystal_ball: A reveal.js converter for Asciidoctor and Asciidoctor.js. Write your slides in AsciiDoc!

HTML · JavaScript · RubyLicencia propia★ 313 estrellas⑂ 185 forksdesde oct 2014Ver en GitHub ↗

asciidoctor/asciidoctor-reveal.js tiene un índice de salud de 71 sobre 100, lo que lo sitúa en la banda Bueno. Su puntuación más alta es Engineering Quality (90/100) y la más baja, AI Readiness (48/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

71
global / 100
Bueno

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

71
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

AsciidoctorOrganización
466 seguidores83 repositorios públicosdesde dic 2012

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@asciidoctor/reveal.js5.2.0516211hace 603 díasasciidocasciidoctoropaljavascriptlibrarybackendtemplatereveal.js
RubyGemsasciidoctor-revealjs5.2.0-26hace 0 días

Métricas por categoría

Vitalidad

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

70Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
2.8/36Cadencia de commits — 4/52 semanas con commits
16.7/18Volumen de commits — 71 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year71
human_commit_share0,96
days_since_last_push0
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 22 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
12.6/27Cadencia de publicación — una versión cada ~264,9 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count22
latest_release_tagv6.0.0-beta.2
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases264,9

Comunidad y Adopción

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

62Moderado · 18% del índice global
Cómo se puntúa
40.5/60Estrellas — 313 estrellas
18.9/25Forks — 185 forks
6/15Observadores — 13 observadores
Datos de entrada utilizados
forks185
stars313
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
16.9/22.5Licencia — archivo de licencia presente, no es una licencia reconocida
0/18Guía CONTRIBUTING
13.5/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_conduct
has_pull_request_templateno
Cómo se puntúa
49.5/80Descargas mensuales — 5162 descargas/mes en npm, rubygems
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@asciidoctor/reveal.js, asciidoctor-revealjs
dependents
ecosystemsnpm, rubygems
total_downloads293.858
monthly_downloads5162
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?

71Bueno · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
8.9/22.5Distribución de commits — el principal contribuyente firma el 60% de los commits
13.5/13.5Amplitud de contribuyentes — 42 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 30 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled42
top_contributor_share0,605
Cómo se puntúa
46.6/46.8Resolución de issues — 100% de issues cerradas
34.3/38.3Aceptación de PR — 292/326 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs292
open_issues1
closed_issues273
issue_closed_ratio0,996
closed_unmerged_prs34
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
19.2/25Alcance del propietario — 466 seguidores de asciidoctor
25/25Trayectoria — 83 repos públicos, cuenta de ~13 años
Datos de entrada utilizados
followers466
owner_typeOrganization
is_verified
owner_loginasciidoctor
public_repos83
account_age_days4962
Cómo se puntúa
25/25Publicado y resoluble — 2 paquete(s) en npm, rubygems
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 26 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@asciidoctor/reveal.js, asciidoctor-revealjs
ecosystemsnpm, rubygems
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

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

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — http://asciidoctor.org
10/10Descripción del repositorio
10/10Topics — 7 topics
0/10Wiki
Datos de entrada utilizados
topicsasciidoc, reveal-js, asciidoctor, slides, slideshow, presentations, hacktoberfest
has_wikino
homepagehttp://asciidoctor.org
has_readme
has_docs_dir
has_description

Seguridad

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

58Moderado · 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
2.5/2.5CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
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
2.5/2.5Contributors — project has 30 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,8
Excluidos de la puntuación (sin datos o no aplicable): packaging. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages18
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@asciidoctor/reveal.js@5.2.0 —lo que arrastra la instalación del paquete publicado—: 18 paquetes. No se analiza la alcanzabilidad.

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.

48En 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 — 84 de 96 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,875
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
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 28 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,28
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — HTML sin configuración de verificación de tipos
51.2/55Tamaños de archivo manejables — 2/29 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageHTML
largest_source_bytes62.446
source_files_sampled29
oversized_source_files2
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — example, examples
Datos de entrada utilizados
example_dirsexample, examples
has_mcp_signalno
api_schema_files

Datos clave

313estrellas de GitHub
42contribuidores
71commits en los últimos 12 meses
0días desde el último push
22versiones publicadas
1factor bus
1issues abiertas
npm, RubyGemsecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

Historial de estrellas y forks 0 ★ / 185 ⇿
0Estrellas
185Forks
20Versiones

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.

0408012016020018432014-102019-112024-11
Mayor 4Menor 4Parche 10

Cada punto abarca 10 días.

OpenSSF Scorecard 4.8 / 10
4.8agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-30 09:17 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 30 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
RubyGemscolorizeGemfile
RubyGemsrougeGemfile
RubyGemsslim~> 3.0.6Gemfile
npmreveal.js6.0.1package.json
Todas las dependencias 50

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

RegistroPaqueteVersiónRelación
npmreveal.js6.0.1directa
RubyGemscolorizedirecta
RubyGemsrougedirecta
RubyGemsslimdirecta
npm@asciidoctor/core4.0.6indirecta
npm@esbuild/aix-ppc640.28.0indirecta
npm@esbuild/android-arm0.28.0indirecta
npm@esbuild/android-arm640.28.0indirecta
npm@esbuild/android-x640.28.0indirecta
npm@esbuild/darwin-arm640.28.0indirecta
npm@esbuild/darwin-x640.28.0indirecta
npm@esbuild/freebsd-arm640.28.0indirecta
npm@esbuild/freebsd-x640.28.0indirecta
npm@esbuild/linux-arm0.28.0indirecta
npm@esbuild/linux-arm640.28.0indirecta
npm@esbuild/linux-ia320.28.0indirecta
npm@esbuild/linux-loong640.28.0indirecta
npm@esbuild/linux-mips64el0.28.0indirecta
npm@esbuild/linux-ppc640.28.0indirecta
npm@esbuild/linux-riscv640.28.0indirecta
npm@esbuild/linux-s390x0.28.0indirecta
npm@esbuild/linux-x640.28.0indirecta
npm@esbuild/netbsd-arm640.28.0indirecta
npm@esbuild/netbsd-x640.28.0indirecta
npm@esbuild/openbsd-arm640.28.0indirecta
npm@esbuild/openbsd-x640.28.0indirecta
npm@esbuild/openharmony-arm640.28.0indirecta
npm@esbuild/sunos-x640.28.0indirecta
npm@esbuild/win32-arm640.28.0indirecta
npm@esbuild/win32-ia320.28.0indirecta
npm@esbuild/win32-x640.28.0indirecta
npm@fortawesome/fontawesome-free6.7.2indirecta
npmasciidoc-converter-testkit-cli0.1.4indirecta
npmasciidoc-converter-testkit-core0.1.4indirecta
npmasciidoctor4.0.6indirecta
npmcommander9.5.0indirecta
npmentities8.0.0indirecta
npmesbuild0.28.0indirecta
npmparse58.0.1indirecta
npmpostject1.0.0-alpha.6indirecta
RubyGemsasciidoctorindirecta
RubyGemsirbindirecta
RubyGemsminitestindirecta
RubyGemspryindirecta
RubyGemspry-byebugindirecta
RubyGemspygments.rbindirecta
RubyGemsrakeindirecta
RubyGemsrubocopindirecta
RubyGemsrubocop-minitestindirecta
RubyGemsrubocop-rakeindirecta
Avisos de dependencias 0

Instalar npm:@asciidoctor/reveal.js@5.2.0 arrastra 18 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "asciidoc",
        "reveal-js",
        "asciidoctor",
        "slides",
        "slideshow",
        "presentations",
        "hacktoberfest"
      ],
      "is_fork": false,
      "size_kb": 9081,
      "has_wiki": false,
      "homepage": "http://asciidoctor.org",
      "languages": {
        "CSS": 46791,
        "HTML": 303524,
        "Ruby": 127132,
        "Slim": 130,
        "JavaScript": 132032
      },
      "pushed_at": "2026-07-30T09:11:27Z",
      "created_at": "2014-10-12T20:15:53Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-30T09:13:14Z",
      "description": ":crystal_ball: A reveal.js converter for Asciidoctor and Asciidoctor.js. Write your slides in AsciiDoc!",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "HTML",
      "significant_languages": [
        "HTML",
        "JavaScript",
        "Ruby"
      ]
    },
    "owner": {
      "blog": "https://asciidoctor.org",
      "name": "Asciidoctor",
      "type": "Organization",
      "login": "asciidoctor",
      "company": null,
      "location": null,
      "followers": 466,
      "avatar_url": "https://avatars.githubusercontent.com/u/3137042?v=4",
      "created_at": "2012-12-27T21:15:25Z",
      "is_verified": null,
      "public_repos": 83,
      "account_age_days": 4962
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v6.0.0-beta.2",
          "kind": "prerelease",
          "published_at": "2026-07-30T09:13:58Z"
        },
        {
          "tag": "v5.2.0",
          "kind": "minor",
          "published_at": "2024-12-04T07:03:02Z"
        },
        {
          "tag": "v5.1.0",
          "kind": "minor",
          "published_at": "2023-12-12T13:18:15Z"
        },
        {
          "tag": "v5.0.1",
          "kind": "patch",
          "published_at": "2023-06-24T16:03:17Z"
        },
        {
          "tag": "v5.0.0-rc.1",
          "kind": "prerelease",
          "published_at": "2021-08-29T12:33:19Z"
        },
        {
          "tag": "v4.1.0",
          "kind": "minor",
          "published_at": "2020-12-19T13:31:28Z"
        },
        {
          "tag": "v4.1.0-rc.5",
          "kind": "prerelease",
          "published_at": "2020-12-19T13:03:14Z"
        },
        {
          "tag": "v4.0.1",
          "kind": "patch",
          "published_at": "2020-02-19T05:05:16Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2020-02-19T04:48:25Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2020-01-19T04:59:29Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2020-01-07T06:42:36Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2019-12-04T06:25:25Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2019-03-01T06:05:04Z"
        },
        {
          "tag": "v1.1.3",
          "kind": "patch",
          "published_at": "2018-01-31T14:28:58Z"
        },
        {
          "tag": "v1.1.2",
          "kind": "patch",
          "published_at": "2018-01-31T02:01:15Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2018-01-04T01:01:32Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2017-12-25T06:26:45Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2017-09-28T00:27:01Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2017-08-29T02:55:26Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2016-12-23T03:45:57Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2016-10-13T01:41:45Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2016-10-07T02:17:55Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "8de8b6e166bdbab38c977fa2c221a7a308ceb6ca",
          "body": null,
          "is_bot": true,
          "headline": "Release 6.0.0-beta.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-30T09:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8674381aa8aedb8f6684773f53a32ec3d056c754",
          "body": null,
          "is_bot": true,
          "headline": "Prepare 6.0.0-beta.2 release",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-30T09:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19f55f1bc842dad111a3681ec720832f663bc08a",
          "body": "…ed default\n\nnpm refuses to publish a prerelease version without an explicit --tag,\nwhich broke the 6.0.0-beta.1 release. The Release workflow now checks\nout and pushes back to whichever branch it was dispatched from\n(instead of hardcoding main), and computes the npm dist-tag from that\nbranch: \"test\n[…]\n (e.g.\nlatest-5-2) from a maintenance branch like 5.2.x, failing loudly for\nanything else so it never falls back to npm's default \"latest\" tag.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: derive npm dist-tag from the release branch instead of a hardcod…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-30T09:08:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "00eb27c6fd6fd028c71db6f64a24eedfb7541d1b",
          "body": "Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: show release version and actor in workflow run name",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-30T08:42:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "356cf71ca8ce889eba6235fc5af2236f51411bc3",
          "body": null,
          "is_bot": true,
          "headline": "Release 6.0.0-beta.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-30T08:36:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16bd21562718733b42d1e4ef624f455acfa5dfaf",
          "body": null,
          "is_bot": true,
          "headline": "Prepare 6.0.0-beta.1 release",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-30T08:36:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "318634b63d16801c76285228732576f5794920c5",
          "body": "…kit/\n\nMove test/fixtures/standalone/, test/expected-testkit/ and\ntest/expected/standalone/ under a single test/converter-testkit/\n(fixtures/standalone/, expected/generic/, expected/standalone/) so\neverything belonging to the asciidoc-converter-testkit corpus is\nidentifiable at a glance instead of living directly under test/\nalongside the unrelated Ruby unit tests.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: regroup the converter-testkit corpus under test/converter-test…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-30T07:41:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85f96835d3235d8b9099ae19d7ba9da1588627b7",
          "body": "…stkit\n\nThe fixture-testing tool was renamed upstream from asciidoc-testkit to\nasciidoc-converter-testkit (asciidoc-testkit-cli -> asciidoc-converter-testkit-cli\n0.1.4 on npm); update the devDependency, the CLI binary path and error\nmessage in tasks/testkit.rake, and all comments/docs that referenced the\nold name. Invocation contract is unchanged.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: rename asciidoc-testkit devDependency to asciidoc-converter-te…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-30T07:26:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b98d1a0d1f9d54074180937b4cc92ededd043be",
          "body": "Replace the placeholder CSS dump in the Aurora \"Customize\" slide with a\nminimal, real example: overriding the two tokens that drive the theme's\nsignature gradient motif (--aurora-violet/--aurora-cyan), with a callout\nexplaining everywhere that motif shows up, and a pointer to the full token\nreference. Same mechanism aurora-light.css already uses to flip the whole\ntheme from dark to light.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: show token-based customization in the 6.0 release notes",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-29T09:30:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e343cb04f0e68716ebe62b6a967f0e26aeae29ba",
          "body": "data/themes/aurora.css and aurora-light.css already ship inside the\nasciidoctor-revealjs RubyGem, not just the @asciidoctor/reveal.js npm\npackage — the gemspec's file filter already matches anything under data/\n(confirmed by building the gem and inspecting its data.tar.gz), so no\npackaging change wa\n[…]\n Aurora README\nshowing how to resolve the installed gem's path (no node_modules-style\ninstall directory to reference by a fixed relative path).\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document Aurora as bundled in the Ruby gem too",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-29T09:16:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b11a9741982c62861b7f4a55a6373ac1c8a7ddad",
          "body": "…se notes\n\nMove aurora.css/aurora-light.css from examples/aurora-theme/ into\ndata/themes/, so the theme is published as part of the @asciidoctor/reveal.js\nnpm package (data/ is already in package.json's files list) instead of only\nexisting in a directory that npm never ships. Update the four example\n[…]\nointing at examples/... after\na previous refactor moved those files to release-notes/, and one release-5.2\nlink that pointed at 5.1 by mistake.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: ship Aurora as a bundled theme and showcase it in the 6.0 relea…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-29T08:58:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c84cf242ddb7ba63688c1669e02bd158cd0eb1a2",
          "body": "…d 4 example decks\n\nA dark, gradient-accented reveal.js theme built entirely from CSS custom\nproperties, so it can be restyled by overriding tokens instead of editing\ncomponent rules. Ships as examples/aurora-theme/aurora.css, plus\naurora-light.css (a light mood variant that changes only the tokens)\n[…]\ns, collapsible\nblocks), and a business review (stats, KPI bars, timeline).\n\nSee examples/aurora-theme/README.adoc for the full token reference.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Aurora, a token-based custom theme, with a light variant an…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-28T13:46:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88a675662648cc508e04af40cfe9a41d541682bd",
          "body": "Antora resolves a bare relative xref target from the pages family root\nof the target module, not from the referencing page's own directory —\nso a page in pages/syntax/ linking to another page in the same\ndirectory needs the syntax/ prefix (or ./), not a bare filename.\n\n- diagrams.adoc and layout.ado\n[…]\ns attributes:role.adoc (singular).\n\nVerified against the actual asciidoc-lang page tree (GitLab API) and\nagainst the local antora build errors.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix broken xrefs found in the pre-6.0 review",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-28T09:28:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aee8c7efee5587a788eb55747a6f38650e297ed6",
          "body": "- Fix footnotes losing their content entirely (only the numbered marker\n  survived) when placed inside a level 3+ subsection, which renders\n  inline instead of as its own <section>. Footnotes were bucketed by\n  the nearest enclosing Section node regardless of level, so one\n  bucketed against a level\n[…]\nself-link.adoc) so Ruby stays the\nverified reference and `rake testkit:test:js` catches regressions.\n\nVerified with `rake test` and `npm test`.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: 3 JS converter parity gaps found in the pre-6.0 review",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-28T09:23:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62d6db2e84be42fb3f82a3fb5385d0ca411c3033",
          "body": "…stead of continue-on-error\n\nsource-prettify/source-rouge can never match the JS converter (third-party\nRuby-only syntax highlighters, only highlightjs is ported), but\ncontinue-on-error: true was swallowing every JS/Ruby parity failure, not\njust those two. Excludes them individually via asciidoc-testkit's own\n--ignore <family/name>:<reason> flag, so the CI job now fails on any other\n(real) regression.",
          "is_bot": false,
          "headline": "ci: ignore the known Ruby-only-highlighter gaps in testkit:test:js in…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-28T08:20:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "def5af65f7f9b566b16d10762ef212c4a091c474",
          "body": "…versions\n\nBumps asciidoc-testkit-cli to 0.1.3 (latest).",
          "is_bot": false,
          "headline": "chore(deps): pin esbuild, postject and asciidoc-testkit-cli to exact …",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T19:53:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0a25c1f773f6c436c3d6cfc7e60ffc1cd8525d5",
          "body": "display: block on <summary> stacked the marker above the text instead\nof beside it, overriding the default list-item layout without\nreplacing its inline-marker behavior; switch to display: flex with\npadding-left instead. Also adds the docinfo-locations/with-docinfo-shared\nHTML fixtures generated by the test suite.",
          "is_bot": false,
          "headline": "fix: align the summary disclosure triangle in collapsible blocks",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T19:52:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c12f667fd1cbcfdbb55370e0760094c522594f0c",
          "body": "Asciidoctor.js 4.0 is now stable; update the peer/dev dependency and\ndocs to the plain >=4.0.0 <5.0.0 range instead of the 4.0.0-alpha.6\nfloor. All existing tests pass against 4.0.6.",
          "is_bot": false,
          "headline": "chore(deps): bump asciidoctor to stable 4.0.6, drop alpha range mentions",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T19:39:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a196411474da473dce99931be9b772790335540d",
          "body": "Both features already shipped and are documented in the changelog, but\nthe release-6.0.adoc presentation didn't demonstrate them yet.",
          "is_bot": false,
          "headline": "docs: add collapsible blocks and rowstep table demo to the 6.0 showcase",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T19:26:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aeb2f90f1690bf8cc217535c6cd81b7e8c6519b1",
          "body": "…466)\n\nheader/footer meant \"first/last child of .slides\" in this converter, but\n\"first/last child of <body>\" in every other Asciidoctor converter (html5,\ndocbook5, ...). Redefine header/footer to the html5 meaning (with a\nbody-header/body-footer alias), and give the old position its own name,\nslides\n[…]\nior. An unsuffixed docinfo-footer.html is no\nlonger read by the revealjs backend at all. See\ndocs/modules/converter/pages/migrating-to-v6.adoc.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat!: redefine docinfo header/footer to match the html5 converter (#…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T18:43:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64a6dd056e5a1b8ac6c8bdf618bdd89953a604cf",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update dependency ruby to v3.4.10",
          "author_name": "Renovate Bot",
          "author_login": "renovate-bot",
          "committed_at": "2026-07-27T17:38:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b86b8f0052ed2cffe46a5140dbb3be615bb2ea8",
          "body": "…ki URL\n\nThe docinfo cross-reference had no link text, which renders as an empty/\nbroken-looking link in the built site. Also replace the url-revealjs-gh\nattribute reference with the plain URL, matching the hardcoded\nhttps://revealjs.com/plugins/ link right above it on the same line.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add link text to the docinfo xref and hardcode the reveal.js wi…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T17:38:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "533d0f29e48c66e2ef064ffb92d123bea06d045e",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update dependency rake to '~> 13.4.0'",
          "author_name": "Renovate Bot",
          "author_login": "renovate-bot",
          "committed_at": "2026-07-27T17:38:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "820831f602eecce7233aeb82e5ddf945e8b4f41c",
          "body": "Documents the new collapsible-blocks feature (#484) and the previously\nundocumented revealjs_minscale/maxscale options and revealjs_plugin_search\ntoggle. Fixes hacking.adoc's dead test/doctest instructions (replaced by\nasciidoc-testkit), clarifies the compatibility matrix for the in-development\n6.x line, lists missing roles (text-*, small), adds contributing.adoc to the\nproject nav, and documents the 4th (shared) docinfo insertion point.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix outdated content and gaps found in an Antora docs audit",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-27T17:35:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3d09731aae6cc36ab0d779c1bd869f430a784698",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): update actions/checkout action to v7",
          "author_name": "Renovate Bot",
          "author_login": "renovate-bot",
          "committed_at": "2026-07-27T17:35:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17d707b61a08dcb6d5598450ea55f9de1d38d9ba",
          "body": "Asciidoctor's own html5 converter renders [%collapsible] example\nblocks as <details>/<summary>, but this converter always fell back to\nits regular .exampleblock <div> since collapsible/open handling was\nnever implemented here. Also ships the asciidoctor-default.css\n<details>/<summary> styling, since reveal.js has none of its own (#484).",
          "is_bot": false,
          "headline": "feat: support collapsible blocks (%collapsible option on example blocks)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T10:44:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ede4e741c7bde86c86a07e522b4dba6f63b7c53",
          "body": "The step option applies fragment to the whole <table>, revealing every\nrow at once. rowstep applies fragment to each body row individually\ninstead, leaving the header row always visible (#493).",
          "is_bot": false,
          "headline": "feat: add a rowstep option to reveal tables one body row at a time",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T09:52:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab6ebcbcd1d27876ebf16eef06b583d66accec14",
          "body": "Content left outside a [.column] block on a [.columns] slide becomes a\nflex item of the row alongside the columns instead of spanning above\nthem, since the columns layout applies to the slide's content as a\nwhole. This was a recurring source of confusion (#494).",
          "is_bot": false,
          "headline": "docs: clarify that non-column content on a columns slide must be wrapped",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T09:16:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86f718c8d005c2edd0257d09ff7f6e466b886b69",
          "body": "reveal.js's layout utility classes (r-stack, r-hstack, r-vstack) style\ntheir *direct* children - e.g. .r-stack > * for stacking elements on\ntop of each other. convert_open unconditionally wrapped an open\nblock's content in a <div class=\"content\">, putting the block's own\nchildren one level too deep \n[…]\napping.\n\nSkip the .content wrapper for open blocks carrying one of these three\nroles, in both Ruby and JS converters. Also documents r-stack on the\nLayout page (was entirely undocumented).\n\nFixes #520",
          "is_bot": false,
          "headline": "fix: don't wrap r-stack/r-hstack/r-vstack open blocks in a content div",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T09:13:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e27b55dc3fe5e1141068f6163b835f6abb4e0bfd",
          "body": "The `wrap` class (`[.columns.wrap]`) was usable but never documented\non the Layout page - discoverable only by finding it in an unrelated\nexample. Explain what it actually changes (every column in the row\nsizes itself to its own content and can wrap onto a new row, instead\nof the default equal-width\n[…]\n for it likely wants: equal-width columns already\nshrink their content to fit without wrapping, with no modifier\nneeded. wrap is meant for content that shouldn't be shrunk, such as\nimages.\n\nFixes #456",
          "is_bot": false,
          "headline": "docs: document the wrap columns modifier",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T08:17:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6110d8b0add0f29b2ea03aad9a3c8118e72851df",
          "body": "Reveal.js's own core CSS sets .reveal .slides { text-align: center },\nwhich centered the .attribution div (instead of right/left-aligning\nit per asciidoctor-default.css) and left it visually identical to\nthe quoted text, since this converter shipped no quoteblock/verseblock\nCSS of its own.\n\nPort the\n[…]\ns's .attribution\nrules (right-aligned for quoteblock, left-aligned for verseblock,\nsmaller italic font for both), prefixed with .reveal for specificity\nover reveal.js's own centering rule.\n\nFixes #506",
          "is_bot": false,
          "headline": "fix: align/style block quote and verse attribution",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-26T08:03:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "268d056d192a95fad0ac8f0024ec8a7b9876eef2",
          "body": "New syntax/diagrams.adoc page covering asciidoctor-kroki for both\nRuby and JavaScript - no reveal.js-specific setup needed since it\njust produces a regular image, which this converter already knows\nhow to render.\n\nFixes #366",
          "is_bot": false,
          "headline": "docs: document diagram generation via the Kroki extension",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T21:14:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eca42d952f39e0cb5e53315ffed12c701cfee764",
          "body": "…efault\n\n- State explicitly that :customcss: (and its asciidoctor-revealjs.css\n  fallback) names a file the converter only links to - it never\n  generates one, the reader has to author it themselves. That wasn't\n  said anywhere, so anyone who forgot to create the file just saw no\n  effect with no ex\n[…]\nit still said the built-in lib/css/zenburn.css,\n  a leftover from the pre-pure-Ruby Slim templates; the actual\n  default is reveal.js's own bundled dist/plugin/highlight/monokai.css.\n\nFixes #513, #133",
          "is_bot": false,
          "headline": "docs: clarify custom-styles.adoc and fix a stale highlight.js theme d…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T20:12:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8dafc3fa4eb214303f1cc861b1aa0f787113ea79",
          "body": "convert_outline (the toc::[]/:toc: table of contents generator) had\nno notion of the \"!\"-means-titleless convention convert_section\nalready uses to decide whether to render a slide's <h2> - so a\ntitleless slide showed up in the ToC as a literal, meaningless \"!\"\nentry instead of being skipped.\n\nSkip sections whose title is literally '!' when building the ToC,\nthe same way convert_section already treats them as titleless.\n\nFixes #236",
          "is_bot": false,
          "headline": "fix: omit titleless slides (== !) from the table of contents",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T19:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dff49212f078c0cc77e6b738e6265634eee5ec18",
          "body": "Registering our HighlightJsAdapter for 'highlightjs'/'highlight.js'\nreplaces Asciidoctor's built-in highlight.js syntax highlighter in\nthe process-wide SyntaxHighlighter registry - which has no notion of\n\"per backend\". So simply requiring this converter (e.g. to register\nmultiple backends in one pro\n[…]\nonverter already uses for non-\nrevealjs-specific node types.\n\nVerified the html5-backend output is now byte-for-byte identical\nwhether or not this converter is loaded, in both Ruby and JS.\n\nFixes #489",
          "is_bot": false,
          "headline": "fix: scope the highlightjs syntax highlighter override to revealjs",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T17:29:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1c2a140732f40284c51fcdac63cc73c78f25073b",
          "body": "test/fixtures/standalone/*.adoc carried a // .<case-name> / // :include:\n/ // :header_footer: comment block at the top of each file - directives\nread by the old asciidoctor-doctest gem (case name, xpath selector for\nthe fragment to compare, whether to run standalone conversion).\n\nThat gem was replac\n[…]\nmment, .admonitions-font, didn't even match its own filename\nanymore), so drop them; the few lines that were genuine descriptive\ncomments (what the fixture demonstrates, issue/PR references) are kept.",
          "is_bot": false,
          "headline": "chore: remove vestigial asciidoctor-doctest comments from fixtures",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T17:11:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d974f6a239ada40c511c4ebe77534210f61c8cf",
          "body": null,
          "is_bot": false,
          "headline": "docs: add changelog entry for the windows CI speedup",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T17:10:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "126a99a2434322b8a3b31737b581aa3bd8c6df3d",
          "body": "The windows-latest/3.4 leg was running the full test task (unit tests\nplus the ~300-spawn asciidoc-testkit corpus) as well as examples and\nrelease-notes conversion, making it by far the slowest job in the\nmatrix. Those checks are already covered exhaustively by the\nUbuntu/CRuby leg, so windows now runs unit tests only.",
          "is_bot": false,
          "headline": "ci: skip testkit and example/release-notes conversion on windows",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T17:10:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf08a21b6cf19552a25a5f28035782b606fef7c9",
          "body": "Every other title-slide-background-* attribute (color, image, video,\nsize, repeat, position, opacity, iframe, transition) is already\ncarried over to the title slide's data-background-* attributes;\ngradient was the one missing from that list, even though the\nequivalent background-gradient attribute already works on regular\nsections.\n\nFixes #514",
          "is_bot": false,
          "headline": "fix: support :title-slide-background-gradient:",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T16:46:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96bf0292dfcad86a8faa8b602870c0e579c7a926",
          "body": "The converter already emitted <ul class=\"unstyled\"> (and the other\nAsciidoctor list-style keywords) correctly for these - matching\nAsciidoctor's own html5 converter, which applies the block style\n(not the role) to the <ul>/<ol> element. But nothing in the bundled\ncompatibility.css gave that class an\n[…]\nh bullets.\n\nAdd the same rules asciidoctor-default.css uses for these classes\n(list-style-type: none, appropriate margin), tracked in this project\nsince 2016 and never actually implemented.\n\nFixes #77",
          "is_bot": false,
          "headline": "feat: style unstyled lists ([unstyled]/[none]/[no-bullet]/[unnumbered])",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T16:37:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "50bd7928cf705f8ca06b735595ef8c6edfc92fde",
          "body": "convert_embedded rendered the document title as a bare <h1>, outside\nany <section>, whenever showtitle made it eligible for embedded\n(--no-header-footer) conversion. That breaks the reveal.js slide\nmodel - the stray <h1> isn't part of any slide, and shows up wherever\nthe embedded fragment happens to\n[…]\ndoes for standalone\nconversion: as a real title_slide, wrapped in <section class=\"title\"\ndata-state=\"title\">. There's no reason for embedded conversion to\nrender the title any differently.\n\nFixes #270",
          "is_bot": false,
          "headline": "fix: wrap the embedded conversion title in a proper title-slide section",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T16:10:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1506c288ee32e3112f0434f43f71dc09f6664cc",
          "body": "video::[options=\"autoplay,muted\"] autoplayed but never actually muted\nthe <video> element for a local (non-vimeo/youtube) video block: the\nmuted option was the only playback option (autoplay, controls, loop)\nnot carried over to the generated <video> tag's attributes.\n\nAsciidoctor's own html5 converter already sets muted for the same\ncase (asciidoctor/asciidoctor#3408); do the same here.\n\nFixes #523",
          "is_bot": false,
          "headline": "fix: set the muted attribute on local video blocks",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-25T15:24:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f74279632720429d7a6ac07db574e25c137d268",
          "body": "The highlightjs syntax-highlighter docinfo footer script called\nhljs.configure({ ignoreUnescapedHTML: true }) *after* injecting\ndata/highlight-plugin.js, which ends with\nReveal.registerPlugin('highlight', Plugin). Since Reveal.initialize()\nis already running by the time this footer script executes, \n[…]\n (jsdom, real highlight.js from\ncdnjs, real reveal.js from CDN) reproducing the exact corrupted DOM\nreported in the issue, and confirming the fix restores clean output\nfor both converters.\n\nFixes #525",
          "is_bot": false,
          "headline": "fix: configure hljs before registering the reveal.js highlight plugin",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T22:05:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f0b529b3225ca2b4be6d8b2596bcefbf74443535",
          "body": "convert_ulist's checklist branch for `:icons: font` rendered\n<i class=\"icon-check\"></i>/<i class=\"icon-check-empty\"></i>, Font\nAwesome 3 class names that don't exist in Font Awesome 4/5/6 (the only\nversions this converter's docinfo actually loads), so the checkbox\nicon was invisible - only the inter\n[…]\n elsewhere for icons (icon_mapping in convert_admonition),\nmatching the Font Awesome 4-compatible class names shimmed by the\nv4-shims.min.css this converter loads alongside Font Awesome 5.\n\nFixes #526",
          "is_bot": false,
          "headline": "fix: show checklist checkboxes when :icons: font is set",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T20:31:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1b653d892c4fe58d38ddd2325ce55b6cc02fecbf",
          "body": "convert_document (Ruby and JS) always rendered the title slide\nwhenever the document had a header, regardless of the :notitle:\ndocument attribute. Every other title-related check in the converters\n([%notitle] on a section, the embedded converter's own <h1>) already\nrespected notitle/isNotitle; only \n[…]\ntle slide dispatch didn't.\n\nGuard the title_slide conversion with the same check so setting\n:notitle: on the document hides the title slide entirely, as it does\nfor the embedded converter.\n\nFixes #535",
          "is_bot": false,
          "headline": "fix: honor the :notitle: document attribute (hide the title slide)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T20:19:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bc98607128aa2c01608668049ea27870400d4891",
          "body": "…tle slide\n\nconvert_section/convert_title_slide (Ruby and JS) only rendered a fixed\nallowlist of data-* attributes (data-background-*, data-transition,\ndata-state, data-auto-animate-*, ...), silently dropping any other\ndata-* attribute set on a section or in the document header. That\nprevented using\n[…]\nme way, while keeping the already-computed known values\n(e.g. data-background-color derived from the background-color shorthand)\nfrom being clobbered by a same-named passthrough attribute.\n\nFixes #541",
          "is_bot": false,
          "headline": "fix: stop dropping arbitrary data-* attributes on sections and the ti…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T20:06:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6bc7c656e1dd8254c5c1c200429d7375fb1852a3",
          "body": "- inlineImageContent: the icon: macro's image-icon branch used a plain\n  truthiness check on the icons attribute's *value* (else if (icons)),\n  which is false for an empty string. Ruby's equivalent is written the\n  same way but works there because '' is truthy in Ruby — exactly the\n  kind of diverge\n[…]\n:test:js` into CI\n(Linux only, continue-on-error: true — 2 permanent, documented gaps\nremain: source-prettify/source-rouge, third-party Ruby-only syntax\nhighlighters never ported to the JS converter).",
          "is_bot": false,
          "headline": "fix: three JS converter parity gaps (icon macro, bibref, footnote reuse)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T12:50:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e2037d6506a2617babee35c31fbe36aba91b958",
          "body": "…e's default\n\nrevealjsdir's default intentionally differs between the two converters\n(reveal.js/ outside Node, node_modules/reveal.js/ in a Node.js\nenvironment — see revealjs-options.adoc), but neither RUBY_CONVERTER\nnor JS_CONVERTER in tasks/testkit.rake overrode it, so every\n`standalone` family ca\n[…]\nDN URL).\n\nOnly 2 genuine gaps remain in that family (source-prettify,\nsource-rouge — third-party Ruby-only syntax highlighters, same\ncategory as the already-known source-coderay/source-pygments gaps).",
          "is_bot": false,
          "headline": "fix: pin revealjsdir in the JS testkit converter to match the Ruby on…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T10:43:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd14d09f364d7d9d75b677370e647ddab770bb51",
          "body": "…-revealjs) naming, merge revealjs/revealjs-examples\n\ntest/fixtures-extra/ becomes test/fixtures/ (the \"-extra\" qualifier only\never meant \"beyond asciidoc-testkit's own bundled corpus\"). The bundled\ncorpus's own expected output moves from test/expected/ to\ntest/expected-testkit/, freeing test/expect\n[…]\ngments skips (third-party Ruby-only\nsyntax highlighters, not ported to the JS converter).\n\nAntora attachment symlinks under docs/modules/converter/attachments/ are\nrecreated to point at the new paths.",
          "is_bot": false,
          "headline": "refactor: rename test/fixtures-extra to test/fixtures, swap expected(…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T10:25:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "07f6302d956fff9946cd4fa9a5c8aaf793a085a9",
          "body": "Every doc page that cites a specific example file now points at a\nsymlink under docs/modules/converter/attachments/ (Antora's\nattachment$ resource family) through xref:attachment$..., instead of a\nhand-typed examples/ path or GitHub blob URL that can silently rot.\n\nThis also fixes two dead links: re\n[…]\nect-examples},\nupdated in antora.yml to the new test/fixtures-extra/revealjs-examples/\nlocation. hacking.adoc's description of the examples/test/release-notes\nsplit is updated to match the new layout.",
          "is_bot": false,
          "headline": "docs: link examples via Antora attachment xrefs instead of raw paths",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T10:25:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f233b74d593ad09d14cd6d3efd1fecd0ca2bfb85",
          "body": "examples/ mixed three unrelated concerns: the Netlify release-notes\nshowcase, the asciidoc-testkit \"revealjs-examples\" regression corpus\n(previously reached through a symlink), and the JS/Ruby parity corpus.\n\nMove the release-*.adoc/.css demos (and only the images they actually\nuse) to a new top-lev\n[…]\nks/examples.js and js/test/examples.test.js at the new test-corpus\nlocation, and add release-notes/ to the JS/Ruby parity coverage so it\nisn't lost. Update netlify.toml, CI and .gitignore accordingly.",
          "is_bot": false,
          "headline": "refactor: split examples/ into release-notes/ and a real test corpus",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-24T10:25:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c19923a4131975797761df96831e96ce5c79e4fa",
          "body": "test/fixtures, test/fixtures-extra, and test/fixtures-revealjs all\nstarted with \"fixtures\" despite meaning three different things (two\nare expected *output*, one is *input*), which made the tree confusing\nto navigate. Renamed the output side to test/expected and\ntest/expected-revealjs, matching asci\n[…]\n.\n\nAlso removes test/settings.adoc and test/admonition-paragraphs.adoc,\ntwo orphaned pre-doctest scratch files sitting directly in test/ with\nno rake task, test file, or JS glob ever referencing them.",
          "is_bot": false,
          "headline": "refactor: rename test/fixtures(-revealjs) to test/expected(-revealjs)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:51:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ab39fa10d42a3ef39bc33ac9ef137cabccc3b61",
          "body": "Split `rake test` into `rake test:unit` (just the Minitest suite) and\nthe aggregate `rake test` (unit tests + the asciidoc-testkit corpus).\nThe corpus's ~300 sequential `bundle exec` spawns (asciidoc-testkit has\nno persistent-worker mode yet) multiply JRuby/TruffleRuby's JVM startup\ncost into a 10+ \n[…]\ny. Those legs\nexist to catch Ruby-implementation compat bugs, not to re-validate\nfixture content, which the CRuby legs already do exhaustively, so CI\nnow runs test:unit there instead of the full test.",
          "is_bot": false,
          "headline": "ci: skip the asciidoc-testkit corpus on JRuby/TruffleRuby",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be2094eaf498bc69c0a3088a97c8415452ffd86b",
          "body": "Each fixture case spawns a fresh `bundle exec asciidoctor` process (no\npersistent worker), and on JRuby/TruffleRuby the JVM startup alone can\ntake several seconds — well past the CLI's 10s default.\nrevealjs/source-rouge (which also loads the rouge gem) was timing out\non both in CI.",
          "is_bot": false,
          "headline": "fix: raise asciidoc-testkit's --timeout to 30s for JRuby/TruffleRuby",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5df07611e6bb50ce99f5415f2ee4c16fb3a5dd0f",
          "body": "Fixes `spawn bundle ENOENT` on Windows CI: 0.1.1 shelled out to the\nconverter command without a shell, which fails there for any command\nthat resolves to a .bat/.cmd shim (bundle, npm, etc.).",
          "is_bot": false,
          "headline": "chore: bump asciidoc-testkit-cli to 0.1.2",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "842704afb2037b6f3d31294a009500e952af55c4",
          "body": "Full replacement of the asciidoctor-doctest gem with asciidoc-testkit\n(asciidoc-testkit-cli npm package): `rake testkit:test`/`testkit:update`\nrun two invocations against the Ruby converter (a fixed converter\ncommand per invocation is a hard constraint of the tool, so families\nneeding different flag\n[…]\novers examples/. Not wired\n  into CI yet — it currently surfaces 24 pre-existing parity gaps\n  (footnote numbering, the icon: macro rendering as text instead of\n  <img>, ...) that need triaging first.",
          "is_bot": false,
          "headline": "feat: replace asciidoctor-doctest with asciidoc-testkit",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7598b93c07cb9095bbe2005a5b2e5f9c51dce0f2",
          "body": "Alongside the existing asciidoctor-doctest suite, not replacing it yet:\nadd test/fixtures/<family>/<case>.html for the 37 generic AsciiDoc-\nconstruct families, split from the equivalent test/doctest/<family>.html\n(dropping 4 cases with no matching asciidoc-testkit corpus input: two\nextra admonition \n[…]\nst:test\ntask.\n\n.gitignore also drops .claude/worktrees/ (worktrees are now created\ninside the project's .claude/ dir so they show up in the IDE) from the\nnoise a plain git status would otherwise show.",
          "is_bot": false,
          "headline": "feat: add an experimental asciidoc-testkit-based fixture suite",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T20:25:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bae75fa59aa69a13d5a64680c47430bf47f87ab5",
          "body": "Windows CI failed: both GNU and BSD tar misparse a Windows drive-letter\npath (D:/...) as a remote host spec (host:path), so `tar xzf ... -C\nD:/...` tried to open a network connection to a host named \"D\" instead\nof extracting locally. Extracting via Gem::Package::TarReader +\nZlib::GzipReader avoids the external tar binary (and its\nflag/quirk differences across GNU/BSD/JRuby/TruffleRuby) entirely.",
          "is_bot": false,
          "headline": "fix: extract reveal.js-plugins tarball in pure Ruby, not via `tar`",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T16:51:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cd5a5b7f22dcf85b32a4d045e2b89ab1cd9a06e",
          "body": "…e assets\n\nexamples/Font-Awesome-6.7.2/ (~7MB) and examples/reveal.js-plugins-4.6.0/\nwere committed directly to the repo, unlike examples/reveal.js/, which is\ngitignored and fetched on demand. Bring them in line: fetch Font Awesome\nas a normal devDependency copied by `rake examples:assets`, and\nreve\n[…]\n a normal dependency, since that package\nlists `npm` itself as a dependency and would otherwise drag in npm's\nentire internal tooling tree for a plugin package that never touches any\nof it at runtime.",
          "is_bot": false,
          "headline": "chore: stop committing vendored Font Awesome/reveal.js-plugins exampl…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T16:51:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a007ddb710e992c2f9b74e61fe55cc7c7d4f144",
          "body": "Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: ignore the .claude/ directory",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T16:51:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5226484e5895bc914d976375767d5f0559a31ca6",
          "body": "…_nested_elements\n\nNone of these are ever dispatched: Asciidoctor dispatches convert_X methods by\nnode_name, and no node has a `ruler`, `notes`, or `stretch_nested_elements`\nnode name.\n\n- convert_ruler (Ruby converter.rb, JS converter.js): thematic breaks are\n  parsed as :thematic_break, which conve\n[…]\n JS port carried over the same leftover.\n\nVerified with `rake test` (245/245 doctest examples pass) and `npm test`\n(86/86 JS tests pass, including byte-for-byte comparison against the Ruby\nconverter).",
          "is_bot": false,
          "headline": "chore: remove unreachable convert_ruler/convert_notes/convert_stretch…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T13:15:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9678d9a557e83b02b9f7f66596bec9b0d39a349",
          "body": "bin/asciidoctor-revealjs required the hyphenated `asciidoctor-revealjs`\ninstead of the actual `asciidoctor_revealjs` file/gem name, so every\ninvocation (including the `bundle exec asciidoctor-revealjs` command\ndocumented in the setup guide) crashed with:\n\n  LoadError: cannot load such file -- asciid\n[…]\n\nVerified by building the gem and installing it into an isolated GEM_HOME:\nthe CLI now runs. The typo dates back to the very first commit and is\nalso present in the currently published v5.2.0 release.",
          "is_bot": false,
          "headline": "fix: repair the broken asciidoctor-revealjs Ruby CLI require path",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T13:15:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08f66edaadc2d157b6f3d6fffc0bfe402bb3934c",
          "body": "…sOptions/highlightjs\n\ntest/templates_test.rb referenced templates/slim and test/output/slim, both\nremoved by the pure-Ruby converter rewrite (#544); it wasn't wired into\n`rake test` (which only globs test/asciidoctor_revealjs/*_test.rb), so it was\ndead code. Drop it along with the now-unused `requi\n[…]\nn) and the highlightjs syntax highlighter adapter (language class,\nline-number/highlight-range conversion, docinfo), which previously had no\ndedicated unit tests outside the doctest golden-file suite.",
          "is_bot": false,
          "headline": "test: remove dead Slim-era test scaffolding, add coverage for RevealJ…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T13:06:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b04cd9c46eb99fce14ff3d033de78aa9c38a47d3",
          "body": "Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: simplify the release scripts and workflow (#559)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-23T10:07:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b81ad2c97837031b5c166cefa369496b0d28e10",
          "body": null,
          "is_bot": false,
          "headline": "chore: update remaining master references to main (#557)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-22T21:00:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92f07778a04c0338b253d680e78dd494cbf927f3",
          "body": null,
          "is_bot": false,
          "headline": "fix: resync the embedded highlight.js plugin with reveal.js 6.0.1 (#558)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-07-22T21:00:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1ba15a4fb03ca322fe3d7983577436024c0c0a8",
          "body": "Render one card per release (most recent first), tag the latest release,\nand list curated highlights per version. Add a \"What's new\" section to the\nREADME pointing to the demos site and switch the 6.0 demo to the blood theme.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: redesign the release showcase landing page with highlight cards",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T16:23:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8d0cbb937ba729dc0b8c653bfb23ecd7e20d396f",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: review user documentation for consistency and accuracy (#553)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T15:47:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc381a5e7b48f3fe4976a6743ff7becc1628ff36",
          "body": "…endency (#552)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: share data assets with Ruby and make asciidoctor a peer dep…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T14:52:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9108e2d53e3ad52a77e58a12e0e148304b9bbdd6",
          "body": "…ses are published (#551)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build: Modernizes how the standalone binaries are built and how relea…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T14:03:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b46d27b082624971b9eecb7a53255363ae12318",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add reveal.js 6.0 release demo showcasing the lightbox (#550)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T11:44:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "867916602a20419443c652a8f9270fb937abe0d7",
          "body": "…(#549)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: auto-discover release demos when publishing the showcase site …",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T09:45:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df8ce163d9fa4320e78d8a7ef10f609e4c6ab42d",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract shared helpers for release scripts (#548)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-04T09:34:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dc7df8f21aae5b30f7582f17ede8c4d963f84ac9",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: upgrade reveal.js to 6.0.1 and clean up release tasks (#547)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T15:21:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2bbfa4fc50e26350a62b79eac1c8a7fd5b162c54",
          "body": "… (#546)\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update asciidoctor to 4.0.0-alpha.6 and drop fixed workarounds…",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T15:13:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f6821ecf6a4f619523f4221fdaecc0b93555973d",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: port the converter to native Asciidoctor.js 4.0  (#545)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T13:52:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1178898c36272fe5c5ebfd3035bf0ecb3e85da23",
          "body": "Split dependency updates by ecosystem (npm/ruby), limit concurrent PRs\nto 3, schedule updates on Mondays, wait 7 days before proposing a new\nrelease, and switch to emoji-free semantic commits.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: improve renovate config for smaller, scheduled PRs",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T10:30:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d593baf688b5b220951f1dc260723aea7744ec49",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: implement the converter using pure Ruby (#544)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-03T10:24:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "727e2a9a0e5187d880503614e47b17832491d495",
          "body": "Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Automate release process via GitHub Actions (#543)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2026-06-02T09:43:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "abf4081b526eea24cd933efbf71ebf5a84e96874",
          "body": null,
          "is_bot": false,
          "headline": "Amend release process description",
          "author_name": "Jérôme Tama",
          "author_login": "jtama",
          "committed_at": "2024-12-05T09:44:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b3fd8fabd02e2dce3e278b99a9a35b00dfc9c37",
          "body": null,
          "is_bot": false,
          "headline": "Amend release process description",
          "author_name": "jtama",
          "author_login": "jtama",
          "committed_at": "2024-12-05T08:26:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d26cee12a009529d6be016a8e4e05da9d5167898",
          "body": null,
          "is_bot": false,
          "headline": "Begin development on next release 5.3.0-dev",
          "author_name": "jtama",
          "author_login": "jtama",
          "committed_at": "2024-12-04T07:43:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0e60aecbda2dd546358fd3bab1056675870048d",
          "body": null,
          "is_bot": false,
          "headline": "Release 5.2.0",
          "author_name": "jtama",
          "author_login": "jtama",
          "committed_at": "2024-12-04T06:59:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37133aa56a4e171ed504b67424bce85eab0eb104",
          "body": null,
          "is_bot": false,
          "headline": "Prepare 5.2.0 release",
          "author_name": "jtama",
          "author_login": "jtama",
          "committed_at": "2024-12-04T06:59:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f45cb83d9ab74b98c881f3e39f0db94dbd32fbd",
          "body": null,
          "is_bot": false,
          "headline": "Prepare 5.2.0 (#537)",
          "author_name": "Jérôme Tama",
          "author_login": "jtama",
          "committed_at": "2024-12-03T18:43:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f8cd93231894a043f576350732e5b712f4439e4",
          "body": null,
          "is_bot": false,
          "headline": "fix: update source-rouge assertion based on the latest version of Rouge",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2024-12-03T17:10:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68d298b7f5f9f51a7b89d41bb74423d2f0694baf",
          "body": null,
          "is_bot": false,
          "headline": "chore: asciidoctor-doctest is incompatible with minitest >= 5.25",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2024-12-03T16:52:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c69f16945e418b33a016d29286c321ec7962f519",
          "body": "resolves #532",
          "is_bot": false,
          "headline": "Fixes data-fragment-index on code block (#533)",
          "author_name": "Jérôme Tama",
          "author_login": "jtama",
          "committed_at": "2024-05-04T14:04:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8484b01943a085cc1279cf2abe1d041a2e194254",
          "body": null,
          "is_bot": false,
          "headline": "Using [%step] on colist works the same as on ulist (#529)",
          "author_name": "ibethus",
          "author_login": "ibethus",
          "committed_at": "2024-04-15T20:19:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbe2ac7f72877050ce15ee4a38fd54ca91590a78",
          "body": null,
          "is_bot": false,
          "headline": "Bump pkg",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T13:16:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a82413668f51dd0ebc2f1b24b58d251954c7a006",
          "body": null,
          "is_bot": false,
          "headline": "Release 5.1.0",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11b3a47b5708e241d7aa2f9a9834a6f4f41cc162",
          "body": null,
          "is_bot": false,
          "headline": "Prepare 5.1.0 release",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42e944b5bf82f9fd1d3d2d934e6e066feab6d818",
          "body": null,
          "is_bot": false,
          "headline": "Update ggrossetie GitHub username",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:48:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ac68b6309778016930d12a319331abb2785f63f",
          "body": null,
          "is_bot": false,
          "headline": "Ignore public folder",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:46:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b9f1e00547143475ad174b4ba07dbffaa6f7977",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:46:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c16a9494e430767b36c338c0e6cdb7b32a65dca4",
          "body": null,
          "is_bot": false,
          "headline": "Update dependencies to support Asciidoctor.js 3.x (#524)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T12:02:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68013c50201a42235f3a0cfeb9018ac656c2e6eb",
          "body": null,
          "is_bot": false,
          "headline": "Prepare 5.1.0 release based on reveal.js 4.5.0 (#517)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T11:56:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52a6bb95751f23db4dd7490b638da17e24b33363",
          "body": null,
          "is_bot": false,
          "headline": "resolves #479 upgrade to asciidoctor-templates-compiler 0.7.0 (#515)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-12-12T11:55:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e320b1d371f3d90bfe92ad916fa724e3d78ad1d",
          "body": "Co-authored-by: Renovate Bot <bot@renovateapp.com>",
          "is_bot": false,
          "headline": ":arrow_up: Update all dependencies (#498)",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-07-15T08:30:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d192d0b209021de034b0a77f82e873c676c75037",
          "body": null,
          "is_bot": false,
          "headline": "Fix docinfo xref",
          "author_name": "Guillaume Grossetie",
          "author_login": "ggrossetie",
          "committed_at": "2023-07-15T08:22:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 22,
      "commits_last_year": 71,
      "latest_release_at": "2026-07-30T09:13:58Z",
      "latest_release_tag": "v6.0.0-beta.2",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 264.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@asciidoctor/reveal.js",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "asciidoc",
            "asciidoctor",
            "opal",
            "javascript",
            "library",
            "backend",
            "template",
            "reveal.js"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@asciidoctor/reveal.js",
          "is_deprecated": false,
          "latest_version": "5.2.0",
          "repository_url": "https://github.com/asciidoctor/asciidoctor-reveal.js",
          "versions_count": 11,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 3,
          "monthly_downloads": 5162,
          "first_published_at": "2019-12-26T20:36:40.014000Z",
          "latest_published_at": "2024-12-04T07:02:55.529000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 603
        },
        {
          "name": "asciidoctor-revealjs",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/asciidoctor-revealjs",
          "is_deprecated": false,
          "latest_version": "5.2.0",
          "repository_url": "https://github.com/asciidoctor/asciidoctor-reveal.js",
          "versions_count": 26,
          "total_downloads": 293858,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2016-10-07T02:01:21.456000Z",
          "latest_published_at": "2026-07-30T09:12:26.379000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 185,
      "stars": 313,
      "watchers": 13,
      "fork_history": {
        "days": [
          {
            "date": "2014-10-17",
            "count": 1
          },
          {
            "date": "2014-10-19",
            "count": 2
          },
          {
            "date": "2014-12-06",
            "count": 1
          },
          {
            "date": "2015-01-14",
            "count": 1
          },
          {
            "date": "2015-02-02",
            "count": 1
          },
          {
            "date": "2015-02-21",
            "count": 1
          },
          {
            "date": "2015-05-05",
            "count": 1
          },
          {
            "date": "2015-05-26",
            "count": 1
          },
          {
            "date": "2015-06-05",
            "count": 1
          },
          {
            "date": "2015-06-12",
            "count": 1
          },
          {
            "date": "2015-07-09",
            "count": 2
          },
          {
            "date": "2015-07-14",
            "count": 1
          },
          {
            "date": "2015-07-21",
            "count": 1
          },
          {
            "date": "2015-08-14",
            "count": 1
          },
          {
            "date": "2015-08-27",
            "count": 1
          },
          {
            "date": "2015-09-04",
            "count": 1
          },
          {
            "date": "2015-09-18",
            "count": 1
          },
          {
            "date": "2015-09-25",
            "count": 1
          },
          {
            "date": "2015-10-17",
            "count": 1
          },
          {
            "date": "2015-10-20",
            "count": 1
          },
          {
            "date": "2015-10-22",
            "count": 1
          },
          {
            "date": "2015-11-20",
            "count": 1
          },
          {
            "date": "2015-11-26",
            "count": 1
          },
          {
            "date": "2015-12-01",
            "count": 1
          },
          {
            "date": "2016-02-25",
            "count": 1
          },
          {
            "date": "2016-02-29",
            "count": 1
          },
          {
            "date": "2016-04-21",
            "count": 1
          },
          {
            "date": "2016-04-22",
            "count": 1
          },
          {
            "date": "2016-04-27",
            "count": 1
          },
          {
            "date": "2016-05-25",
            "count": 1
          },
          {
            "date": "2016-06-12",
            "count": 1
          },
          {
            "date": "2016-07-18",
            "count": 1
          },
          {
            "date": "2016-09-06",
            "count": 1
          },
          {
            "date": "2016-09-08",
            "count": 1
          },
          {
            "date": "2016-09-14",
            "count": 1
          },
          {
            "date": "2016-09-22",
            "count": 1
          },
          {
            "date": "2016-09-29",
            "count": 1
          },
          {
            "date": "2016-10-18",
            "count": 1
          },
          {
            "date": "2016-10-29",
            "count": 1
          },
          {
            "date": "2017-01-11",
            "count": 1
          },
          {
            "date": "2017-02-26",
            "count": 1
          },
          {
            "date": "2017-03-03",
            "count": 2
          },
          {
            "date": "2017-03-14",
            "count": 1
          },
          {
            "date": "2017-04-02",
            "count": 1
          },
          {
            "date": "2017-04-19",
            "count": 1
          },
          {
            "date": "2017-05-22",
            "count": 1
          },
          {
            "date": "2017-08-14",
            "count": 1
          },
          {
            "date": "2017-09-17",
            "count": 1
          },
          {
            "date": "2017-10-08",
            "count": 1
          },
          {
            "date": "2017-10-18",
            "count": 1
          },
          {
            "date": "2017-10-31",
            "count": 1
          },
          {
            "date": "2017-12-26",
            "count": 1
          },
          {
            "date": "2018-01-31",
            "count": 1
          },
          {
            "date": "2018-02-01",
            "count": 1
          },
          {
            "date": "2018-02-03",
            "count": 1
          },
          {
            "date": "2018-02-08",
            "count": 1
          },
          {
            "date": "2018-03-05",
            "count": 1
          },
          {
            "date": "2018-03-13",
            "count": 1
          },
          {
            "date": "2018-04-10",
            "count": 1
          },
          {
            "date": "2018-04-15",
            "count": 1
          },
          {
            "date": "2018-07-05",
            "count": 1
          },
          {
            "date": "2018-09-09",
            "count": 1
          },
          {
            "date": "2018-10-11",
            "count": 1
          },
          {
            "date": "2018-11-19",
            "count": 1
          },
          {
            "date": "2018-12-04",
            "count": 1
          },
          {
            "date": "2019-01-17",
            "count": 1
          },
          {
            "date": "2019-02-02",
            "count": 1
          },
          {
            "date": "2019-03-03",
            "count": 1
          },
          {
            "date": "2019-03-04",
            "count": 1
          },
          {
            "date": "2019-04-01",
            "count": 1
          },
          {
            "date": "2019-04-26",
            "count": 1
          },
          {
            "date": "2019-06-12",
            "count": 2
          },
          {
            "date": "2019-09-08",
            "count": 1
          },
          {
            "date": "2019-09-22",
            "count": 1
          },
          {
            "date": "2019-09-30",
            "count": 1
          },
          {
            "date": "2019-10-28",
            "count": 1
          },
          {
            "date": "2019-10-31",
            "count": 1
          },
          {
            "date": "2019-11-27",
            "count": 1
          },
          {
            "date": "2019-12-04",
            "count": 1
          },
          {
            "date": "2020-01-23",
            "count": 1
          },
          {
            "date": "2020-01-28",
            "count": 1
          },
          {
            "date": "2020-02-21",
            "count": 1
          },
          {
            "date": "2020-03-03",
            "count": 1
          },
          {
            "date": "2020-05-08",
            "count": 1
          },
          {
            "date": "2020-05-18",
            "count": 1
          },
          {
            "date": "2020-07-01",
            "count": 1
          },
          {
            "date": "2020-07-05",
            "count": 1
          },
          {
            "date": "2020-08-10",
            "count": 1
          },
          {
            "date": "2020-08-18",
            "count": 1
          },
          {
            "date": "2020-09-08",
            "count": 1
          },
          {
            "date": "2020-09-22",
            "count": 1
          },
          {
            "date": "2020-09-24",
            "count": 1
          },
          {
            "date": "2020-09-29",
            "count": 1
          },
          {
            "date": "2020-11-16",
            "count": 1
          },
          {
            "date": "2020-11-26",
            "count": 3
          },
          {
            "date": "2020-12-22",
            "count": 1
          },
          {
            "date": "2021-01-19",
            "count": 1
          },
          {
            "date": "2021-01-26",
            "count": 2
          },
          {
            "date": "2021-02-05",
            "count": 1
          },
          {
            "date": "2021-02-27",
            "count": 1
          },
          {
            "date": "2021-03-02",
            "count": 1
          },
          {
            "date": "2021-03-03",
            "count": 1
          },
          {
            "date": "2021-03-05",
            "count": 1
          },
          {
            "date": "2021-03-30",
            "count": 1
          },
          {
            "date": "2021-04-15",
            "count": 1
          },
          {
            "date": "2021-04-22",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 1
          },
          {
            "date": "2021-05-17",
            "count": 1
          },
          {
            "date": "2021-06-06",
            "count": 1
          },
          {
            "date": "2021-06-10",
            "count": 1
          },
          {
            "date": "2021-06-13",
            "count": 1
          },
          {
            "date": "2021-06-16",
            "count": 1
          },
          {
            "date": "2021-06-28",
            "count": 1
          },
          {
            "date": "2021-07-10",
            "count": 1
          },
          {
            "date": "2021-07-20",
            "count": 1
          },
          {
            "date": "2021-07-27",
            "count": 1
          },
          {
            "date": "2021-08-01",
            "count": 1
          },
          {
            "date": "2021-08-10",
            "count": 1
          },
          {
            "date": "2021-08-24",
            "count": 1
          },
          {
            "date": "2021-09-15",
            "count": 1
          },
          {
            "date": "2021-09-20",
            "count": 1
          },
          {
            "date": "2021-09-22",
            "count": 1
          },
          {
            "date": "2021-10-06",
            "count": 1
          },
          {
            "date": "2021-10-27",
            "count": 1
          },
          {
            "date": "2021-11-01",
            "count": 1
          },
          {
            "date": "2021-11-22",
            "count": 1
          },
          {
            "date": "2021-12-11",
            "count": 1
          },
          {
            "date": "2021-12-16",
            "count": 1
          },
          {
            "date": "2022-01-06",
            "count": 1
          },
          {
            "date": "2022-01-11",
            "count": 1
          },
          {
            "date": "2022-01-13",
            "count": 1
          },
          {
            "date": "2022-01-26",
            "count": 1
          },
          {
            "date": "2022-01-28",
            "count": 1
          },
          {
            "date": "2022-03-01",
            "count": 1
          },
          {
            "date": "2022-03-06",
            "count": 1
          },
          {
            "date": "2022-03-15",
            "count": 1
          },
          {
            "date": "2022-03-27",
            "count": 1
          },
          {
            "date": "2022-04-01",
            "count": 1
          },
          {
            "date": "2022-04-13",
            "count": 1
          },
          {
            "date": "2022-04-14",
            "count": 1
          },
          {
            "date": "2022-05-25",
            "count": 1
          },
          {
            "date": "2022-06-29",
            "count": 1
          },
          {
            "date": "2022-07-09",
            "count": 1
          },
          {
            "date": "2022-07-19",
            "count": 1
          },
          {
            "date": "2022-08-05",
            "count": 1
          },
          {
            "date": "2022-08-08",
            "count": 1
          },
          {
            "date": "2022-08-11",
            "count": 1
          },
          {
            "date": "2022-09-08",
            "count": 1
          },
          {
            "date": "2022-09-09",
            "count": 1
          },
          {
            "date": "2022-09-11",
            "count": 1
          },
          {
            "date": "2022-09-15",
            "count": 1
          },
          {
            "date": "2022-09-22",
            "count": 1
          },
          {
            "date": "2022-09-24",
            "count": 1
          },
          {
            "date": "2022-10-03",
            "count": 2
          },
          {
            "date": "2022-10-14",
            "count": 1
          },
          {
            "date": "2022-10-25",
            "count": 1
          },
          {
            "date": "2022-11-07",
            "count": 1
          },
          {
            "date": "2022-11-14",
            "count": 2
          },
          {
            "date": "2022-12-08",
            "count": 1
          },
          {
            "date": "2023-02-06",
            "count": 1
          },
          {
            "date": "2023-02-09",
            "count": 1
          },
          {
            "date": "2023-02-13",
            "count": 1
          },
          {
            "date": "2023-03-01",
            "count": 1
          },
          {
            "date": "2023-03-06",
            "count": 1
          },
          {
            "date": "2023-03-22",
            "count": 1
          },
          {
            "date": "2023-04-04",
            "count": 1
          },
          {
            "date": "2023-05-07",
            "count": 1
          },
          {
            "date": "2023-06-11",
            "count": 1
          },
          {
            "date": "2023-06-24",
            "count": 1
          },
          {
            "date": "2024-03-20",
            "count": 1
          },
          {
            "date": "2024-03-23",
            "count": 1
          },
          {
            "date": "2024-04-13",
            "count": 1
          },
          {
            "date": "2024-04-16",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-12-02",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 184,
        "total_forks": 185
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 62446,
      "source_files_sampled": 29,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Gemfile",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 18,
        "malicious_count": 0,
        "assessed_package": "npm:@asciidoctor/reveal.js@5.2.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "colorize",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "rouge",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "slim",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 3.0.6"
        },
        {
          "name": "reveal.js",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "6.0.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "reveal.js",
            "direct": true,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "colorize",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rouge",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "slim",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "@asciidoctor/core",
            "direct": false,
            "version": "4.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@fortawesome/fontawesome-free",
            "direct": false,
            "version": "6.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "asciidoc-converter-testkit-cli",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "asciidoc-converter-testkit-core",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "asciidoctor",
            "direct": false,
            "version": "4.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "9.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "parse5",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "postject",
            "direct": false,
            "version": "1.0.0-alpha.6",
            "ecosystem": "npm"
          },
          {
            "name": "asciidoctor",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "irb",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pry",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pry-byebug",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pygments.rb",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rake",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-minitest",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-rake",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 50,
        "direct_count": 4,
        "indirect_count": 46
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 292,
        "open_issues": 1,
        "closed_ratio": 0.996,
        "closed_issues": 273,
        "closed_unmerged_prs": 34
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "obilodeau",
          "commits": 671,
          "avatar_url": "https://avatars.githubusercontent.com/u/546325?v=4"
        },
        {
          "type": "User",
          "login": "ggrossetie",
          "commits": 298,
          "avatar_url": "https://avatars.githubusercontent.com/u/333276?v=4"
        },
        {
          "type": "User",
          "login": "mojavelinux",
          "commits": 55,
          "avatar_url": "https://avatars.githubusercontent.com/u/79351?v=4"
        },
        {
          "type": "User",
          "login": "jtama",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/39991688?v=4"
        },
        {
          "type": "User",
          "login": "archiloque",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/3771?v=4"
        },
        {
          "type": "User",
          "login": "robertpanzer",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/1163662?v=4"
        },
        {
          "type": "User",
          "login": "cmoulliard",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/463790?v=4"
        },
        {
          "type": "User",
          "login": "dschulten",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/107194?v=4"
        },
        {
          "type": "User",
          "login": "akosma",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/55348?v=4"
        },
        {
          "type": "User",
          "login": "JacobAae",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/2094825?v=4"
        }
      ],
      "contributors_sampled": 42,
      "top_contributor_share": 0.605
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".rubocop.yml"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "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": 10,
            "reason": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
            "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": 10,
            "reason": "project has 30 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "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": 9,
            "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 19 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": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "8de8b6e166bdbab38c977fa2c221a7a308ceb6ca",
        "ran_at": "2026-07-30T09:17:54Z",
        "aggregate_score": 4.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-30T09:11:28Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-30T09:08:10Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 516,
          "created_at": "2023-07-15T09:52:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/asciidoctor/asciidoctor-reveal.js",
    "host": "github.com",
    "name": "asciidoctor-reveal.js",
    "owner": "asciidoctor"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 71,
      "inputs": {
        "security": 58,
        "vitality": 70,
        "community": 62,
        "governance": 71,
        "engineering": 90
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 70,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "commits_last_year": 71,
              "human_commit_share": 0.96,
              "days_since_last_push": 0,
              "active_weeks_last_year": 4
            },
            "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": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "71 commits in the last year",
                "points": 16.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 71
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "releases_count": 22,
              "latest_release_tag": "v6.0.0-beta.2",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 264.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "22 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 22
                    }
                  }
                ],
                "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 ~264.9 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 264.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 62,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "forks": 185,
              "stars": 313,
              "watchers": 13,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "313 stars",
                "points": 40.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 313
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "185 forks",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 185
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "13 watchers",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "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": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "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": 62,
            "inputs": {
              "packages": [
                "@asciidoctor/reveal.js",
                "asciidoctor-revealjs"
              ],
              "dependents": null,
              "ecosystems": "npm, rubygems",
              "total_downloads": 293858,
              "monthly_downloads": 5162
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "5,162 downloads/month across npm, rubygems",
                "points": 49.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 5162,
                      "ecosystems": "npm, 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": "good",
        "name": "Sustainability & Governance",
        "value": 71,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 42,
              "top_contributor_share": 0.605
            },
            "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 60% of commits",
                "points": 8.9,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 60
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "42 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 42
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 30 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "merged_prs": 292,
              "open_issues": 1,
              "closed_issues": 273,
              "issue_closed_ratio": 0.996,
              "closed_unmerged_prs": 34
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.6,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "292/326 decided PRs merged",
                "points": 34.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 292,
                      "decided": 326
                    }
                  }
                ],
                "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": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "followers": 466,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "asciidoctor",
              "public_repos": 83,
              "account_age_days": 4962
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "466 followers of asciidoctor",
                "points": 19.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 466,
                      "login": "asciidoctor"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "83 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 83
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@asciidoctor/reveal.js",
                "asciidoctor-revealjs"
              ],
              "ecosystems": "npm, rubygems",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on npm, rubygems",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "npm, 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": "26 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 90,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "asciidoc",
                "reveal-js",
                "asciidoctor",
                "slides",
                "slideshow",
                "presentations",
                "hacktoberfest"
              ],
              "has_wiki": false,
              "homepage": "http://asciidoctor.org",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "http://asciidoctor.org",
                "points": 15,
                "status": "met",
                "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": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 58,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 30 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@asciidoctor/reveal.js@5.2.0 runtime dependency closure — what installing the published package pulls in — 18 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@asciidoctor/reveal.js@5.2.0",
                  "assessed": 18
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 18,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 18,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "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": 22
            },
            "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": 48,
        "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.875,
              "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": "84 of 96 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 84,
                      "sampled": 96
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.28,
              "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "28 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 28,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "primary_language": "HTML",
              "largest_source_bytes": 62446,
              "source_files_sampled": 29,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "HTML without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "HTML"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/29 source files over 60KB",
                "points": 51.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 29,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "example",
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "example, examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example, examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T09:18:20.318936Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/asciidoctor/asciidoctor-reveal.js.svg",
  "full_name": "asciidoctor/asciidoctor-reveal.js",
  "license_state": "custom",
  "license_spdx": null
}

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 agregadasnpm, RubyGems.