Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-27 01:33 UTC

tonioloewald / tjs-lang

A type-safe-by-design, cost-limited virtual machine that enables the safe execution of untrusted code anywhere

TypeScript · JavaScriptApache-2.0★ 5 Sterne⑂ 0 Forksseit Jan. 2026Auf GitHub ansehen ↗

tonioloewald/tjs-lang erreicht einen Gesundheitsindex von 55 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (84/100) ab, am schwächsten bei Community & Adoption (36/100). Zuletzt vor 2 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

55
gesamt / 100
Mittel

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.

55
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

Tonio LoewaldPersönliches Konto
17 Follower74 öffentliche Reposseit Aug. 2011Loewald Consulting

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?

84Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 2 Tagen
18/36Commit-Rhythmus — 26/52 Wochen mit Commits
18/18Commit-Volumen — 656 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year656
human_commit_share1
days_since_last_push2
active_weeks_last_year26
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 17 Versions-Tags (keine GitHub-Releases)
36/36Release-Aktualität — letztes Release vor 6 Tagen
27/27Release-Rhythmus — ein Release etwa alle 2,7 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count17
latest_release_tagv0.12.0
releases_from_tagsja
days_since_latest_release6
mean_days_between_releases2,7
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?

36Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
9.8/60Stars — 5 Stars
0/25Forks — 0 Forks
0/15Watcher — 2 Watcher
Verwendete Eingangsdaten
forks0
stars5
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
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
48.4/80Downloads pro Monat — 4.274 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagestjs-lang
dependents
ecosystemsnpm
total_downloads
monthly_downloads4.274
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?

52Mittel · 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
18.7/46.8Issue-Lösungsquote — 40 % der Issues geschlossen
38.2/38.3PR-Annahme — 3/3 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs3
open_issues12
closed_issues8
issue_closed_ratio0,4
closed_unmerged_prs0
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
9/25Reichweite des Inhabers — 17 Follower von tonioloewald
25/25Kontohistorie — 74 öffentliche Repos, Kontoalter ca. 14 Jahre
Verwendete Eingangsdaten
followers17
owner_typeUser
is_verified
owner_logintonioloewald
public_repos74
account_age_days5.460
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 6 Tagen
20/20Versionshistorie — 62 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagestjs-lang
ecosystemsnpm
any_deprecatednein
min_days_since_publish6

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

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

Sicherheit

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

42Gefährdet · 16 % des Gesamtindex

Sicherheitslage

27Kritisch
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — keine Daten
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — keine Daten
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — keine Daten
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — keine Daten
0/7.5Vulnerabilities — 76 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,7
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.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages4
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von npm:tjs-lang@0.12.0 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 4 Paketen. Erreichbarkeit wird nicht analysiert.

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.

79Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
15/15Maschinenlesbare Doku (llms.txt) — llms.txt vorhanden
40/40Lesbare Commit-Historie — 100 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtja
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes55.294
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — eslint.config.js
11/11Statische Typprüfung — functions/tsconfig.json, tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 100 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configsfunctions/tsconfig.json, tsconfig.json
agent_commit_share1
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)
53.3/55Handhabbare Dateigrößen — 9/287 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes420.975
source_files_sampled287
oversized_source_files9
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

5GitHub-Sterne
1Mitwirkende
656Commits, letzte 12 Monate
2Tage seit letztem Push
17Releases
1Bus-Faktor
12offene Issues
npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch npm package 'tjs-platform-functions' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

OpenSSF Scorecard 2.7 / 10
2.7Gesamtwert

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-27 01:33 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
k. A.CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
k. A.Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
k. A.Pinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
k. A.Token-PermissionsNo tokens found
0Vulnerabilities76 existing vulnerabilities detected
Direkte Abhängigkeiten 6
RegistryPaketVersionsvorgabeManifest
npmfirebase-admin^13.6.1functions/package.json
npmfirebase-functions^7.0.5functions/package.json
npmacorn^8.15.0package.json
npmacorn-loose^8.5.2package.json
npmacorn-walk^8.3.4package.json
npmtosijs-schema^1.4.0package.json
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

Abhängigkeits-Advisories 0

Die Installation von npm:tjs-lang@0.12.0 zieht 4 Pakete nach sich, direkt und transitiv: 0 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 111962,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Shell": 8515,
        "JavaScript": 558447,
        "TypeScript": 2621595
      },
      "pushed_at": "2026-07-24T07:33:55Z",
      "created_at": "2026-01-09T15:15:05Z",
      "owner_type": "User",
      "updated_at": "2026-07-24T07:35:03Z",
      "description": "A type-safe-by-design, cost-limited virtual machine that enables the safe execution of untrusted code anywhere",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "http://loewald.com/blog/",
      "name": "Tonio Loewald",
      "type": "User",
      "login": "tonioloewald",
      "company": "Loewald Consulting",
      "location": "Oulu, Finland",
      "followers": 17,
      "avatar_url": "https://avatars.githubusercontent.com/u/979455?v=4",
      "created_at": "2011-08-14T16:01:36Z",
      "is_verified": null,
      "public_repos": 74,
      "account_age_days": 5460
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-20T14:57:59Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-18T10:45:10Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-17T11:43:22Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-16T19:17:59Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-11T11:28:58Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-06T11:34:23Z"
        },
        {
          "tag": "v0.8.7",
          "kind": "patch",
          "published_at": "2026-07-01T15:30:22Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-06-30T11:15:48Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-06-30T06:14:52Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-06-26T18:22:28Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-06-23T22:17:09Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-06-10T06:24:32Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-05-14T08:49:49Z"
        },
        {
          "tag": "v0.7.8",
          "kind": "patch",
          "published_at": "2026-04-30T12:55:09Z"
        },
        {
          "tag": "v0.7.7",
          "kind": "patch",
          "published_at": "2026-04-27T05:32:22Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-04-26T13:43:35Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-01-29T16:41:47Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "4cbb5c20c573a0c455d7db9066ef357000bcadcb",
          "body": "…ty (0.13.0)\n\nTwo related 0.13.0 candidates from a design discussion:\n\n- #4b Curated completions: extend suggest()'s Suggestion with per-value\n  description + a snippet cursor-placement template, merged with and validated\n  against the auto-mined set. The editor side already supports this (CodeMirro\n[…]\n\n\nSurfaced in PLAN Next Up (priority 3, 0.13.0) alongside per-mode-off.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(todo,plan): add curated predicate completions + AI-discoverabili…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-24T07:33:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "162a0d8ccdc825d0f7a6111f463538130fef0339",
          "body": "…#22)\n\n`B = BABYLON` in native tjs was auto-const'd to `const B = BABYLON`; when B is\ndeclared in an enclosing/host scope the source-level transform can't see (a\n`/*# */` example inside a module that already `let B`s), the const shadowed the\nouter binding and read null elsewhere — it bit tosijs-3d's\n[…]\ncal decl; definition RHS\nstill consts). First item of the 0.12.1 patch.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "fix(lang): bare-assignment auto-const skips bare-identifier aliases (…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-23T17:16:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ea6784e0f10f36b67522d93bc6e195774c154f63",
          "body": "The archive-split commit added TODO-ARCHIVE.md but didn't index it in llms.txt,\ntripping the docs-index guardrail. Index it, drop TODO.md's stale \"move done\nitems to Completed\" note, and point PLAN's line at the predicate-types north star.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(llms): index TODO-ARCHIVE.md; refresh TODO/PLAN descriptions",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-23T17:16:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2a33941fa95df0c8aefb5a1699a969beac3019d6",
          "body": "…cklog lean\n\nMoved four whole shipped-history sections out of TODO.md (962 → 780 lines) into\na new TODO-ARCHIVE.md: the stale \"Resume here — 0.9.1 SHIPPED\" nav block, the\nall-[x] tosijs-ui adoption feedback, the \"editors .js stale — FIXED\" note, and\nthe early-sessions \"Completed\" archive. The full d\n[…]\nO.md gets a pointer to both. docs.json regenerated (it embeds TODO.md).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(todo): move shipped history to TODO-ARCHIVE.md; keep the live ba…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-23T17:10:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "556baa7bca728e84d058163a9f85aa6348db48aa",
          "body": "…ection\n\nThe roadmap framed the strategic future as multi-target LLVM/native emission\nwhile the project's actual center of gravity since 0.8.4 — the predicate-types /\n$predicate / JSON-Schema-as-canonical-types direction — was invisible.\n\n- New \"The North Star\" section: predicates as JSON-Schema's m\n[…]\nophy reframed to put the type\n  system, not the backend, at the center.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(plan): realign the roadmap north star to the predicate-types dir…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-23T17:05:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "27e35ec776518bdfa3232a3bd30ae8c45b82876f",
          "body": "…icted items\n\nFrom a full TODO.md + PLAN.md audit vs the (now-complete) CHANGELOG:\n\nTODO.md:\n- Remove two contradicted duplicates in the 0.12.0 section (isDictDefaultParam\n  extraction, IDENT_RE hoist — both listed open AND done); mark the coverage\n  backfill down to what actually remains (membrane \n[…]\ne\ndirection to PLAN's strategy) are proposed separately, not done here.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(todo,plan): reconcile against shipped 0.12.0 — fix stale/contrad…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-23T16:59:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "61a602d873cb20fd0696e321b4a196e17dfd7116",
          "body": "The 0.8.7 entry lumped in the predicate-safety verifier, effects tag, $predicate\nkeyword, suggest(), and the introspection autocomplete — all of which actually\nlanded in 0.8.4. Split them out and add the missing entries so the 0.8.x line is\ncontinuous against the tags:\n\n- 0.8.4 (2026-06-26): predica\n[…]\n.3 was tagged.) Comparison-link chain made continuous; docs.json regen.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(changelog): fill the 0.8.4-0.8.6 gap; fix 0.8.7 mis-attribution",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-22T12:14:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5475b029270ffe4adce0f5c121bf09bd9bf15c3a",
          "body": "The CHANGELOG floor was 0.8.0, so pre-0.8.0 history — including a BREAKING\nchange — lived only in the git log. Backfilled coarsely from the tags per the\nreleasing.md guidance:\n\n- 0.2.0 (2026-01-29): foundational release, and the **VM-return flattening**\n  (202e72a) — `return` became value-based, dro\n[…]\n.\n\nComparison-link chain extended down to 0.2.0. docs.json regenerated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(changelog): backfill pre-0.8.0 entries from git tags/log",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-22T08:10:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1e76fdfada38e47201570a5a8c7ecbace98230c6",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "chore(demo): update firebase hosting deploy cache (0.12.0 playground)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T15:00:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2812dc620bc8a9c43953317efd1c8842255f9010",
          "body": "The committed docs.json lagged the TODO.md edits from the follow-up commits;\n`bun run make` (which now runs `bun run docs`) regenerates it fresh. Pre-publish\nsync so the npm tarball ships current playground docs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "chore(demo): regenerate docs.json (embeds current TODO.md)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T14:57:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af3a18d9cc6e82591f2a3f592571cc6b7a34daaa",
          "body": "The two shared single-source modules added in 0.12.0 were listed in CLAUDE.md's\nKey Source Files but not in llms.txt's source map (the \"update both\" rule).\nAlso note the new dict-default-excess-key linter rule and the capability\nmembrane in the runtime.ts entry.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(llms.txt): surface redos.ts + forbidden-keys.ts in the source map",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T14:34:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3b779ef497b72256c2b2651ee618665de618a8b7",
          "body": "Post-release, low-risk items from the GO_WITH_FOLLOWUPS review:\n\n- Dryness (confirmed major): extract one isDictDefaultParam(type, default) into\n  src/lang/types.ts, imported by both the JS emitter (merge gate) and the .d.ts\n  emitter (deep-partial gate) — they inlined the same 5-clause predicate an\n[…]\nurity hot path), and the 4MB-default/dataUrl-exemption policy decision.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "refactor: adopt low-risk 0.12.0 review follow-ups",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T12:50:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6b8dddbf82018f4c665e4a7df583b745545238f",
          "body": "Stamp the release after a GO_WITH_FOLLOWUPS pre-release review (two rounds; both\nblockers found and fixed):\n\n- package.json 0.11.0 -> 0.12.0\n- CHANGELOG [Unreleased] -> [0.12.0] — 2026-07-20, with an affected-versions\n  callout on the Security section (fixes are latent in 0.11.0 and earlier) and a\n \n[…]\n note, membrane-budget-vs-large-payload).\n- demo/docs.json regenerated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "chore(release): 0.12.0 — VM security hardening + dictionary defaults",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T12:41:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fa241afb0306c61fdef4054939191d616af3ede9",
          "body": "The capability-membrane OOM byte-budget was blind to the payload types most\nlikely to be large: TypedArray/DataView charged a flat 32 bytes (not byteLength),\nand ArrayBuffer/Map/Set fell to the plain-object branch (16 bytes, zero children\nwalked) — so a 500MB Uint8Array or a 500-entry Map crossed a \n[…]\nhe call targets a RestElement\ndispatcher, so no shape collision occurs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "fix(vm): membrane budgets binary/collection payloads (re-review BLOCKER)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T12:27:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ad30c2186f7e39e1e3fc814a87d8ad9f915ec582",
          "body": "…docs.json)\n\nPre-release review majors M1/M2/M4 + docs follow-ups:\n\n- CHANGELOG: two explicit \"Changed / behavior-change\" callouts — TjsDictDefaults\n  ships default-ON and silently changes existing native .tjs =-object-param\n  semantics (merge/validate/strip, with a migration note); and the VM capab\n[…]\npability-payload-OOM\n  item retired as resolved by the membrane budget.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs: 0.12.0 review follow-ups (behavior-change callouts, CLAUDE.md, …",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T10:06:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7595b3c839741b74d0538ec63ed1357a904186fa",
          "body": "…keys\n\nFrom the pre-release review follow-ups (both code findings sanity-checked and\nconfirmed first):\n\n- Dict-defaults: a present-but-undefined member (`f({x: undefined, y: 3})`)\n  tripped the count-based excess heuristic and emitted a spurious\n  \"excess key(s) [] stripped\" notice with an empty lis\n[…]\nd-member no-notice; [::7f00:1]/[::127.0.0.1]\nadded to the SSRF vectors.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "fix: spurious excess notice + IPv4-compat IPv6 SSRF; dedup forbidden …",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T10:03:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a3489cda2610e7e654a374d563f70ed58f5741b",
          "body": "B1 (correctness): generateDictMergeLines reset its uid counter per call, so a\nfunction with two =-object-default params emitted `let __dd0n` twice ->\nSyntaxError, function undefinable. Thread one shared uid counter across all\ndict-default params in a function. Regression tests: two flat params + a\nn\n[…]\n(a|a)+.\n\nBoth found by the pre-release review, adversarially confirmed.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "fix: clear pre-release BLOCKERs (dict-default uid collision + VM ReDoS)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T09:58:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4004d144bf183ee05314b4deb852740140dfcbe2",
          "body": "The runtime strips an undeclared key on a dictionary-default (=) object param\nwith a once-per-site notice, but at a literal call site (place({x,y,treshold}))\nan excess key is almost always a typo. The linter now flags it statically:\ncollects =-form object-literal param shapes per named function and \n[…]\ndresses the payload vector; unbounded in-run state growth remains open.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "feat(linter): dict-default-excess-key — flag stray call-site keys",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T09:38:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b1a3f084db8f9d64e3359659bebc2aee8a245e0",
          "body": "regexMatch: the regex engine's backtracking is opaque to the fuel counter,\nso fail closed on pattern length (1000), input length (100k, after string\ncoercion), and an extended heuristic that also catches a quantified group\nrepeated by an unbounded outer quantifier ((a+){2,}). Safe patterns\n(bounded \n[…]\nr-access guard.\n\nAdversarial tests for both in malicious-actor.test.ts.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "fix(vm): ReDoS length caps + scope variable-name guard",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T09:33:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f5ee79c99b7db1f3dbc67dda8fb56e55eeabdb0a",
          "body": "Previously only 127.0.0.1 (not the rest of 127/8) and the single metadata IP\nwere blocked, and IPv6 private ranges were unchecked. Now blocks all of\nloopback 127/8, 0/8, private 10/8·172.16/12·192.168/16, link-local 169.254/16,\nand for IPv6 ::1/::, unique-local fc00::/7, link-local fe80::/10, and\nIP\n[…]\nopback, 0.0.0.0, link-local, IPv6 ULA/link-local, and IPv4-mapped IPv6.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "fix(vm): close SSRF gaps in isBlockedUrl (full ranges + IPv6)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T09:28:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d2dd6abf18f31d1bb4227cc864eb55f2b23b581",
          "body": "Replaces the name-only blocklist (only __proto__/constructor/prototype were\nrejected) with a positive allowlist computed once at module load from the\nstandard prototypes (String/Array/Number/Boolean/Object/Date), the curated\nbuiltin statics (Math/JSON/Object/Array), and the VM's own wrapper types\n(D\n[…]\nll/apply/bind/constructor rejected, standard string\nmethods still work.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "feat(vm): allowlist methodCall to standard built-in methods",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T09:25:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "53a556beb8b8be69dac762fdb51a430eee4b7edb",
          "body": "…ings\n\nEvery effects:'io' atom return is deep-copied through a structured-clone\nmembrane at the single exec-wrapper choke point before it lands in guest\nstate. Closes an adversarial-review defense-in-depth hole: a capability\ncould hand the guest a live host reference (an object with callable methods\n[…]\nd);\ntwo stress.test.ts fetch mocks updated to the data-return contract.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "feat(vm): capability-boundary membrane — structured-clone guest cross…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-20T09:20:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2554a543d5d0c8eae7e0c4537d5e7f3726e71a96",
          "body": "…tage 3)\n\nUnder TjsDictDefaults, place({pos: {x: 5}}) is valid tjs — so the caller-facing\n.d.ts must admit it. generateDTS now emits deep-partial types for `= {object\nliteral}` params (args?: { pos?: { x?: number; y?: number }; label?: string }),\ngated on the mode via result.tjsModes (newly carried \n[…]\nsted for both native (deep-partial) and\ndialect-js (unchanged) emission.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "feat(dts): deep-partial caller types for dictionary-default params (S…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-19T08:27:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df1e0fa1433cf9c3a886478a13aeee5b21899580",
          "body": "…tage 1)\n\n`(args = {x: 0, y: 0})` in native tjs now has WebIDL-dictionary semantics:\nper-member defaults, partial payloads merged per member (recursively), members\ntype-checked with precise paths, undefined⇒absent, example-null⇒nullable-any,\narrays replaced wholesale (element-checked), excess keys S\n[…]\n3 (descriptor fixtures + deep-partial dts), Stage 4 (tosijs-3d dogfood).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "feat(lang): TjsDictDefaults — merge-on-partial dictionary defaults (S…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-19T06:54:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d38f526fc167e93c29adf2029893d845f01d45c",
          "body": "The previous commit's spec edit silently failed (Prettier had rewrapped the\ntext between read and write; the batch aborted before writing) — it landed the\nspike annotation and TODO but not the spec the message described. This is the\nspec half: §5.1 rewritten (':' = required / '=' = defaulted at the \n[…]\n shapes = separate params), OQ1 marked resolved, Stage 1 bullet updated.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(dictionary-defaults): apply the OQ1 resolution to the spec itself",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-18T16:57:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6daa9c13ba42efe941e2e19598eeec4409b8d733",
          "body": "Tonio's ruling, and it dissolves the question rather than answering it:\nrequired-ness lives at the PARAM level, where tjs already expresses it —\n`(args: {...})` = required param, all members required (Stage 0, shipped);\n`(args = {...})` = defaulted param, all members defaulted (the merge mode).\nA \"r\n[…]\nly as evidence the mechanism works if ever needed. Stage 1 is unblocked.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(dictionary-defaults): OQ1 resolved — ':' IS the required marker",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-18T16:56:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ce3d71d3f39c3a52015ca862f3eae5a7f67aef40",
          "body": "…mber contract\n\n`function f(args: {x: 0, y: 0})` has always documented \"an object with integer\nx and y,\" but the emitted check was typeof-object only: partial payloads, wrong\nmember types, and garbage members all passed while the full shape sat unused in\nfn.__tjs.params (measured while reviewing the\n[…]\nd\ntemplates, purity check, shape-specialized merge codegen per Spike B).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "feat(validation): Stage 0 — colon-form object params enforce their me…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-18T14:01:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7af7281bfd04df123ab11f48ff042d006c29dba2",
          "body": "Per Tonio: document performance against BOTH the status quo (fast-but-wrong\nidioms, labeled, breakage demonstrated by test — shallow spread loses nested\ndefaults; mutating assign corrupts the shared defaults object) AND the clean\ncorrect hand-roll, so the feature's price is stated honestly against e\n[…]\nes/performance.md\n(\"Benchmarking a footgun-pave\", commit 2aff7c7 there).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "spike(dictionary-defaults): three-tier cost story in the benchmark",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-18T12:06:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2192da83e92997cded57652190dfd68c28f82d43",
          "body": "…ines\n\nPer Tonio's directive: benchmarking against code that doesn't do the job is\nmeaningless. Baselines are the correct implementations (per-shape spread — the\nfastest thing careful humans write; generic recursive deep-merge;\nstructuredClone-then-fill), with an AGREEMENT CHECK proving they all pro\n[…]\nllocated per call per level even with\nnothing absent) — 714 -> 543ns/op.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "spike(dictionary-defaults): Spike B — perf vs CANONICAL CORRECT basel…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-18T10:54:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a63c0eb2b8492e9bebddad7022d4fc12a3541b39",
          "body": "Minor — the import-resolver release tosijs-ui builds against. Two new entry\npoints (tjs-lang/import-resolver + ./import-resolver/worker raw asset), the\nrouting DRY (three diverged copies -> one core), browser-verified via haltija.\nAlso ships the dictionary-defaults spec + Spike A harness (docs/experiments).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "chore(release): 0.11.0",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-18T10:45:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1e5c2394afb0d620fa473ac834c5f3ab200ffe03",
          "body": "…rness\n\nMerge-on-partial object arguments (WebIDL-dictionary semantics for options\nbags) — spec at docs/dictionary-defaults.md, revised against measured reality:\npartials currently pass through with JS semantics in BOTH forms (so this is a\ngated native-TJS mode, like TjsEquals, off under dialect:'js\n[…]\naliasing\ntemplate substructure into the output is caught by the I2 test.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs+spike(dictionary-defaults): land the corrected spec + Spike A ha…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-18T10:43:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2122b5b68ac56ab2a65e147f0dee023c7d96b471",
          "body": "…follow-ups\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(todo): #20 shipped as tjs-lang/import-resolver; record deferred …",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-17T13:11:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85350adb52cbd6c015f1f7acc770fc62b6837047",
          "body": "…routing core\n\nCloses #20. The playground's bundler-free bare-import machinery (TFS) becomes a\nreal export so doc systems (tosijs-ui's live-example — its module-cache-sw.js\nheader literally names this as its roadmap: \"grow this into a /lib/<spec>\nresolver... the same pattern tjs-lang uses\") can own \n[…]\nindex guard forced the llms.txt/CLAUDE.md entries (working as\ndesigned).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "feat(import-resolver): promote TFS to tjs-lang/import-resolver — one …",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-17T13:10:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6f7789a984e86f6bfd5f1748407f1dddaad6bb0",
          "body": "Patch — the critical #21 fix (bounded deep-equal/format on shared-reference\ngraphs, all five copies). One behavior change noted under Changed: Is() on\ndistinct-but-cyclic graphs terminates with a structural answer instead of\nstack-overflowing.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "chore(release): 0.10.1",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-17T11:43:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e4b387ae2d398abb1da223cc0c8854832b5250f0",
          "body": "…five copies\n\nCritical: tjs's own expect/deepEqual/format blew up exponentially on object\ngraphs with shared references (O(depth) nodes, 2^depth unfolded paths) — the\nsame defect class as oven-sh/bun#34178, and since tjs does not delegate to\nbun:test, Bun's fix did not cover us. Verified pre-fix: JS\n[…]\nirmed no test asserts on exact\nformat() output that changed.\n\nFixes #21.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "fix(#21): bounded deep-equal/format on shared-reference graphs — all …",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-17T10:54:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9497028775a855aa60aa04bed2a14d56fb5a63d7",
          "body": "Three-lane LLM taxonomy, pre-push tag-gate mechanism, and the benchmark-rot citation\nlanded in tosijs-coding-practices; UPSTREAM.md convention already existed there.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(todo): mark shared-practices follow-ups done (bc2bb89)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-16T19:30:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "650fa3ab9b05d71c8a775ff6120fe9e16c0c584b",
          "body": "Minor bump — additive features + fixes, no breaking changes. Version 0.9.1 → 0.10.0,\n[Unreleased] → [0.10.0] dated 2026-07-16, demo/docs.json regenerated (make doesn't run\ndocs; it ships in the tarball and was stale).\n\nHeadline: flight recorder (#17), framework-free editor primitives + typed codemir\n[…]\nrs; 4 majors fixed before tag, remaining\nfollow-ups tracked in TODO.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "chore(release): 0.10.0",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-16T19:17:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b0d222f1bbf1a4250617d0941ca7112c9a37725",
          "body": "…ODO, UPSTREAM.md)\n\nGO_WITH_FOLLOWUPS ⇒ file every follow-up so none evaporate.\n\n- Filed oven-sh/bun#34397 (fetch connection-refused error shape differs from Node);\n  created UPSTREAM.md as the workaround paper trail and linked it from the\n  isConnectionRefused() site in llm.ts. Indexed in llms.txt \n[…]\n.\n- Removed an unused TInteger import flagged during the review commit.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs+chore: file pre-release-review follow-ups (upstream Bun issue, T…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-16T19:16:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8cdfa26287031111237af272263eac2175e608ed",
          "body": "…for #2\n\nPre-release review (v0.9.1→0.10.0, GO_WITH_FOLLOWUPS) found 4 majors. The\nrelease-quality ones, fixed before tag:\n\n#1 coverage — the structural inline-runtime Type.check/.strip/.toJSONSchema fix\n(f4e923c) had NO assertion test: its only oracle was `tjs run` exit code, which the\nbuggy \"answe\n[…]\nhe\nsubpath (transpiler.ts) exports every documented tjs-lang/lang name.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "test+docs: close pre-release-review majors #1/#3/#4 + a narrow guard …",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-16T19:12:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "621d4f336e28705cc19620f822e14279acfd5f81",
          "body": "The reciprocal half of tosijs-ui#12 (own import resolution) now has a tracking\nissue: promote TFS from demo/ to a real `tjs-lang/tfs` export, DRYing the routing\nout of tfs-worker.js/bin/dev.ts first. Linked from both TODO references.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(todo): track TFS-export work as #20",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-15T15:44:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "de6fb4097bd940e3ac1b5ce4873a5626b1f0fa9b",
          "body": "… not pending\n\nThe checkbox said \"[ ] file it (drafted)\" but it was filed 2026-07-13 as tosijs-ui#12\n— filed but never ticked. Mark it done, link it, and record what it covers (the\ntransform/run/panels contract + the reciprocal exports we owe: #10 done, #13 open,\nTFS-as-export untracked). Adoption stays tosijs-ui's call.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs(todo): the language-plugin RFC was already filed (tosijs-ui#12),…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-15T09:52:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7b43cb3ec1b6dadafec4c8249c8df0dc0b779236",
          "body": "…akiness\n\nThe live playground-example LLM tests hit a real LM Studio, which throws transient\n400s and drops connections while models swap under memory pressure — surfaced when\na full gate run failed 8 of them, all recovering on retry once the server was\nhealthy. A bad server moment is not a code reg\n[…]\nck and the suite\nstays 49/0; healthy live run 49/0 using the real path.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "test(gate): live playground LLM tests degrade to mock on LM Studio fl…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-15T09:48:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f042c95cd28b45c043d33092282aaa69fcf6bf1",
          "body": "\"LLM tests\" were one slow, non-deterministic bucket (82.5s across two files) that\ngot skipped precisely when it mattered. Split by what each actually proves:\n\n1. Plumbing → test:fast (deterministic). The real LM Studio HTTP client\n   (getLLMCapability) now has coverage via an in-process fixture serv\n[…]\ne smoke 3/3 (3.9s); grok 20/20\nagainst e2b (advisory); typecheck clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "test(llm): three lanes by what they prove — gate LLM cost ~82s → ~4s",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-15T08:32:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d93448b70eba93b83be0933c146c8041d00f0275",
          "body": "Git has no `git tag` hook, so this fires on push and gates only pushes carrying a\ntag ref — you can create a local tag freely, but can't push (and therefore can't\nship) one with a red suite. Publishing is done from the pushed tag, so the tag's\narrival at the remote is the real gate.\n\nRuns the FULL s\n[…]\nsh runs the suite, LM-Studio-down and suite-red both abort with exit 1.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "build(hooks): enforce the full-suite pre-tag gate via pre-push",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-15T07:49:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "23e49e0723a5ea904ec8c8f5d231b5efa19d7bc0",
          "body": "test:fast skips both LLM tests and benchmarks — exactly the two categories most\nlikely to rot unseen, which is how the vector-search benchmark drifted to a 27x\nflake. For a foundational project the full suite is the gate before tagging.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FSyCDwyW668pihg2cwjtMj",
          "is_bot": false,
          "headline": "docs: full test run (bun test, not test:fast) is a hard pre-tag gate",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-14T23:04:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f4e923c465ff63b2f4bbe05d023ae9bd6c4c78ef",
          "body": "…rking examples (#19)\n\nNine bugs found while verifying the transpilation findings in MEMORY-PROFILE.md. Full suite green with nothing skipped (2418 pass, 0 fail, LLM tests + benchmarks included).\n\n**WASM**\n- Instantiation was async fire-and-forget, so `import { dot } from 'tjs-lang/linalg'; dot(a,b,\n[…]\n (there's a canary suite saying so; `:!` is the type-only opt-out), and the inline runtime is **not** interchangeable with the real one.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "fix(wasm,cli,examples): sync wasm instantiation, unique block ids, wo…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-14T23:01:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4627113619f4e6f6dfa1892fa5a0f0391817c54",
          "body": "…st (#12)\n\neditors/codemirror shipped with no .d.ts and no `types` export condition, so\nconsumers re-declared AutocompleteConfig by hand.\n\nRoot cause was upstream of the export map: `editors/**` was excluded from BOTH\ntsconfigs, so the editor sources — including the CodeMirror integration and the\nsc\n[…]\nresolver never sees it otherwise). Verified the declarations ship in the\ntarball via `npm pack --dry-run`.\n\n2381 pass, 0 fail. typecheck clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(editors): emit .d.ts + types conditions; typecheck editors at la…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-14T14:18:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "652a9b691b2200089a80259a3b746d5c50c4c756",
          "body": "`collectScopeSymbols` was real, correct, and unreachable — no build target, no\nexport subpath. So tosijs-ui hand-rolled a weaker line-based version of it for\ntheir live examples. A downstream repo re-deriving our language machinery is a\nbug in OUR export map, not in their code.\n\nNew subpath `tjs-lan\n[…]\nndle is byte-checked automatically. src/docs-index.test.ts caught the missing\nllms.txt entry, as designed.\n\n2410 pass, 0 fail. typecheck clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(editors): export the framework-free editor primitives (#10)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:56:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "780b5eef78b48fd98a7bd6768c132787757ce6f0",
          "body": "…lugin shape\n\nMy \"gated on tosijs-ui 1.7\" note was wrong: the research pass read the local\nrepo's beta branch instead of npm. npm `latest` is tosijs-ui@1.6.22 and it ships\nthe entire doc system (dist/doc-system + site + live-example, 66 files) — and it\nalready speaks TJS: live-example references tjs\n[…]\nsame layering\nviolation wearing a hat. The test that the abstraction is real: js/ts/tjs must\nbe re-expressible as plugins on the same contract.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): correct the tosijs-ui gate (it doesn't exist) + the AJS p…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:52:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f68550f3ad584e6954e5fc7a3ce2b6db6e20d708",
          "body": "bin/docs.js is literally a fork of tosijs-ui's docs.js (\"Adapted from tosijs-ui's\ndocs.js\", line 7) that fell behind. Meanwhile tosijs-ui independently rebuilt\nfive of our playground's mechanisms and hand-rolled a worse copy of our scope\nextractor because we don't export it (#10). Both repos are rei\n[…]\n1.7 ships.\n\nThis raises #10 from housekeeping to load-bearing — it's what's forcing a\ndownstream repo to maintain a worse fork of our own code.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): playground vs tosijs-ui doc system — hybrid, gated on 1.7",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:26:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "83a8d496c81012fda28b90b1e7612dd92051206a",
          "body": "Surfaced while researching whether to fold the playground into tosijs-ui's doc\nsystem. Dead regardless of that decision:\n\n- demo/src/autocomplete.ts (594) — the old regex-based completion engine,\n  superseded by introspection-driven autocomplete (autocomplete-context.ts +\n  the editors' tjsCompletio\n[…]\nodule-sw.ts (132) — never registered; superseded by tfs-worker.js.\n\nVerified: `bun run build:demo` still bundles and builds; 2373 pass, 0 fail.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(demo): delete 1,479 lines of dead playground code",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:26:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c665ed49dbf806351cbec59305af61bdfc723ddf",
          "body": "editors/codemirror/ajs-language.js imports five @codemirror/* packages as bare\nspecifiers, and package.json had NO peerDependencies key at all. It resolves on\na hoisted node_modules and hard-fails in a consumer's isolated install — and it\ncannot fail here, which is why it shipped.\n\n- peerDependencie\n[…]\ny first attempt reported 41 phantom deps).\nVerified it fails correctly: drop the peerDependencies block and it names all\nfive missing packages.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(pkg): declare the CodeMirror peers, and guard the whole class (#16)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:19:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4bebec9d6561220c03e032fda03fe9deefb23935",
          "body": "Prettier's sin isn't having opinions — it's that they changed. v3 reflows the\nwhole tree, which is why every repo here pins v2 and practices/code-quality.md\nsays don't upgrade it. If TJS's canonical form drifts between versions, every\nupgrade rewrites everyone's files and we've reinvented the pain w\n[…]\nting-only diffs in review. All scaffolding that exists only because\nformatting is a bolt-on — several pieces of which were built earlier today.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): the formatter's opinion must be stable, not merely singular",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:10:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a33d86b9b51a9e83fc1f00358a840ffa99de62c4",
          "body": "…half\n\nThe precedent is HyperTalk and RealBasic, and what they got right was WHEN, not\nwhat. They reformatted a line the moment you left it, so the canonical form was\nthe only form you ever saw: no unformatted state, nothing to diff, no\nformat-on-save, no pre-commit hook, no CI check, no formatting \n[…]\n Our dodge:\nacorn-loose is already a dependency. And the rule that keeps it from fighting\nthe typist — never reformat the line the caret is on.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): formatting — take the HyperTalk half, not just the gofmt …",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:07:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7461994453bfbd2f5772beed809d50483195df92",
          "body": "DECIDED: transpile-time issues do not belong in the flight recorder. Known at\nbuild time → lint. Only observable while running → record. If we can know it\nbefore you ship, you shouldn't learn it from a post-mortem. Predicate-\nverification misses therefore stay in result.warnings and are NOT wired to\n[…]\nelity trivia round-trip\nand idempotency make this the forcing function for a real lexer/CST, not a\npretty-printer bolted onto regex transforms.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): settle the lint/record boundary; formatting-in-the-pass idea",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:06:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43045c2b7bbfd7c73b0eb00a09406aad1fdde669",
          "body": "…otcha\n\nEscaped backticks inside inline code jammed the surrounding words together.\nIronic placement — inside the note about markdown hazards. Rewritten in prose.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix backtick-escaping that Prettier collapsed in the markdown g…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:04:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2215aa0ecb4bd45ce669c37b828dff52ec5e4ec8",
          "body": "Prettier had one real markdown offense and one false accusation, and they were\nbeing conflated.\n\nREAL: it reformats fenced code inside .md. Two separate ```js example lines,\n`'5' == 5` and `[1] == 1`, collapse into the single nonsense expression\n`;('5' == (5)[1]) == 1` (ASI guards). That is Prettier\n[…]\ncase is\npreserved verbatim, the `+`-bullet bug is still reported, and no existing\nmarkdown in the repo changes (all files stay prettier-clean).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(prettier): stop reformatting code fences inside markdown",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T16:03:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60027373676615db1e70866933353fd085f5ae2f",
          "body": "…xample\n\nCloses the loop on #17. The recorder shipped in the last three commits; a black\nbox nobody knows how to read is decoration.\n\n- guides/tjs.md + CLAUDE.md: \"Error History\" → \"Flight Recorder\". Documents\n  records()/record()/getDroppedCount() alongside errors(), and states the two\n  rules that\n[…]\n a wrapped `+` that CommonMark ate as a bullet — the same defect found in\nCHANGELOG.md this morning, now written up in tosijs-coding-practices.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: the flight recorder — CLAUDE.md, guide, changelog, playground e…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T15:45:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f8032191243ab0da992dc050969be14209704a11",
          "body": "Phase 3 of #17. The recorder existed; nothing was plugged into it.\n\nWASM (js-wasm.ts) — every failure mode here was quiet, which is how you ship a\npage that says \"⚡ WebAssembly SIMD\" and runs JavaScript with all tests green:\n\n  - Non-wasmBuffer typed array (#9): the wrapper copies it in and out on E\n[…]\nds() without making getErrorCount()\nand errors().length disagree — both are public and must stay coherent.\n\n2389 pass, 0 fail. typecheck clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(runtime): wire wasm + VM instruments into the flight recorder",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T12:39:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45abfc384966dbdc39e3044a3a078bb433e4962f",
          "body": "… core\n\nPhase 2 of #17.\n\nEmitted modules each call globalThis.__tjs.createRuntime(), which hands out an\nISOLATED ring — so a page with three TJS modules had three separate black\nboxes and no single answer to \"what happened before the crash\". Instance\nrecorders now mirror into the installed global ru\n[…]\nay), but it was held shut\nby coincidence rather than design. Now one definition, pushed once, with a test.\n\n2382 pass, 0 fail. typecheck clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(runtime): wire the recorder into emitted code; de-dup the inline…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T09:40:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "afaa65f05f660e439dccfdcc571181bfac371122",
          "body": "…tays narrow\n\nPhase 1 of #17. The ring buffer had exactly one writer (typeError), so\n__tjs.errors() looked general and came back empty when plenty had gone wrong.\n\nScoping found the buffer was implemented TWICE — module-level and again\nper-instance inside createRuntime() (which is what emitted code \n[…]\ndebugging\nsession with no evidence.\n\nNot yet wired: emitters + VM + wasm + predicate sources (phases 2-3).\n\n2375 pass, 0 fail. typecheck clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(runtime): flight recorder — one ring, tagged records, errors() s…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-13T09:22:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4f51ea0ae914991cb4cb3ed752ef378d509ff35",
          "body": "AGENTS.md has always said \"never --no-verify to bypass hooks\" — but there were\nno hooks. The format/typecheck/test gate was purely manual, which is how\nCHANGELOG.md got committed having never seen Prettier (taking a broken `+`\nbullet with it).\n\n.githooks/pre-commit checks STAGED FILES ONLY: prettier\n[…]\nequivalent for CI/verification.\n\nVerified both directions: an unformatted staged file is rejected, a clean one\npasses with both checks running.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add a pre-commit format gate (staged files only)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-12T22:25:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7360eda5f55f3b3cc6f74d1b7b7e783dd6b162b2",
          "body": "The \"update both files\" rule in CLAUDE.md was a habit, not a guardrail, and it\nhad already drifted. src/docs-index.test.ts makes it enforceable:\n\n  1. every top-level and docs/ markdown file is linked from llms.txt\n  2. every package.json `exports` subpath is named in llms.txt\n  3. every relative li\n[…]\npredicate\". Rewrapped so the + can't land at line start. Same family as the\nprettier-mangles-md-code-blocks footgun already noted in CLAUDE.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: guard llms.txt completeness; fix a prettier-mangled CHANGELOG line",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-12T21:49:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab8c9539ab563a4fdb72474c29f7f5a934f5f253",
          "body": "CLAUDE.md\n- add `lint` + the partial-build scripts (build:bundles/build:demo), so\n  iterating on one target doesn't require the full `make` (which nukes dist/)\n- add the six undocumented src/lang files (core, dialect, tests, docs, schema,\n  metadata-cache); core.ts especially — it's the TS-free impo\n[…]\nin-spirit console.log scratch from 537ca2b\n(class support). Nothing imports it; preprocess() and private fields are both\ncovered by real tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: sync CLAUDE.md + llms.txt with the repo; drop dead scratch script",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-12T21:25:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7aac072c9c70b17b73c4a3e8e3c7a35806483b64",
          "body": "…oc ethos\n\nPoint at https://github.com/tonioloewald/tosijs-coding-practices (and the local\nsibling checkout). Adds the observant-not-reactive framing and the living-document\nethos: don't rewrite unprompted, but voice concerns and suggest improvements.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: link shared coding-practices KB (hosted + local); note living-d…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T19:43:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6ef16081295d1930e49dd1bdd133bb03695fb401",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add CHANGELOG.md (Keep a Changelog), backfilled 0.8.0–0.9.1",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T19:35:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4d67ae0711718ba8ef477f32425acd8be959b107",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): mark 0.9.1 SHIPPED (npm latest = 0.9.1, tag pushed)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T19:16:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2e8cf8a62c03bc0d98b291838387312ec7d813e8",
          "body": "…collision)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: explain why the full build is `make`, not `build` (bun builtin …",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T19:15:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fd109417aa30615ed22188c9b8f4e162e8176c14",
          "body": "…ruth for types\n\nRecords a strategic direction + decision lens (user-set, possibly post-1.0): a TJS\ntype is canonically a JSON-Schema node optionally carrying a $predicate (the\ncomputational half JSON-Schema can't express). Examples-as-types, TS-derived types,\nType/Generic, and TypeDescriptor are su\n[…]\nem-north-star.md (full design note + open questions)\n- PRINCIPLES.md (the principle + decision lens)\n- CLAUDE.md doc index pointer\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: north star — JSON-Schema + $predicate as the single source of t…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T11:38:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43915e75ff934cf70f5e8ed75e22d40ab90773cd",
          "body": "Completes UI-#4 (was docs-only): the wasm binary-expr compiler now warns when `/`\nhas two i32 operands (loop vars / int literals) — the truncating-division footgun\nthat silently broke a Mandelbrot kernel. One warning per block, suggesting the\n`+ 0.0` fix; fires only on genuine i32/i32 (i32/f64 is fi\n[…]\n/i32, once per block,\nnot on float division). Full suite green (2392). This closes the entire tosijs-ui\nWASM feedback (UI-#1..#7).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(wasm): auto-lint i32/i32 integer division (UI-#4 complete)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T11:28:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c996abeee787d22a57dbc64b1030daa0c235306",
          "body": "Release prep. Ships (post-0.9.0):\n- TjsStrict escalates unverifiable Type/Generic predicates to a transpile error\n  (+ a distinguishing `tjsStrict` mode flag) — completes the #5 warn/strict tail.\n- The full tosijs-ui inline-WASM feedback: silent wasm{} fallback surfaced into\n  result.warnings (UI-#1\n[…]\nilt at 0.9.1 and validated end-to-end in Node from the\npacked tarball (fresh npm install, no typescript). Full suite green (2389).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.9.1",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T10:39:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57124e8d3b024526e4dac29d2ec9679ee33dbd41",
          "body": "…gun (UI-#5, UI-#4)\n\nTwo documentation gaps from the tosijs-ui inline-WASM adoption:\n\n- UI-#5: DOCS-WASM.md § \"Supported subset inside wasm{}\" — an explicit list of\n  what's allowed (numeric locals, nested `for` with numeric bounds, if/else,\n  &&/||, typed-array element access, math intrinsics, SIMD\n[…]\ne warnings channel (the compiler currently has only\nctx.errors), mirrored into result.warnings like the silent-fallback surfacing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(wasm): supported control-flow subset + the i32/i32 division foot…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T10:16:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f75aef53d769e71aea24ee84fdb201b66d7952b5",
          "body": "…-#3)\n\nInline wasm{} instantiates asynchronously, so sync code right after transpile+eval\ntook the JS fallback with no way to await it — and there was no public lever to\nforce the fallback for benchmarking.\n\n- UI-#2: each module pushes its instantiation promise onto\n  `globalThis.__tjs_wasm_pending`\n[…]\n Tests: src/lang/wasm-ready.test.ts (3 — ready resolves,\nmulti-module pending, enable/disable via a spy). Full suite green (2389).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(wasm): awaitable ready signal + enable/disable toggle (UI-#2, UI…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T10:14:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f58760fa2ca15f53608b3e48800a43968c4935d",
          "body": "…MD) — UI-#6\n\nThe single biggest SIMD limiter (tosijs-ui feedback): f32x4 was arithmetic-only,\nso masked/data-dependent SIMD (clamp, saturate, per-lane escape masking à la SIMD\nMandelbrot) was impossible. Adds to the wasm compiler:\n\n- f32x4_min / f32x4_max (arithmetic; opcodes 0xe8/0xe9)\n- f32x4_eq/\n[…]\n\n(wasm-simd-ops.test.ts, 7). DOCS-WASM.md updated with the compare→mask→select\npattern + a clamp example. Full suite green (2386).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(wasm): f32x4 min/max, comparisons, and select (data-dependent SI…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-11T08:52:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "006ce90f0dc445f50f90daeb3a14c22168f945fc",
          "body": "…-#1)\n\nA `wasm{}` block that can't compile falls back to its `fallback{}` (JS). The\nfailure was recorded on `result.wasmCompiled` (per-block `success:false`+`error`)\nbut nowhere a consumer looks, so WASM looked like it \"worked\" when it was running\nthe JS fallback — the worst failure mode for a perf \n[…]\nped array parameter\"), a working SIMD block does not.\n\nTests: src/lang/wasm-fallback-warning.test.ts (2). Full suite green (2379).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(wasm): surface silent wasm{} fallback as a warning (tosijs-ui UI…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-06T13:17:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae33c7654e2f012b6376de56431a7e04e79a14dd",
          "body": "…ranspile error\n\nCompletes the #5 warn-on-fallback tail. By default an unverifiable Type/Generic\npredicate warns (surfaced last commit); now under the explicit `TjsStrict`\ndirective it throws a transpile error naming the predicate(s) + reason — the\nsubset-invariant policy (warn by default, error onl\n[…]\n\nTests: predicate-report.test.ts (8 — strict throws / non-strict warns / strict +\nsafe predicate passes). Full suite green (2377).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predicate): TjsStrict escalates an unverifiable predicate to a t…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-06T12:23:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11fcbc64c7fcc502630289e8d0c06b2657bc8bdf",
          "body": "…onsumer repos\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): 0.9.0 is published (verified on npm); adoption owned by c…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-06T12:14:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "577d5439568da0b4eab8c0f5750099b89841dc13",
          "body": "Release prep. Ships (25+ commits since 0.8.7): predicate verification wired into\nType + Generic (fuel-bounded DoS-safe guards, graceful fallback) + ReDoS lint +\nper-predicate status on the tjs() result; the $predicate keyword +\ncreatePredicateEvaluator + tjs-lang/schema (tosijs-schema 1.4.0, batteri\n[…]\ndist built at 0.9.0 and validated end-to-end in Node from the packed tarball\n(fresh npm install, no typescript). Full suite green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "0.9.0",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-06T11:34:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec0c6f832b853456111815aa325a8423a93b6cf8",
          "body": "…lved on main)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(todo): log tosijs-ui adoption feedback (7 items; editors #7 reso…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-06T04:31:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91e1ed94152f9e0c711bd04c1801e738ad61ac1e",
          "body": "Formatting-only from `bun run make` (prettier + eslint --fix); no logic change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: format (make) — reflow TODO + drop a stale eslint-disable",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-06T04:15:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3c7f55b1bb2c9f32f0d7dffc7b9c003840d28a34",
          "body": "…js() result\n\nThe #5 warn-on-fallback tail (= tosijs-port #9, wanted by two consumers). Today an\nunverifiable Type/Generic predicate silently falls back to a plain function; now\nthe transpile result reports it.\n\n- `result.predicates: PredicateVerification[]` — per-declaration\n  `{ name, kind: 'Type'\n[…]\n2374). Still open: strict-mode escalation (warning → error under\nTjsStrict) — the signal + channel now exist, just needs the gate.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predicate): surface Type/Generic predicate verification on the t…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-06T04:13:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9b12a0cc745d4489bbe8f72c96193ebc86ac2e9b",
          "body": "… + export generateDTS\n\nTwo tosijs-port DX items (../tosijs/TJS-PORT-DX.md):\n\n#11 (real bug): the auto `.d.ts` emitted bare untyped params as optional, so\n`f(a, b: 0)` became `f(a?: any, b: number)` — INVALID TS (ts1016: an optional\nparam can't precede a required one), not merely loose. Root cause: \n[…]\nter tsc — so auto-`.d.ts` is a migration-bridge\nconvenience judged by correctness (valid TS), not polish. Full suite green (2339).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(dts): bare params are required positions, not optional (valid TS)…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-05T14:51:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "220ab8283be6736cdd6fedaa17ecb5d8883565d9",
          "body": "…w() hint\n\nQuick wins from the tosijs 2.0 port DX feedback (../tosijs/TJS-PORT-DX.md):\n\n- #2 Public subpaths so downstream adoption is one line, not reaching into src/:\n  - `tjs-lang/runtime` → src/lang/runtime.ts (createRuntime/installRuntime/Eq/\n    NotEq/Is/IsNot/TypeOf/checkType/isMonadicError).\n[…]\nd.\n\nVerified: tjs-runtime bundle builds; runtime + bun-plugin source entries import\nand run; typecheck clean; TjsDate tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: tjs-lang/runtime + tjs-lang/bun-plugin exports; TjsDate perf.no…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-05T06:46:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc958cd928d24d8d74867673a1485f3d1b7e180c",
          "body": "…rors\n\nThe \"validates real style objects\" payoff over structure-only checking.\n`isStyleValueFor(prop, val)` dispatches on the property name and tightens ONLY\nthe closed value grammars — color props → isColorValue, animation → isAnimation,\ntransition → isTransition — so isStyleObject now rejects `{co\n[…]\nbackground\nshorthands (nice-to-have). Deferred: length/number precision needs per-property\nkeyword sets to avoid false rejections.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(css): property-aware validation — isStyleObject catches value er…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-04T23:09:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e205be53687940ca3f66e65f7d9470c2bf14e2ce",
          "body": "Capture the headline use (user): type-check + autocomplete against a runtime\nyou're not running in (edit in Node, target the browser). A probed contract is a\nserializable predicate, so capture and consumption decouple in time/space —\nbottle the real target once, consume it Node-side with no target p\n[…]\ns suggest(). Plausible here because\nthe format ($predicate/tjs-lang/schema) and the autocomplete introspection hook\nalready exist.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(ambient): the payoff — author against a non-ambient target env",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-04T22:16:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d5f20535929e19f26eb0287f9a80a86ec2da920b",
          "body": "From live-Chrome probing (haltija /eval), added to the design note:\n- builtins reject `new` (Illegal constructor) — use the constructor's .prototype\n  chain for shape, statically, no instance;\n- the manager vends the type (createElement('div').constructor === HTMLDivElement)\n  — factory output gives\n[…]\n- generalizes to Node/Bun internals (process/Buffer/node:*/Bun.*) — same tool,\n  cross-runtime portability instead of cross-frame.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(ambient): real-browser findings + node/bun generalization",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-04T21:49:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c19ce958c4ebcd6926849286623caf1700597f74",
          "body": "…py-dom)\n\nExtends the ambient-contracts spike with the key finding from trying it out:\nhost objects hide their surface on the PROTOTYPE (Object.keys(style) ≈ empty,\nyet typeof style.setProperty === 'function'). So probeShape now walks the\nprototype chain (or a scoped `keys` list — recommended, since\n[…]\n\n  (isColorValue) — the convergence.\n- docs/ambient-contracts.md: \"Findings from the first spike\" section.\n\n7 ambient tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "spike(ambient): probe a real host object (CSSStyleDeclaration via hap…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-04T21:44:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e6e83a1b5793fd67463ce1d6957c3aa1ec93c5c",
          "body": "…ntracts\n\nDesign note + first spike for an idea (user-originated): tooling that probes a\nreal ambient runtime environment (DOM, host objects) and derives serializable\npredicate CONTRACTS for the surface a program uses, then a conformance harness\ncertifies a stand-in (happy-dom, a VM capability) agai\n[…]\nal `CSSStyleDeclaration`/`event.target` in a live browser\n(Claude-in-Chrome), diff a happy-dom stub — converges with tjs-lang/css.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(idea): ambient contracts — probe reality → verified predicate co…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-04T21:41:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eaca8873e5735d5e8e151a8f734a631f71b0f979",
          "body": "Validates a theme-sized style object (~50 rules × ~12 leaves + hover/focus/media\nnesting ≈ 600 values) with the COMPLETE predicate set (colors + dimensions +\nshorthands + recursive structure), and times it. Gated by SKIP_BENCHMARKS.\n\nNumbers (bun, M-series): ~0.5 ms to validate a whole theme (~1970 \n[…]\n.\n\nThis lands CSS phases 1–5. Remaining #4 tail (font/background shorthands,\nproperty-aware isStyleValue) is refinement, not core.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(css): phase 5 — \"safe is fast\" perf on a theme-sized spec",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-04T16:46:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a1bf6076fa872d75c954866a10a7221cb37dd3b",
          "body": "The PoC's second torture case: shorthand tokens in any order\n(`3s ease-in 1s infinite alternate slidein` ≡ any permutation).\n\n- src/css/shorthands.ts (cluster = dimension leaves + classifiers): isAnimation,\n  isTransition (comma-separated, order-free), isTimingFunction (keywords +\n  cubic-bezier/ste\n[…]\nen).\n\n103 css tests total; bundle 16.9KB/6.4KB gz. Deferred: font/background\n(slash-syntax + layers), property-aware isStyleValue.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(css): phase 3 — order-flexible shorthands (animation, transition)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-04T16:41:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5291a0be8fc86eed8c92448520b82d6220b3f21c",
          "body": "…e support\n\nThe ergonomic capstone of #6: a batteries-included entry so consumers get\npredicate-aware JSON-Schema validation with zero wiring. Lives in tjs-lang (not\ntosijs-schema) because the dependency runs that way — the reverse would be\ncircular.\n\n- Bump tosijs-schema dep → ^1.4.0 (the published\n[…]\n, validates cssColorSchema/cssStyleSchema out of the box,\nopt-out falls back to structural-only, custom fuel budget. Docs updated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(schema): tjs-lang/schema — tosijs-schema pre-wired with predicat…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-03T18:50:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "117ef5725e024128657e490b93d0558aa4430b22",
          "body": "Latent bug from the Type/Generic verification work (#5): each verified guard\nemitted a fixed `function __pred(...)` inside its IIFE. Two verified predicates\nin one module produced two nested `function __pred`s, which the polymorphic-merge\ntransform (runs after Type/Generic transforms) treated as amb\n[…]\nked engine fn not in that parser-only bundle),\nso inject the native one into the bundle scope.\n\nFull core suite green (2292 pass).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(predicate): unique per-declaration guard names (no __pred collision)",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-03T18:49:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f035ed39eb461482ec240ca68c0ce7508335565",
          "body": "…ate bridge\n\nThe consumer side of #6. tosijs-schema now exposes a pluggable `$predicate`\nevaluator hook (it can't depend on tjs-lang — the dependency runs the other way);\nthis factory produces the evaluator a consumer injects.\n\n`createPredicateEvaluator(opts)` → `(source, value) => boolean`: verifie\n[…]\nest.ts (4).\n\nTODO: pre-wired `tjs-lang/schema` export (encapsulate the glue) — blocked on\npublishing the tosijs-schema hook first.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predicate): createPredicateEvaluator — the tosijs-schema $predic…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-03T15:16:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f16957edf8ab8f810e1eaa35446afa3e850826f4",
          "body": "The thesis deliverable (\"JSON-Schema's missing computational half\"), end-to-end.\n\n- src/css/style.ts: CSS_STYLE_SOURCE composes the color + dimension leaf clusters\n  with the recursive structure predicates — isCssProperty (incl. custom `--props`\n  and vendor prefixes), isSelectorOrAtRule, isStyleVal\n[…]\nrejects it. 90 css+schema tests green; bundle 14.0KB/5.4KB gz.\nRemaining #4: phase 3 (shorthands), phase 5 (perf on a real theme).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(css): phase 4 — recursive style structure + $predicate JSON-Schema",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-03T14:43:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "96f11c97b9e8a9e9435c0727411ab8025f04b5cc",
          "body": "Extends tjs-lang/css (#4) with the numeric leaf grammar, same verified-source\npattern as colors.\n\n- src/css/dimensions.ts: isLength (full CSS Values 4 unit set —\n  font-relative/viewport/container/absolute — plus unitless `0` and var/calc),\n  isPercentage, isNumber/isInteger (numeric values + numeri\n[…]\non), namespacing diagnostics by cluster.\n\n31 tests (src/css/dimensions.test.ts); 70 css tests total green. Bundle\n12.1KB/4.8KB gz.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(css): phase 2 — dimensions, numbers, angles, times, keywords",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-03T12:42:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73358a614d6ed904d91de32a3d9b87ee5a04e36d",
          "body": "Starts the real CSS predicate library (#4) — the predicate-types thesis made\nshippable: precise, total validators for the open value grammars TS/JSON-Schema\ncave to `string` on, built entirely from verified-safe predicate source.\n\nNew `tjs-lang/css` subpath (`src/css/`):\n- `predicates.ts` — canonica\n[…]\ns.txt, TODO.md (phases 2–5 scoped: lengths/dimensions, shorthands, recursive\nstructure + $predicate schema, perf on a real theme).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(css): tjs-lang/css phase 1 — verified-predicate color validators",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-03T12:38:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9087a4b3874a4682bc3a85df173ac9c39980862d",
          "body": "Extends predicate verification (#5) from Type to Generic. A Generic predicate\ncomposes with its type-param checks (`predicate(x, T){ … T(x.value) }` → the\ntype-param call is rewritten to `checkT(x.value)`); those checks are now passed\nto the verifier as `knownPredicates`, so it treats them as compos\n[…]\n standalone output — orthogonal to and\npredating this verification change (the guard itself composes correctly given\nreal checks).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predicate): verify Generic-Type predicate bodies too",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-03T07:54:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9bdd1c40d3f03ee293f8789414c463895576888c",
          "body": "A regex match is the one primitive fuel can't bound — a single `.test`/`.match`\nis opaque to the function-entry fuel hook, so a catastrophic-backtracking pattern\ncould hang a validator on hostile input. Certifying such a predicate \"safe\" would\nbe a false guarantee, so `verifyPredicate` now analyzes \n[…]\ns pass,\nend-to-end Type fallback + verified paths). CSS corpus unaffected (no false\npositives); full lang suite green (1219 pass).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predicate): reject ReDoS-prone regexes in the verifier",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-03T06:03:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f5d53495b1322e56fd77f2543bc2952a0e906fd",
          "body": "…ive guards\n\nWires the predicate engine into `Type … { predicate(x){…} }` (predicate-push #5,\nType side). At transpile time a Type predicate body is run through the safety\nverifier: if predicate-safe (pure/sync — no loops/await/new/IO) it compiles to a\nself-contained, fuel-bounded native guard; if n\n[…]\nTODO): warn/strict-error on fallback (needs a warnings\nchannel), and extending verification to Generic + FunctionPredicate bodies.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predicate): compile verified Type predicates to fuel-bounded nat…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-02T20:51:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "01e2010e18902d1813eb3f381d6e508e6e08c003",
          "body": "… drift\n\nThe `editors/{codemirror,monaco,ace}/*.js` files are what npm consumers import\n(the `./editors/*` subpaths), but they were hand-maintained and had drifted\nmonths behind their `.ts` sources — codemirror's `.js` was a Jan-2026 CDN-example\nexporting a stale `createAjsExtension` API while `ajs-\n[…]\nted `.js`, so a `.ts` edit without a\n  rebuild fails CI. (Verified it catches a real value change.)\n- CLAUDE.md / TODO.md updated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build(editors): bundle tjs-lang/editors/* from source + guard against…",
          "author_name": "Tonio Loewald",
          "author_login": "tonioloewald",
          "committed_at": "2026-07-02T16:34:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 17,
      "commits_last_year": 656,
      "latest_release_at": "2026-07-20T14:57:59Z",
      "latest_release_tag": "v0.12.0",
      "releases_from_tags": true,
      "days_since_last_push": 2,
      "active_weeks_last_year": 26,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 2.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "tjs-lang",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "typescript",
            "transpiler",
            "runtime-validation",
            "type-safety",
            "sandbox",
            "virtual-machine",
            "wasm-alternative",
            "ai-agents",
            "llm",
            "orchestration",
            "security",
            "fuel-metering",
            "capability-based",
            "json-ast",
            "untrusted-code"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/tjs-lang",
          "is_deprecated": false,
          "latest_version": "0.12.0",
          "repository_url": "https://github.com/tonioloewald/tjs-lang",
          "versions_count": 62,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 4274,
          "first_published_at": "2026-01-29T16:42:27.107000Z",
          "latest_published_at": "2026-07-20T14:59:51.278000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 5,
      "watchers": 2,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 12
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "functions/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 420975,
      "source_files_sampled": 287,
      "oversized_source_files": 9,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 55294
    },
    "dependencies": {
      "manifests": [
        "functions/package.json",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 4,
        "malicious_count": 0,
        "assessed_package": "npm:tjs-lang@0.12.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "firebase-admin",
          "manifest": "functions/package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.6.1"
        },
        {
          "name": "firebase-functions",
          "manifest": "functions/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.5"
        },
        {
          "name": "acorn",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.15.0"
        },
        {
          "name": "acorn-loose",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.5.2"
        },
        {
          "name": "acorn-walk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.3.4"
        },
        {
          "name": "tosijs-schema",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.0"
        }
      ],
      "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": 3,
        "open_issues": 12,
        "closed_ratio": 0.4,
        "closed_issues": 8,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "tonioloewald",
          "commits": 656,
          "avatar_url": "https://avatars.githubusercontent.com/u/979455?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": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "76 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "4cbb5c20c573a0c455d7db9066ef357000bcadcb",
        "ran_at": "2026-07-27T01:33:31Z",
        "aggregate_score": 2.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-24T07:34:35Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-14T23:01:02Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 3,
          "created_at": "2026-07-12T09:13:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 4,
          "created_at": "2026-07-12T09:13:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 5,
          "created_at": "2026-07-12T09:13:58Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 6,
          "created_at": "2026-07-12T09:13:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 7,
          "created_at": "2026-07-12T09:14:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 9,
          "created_at": "2026-07-12T13:13:16Z",
          "last_comment_at": "2026-07-13T16:05:35Z",
          "last_comment_author": "tonioloewald"
        },
        {
          "number": 11,
          "created_at": "2026-07-12T13:14:24Z",
          "last_comment_at": "2026-07-13T07:51:47Z",
          "last_comment_author": "tonioloewald"
        },
        {
          "number": 13,
          "created_at": "2026-07-12T13:14:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 14,
          "created_at": "2026-07-12T13:14:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 18,
          "created_at": "2026-07-13T09:16:31Z",
          "last_comment_at": "2026-07-13T09:30:17Z",
          "last_comment_author": "tonioloewald"
        },
        {
          "number": 22,
          "created_at": "2026-07-19T14:14:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 23,
          "created_at": "2026-07-21T12:42:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/tonioloewald/tjs-lang",
    "host": "github.com",
    "name": "tjs-lang",
    "owner": "tonioloewald"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 42,
        "vitality": 84,
        "community": 36,
        "governance": 52,
        "engineering": 56
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 84,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "commits_last_year": 656,
              "human_commit_share": 1,
              "days_since_last_push": 2,
              "active_weeks_last_year": 26
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "26/52 weeks with commits",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 26
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "656 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 656
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 17,
              "latest_release_tag": "v0.12.0",
              "releases_from_tags": true,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 2.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "17 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~2.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 2.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "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": 36,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "forks": 0,
              "stars": 5,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "5 stars",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "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": 60,
            "inputs": {
              "packages": [
                "tjs-lang"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 4274
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "4,274 downloads/month across npm",
                "points": 48.4,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 4274,
                      "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": "moderate",
        "name": "Sustainability & Governance",
        "value": 52,
        "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": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "merged_prs": 3,
              "open_issues": 12,
              "closed_issues": 8,
              "issue_closed_ratio": 0.4,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "40% of issues closed",
                "points": 18.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 40
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "3/3 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 3,
                      "decided": 3
                    }
                  }
                ],
                "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": 55,
            "inputs": {
              "followers": 17,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "tonioloewald",
              "public_repos": 74,
              "account_age_days": 5460
            },
            "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": "17 followers of tonioloewald",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 17,
                      "login": "tonioloewald"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "74 public repos, account ~14 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 74
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "tjs-lang"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "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 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "62 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 62
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 56,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "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": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 42,
        "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": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 2.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "76 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:tjs-lang@0.12.0 runtime dependency closure — what installing the published package pulls in — 4 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:tjs-lang@0.12.0",
                  "assessed": 4
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 4,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 4,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 55294
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "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": 71,
            "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": true,
              "typecheck_configs": [
                "functions/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 1,
              "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": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "functions/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "functions/tsconfig.json, 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": "100 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 420975,
              "source_files_sampled": 287,
              "oversized_source_files": 9
            },
            "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": "9/287 source files over 60KB",
                "points": 53.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 287,
                      "oversized": 9
                    }
                  }
                ],
                "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",
    "Could not fetch npm package 'tjs-platform-functions' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T01:33:36.617244Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/tonioloewald/tjs-lang.svg",
  "full_name": "tonioloewald/tjs-lang",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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.