Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

Noisemaker111/jgengine tiene un índice de salud de 58 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (81/100) y la más baja, Community & Adoption (40/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

58
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

58
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

NoisemakerJonCuenta personal
5 seguidores33 repositorios públicosdesde jul 2023

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@jgengine/core0.14.0323015hace 5 díasjgengineagent-firstgame-frameworktypescript-game-frameworktypescriptmultiplayergame-engine
npm@jgengine/assets0.14.0141511hace 5 días
npm@jgengine/convex0.14.0187114hace 5 días
npm@jgengine/editor0.14.07445hace 5 días
npm@jgengine/github0.1.0761hace 8 días
npmjgengine0.11.0177710hace 5 díasjgengineagent-firstgame-frameworktypescript-game-frameworktypescriptjavascriptthree.jswebglai-agentagent-skillsscaffoldcli

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

64Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
2.1/36Cadencia de commits — 3/52 semanas con commits
18/18Volumen de commits — 1029 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year1029
human_commit_share1
days_since_last_push0
active_weeks_last_year3
Cómo se puntúa
27/27Publica versiones — 1 versiones publicadas
36/36Recencia de las versiones — última versión hace 13 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count1
latest_release_tagpacks
releases_from_tagsno
days_since_latest_release13
mean_days_between_releases

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

40En riesgo · 18% del índice global
Cómo se puntúa
9.8/60Estrellas — 5 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars5
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_template
Cómo se puntúa
52.8/80Descargas mensuales — 9113 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@jgengine/core, @jgengine/assets, @jgengine/convex, @jgengine/editor, @jgengine/github, jgengine
dependents
ecosystemsnpm
total_downloads
monthly_downloads9113
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

56Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
1.7/22.5Distribución de commits — el principal contribuyente firma el 92% de los commits
4.1/13.5Amplitud de contribuyentes — 3 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled3
top_contributor_share0,925
Cómo se puntúa
44.1/46.8Resolución de issues — 94% de issues cerradas
35.9/38.3Aceptación de PR — 885/942 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs885
open_issues35
closed_issues576
issue_closed_ratio0,943
closed_unmerged_prs57
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
5.6/25Alcance del propietario — 5 seguidores de Noisemaker111
17.2/25Trayectoria — 33 repos públicos, cuenta de ~3 años
Datos de entrada utilizados
followers5
owner_typeUser
is_verified
owner_loginNoisemaker111
public_repos33
account_age_days1105
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 6 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 15 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@jgengine/core, @jgengine/assets, @jgengine/convex, @jgengine/editor, @jgengine/github, jgengine
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

81Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 6 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-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
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://jgengine.com
10/10Descripción del repositorio
10/10Topics — 8 topics
10/10Wiki
Datos de entrada utilizados
topicsai-agents, game-development, game-engine, javascript, react, threejs, typescript, webgl
has_wiki
homepagehttps://jgengine.com
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

42En riesgo · 16% del índice global
Cómo se puntúa
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.5Licencia — 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
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate2,7
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages3
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de npm:jgengine@0.11.0 —lo que arrastra la instalación del paquete publicado—: 3 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

73Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md, Games/ironhold/AGENTS.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md, Games/ironhold/AGENTS.md
agent_instruction_max_bytes14.242
Cómo se puntúa
12.6/18Arranque con un solo comando — apps/desktop/src-tauri/Cargo.toml (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — 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/10Entorno reproducible — Dockerfile
10/10Práctica demostrada con agentes — 88 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
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
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
54.9/55Tamaños de archivo manejables — 6/2484 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes117.362
source_files_sampled2484
oversized_source_files6
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples, recipes
Datos de entrada utilizados
example_dirsexamples, recipes
has_mcp_signalno
api_schema_files

Datos clave

5estrellas de GitHub
3contribuidores
1029commits en los últimos 12 meses
0días desde el último push
1versiones publicadas
1factor bus
35issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 2.7 / 10
2.7agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
Dependencias directas 132
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Avisos de dependencias 0

Instalar npm:jgengine@0.11.0 arrastra 3 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.