Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-23 00:41 UTC

acesuares / validation_hints

Hints for validation

RubyMIT★ 1 Stern⑂ 0 Forksseit Juli 2012Auf GitHub ansehen ↗

acesuares/validation_hints erreicht einen Gesundheitsindex von 48 von 100 und liegt damit im Bereich Gefährdet. Am stärksten schneidet es bei Vitality (75/100) ab, am schwächsten bei Community & Adoption (33/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

48
gesamt / 100
Gefährdet

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

48
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Ace SuaresPersönliches Konto
33 Follower48 öffentliche Reposseit März 2008Suares & Co

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
RubyGemsvalidation_hints8.1.43-57vor 0 Tagen

Metriken nach Kategorie

Vitalität

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

75Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
4.2/36Commit-Rhythmus — 6/52 Wochen mit Commits
17.2/18Commit-Volumen — 81 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year81
human_commit_share1
days_since_last_push0
active_weeks_last_year6
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 56 Versions-Tags (keine GitHub-Releases)
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 6,2 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count56
latest_release_tagv8.1.43
releases_from_tagsja
days_since_latest_release0
mean_days_between_releases6,2
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

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

33Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 1 Stars
0/25Forks — 0 Forks
0/15Watcher — 2 Watcher
Verwendete Eingangsdaten
forks0
stars1
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
49.2/80Downloads gesamt — 54.068 Downloads insgesamt über rubygems
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesvalidation_hints
dependents
ecosystemsrubygems
total_downloads54.068
monthly_downloads
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

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

38Gefährdet · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
0/38.3PR-Annahme — keine entschiedenen Pull Requests oder keine Daten
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote, PR-Annahme. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
11/25Reichweite des Inhabers — 33 Follower von acesuares
24.3/25Kontohistorie — 48 öffentliche Repos, Kontoalter ca. 18 Jahre
Verwendete Eingangsdaten
followers33
owner_typeUser
is_verified
owner_loginacesuares
public_repos48
account_age_days6.707
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf rubygems
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 57 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesvalidation_hints
ecosystemsrubygems
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

50Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
0/24CI-Workflows
24/24Tests vorhanden
16/16Linter-Konfiguration — .rubocop.yml
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cinein
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

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

38Gefährdet · 16 % des Gesamtindex

Sicherheitslage

38Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — keine Daten
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
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — keine Daten
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — keine Daten
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — keine Daten
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate3,8
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

42Gefährdet · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
27.7/40Lesbare Commit-Historie — 52 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,52
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — .rubocop.yml
0/11Statische Typprüfung
0/10Reproduzierbare Umgebung
10/10Belegte Agentenpraxis — 77 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,77
toolchain_manifests
dependency_bot_commit_share0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Pinned-Dependencies. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Ruby ohne Typprüfungs-Konfiguration
55/55Handhabbare Dateigrößen — 0/9 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageRuby
largest_source_bytes9.940
source_files_sampled9
oversized_source_files0

Eckdaten

1GitHub-Sterne
1Mitwirkende
81Commits, letzte 12 Monate
0Tage seit letztem Push
56Releases
1Bus-Faktor
0offene Issues
RubyGemsPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

OpenSSF Scorecard 3.8 / 10
3.8Gesamtwert

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
k. A.CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
k. A.Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
k. A.Pinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
k. A.Token-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Alle Abhängigkeiten 7

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

RegistryPaketVersionBeziehung
RubyGemsactivemodelindirekt
RubyGemsactiverecordindirekt
RubyGemsbundlerindirekt
RubyGemsminitestindirekt
RubyGemsrakeindirekt
RubyGemsrubocop-rails-omakaseindirekt
RubyGemssqlite3indirekt
Abhängigkeits-Advisories nicht bewertet

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

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 171,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Ruby": 23221
      },
      "pushed_at": "2026-07-22T23:33:15Z",
      "created_at": "2012-07-18T01:07:57Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T23:33:17Z",
      "description": "Hints for validation",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Ruby",
      "significant_languages": [
        "Ruby"
      ]
    },
    "owner": {
      "blog": "http://opencuracao.com",
      "name": "Ace Suares",
      "type": "User",
      "login": "acesuares",
      "company": "Suares & Co",
      "location": "Willemstad, Netherlands Antilles",
      "followers": 33,
      "avatar_url": "https://avatars.githubusercontent.com/u/2784?v=4",
      "created_at": "2008-03-11T01:33:20Z",
      "is_verified": null,
      "public_repos": 48,
      "account_age_days": 6707
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v8.1.43",
          "kind": "patch",
          "published_at": "2026-07-22T23:31:52Z"
        },
        {
          "tag": "v8.1.42",
          "kind": "patch",
          "published_at": "2026-07-21T11:56:32Z"
        },
        {
          "tag": "v8.1.21",
          "kind": "patch",
          "published_at": "2026-06-03T10:35:16Z"
        },
        {
          "tag": "v8.1.20",
          "kind": "patch",
          "published_at": "2026-05-29T21:25:47Z"
        },
        {
          "tag": "v8.1.19",
          "kind": "patch",
          "published_at": "2026-05-29T01:39:20Z"
        },
        {
          "tag": "v8.1.18",
          "kind": "patch",
          "published_at": "2026-05-28T23:54:18Z"
        },
        {
          "tag": "v8.1.17",
          "kind": "patch",
          "published_at": "2026-05-28T22:57:49Z"
        },
        {
          "tag": "v8.1.16",
          "kind": "patch",
          "published_at": "2026-05-28T22:33:39Z"
        },
        {
          "tag": "v8.1.11",
          "kind": "patch",
          "published_at": "2026-05-28T18:41:25Z"
        },
        {
          "tag": "v8.1.10",
          "kind": "patch",
          "published_at": "2026-05-28T00:49:54Z"
        },
        {
          "tag": "v8.1.9",
          "kind": "patch",
          "published_at": "2026-05-27T22:45:30Z"
        },
        {
          "tag": "v8.1.8",
          "kind": "patch",
          "published_at": "2026-05-27T20:24:09Z"
        },
        {
          "tag": "v8.1.6",
          "kind": "patch",
          "published_at": "2026-05-27T14:37:49Z"
        },
        {
          "tag": "v8.1.5",
          "kind": "patch",
          "published_at": "2026-05-27T11:14:56Z"
        },
        {
          "tag": "v8.1.4",
          "kind": "patch",
          "published_at": "2026-05-26T22:21:50Z"
        },
        {
          "tag": "v8.1.3",
          "kind": "patch",
          "published_at": "2026-05-26T22:03:42Z"
        },
        {
          "tag": "v8.1.2",
          "kind": "patch",
          "published_at": "2026-05-26T21:24:55Z"
        },
        {
          "tag": "v8.1.1",
          "kind": "patch",
          "published_at": "2026-05-26T15:16:28Z"
        },
        {
          "tag": "v8.1.0",
          "kind": "minor",
          "published_at": "2026-05-26T00:50:30Z"
        },
        {
          "tag": "v8.0.4",
          "kind": "patch",
          "published_at": "2026-05-24T19:06:08Z"
        },
        {
          "tag": "v8.0.3",
          "kind": "patch",
          "published_at": "2026-05-22T22:37:16Z"
        },
        {
          "tag": "v8.0.2",
          "kind": "patch",
          "published_at": "2026-05-22T21:47:35Z"
        },
        {
          "tag": "v8.0.1",
          "kind": "patch",
          "published_at": "2026-05-22T20:25:10Z"
        },
        {
          "tag": "v8.0.0",
          "kind": "major",
          "published_at": "2026-05-22T20:21:23Z"
        },
        {
          "tag": "v7.13.18",
          "kind": "patch",
          "published_at": "2026-05-22T16:44:26Z"
        },
        {
          "tag": "v7.13.17",
          "kind": "patch",
          "published_at": "2026-05-21T23:54:34Z"
        },
        {
          "tag": "v7.13.16",
          "kind": "patch",
          "published_at": "2026-05-21T23:32:33Z"
        },
        {
          "tag": "v7.13.15",
          "kind": "patch",
          "published_at": "2026-05-21T23:10:10Z"
        },
        {
          "tag": "v7.13.14",
          "kind": "patch",
          "published_at": "2026-05-21T12:45:51Z"
        },
        {
          "tag": "v7.13.13",
          "kind": "patch",
          "published_at": "2026-05-21T10:26:48Z"
        },
        {
          "tag": "v7.13.12",
          "kind": "patch",
          "published_at": "2026-05-21T01:57:23Z"
        },
        {
          "tag": "v7.13.11",
          "kind": "patch",
          "published_at": "2026-05-21T00:41:36Z"
        },
        {
          "tag": "v7.13.4",
          "kind": "patch",
          "published_at": "2026-05-19T21:47:25Z"
        },
        {
          "tag": "v7.13.3",
          "kind": "patch",
          "published_at": "2026-05-19T21:29:06Z"
        },
        {
          "tag": "v7.13.1",
          "kind": "patch",
          "published_at": "2026-05-19T20:56:17Z"
        },
        {
          "tag": "v7.0.0",
          "kind": "major",
          "published_at": "2026-05-19T16:35:44Z"
        },
        {
          "tag": "v6.4.0",
          "kind": "minor",
          "published_at": "2026-05-19T01:18:08Z"
        },
        {
          "tag": "v6.2.1",
          "kind": "patch",
          "published_at": "2026-05-17T19:30:00Z"
        },
        {
          "tag": "v6.2.0",
          "kind": "minor",
          "published_at": "2026-05-17T19:15:06Z"
        },
        {
          "tag": "v6.1.0",
          "kind": "minor",
          "published_at": "2026-05-17T17:05:13Z"
        },
        {
          "tag": "v6.0.0",
          "kind": "major",
          "published_at": "2026-05-17T16:57:00Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2023-03-28T17:06:17Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2023-03-28T16:39:26Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2015-05-30T21:44:08Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2012-07-21T23:45:32Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2012-07-21T19:09:57Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2012-07-21T19:07:07Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2012-07-21T16:35:43Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2012-07-19T19:22:51Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2012-07-19T15:56:29Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2012-07-19T10:11:48Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2012-07-18T17:59:00Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2012-07-18T11:10:05Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2012-07-18T02:00:47Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2012-07-18T01:45:02Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2012-07-18T01:28:18Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "76c328587d1a2ff2b57804a63d1b2d2c661c1995",
          "body": "Companion version bump; no code changes. Keeps validation_hints in\nlockstep with the inline_forms 8.1.43 release.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump to 8.1.43 (lockstep with inline_forms 8.1.43)",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-22T23:31:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d138228785198ee154031f42c1271c3eb2681652",
          "body": "Override Bundler's stock `release` so its git-push step always targets\norigin (GitHub). Stock bundler pushes to branch.<branch>.remote, which\nwould send the release to forgejo (CI-only) if released from a branch\nthat tracks it. Mirrors the guard added to inline_forms.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release: force git-push to origin, never the branch tracking remote",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-22T23:21:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3251bd9537555e8748bfe441c8b7738dd0c60ff3",
          "body": "stuff/ is ignored globally via ~/.config/git/ignore, so the per-repo\nentry is unnecessary.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop redundant stuff/ ignore; now covered by global git excludes",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-21T11:56:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "debbcf5c1ae86e5d00ea5af94969d25641edf04e",
          "body": "…cator CSS fix; no changes of its own).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.42: lockstep with inline_forms 8.1.42 (native picker-indi…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T19:10:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d971564a75b353389b738a9a9b001fc8b4f96b2a",
          "body": "… hardening; no changes of its own).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.41: lockstep with inline_forms 8.1.41 (inline_forms_addto…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-11T09:27:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "15aea073e7464c51660f1e89fb0bec41693466ae",
          "body": "…(same fix as inline_forms; feature branches were silently skipped).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "CI: run the test workflow on pushes to every branch, not just master …",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-10T18:28:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "44291d43270b7e8887d73f23c5d8fdd96f4b4f37",
          "body": "…g-in-nesting demo; no changes of its own).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.40: lockstep with inline_forms 8.1.40 (example-app nestin…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-10T16:04:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f73144d7c0b09fb59af1ebea6a3599ae0360485d",
          "body": "… no changes of its own).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.39: lockstep with inline_forms 8.1.39 (open after create;…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-10T13:06:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a06747bb5bc6d6f7a23c07323d53b205fabfbf5",
          "body": "…own).",
          "is_bot": false,
          "headline": "Release 8.1.38: lockstep with inline_forms 8.1.38 (no changes of its …",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-07T05:43:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63409758e834ae7f8acc5fab47ba74090e3a4431",
          "body": "…es autocorrected (style-only), baseline file deleted.",
          "is_bot": false,
          "headline": "Release 8.1.37: RuboCop todo eliminated — all 22 grandfathered offens…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T20:50:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44766cd04d4fa301cabb293947b5f31dd20b3b26",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.36: lockstep with inline_forms 8.1.36 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T18:03:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "795e393e96aa3d0936895aa3815fcfa883d7b56e",
          "body": "…obbered it; CI run 2 saw all 22 offenses).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Restore the generated .rubocop_todo.yml (a stale placeholder write cl…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T17:26:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b8220e5a1d9ab0022dd794e5c57b7d2031190884",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.35: lockstep with inline_forms 8.1.35 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T17:23:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec38112f12ae2a36eeda5d960d970cbc2f1a959c",
          "body": "…ep with inline_forms 8.1.34.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.34: Forgejo Actions CI + RuboCop omakase baseline; lockst…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T14:23:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b6eb18162d01dd7dadf8195abbbf30d5452921d3",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.33: lockstep with inline_forms 8.1.33 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T13:11:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "00dbb8b130618219312855184c451c40be766e53",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.32: lockstep with inline_forms 8.1.32 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T13:06:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a6ec55421c0f395c555b3e259907b1a80cd86681",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.31: lockstep with inline_forms 8.1.31 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:58:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "db58af7ed5504df2d4430f5ff9333e4aa8d2f58e",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.30: lockstep with inline_forms 8.1.30 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:53:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8f983cad6f6e9a2f20a418d2e00af7f78f0eee3e",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.29: lockstep with inline_forms 8.1.29 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:49:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4a6f8aa6c04424b474dd1c21ea160ad47211bf2c",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.28: lockstep with inline_forms 8.1.28 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:39:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b21437b1cbca8f53d52e1c654d4a1580d773425d",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.27: lockstep with inline_forms 8.1.27 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:31:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "25ea92cb2f992de7bcc5b2d3979a6b6f22932275",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.26: lockstep with inline_forms 8.1.26 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:15:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f453ce1e5ee427ea6f1f60b55c8316457a133b83",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.25: lockstep with inline_forms 8.1.25 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T12:06:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e65a8884291304d8395e5a8419049f1f8ca80464",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.24: lockstep with inline_forms 8.1.24 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T11:58:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6fd0dadf5ef52d99c76d07771856bd1bd084cb51",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.23: lockstep with inline_forms 8.1.23 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T11:44:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "775ca2e42629aa11a7436401ad237dff64dd0f6f",
          "body": "…s the 8.1 line.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.22: lockstep with inline_forms 8.1.22; version test track…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-07-06T11:36:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd4a4988b665d3ced657e83e6494a0a0de9026c4",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.21: lockstep with inline_forms 8.1.21 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-06-03T10:35:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "960f02a8e39c5d9480c1e95b952f74ef0e12f5c6",
          "body": "…\" hint.\n\nPreviously a bare `validates :foo, numericality: true` emitted ZERO hints:\n`numericality` is in VALIDATORS_WITHOUT_MAIN_KEYS, so the computed\n`numericality.must_be_a_number` base key was skipped by the guard, and a\nbare validator has no option-specific keys. Always emit the base\n\"must be a\n[…]\nption/range messages\nappended. Add a `hints.messages.money` key (\"must be a valid amount\") so\nmoney-rails' MoneyValidator surfaces a usable label hint.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.20: bare numericality: true now emits a \"must be a number…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-29T21:25:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "72c48e1984211c534922eb8fa830920fcbc52675",
          "body": "Companion version bump: inline_forms 8.1.19 fixes the inline attribute\nupdate action so a failed save re-renders the edit field with errors\ninstead of a fake field_show, and keeps malformed money_field input\nvisible. No changes to validation_hints behavior or API.",
          "is_bot": false,
          "headline": "Release 8.1.19: lockstep with inline_forms 8.1.19 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-29T01:39:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91f1c32ff3e8172c50e703a8ea26bec67916df3d",
          "body": "Companion release for inline_forms / inline_forms_installer 8.1.18: RVM is now\noptional in the installer (bare .ruby-version for non-RVM managers, no runtime\nrvm gem dependency) and FormElementShowcasesController#revert no longer raises\nPsych::DisallowedClass for ActiveRecord::Type::Time::Value from date/time\n_select columns. No changes to validation_hints itself.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.18: lockstep with inline_forms 8.1.18 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T23:54:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "30103f6ad378db94a26a96945518704c8001fb0d",
          "body": "Companion release for the primary-record upsert on revert (restoring a\ndestroy version while the row still exists no longer raises RecordNotUnique\non photos.id). No API changes in validation_hints.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.17: lockstep version bump with inline_forms.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T22:57:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a47881f76c14341de2ee409a0dab6b5c8de9d57",
          "body": "Companion version bump; no validation_hints API changes.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.16: lockstep with inline_forms undo fixes.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T22:33:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33c7f3425c88583718cca6cc6a6f74ca576f9981",
          "body": "inline_forms 8.1.11 ships an installer-only release: dev_checkout_with_gems\nand install_prerelease_gems_from_roots! now look in pkg/ as well as the\ncheckout root (so `rake build` output is no longer invisible to the\ninstaller's prerelease gem picker, which silently caused 8.1.10 to use\n8.1.6 templat\n[…]\nhe gate from being\nOOM-killed by systemd-oomd on memory-modest hosts. validation_hints\nhas no behavior change; this is a version-only lockstep release.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.11: lockstep with inline_forms 8.1.11 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T18:41:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6a2369bc0e5dbdcd2c880cd237b9073008337d9f",
          "body": "inline_forms 8.1.10 ships the :decimal_field upgrade — the helper now\nmaps to a real decimal(p, s) column with default precision: 10, scale:\n2, supports name:decimal_field{p,s} on the CLI to override (mirroring\nRails' built-in name:decimal{p,s}), and the FormElementShowcase\ndemos both shapes with pr\n[…]\n picked up stale\nbuilds once minor versions crossed a digit boundary. validation_hints\nhas no behavior change; this is a version-only lockstep release.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.10: lockstep with inline_forms 8.1.10 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-28T00:49:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e0fff988734b639ca03e78e842450c093b82aeb",
          "body": "inline_forms 8.1.9 ships the dropdown_with_values double-translation\nfix, `money_field_show` always-show-cents fix, the FormElementShowcase\nswap from `roles:info_list` to `locales:check_list +\nlocales_display:info_list` (with four seeded locales and populated\nfile/audio/cover uploads), and a new locales-associations integration\ntest. validation_hints has no behavior change; this is a version-only\nlockstep release.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.9: lockstep with inline_forms 8.1.9 (no API changes).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T22:45:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0f8a62081106ddb20b3ee57687430e6fa23bee9",
          "body": "inline_forms 8.1.8 re-introduces `money_field`, `scale_with_integers` and\n`scale_with_values` to the FormElementShowcase example resource (the\n2 scale helpers are repaired in 8.1.7; `money_field` now has money-rails\nwired into the installer Gemfile with `monetize :amount_cents` on the\nshowcase model\n[…]\ne placeholder to `money_field_show`.\nNo API changes in validation_hints; version moves 8.1.7 → 8.1.8 to stay\nin lockstep with the inline_forms release.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.8: align with inline_forms 8.1.8 showcase re-additions.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T20:24:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6b4f147ce83c8d2cd9367f4e4b4ed356fdd68a2",
          "body": "inline_forms 8.1.7 fixes three crashing `_show` helpers\n(`dropdown_with_integers`, `scale_with_integers`, `scale_with_values` —\nall used Array#[N] against the [[key,label]] pairs returned by\n`attribute_values` and now use Array#assoc), the `Versions (N)` header\nflicker between closed and open states\n[…]\nlines in\n`month_year_picker_update`. No API changes in validation_hints; version\nmoves 8.1.6 → 8.1.7 to stay in lockstep with the inline_forms release.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.7: align with inline_forms 8.1.7 helper/UI fixes.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T18:50:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "591f06b01fcf622353d387327dda2bf1004dc897",
          "body": "Version bump to keep validation_hints in lockstep with\ninline_forms / inline_forms_installer 8.1.6\n(FormElementShowcase example resource + first field-level\nvalidation in the example app). No API changes in\nvalidation_hints.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.6: lockstep companion release.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T14:37:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "368ec1c4772c177711fc74fc6653ebbb3afd2934",
          "body": "Aligned with inline_forms / inline_forms_installer 8.1.5. No API changes\nin validation_hints; lockstep bump for inline_forms's hard-breaking\ninline_forms_attribute_list row-shape change.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.5: lockstep companion release.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-27T11:14:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f8af0563c03e72bdad7d3aa2788c66b2e52bfe52",
          "body": "Companion bump for inline_forms / inline_forms_installer 8.1.4\n(installer user-model now ships inline_forms_search; generator\nMODEL_TABS injection now actually populates the top-bar dropdown).\nNo API or dependency changes here; full suite green (24 runs,\n50 assertions, 0 failures) on AR 8.1.3.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.4 (lockstep with inline_forms).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T22:21:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f9720c08546a8032a214e64b56b09bafb2a7861e",
          "body": "Companion bump for the inline_forms / inline_forms_installer 8.1.3\nrelease (PaperTrail 17.0 in generated apps + `-U` collision check\nin `inline_forms create`). No API or dependency changes here; full\nsuite green (24 runs, 50 assertions, 0 failures) on AR 8.1.3.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.3 (lockstep with inline_forms).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T22:03:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4d9c610397bb5bb1f9f251f926db9f080cd55429",
          "body": "- gemspec: activerecord/activemodel pin moves from `>= 8.0, < 8.1` to\n  `>= 8.1, < 8.2`; Bundler now resolves Active Record / Active Model 8.1.3.\n- README: requirements line updated to Rails / Active Record 8.1.x\n  (`>= 8.1, < 8.2`).\n- Test: `test_version` now asserts `8.1.2`.\n- Lockfile refreshed (\n[…]\nges — the `ActiveModel::Validations` patches and\n`ActiveModel::Hints` ride along unchanged.\n\nLockstep with inline_forms / inline_forms_installer 8.1.2.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.2 — migrate to Rails 8.1.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T21:24:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "77db52828969ed108ca88b230edc066329fffebd",
          "body": "Companion release for `rails g inline_forms_addto`. No API changes in\nvalidation_hints; version bump only to keep the\ninline_forms / inline_forms_installer / validation_hints triple in\nlockstep (8.0.3, 8.0.4, 8.1.0, 8.1.1).\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.1 (lockstep with inline_forms).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T15:16:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "22f1fe493bb2d3408b78367ac8bd21d76f75cfc8",
          "body": "No API changes; version bumped to stay aligned with\ninline_forms / inline_forms_installer 8.1.0.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.1.0 (lockstep with inline_forms).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-26T00:50:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "73322a6d3d33a4cff84c3c11db8627d1e701b01d",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Update Gemfile.lock for 8.0.4.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-24T19:06:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "55ef86eb00afdcc3241768ff32511187edbc58df",
          "body": "Companion version bump; no API changes.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.0.4 (lockstep with inline_forms).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-24T19:06:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "214c4858ee05e2ec73bb4c5846c20de02eae9a0a",
          "body": "Point checklist at inline_forms release docs; record 8.0.3 gate in CHANGELOG.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Phase 5: archive Rails 8 checklist as complete.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T23:44:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ffccbcc044fa7eacfe1b4e238252792715b17510",
          "body": "No API changes; version aligned with inline_forms 8.0.3.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.0.3: companion version for inline_forms Phase 4.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T22:37:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7884cb74124d004309990cf931eeea1cee3bc6dc",
          "body": "No API changes; version aligned with inline_forms 8.0.2.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.0.2: companion version for inline_forms Phase 3.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T21:47:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c640082f8d68be13b610d3ebaafe1d676198bd3a",
          "body": "Require activerecord >= 8.0, < 8.1; dev sqlite3 >= 2.1. README and\nCHANGELOG updated; tests and smoke_test pass on AR 8.0.5.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Phase 1: validation_hints on Active Record 8.0 (8.0.1).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T20:25:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8702a2e81e81311d981af3b0b1495a10e1a990fc",
          "body": "Opens the 8.x release line; Rails/Active Record constraints remain 7.2.x\nuntil the Rails 8 migration completes.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 8.0.0 (version sync with inline_forms).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T20:21:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52a5950b54cd35bbbcd25318081de0c2264ee157",
          "body": "Companion release; no API changes.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.18 (version sync with inline_forms).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-22T16:44:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c23ef9b4c55a7a68f2055e27de2a4bb77186b28a",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Align version with inline_forms 7.13.17 (companion release).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T23:54:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2e4d6faf02949ce6c73d94a7ddb57110822db0fb",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Align version with inline_forms 7.13.16 (companion release).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T23:32:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c29a624276e2aaf7a313444bfb7a0eeb570bcaba",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Align version with inline_forms 7.13.15 (companion release).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T23:10:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e9cde4824f4e3cb63ca978b0842119165e8d97c6",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Align version with inline_forms 7.13.14 (companion release).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T12:45:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c78111d011b43e4db613424ae76accd7ef607b55",
          "body": "…ote.\n\nCompanion release; Phase 4 Dart Sass deprecation tracking for installer logs.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.13: lockstep with inline_forms; Rails 8 Sass checklist n…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T10:26:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8afc24a5ad5e73ad76c0476d1856ab1c782bb05d",
          "body": "…nstaller.\n\nCompanion lockstep release; rake release no longer requires dev bundle at load.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.12: version alignment with inline_forms / inline_forms_i…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T01:57:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5094fcc968a769635eb4ed4188a750f42787911d",
          "body": "Load bundler/setup only for rake test (via test:bundle), not at Rakefile\nload time, so release no longer requires sqlite3 in the gemset.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Fix rake release without a full bundle install.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T00:41:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a41c59f9917bb8a0a0b4351e6cda5d65f8472657",
          "body": "…nstaller.\n\nCompanion lockstep release.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.11: version alignment with inline_forms / inline_forms_i…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T00:36:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8f8475e60d42290e9ac65b29d7703b2f2578e2ba",
          "body": "…nstaller.\n\nCompanion lockstep release; generated apps pin validation_hints '~> 7'.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.10: version alignment with inline_forms / inline_forms_i…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T00:32:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb3bde4937c27f13a9d83a215a5acbd742b6120f",
          "body": "…staller.\n\nCompanion lockstep release; no API changes.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.9: version alignment with inline_forms / inline_forms_in…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-21T00:27:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c7a6b4dd4d48aae2b0875512c31957543ee7e2ba",
          "body": "…staller.\n\nCompanion to the inline_forms 7.13.4 rich_text-create Restore symmetry\nfix. No API changes in this gem; bumps:\n- `lib/validation_hints/version.rb` -> 7.13.4\n- `test/validation_hints_test.rb` -> assertion updated\n- `Gemfile.lock` -> resolved to local 7.13.4 build\n- `CHANGELOG.md` -> 7.13.4\n[…]\nrms create MyApp -d sqlite --example` (Gemfile resolves to\nvalidation_hints 7.13.4) -> `bundle exec rails test` -- 83 runs, 461\nassertions, 0 failures.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.4: version alignment with inline_forms / inline_forms_in…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T21:47:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e42e1cba3a36c9e8f6cdf195d22cefdc0ec64e2",
          "body": "…staller.\n\nKeeps the three repo gems in lockstep after the inline_forms 7.13.3\nPaperTrail `:touch` / Restore-on-create cleanup. Skips 7.13.2 (which was\nnever published from this repo) so all three gems share the same version\nstring.\n\nNo API changes in this gem; bumps:\n- `lib/validation_hints/version\n[…]\n against the generated example app:\n`inline_forms create MyApp -d sqlite --example` -> `bundle exec rails test`\n-- 81 runs, 447 assertions, 0 failures.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.3: version alignment with inline_forms / inline_forms_in…",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T21:29:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "882c1ec8923568d9b610486613adf420c6cf7d8c",
          "body": null,
          "is_bot": false,
          "headline": "commit gemfile.lock",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T20:56:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "101049ef393616d1fe2ee463cd310812c23e420d",
          "body": "No API changes in this gem.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.1: version alignment with inline_forms puma fix.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T20:02:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cc5d08d8f6269029c4a8bbab2a4c218e27088717",
          "body": "No API changes; keeps validation_hints on the same minor version as inline_forms and inline_forms_installer.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.13.0: version alignment with inline_forms Track B.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T19:38:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a3a1a7e3d238e68fcce314f47f1d3ad091b3ed21",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.12.0: Rails 7.2, Ruby 4.0, version aligned with inline_forms.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T19:18:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "baa0205033d0c933e3f7d35b4bcf870c368ed6f5",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Update Gemfile.lock for validation_hints 7.0.0.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T16:35:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c6d53b58f960451e40150188a3ffb8bfc3ebf786",
          "body": "No API changes since 6.4.0. Consumers (inline_forms) must widen the\ndependency constraint to accept 7.x.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 7.0.0: major version bump for Rails 7.1 line.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T16:33:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4c27b3257e845655d8126b32b5bc3836507c454b",
          "body": "Emit format hints, support EachValidator I18n keys, skip class validators without attributes, and document conditional/validates_with behavior.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Format and custom validator hints; validates_with safe (Phase 6).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T01:18:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cddf022ded2cdbeb1b099f07feb74dec8120edeb",
          "body": "Coordinate with inline_forms 7.10.x: activerecord >= 7.1.5, bundler-audit docs, and verified test suite on Rails 7.1.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Rails 7.1 runtime and slim dev deps (Phase 5).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T01:14:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8ae4323caf2f199fe46a6ef266345cf88b7db279",
          "body": "Add stuff/smoke_test.sh for rake + console smoke on in-memory SQLite.\nRewrite stuff/analysis.md for 6.2.x and inline_forms 7.9.x Tippy integration.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 6.2.3: Phase 3 gem hygiene (analysis, smoke test).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T00:56:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "997ad023af7c36dfdac82cbebdee3ab8ee85b932",
          "body": "Add confirmation validator and custom message-as-Symbol test coverage.\nFix generate_message to strip :message before I18n lookup for symbol keys.\nExpand README with inline_forms notes and rake test instructions.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 6.2.2: Phase 2 tests and docs for inline_forms integration.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-19T00:53:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "385474c24f08aefdc3ed46cb2281fc21f096cc46",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Update Gemfile.lock for validation_hints 6.2.1.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-17T19:30:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5246d4ac08fb9d724bcec3358573f3ca1eeb7844",
          "body": "Rails 7 freezes validator option hashes; copying before mutation\navoids RuntimeError when building hints for presence validators.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Release 6.2.1: dup frozen validator options in hints.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-17T19:27:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9cbfd1f5c4d7b419771c6ccfcf251bfcbdb56ca4",
          "body": "Mirror activerecord/activemodel hints scopes, improve full_message\nformat resolution, and document locale overrides in the README.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Add I18n lookup chain and docs for 6.2.0 (Phase 2).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-17T19:15:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a37249b133d95a5fdafc38373dd7e8652e6e6775",
          "body": "Co-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Update Gemfile.lock for validation_hints 6.1.0.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-17T17:05:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6d6ac36c4c2a49b0521f72e404f59a7ccbdb417d",
          "body": "Refactor hint generation, locale, and attribute discovery; add Minitest\ncoverage for the inline_forms contract and common validators.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Modernize ActiveModel::Hints for Rails 7 (6.1.0).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-17T17:02:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8f3d2aceaf017c3fa1c1ea7a79174e62b6a69cc",
          "body": "Re-add Bundler::GemHelper.install_tasks alongside the Minitest test task.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Restore rake release and gem packaging tasks.",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-17T16:57:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8e683be51f684dd307a66e34c97e1ba1369cdcc0",
          "body": "Add Railtie, validations patch, Minitest harness, and updated gemspec\nso the gem targets Ruby 3.2+ and Active Record 7.0.x for inline_forms.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Modernize gem for Rails 7 as version 6.0.0 (Phase 0).",
          "author_name": "Ace Suares",
          "author_login": "acesuares",
          "committed_at": "2026-05-17T16:29:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b13b2414fc7f7724d7a790482295e652fde2c4be",
          "body": null,
          "is_bot": false,
          "headline": "options to I18n.translate can not be a hash anymore???",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2023-03-28T17:06:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ca2577c569365bd9e011fe4616900e6aa1b7ae3",
          "body": null,
          "is_bot": false,
          "headline": "options to I18n.translate can not be a hash anymore???",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2023-03-28T16:52:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92f5210128ce8a45b8ac2e90b18f83c60974392e",
          "body": null,
          "is_bot": false,
          "headline": "options to I18n.translate can not be a hash anymore???",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2023-03-28T16:39:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6fde8190b06eb266d78019f48ce1e3fa1a99bfe",
          "body": null,
          "is_bot": false,
          "headline": "bug in to_sentence when Range",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2015-05-30T21:44:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c18e144ab674fe7cb08ac22a653ab43aa7f0b44d",
          "body": "…_for(attribute)",
          "is_bot": false,
          "headline": "added some classmethods like hints_for(attribute) and has_validations…",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-21T23:45:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "480ea7c4e8f15c9fb7306c25edbb4afa48b0ab2c",
          "body": null,
          "is_bot": false,
          "headline": "removed silly dependencies on rvm and thor",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-21T19:09:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "435381ed07e12b32aecd0a18447843cfcb2bf96b",
          "body": null,
          "is_bot": false,
          "headline": "now works with custom validators... sort of",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-21T19:07:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "902187b650e4ba7cdb71600c4d9529abcb97a5ba",
          "body": "…sage is a Symbol, it looks it up in the translation table, else it uses it literally",
          "is_bot": false,
          "headline": "messages specified in the validators are now taken in account. if mes…",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-21T16:35:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba739fa2137e8a1473ddbd4f167becc4b2cc5889",
          "body": null,
          "is_bot": false,
          "headline": "fixed numericality, presence, uniqueness, sort of...",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-20T17:15:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a87cdd3afab91db80569e49a67a4765a905ddb0",
          "body": null,
          "is_bot": false,
          "headline": "fixed inclusion, exclusin, lenght.is and acceptance",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-20T12:16:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cef662095239d9925d83c18e40b2c6c8f719c08a",
          "body": null,
          "is_bot": false,
          "headline": "updated docs",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-19T19:22:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c038eea7bc79e95ca5d43b7df3b4f7a4e3bf7050",
          "body": null,
          "is_bot": false,
          "headline": "hints now initalizes the messages, added the other stuff from errors.rb",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-19T15:56:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b8617c1139025451d6afa89c2fce3057ae79426",
          "body": null,
          "is_bot": false,
          "headline": "hints now initalizes the messages, added the other stuff from errors.rb",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-19T15:56:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10d3b7efee7176b554f75fe2bc9a92a9986c7bdf",
          "body": null,
          "is_bot": false,
          "headline": "some stings added...",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-19T10:11:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f31988228c179f7d486476c24378d9ba13f2e8c5",
          "body": null,
          "is_bot": false,
          "headline": "standard validations coverd...",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-18T19:44:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9a24f7b06bc93d3c23451cfa56a93280f9b60fe",
          "body": null,
          "is_bot": false,
          "headline": "on the way... confusing...",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-18T17:59:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d9ddeaffb1b6b563bd083a4bccdccd6010e60dc",
          "body": null,
          "is_bot": false,
          "headline": "now actually works as part of ActiveModel",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-18T11:10:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35cc7ab40289a29a2b905cb786c4f0b477bf56f6",
          "body": null,
          "is_bot": false,
          "headline": "it gets included and loaded...",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-18T02:00:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83cd5697c8949edc7f1f3423e034b80bd74dd24b",
          "body": null,
          "is_bot": false,
          "headline": "added some stuff",
          "author_name": "Ace Suares",
          "author_login": null,
          "committed_at": "2012-07-18T01:45:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 56,
      "commits_last_year": 81,
      "latest_release_at": "2026-07-22T23:31:52Z",
      "latest_release_tag": "v8.1.43",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 6.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "validation_hints",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/validation_hints",
          "is_deprecated": false,
          "latest_version": "8.1.43",
          "repository_url": "https://github.com/acesuares/validation_hints",
          "versions_count": 57,
          "total_downloads": 54068,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2012-07-18T01:30:16.931000Z",
          "latest_published_at": "2026-07-22T23:33:16.340000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 2,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 9940,
      "source_files_sampled": 9,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Gemfile"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 7,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "rubygems"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "activemodel",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "activerecord",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "bundler",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rake",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rubocop-rails-omakase",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "sqlite3",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 7,
        "direct_count": 0,
        "indirect_count": 7
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "acesuares",
          "commits": 82,
          "avatar_url": "https://avatars.githubusercontent.com/u/2784?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [
        ".rubocop.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "76c328587d1a2ff2b57804a63d1b2d2c661c1995",
        "ran_at": "2026-07-23T00:41:27Z",
        "aggregate_score": 3.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": null,
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/acesuares/validation_hints",
    "host": "github.com",
    "name": "validation_hints",
    "owner": "acesuares"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 48,
      "inputs": {
        "security": 38,
        "vitality": 75,
        "community": 33,
        "governance": 38,
        "engineering": 50
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "commits_last_year": 81,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 6
            },
            "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": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "81 commits in the last year",
                "points": 17.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 81
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 56,
              "latest_release_tag": "v8.1.43",
              "releases_from_tags": true,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 6.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "56 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 56
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~6.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 6.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 33,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "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": [
                "validation_hints"
              ],
              "dependents": null,
              "ecosystems": "rubygems",
              "total_downloads": 54068,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "54,068 downloads all-time across rubygems",
                "points": 49.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 54068,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 38,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "followers": 33,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "acesuares",
              "public_repos": 48,
              "account_age_days": 6707
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "33 followers of acesuares",
                "points": 11,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 33,
                      "login": "acesuares"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "48 public repos, account ~18 yr old",
                "points": 24.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 48
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 18
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "validation_hints"
              ],
              "ecosystems": "rubygems",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on rubygems",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "57 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 57
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 50,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".rubocop.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 38,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 38,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 3.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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "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": 42,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "critical",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 28,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.52,
              "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": "52 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 27.7,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 52,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.77,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".rubocop.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "77 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 77,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Ruby",
              "largest_source_bytes": 9940,
              "source_files_sampled": 9,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Ruby without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Ruby"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/9 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 9,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T00:41:30.692632Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/acesuares/validation_hints.svg",
  "full_name": "acesuares/validation_hints",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenRubyGems.