Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 00:48 UTC

acesuares / inline_forms

Inline Forms

Ruby · HTMLMIT★ 24 stars⑂ 15 forkssince Jan 2011View on GitHub ↗

acesuares/inline_forms holds a health index of 54 out of 100, placing it in the Moderate band. It scores highest on Vitality (77/100) and lowest on Security (39/100). It was last updated today. A single contributor accounts for most of its recent work.

54
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

Ace SuaresPersonal account
33 followers48 public repossince Mar 2008Suares & Co

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
RubyGemsinline_forms8.1.43-4270 days ago
RubyGemsinline_forms_installer8.1.43-360 days ago
RubyGemsinline_forms_schema_edit8.1.43-20 days ago

Metrics by category

Vitality

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

77Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
6.2/36Commit cadence — 9/52 weeks with commits
18/18Commit volume — 165 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year165
human_commit_share1
days_since_last_push0
active_weeks_last_year9
How it's scored
16.2/27Ships releases — 100 version tags (no GitHub releases)
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~6.1 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count100
latest_release_tagv8.1.43
releases_from_tagsyes
days_since_latest_release0
mean_days_between_releases6.1
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

50Moderate · 18% of overall
How it's scored
22.1/60Stars — 24 stars
9.6/25Forks — 15 forks
0/15Watchers — 2 watchers
Inputs used
forks15
stars24
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
63/80Total downloads — 1,150,026 downloads all-time across rubygems
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesinline_forms, inline_forms_installer, inline_forms_schema_edit
dependents
ecosystemsrubygems
total_downloads1,150,026
monthly_downloads
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

51Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
1.5/22.5Commit distribution — top contributor authored 93% of commits
6.8/13.5Contributor breadth — 5 contributors
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Inputs used
bus_factor1
contributors_sampled5
top_contributor_share0.933
How it's scored
5.8/46.8Issue resolution — 12% of issues closed
33.3/38.3PR acceptance — 34/39 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs34
open_issues7
closed_issues1
issue_closed_ratio0.125
closed_unmerged_prs5
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
11/25Owner reach — 33 followers of acesuares
24.3/25Track record — 48 public repos, account ~18 yr old
Inputs used
followers33
owner_typeUser
is_verified
owner_loginacesuares
public_repos48
account_age_days6,707
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 3 package(s) on rubygems
35/35Publish recency — latest publish 0 days ago
20/20Version history — 427 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesinline_forms, inline_forms_installer, inline_forms_schema_edit
ecosystemsrubygems
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

50Moderate · 20% of overall
How it's scored
0/24CI workflows
24/24Tests present
16/16Linter config — .rubocop.yml
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_cino
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.

Documentation

50Moderate
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

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

39At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — no data
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
0/10Dangerous-Workflow — no data
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — 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 — no data
0/5Pinned-Dependencies — no data
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — no data
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate3.9
Excluded from scoring (no data or not applicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Remaining weights renormalized.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

46At risk · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 92 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.92
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — .rubocop.yml
0/11Static type checking
0/10Reproducible environment
10/10Demonstrated agent practice — 96 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0.96
toolchain_manifests
dependency_bot_commit_share0
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.
How it's scored
0/45Type-checkable code — Ruby without a type-check config
54.7/55Manageable file sizes — 1/175 source files over 60KB
Inputs used
primary_languageRuby
largest_source_bytes74,312
source_files_sampled175
oversized_source_files1

Key facts

24GitHub stars
5contributors
165commits, last 12 months
0days since last push
100releases
1bus factor
7open issues
RubyGemspackage ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 15 ⇿
0Stars
15Forks
11Releases

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

03581013151592012-052015-022017-10
Major 1Minor 0Patch 10

Each point covers 5 days.

OpenSSF Scorecard 3.9 / 10
3.9aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-23 00:48 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
n/aDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
n/aPackagingpackaging workflow not detected
n/aPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
n/aToken-PermissionsNo tokens found
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 1
RegistryPackageVersion constraintManifest
RubyGemsvalidation_hintsGemfile
All dependencies 12

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

RegistryPackageVersionRelation
RubyGemsvalidation_hintsdirect
RubyGemsinline_formsindirect
RubyGemsinline_forms_schema_editindirect
RubyGemsminitestindirect
RubyGemspaper_trailindirect
RubyGemsrailsindirect
RubyGemsrails-i18nindirect
RubyGemsrubocop-rails-omakaseindirect
RubyGemssqlite3indirect
RubyGemsthorindirect
RubyGemsturbo-railsindirect
RubyGemswill_paginateindirect
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies carried a version and a supported ecosystem

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

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

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

How one result sits in the wider record: aggregate statisticsRubyGems.