Public record
Software health reportschema 0.27.0 · metrics 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 stars⑂ 0 forkssince Jan 2026View on GitHub ↗

tonioloewald/tjs-lang holds a health index of 55 out of 100, placing it in the Moderate band. It scores highest on Vitality (84/100) and lowest on Community & Adoption (36/100). It was last updated 2 days ago. A single contributor accounts for most of its recent work.

55
overall / 100
Moderate

Software health index

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

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

Score profile

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

Ownership

Tonio LoewaldPersonal account
17 followers74 public repossince Aug 2011Loewald Consulting

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

Package ecosystems

Metrics by category

Vitality

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

84Good · 22% of overall
How it's scored
36/36Push recency — last push 2 days ago
18/36Commit cadence — 26/52 weeks with commits
18/18Commit volume — 656 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year656
human_commit_share1
days_since_last_push2
active_weeks_last_year26
How it's scored
16.2/27Ships releases — 17 version tags (no GitHub releases)
36/36Release recency — latest release 6 days ago
27/27Release cadence — a release every ~2.7 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count17
latest_release_tagv0.12.0
releases_from_tagsyes
days_since_latest_release6
mean_days_between_releases2.7
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

36At risk · 18% of overall
How it's scored
9.8/60Stars — 5 stars
0/25Forks — 0 forks
0/15Watchers — 2 watchers
Inputs used
forks0
stars5
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (Apache-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
48.4/80Monthly downloads — 4,274 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagestjs-lang
dependents
ecosystemsnpm
total_downloads
monthly_downloads4,274
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

52Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
18.7/46.8Issue resolution — 40% of issues closed
38.2/38.3PR acceptance — 3/3 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs3
open_issues12
closed_issues8
issue_closed_ratio0.4
closed_unmerged_prs0
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
9/25Owner reach — 17 followers of tonioloewald
25/25Track record — 74 public repos, account ~14 yr old
Inputs used
followers17
owner_typeUser
is_verified
owner_logintonioloewald
public_repos74
account_age_days5,460
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 6 days ago
20/20Version history — 62 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagestjs-lang
ecosystemsnpm
any_deprecatedno
min_days_since_publish6

Engineering Quality

Are baseline engineering and documentation practices in place?

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

Documentation

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

Security

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

42At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — no data
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — no data
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 20 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — no data
0/5Pinned-Dependencies — no data
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — no data
0/7.5Vulnerabilities — 76 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2.7
Excluded from scoring (no data or not applicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages4
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:tjs-lang@0.12.0 runtime dependency closure — what installing the published package pulls in — 4 packages. Reachability is not analyzed.

AI Readiness

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

79Good · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md
15/15Machine-readable docs (llms.txt) — llms.txt present
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtyes
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes55,294
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — eslint.config.js
11/11Static type checking — functions/tsconfig.json, tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 100 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — no data
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configsfunctions/tsconfig.json, tsconfig.json
agent_commit_share1
toolchain_manifests
dependency_bot_commit_share0
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
53.3/55Manageable file sizes — 9/287 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes420,975
source_files_sampled287
oversized_source_files9
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

5GitHub stars
1contributors
656commits, last 12 months
2days since last push
17releases
1bus factor
12open issues
npmpackage ecosystems

Data collection 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

More detail

OpenSSF Scorecard 2.7 / 10
2.7aggregate

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
n/aDangerous-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
n/aPackagingpackaging workflow not detected
n/aPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
n/aToken-PermissionsNo tokens found
0Vulnerabilities76 existing vulnerabilities detected
Direct dependencies 6
RegistryPackageVersion constraintManifest
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
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Dependency advisories 0

Installing npm:tjs-lang@0.12.0 pulls in 4 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

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

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "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"
}

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

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

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