Public record
Software health reportschema 0.27.0 · metrics 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 · RubyCustom license★ 313 stars⑂ 185 forkssince Oct 2014View on GitHub ↗

asciidoctor/asciidoctor-reveal.js holds a health index of 71 out of 100, placing it in the Good band. It scores highest on Engineering Quality (90/100) and lowest on AI Readiness (48/100). It was last updated today. A single contributor accounts for most of its recent work.

71
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

71
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

AsciidoctorOrganization
466 followers83 public repossince Dec 2012

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npm@asciidoctor/reveal.js5.2.05,16211603 days agoasciidocasciidoctoropaljavascriptlibrarybackendtemplatereveal.js
RubyGemsasciidoctor-revealjs5.2.0-260 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

70Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
2.8/36Commit cadence — 4/52 weeks with commits
16.7/18Commit volume — 71 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 19 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year71
human_commit_share0.96
days_since_last_push0
active_weeks_last_year4
How it's scored
27/27Ships releases — 22 releases published
36/36Release recency — latest release 0 days ago
12.6/27Release cadence — a release every ~264.9 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count22
latest_release_tagv6.0.0-beta.2
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases264.9

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

62Moderate · 18% of overall
How it's scored
40.5/60Stars — 313 stars
18.9/25Forks — 185 forks
6/15Watchers — 13 watchers
Inputs used
forks185
stars313
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
16.9/22.5License — license file present, not a recognized license
0/18CONTRIBUTING guide
13.5/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductyes
has_pull_request_templateno
How it's scored
49.5/80Monthly downloads — 5,162 downloads/month across npm, rubygems
0/20Registry dependents — not reported by this ecosystem
Inputs used
packages@asciidoctor/reveal.js, asciidoctor-revealjs
dependents
ecosystemsnpm, rubygems
total_downloads293,858
monthly_downloads5,162
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

71Good · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
8.9/22.5Commit distribution — top contributor authored 60% of commits
13.5/13.5Contributor breadth — 42 contributors
10/10OpenSSF Scorecard: Contributors — project has 30 contributing companies or organizations
Inputs used
bus_factor1
contributors_sampled42
top_contributor_share0.605
How it's scored
46.6/46.8Issue resolution — 100% of issues closed
34.3/38.3PR acceptance — 292/326 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs292
open_issues1
closed_issues273
issue_closed_ratio0.996
closed_unmerged_prs34
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
19.2/25Owner reach — 466 followers of asciidoctor
25/25Track record — 83 public repos, account ~13 yr old
Inputs used
followers466
owner_typeOrganization
is_verified
owner_loginasciidoctor
public_repos83
account_age_days4,962
How it's scored
25/25Published & resolvable — 2 package(s) on npm, rubygems
35/35Publish recency — latest publish 0 days ago
20/20Version history — 26 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packages@asciidoctor/reveal.js, asciidoctor-revealjs
ecosystemsnpm, rubygems
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

90Excellent · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
16/16Linter config — .rubocop.yml
0/9.6Pre-commit hooks
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
Inputs used
has_ciyes
has_testsyes
has_editorconfigyes
has_linter_configyes
has_precommit_configno

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — http://asciidoctor.org
10/10Repository description
10/10Topics — 7 topics
0/10Wiki
Inputs used
topicsasciidoc, reveal-js, asciidoctor, slides, slideshow, presentations, hacktoberfest
has_wikino
homepagehttp://asciidoctor.org
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

58Moderate · 16% of overall
How it's scored
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.5License — 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 — no data
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
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.8
Excluded from scoring (no data or not applicable): packaging. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages18
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
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.

AI Readiness

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.

48At risk · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 84 of 96 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.875
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — .rubocop.yml
0/11Static type checking
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 28 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0.28
toolchain_manifests
dependency_bot_commit_share0
How it's scored
0/45Type-checkable code — HTML without a type-check config
51.2/55Manageable file sizes — 2/29 source files over 60KB
Inputs used
primary_languageHTML
largest_source_bytes62,446
source_files_sampled29
oversized_source_files2
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — example, examples
Inputs used
example_dirsexample, examples
has_mcp_signalno
api_schema_files

Key facts

313GitHub stars
42contributors
71commits, last 12 months
0days since last push
22releases
1bus factor
1open issues
npm, RubyGemspackage ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 185 ⇿
0Stars
185Forks
20Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0408012016020018432014-102019-112024-11
Major 4Minor 4Patch 10

Each point covers 10 days.

OpenSSF Scorecard 4.8 / 10
4.8aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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/aPackagingpackaging 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
Direct dependencies 4
RegistryPackageVersion constraintManifest
RubyGemscolorizeGemfile
RubyGemsrougeGemfile
RubyGemsslim~> 3.0.6Gemfile
npmreveal.js6.0.1package.json
All dependencies 50

Full resolved dependency set from the GitHub dependency graph: 4 direct and 46 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
npmreveal.js6.0.1direct
RubyGemscolorizedirect
RubyGemsrougedirect
RubyGemsslimdirect
npm@asciidoctor/core4.0.6indirect
npm@esbuild/aix-ppc640.28.0indirect
npm@esbuild/android-arm0.28.0indirect
npm@esbuild/android-arm640.28.0indirect
npm@esbuild/android-x640.28.0indirect
npm@esbuild/darwin-arm640.28.0indirect
npm@esbuild/darwin-x640.28.0indirect
npm@esbuild/freebsd-arm640.28.0indirect
npm@esbuild/freebsd-x640.28.0indirect
npm@esbuild/linux-arm0.28.0indirect
npm@esbuild/linux-arm640.28.0indirect
npm@esbuild/linux-ia320.28.0indirect
npm@esbuild/linux-loong640.28.0indirect
npm@esbuild/linux-mips64el0.28.0indirect
npm@esbuild/linux-ppc640.28.0indirect
npm@esbuild/linux-riscv640.28.0indirect
npm@esbuild/linux-s390x0.28.0indirect
npm@esbuild/linux-x640.28.0indirect
npm@esbuild/netbsd-arm640.28.0indirect
npm@esbuild/netbsd-x640.28.0indirect
npm@esbuild/openbsd-arm640.28.0indirect
npm@esbuild/openbsd-x640.28.0indirect
npm@esbuild/openharmony-arm640.28.0indirect
npm@esbuild/sunos-x640.28.0indirect
npm@esbuild/win32-arm640.28.0indirect
npm@esbuild/win32-ia320.28.0indirect
npm@esbuild/win32-x640.28.0indirect
npm@fortawesome/fontawesome-free6.7.2indirect
npmasciidoc-converter-testkit-cli0.1.4indirect
npmasciidoc-converter-testkit-core0.1.4indirect
npmasciidoctor4.0.6indirect
npmcommander9.5.0indirect
npmentities8.0.0indirect
npmesbuild0.28.0indirect
npmparse58.0.1indirect
npmpostject1.0.0-alpha.6indirect
RubyGemsasciidoctorindirect
RubyGemsirbindirect
RubyGemsminitestindirect
RubyGemspryindirect
RubyGemspry-byebugindirect
RubyGemspygments.rbindirect
RubyGemsrakeindirect
RubyGemsrubocopindirect
RubyGemsrubocop-minitestindirect
RubyGemsrubocop-rakeindirect
Dependency advisories 0

Installing npm:@asciidoctor/reveal.js@5.2.0 pulls in 18 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "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
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm, RubyGems.