公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-25 02:39 UTC

Noisemaker111 / jgengine

Genre-agnostic TypeScript game engine SDK — pure core plus React, Convex, WebSocket, Node host, and Postgres adapters

TypeScriptApache-2.0★ 5 星标⑂ 0 复刻始于 2026年7月在 GitHub 上查看 ↗

Noisemaker111/jgengine 的健康指数为 100 分中的 58 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(81/100),最低的是Community & Adoption(40/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

58
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

58
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

NoisemakerJon个人账户
5 关注者33 个公开仓库始于 2023年7月

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@jgengine/core0.14.03,230155 天前jgengineagent-firstgame-frameworktypescript-game-frameworktypescriptmultiplayergame-engine
npm@jgengine/assets0.14.01,415115 天前
npm@jgengine/convex0.14.01,871145 天前
npm@jgengine/editor0.14.074455 天前
npm@jgengine/github0.1.07618 天前
npmjgengine0.11.01,777105 天前jgengineagent-firstgame-frameworktypescript-game-frameworktypescriptjavascriptthree.jswebglai-agentagent-skillsscaffoldcli

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

64中等 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
2.1/36提交节奏 — 52 周中有 3 周有提交
18/18提交量 — 最近一年 1,029 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year1,029
human_commit_share1
days_since_last_push0
active_weeks_last_year3

发布纪律

76良好
评分方式
27/27有发布版本 — 已发布 1 个发布版本
36/36发布时效 — 最近一次发布版本于 13 天前
12.6/27发布节奏 — 节奏未知(仅一次发布)
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count1
latest_release_tagpacks
releases_from_tags
days_since_latest_release13
mean_days_between_releases

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

40存在风险 · 占总体的 18%
评分方式
9.8/60星标 — 5 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars5
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

57中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
52.8/80月度下载量 — npm 合计每月 9,113 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@jgengine/core, @jgengine/assets, @jgengine/convex, @jgengine/editor, @jgengine/github, jgengine
dependents
ecosystemsnpm
total_downloads
monthly_downloads9,113
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

56中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
1.7/22.5提交分布 — 头号贡献者编写了 92% 的提交
4.1/13.5贡献者广度 — 3 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled3
top_contributor_share0.925
评分方式
44.1/46.8议题解决 — 94% 的议题已关闭
35.9/38.3PR 接受 — 已裁定的 PR 中 885/942 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs885
open_issues35
closed_issues576
issue_closed_ratio0.943
closed_unmerged_prs57
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
5.6/25所有者影响力 — Noisemaker111 有 5 位关注者
17.2/25既往记录 — 33 个公开仓库,账户约 3 年
所用输入
followers5
owner_typeUser
is_verified
owner_loginNoisemaker111
public_repos33
account_age_days1,105
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 6 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 15 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@jgengine/core, @jgengine/assets, @jgengine/convex, @jgengine/editor, @jgengine/github, jgengine
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

基础的工程与文档实践是否到位?

81良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 6 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

100优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://jgengine.com
10/10仓库描述
10/10主题标签 — 8 个主题标签
10/10Wiki
所用输入
topicsai-agents, game-development, game-engine, javascript, react, threejs, typescript, webgl
has_wiki
homepagehttps://jgengine.com
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

42存在风险 · 占总体的 16%

安全态势

27危急
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
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
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 13 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate2.7
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages3
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 npm:jgengine@0.11.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 3 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

73良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md, Games/ironhold/AGENTS.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md, Games/ironhold/AGENTS.md
agent_instruction_max_bytes14,242
评分方式
12.6/18一条命令的引导启动 — apps/desktop/src-tauri/Cargo.toml(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Games/claudecraft/tsconfig.json, Games/duet-keys/tsconfig.json, Games/ironhold/tsconfig.json, Games/loopline/tsconfig.json, Games/spire-cards/tsconfig.json, Games/starhome/tsconfig.json, Games/studio-showcase/tsconfig.json, Games/the-robots/tsconfig.json, Games/tower-guard/tsconfig.json, Games/vice-isle/tsconfig.json, Games/wreckway/tsconfig.json, apps/desktop/tsconfig.json, apps/dev/tsconfig.json, apps/web/tsconfig.json, examples/ark-survival-kit/tsconfig.json, examples/convex-host/tsconfig.json, examples/express-host/tsconfig.json, examples/next-host/tsconfig.json, examples/studios/tsconfig.json, examples/tanstack-host/tsconfig.json, packages/assets/tsconfig.json, packages/convex/tsconfig.json, packages/core/tsconfig.json, packages/editor/tsconfig.json, packages/github/tsconfig.json, packages/jgengine/tsconfig.json, packages/node/tsconfig.json, packages/react/tsconfig.json, packages/shell/tsconfig.json, packages/sql/tsconfig.json, packages/ws/tsconfig.json, registry/tsconfig.json
10/10可复现环境 — Dockerfile
10/10已体现的代理实践 — 最近 100 次提交中有 88 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsGames/claudecraft/tsconfig.json, Games/duet-keys/tsconfig.json, Games/ironhold/tsconfig.json, Games/loopline/tsconfig.json, Games/spire-cards/tsconfig.json, Games/starhome/tsconfig.json, Games/studio-showcase/tsconfig.json, Games/the-robots/tsconfig.json, Games/tower-guard/tsconfig.json, Games/vice-isle/tsconfig.json, Games/wreckway/tsconfig.json, apps/desktop/tsconfig.json, apps/dev/tsconfig.json, apps/web/tsconfig.json, examples/ark-survival-kit/tsconfig.json, examples/convex-host/tsconfig.json, examples/express-host/tsconfig.json, examples/next-host/tsconfig.json, examples/studios/tsconfig.json, examples/tanstack-host/tsconfig.json, packages/assets/tsconfig.json, packages/convex/tsconfig.json, packages/core/tsconfig.json, packages/editor/tsconfig.json, packages/github/tsconfig.json, packages/jgengine/tsconfig.json, packages/node/tsconfig.json, packages/react/tsconfig.json, packages/shell/tsconfig.json, packages/sql/tsconfig.json, packages/ws/tsconfig.json, registry/tsconfig.json
agent_commit_share0.88
toolchain_manifestsapps/desktop/src-tauri/Cargo.toml
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
54.9/55可控的文件大小 — 采样的 2,484 个源文件中有 6 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes117,362
source_files_sampled2,484
oversized_source_files6

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples, recipes
所用输入
example_dirsexamples, recipes
has_mcp_signal
api_schema_files

关键数据

5GitHub 星标
3贡献者
1,029最近 12 个月提交数
0距最近推送天数
1发布版本数
1巴士系数(bus factor)
35开放议题
npm软件包生态系统数

数据采集警告

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

更多细节

OpenSSF Scorecard 2.7 / 10
2.7综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-25 02:39 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
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
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities13 existing vulnerabilities detected
直接依赖 132
注册表软件包版本约束清单文件
npm@jgengine/coreworkspace:*registry/package.json
npm@jgengine/reactworkspace:*registry/package.json
npm@jgengine/shellworkspace:*registry/package.json
npmreact19.2.3registry/package.json
npmreact-dom19.2.3registry/package.json
npm@jgengine/coreworkspace:*Games/claudecraft/package.json
npm@jgengine/editorworkspace:*Games/claudecraft/package.json
npm@jgengine/reactworkspace:*Games/claudecraft/package.json
npm@jgengine/shellworkspace:*Games/claudecraft/package.json
npm@react-three/fiber^9.5.0Games/claudecraft/package.json
npmreact19.2.3Games/claudecraft/package.json
npmreact-dom19.2.3Games/claudecraft/package.json
npmthree^0.182.0Games/claudecraft/package.json
npm@jgengine/coreworkspace:*Games/duet-keys/package.json
npm@jgengine/editorworkspace:*Games/duet-keys/package.json
npm@jgengine/reactworkspace:*Games/duet-keys/package.json
npm@jgengine/shellworkspace:*Games/duet-keys/package.json
npm@react-three/fiber^9.5.0Games/duet-keys/package.json
npmreact19.2.3Games/duet-keys/package.json
npmreact-dom19.2.3Games/duet-keys/package.json
npmthree^0.182.0Games/duet-keys/package.json
npm@jgengine/assetsworkspace:*Games/ironhold/package.json
npm@jgengine/coreworkspace:*Games/ironhold/package.json
npm@jgengine/editorworkspace:*Games/ironhold/package.json
npm@jgengine/reactworkspace:*Games/ironhold/package.json
npm@jgengine/shellworkspace:*Games/ironhold/package.json
npm@react-three/drei^10.7.7Games/ironhold/package.json
npm@react-three/fiber^9.5.0Games/ironhold/package.json
npmreact19.2.3Games/ironhold/package.json
npmreact-dom19.2.3Games/ironhold/package.json
npmthree^0.182.0Games/ironhold/package.json
npm@jgengine/coreworkspace:*Games/loopline/package.json
npm@jgengine/editorworkspace:*Games/loopline/package.json
npm@jgengine/reactworkspace:*Games/loopline/package.json
npm@jgengine/shellworkspace:*Games/loopline/package.json
npm@react-three/fiber^9.5.0Games/loopline/package.json
npmreact19.2.3Games/loopline/package.json
npmreact-dom19.2.3Games/loopline/package.json
npmthree^0.182.0Games/loopline/package.json
npm@jgengine/coreworkspace:*Games/spire-cards/package.json
npm@jgengine/editorworkspace:*Games/spire-cards/package.json
npm@jgengine/reactworkspace:*Games/spire-cards/package.json
npm@jgengine/shellworkspace:*Games/spire-cards/package.json
npm@react-three/fiber^9.5.0Games/spire-cards/package.json
npmreact19.2.3Games/spire-cards/package.json
npmreact-dom19.2.3Games/spire-cards/package.json
npmthree^0.182.0Games/spire-cards/package.json
npm@jgengine/coreworkspace:*Games/starhome/package.json
npm@jgengine/editorworkspace:*Games/starhome/package.json
npm@jgengine/reactworkspace:*Games/starhome/package.json
npm@jgengine/shellworkspace:*Games/starhome/package.json
npm@react-three/fiber^9.5.0Games/starhome/package.json
npmreact19.2.3Games/starhome/package.json
npmreact-dom19.2.3Games/starhome/package.json
npmthree^0.182.0Games/starhome/package.json
npm@jgengine-examples/studiosworkspace:*Games/studio-showcase/package.json
npm@jgengine/coreworkspace:*Games/studio-showcase/package.json
npm@jgengine/editorworkspace:*Games/studio-showcase/package.json
npm@jgengine/reactworkspace:*Games/studio-showcase/package.json
npm@jgengine/shellworkspace:*Games/studio-showcase/package.json
npm@react-three/fiber^9.5.0Games/studio-showcase/package.json
npmreact19.2.3Games/studio-showcase/package.json
npmreact-dom19.2.3Games/studio-showcase/package.json
npmthree^0.182.0Games/studio-showcase/package.json
npm@jgengine/coreworkspace:*Games/the-robots/package.json
npm@jgengine/editorworkspace:*Games/the-robots/package.json
npm@jgengine/reactworkspace:*Games/the-robots/package.json
npm@jgengine/shellworkspace:*Games/the-robots/package.json
npm@react-three/fiber^9.5.0Games/the-robots/package.json
npmreact19.2.3Games/the-robots/package.json
npmreact-dom19.2.3Games/the-robots/package.json
npmthree^0.182.0Games/the-robots/package.json
npm@jgengine/assetsworkspace:*Games/tower-guard/package.json
npm@jgengine/coreworkspace:*Games/tower-guard/package.json
npm@jgengine/editorworkspace:*Games/tower-guard/package.json
npm@jgengine/reactworkspace:*Games/tower-guard/package.json
npm@jgengine/shellworkspace:*Games/tower-guard/package.json
npm@react-three/fiber^9.5.0Games/tower-guard/package.json
npmreact19.2.3Games/tower-guard/package.json
npmreact-dom19.2.3Games/tower-guard/package.json
npmthree^0.182.0Games/tower-guard/package.json
npm@jgengine/assetsworkspace:*Games/vice-isle/package.json
npm@jgengine/coreworkspace:*Games/vice-isle/package.json
npm@jgengine/editorworkspace:*Games/vice-isle/package.json
npm@jgengine/reactworkspace:*Games/vice-isle/package.json
npm@jgengine/shellworkspace:*Games/vice-isle/package.json
npm@jgengine/wsworkspace:*Games/vice-isle/package.json
npm@react-three/fiber^9.5.0Games/vice-isle/package.json
npmreact19.2.3Games/vice-isle/package.json
npmreact-dom19.2.3Games/vice-isle/package.json
npmthree^0.182.0Games/vice-isle/package.json
npm@jgengine/assetsworkspace:*Games/wreckway/package.json
npm@jgengine/coreworkspace:*Games/wreckway/package.json
npm@jgengine/editorworkspace:*Games/wreckway/package.json
npm@jgengine/reactworkspace:*Games/wreckway/package.json
npm@jgengine/shellworkspace:*Games/wreckway/package.json
npm@jgengine/wsworkspace:*Games/wreckway/package.json
npm@react-three/fiber^9.5.0Games/wreckway/package.json
npmreact19.2.3Games/wreckway/package.json
npmreact-dom19.2.3Games/wreckway/package.json
npmthree^0.182.0Games/wreckway/package.json
npm@jgengine/editorworkspace:*apps/desktop/package.json
npm@jgengine/reactworkspace:*apps/desktop/package.json
npm@jgengine/shellworkspace:*apps/desktop/package.json
npmreact19.2.3apps/desktop/package.json
npmreact-dom19.2.3apps/desktop/package.json
npm@jgengine-examples/studiosworkspace:*apps/dev/package.json
npm@jgengine/convexworkspace:*apps/dev/package.json
npm@jgengine/shellworkspace:*apps/dev/package.json
npm@react-three/drei^10.7.7apps/dev/package.json
npm@react-three/fiber^9.5.0apps/dev/package.json
npmconvex^1.31.2apps/dev/package.json
npmreact19.2.3apps/dev/package.json
npmreact-dom19.2.3apps/dev/package.json
npmthree^0.182.0apps/dev/package.json
npm@fontsource-variable/inter^5.2.8apps/web/package.json
npm@fontsource-variable/jetbrains-mono^5.2.8apps/web/package.json
npm@jgengine/coreworkspace:*apps/web/package.json
npm@jgengine/githubworkspace:*apps/web/package.json
npm@tanstack/react-router^1.121.0apps/web/package.json
npm@tanstack/react-start^1.121.0apps/web/package.json
npmnitro^3.0.260610-betaapps/web/package.json
npmreact19.2.3apps/web/package.json
npmreact-dom19.2.3apps/web/package.json
npmthree^0.182.0apps/web/package.json
npm@jgengine/core^0.14.0packages/assets/package.json
npmfflate^0.8.2packages/assets/package.json
npm@jgengine/core^0.14.0packages/convex/package.json
npm@jgengine/core^0.14.0packages/editor/package.json
npm@jgengine/react^0.14.0packages/editor/package.json
npm@jgengine/shell^0.14.0packages/editor/package.json
npm@jgengine/assets^0.14.0packages/jgengine/package.json
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

依赖安全公告 0

安装 npm:jgengine@0.11.0 会引入 3 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "ai-agents",
        "game-development",
        "game-engine",
        "javascript",
        "react",
        "threejs",
        "typescript",
        "webgl"
      ],
      "is_fork": false,
      "size_kb": 409019,
      "has_wiki": true,
      "homepage": "https://jgengine.com",
      "languages": {
        "CSS": 13330,
        "HTML": 4265,
        "Rust": 345,
        "Shell": 597,
        "Python": 2477,
        "JavaScript": 55177,
        "TypeScript": 13865764
      },
      "pushed_at": "2026-07-24T21:04:57Z",
      "created_at": "2026-07-05T21:44:22Z",
      "owner_type": "User",
      "updated_at": "2026-07-24T21:02:20Z",
      "description": "Genre-agnostic TypeScript game engine SDK — pure core plus React, Convex, WebSocket, Node host, and Postgres adapters",
      "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"
      ]
    },
    "owner": {
      "blog": null,
      "name": "NoisemakerJon",
      "type": "User",
      "login": "Noisemaker111",
      "company": null,
      "location": null,
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/139656120?v=4",
      "created_at": "2023-07-15T21:17:39Z",
      "is_verified": null,
      "public_repos": 33,
      "account_age_days": 1105
    },
    "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": "packs",
          "kind": "other",
          "published_at": "2026-07-12T01:07:14Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "c61417e4ecb610d67db479a7a8c467bcf9a2a929",
          "body": "…553)\n\nCloses #1548.\n\n- Win/crush overlays compose registry ResultsScreen + DeathScreenView\n- Keep part-strip as game-owned content\n- Default SettingsTrigger skin (no re-authored className)\n- Vite alias for @/components/ui → registry/jgengine",
          "is_bot": false,
          "headline": "feat(wreckway): Phase 2.1 adopt ResultsScreen and DeathScreenView (#1…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-24T21:02:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a97c92bc6483652f008901b6736ddad72f18cc4a",
          "body": "… (#1554)\n\nCloses #1549.\n\n- Keep HP / mana / xp / army vitals use HealthBar, ManaBar, ExperienceBar\n- barTokens for height/color theming (game owns chrome)\n- Shrink game-adoption-baseline (local-widget-Bar gone)",
          "is_bot": false,
          "headline": "feat(ironhold): Phase 2.1 replace local Bar with @jgengine/react/bars…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-24T21:02:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64230bac714f2556e01a9c167551a0a973a47bfa",
          "body": "* feat(sdk): Phase 3a — ctx.rng, SMAA, sky IBL, CSM, flock isolation\n\nCloses #1545.\n\n- ctx.rng + seed options; loot registry defaults to the world stream\n- Post chains default to SMAA before OutputPass (aa: smaa|msaa|false)\n- Procedural sky/ground/sun IBL replaces RoomEnvironment gray box\n- Directional cascades > 1 mounts three.js CSM (tower-guard adopter)\n- stepFlock uses call-local spatial grid (no cross-world bleed)\n\n* papercut: GitHub 500 on PR create after push",
          "is_bot": false,
          "headline": "feat(sdk): Phase 3a ctx.rng SMAA sky IBL CSM flock (#1551)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-24T21:01:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20c0bc94eae03ad85a8331f5981a2109b6eb1ddb",
          "body": "* feat(sdk): Phase 1.2 adoption ratchet + Phase 2.3 cheap seams\n\nCloses #1543.\n\n- check-game-shape freezes export-let and local Window/Bar/Chip/Slot smells\n  via shrink-only scripts/game-adoption-baseline.json\n- Export grounded(ctx,x,z) for the ubiquitous ground pose pattern\n- Ship DEFAULT_WALK_CODES (WASD+Space) and scaffold uses it\n- SettingsTrigger defaults to HudTheme-token 8x8 chrome\n\n* chore: regenerate skill api for grounded, walk codes, SettingsTrigger\n\nFixes check-skill-api on #1544.",
          "is_bot": false,
          "headline": "feat(sdk): Phase 1.2 adoption ratchet + Phase 2.3 cheap seams (#1544)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-24T19:15:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "244234cf6609321322eace1160bf9723264c94e0",
          "body": "…lock guidance (#1542)\n\nCloses #1541.\n\nThe whole-game recipe and scaffold GameUI header told agents not to use stock\nHUD widgets; CLAUDE.md says the opposite. Align recipe, skill, and scaffold so\ngames compose StatBar/Hotbar/Coins/etc. and reskin via HudTheme.\n\nDeclare @jgengine/shell/gameKit as the sole start-here surface; reframe\n@jgengine/core/authoring as a core helper barrel (not a competing entrypoint).\nMigrate studio-showcase and tower-guard kit-covered imports onto gameKit.",
          "is_bot": false,
          "headline": "fix(sdk): Phase 0 — single gameKit entrypoint + correct UI building-b…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-24T18:53:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca9b74c9929080ad3a6eb0c9190fbde23a375849",
          "body": "Capture the 2026-07-24 multi-audit remediation brief under docs/plans\nso phases 0-4 and the PR sequence are in-repo reference, not a local\nscratch file.",
          "is_bot": false,
          "headline": "docs: add SDK remediation implementation plan (#1540)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-24T18:46:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d186d41394cc50cebf88ad47d14c545c77500aff",
          "body": "…539)\n\nThe \"behavior over time gets a clip\" bullet carried ~1.5k chars of\nrecording and pr-video upload mechanics (GH_SESSION_TOKEN provisioning,\nthe Actions-workflow fallback, GIF prohibition rationale) in a file that\nloads into every session. Those details only matter while actually\ncapturing a cl\n[…]\nrrored. Docs-only, no rendered surface, so no\nscreenshots.\n\n\nClaude-Session: https://claude.ai/code/session_01Dnn9ZdAR2TKp82sYL7uvoF\n\nCo-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: move pr-video clip mechanics from root into jgengine-verify (#1…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-24T18:20:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e145d65c20fd9c77f0f4567b7d30ed31ba68c32",
          "body": "…(#1535)\n\nThese dev-infra suites do real `npm pack`/extract/scaffold filesystem work\nwhose wall-time scales with machine load but relied on tight default per-test\ntimeouts, so they flaked under a loaded `test:all` run rather than on real\nregressions. #1504 called these three suite groups out explici\n[…]\n0s budget, which fully\ncovers the headroom this suite needs.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C1nkdortcdLUiMwGxUqkmW\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(infra): de-flake tarball/desktop/barrel suites under contention …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T15:52:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9beaf16f7fc57594c937df3889002eafb75df719",
          "body": "…(#1310) (#1534)\n\nAdd `scripts/distStaleness.ts`, a shared primitive that detects the three\nways a package `dist/` fails to reflect current source — missing-dist\n(never built), missing-emit (interrupted/partial build), and stale-emit\n(src newer than its compiled output) — by walking each package's\n`\n[…]\n — resolves to\na fresh, complete dist before `check-types` runs.\n\nCloses #1310\n\n\nClaude-Session: https://claude.ai/code/session_01C1nkdortcdLUiMwGxUqkmW\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(infra): general per-package dist staleness check in ensure-ready …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T15:52:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d06d5ec619aa5b22ca78709e02417c2fb48a7b2a",
          "body": "…m collision (#1533)\n\nClaude-Session: https://claude.ai/code/session_01C1nkdortcdLUiMwGxUqkmW\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "papercut: log drive verify timeout headroom + concurrent-session clai…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T15:50:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c9afd011d697fd9474cf904c315fc9541c1c6f61",
          "body": "…ots under software GL (#1532)\n\nLogged while verifying the #1506 drive --playtest fix.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "papercut: drive's outer timeout deadline blows on cold heavy-scene bo…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T12:42:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c95f12ebe5c9dffe1a8a9cd19cbb1731fb877842",
          "body": "… software GL (#1531)\n\ndrive recording/probe runs on a warm/persistent Chrome (shoot daemon,\n--keep/--connect) reused the profile's localStorage, so a game with\npersist:true restored the prior run's save and capture.probe read a stale\nposition (#1505). drive --playtest on a software-GL host (cloud S\n[…]\noth in the jgengine-verify skill.\n\nCloses #1505\nCloses #1506\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C1nkdortcdLUiMwGxUqkmW\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(drive): clean storage by default + degrade playtest verdict under…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T12:41:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7728d57a6c9c655490ff0a8d3482bb802bebf6f",
          "body": "…4 (#1528)\n\nNitro's dev Vite middleware classifies any URL whose extension matches its\ninternal ASSET_EXT_RE (which includes `mdx?`) as a static asset and refuses it\nthe SSR handler. TanStack Start server routes all sit behind Nitro's catch-all\n`/**`, so that extension test is the only thing decidin\n[…]\nll.txt`, served as text/markdown) to prove it.\n\nCloses #1507\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C1nkdortcdLUiMwGxUqkmW\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): route `.md` server routes through SSR in dev, not static 40…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T05:20:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a7305ea4b8a496ecbf7cdaf073d3eb7d6fc30f1a",
          "body": "…contract (#1526)\n\n#1504: the assets CLI suites (pull.test.ts, reindexPaths.test.ts) did real\nzip/GLB extraction and filesystem-tree work under Bun's default 5s per-test\nbudget while `mkdtemp`-ing straight off ambient `tmpdir()`. Under a full\n`test:all` run the FS/CPU contention pushed heavy cases p\n[…]\ns is the missing\nregression guard so the path contract can't silently regress.\n\n\nClaude-Session: https://claude.ai/code/session_01TLXTMpkW8q3ApQ2N4EU5rY\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(assets): de-flake CLI tmp tests + guard the pull dev-served dir …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T05:20:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9cec61d58bfeeb6a7f947cb1e5f7490416983e66",
          "body": "…l dist (#1524)\n\ngen:export-manifest reads dist/*.js as the source of truth, so generating\nbefore a full package build silently omits new subpaths (a fresh src/foo.ts\nwith no dist/foo.js yet). The drift then only surfaces later, on a fully-built\nand often unrelated branch.\n\nAdd an advisory-only stal\n[…]\nt tree. Never fatal — drift itself stays gated on PRs via #1293.\n\nCloses #1501\n\n\nClaude-Session: https://claude.ai/code/session_01TLXTMpkW8q3ApQ2N4EU5rY\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scripts): warn loudly when export manifest runs on a stale/partia…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T05:19:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39914a1ed2b0996f4470651d5baaed02638e1384",
          "body": "…ndex default (#1499) (#1523)\n\nThe runtime missing-model diagnostic told devs to run `assets pull <source>`\nbut never named where the bytes must land, so after pulling they still 404'd\nin the editor dev runner until manually copied into apps/dev/public/models.\nThe pull default dir was already fixed \n[…]\ns it in lockstep with the pull default so the two never diverge.\n\nCloses #1499\n\n\nClaude-Session: https://claude.ai/code/session_01C1nkdortcdLUiMwGxUqkmW\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(assets,core): name served models dir in 404 diagnostic; align rei…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T05:17:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f336e90a295658ac7d7606729e01b8086b16ea3",
          "body": "…(#1522)\n\nagent-bootstrap treated any existing packages/core/dist directory as \"built\",\nso a dist left half-emitted by an interrupted prior build satisfied the check\nyet was missing entry files (e.g. dist/vfx/screenEffects.js, imported via the\n\"./*\" export). --check reported a false \"ready\" and down\n[…]\ny. Add a focused test\nfor the detection over a src/dist fixture.\n\nCloses #1503\n\n\nClaude-Session: https://claude.ai/code/session_01TLXTMpkW8q3ApQ2N4EU5rY\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(bootstrap): self-heal a partial/stale core dist [skip changelog] …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T05:17:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "226e9cf562b73144b84f0ac3306baf994cc5a349",
          "body": "extractBlocks' proximity welding assumes near-aligned centerlines;\nwandered / arc-filleted streets weld into a degenerate face set with no\nsignal (a real case went 38 streets -> 2 faces). Add a dev-mode\nconsole.warn when the extracted face count is implausibly low for the\nstreet count (>=8 streets, \n[…]\n arc streets that collapse to ~1 face; stays\nsilent on a well-formed 4x4 grid.\n\n\nClaude-Session: https://claude.ai/code/session_01C1nkdortcdLUiMwGxUqkmW\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Warn on implausible extractBlocks collapse (#1502) (#1521)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T05:15:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2636e7d8291b7661bd655cd07d9621a8384e3311",
          "body": "…feel (#1516)\n\n* fix(core,vice-isle): street-car launch, reverse, and handbrake drift feel\n\nCloses #1515\n\nStreet cars launched like parking-lot crawlers, reverse used full engine\nforce, and handbrake only reduced grip without rear-lock yaw. Add a\nlaunch torque floor, softer reverse drive, handbrake \n[…]\nve camera to a midsize ~25 mph @ 2s baseline with controllable\ndrifts.\n\n* docs: [Unreleased] kinematic vehicle drive feel for changelog gate\n\n* chore: regenerate skill api for reverseForceScale export",
          "is_bot": false,
          "headline": "fix(core,vice-isle): street-car launch, reverse, and handbrake drift …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T04:46:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "127d31caf17275a2375bd23d0efab148533c90f9",
          "body": "* fix(core): stop city buildings from freezing pose at ~3 fps\n\nCloses #1517\n\nMovement broadphase used one max extent for XZ and Y, so tall fitted\nbuilding colliders expanded inBox into ~100^3 empty 1m cells every frame.\nSplit and cap horizontal vs vertical reach, bail huge inBox queries to a\nlinear \n[…]\nct scan, collapse dense mesh-box soups to outer AABBs for\nwalking, skip movement when frozen, and gather car obstacles via inBox.\n\n* docs: [Unreleased] pose collision broadphase fix for changelog gate",
          "is_bot": false,
          "headline": "fix(core): stop city buildings from freezing pose at ~3 fps (#1518)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T04:44:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8be8bce52b27954819049ae8988117b30e46f1db",
          "body": "…ke, ped hit (#1520)\n\nCloses #1519\n\nStory cars snap to curbside asphalt instead of lawn voids; Bandolero is a red\nsedan; capture/drive skips the god-cam flyover; tyre smoke needs real slip or\nlaunch spin; ped runovers fling and stun instead of silent sit-jank.",
          "is_bot": false,
          "headline": "fix(vice-isle): drive presentation — road spawns, Bandolero, cam, smo…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T04:40:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b22f8a0e635799828e2d6a2547019c9599bc5075",
          "body": "* Fix intersection geometry and capture lifecycle\n\n* fix(core): compact carriageway-union intersections (#1511)\n\nReplace apron double-counting of curb-return radius with projected crossing\nhalf-width clearance (ignore collinear through-arms). Build degree-2 L-unions\nvia outer edge intersection, keep\n[…]\nk\naprons along ring normals. Drop playground cuboid traffic; hide buildings on\nfocused junction inspection. Expand deterministic topology tests and refresh\nStreetGeometryPreview extents.\n\nCloses #1511",
          "is_bot": false,
          "headline": "Fix intersection geometry and capture reliability (#1514)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T04:00:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "666dc5bbf0b763d0f861c80add66d209c6879018",
          "body": "…aph planar (#1456)\n\n* Fix city generation: enforce the plot contract and make the street graph planar\n\nBuildings could overlap each other and the streets, and streets could\ncross without junctions or stub out mid-map (#1454). Root causes:\n\n- deriveBuildingLots deduped plots by center distance only \n[…]\ng merge\n\n* Allow city outline rule in street network options\n\n* Allow residential branch rule in street options\n\n* Regenerate world skill API\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix city generation: enforce the plot contract and make the street gr…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T00:34:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7b20fcebb91c63d76ec2e56fed9305f422f3a14",
          "body": "…phase story (#1337) (#1496)\n\nThe run-phase contract was optional with a permissive default: a game that\nnever published a phase read as \"playing\", so the shell showed the touch dock\nand play-gated input over title/menu/results screens (Vice Isle #1329). Seven\nof eleven games never touched the contr\n[…]\ndock-over-menu symptom is\nproven via the gate + phase tests, not a screenshot.\n\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): make the run-phase contract explicit — gate every game's …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T00:18:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "031dd92a632f94ca574560ccdcfbb66d546b15e1",
          "body": "… (#1491)\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Log check-skill-api focused-verification papercut from the issue pass…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-21T00:18:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3e62be6c0e5551982bbb58db0648607eed184ccf",
          "body": "* fix(world): connect street dressing and site captures (#1511)\n\n* docs: record connected street dressing (#1511)",
          "is_bot": false,
          "headline": "Connect street sidewalks and markings with reliable site capture (#1513)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T23:38:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ad19222d5f9852793b570e29d715416b420a00a",
          "body": "Documents an offline pipeline for turning a filmed item or scene into\na game-ready asset: capture video, reconstruct with LingBot-Map on a\nrented/owned GPU, mesh the point cloud locally, then import through\nthe editor as a catalogued asset. Includes hardware/cost notes and a\nlocal point-cloud-to-glb helper script for the GPU-free meshing step.\n\n\nClaude-Session: https://claude.ai/code/session_01D6eG11rGuHVZos1KhgBt9P\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add video-to-3D asset capture recipe (LingBot-Map) (#1512)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T21:49:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91c5e984b60b60c896af434a5276668aa557c7e5",
          "body": null,
          "is_bot": false,
          "headline": "fix(core): weld generated street junction geometry (#1509) (#1510)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T06:30:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "111b7ce8a1c7b7443fe49e36a6659999542b9734",
          "body": "…iction (#1508)\n\nSecond PAPERCUTS.md sweep: research each remaining entry, file the real bugs\nand feature gaps as tracked issues, and remove them (plus already-resolved\nones) from the log. What remains is sandbox / environment / workflow / harness\nfriction that has no repository code fix.\n\nFiled as \n[…]\ned) — both pass now\n\nTwelve environment/sandbox/workflow/harness entries kept.\n\n\nClaude-Session: https://claude.ai/code/session_01Y3FdxQvVuycdvrrjmtRGEG\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Promote actionable papercuts to tracked issues; keep only non-repo fr…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T04:46:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "300e386ca8f500d8afebbce87ad8d47df15c14f2",
          "body": "…ies (#1495)\n\n* Fix capture --url localhost and Windows tar papercuts; sweep fixed entries\n\nSweep of PAPERCUTS.md: fix the two still-live, code-fixable frictions and\nremove 13 entries whose root cause already landed on main.\n\nFixes:\n- shoot --url http://localhost:… now works. Bun/Node `fetch` (which\n[…]\nt kept open.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Y3FdxQvVuycdvrrjmtRGEG\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Papercut sweep: fix capture/tar/CLI frictions and clear resolved entr…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T04:26:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6aa890da27a1f76602292b40ed166ea5f18e7d3",
          "body": "…1342) (#1494)\n\n* fix(shell): surface in-GLB texture-load failures in debug_snapshot (#1342)\n\n`debug_snapshot().probes.fallbacks` is the signal jgengine-verify tells agents\nto trust for \"content resolved to a placeholder / is unauthored\", but it only\nreports WHOLE-MODEL catalog fallbacks (missing ma\n[…]\npath (#1342)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(shell): surface in-GLB texture-load failures in debug_snapshot (#…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T04:20:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d4f55ad4c2a29f88563e440fe26841a9c3ae4b9d",
          "body": "Main's full CI (`checks` job) was red on a single failing test —\n`published export manifest > real exposed subpaths match the committed manifest` —\nbecause several recently-merged PRs (camera-shake, save-slot, shopGrid, wave-hud,\n…) added new package subpaths without regenerating scripts/export-mani\n[…]\na future subpath-without-regen now\nfails the PR instead of main.\n\nCloses #1293\n\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Regenerate stale export-manifest and gate it on PRs (#1293) (#1492)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T03:30:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9079b809ecdac41792c463012f26ae59a5c3ba29",
          "body": "…t paths (#1487)\n\nThe doc-integrity gates checked import *paths* but never *symbol names*.\ncheck-recipes validates recipe import specifiers against export-manifest.json\nand check-skill-sync validates `@jgengine/<pkg>/<path>` strings — but nothing\nverified that a symbol named in a doc or embedded cod\n[…]\n imports across 46 sources) and fails naming the\nsymbol on a fictional import.\n\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add check-doc-symbols gate: validate documented symbol names, not jus…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T03:27:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6fb57aad1c7f270b99dd93faf6934fdb1d8f1b1f",
          "body": "…) (#1490)\n\nThe headline \"bolt on a plow/jump part to smash through barricades\" mechanic\nwas fully bypassable. Gates only clamped forward progress inside the LEFT/RIGHT\nlane bands, leaving the middle lane (X in [-9,9]) permanently un-gated — and the\nwhole pickup route plus the exit sat in that middl\n[…]\nso the deterministic route/gate tests are the proof of behavior.\n\nCloses #1344\n\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(wreckway): make the plow/jump upgrade fantasy load-bearing (#1344…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T03:25:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0689d0996a05b2f26d60b13caffccf6e42afdaee",
          "body": "…1339) (#1489)\n\nGames declare their model-pack dependencies via `buildCatalog({ sources })`\n(and, for claudecraft, `/models/<pack>/` served-path literals), but nothing\nverified those packs would actually be present on a fresh `git clone`. A game\ncould reference a pack that is neither committed nor p\n[…]\n a bare pull lands bytes where the runner reads\nthem. `--dir` still overrides.\n\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Gate clean-checkout asset-pack availability + fix pull default dir (#…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T03:22:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eeef69740d9f6e2cd49e82759a60ef323fb0c1a6",
          "body": "… white-screening (#1488)\n\nA Vite dev server returns its index.html fallback (HTTP 200) for a missing\n/models/*.glb, GLTFLoader throws parsing HTML as a GLB, and that failure\nsurfaced as a rejected useLoader Suspense promise. A rejected Suspense promise\ndoes not reliably re-throw into a per-model Re\n[…]\n never call\nonError; a valid-bytes parse error still surfaces through onError.\n\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix #1340: missing GLB degrades to a placeholder primitive instead of…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T03:20:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "467f25ac2f1e601ba0bf482364fe0c4927c4de00",
          "body": "…s (#1486)\n\nGLTFLoader resolves each GLB's images[].uri as a URL relative to the .glb,\nso every referenced texture must sit *beside* its model (the flat layout the\npack pipeline produces: extractGlbs normalizes URIs to basenames and pull.ts\nwrites each map into the pack root). quaternius-stylized-na\n[…]\nt; this\ngate makes any future divergence loud instead of silent.\n\nCloses #1338\n\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(assets): gate committed model-pack texture layout against GLB URI…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T03:02:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8858b6098d24e9589bda397b07c19b77d6607995",
          "body": "…arrels (#1319) (#1484)\n\n* core: re-export public result/option types from gameplay and combat barrels\n\nPublic barrel functions returned/accepted types a consumer could not import,\nforcing ReturnType<>/Parameters<> gymnastics. Re-export them alongside their\nfunctions (purely additive, no behavior/si\n[…]\nplay api.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "core: re-export public result/option types from gameplay and combat b…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T03:00:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "afa01220746693342eb66c22a41d6e17ee65c094",
          "body": "AbilitySlotButton rendered an icon-only <button> with no accessible name.\nThe human-readable label and cost lived in sibling spans OUTSIDE the\nclickable button, so screen readers and label-based UI automation (e.g.\n`drive <game> --click \"Archer Post\"`) could not identify or activate the\ncontrol. Bec\n[…]\natching the packages convention) so the new bun:test file does not break\ntsgo.\n\n\nClaude-Session: https://claude.ai/code/session_01C6cyjnbQJ5FkfFCPDW1gXt\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(registry): give AbilitySlotButton an accessible name (#1341) (#1485)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T02:58:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1e6968c8a18bfbc90c7508fa87818b89b27e7c3",
          "body": "…dules (#1377) (#1483)\n\n* Fix check-game-shape: whitelist editor<Name>.ts import-graph modules (#1377)\n\nvice-isle's editorKinds.ts is a side-effect module imported by editorLayers.ts,\nwhich the editor always loads — the same role as editorLayers/editorCatalogs. The\nshape whitelist enumerated those t\n[…]\ne next editor\nmodule can't reintroduce this class of red-main.\n\nCloses #1377\n\n* Add CHANGELOG entry for editor-module shape whitelist (#1377)\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix check-game-shape: whitelist editor&lt;Name&gt;.ts import-graph mo…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T02:51:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f63dac5f9dd20ad00681662f8bca82f3f15f1cf",
          "body": "…ndmarks, organic outlines, clean junctions (#1474)\n\n* City generator overhaul: plot-first blocks, grand plots instead of landmarks, organic outlines, clean junctions\n\n- generateCity is now plot-first: blocks come straight from the street\n  network's exact graph (new extractGraphBlocks in cityBlocks\n[…]\n\nCloses #1473\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UnVnaFFYS4JzydUt2ZSSLS\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "City generator overhaul: plot-first blocks, grand plots instead of la…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T02:34:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "58eeab872c0804264434333fbd9bc782b6baeccd",
          "body": "…482)\n\nThe action-binding model (actionBindings) and per-player rebind persistence\n(bindingOverrides) already existed, but nothing sat between them: no editor that\ntracks the effective binding, detects when two actions collide on one key, and\ndrives a \"press a key\" capture. Games would re-handroll t\n[…]\n HudTheme-skinnable.\n- demo `key-rebinding`: 6 free-string actions with a seeded Interact/Reload\n  collision so a still frame shows the conflict badges.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add conflict-aware key-rebinding session + controls-settings menu (#1…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:45:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d2685c72d1b8d919e1dd73f00e0022ffc602f9f",
          "body": "Add `@jgengine/core/economy/shopStock` — a serializable, observable vendor\nstock (free-string kind, price in a free-string currency, finite/unlimited\nqty, optional sell-back) whose buy/sell reuse the existing pure `wallet`\nmodel over a caller-owned WalletState (the shop never owns the wallet; it\nret\n[…]\nd grid of\nafford-aware item cards with a wallet balance readout. Adds a `shop-grid`\ndemo and a JSDoc description to the now-barrel-exported `canAfford`.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add vendor/shop stock model + ShopGrid host (#1480)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:43:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d7f1de90d008ae395e996cbc5cc6bad0fd071419",
          "body": "Adds `createSaveSlots` — a serializable, observable index of per-slot display\nmetadata (id, name, empty, savedAt, free-string meta bag) that a save-select\nmenu renders. It complements the existing `createSaveStore` (which owns the\nreal save payload + named slots but exposes no per-slot display metad\n[…]\n\nchips and relative save times, HudTheme-skinnable. `meta` keys are free strings\nthe game owns; the model never interprets them. Demo game `save-slots`.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add save-slot / profile select menu building block (#1478)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:41:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45ee410f87bb7f40bcdc8759b13a4a9853bf2675",
          "body": "Adds a thin, serializable, observable `createEventTicker` in\n`packages/core/src/game/eventTicker.ts` that composes the existing pure\n`appendFeed`/`pruneFeed` feed helpers into a single rolling, count-capped,\ntime-fading list of free-string `{ kind, text, icon? }` entries. `recent()`\nprunes expired e\n[…]\nnts on click.\n\nSeam: the ticker owns only cap/prune/fade over the shared feed math and never\ninterprets `kind`/`text`/`icon` — games style each variant.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add event-log / kill-feed ticker over the feed helpers (#1476)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:39:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e190075632e49955ff1cffc64409266680d30b52",
          "body": "…t (#1472)\n\nWraps the existing pure `resolveActivePrompt` proximity-prompt resolver in a\nthin stateful `createPromptRegistry()` that OWNS positioned prompts and tracks\nthe active one, notifying subscribers only when the active prompt changes so a\nHUD binds without per-frame thrash. React `Interactio\n[…]\nagnostic\nseam: the registry never branches on a prompt's meaning — the game supplies\naccents and key glyphs; display kinds/action ids stay free strings.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add observable interaction-prompt registry + \"Press E to…\" HUD callou…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:34:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41d42a9e120195e577560a75950a28890a9f64bd",
          "body": "New engine seam `createCameraShake` in @jgengine/core/vfx/cameraShake: a\nserializable, deterministic trauma-based camera-shake/impulse controller.\n`add(amount, kind?)` raises trauma [0,1] on impacts (free-string kind the\ngame styles, never interpreted by the model); `update(dt)` decays it and\nadvanc\n[…]\na-shake` fires an\nopening explosion and exposes Hit/Explosion/Landing buttons.\n\n\nClaude-Session: https://claude.ai/code/session_014e1TzFho9ez8KSaheJaqH2\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add seeded trauma-based camera shake controller (#1470)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:31:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1f82b999fd942e2625731f4328ad0654ce7e98fb",
          "body": "…ctor (#1469)\n\ncreateWaveRunner(config) is a thin, stateful, observable wrapper over the\nexisting seeded ai/spawnDirector: it owns a SpawnDirectorState, ticks it from\nupdate(dt, ctx?), forwards each SpawnRequest to an optional onSpawn sink (so the\nmodel never instantiates entities), and exposes a po\n[…]\nping it\ngenre-agnostic. Adds a wave-director demo driving ~3 escalating waves.\n\n\nClaude-Session: https://claude.ai/code/session_014e1TzFho9ez8KSaheJaqH2\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add observable wave/spawn runner + WaveHud over the seeded spawn dire…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:27:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5d6c471636b3700e97541cdde05d805b98475a1",
          "body": "Adds `createComboMeter` — an integer hit chain with a reset-on-hit decay\nwindow, ascending free-string tier thresholds, a derived score multiplier,\npeak tracking, a pooled view, subscribe, and snapshot/restore. Time is\ninjected (`now`, default Date.now) and/or driven by `update(dt)`.\n\nSeam: none of \n[…]\nterHud` +\n`useComboMeter` render it (big count, tier label, draining window bar,\nmultiplier) with per-tier color from a caller-supplied free-string map.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(combat): add count-based combo/multiplier meter (#1466)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:24:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e765249c2bc30b867320bb56a38384f8f7adec3c",
          "body": "Add a serializable, observable waypoint tracker and a pure, allocation-\naware screen-marker layout helper in @jgengine/core/ui/screenMarkers,\nplus a WaypointMarkers React host and a demo.\n\nThe seam is the edge-clamp/arrow half that layoutEntityFrames lacks:\nentityFrames CULLS off-screen/behind-camer\n[…]\nng kinds the model never\ninterprets. WaypointMarkers renders on-screen pins and off-screen arrows\nwith distance labels over any caller-owned projection.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core,react): off-screen objective/waypoint markers (#1464)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:19:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "56d5f3c4428677353a681932732f8b0d4ab5ba58",
          "body": "…able (#1462)\n\nAdd rankLeaderboard(rows, options) in @jgengine/core/game/leaderboardRank —\na pure, allocation-bounded selector over the existing leaderboard model that\nsorts rows by value (desc/asc), assigns 1-based ranks with standard (1,2,2,4)\nor dense (1,2,2,3) tie handling, flags ties and the lo\n[…]\nso any game can render a\nleaderboard without re-deriving ranking or tie logic.\n\n\nClaude-Session: https://claude.ai/code/session_014e1TzFho9ez8KSaheJaqH2\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(gameplay): tie-aware scoreboard ranking selector + reskinnable t…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T01:09:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9dce89ce6616cccc48e17fc96f636702282eff34",
          "body": "…end (#1460)\n\nAdds talentTreeViewFrom(nodes, status, totals?) so a game builds the placed\nrender view (branch/tier layout, prerequisite edges, learned/available/locked/\nmaxed state) from any per-node unlock rule — a currency threshold, a level, a\nquest flag, or nothing — instead of only the point-sp\n[…]\n a\nbuy-with-points talent tree or a money-gated \"earned, not bought\" upgrade tree\nwith no renderer change. The talent-tree demo shows both side by side.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(react,core): talent tree from any unlock rule, not just point-sp…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T00:33:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "291ba399a9e5deabfa316f66d1ffb4f3952b429b",
          "body": "Video files do not load in the user's chat client. Clips live on\nGitHub (pr-video inline player or linked MP4); the conversation gets\nrepresentative still frames extracted from the clip plus the GitHub\nlink. Screenshots in chat stay.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Evidence policy: never send video files into the conversation (#1458)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-20T00:05:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4ba6e866cafa723dbb9d87a3e8cdd61fdb4d76c",
          "body": "…ly (#1457)\n\nProfiling showed the ~1s/frame floor is the SwiftShader composite\ninside Page.captureScreenshot, not the sim step (~130ms) or the encode:\nPNG vs JPEG composite cost is near-identical, but JPEG cuts the CDP\ntransfer ~10x and feeds ffmpeg directly. With the waste gone the\ndefault rises 10\n[…]\nlls anyway; realtime\nscreencast mode keeps its gif+mp4 pair.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "drive --record: 24fps default via JPEG capture; lockstep emits mp4 on…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T23:42:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "108797891d96ee9b18aa7e9b558f137e851e2784",
          "body": "…GL (#1455)\n\nRealtime screencast recording captured what headless SwiftShader really\nrenders — ~1fps — so clips played as slideshows and boot/intro motion\nwas invisible (2 frames). --record now takes over the page's\nrequestAnimationFrame/performance.now/Date.now (the timeweb/timecut\ntechnique) and a\n[…]\nre-what-rendered screencast for\nperformance-honest evidence.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "drive --record: lockstep clock takeover for smooth clips on software …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T23:21:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fe8d05f1466d1bed03b3c28ce8f4beed6be88439",
          "body": "Add createFloatingTextField — a genre-agnostic, deterministic,\nallocation-aware field of world-anchored text pops (damage, crits,\nheals, XP/gold, status, barks): emit/update/active with rise + seeded\ndrift + fade, a capped pool that recycles the oldest, subscribe, and\nserializable snapshot/restore. \n[…]\n-in that binds the live camera and advances the field. New\nfloating-text demo.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): floating combat text / damage numbers (#1412)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T23:12:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7299b47ac21f0218c4bf74110ec3a2cd84c3e40",
          "body": "…1397)\n\n- core: `createCodex` (@jgengine/core/game/codex) — discovery tracking over a\n  fixed entry set: discover/isDiscovered, category-filtered list, categories,\n  completion, onDiscover seam, secret masking, snapshot/restore. Stable view list.\n- react: `Codex` gallery — category tabs, discovered \n[…]\nerated gameplay barrel + capability/api/manifest; CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(gameplay): codex / bestiary with discovery tracking + gallery (#…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T23:09:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "156899baf60b6e5cb05926348513a191b130fca9",
          "body": "…levation, welded geometry, radius-labeled maps, building variety, Manhattan block fill (#1395)\n\n* Street geometry polish: fine arc sampling, ribbon joins, junction fans, trimmed sidewalks, folded circuits, visible building variety\n\nRound-2 fixes for defects that survived the generator overhaul, dri\n[…]\n Attach round-5 evidence screenshots (PR-only, removed next commit)\n\n* Remove PR evidence screenshots from the tree (shots/ stays gitignored)\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Street generator: flowing spline circuits + kart-maze density dial, e…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T23:07:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b97429bd2588e514cbcab9ebe481ae0e92e7dd0",
          "body": "Complete the multiplayer map umbrella: pings already broadcast via\ncreatePingSystem; this shares the annotation (drawing) layer too.\n\n- core: `createSharedAnnotations` (@jgengine/core/world/sharedAnnotations) wraps\n  an annotation layer so local addStroke/addShape/addNote/remove/clear apply +\n  broa\n[…]\nenerated world barrel + capability/api/\nmanifest; CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(multiplayer): shared map drawings over the party feed (#1392)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T23:05:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dffef63ba79e6e37ada04d4f5c0e18f1de7f14fd",
          "body": "* Debounce slider/number/color commits behind a shared useDebouncedCommit primitive\n\nEvery editor range/number/color/text input committed straight from onChange,\nso one slider drag patched the scene document ~50 times and each patch\nregenerated heavy content (streets, scatter, grass). The new\n@jgeng\n[…]\nip changelog]\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015UWRoYA3P4hfCAYKJdCXgG\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Debounced slider commits + terrain/grass visual upgrade (#1376)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T23:04:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20ad3584f5f2be532d047dac881886b752da9769",
          "body": "…450)\n\nGenre-agnostic, serializable announcement banner: createObjectiveBanner is\na clock-driven queue that flies a big transient centered title + optional\nsubtitle in, holds, and fades out one at a time, exposing the current\nbanner's phase (in/hold/out) and progress 0..1 for a renderer to animate.\n\n[…]\n, and maps phase + progress to opacity/scale/translate, HudTheme-\nskinnable and colorable per kind via kindThemes. Demo: objective-banner.\n\nCloses #1445\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): add stage / objective banner controller + React overlay (#1…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:59:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7931936c50600dcd090aa07a4f1f341a5b9422f5",
          "body": "… (#1449)\n\nAdd a drop-in `TalentTree` React widget that renders the engine's existing\ntalent/progression model (`@jgengine/core/game/talents`) as an interactive\nskill tree — nodes placed by branch column and prerequisite-depth tier, SVG\nprerequisite edges, learned/available/locked/maxed styling, ico\n[…]\nel without re-deriving topology or\neligibility. Node ids and branches stay opaque game data.\n\nIncludes a `talent-tree` dev demo and core selector tests.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(react): talent/skill-tree widget over the existing talents model…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:56:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4df807a7e62de8160f62c9c6ed233c41dbf5ec4e",
          "body": "…idgets) (#1447)\n\nAdd a serializable set of named countdown/countup timers on an injected\nclock, plus React readout widgets — one primitive for round timers,\nrespawn clocks, and ability cooldown/charge (identical mechanics; ids and\nlabels are free strings the engine never interprets).\n\n- core/time/t\n[…]\ne (gameClock/simClock); reuses\nthe swingTimer/actionModel cooldown reads rather than duplicating them —\nthis is the missing multi-timer set they lacked.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core,react): countdown/timer HUD primitive (timerSet + readout w…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:53:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a57135fef11dcb965ea4fbab24d4c37bf073c32",
          "body": "The workflow runs the script from an isolated temp dir that is not a\ngit checkout; the unconditional `git remote get-url origin` threw there\nbefore the upload ever started (caught by live run #2 of the pr-video\nworkflow — the guard and inputs steps passed, upload died at line 120).\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "pr-video: skip git origin lookup when --repo is given (#1453)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:50:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "97419ce3683eead525a0bdee1cb7499c99e645d8",
          "body": "Ships a drop-in branching conversation view driven by the engine's dialogue\ndomain. Core gains a thin, serializable dialogue-graph model\n(`createDialogueRun` / `selectDialogueView`) layered over the existing\n`features.dialogue` open/close bridge: nodes carry a free-string speaker, a\nline, and choice\n[…]\never\ninterprets (surfaced as `data-*` for game styling); HudTheme-skinned via\n`--jg-*` tokens. Adds the `dialogue` demo and covers the model with tests.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add branching dialogue UI over the existing dialogue model (#1444)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:49:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0629bb55672431a50bb821fb7ff4d09f4807391a",
          "body": "Serializable, allocation-aware damage-direction brain plus a drop-in React\noverlay so games get the classic \"red arc pointing at the attacker\" feedback\nwithout hand-rolling fade timers or arc geometry.\n\n- core `@jgengine/core/vfx/damageDirection`: `createDamageDirectionTracker`\n  tracks hits by rela\n[…]\n\n  color per `kind`/HudTheme (default danger red), `pointer-events: none`.\n- `damage-direction` dev demo, tests, changelog, regenerated skill artifacts.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add damage-direction indicators (hit-from arcs) (#1441)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:45:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f1734f27367adaf10a0707b110c64f78827559a",
          "body": "The agents' GitHub App integration has no actions:write, so\nworkflow_dispatch is unreachable from sessions (403 on dispatch, tried\nlive against main). issue_comment-triggered workflows run from the\ndefault branch and comments ARE postable through repository-scoped\nAPIs, so `/pr-video <clip_path>` on\n[…]\nnline-playing URL. Docs route agents to the\ncomment command.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "pr-video workflow: ChatOps trigger via /pr-video comment (#1452)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:44:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20c5a17cd416f6e9ba056455a15243b46d45021e",
          "body": "Add createDayNightCycle: a serializable, genre-agnostic day-night brain in\n@jgengine/core/time. It advances a normalized day fraction on an injected clock\nand blends per-keyframe phase labels and tint/light colors, with pause/play/\nsetSpeed/setDayFraction, subscribe, snapshot/restore, and a calendar\n[…]\n strings stay free-form; the model never interprets their meaning. New\nday-night dev demo, 12 core tests, regenerated capability/api/manifest artifacts.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core,shell): turnkey day-night cycle preset (#1440)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:42:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21a95c9dd91e5a13a17d042539207cb9dec9b275",
          "body": "…(#1451)\n\nCloud agent sessions sit behind an egress gateway that only allows\nrepository-scoped GitHub endpoints, so bun run pr-video can never reach\nthe github.com/user-attachments upload flow from there (discovered live:\n403 from the gateway, not the cookie). Actions runners have open egress:\nthe n\n[…]\nshared egress IPs 403\nunauthenticated api.github.com calls).\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add pr-video workflow: inline PR video upload from an Actions runner …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:42:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc0479ec6f3e2e7949e47c8dec5067d80ff84109",
          "body": "Add a drop-in React StatusEffectBar that renders active buffs/debuffs as\npainted icons with a radial countdown ring and stack-count badge, driven off\nthe existing status model (combat/statusApplication's StatusInstance).\n\nA thin genre-agnostic core selector (combat/statusEffectView:\ntoStatusEffectVi\n[…]\n existing game-icons.net icon system.\n\nAdds the `status-effects` dev demo driving poison/haste/shield/regen sample\neffects with partially-elapsed rings.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add status-effect timeline HUD (icons + countdown rings) (#1434)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:38:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d833d9a0b51c162c4459bd2b5c465f57c2353b4",
          "body": "Replaces the vice-isle collision GIF (landed in #1437) with the\nfull-fidelity MP4, and updates the behavior-over-time evidence guidance\nin CLAUDE.md/AGENTS.md and the jgengine-verify skill to forbid animated\nGIFs: motion evidence is the MP4 (native inline player via pr-video when\nGH_SESSION_TOKEN is\n[…]\nmoving that emission from the recorder is a separate\ntooling change if wanted.\n\n\nClaude-Session: https://claude.ai/code/session_0137CBuMjXMNgq9vqKhnmkxz\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Evidence policy: clips are video or still images, never GIF (#1442)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:38:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f191efb05d4704bc9699707a773a3f84eeb7f72",
          "body": "Add createSequenceDirector: a genre-agnostic, serializable timeline that\nfires typed cues ({ atMs, kind, payload }) on one injected clock, once and\nin order even across a large seek, with play/pause/seek/skip/stop and\nsnapshot/restore. The director only schedules and emits cues via onCue; it\nnever i\n[…]\nprogress + controls, and\nCutsceneLetterbox is a reskinnable cinematic-bars + caption + Skip overlay.\nA `cutscene` dev demo autoplays a running cutscene.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): serializable cutscene / sequence director (#1430)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:34:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0be189bc7b9fc017ff51cd45ffa4086c66e5cbce",
          "body": "Records vice-isle walking into a building (spawn -163,0,27, KeyW held\n~40s) via bun run drive --record. The MP4 upload path (pr-video →\ngithub.com/user-attachments) is blocked by this session's egress policy,\nwhich only permits repository-scoped GitHub endpoints, so the animated\nGIF is committed here and embedded inline on the issue via raw.githubusercontent.\n\n\nClaude-Session: https://claude.ai/code/session_0137CBuMjXMNgq9vqKhnmkxz\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add vice-isle collision clip GIF for issue #1405 (#1437)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:31:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3533694f188b81c2ab0e21c44827283676e8930b",
          "body": "Add a genre-agnostic modal dialog system as paired drop-ins.\n\nCore (`@jgengine/core/ui/modalStack`): `createModalStack` is a\nserializable, observable stack of opaque modal records — push to open,\npop/resolve with a free-form result to close, query top/isOpen/depth,\noptional injected-clock auto-dismi\n[…]\not list. All HudTheme-token-driven — the game owns\nfinal layout, terminology, and skin.\n\nDemo: `pause-menu` opens the pause menu over the scene on init.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): modal/confirm dialog stack + reskinnable pause menu (#1432)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:30:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "753b127c5943c3c406efadcc0a47016970413493",
          "body": "…#1436)\n\n* Auto-start agent bootstrap from the SessionStart hook on cold trees\n\nThe cold-session ritual — agent must notice the cold note, remember to\nbackground bun run agent:bootstrap, never kill it, and re-check before\nbuilding — was prompt-enforced choreography. Every agent platform\n(Codespaces \n[…]\nootstrap step\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01N6FMCXbrRHnqoJ7w7qSK7N\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Auto-start agent bootstrap from the SessionStart hook on cold trees (…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:29:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0c9c4b1e94b77ef8880f44400929206f2873083",
          "body": "…ay (#1427)\n\nAdd `createScreenEffects` (@jgengine/core/vfx/screenEffects), a genre-agnostic,\nserializable screen-feedback controller: transient full-screen flashes and edge\nvignettes plus sustained, optionally oscillating tints (low-health pulse). Each\neffect is data-first — a free-string `kind` the\n[…]\npointer-transparent color-grade layers over the canvas. Add the\n`screen-effects` demo showing a live low-health vignette plus damage/heal/stun\ntriggers.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(vfx): add screen-state effects (postfx) controller + shell overl…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:24:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b7bf42cc297d02f411626a23f1a309bdc97cc9d",
          "body": "…#1416)\n\nfireProjectile is a generic seam (guns, bolts, grenades, launchers), but the\nshell drew a straight muzzle->impact tracer line for every projectile.settled\nevent, on by default. For a game that never asked it looked like a random\n\"beam\", and for a lobbed/exploding shot the straight line cut \n[…]\nannels still\n  default on. Opt the-robots and vice-isle back in.\n\nCloses #1415\n\n\nClaude-Session: https://claude.ai/code/session_014z4zAt1bg66tQKF9BYtYRc\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(shell): make projectile tracers opt-in and skip ballistic shots (…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:04:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d347b35abc4f025e24dbff31b4bf4b305c9d9dbf",
          "body": "…#1414)\n\nGitHub's inline video player only accepts user-attachments URLs, and\nthere is no token API for creating them (community #29993; cli/cli#13256\nis blocked on one) — the browser upload flow authenticated by a session\ncookie is the only path. pr-video wraps it (user-attachments npm pkg):\nGH_SES\n[…]\nand the GIF preview + mp4 download link remain the evidence.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add pr-video: natively-playing inline PR video via user-attachments (…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T22:01:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c3d25d57498b6e0e32acb7055740e2fc685e7e5",
          "body": "…IF (#1413)\n\nThe GIF is capped by GitHub camo's ~5MB image ceiling and thinned to\nfit; the clip itself should not be. --record now additionally encodes\nshots/<game>-<name>.mp4 — every captured frame, true per-frame timing,\nno size budget — via the ffmpeg binary shipped inside the\n@ffmpeg-installer/f\n[…]\nit\nfor download; GitHub cannot inline-play bot-hosted video.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "drive --record also writes a full-fidelity MP4 alongside the inline G…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T21:54:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6cb2c14e53174caebd177923b757aea80fe332e6",
          "body": "Add createCoachMarkSequence — a genre-agnostic onboarding model: an\nordered list of coach-mark steps (title/body, optional anchor+placement,\ndata-first string condition), a persisted seen-set so completed hints\nnever re-show, condition-gating, advance/dismiss/skipAll, and\nserializable snapshot/resto\n[…]\nspotlight backdrop, Next/Skip, and a reskinnable theme). New\ncoach-marks demo.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): tutorial coach-mark onboarding hints (#1410)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T21:30:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c922073fca15e66b9b317ace1569feb85b2440b4",
          "body": "Animated PNG renders as a static first frame in too many viewers — the\nclip evidence never reached the reader. GIF animates everywhere (GitHub\ncamo, chat panels, editors), and 256-color quantization of flat-shaded\ngame art fits ~8x more frames under the camo budget: the collision demo\nwent from 8 lo\n[…]\n home\n(framesFromTimeline/thinFrames) and a lossless option.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "drive --record emits animated GIF instead of animated PNG (#1408)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T21:25:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "65707bb863f73f613239e213685a2b5d4af93d06",
          "body": "…401)\n\nAdd createParticleSystem — a genre-agnostic, allocation-aware particle\nemitter with a fixed pool, data-only EmitterConfig (rate, lifetime,\nspeed, cone spread, gravity, drag, size/color/alpha over life), burst\nand continuous emission, dt-driven integration with swap-remove reaping,\nStructure-o\n[…]\n (additive or normal blending). New particle-vfx demo\n(fire / smoke / sparks).\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(vfx): generic deterministic particle system + shell renderer (#1…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T21:25:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e50fed7b847beaac6e37e8be3960ded4e4c78513",
          "body": "…1407)\n\nA drive --record clip embedded only in the PR body still hides the\nevidence from the person reading the chat. The verify skill and the\ngovernance invariant now require sending every recorded clip into the\nconversation as well.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Evidence policy: recorded clips are shared in the conversation too (#…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T21:19:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "40897d8f89a83b7717433ce448b44f3f1686cdb7",
          "body": "Screenshots cannot prove behavior over time (collision, movement,\ncamera, animation). GitHub never inline-plays video from bot-pushable\nURLs — only cookie-gated drag-and-drop attachments — but animated\nimages DO animate inline from raw.githubusercontent URLs (camo proxy,\n~5MB ceiling). So:\n\n- script\n[…]\nior unchanged; falls back to the same marker).\n\nCloses #1405\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_01C3WeWn7Q7GVgvpzpZr9rqa\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add drive --record: gameplay clips as inline PR evidence (#1406)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T21:11:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4db53ddb6aca3c709471d1584b9decb27c2c76eb",
          "body": "…paths (#1404)\n\nscripts/exportManifest.test.ts fails on a clean main checkout because these\ntwo editor modules landed without regenerating scripts/export-manifest.json.\nMechanical regen via bun scripts/gen-export-manifest.ts; no source changes.\n\n[skip changelog]\n\n\nClaude-Session: https://claude.ai/code/session_015XRDLDd3ZrJXT6W9TK4Rb5\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: regenerate export manifest for editor orbitFraming/harness sub…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T20:42:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd4d2b5aa996a8bbfb01d5241fbd4c7207b8f782",
          "body": "…efault-on blocking (#1403)\n\n* Overhaul walking/vehicle collision: no tunneling, stand on objects, default-on blocking\n\nFixes four root causes behind \"rubber-band or walk straight through\" collision (#1402):\n\n- Swept axis clamp in resolveObstacleStep: a step whose target lands beyond a\n  box's far f\n[…]\nshape failure\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015XRDLDd3ZrJXT6W9TK4Rb5\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Overhaul walking/vehicle collision: no tunneling, stand on objects, d…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T20:41:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d56a88b152ffb8d0f1e4b10e2a0a216594ed50a7",
          "body": "Add createFastTravelNetwork — a genre-agnostic model of fast-travel\npoints with per-player discovery, distance-sorted queries, a nearest\nlookup, a canTravel gate, an onDiscover seam, and serializable\nsnapshot/restore (re-seeds `initial` points). React adds useFastTravel\nand a region-grouped FastTrav\n[…]\nstances, a discovery\ncounter, and a \"you are here\" flag. New fast-travel demo.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(world): fast-travel discovered-destinations network + menu (#1399)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T20:01:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c8ba41fede880be9d0d1addcf47ea172d47f62f",
          "body": "…1394)\n\nThe durable counterpart to transient toasts.\n\n- core: `createNotificationCenter` (@jgengine/core/game/notifications) —\n  serializable, observable, capped newest-first log with read tracking:\n  push/list(filter)/unreadCount/markRead/markAllRead/remove/clear +\n  snapshot/restore.\n- react: `use\n[…]\nerated gameplay barrel + capability/api/manifest; CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): notification center — persistent read-tracked log + bell (#…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T19:45:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c182aaffedef9c6792c38ee83ccff3cdd1c2e8cb",
          "body": "…ure (#1390)\n\nAdd a genre-agnostic photo mode.\n\n- core: `createPhotoModeStore` (@jgengine/core/ui/photoMode) — serializable,\n  observable { active, hideHud } the game binds its capture flow to.\n- react: `usePhotoMode`, `PhotoModeControls` (hide-HUD toggle, capture, exit).\n- shell: `@jgengine/shell/r\n[…]\n\nRegenerated ui barrel + capability/api/manifest; CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(shell): photo mode — hide-HUD, free-camera state, and scene capt…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T19:28:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3c2defbf50d60f37d6635e84fa21236cad6fccd",
          "body": "…ce-track synthesis, decal layering, building variety, structural hierarchy (#1388)\n\n* Compose cityContent massing into generateCity lots (#1367)\n\nresolveCityLotContent (and generateCity's new content option) enriches\nfrontage lots with zone band, building class, floors, and cityContent's\nmassing pi\n[…]\n/city exports\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01TiNv8jQJiANZZBDS37Ubx3\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "City/street generator overhaul: welded intersections, real curves, ra…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T19:13:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "de2897f779acbcf7784d4d646475aabbea9e3628",
          "body": "…w, real site fullscreen (#1380)\n\n* touch: mode-aware analog controls, smoothed chase yaw, real site fullscreen (#1370)\n\nMobile play was unusable (player screenshots, Vice Isle): every keybind\nderived a permanent on-screen button (13 at once, flight + vehicle chrome\non foot, wrapping over the joysti\n[…]\nh latest main\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Dh9uMJADPzAU529oBGeKNL\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Touch controls: per-context modes, analog joystick, smoothed chase ya…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T19:08:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "549ae7f2e3a043e62904a4ce2f059d5bec8ac8ed",
          "body": "…s (#1387)\n\nGrow the radial menu into a full quick-menu family.\n\n- core: `@jgengine/core/ui/radialMenu` gains `RadialArc` (startAngle/sweep) so\n  the wheel can be a partial arc, with bounds-aware selection. Backward compatible.\n- react: `RadialMenu` renders per-slice hotkeys, count badges, cooldowns\n[…]\n\nRegenerated ui barrel + capability/api/manifest; CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): expansive quick menu — arc/list/grid forms, submenus, badge…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T19:04:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a44ba2ecdc25b81cee8c7b925c47daa08ed4618",
          "body": "Ship the missing widget over the existing quest/objective models.\n\n- core: `describeTrackedQuest(def, instance)` (@jgengine/core/game/quest) joins a\n  QuestDef + live QuestInstance into a flat TrackedQuestView; `defaultObjectiveLabel`\n  derives readable objective text (overridable).\n- react: `QuestT\n[…]\nerated gameplay barrel + capability/api/manifest; CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): quest/objective tracker HUD over the quest model (#1382)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T18:52:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73fd4c8545bc94d19989eb576758b85cbeaa89d3",
          "body": "Add the missing radial-menu UI primitive.\n\n- core: `@jgengine/core/ui/radialMenu` — pure geometry: radialSlices,\n  radialIndexFromAngle, radialIndexFromVector (pointer/stick vector → slice with\n  a neutral dead zone), radialSlicePosition. Slices centered from \"up\" clockwise.\n- react: `RadialMenu` — \n[…]\n\nRegenerated ui barrel + capability/api/manifest; CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ui): radial/quick menu (weapon/emote wheel) (#1385)",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T18:49:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "89e56348e128728587c8acb10ffb57e86c82e9fd",
          "body": "…(#1383)\n\nWire the i-have-adhd Claude Code plugin into project settings so sessions\nin this repo get ADHD-friendly, action-first output shaping. Equivalent of:\n\n  claude plugin marketplace add ./i-have-adhd\n  claude plugin install i-have-adhd@i-have-adhd\n\nbut committed to the repo (github marketplac\n[…]\npinned to main)\ninstead of touching an ephemeral ~/.claude in a cloud session.\n\n\nClaude-Session: https://claude.ai/code/session_01RpKb8T7YmQEQBidJZeQkSu\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(claude): register i-have-adhd plugin marketplace and enable it …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T18:47:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "371ddcb865d83aceee586d00a052929dffe0e626",
          "body": "…scale (#1379)\n\nFill the accessibility-options gap (input rebinding already existed).\n\n- core: `createAccessibilityStore` (@jgengine/core/ui/accessibility) —\n  serializable, observable prefs (reduced motion, high contrast, textScale,\n  colorblind, captions) + snapshot/restore; `COLORBLIND_MATRICES`,\n[…]\nRegenerated ui barrel + capability/api/\nmanifest; CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(a11y): accessibility options — reduced motion, colorblind, text …",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T18:30:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e12ebed6b9a51058cd6d0956f0a6a02637f9300",
          "body": "…ol (#1362)\n\nDeliver the \"draw on it\" part of the map: a serializable annotation layer plus\na freehand draw tool in the fullscreen map.\n\n- core: `createAnnotationLayer` (@jgengine/core/world/mapAnnotations) — freehand\n  strokes, area shapes, and pinned notes (world-XZ), with `routes()`/`zones()`\n  p\n[…]\ncapability/skill-api indexes and export manifest; CHANGELOG entry\nunder Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(map): draw on the map — annotation layer + FullscreenMap draw to…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T18:18:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e6843c0dc9d0014780e61e571c3b524f762165f",
          "body": "…1375)\n\nClose the fully-absent localization gap with a genre-agnostic i18n layer.\n\n- core: `createI18n` (@jgengine/core/i18n, also on the ui barrel) — translate a\n  message Catalog with active-locale lookup + fallback chain, {param}\n  interpolation, and Intl.PluralRules-based plural(); observable so\n[…]\nied in English and Japanese.\n\nNo content shipped. CHANGELOG entry under Added.\n\n\nClaude-Session: https://claude.ai/code/session_01YaVswoFbAWX7F4LzsZxF3K\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(i18n): localization — message catalog, interpolation, plurals (#…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T18:16:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d48430ec21125f60f36fda47cccbb087b6384b8",
          "body": "…ment (#1371)\n\nThe claim was a soft phrase buried in prose (\"Claim tracked work once with\n`Working on this in <branch>`\"), so agents routinely opened PRs against issues\nthey never actually commented on. Promote it to an explicit, imperative,\nverifiable action across all three delivery entry points —\n[…]\nuiring the comment go up front before\nimplementation, not deferred to PR time.\n\n\nClaude-Session: https://claude.ai/code/session_01FJ7XmhugCPBni52Hz7B3ix\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make issue claim an explicit, up-front step in workflow/improve/imple…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T18:08:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a281f45698a3f001b8966a12404d5592db4d2a87",
          "body": "…ind (#1369)\n\nThe click-to-place pipeline already existed (registered scene kinds show\nas tools in the + Add menu), but registering a plain logical marker kind\nmeant a full studio's schema + resolver, so no game used it — and the\n+ Add menu lumped every registered kind under one hardcoded \"Studios\"\n\n[…]\nsession's live schema validation of the registered kind\ndogfooded via the CLI.\n\n\nClaude-Session: https://claude.ai/code/session_01QL435S51o34qr8vn8cByt6\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "editor: click-to-place custom marker kinds via definePlaceableMarkerK…",
          "author_name": "NoisemakerJon",
          "author_login": "Noisemaker111",
          "committed_at": "2026-07-19T17:56:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 1,
      "commits_last_year": 1029,
      "latest_release_at": "2026-07-12T01:07:14Z",
      "latest_release_tag": "packs",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 13,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@jgengine/core",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "jgengine",
            "agent-first",
            "game-framework",
            "typescript-game-framework",
            "typescript",
            "multiplayer",
            "game-engine"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@jgengine/core",
          "is_deprecated": false,
          "latest_version": "0.14.0",
          "repository_url": "https://github.com/Noisemaker111/jgengine",
          "versions_count": 15,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3230,
          "first_published_at": "2026-07-05T22:21:54.018000Z",
          "latest_published_at": "2026-07-19T05:04:18.910000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@jgengine/assets",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@jgengine/assets",
          "is_deprecated": false,
          "latest_version": "0.14.0",
          "repository_url": "https://github.com/Noisemaker111/jgengine",
          "versions_count": 11,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1415,
          "first_published_at": "2026-07-06T07:25:05.748000Z",
          "latest_published_at": "2026-07-19T05:04:47.644000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@jgengine/convex",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@jgengine/convex",
          "is_deprecated": false,
          "latest_version": "0.14.0",
          "repository_url": "https://github.com/Noisemaker111/jgengine",
          "versions_count": 14,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1871,
          "first_published_at": "2026-07-05T22:22:08.253000Z",
          "latest_published_at": "2026-07-19T05:04:32.768000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@jgengine/editor",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@jgengine/editor",
          "is_deprecated": false,
          "latest_version": "0.14.0",
          "repository_url": "https://github.com/Noisemaker111/jgengine",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 744,
          "first_published_at": "2026-07-16T22:26:57.529000Z",
          "latest_published_at": "2026-07-19T05:04:43.864000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@jgengine/github",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@jgengine/github",
          "is_deprecated": false,
          "latest_version": "0.1.0",
          "repository_url": "https://github.com/Noisemaker111/jgengine",
          "versions_count": 1,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 76,
          "first_published_at": "2026-07-16T22:27:01.518000Z",
          "latest_published_at": "2026-07-16T22:27:01.883000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        },
        {
          "name": "jgengine",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "jgengine",
            "agent-first",
            "game-framework",
            "typescript-game-framework",
            "typescript",
            "javascript",
            "three.js",
            "webgl",
            "ai-agent",
            "agent-skills",
            "scaffold",
            "cli"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/jgengine",
          "is_deprecated": false,
          "latest_version": "0.11.0",
          "repository_url": "https://github.com/Noisemaker111/jgengine",
          "versions_count": 10,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 1777,
          "first_published_at": "2026-07-11T01:21:18.255000Z",
          "latest_published_at": "2026-07-19T05:04:53.289000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 5,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 38
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "recipes"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "Games/claudecraft/tsconfig.json",
        "Games/duet-keys/tsconfig.json",
        "Games/ironhold/tsconfig.json",
        "Games/loopline/tsconfig.json",
        "Games/spire-cards/tsconfig.json",
        "Games/starhome/tsconfig.json",
        "Games/studio-showcase/tsconfig.json",
        "Games/the-robots/tsconfig.json",
        "Games/tower-guard/tsconfig.json",
        "Games/vice-isle/tsconfig.json",
        "Games/wreckway/tsconfig.json",
        "apps/desktop/tsconfig.json",
        "apps/dev/tsconfig.json",
        "apps/web/tsconfig.json",
        "examples/ark-survival-kit/tsconfig.json",
        "examples/convex-host/tsconfig.json",
        "examples/express-host/tsconfig.json",
        "examples/next-host/tsconfig.json",
        "examples/studios/tsconfig.json",
        "examples/tanstack-host/tsconfig.json",
        "packages/assets/tsconfig.json",
        "packages/convex/tsconfig.json",
        "packages/core/tsconfig.json",
        "packages/editor/tsconfig.json",
        "packages/github/tsconfig.json",
        "packages/jgengine/tsconfig.json",
        "packages/node/tsconfig.json",
        "packages/react/tsconfig.json",
        "packages/shell/tsconfig.json",
        "packages/sql/tsconfig.json",
        "packages/ws/tsconfig.json",
        "registry/tsconfig.json"
      ],
      "toolchain_manifests": [
        "apps/desktop/src-tauri/Cargo.toml"
      ],
      "largest_source_bytes": 117362,
      "source_files_sampled": 2484,
      "oversized_source_files": 6,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "Games/ironhold/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 14242
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "registry/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": 3,
        "malicious_count": 0,
        "assessed_package": "npm:jgengine@0.11.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@jgengine/core",
          "manifest": "registry/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "registry/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "registry/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "react",
          "manifest": "registry/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "registry/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/claudecraft/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/claudecraft/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/claudecraft/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/claudecraft/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/claudecraft/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/claudecraft/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/claudecraft/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/claudecraft/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/duet-keys/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/duet-keys/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/duet-keys/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/duet-keys/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/duet-keys/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/duet-keys/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/duet-keys/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/duet-keys/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/assets",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/drei",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.7.7"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/ironhold/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/loopline/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/loopline/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/loopline/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/loopline/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/loopline/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/loopline/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/loopline/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/loopline/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/spire-cards/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/spire-cards/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/spire-cards/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/spire-cards/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/spire-cards/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/spire-cards/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/spire-cards/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/spire-cards/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/starhome/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/starhome/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/starhome/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/starhome/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/starhome/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/starhome/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/starhome/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/starhome/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine-examples/studios",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/studio-showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/the-robots/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/the-robots/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/the-robots/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/the-robots/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/the-robots/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/the-robots/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/the-robots/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/the-robots/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/assets",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/tower-guard/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/assets",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/ws",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/vice-isle/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/assets",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/core",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/ws",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "react",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "Games/wreckway/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/editor",
          "manifest": "apps/desktop/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/react",
          "manifest": "apps/desktop/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "apps/desktop/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "react",
          "manifest": "apps/desktop/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "apps/desktop/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "@jgengine-examples/studios",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/convex",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@react-three/drei",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.7.7"
        },
        {
          "name": "@react-three/fiber",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.5.0"
        },
        {
          "name": "convex",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.31.2"
        },
        {
          "name": "react",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "apps/dev/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@fontsource-variable/inter",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.8"
        },
        {
          "name": "@fontsource-variable/jetbrains-mono",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.8"
        },
        {
          "name": "@jgengine/core",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@jgengine/github",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@tanstack/react-router",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.121.0"
        },
        {
          "name": "@tanstack/react-start",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.121.0"
        },
        {
          "name": "nitro",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.0.260610-beta"
        },
        {
          "name": "react",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "react-dom",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.3"
        },
        {
          "name": "three",
          "manifest": "apps/web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.182.0"
        },
        {
          "name": "@jgengine/core",
          "manifest": "packages/assets/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.0"
        },
        {
          "name": "fflate",
          "manifest": "packages/assets/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.8.2"
        },
        {
          "name": "@jgengine/core",
          "manifest": "packages/convex/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.0"
        },
        {
          "name": "@jgengine/core",
          "manifest": "packages/editor/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.0"
        },
        {
          "name": "@jgengine/react",
          "manifest": "packages/editor/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.0"
        },
        {
          "name": "@jgengine/shell",
          "manifest": "packages/editor/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.0"
        },
        {
          "name": "@jgengine/assets",
          "manifest": "packages/jgengine/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.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": 3,
        "merged_prs": 885,
        "open_issues": 35,
        "closed_ratio": 0.943,
        "closed_issues": 576,
        "closed_unmerged_prs": 57
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "Noisemaker111",
          "commits": 952,
          "avatar_url": "https://avatars.githubusercontent.com/u/139656120?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 76,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "cursoragent",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/199161495?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.925
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-web.yml",
        "mirror-assets.yml",
        "pr-video.yml",
        "publish.yml",
        "vercel-logs.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "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": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "13 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "c61417e4ecb610d67db479a7a8c467bcf9a2a929",
        "ran_at": "2026-07-25T02:39:08Z",
        "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-24T21:05:13Z",
      "oldest_open_prs": [
        {
          "number": 1530,
          "created_at": "2026-07-21T05:25:44Z",
          "last_comment_at": "2026-07-21T05:25:50Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 1552,
          "created_at": "2026-07-24T21:00:58Z",
          "last_comment_at": "2026-07-24T21:01:05Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 1556,
          "created_at": "2026-07-24T21:04:58Z",
          "last_comment_at": "2026-07-24T21:05:03Z",
          "last_comment_author": "vercel"
        }
      ],
      "last_merged_pr_at": "2026-07-24T21:02:06Z",
      "ci_last_conclusion": "SKIPPED",
      "oldest_open_issues": [
        {
          "number": 1139,
          "created_at": "2026-07-18T20:12:58Z",
          "last_comment_at": "2026-07-19T04:30:34Z",
          "last_comment_author": "Noisemaker111"
        },
        {
          "number": 1146,
          "created_at": "2026-07-18T20:13:03Z",
          "last_comment_at": "2026-07-19T04:30:32Z",
          "last_comment_author": "Noisemaker111"
        },
        {
          "number": 1267,
          "created_at": "2026-07-19T04:00:28Z",
          "last_comment_at": "2026-07-19T09:07:32Z",
          "last_comment_author": "Noisemaker111"
        },
        {
          "number": 1320,
          "created_at": "2026-07-19T07:17:31Z",
          "last_comment_at": "2026-07-24T19:32:02Z",
          "last_comment_author": "Noisemaker111"
        },
        {
          "number": 1343,
          "created_at": "2026-07-19T17:02:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1345,
          "created_at": "2026-07-19T17:03:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1346,
          "created_at": "2026-07-19T17:03:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1347,
          "created_at": "2026-07-19T17:03:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1348,
          "created_at": "2026-07-19T17:03:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1349,
          "created_at": "2026-07-19T17:04:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1350,
          "created_at": "2026-07-19T17:04:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1351,
          "created_at": "2026-07-19T17:04:46Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1352,
          "created_at": "2026-07-19T17:04:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1353,
          "created_at": "2026-07-19T17:05:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1354,
          "created_at": "2026-07-19T17:08:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1355,
          "created_at": "2026-07-19T17:08:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1356,
          "created_at": "2026-07-19T17:09:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1357,
          "created_at": "2026-07-19T17:09:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1358,
          "created_at": "2026-07-19T17:09:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1417,
          "created_at": "2026-07-19T22:18:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Noisemaker111/jgengine",
    "host": "github.com",
    "name": "jgengine",
    "owner": "Noisemaker111"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 42,
        "vitality": 64,
        "community": 40,
        "governance": 56,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 64,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "commits_last_year": 1029,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 3
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "3/52 weeks with commits",
                "points": 2.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1029 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1029
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "packs",
              "releases_from_tags": false,
              "days_since_latest_release": 13,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 13 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "forks": 0,
              "stars": 5,
              "watchers": 0,
              "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": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "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": 6.3,
                "status": "met",
                "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": 66,
            "inputs": {
              "packages": [
                "@jgengine/core",
                "@jgengine/assets",
                "@jgengine/convex",
                "@jgengine/editor",
                "@jgengine/github",
                "jgengine"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 9113
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "9,113 downloads/month across npm",
                "points": 52.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 9113,
                      "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": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 18,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.925
            },
            "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 92% of commits",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "merged_prs": 885,
              "open_issues": 35,
              "closed_issues": 576,
              "issue_closed_ratio": 0.943,
              "closed_unmerged_prs": 57
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "94% of issues closed",
                "points": 44.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 94
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "885/942 decided PRs merged",
                "points": 35.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 885,
                      "decided": 942
                    }
                  }
                ],
                "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": "at_risk",
            "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": 41,
            "inputs": {
              "followers": 5,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Noisemaker111",
              "public_repos": 33,
              "account_age_days": 1105
            },
            "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": "5 followers of Noisemaker111",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "Noisemaker111"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "33 public repos, account ~3 yr old",
                "points": 17.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 33
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@jgengine/core",
                "@jgengine/assets",
                "@jgengine/convex",
                "@jgengine/editor",
                "@jgengine/github",
                "jgengine"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "6 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 6,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "15 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "6 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ai-agents",
                "game-development",
                "game-engine",
                "javascript",
                "react",
                "threejs",
                "typescript",
                "webgl"
              ],
              "has_wiki": true,
              "homepage": "https://jgengine.com",
              "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": "https://jgengine.com",
                "points": 15,
                "status": "met",
                "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": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 42,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 27,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "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": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "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 dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "13 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:jgengine@0.11.0 runtime dependency closure — what installing the published package pulls in — 3 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:jgengine@0.11.0",
                  "assessed": 3
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 3,
              "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": 3,
              "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
              }
            ]
          }
        ],
        "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": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "Games/ironhold/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 14242
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, Games/ironhold/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, Games/ironhold/AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "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": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "Games/claudecraft/tsconfig.json",
                "Games/duet-keys/tsconfig.json",
                "Games/ironhold/tsconfig.json",
                "Games/loopline/tsconfig.json",
                "Games/spire-cards/tsconfig.json",
                "Games/starhome/tsconfig.json",
                "Games/studio-showcase/tsconfig.json",
                "Games/the-robots/tsconfig.json",
                "Games/tower-guard/tsconfig.json",
                "Games/vice-isle/tsconfig.json",
                "Games/wreckway/tsconfig.json",
                "apps/desktop/tsconfig.json",
                "apps/dev/tsconfig.json",
                "apps/web/tsconfig.json",
                "examples/ark-survival-kit/tsconfig.json",
                "examples/convex-host/tsconfig.json",
                "examples/express-host/tsconfig.json",
                "examples/next-host/tsconfig.json",
                "examples/studios/tsconfig.json",
                "examples/tanstack-host/tsconfig.json",
                "packages/assets/tsconfig.json",
                "packages/convex/tsconfig.json",
                "packages/core/tsconfig.json",
                "packages/editor/tsconfig.json",
                "packages/github/tsconfig.json",
                "packages/jgengine/tsconfig.json",
                "packages/node/tsconfig.json",
                "packages/react/tsconfig.json",
                "packages/shell/tsconfig.json",
                "packages/sql/tsconfig.json",
                "packages/ws/tsconfig.json",
                "registry/tsconfig.json"
              ],
              "agent_commit_share": 0.88,
              "toolchain_manifests": [
                "apps/desktop/src-tauri/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "apps/desktop/src-tauri/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "apps/desktop/src-tauri/Cargo.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Games/claudecraft/tsconfig.json, Games/duet-keys/tsconfig.json, Games/ironhold/tsconfig.json, Games/loopline/tsconfig.json, Games/spire-cards/tsconfig.json, Games/starhome/tsconfig.json, Games/studio-showcase/tsconfig.json, Games/the-robots/tsconfig.json, Games/tower-guard/tsconfig.json, Games/vice-isle/tsconfig.json, Games/wreckway/tsconfig.json, apps/desktop/tsconfig.json, apps/dev/tsconfig.json, apps/web/tsconfig.json, examples/ark-survival-kit/tsconfig.json, examples/convex-host/tsconfig.json, examples/express-host/tsconfig.json, examples/next-host/tsconfig.json, examples/studios/tsconfig.json, examples/tanstack-host/tsconfig.json, packages/assets/tsconfig.json, packages/convex/tsconfig.json, packages/core/tsconfig.json, packages/editor/tsconfig.json, packages/github/tsconfig.json, packages/jgengine/tsconfig.json, packages/node/tsconfig.json, packages/react/tsconfig.json, packages/shell/tsconfig.json, packages/sql/tsconfig.json, packages/ws/tsconfig.json, registry/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Games/claudecraft/tsconfig.json, Games/duet-keys/tsconfig.json, Games/ironhold/tsconfig.json, Games/loopline/tsconfig.json, Games/spire-cards/tsconfig.json, Games/starhome/tsconfig.json, Games/studio-showcase/tsconfig.json, Games/the-robots/tsconfig.json, Games/tower-guard/tsconfig.json, Games/vice-isle/tsconfig.json, Games/wreckway/tsconfig.json, apps/desktop/tsconfig.json, apps/dev/tsconfig.json, apps/web/tsconfig.json, examples/ark-survival-kit/tsconfig.json, examples/convex-host/tsconfig.json, examples/express-host/tsconfig.json, examples/next-host/tsconfig.json, examples/studios/tsconfig.json, examples/tanstack-host/tsconfig.json, packages/assets/tsconfig.json, packages/convex/tsconfig.json, packages/core/tsconfig.json, packages/editor/tsconfig.json, packages/github/tsconfig.json, packages/jgengine/tsconfig.json, packages/node/tsconfig.json, packages/react/tsconfig.json, packages/shell/tsconfig.json, packages/sql/tsconfig.json, packages/ws/tsconfig.json, registry/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "88 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 88,
                      "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": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 117362,
              "source_files_sampled": 2484,
              "oversized_source_files": 6
            },
            "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": "6/2484 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 2484,
                      "oversized": 6
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples",
                "recipes"
              ],
              "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, recipes",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, recipes"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T02:39:40.161957Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/Noisemaker111/jgengine.svg",
  "full_name": "Noisemaker111/jgengine",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.