Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-24 14:14 UTC

johnsonfash / forge-orm

TypeScriptMIT★ 4 Sterne⑂ 0 Forksseit Mai 2026Auf GitHub ansehen ↗

johnsonfash/forge-orm erreicht einen Gesundheitsindex von 44 von 100 und liegt damit im Bereich Gefährdet. Am stärksten schneidet es bei Vitality (75/100) ab, am schwächsten bei Security (23/100). Zuletzt vor 5 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

44
gesamt / 100
Gefährdet

Software-Gesundheitsindex

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

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

Bewertungsprofil

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

Eigentümerschaft

Johnson FashPersönliches Konto
13 Follower63 öffentliche Reposseit Feb. 2017Diimtech

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

Paket-Ökosysteme

Metriken nach Kategorie

Vitalität

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

75Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 5 Tagen
5.5/36Commit-Rhythmus — 8/52 Wochen mit Commits
16.5/18Commit-Volumen — 68 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year68
human_commit_share1
days_since_last_push5
active_weeks_last_year8

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 9 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 19 Tagen
27/27Release-Rhythmus — ein Release etwa alle 1,4 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count9
latest_release_tagv2.6.2
releases_from_tagsnein
days_since_latest_release19
mean_days_between_releases1,4
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

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

35Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
7.7/60Stars — 4 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars4
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
47.2/80Downloads pro Monat — 3.438 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesforge-orm
dependents
ecosystemsnpm
total_downloads
monthly_downloads3.438
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

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

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

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 5 Tagen
20/20Versionshistorie — 42 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesforge-orm
ecosystemsnpm
any_deprecatednein
min_days_since_publish5

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

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

Sicherheit

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

23Kritisch · 16 % des Gesamtindex

Sicherheitslage

23Kritisch
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — keine Daten
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — keine Daten
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — keine Daten
0/5Pinned-Dependencies — keine Daten
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — keine Daten
0/7.5Vulnerabilities — 18 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

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

66Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 55 von 68 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,809
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes1.264
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 68
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Pinned-Dependencies. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/191 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes42.886
source_files_sampled191
oversized_source_files0
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

4GitHub-Sterne
1Mitwirkende
68Commits, letzte 12 Monate
5Tage seit letztem Push
9Releases
1Bus-Faktor
0offene Issues
npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

OpenSSF Scorecard 2.3 / 10
2.3Gesamtwert

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

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

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 3897,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Shell": 3393,
        "JavaScript": 20756,
        "TypeScript": 1324885
      },
      "pushed_at": "2026-07-18T23:03:41Z",
      "created_at": "2026-05-25T07:09:22Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T23:03:45Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "johnfash.com",
      "name": "Johnson Fash",
      "type": "User",
      "login": "johnsonfash",
      "company": "Diimtech",
      "location": null,
      "followers": 13,
      "avatar_url": "https://avatars.githubusercontent.com/u/25495059?v=4",
      "created_at": "2017-02-02T00:56:57Z",
      "is_verified": null,
      "public_repos": 63,
      "account_age_days": 3459
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.6.2",
          "kind": "patch",
          "published_at": "2026-07-05T05:13:33Z"
        },
        {
          "tag": "v2.6.1",
          "kind": "patch",
          "published_at": "2026-07-05T04:40:38Z"
        },
        {
          "tag": "v2.6.0",
          "kind": "minor",
          "published_at": "2026-07-04T18:27:32Z"
        },
        {
          "tag": "v2.5.3",
          "kind": "patch",
          "published_at": "2026-06-24T15:54:10Z"
        },
        {
          "tag": "v2.5.2",
          "kind": "patch",
          "published_at": "2026-06-24T12:09:34Z"
        },
        {
          "tag": "v2.5.1",
          "kind": "patch",
          "published_at": "2026-06-24T11:25:17Z"
        },
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2026-06-24T10:43:46Z"
        },
        {
          "tag": "v2.4.0",
          "kind": "minor",
          "published_at": "2026-06-24T10:14:57Z"
        },
        {
          "tag": "v2.3.0",
          "kind": "minor",
          "published_at": "2026-06-24T09:07:17Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "086c4d9530efb5a9997d35a6922d38d6333b052d",
          "body": "f.json() gains an optional type parameter that flows to the row read type\nand the create/update input. The bare f.json() default changes from any to\nunknown, so an untyped column forces a narrow at the read site instead of\nsilently returning any. Read-only behavioural change — writes still accept an\n[…]\nped-JSON coverage (InferRow carries the shape, bare json is\n  unknown, InferCreate rejects a wrong shape via @ts-expect-error).\n- 474 tests + forge:typesafety pass.\n\nCHANGELOG + version bump to 2.6.4.",
          "is_bot": false,
          "headline": "2.6.4: typed JSON columns — f.json<T>() carries the shape through",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-07-18T23:02:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9d397ebcd4c2ec6d10a2d08e39bd532358235b44",
          "body": "Ships the driver wrapper that was previously only shown as a docs\nwalk-through. `tauriSqlDriver(Database.load('sqlite:app.db'))` gives\nTauri 2 desktop + mobile apps a real SQLite backend through sqlx on\nthe Rust side, with the same forge query API as better-sqlite3,\nlibsql, expo-sqlite, wasm-sqlite,\n[…]\non covers DDL, CRUD, atomic guards (col()), groupBy,\ntransactions, and multi-statement exec against a fake Tauri Database\nshape. 472/472 jest tests + 9/9 tauri-sql regression pass.\n\nDrop-in for 2.6.2.",
          "is_bot": false,
          "headline": "2.6.3 — tauriSqlDriver: @tauri-apps/plugin-sql adapter",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-07-05T08:42:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ce0056789f87a638f90626f72ef7d05b0b9b6f4",
          "body": "cursorScan sliced take/skip in index order, then executor sorted the\nsurvivors and applied take/skip AGAIN. Page 2 came back empty for any\norderBy field the planner couldn't cover with a native IDB index. Defer\nthe cursor slice whenever a post-sort is pending — same condition\nalready used for nearTo orderings and cursor pagination.",
          "is_bot": false,
          "headline": "2.6.2: fix IDB pagination when orderBy needs a JS post-sort",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-07-05T05:13:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c78683452fb3250bc5a832483d0d2eeaa74266a2",
          "body": "2.6.0 shipped adapters/indexeddb/migrate.runMigrate but factory.ts's\n$migrate proxy only dispatched to sqlite, throwing on IDB even though\ndocs/INDEXEDDB.md documented it as supported. Route to the IDB migrator\nalongside sqlite; behaviour matches the docs.",
          "is_bot": false,
          "headline": "2.6.1: wire $migrate() through to the indexeddb adapter",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-07-05T04:40:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "626daa3434cef87eb59b12a8e370e3de27880386",
          "body": null,
          "is_bot": false,
          "headline": "2.6.0 — IndexedDB adapter",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-07-04T18:06:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc62b1487b33629fd582c5a145634a6be0dd4a8d",
          "body": null,
          "is_bot": false,
          "headline": "2.6.0 — IndexedDB adapter: zero-install browser tier",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-07-04T18:05:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "819c8dc63d205f06c5c9420b3a8c01627c29868b",
          "body": null,
          "is_bot": false,
          "headline": "README: drop Replit link, point native examples at CodeSandbox DevBox",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-26T22:13:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81fb4c6349ac9bde7d3778a2842010aab157d21a",
          "body": "…uns from .replit config, no manual cd/npm)",
          "is_bot": false,
          "headline": "README: drop Codespaces — native examples now point at Replit (auto-r…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-26T22:05:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf467d491dd9686d26d39f325bbab9a06333223e",
          "body": "… sandbox URL was browser-mode and broke top-level await)",
          "is_bot": false,
          "headline": "README: repoint DuckDB + Bun example links to Codespaces (CodeSandbox…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-26T21:16:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "650ddf644ab2fa3548ad4c78cf20a9f9473ddf51",
          "body": "…to a separate 'cloud VM' row pointing at CodeSandbox DevBox",
          "is_bot": false,
          "headline": "docs: update sandbox table after example rename — DuckDB + Bun moved …",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-26T21:10:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e8080806d50b0951a0227140a3c3153ae85c9ac",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix DuckDB example link + audit-log API description in README",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-26T20:37:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebf7beec5e53cd31013bc8c819216cf7a9afb8d2",
          "body": "Node-only `import { randomUUID } from 'crypto'` broke browser builds:\n`f.id({ type: 'uuid' })` threw 'crypto_1.randomUUID is not a function'\non every create(). Now reads globalThis.crypto.randomUUID (present in\nbrowsers + Node 16+ + Deno + Bun + Workers), with a getRandomValues\nfallback and a clearly-marked Math.random last resort.",
          "is_bot": false,
          "headline": "2.5.6 — use WebCrypto for UUID generation (browser-safe)",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-26T20:08:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14c16309abb0842e629255ba813456817b711c76",
          "body": "The TSC build emits the whole tree as CommonJS, which broke\nthe documented `new Worker(new URL('forge-orm/wasm/worker',\nimport.meta.url), { type: 'module' })` pattern — the worker booted\nas an ES module and threw 'exports is not defined' on the first line.\nNow a separate npm run build:worker bundles just the worker as ESM\nwith @sqlite.org/sqlite-wasm marked external.",
          "is_bot": false,
          "headline": "2.5.5 — emit dist/wasm/worker.js as ESM via esbuild post-build",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-26T19:42:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dfd1884f3b76561cbe7f058e7a9ba052ae290f8",
          "body": "…runnable examples)",
          "is_bot": false,
          "headline": "2.5.4 — surface forge-orm-examples sandbox repo at top of README (18 …",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-26T19:09:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55975735ca55ca0773dd83aff78a87cfb760b814",
          "body": "GitGuardian flagged the `hunter2` joke-password and a bare `password`\nin mongodb+srv example URLs as credential incidents. Replace with\n`REDACTED_PASSWORD` placeholder. No real secrets were exposed —\nthese were demonstration strings — but the new placeholder will not\ntrip credential scanners.",
          "is_bot": false,
          "headline": "docs: redact placeholder passwords in AUTH.md examples",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T15:55:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "528270656f3a026cab98025b9ca2e621a4c31a73",
          "body": "- Add 60 new deep-dive companions in docs/ (~57k lines)\n  Schema: PRIMARY-KEYS, FOREIGN-KEYS, ENUMS, CHECKS, GENERATED-COLUMNS, VIEWS, MATERIALIZED-VIEWS, TRIGGERS\n  Reads/writes: UPSERT, BATCH, AGGREGATIONS, WINDOWS, PAGINATION, STREAMING, LOCKING, CONCURRENCY\n  CLI and ops: CLI, PUSH, DIFF, DOCTOR\n[…]\n chapters\n- Existing pointers (Defining a schema / Reading data / Writing data /\n  Migrations) expanded to reference the new docs\n\nDocs-only patch — dist/ byte-identical to 2.5.2, 472/472 tests green.",
          "is_bot": false,
          "headline": "2.5.3 — docs expansion to 80 files (no code change)",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T15:53:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1b69d0b49513e6b4bb4b4d6190f2f0e6ac176b7",
          "body": "No runtime change. dist/ is byte-identical to 2.5.1. The bump exists so\nthe new README + the 20-file docs/ deep-dive tree is the default view on\nnpmjs.com.\n\nTree under docs/ is now 20 files (~21,000 lines):\n  schema/data:    MODEL EMBED RELATIONS INDEXES TYPES\n  reads/writes:   QUERIES MUTATIONS TRA\n[…]\nMOBILE\n\nREADME's Deep-dive table at the top covers all 20; twelve chapters gain\ntrailing \"See more —\" pointers; uppercase filename convention applied\nthroughout.\n\nBuild clean, 472/472 jest tests pass.",
          "is_bot": false,
          "headline": "2.5.2 — docs-only patch",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T12:09:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79372e4762e15077a53c795b35c0489095f5cd4e",
          "body": "Round-out the docs/ tree so every surface in the README has a deeper\ncompanion reference. The README stays the elaborate surface tour; each\nchapter ends with a \"See more —\" pointer to the matching docs file.\n\nNew deep-dives (13 files):\n\n  docs/MODEL.md         1099   model() + every f.* field type +\n[…]\n ~21,000 lines of reference material.\nREADME remains the elaborate surface tour as the user asked — examples\nstay inline; each chapter just gains a pointer for readers who want the\nextended treatment.",
          "is_bot": false,
          "headline": "docs: 13 new deep-dive companions + README pointer pass (20 docs total)",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T12:06:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3976c7faeda5419a23fdd202cfc08927eb73024c",
          "body": "Filenames now match the README.md / CHANGELOG.md convention.\n\n  docs/backend.md           → docs/BACKEND.md\n  docs/browser-frameworks.md → docs/BROWSER-FRAMEWORKS.md\n  docs/geo.md               → docs/GEO.md\n  docs/json-path.md         → docs/JSON-PATH.md\n  docs/mobile.md            → docs/MOBILE.md\n[…]\n wasm build,\ntroubleshooting). The README's Browser chapter stays the surface tour;\nBROWSER.md is the parallel deep reference.\n\nAll internal docs/ ↔ docs/ cross-links and README → docs/ links updated.",
          "is_bot": false,
          "headline": "docs: rename docs/*.md to ALL CAPS + add BROWSER.md",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T11:35:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04360f324fdab26b01509a0399a32e7e29336290",
          "body": "Closes the 2.4 \"drift detection on the 2.5 roadmap\" note. db.$migrate()\nnow runs introspectSqlite + diffIntrospection after the create-pass and\nauto-emits ALTER TABLE ADD COLUMN for every missing column that's safe\nto add (nullable, or has a constant default). Destructive drift surfaces\nunder report\n[…]\npped/failures\nkeep working; the two new fields are additive.\n\n7 new jest tests cover nullable, defaulted, unsafe-NOT-NULL, extra-DB-col,\nopt-out, and direct applyDrift paths. 472/472 total, all green.",
          "is_bot": false,
          "headline": "2.5.1 — browser $migrate() applies non-destructive drift",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T11:24:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2e451766c2bfe8b60c3589d9fe630670c156bd3",
          "body": "README remains the surface reference. For each major surface that wants\nmore depth than a tour chapter can carry, ship a companion file.\n\n  docs/backend.md      (763 lines)\n    hyper-express / Fastify / NestJS / Bun+Hono recipes,\n    per-dialect pool sizing, request-scoped tx via AsyncLocalStorage,\n\n[…]\n audit-log + webhook patterns, BSON/Parquet interop, common bugs\n\nREADME adds a Deep-dive companions index after Contents, plus \"See also\"\npointers at the end of the Geo / JSON path / Vector chapters.",
          "is_bot": false,
          "headline": "docs: add five deep-dive companion files under docs/",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T11:16:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "53f5eee98b5aa38da984284e75f95c446d76ccbd",
          "body": "The eleven worked-example sections (React + Vite, Next.js, Vue, Nuxt,\nSvelteKit, Angular, SolidStart, Astro, Remix, React Native, Tauri) were\n~990 lines of mostly-parallel install/config/component recipes. Keeping\nthem in README crowded the surface reference.\n\nMove all eleven verbatim into docs/brow\n[…]\nc0/R-Tree build, troubleshooting) and ends\nwith a one-paragraph pointer to the recipe doc.\n\nNet: README 3320 → 2339 lines. docs/browser-frameworks.md = 1015 lines.\nNo content removed — just relocated.",
          "is_bot": false,
          "headline": "docs: split framework worked-examples into docs/browser-frameworks.md",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T11:07:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bb2a1e9aea405ef0a9a27feba9db06a7035877eb",
          "body": "forge-orm is a standalone library — the framework scaffold demos and OPFS\nfilename examples shouldn't reference a downstream consumer. Renames:\n\n  dallio-mini       → forge-vite-demo\n  dallio-next       → forge-next-demo\n  dallio-vue        → forge-vue-demo\n  dallio-nuxt       → forge-nuxt-demo\n  da\n[…]\ne     → app.sqlite\n  dallio.db         → app.db\n  BroadcastChannel('dallio-db') → BroadcastChannel('forge-db')\n  app.dallio.com    → app.example.com\n\nPure docs / comment change. No code path affected.",
          "is_bot": false,
          "headline": "docs: drop dallio names from README / migrate example",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T10:55:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5d325abd7ecbbe44ed6f878d2232054477acfb9c",
          "body": "…/$diff, MultiPolygon + 3D coords + non-WGS84 SRIDs\n\nCloses the entire \"Coming soon\" list from 2.4 plus three TBDs (MultiPolygon,\n3D coords, SRID reprojection). Drop-in upgrade — no breaking changes.\n\n- MSSQL upsert: real MERGE INTO ... USING (VALUES) ... WHEN MATCHED / WHEN\n  NOT MATCHED ... OUTPUT\n[…]\nunits.\n- 20 new jest tests covering MSSQL MERGE, MultiPolygon IR + WKT, point-in-\n  multi-polygon with holes, 3D field shape + DDL, non-4326 SRID DDL routing.\n  Total: 465 tests, 35 suites, all green.",
          "is_bot": false,
          "headline": "2.5.0 — MSSQL MERGE upsert, Mongo cross-field nearTo, browser $doctor…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T10:42:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "34cdd99155de20c429f5e184168d6cab62edd52c",
          "body": "Adds a browser dialect: real SQLite via @sqlite.org/sqlite-wasm running\ninside a Web Worker, persisted on OPFS. The IR, dialect emitter, executor,\nand DDL generator are reused unchanged — only the connection backend is new.\n\n- wasmSqliteDriver({ worker, url }) — implements SqliteDriver verbatim;\n  s\n[…]\npping, serial\n  queueing, close semantics, type guards. 445/445 tests pass.\n\nDrop-in upgrade for existing consumers — no breaking changes, no schema\nchanges, no API changes on any server-side dialect.",
          "is_bot": false,
          "headline": "2.4.0 — wasm adapter: sqlite-wasm + OPFS in the browser",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T10:14:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "23a7b54bb7ada3c19d96f38d8695e9a26cd42793",
          "body": "…rence\n\nDocs-only patch. The 2.3.0 README missed f.geoPoint() and f.vector() in\nthe Field types table, and the modifier list was a code block rather\nthan a table. This rewrites end-to-end:\n\n- Field types table covers every builder, including f.geoPoint() and\n  f.vector(), with TS type + per-dialect \n[…]\n Edge.\n- Built-in drivers table extended with DuckDB + MSSQL rows.\n- Limitations updated with DuckDB / MSSQL / Mongo geo caveats from 2.3.\n\nTOC rebuilt; all heading anchors resolve. No runtime change.",
          "is_bot": false,
          "headline": "2.3.1 — README rewrite: complete field/modifier tables, operator refe…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T09:30:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52c5fb1834f7b3db2960c92f555e3319ecd20120",
          "body": "…2.0.tgz\n\nThe repo had a stale 1.2.0 tarball checked in from a long-ago publish run.\nAdded *.tgz to .gitignore so future npm pack output stays untracked.",
          "is_bot": false,
          "headline": "chore: ignore *.tgz publish artifacts and drop the stray forge-orm-1.…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T09:06:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da1d1420512d672c567c5f4ddd6eb516b6cc5ebc",
          "body": "…ector search\n\nTwo new dialects (duckdb: and mssql:), complete geo layer across all six\ndialects (schema, spatial indexes, typed near/nearTo/withinPolygon, fallback\nmode, doctor probe, extension auto-install), typed JSON path queries, and\ntyped vector similarity search.\n\nSee CHANGELOG.md for full notes.",
          "is_bot": false,
          "headline": "2.3.0 — DuckDB + MSSQL adapters, end-to-end geo, JSON path queries, v…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T09:03:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b8c438fda6dce919dd97eea86fd3118548b0fbe",
          "body": "…er bug\n\nPostgres / MySQL / Mongo introspect now read method, where, include,\nexpression, partialFilterExpression, collation, and wildcardProjection\nback from the DB. Up to 2.2.0 the introspect output only carried name,\ncolumns, and unique, so `forge diff` couldn't see drift on any of the\nnew 2.2 in\n[…]\npelines\nthat need to filter soft-deletes can branch on semanticOp.\n\nThe 2.2.0 changelog entry was rewritten to match the rest of the file —\ndirect narration of what changed and why, no meta-narrative.",
          "is_bot": false,
          "headline": "2.2.1 — drift detection for the 2.2 index shapes + nested-write adapt…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T02:26:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "44d64e02a3ee3323a4d9e286e329cb1f57bf989c",
          "body": "IndexDef extensions\n\n  - where: partial index predicate. Object form on Mongo (aliases\n    partialFilterExpression), SQL string on PG / SQLite (compiles to\n    WHERE clause). MySQL warns and skips (no native partial-index support).\n  - expression: arbitrary SQL expression instead of column list. PG \n[…]\nongo,pg}.\n  - Full forge:integration suite green on all 4 dialects.\n\nNo breaking changes — every new field is optional, the legacy\npartialFilterExpression continues to work exactly as it did in 2.1.0.",
          "is_bot": false,
          "headline": "v2.2.0: every index gap closed + cross-adapter sweep",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-24T01:59:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0c8ec2c35e2678e06c2a70e3bf98cb8984b561d",
          "body": "…ests\n\n- IndexDef.partialFilterExpression -> forge push builds partial indexes;\n  idempotency fingerprint includes the (order-independent) filter\n- README 'What's new' refreshed (2.0, 2.0.1, 2.1) + index docs\n- +10 unit tests (upsert dedup edge cases, partial-index helpers) and a\n  live regression (regression-mongo-partial-index.ts). Bumps to 2.1.0.",
          "is_bot": false,
          "headline": "feat(mongo): partialFilterExpression on indexes; docs + more upsert t…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-23T23:44:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b963103ff25d0f385dcc997a2b5f82d5afe4789e",
          "body": "…paths\n\nDrop from $setOnInsert any field the update operators already write (exact +\nprefix conflicts), so create/update overlap (counter increment, set-on-both)\nstops throwing 'would create a conflict' on the insert branch. Adds regression\ntests. Bumps to 2.0.1.",
          "is_bot": false,
          "headline": "fix(mongo): upsert no longer emits conflicting $setOnInsert + update …",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-23T23:04:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91d6bff4cf1cb77c0417a57cab43f8ab0402a6e2",
          "body": "BREAKING: delete()/deleteMany() always hard-delete now (Prisma parity),\nregardless of a .softDeleteAt() column. The old auto-soft behavior moves\nto explicit verbs.\n\n- delete()/deleteMany(): always hard delete (runs cascades)\n- softDelete()/softDeleteMany(): set the .softDeleteAt() column (recoverabl\n[…]\nauto-hide; where:{_withDeleted:true} reveals)\n\nDocs: CHANGELOG migration note + rewritten README soft-delete section.\nTests: mongo integration covers soft/restore/hard; 241 unit + 38 integration pass.",
          "is_bot": false,
          "headline": "v2.0.0: delete() is now a hard delete; add softDelete/restore",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-15T10:29:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afb350c49d05732c7b6c5dd094b59b996306512e",
          "body": "…l-four-databases table + examples",
          "is_bot": false,
          "headline": "v1.9.1: docs — unify the pluggable-drivers README section into one al…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-12T20:36:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c1d41556db9dde1b9a0cf6a8ac94bfe85948bef",
          "body": "All four databases are now pluggable via createDb({ driver }).\n- MySQL: MysqlDriver port — mysql2Driver (default), mariadbDriver, planetscaleDriver\n- Mongo: mongoDriver(client, dbName?) — bring your own MongoClient\n  (DocumentDB / Cosmos / FerretDB / custom options)\n\nFix (MySQL): a col()/non-eq guar\n[…]\n25. Affected mysql2 too; the suite never tested a guarded MySQL update.\n\nFull matrix green: sqlite 37+libsql 9, pg 53+postgresjs 9, mysql 35+mariadb 8,\nmongo 38+regs+injected-client 6; 241 unit tests.",
          "is_bot": false,
          "headline": "v1.9.0: pluggable MySQL + Mongo drivers; MySQL guard fix",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-12T20:31:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6445210a795336399004a355a00e7237ab79a02a",
          "body": "The Postgres adapter routes through a normalized PostgresDriver port; pass any\nclient via createDb({ driver }). Built-in wrappers: pgDriver (default,\nnode-postgres) and postgresJsDriver (porsager/postgres.js).\n\n- default pg path unchanged (53/53 PG integration green through the port)\n- postgres.js v\n[…]\nRNING, col() guard,\n  groupBy/having, count(distinct), transaction commit + rollback\n- full matrix green: sqlite 37 + libsql 9, pg 53 + postgresjs 9, mysql 35,\n  mongo 38 + regressions; 235 unit tests",
          "is_bot": false,
          "headline": "v1.8.0: pluggable Postgres drivers (postgres.js)",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-12T20:01:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8d736c20733b8493f07acf1cd2040e4d33790631",
          "body": null,
          "is_bot": false,
          "headline": "docs: add CLAUDE.md — never attribute commits to AI",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-12T19:00:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbac181d592e7837be2cb4a0e32b0caa3a4be475",
          "body": "The SQLite adapter no longer hard-depends on better-sqlite3. All SQLite access\nroutes through a normalized async SqliteDriver port; pass any driver via\ncreateDb({ driver }). Built-in wrappers: betterSqlite3Driver (default),\nexpoSqliteDriver, opSqliteDriver, libsqlDriver.\n\n- better-sqlite3 path uncha\n[…]\n port)\n- async path verified end-to-end on real libsql (regression-libsql-driver.ts)\n- driver wrapper unit tests for the RN drivers (conforming fakes)\n- adapter `.db` now exposes the SqliteDriver port",
          "is_bot": false,
          "headline": "v1.7.0: pluggable SQLite drivers (React Native, edge, Turso)",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-12T18:12:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f66bcded7ef3bd526caad7748c7e8fc26431e177",
          "body": "Folds in npm releases 1.5.0–1.6.1 (published to npm without separate commits):\n- 1.5.0 col() field-to-field comparison in where — portable across dialects\n        (Mongo $expr, SQL a<op>b); enables atomic guarded counters via update()\n- 1.5.1 fix findOneAndUpdate result-unwrap for mongo driver v6 an\n[…]\nessentials across all src files; remove the dead legacy\n        pre-IR mongo translate/relations path and small dead code\n\nREADME + CHANGELOG brought current; 230 unit tests + mongo regressions green.",
          "is_bot": false,
          "headline": "v1.6.1: col() field comparison, groupBy/distinct fixes, housekeeping",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-12T17:50:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "384982316d4d44fe4f7f765624f8b859936e59f3",
          "body": "stringifyObjectIds recursed into every object, but Date / Decimal128 /\nBinary have no enumerable keys, so any aggregate row carrying one came\nback as an empty object. They now pass through untouched; ObjectId\nstringification and the _id → id remap are unchanged.",
          "is_bot": false,
          "headline": "v1.4.2: fix aggregate() flattening Date and BSON scalar values to {}",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-10T10:44:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa608bf923a43ad8c4655972da5cf66e1c749902",
          "body": "The strategy table + worked example shipped with 1.4.0 but lived deep\nin the schema section, four scrolls down from the hero. New users\ncould easily assume forge was UUID/ObjectId-only and bounce.\n\n- Added an explicit \"What's new in 1.4\" callout right under the pitch.\n- All three strategies (auto / \n[…]\n\n  buried under it.\n- Worked example is now a three-step (declare → push → use) layout\n  with the push command in context.\n- TOC entry added so the callout is reachable from the top.\n\nNo code changes.",
          "is_bot": false,
          "headline": "v1.4.1: surface 1.4's PK strategies at the top of the README",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-07T04:42:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2e7691ad035f79e7540191bc358b9c24d3d5e5df",
          "body": "Add a primary-key strategy switch to f.id(). The default (auto) is\nunchanged — string id, ObjectId on Mongo, UUID on SQL. Two new\nstrategies opt into stronger DB-side typing:\n\n- 'uuid' — PG uuid, MySQL CHAR(36), SQLite TEXT. Still string-shaped in\n  TypeScript; useful when you want the dialect's nat\n[…]\nbreaking — every existing f.id()\ncall site keeps its current behaviour.\n\nREADME updated with the strategy table and a worked example;\nthe \"(auto-incrementing keys not built in)\" parenthetical is gone.",
          "is_bot": false,
          "headline": "v1.4.0: f.id({ type: 'auto' | 'uuid' | 'bigserial' })",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-07T04:36:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "90888668e9ff685f5a6ee071923a801a4f434585",
          "body": "The README implied autocomplete broke without `as const` on the schema\nobject. That's incorrect for the recommended pattern (each model bound\nto its own const, then referenced from the schema literal) — TypeScript\nalready preserves model types and literal keys, and SchemaShape is\nRecord<string, Type\n[…]\not load-bearing.\nWorth writing for future-proofing (inlined models, string discriminators,\ndownstream keyof typeof schema consumers) but autocomplete + typed\nresults work either way.\n\nNo code changes.",
          "is_bot": false,
          "headline": "v1.3.3: docs: clarify when `as const` actually matters on the schema",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-07T04:23:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81b86889b460eafc9191bafe07ab6df4cbde9edb",
          "body": "Source-side cleanup. No public-API or behaviour changes.\n\n- Deleted \"Wave N — …\" internal release tags throughout — they meant\n  nothing to library users reading the source.\n- Removed function-header narration that just restated the function\n  name, and section-banner markers in files too small to s\n[…]\n\"young library with no long production\ntrack record\" line. The limitations section already covers maturity\nhonestly without prefacing the entire pitch with self-deprecation.\n\nAll 210 tests still pass.",
          "is_bot": false,
          "headline": "v1.3.2: trim redundant comments + tighten README intro",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-07T04:15:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "389d586a0c2d45d1c7ab4404328418b0989c5a2a",
          "body": "Add user-supplied ignore patterns to forge diff so engine-managed and\ncross-service collections (Atlas metadata, system.*, app-managed tables)\ncan be suppressed without inheriting them into the schema.\n\n- New CLI flag --ignore=<list> + FORGE_DIFF_IGNORE env var (both stack).\n- Strings match exact na\n[…]\nckage root for tooling that wraps forge diff.\n\n7 new specs cover string + regex matching, ignored-as-only-drift →\nin-sync, malformed-regex fallback, and the ignored-list summary.\nTotal 210 tests pass.",
          "is_bot": false,
          "headline": "v1.3.1: forge diff --ignore for noisy meta-collections",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-07T04:08:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0cf011ff4e1e78679e224d6e64de809495e4793c",
          "body": "Take `typeof MyModel` and pull out any input/output shape — no codegen,\nno SchemaMap registration. New exports: Infer, InferRow, InferWhere,\nInferWhereUnique, InferCreate, InferUpdate, InferUpsert, InferOrderBy,\nInferSelect, InferInclude, InferOmit, InferSchema. 13 new type-level\ntests; existing 191 + integration suites untouched.",
          "is_bot": false,
          "headline": "v1.3.0: direct-from-model type inference (`Infer*` family)",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-06-01T18:43:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8eb58615f9165d01fb3e33de69df14c68ff39086",
          "body": "Replaces the 7-path convention list with a layered resolver:\n\n  1. --schema=<path> flag                zero ms\n  2. FORGE_SCHEMA_PATH env var           zero ms\n  3. package.json → forge.schema         config-in-package\n  4. node_modules/.cache/forge/          cached scan result\n       schema-cache.j\n[…]\nsilently get the sample schema's indexes.\n\nMeasured against bigbite (~30-collection schema, ~10k files):\n  Cold scan: 298ms\n  Cache hit: <5ms\n  Full push wall-clock: 893ms (cache) / 2259ms (cold scan)",
          "is_bot": false,
          "headline": "v1.2.0: zero-config schema resolution (layered + filesystem scan)",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-05-31T10:08:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d11eb98d4130b2bca760a63755e8d231d771c806",
          "body": "Adds the consumer-facing CLI binary that was missing. After\n`npm install forge-orm`, you now get:\n\n  npx forge push           # sync schema → DB (idempotent)\n  npx forge diff           # show drift\n  npx forge diff apply     # apply reconciliation migration\n  npx forge rollback       # undo last mig\n[…]\nold forge:* npm scripts continue\nworking inside forge's monorepo for our own dev/test runs.\n\nTested against bigbite (~30-collection schema): 1139ms wall-clock,\nprocess exits cleanly when work is done.",
          "is_bot": false,
          "headline": "v1.1.5: `npx forge` binary with Prisma-style subcommands",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-05-31T09:59:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "abf9f66ec8083112a508ef023c5f5d3143295d49",
          "body": "…-connection hang)\n\nThe top-level CLI was relying on Node's natural exit, but pushAllIndexes\nleaves the Mongo connection pool open. So the process would sit idle for\n~30s after all output was written, waiting for the keepalive timeout\nbefore Node figured out it was done.\n\nThe standalone mongo entry \n[…]\n the top-level CLI does too.\n\nMeasured on a real ~30-collection / 111-index Mongo schema with bigbite:\n  Before 1.1.4: 1057ms of work + ~30s hang before exit\n  After  1.1.4: 750ms total, exits cleanly",
          "is_bot": false,
          "headline": "v1.1.4: forge:push exits cleanly when work is done (was: 30s dangling…",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-05-31T09:54:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af8be1d8bb49edfbfaded62d82a807efeedf36fa",
          "body": "forge:push, forge:diff, and forge:diff:apply were hardwired via direct\nrelative import to forge's bundled sample schema, so consumers were\nsilently pushing the sample's indexes instead of their own. Declared\n.unique() / @@unique / @@index constraints never landed in the real DB.\n\nCaught in productio\n[…]\nwould\ntype-check the whole file (~30-60s), which felt like a hang.\n\nNew file: src/scripts/load-consumer-schema.ts (the resolver).\npushAllIndexes(consumerSchema?) signature widened — fully back-compat.",
          "is_bot": false,
          "headline": "v1.1.3: forge:push reads consumer's schema (was: bundled sample)",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-05-31T09:35:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f0a57d584c747081d21a395791b503ff9812cb86",
          "body": "…plain-English README rewrite\n\n- f.id(): generate the primary key app-side on SQL too (UUID) when omitted, matching Mongo's auto ObjectId — no more assigning ids by hand on pg/mysql/sqlite\n- .updatedAt(): now bumps the column on update for SQL (was Mongo-only); .default('now') fills created-at\n- REA\n[…]\nfeature (no internal 'Wave' phases), no em-dashes, clear relations + automatic-fields docs, incidental content removed\n- CHANGELOG de-em-dashed; 191 unit + 163 integration green across all 4 databases",
          "is_bot": false,
          "headline": "v1.1.2: auto-generated ids + working .updatedAt() on every database; …",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T11:16:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d0f72276d20f1d5a3ae5ad3c3a5147111d446714",
          "body": "- remove NestJS integration (DatabaseModule/DatabaseService) + @nestjs/common — no framework coupling\n- lazy-load mongodb (MongoClient/ObjectId via bson accessor) + type-only imports — importing forge needs ZERO drivers; each driver require()d on first use\n- README: explicit per-database driver-install table + no-lock-in note\n- verified: fresh 'npm install forge-orm' with no drivers imports + builds schemas; 191 unit + 163 integration green",
          "is_bot": false,
          "headline": "v1.1.1: standalone, framework-agnostic, driver-lazy",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T10:21:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53816f19caf2488e3339bb3a1e08537f80b38cdb",
          "body": "…brand README title, repo/homepage/bugs metadata, keywords, author; align all install/import refs",
          "is_bot": false,
          "headline": "release: rename package to forge-orm + repo johnsonfash/forge-orm; re…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T07:32:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de2e3d98a94a6d2e83ca16c3a7997cedc3b58ee0",
          "body": "…llable from GitHub; ship LICENSE in npm tarball",
          "is_bot": false,
          "headline": "chore: add MIT LICENSE; prepare hook (build on install) so it's insta…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T07:22:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5e1b429325f6d4dea0fb18d4c8bda4f8f9ced21",
          "body": "…ature coverage, Testing & quality gates, Production notes + canary findings, API reference, complete TOC); CHANGELOG 1.1.0; bump to 1.1.0",
          "is_bot": false,
          "headline": "docs: comprehensive README (bring-your-own-schema lead, full field/fe…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T07:08:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea5e3170844929bcc4f1e6ac81ace4d89514a491",
          "body": "… drop-in library)\n\n- active-schema registry + live Proxy: ~14 consumer files unchanged\n- generic ForgeDb<S> / CollectionWrapper<F,R,SM>: consumer schemas fully typed\n- export the schema DSL (f/model/rel/enums/embed) + SchemaShape from the root\n- sample schema retained as default + reference (sampleSchema)\n- proof: custom-schema unit test, typesafety Section C (5 assertions), runnable examples/custom-schema-demo.ts\n- 354 tests green across all 4 dialects",
          "is_bot": false,
          "headline": "feat: decouple schema — bring-your-own via createDb({ schema }) (true…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T06:58:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa2d4cba5746611f0220b0bcc285a0fc37c506ed",
          "body": "… (build → dist with .d.ts, files allowlist, exports map); track README + WAVE5_PLAN; honest README framing + bring-your-own-schema caveat",
          "is_bot": false,
          "headline": "repackage: move git root to forge/, set up as publishable npm library…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T06:34:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77d1733058d59e3654e5aaa09ebbdd6cc037751c",
          "body": "…ed DB); findings — 2.7k req/s healthy at c=64, no leak, pool ceiling at c>50, PG catch-in-tx footgun documented",
          "is_bot": false,
          "headline": "canary: real-traffic HTTP service + concurrent load generator (isolat…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T06:22:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5441cdf4078236d232207e9c8906cfac2d2e0b9c",
          "body": "…lite3) and pass parsed mariadb pool options — 4-way comparison now real on PG/MySQL/SQLite",
          "is_bot": false,
          "headline": "wave 5a fix: correct Prisma SQLite adapter class name (PrismaBetterSq…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T05:44:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a577ca70b57cdc4e98b8651950ae72cf3efa0721",
          "body": "…ft, migrations, matviews, native types, strict, comparison bench)",
          "is_bot": false,
          "headline": "wave 5f: bump to v1.0.0, add CHANGELOG; README — Wave 5 sections (dri…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T05:35:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0c915d40139d0ab0573456b77bf0da4db1a3321",
          "body": "…omparison bench produces real 4-way numbers (forge vs prisma vs drizzle vs raw)",
          "is_bot": false,
          "headline": "wave 5a: install @prisma/adapter-{pg,mariadb,better-sqlite3} so the c…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T05:31:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5a921209b62a013b1fd68aebc3747cf50c7408e",
          "body": "…y assertion; port translateUpdateData tests to IR path; retire orphaned translate/data.ts",
          "is_bot": false,
          "headline": "wave 5e complete: select|include compile-time exclusivity + typesafet…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T05:30:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25ebec26f9ca268246dff9c1cf236ce226171a1d",
          "body": "… scenarios across all 4 dialects; strict-mode live test",
          "is_bot": false,
          "headline": "wave 5d: scheduleRefresh + parseDuration; matview refresh integration…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T05:22:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df4182692c707109ebe14eb90595b7e38cccb242",
          "body": "…ith _forge_migrations history and up/down files",
          "is_bot": false,
          "headline": "wave 5c: schema-diff migrations — forge:diff:apply + forge:rollback w…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T05:18:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9d5b89253f62a3f1b80c9bc5cc1531d5f65b135",
          "body": "…lect-agnostic comparator across 4 dialects",
          "is_bot": false,
          "headline": "wave 5b: forge:diff drift detection — per-adapter introspection + dia…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T05:14:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34261a10de2045af7ab2134a4069e1e9c15b9979",
          "body": "…ode; materialised views + refresh across 4 dialects",
          "is_bot": false,
          "headline": "wave 5e+5d: native types (decimal/uuid/bigint), dbgenerated, strict m…",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T05:09:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "135895221a500f90bce0b98f0e684b36e59e653f",
          "body": null,
          "is_bot": false,
          "headline": "wave 5a: forge vs prisma vs drizzle comparison bench",
          "author_name": "johnsonfash",
          "author_login": "johnsonfash",
          "committed_at": "2026-05-25T04:53:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63b1415bc947f2e939f6939a0dc36ce15f517422",
          "body": null,
          "is_bot": false,
          "headline": "baseline: forge wave 4c, 333/333 green",
          "author_name": "forge",
          "author_login": null,
          "committed_at": "2026-05-25T04:40:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 9,
      "commits_last_year": 68,
      "latest_release_at": "2026-07-05T05:13:33Z",
      "latest_release_tag": "v2.6.2",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 19,
      "mean_days_between_releases": 1.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "forge-orm",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "orm",
            "prisma",
            "mongodb",
            "postgres",
            "postgresql",
            "mysql",
            "sqlite",
            "duckdb",
            "mssql",
            "sql-server",
            "database",
            "query-builder",
            "typescript",
            "multi-database",
            "no-codegen",
            "geospatial",
            "geo",
            "vector-search",
            "vector",
            "embeddings",
            "pgvector",
            "json-path",
            "rag",
            "similarity-search"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/forge-orm",
          "is_deprecated": false,
          "latest_version": "2.6.4",
          "repository_url": "https://github.com/johnsonfash/forge-orm",
          "versions_count": 42,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3438,
          "first_published_at": "2026-05-25T07:40:11.294000Z",
          "latest_published_at": "2026-07-19T01:49:27.605000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 4,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 42886,
      "source_files_sampled": 191,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 1264
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "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": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "johnsonfash",
          "commits": 51,
          "avatar_url": "https://avatars.githubusercontent.com/u/25495059?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "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": 10,
            "reason": "security policy file 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": 0,
            "reason": "18 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "086c4d9530efb5a9997d35a6922d38d6333b052d",
        "ran_at": "2026-07-24T14:14:17Z",
        "aggregate_score": 2.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-18T23:03:42Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/johnsonfash/forge-orm",
    "host": "github.com",
    "name": "forge-orm",
    "owner": "johnsonfash"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 44,
      "inputs": {
        "security": 23,
        "vitality": 75,
        "community": 35,
        "governance": 38,
        "engineering": 44
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 68,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "68 commits in the last year",
                "points": 16.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 68
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": 100,
            "inputs": {
              "releases_count": 9,
              "latest_release_tag": "v2.6.2",
              "releases_from_tags": false,
              "days_since_latest_release": 19,
              "mean_days_between_releases": 1.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 19 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 19
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.4
                    }
                  }
                ],
                "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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 35,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 0,
              "stars": 4,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "packages": [
                "forge-orm"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3438
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,438 downloads/month across npm",
                "points": 47.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3438,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 38,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 54,
            "inputs": {
              "followers": 13,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "johnsonfash",
              "public_repos": 63,
              "account_age_days": 3459
            },
            "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": "13 followers of johnsonfash",
                "points": 8.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 13,
                      "login": "johnsonfash"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "63 public repos, account ~9 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 63
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 9
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "forge-orm"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "42 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 42
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 44,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "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": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 65,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "critical",
        "name": "Security",
        "value": 23,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "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": 23,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 2.3
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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 detected",
                "points": 5,
                "status": "met",
                "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": "18 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.809,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 1264
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "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": "55 of 68 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 55,
                      "sampled": 68
                    }
                  }
                ],
                "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": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 68",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 68
                    }
                  }
                ],
                "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 42886,
              "source_files_sampled": 191,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/191 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 191,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T14:14:22.085353Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/johnsonfash/forge-orm.svg",
  "full_name": "johnsonfash/forge-orm",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm.