Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 2.3.1 · 2026-07-31 00:05 UTC

stfurkan / bitgpu

Fast WebGPU runtime for 1-bit (binary-weight) LLMs in the browser. Bit-exact, zero runtime dependencies.

TypeScript · WGSL · PythonMIT★ 19 estrellas⑂ 2 forksdesde jul 2026Ver en GitHub ↗
TipoBibliotecacómo se determina

stfurkan/bitgpu tiene un índice de salud de 45 sobre 100, lo que lo sitúa en la banda Débil. Su puntuación más alta es Vitality (74/100) y la más baja, Security (33/100). Se actualizó por última vez hace 7 días. Una sola persona concentra la mayor parte del trabajo reciente.

45
global / 100
Débil

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala estandarizada de 1 a 100. El resultado global parte de su media ponderada, calibrada contra la distribución del registro público para que las bandas tengan significado percentil; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe un límite «En riesgo» de 34.

45
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas 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.

El resultado global ponderado 47 se calibra a 45 en la escala publicada del índice (calibración del registro 2026-08-02).

Titularidad

Sait Furkan TekeCuenta personal
25 seguidores20 repositorios públicosdesde ene 2018

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
npmbitgpu0.19.1334921hace 8 díaswebgpullmlow-bit1-bitquantizationbinaryinferencebrowseron-deviceqwen3

Métricas por categoría

Vitalidad

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

74Bueno · 21% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 7 días
2.1/36Cadencia de commits — 3/52 semanas con commits
18/18Volumen de commits — 99 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_year99
human_commit_share1
days_since_last_push7
active_weeks_last_year3
Cómo se puntúa
27/27Publica versiones — 18 versiones publicadas
36/36Recencia de las versiones — última versión hace 8 días
27/27Cadencia de publicación — una versión cada ~0,7 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count18
latest_release_tagv0.19.1
releases_from_tagsno
days_since_latest_release8
mean_days_between_releases0,7
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

40Débil · 17% del índice global
Cómo se puntúa
20.4/60Estrellas — 19 estrellas
0/25Forks — 2 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks2
stars19
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 (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
readme_badges
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_services
has_pull_request_templateno
Cómo se puntúa
47/80Descargas mensuales — 3349 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesbitgpu
dependents
ecosystemsnpm
total_downloads
monthly_downloads3349
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?

36Débil · 23% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/42Resolución de issues — sin issues o sin datos
0/30Aceptación de PR — sin PR decididos o sin datos
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio
closed_unmerged_prs0
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR, newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
10.2/25Alcance del propietario — 25 seguidores de stfurkan
21.6/25Trayectoria — 20 repos públicos, cuenta de ~8 años
Datos de entrada utilizados
followers25
owner_typeUser
is_verified
owner_loginstfurkan
public_repos20
account_age_days3129
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 — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 8 días
20/20Historial de versiones — 21 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesbitgpu
ecosystemsnpm
any_deprecatedno
min_days_since_publish8

Calidad de Ingeniería

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

52Moderado · 19% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
0/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_testsno
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

85Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 7 topics
10/10Wiki
Datos de entrada utilizados
topics1-bit, browser, inference, llm, on-device-ai, quantization, webgpu
has_wiki
homepage
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?

33En 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
0/2.5CI-Tests — sin datos
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/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,3
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

42Débil · 4% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 85 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,859
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
0/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 99
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Datos de entrada utilizados
has_nixno
has_testsno
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
52.1/55Tamaños de archivo manejables — 2/38 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes167.981
source_files_sampled38
oversized_source_files2
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

19estrellas de GitHub
1contribuidores
99commits en los últimos 12 meses
7días desde el último push
18versiones publicadas
1factor bus
0issues 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

Historial de estrellas y forks 0 ★ / 2 ⇿
0Estrellas
2Forks
5Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

111222212026-072026-072026-07
Mayor 0Menor 4Parche 1
OpenSSF Scorecard 3.3 / 10
3.3agregado

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-31 00:05 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
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
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "1-bit",
        "browser",
        "inference",
        "llm",
        "on-device-ai",
        "quantization",
        "webgpu"
      ],
      "is_fork": false,
      "size_kb": 41865,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "WGSL": 122482,
        "Python": 99001,
        "JavaScript": 45063,
        "TypeScript": 466742
      },
      "pushed_at": "2026-07-23T15:42:14Z",
      "created_at": "2026-07-03T20:11:25Z",
      "owner_type": "User",
      "updated_at": "2026-07-25T03:54:10Z",
      "description": "Fast WebGPU runtime for 1-bit (binary-weight) LLMs in the browser. Bit-exact, zero runtime dependencies.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "WGSL",
        "Python"
      ]
    },
    "owner": {
      "blog": "stfurkan.com",
      "name": "Sait Furkan Teke",
      "type": "User",
      "login": "stfurkan",
      "company": null,
      "location": null,
      "followers": 25,
      "avatar_url": "https://avatars.githubusercontent.com/u/35101659?v=4",
      "created_at": "2018-01-04T12:13:26Z",
      "is_verified": null,
      "public_repos": 20,
      "account_age_days": 3129
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.19.1",
          "kind": "patch",
          "published_at": "2026-07-22T02:12:29Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-21T18:11:42Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-07-21T16:13:36Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-07-21T06:47:56Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-07-20T06:59:09Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-07-19T21:20:27Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-07-19T01:14:41Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-07-18T17:46:56Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-07-16T02:20:53Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-15T10:13:46Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-14T23:48:35Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-13T22:37:39Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-11T16:57:28Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-11T08:47:22Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-08T23:48:18Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-08T23:47:56Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-08T23:47:56Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-04T14:52:15Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "ba0f5957404a4ca08623b22541a23b5043770ca6",
          "body": "Runs the two weight-free GPU gates in CI - per-kernel bit-exactness vs\nthe numpy oracle (test:kernels) and the synthetic-model end-to-end\nengine gate (test:hybrid) - on macos-latest, where headless Chrome\nreaches Metal via --use-angle=metal. Gate scripts take CHROME_BIN so\nthe runner's Chrome is discoverable. UNVALIDATED until first push: if\nthe job fails at the adapter probe, the runner image lacks WebGPU.",
          "is_bot": false,
          "headline": "ci: real-GPU smoke job on the hosted Apple silicon runners",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-23T15:37:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20dbb9b21ae427bdddaa332d11a33a14702652d0",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.19.1",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-22T02:11:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afcb1698f19a815f7322fa16f87c68afb9965298",
          "body": "…x the sinks-minimum in the new affBuf gate\n\nmodel-synth-* is verify:hybrid's fixture (which gates it properly); under\nFULL=1 the dense sweep picked it up and failed on the missing known-good\nids. The affBuf-growth gate now uses the sinks minimum window (68) with\n80 distinct history tokens.",
          "is_bot": false,
          "headline": "harness: exclude synthetic fixtures from the dense headless plan + fi…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-22T00:43:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4a5d4c492fc21563dae0dffb642d810ecc533ee",
          "body": "verify-chat (K): observe once-per-step, duplicate/exhausted XML keys,\njson-value whitespace cap, oneOf param grammar+parse, close-marker-text\nrejection in tool values, XML setup rejection of minLength/empty-enum.\nverify-hybrid: prefill()+reuse == cold (single recurrence feed),\npromptLookup auto-skip\n[…]\nxplicit-throw gates.\nverify.html: out-of-top-K candidateFilter fallback e2e, sinks-mode\naffected-ids growth under a clean validation scope, chunked snapshot\nreadback byte-identity (4 KiB staging cap).",
          "is_bot": false,
          "headline": "tests: regression coverage for the 0.19.1 audit fixes",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T22:48:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74dc407c1dbbf0c4f320ea45b20f2b70245a6b91",
          "body": "…two release blockers\n\nChunked saveCache readback (bounded <=128MiB staging, __RBCAP test hook):\na snapshot larger than the negotiated maxBufferSize (4B q8 past ~3.2k\ncached tokens) failed as an uncaptured validation error cascade and\nsessions silently stopped persisting.\n\nRelease blockers from the \n[…]\nstring enum literals at setup instead of silently not enforcing\n- ThinkBudget.observe counts once per emitted step (the full-vocab walk\n  re-invokes the filter per batch and ate the early-stop window)",
          "is_bot": false,
          "headline": "engine+chat: fix 16 audited bugs incl. chunked snapshot readback and …",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T22:42:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f454c5e718b83db621f3a9e4d97988dc800b202",
          "body": "- PREFILL SCRATCH ARENA: a layer's transient buffers are dead once its\n  dispatches are encoded (only the hidden state flows forward), and a\n  compute pass executes dispatches as-if serially - so later layers now\n  REUSE earlier layers' buffers via size-keyed free lists in stack().\n  Live prefill sc\n[…]\ndentical,\nseg-equivalence cos 1.000000), FULL dense 5/5 PACKAGE OK bit-exact\n(hot dips re-verified cool: 4B 21.0 / 8B 12.7 tok/s), real-27B live\ngate PASS. Dense byte-identical with new options unset.",
          "is_bot": false,
          "headline": "bitgpu 0.19.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T18:11:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3c781c7d4c375abe1e8df3c7fa126adbc6a71ae8",
          "body": "… (npm run test:27b)\n\nTwo closures from the 0.18 root-cause work:\n\n- runPrefill wraps each segment (all transient createBuffers + the\n  submission) in an out-of-memory error scope and THROWS a clear,\n  actionable error instead of letting a failed allocation silently\n  corrupt output (the 0.15/0.18 2\n[…]\nregression, and the typed tool-calling\n  round trip. Run before any release touching the hybrid path - the\n  synth gate cannot see this failure class (its scratch is KBs vs the\n  27B's ~31.5MB/token).",
          "is_bot": false,
          "headline": "engine: loud OOM guard on prefill segments + commit the live 27B gate…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T16:27:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "894bb1818c12fa1e8820552df494ab0e2ea37585",
          "body": "- Hybrid prefill: MEMORY-BOUNDED segments. The real cause of the 0.15\n  '>50-token gibberish' was silent GPU scratch exhaustion (one segment\n  holds all 64 layers' transients, ~31.5 MB/token on the 27B; failed\n  WebGPU allocations return invalid buffers and writes vanish), proven\n  by an on-device s\n[…]\n equivalence, FULL\ndense gate 5/5 PACKAGE OK bit-exact (396 checks; hot-run tok/s dips\nre-verified at baseline cool), real Bonsai-27B on-device: long-prompt\ntoken parity + 1.41x prefill + typed tools.",
          "is_bot": false,
          "headline": "bitgpu 0.18.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T16:12:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "046119bbef0bf0b2bfc95dad14413956f6974182",
          "body": "…ltaNet scan\n\n0.17 kept the hybrid recurrence stable by shrinking the WHOLE prefill\nsegment to 16 tokens - which re-swept all weights 16x per 256 tokens,\nruinous for the 4GB 27B (each sweep hits swap on 8GB). The stability\nrequirement is only that the scan's running state flushes through the\nf32 sta\n[…]\nath vs the 0.17-known-good 16-token cadence (__SEG\ntest hook): logits cos 1.000000 max|delta| 5e-5, 510-token continuation\ntoken-identical. Dense 1.7b-gguf fast gate PACKAGE OK bit-exact\n(40.3 tok/s).",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: full 256-token prefill segments with a sub-chunked De…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T12:00:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "708e2a9ba4531582c2e43e8032849211a102ff2b",
          "body": "Assistant bubbles now render markdown live (escape-first mini renderer:\nheadings, lists incl. nesting, tables, fences w/ open-fence streaming,\ninline code/bold/italic/links; JSON-mode replies stay verbatim), and\nmaxTokens rises 512 -> 2048 (the engine clamps to the KV window) so the\n27B's fuller answers are no longer cut short; 'length-capped' shown in\nthe meta line when the cap does hit.",
          "is_bot": false,
          "headline": "demo: render markdown while streaming + lift the 512-token reply cap",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T09:41:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7fdfa50291850e749f24cb23bf85c5d100377b54",
          "body": "The Bonsai-27B is now FULLY functional: coherent chat at real context lengths AND working tool calling (auto + forced + round trips), verified end-to-end on the real model on-device - matching llama.cpp/transformers behaviour. What it took (the three release commits before this one): the hybrid Delt\n[…]\n per-model gen override, drops its 'experimental' label, and tools work on it. README documents the warpers, the dual tool protocols (JSON + XML, auto-detected), and the 27B's committed-manifest path.",
          "is_bot": false,
          "headline": "bitgpu 0.17.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T06:46:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e00bbd41cd2a3d061e1312c14aac0b2eabbd542",
          "body": "…hybrid recurrence in sampled decode (27B tool calling now works)\n\nTHE BUG: setup()'s named dispatch pools cached each slot's bind group ONCE ('buffers are stable within a call'). The hybrid's DeltaNet recurrent/conv state PING-PONGS between two buffer halves every stack() call, so in the sampled/co\n[…]\ncache and answers '8 plus 5 is 13.' - matching llama.cpp/transformers behaviour. tools/dump-27b-ref-modal.py + dump-27b-toolctx-modal.py + gen-27b-tool-modal.py are the reusable oracle-diff harnesses.",
          "is_bot": false,
          "headline": "engine: pooled bind groups must track buffer identity - fixes frozen …",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-21T00:56:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "140ca32f86c42a9e2dd721a82ddda15418eec43b",
          "body": "… prompt (Qwen3.5 thinking mode)\n\nQwen3.5's thinking-mode generation prompt PRE-OPENS the <think> tag (it ends with '<think>\\n'), so the model's stream begins inside the reasoning block with no <think> token to see. The ThinkSplitter started outside, so the whole chain-of-thought - and the closing <\n[…]\n the block. Dense Qwen3 is unaffected (its thinking prompt does not pre-open - the model emits <think> itself). Gated by new hermetic checks (startInside splitter + a pre-opening template end to end).",
          "is_bot": false,
          "headline": "bitgpu/chat: handle templates that pre-open <think> in the generation…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-20T21:59:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12c1c2549d6032127a99f4eea156c81c6c7b9cf8",
          "body": "…presence/min-p/top-p sampling\n\nTHE FIX (headline): the Qwen3.5 hybrid (Bonsai-27B) produced coherent output only for very short prompts and degenerated into loops/garbage past ~50 tokens, so any real chat (a system prompt alone exceeds that) was broken. Root cause: the DeltaNet recurrent scan (delt\n[…]\ndels byte-identical (PREFILL_SEG_HYBRID is hybrid-only; presence=0 -> v*penalty - 0.0). Green: test:hybrid at S=300, test:sampler (incl. bit-exactness + warper checks), test:chat, test:gguf, test:pld.",
          "is_bot": false,
          "headline": "engine: fix the hybrid 27B degenerating on prompts >~50 tokens + add …",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-20T17:04:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "91c482ecdccb4aecd36faf6edba3e3e83b07dc34",
          "body": "….><parameter=...>)\n\nbitgpu's tool enforcer + parser only spoke the Qwen3 JSON shape ({\"name\":...,\"arguments\":...}). Qwen3.5-family templates (the Bonsai-27B) train the XML shape <tool_call><function=NAME><parameter=KEY>VALUE</parameter></function></tool_call>, so enabling tools on the 27B forced th\n[…]\nmeter=expression>, but the 1-bit model degenerates in the freeform value and never closes the call - a model limitation, not the protocol (a stronger Qwen3.5 model completes it through the same path).",
          "is_bot": false,
          "headline": "bitgpu/chat: support the Qwen3.5 XML tool-call protocol (<function=..…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-20T10:13:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "03348417455869a99a927b9d6134b1499f3afe50",
          "body": "… templates (Qwen3.5)\n\nThe tool-round-trip cache-reuse path rendered the appended tool turns STANDALONE (messages.slice past the committed prefix) and assumed that render is byte-identical to what a cold append produces. That holds for position-independent ChatML templates (Qwen3 / dense Bonsai) but\n[…]\nw hermetic Qwen3.5-style fixture (last_query_index scan + raise + position-gated think) gates the round trip: standalone raises, the diff fallback reuses the cache, and rebuilds the exact delta bytes.",
          "is_bot": false,
          "headline": "bitgpu/chat: reconstruct the tool-append delta for position-dependent…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-20T09:10:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e6728be6da4cbb96c5b3b090653619eb4fc4f8c2",
          "body": "f16 activations for the qwen3.5 hybrid decode path (projection GEMVs read f16 norm outputs; recurrence/attention/residual stay f32) - opt-in, greedy-exact, a decode win on packed-f16 NVIDIA/AMD, ~neutral on Apple. The demo defaults activation:'f16' (safe everywhere, auto-falls-back) and loads the Bo\n[…]\nrid's long-context durability edge; models/README lists the 27B. Verified: test:hybrid f16-act pass (greedy-exact), real Bonsai-27B forward argmax 25358 under f16-act, dense 8b PACKAGE OK (bit-exact).",
          "is_bot": false,
          "headline": "bitgpu 0.16.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-20T01:18:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ffd934d0be83af0a78710640ef9348b40a532714",
          "body": "… the dense models)\n\nconvert-gguf.py now handles the qwen35 hybrid arch (was qwen3-only), mirroring buildQwen35Manifest in src/gguf.ts: the 3:1 linear/full layer split and the gated-DeltaNet tensor names from ggml's Mamba/SSM slots (attn_qkv/attn_gate/ssm_alpha/ssm_beta/ssm_a/ssm_dt.bias/ssm_norm/ss\n[…]\n/bonsai-27b-gguf/{manifest.json, aux.bin} (851 tensors, 64 layers). The converter's output deep-equals fromGguf's in-browser parse (aux byte-identical) - the same parity the dense models are gated on.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: convert-gguf.py qwen35 + committed 27B manifest (like…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-20T01:18:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8324f893ef7144313daaf0fa68cba776406ff4d5",
          "body": "Extend activation:'f16' to the qwen3.5 hybrid (it applied only to the dense layers). In the\nS===1 decode path the RMSNorm outputs that feed the 1-bit projection GEMVs go f16 via the\nexisting _af16 kernels: input_layernorm -> in_qkv/a/b/z (linear) and q/k/v (full), and\npost_attention_layernorm -> mlp\n[…]\nr f16-act gives argmax 25358 (\"Tokyo\"), greedy-exact.\nDense untouched: fusedMM's af defaults false and the dense f16-act path is unchanged (verify:headless\ndense runs + their dense-f16 sections pass).",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: f16 activations for the hybrid decode path",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-20T00:40:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "710ecd7215327772a9230763f11c47bbcccb698b",
          "body": "…the demo)\n\nThe 27B's chat works end-to-end through bitgpu/chat - verified: its multimodal Jinja template renders through the same @huggingface/jinja path as the dense models (user/system/multi-turn/thinking/tools all render, tools serialize into the system block), the tokenizer from prism-ml/Bonsai\n[…]\ner header parse, no committed manifest) + tokenizer from -unpacked, labeled '~3.8 GB / 16 GB+ / experimental'; markCached guarded for the gguf-only model. Demo page loads clean (7 options, no errors).",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: the Bonsai-27B is chat-usable (correct docs + add to …",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T22:05:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c7ca9be4d5ec666b543d6834b7c42fec9bff1f6",
          "body": "Qwen3.5 hybrid backbone (Bonsai-27B): 3:1 gated-DeltaNet linear attention + gated full attention, GGUF-only via fromGguf. Escape-swap KV-for-full-layers-only + q8 KV for the 16 full-attention layers, hybrid KV snapshot persistence (DeltaNet recurrent/conv state). Validated to greedy-exact tokens + l\n[…]\nreal 27B (no fp64 recurrence path -> not bit-exact like the dense sizes). Dense 1.7B/4B/8B unchanged. Docs: 27B via fromGguf (text trunk; multimodal template not wired), compat envelope, version pins.",
          "is_bot": false,
          "headline": "bitgpu 0.15.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T20:30:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "987a14bab44a2f17c96e924e6d3e82e76ec6c5d2",
          "body": "gen-kernel-cases.py pre-repeated q/k with np.repeat (interleave) for the deltanet_recur oracle, but the kernel pairs value head h with key/query head h % HK (tile) since the 52cf908 value-head fix. The per-kernel gate (test:kernels) had been silently red - never re-run after that commit - while test\n[…]\nd-to-end and the real Bonsai-27B validation stayed green (they use the correct tile convention). Switch the oracle to np.tile: deltanet_recur now matches cos 1.0 (max|delta| 1.1e-8), test:kernels 6/6.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: fix stale deltanet_recur kernel case (tile order)",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T17:48:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b165e43dc275bdd7195d3342d5fc464b1da33ab9",
          "body": "…state)\n\nsaveCache/restoreCache now support the hybrid backbone (they threw before). A hybrid\nsnapshot stores the full-attention layers' KV (only those 16 hold a cache) plus each\nlinear layer's DeltaNet recurrent + conv state as a fixed per-layer block - the current\nping-pong half, which already ref\n[…]\ntly (a linear layer keeps no KV, only O(1)\nstate, so a wrong state shows immediately). Both f32; q8 snapshots ride the same path.\nDense verify:headless 5/5 PACKAGE OK (snapshot round-trips unchanged).",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: KV snapshot persistence (save/restore incl. DeltaNet …",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T17:36:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e8d44a9fb07af2a142a89873c7648d121cd2839",
          "body": "Re-enable kvCache:'q8' for the hybrid backbone (was forced off via kv8 && !A.hybrid).\nThe 16 full-attention layers now hold K/V as packed snorm8 (llama.cpp q8_0-style, one\nf32 scale per 32-element block), stacking a further ~4x on the KV-for-full-only escape\nswap: the 27B cache goes 64->16 MB at 512\n[…]\nss prefill+decode), and q8 logits vs the f32 golden cos 0.999996 (max|delta| 4e-2 =\none snorm8 rounding). Dense q8/f16 untouched (verify:headless 5/5 PACKAGE OK). All changes\ngated on kv8/arch.hybrid.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: q8 KV cache for the full-attention layers",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T16:32:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b8190033f85feeedbad6d9ace07b42958cd5a16",
          "body": "…wap)\n\nThe 27B's 48 gated-DeltaNet layers carry O(1) recurrent+conv state, not a\nper-position K/V - only the 16 full-attention layers need a KV cache. The engine\nallocated Kc/Vc for all 64 layers, so 3/4 of the cache was dead VRAM. Allocate KV\nonly for the full layers (a kvLayers list; Kc/Vc stay la\n[…]\nd\ngrow loop is exercised directly rather than only transitively via the dense gate.\nReal Bonsai-27B on the 8 GB M1: forward argmax 25358 (\"Tokyo\"), coherent\ngeneration - correct with the sparse cache.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: KV cache for the full-attention layers only (escape s…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T15:04:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52cf9088112778c01f98e95b227bd19753d67c56",
          "body": "…ue-head tile order)\n\nThe 1-bit Bonsai-27B ran end-to-end but produced confident gibberish (forward argmax\n1469 vs transformers' 25358 = \"Tokyo\"). Two GGUF-layout conventions the loader\nmis-handled - both invisible to the self-consistent synth gate, only the real weights\nexposed them:\n\n1. Plain RMSN\n[…]\n an 8GB M1 now gives forward\nargmax 25358 and coherent generation (\"...Japan is Tokyo. The capital of X is Y...\").\nDense qwen3 untouched (all changes gated on arch.hybrid; verify:headless PACKAGE OK).",
          "is_bot": false,
          "headline": "qwen3.5 hybrid: fix the Bonsai-27B GGUF loader (pre-baked norms + val…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T13:15:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "37357da9fcf7d6c99fbe4eb9ad72603d4143054a",
          "body": "…B (via Modal)\n\ntools/validate-27b-modal.py runs HF transformers (the faithful pure-torch DeltaNet fallback) on\nprism-ml/Bonsai-27B-unpacked on one A100 and compares the clean-room numpy oracle layer-by-layer at\nthe true 27B scale - rep=3 (16 key / 48 value heads, the one ratio the synth model and t\n[…]\n\na math error (cosine + argmax confirm). So the oracle is correct on the actual 27B; combined with\nengine==oracle (synth, all layer types + rep=2) this transitively confirms the engine for Bonsai-27B.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 4): oracle confirmed on the REAL Bonsai-27…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T11:05:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc27808e48e65bedd45b11452d46dd16e5eae009",
          "body": "…p(A_log), not A_log\n\nVerified against the real Bonsai-27B: the GGUF ssm_a tensor is a constant -0.263, and transformers'\nA_log is -1.3359, with -exp(-1.3359) = -0.263. So the PrismML converter pre-computes -exp(A_log)\ninto ssm_a; the decay is g = ssm_a * softplus(a + dt_bias) with NO exp in the ker\n[…]\nxactly (argmax-exact, logits 5e-5) - which confirms the\nconvention; gbeta kernel + synth prefill/decode all pass. This is the fix that makes the real 27B\nproduce correct decay instead of a double-exp.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 4): fix ssm_a convention - GGUF stores -ex…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T10:42:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e12b91a7de835b8ebf1742979d6033649ae4d01",
          "body": "…model now GENERATES\n\nCross-token decode works: the recurrent + conv state and the full-attention KV cache continue the\nhistory across steps, so token-by-token generate() matches a teacher-forced forward() exactly.\n\n- conv1d_causal carries its kernel-1 left context (state_in/out + loadState), mirror\n[…]\n teacher-forced greedy). Prefill still 2e-5; kernels all pass; dense qwen3 untouched (every hybrid\nchange gated on arch.hybrid). Follow-ups: quantized KV, KV allocated for full layers only, snapshots.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 3c): persistent decode state - the hybrid …",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T10:33:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c27bc1c13bc0876192cf03011aedef57feac967f",
          "body": "…tent state I/O\n\nThe recurrent scan now takes a state_in and writes a state_out (per-head S[dk,dv]) with a loadState\nflag - the prerequisite for cross-token decode, where each step continues the recurrence from the\nprior state instead of restarting from zero. Prefill still runs with loadState=0 (zer\n[…]\nl-1 left\ncontext, a KV cache + cache-reading attention for the head_dim-256 full layers, and the hybridLayer\nS=1 path + prefill state-save. Until then the model prefills correctly but cannot generate.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 3c groundwork): DeltaNet scan gains persis…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T10:14:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfc6edd2ccb7382456daec2f0f3c45eda0b98603",
          "body": "…uns end-to-end\n\nlayer() branches on arch.hybrid.layer_types[li] into a gated-DeltaNet (linear) or gated-attention\n(full) token mixer, composing the stage-2 kernels with the existing 1-bit GEMV. What changed in\nsrc/engine.ts:\n- hybridLayer(): linear = input_norm -> in_qkv -> conv1d -> slice q/k/v ->\n[…]\nthe built engine and matches the numpy golden - embed 0, layer0 9e-6,\nfinalnorm 1e-5, logits 2e-5, argmax exact. Dense qwen3 forward unchanged (1.7B logits cos 1.0, all\nbranches gated on arch.hybrid).",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 3b): engine integration - hybrid forward r…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T09:43:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "abff76329c4fe0bdc8f319b4588db46ee0aa511b",
          "body": "…cal engine validation\n\nThe real Bonsai-27B (3.8 GB) won't load on 8 GB, so validate the engine's hybrid forward against\nthe numpy oracle on a tiny synthetic 1-bit qwen35 model. tools/gen-synth-qwen35.py emits bitgpu's\nnative format directly (manifest.json + aux.bin + data.bin, random Q1_0 weights) \n[…]\n't),\npartial RoPE, and all layer types (3 linear + 1 full). This is the target the engine integration\n(stage 3b) must reproduce; the model dir is git-ignored (regenerated), the golden fixtures commit.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 3a): synthetic tiny-model generator for lo…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T09:01:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "66ce29a802f4e3c1a2757e8e976c2980ae52628e",
          "body": "… backbone\n\nThe novel kernels the qwen3_5 backbone needs beyond the existing 1-bit GEMV / RMSNorm, each\nvalidated in isolation against the numpy oracle (tools/qwen35_numpy) via a new per-kernel WebGPU\nharness. The 1-bit projections (in_qkv/z/a/b/out, q/k/v/o) reuse the existing matmul kernels; the\np\n[…]\nrun test:kernels`. All six pass max|Δ| <= 9e-7,\ncos 1.000000. The chunked-prefill WY scan is a deferred optimization (recurrent scan is correct\nfor prefill); persistent decode state wiring is stage 3.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 2): clean-room WGSL kernels for the hybrid…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T08:46:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f77c4d51406a43bcc1c835073c366b64c24155c0",
          "body": "…qwen35 backbone\n\nbitgpu/gguf's fromGguf now parses the hybrid `qwen35` arch (the real Bonsai-27B-gguf) - the\nprimary zero-offline-step path:\n\n- types.ts: ManifestArch.hybrid (HybridArch) - per-layer linear/full layer_types + gated-DeltaNet\n  dims (key/value heads, shared head dim, conv kernel) + pa\n[…]\n region length\ncorrect. qwen3 GGUF parity (1.7b/4b/8b) unchanged. The offline converter (convert-gguf.py) still\nloudly rejects qwen35; it gains support when the 27B fixtures are generated (stage 3/4).",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 1): GGUF loader + manifest schema for the …",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T02:07:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "911137748947595909c541a23cf3a0e27439b822",
          "body": "…ers oracle\n\nFirst step of the quality track (hybrid attention -> 1-bit Bonsai-27B, model_type qwen3_5).\nNails and proves the backbone math before any WGSL:\n\n- tools/qwen35_numpy.py: framework-agnostic numpy forward of the qwen3_5 text trunk - 3:1\n  gated-DeltaNet linear attention + gated full atten\n[…]\n0, logits max|delta|~5e-5, argmax-exact, 100% per-token argmax agreement, on both a\nsingle-chunk and a multi-chunk prompt and both delta paths. This is the reference the kernels\nwill be gated against.",
          "is_bot": false,
          "headline": "qwen3.5 hybrid (0.15 stage 0): clean-room numpy reference + transform…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T01:53:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aad3fe7d075c331a2bdb08df62081d9212768af3",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.14.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-19T01:13:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09cf2888190a39e4c7e2b336ff14e34b15f5078f",
          "body": "… number\n\nexamples/benchmark.html + scripts/benchmark.mjs (npm run bench): load both\nengines in ONE page on the same GPU with the bit-identical Bonsai weights,\nsame prompt, and separate prefill (TTFT) from decode tok/s with the two-point\nmethod (wall-clock for N and 2N new tokens) - the same measure\n[…]\nd + dated, with the reproducer - so it reads as a\nballpark, not a leaderboard. Confirms the decode/prefill kernels are already\nahead of the mainstream onnxruntime path (not leaving perf on the table).",
          "is_bot": false,
          "headline": "benchmark: bitgpu vs transformers.js (dtype q1) head-to-head + README…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-18T23:59:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e4daf0040fd746385c3b13e403ea26978ec9cfb",
          "body": "Completes the profiling suite (?profile=1 / ?abtest=1). Best-of-N prefill ms/token\nat several prompt lengths vs a decode reference - to check whether the agent-loop\nprefill (re-prefilling tool results) is a bottleneck.\n\nFinding (1.7B, Apple M): prefill ~6.6 ms/tok (flat 64-256, rising at 512/800 as\n\n[…]\nll is\nreasonably amortized, not a hidden bottleneck. Whether ~6.6 ms/tok is at its\nunpack-bound floor or has tile-tuning headroom needs a reference (the pending\ntransformers.js dtype:'q1' comparison).",
          "is_bot": false,
          "headline": "verify.html: ?prefill=1 prefill-throughput benchmark (dev tool)",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-18T23:37:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dea029e35a9d776b273c76ea9a90dd27986139b3",
          "body": "Per-conversation snapshots redundantly stored the shared prewarmed prefix\n(a system prompt + tools is ~63 KB/token at q8 on 1.7B, so a ~1500-token\nprewarm is tens of MB of identical KV in every saved chat). Delta snapshots\ndrop it: save only the KV after the prewarm, restore by splicing onto a fresh\n[…]\ning snapshot are unchanged. High app relevance: one fixed prewarm\nshared across many chats (e.g. a tool-calling agent) -> far smaller IndexedDB\nfootprint, cheaper structured-clone, faster chat-switch.",
          "is_bot": false,
          "headline": "engine + chat: delta / prefix-shared KV snapshots (0.15 perf, P1)",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-18T23:09:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63398e861cdd490f1a2604731264604777e04e2b",
          "body": "…erf, P1)\n\nactivation:'f16' reads the decode-matmul activations as f16 and runs the\nper-block dot in f16 with f32 accumulation; the residual stream, attention,\no_proj and weights stay f32. Scoped entirely inside layer()'s fused S===1\nsubgroup branch (the choke-point every decode path flows through),\n[…]\n numerically perfect, can't hurt the f32\ndefault. (First naive A/B showed a 7% \"regression\" - it was thermal confound\nfrom probing af16 on a GPU pre-heated by the f32 ablation; interleaving fixed it.)",
          "is_bot": false,
          "headline": "engine: opt-in f16 activation-compute mode for decode matmuls (0.15 p…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-18T22:42:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "19aba91a6f53e7b2cf15f81d81009dab063c3c6c",
          "body": "True on-GPU kernel timing so perf work is evidence-driven instead of guessed.\nRequests the optional `timestamp-query` device feature when the adapter offers\nit, wraps each profileDecode batch's passes with begin/end timestamp writes, and\nreports the real GPU ns/token (vs gpuMs, which is CPU wall-clo\n[…]\nB   72.5 (matmul 69% / lm_head 13% / floor 20%)\n-> layer matmul dominates and grows with size (P1 f16-activation target); the\n   dispatch floor shrinks with size (P2 fusion helps small/fallback most).",
          "is_bot": false,
          "headline": "engine: timestamp-query GPU profiling (0.15 perf theme, P0)",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-18T22:00:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24743b3c5bacebb1bb2e8efb61ed782032e80425",
          "body": "Real MCP / OpenAI tool schemas put `description` on nearly every property\n(and `$schema` at the root); validateJsonSchema's strict allowlist threw on\nall of them, forcing callers to hand-strip every schema before use. Annotation\nkeywords carry NO constraint, so accepting-and-ignoring them is lossles\n[…]\nannotation may accompany a discriminated oneOf.\n- README: annotation-passthrough documented in the schema-subset section.\n\nGate: 1.7b-gguf PACKAGE OK (json mode + schema + forced tool call all green).",
          "is_bot": false,
          "headline": "bitgpu/chat: accept-and-ignore JSON Schema annotation keywords",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-18T17:45:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e72a87b2e6e447a55551c9d04f952367a593476d",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.13.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-16T02:20:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80ca098726d744ef1568450427fac939df6732f9",
          "body": "- src/gguf.ts (new `bitgpu/gguf` subpath): fromGguf(url) fetches ONLY the\n  GGUF header (progressive extension ranges, 1 MiB start, 2x growth - total\n  transfer stays under 2x the header size; stream-and-cancel fallback for\n  servers that ignore Range) and runs the convert-gguf.py header walk in the\n[…]\nown-good greedy ids bit-exactly on GPU. Gate: 1.7b-gguf PACKAGE OK\n  with both new checks passing.\n- docs: README (zero-step path leads Bring-your-own-model), FORMAT.md,\n  models/README, tools/README.",
          "is_bot": false,
          "headline": "bitgpu/gguf: point the engine at any 1-bit GGUF URL, zero offline steps",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-15T11:00:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "116ceac9cdda378e5e67ed9d5f0e9202a0e8280d",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.12.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-15T10:02:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04e481db1e751b537d23ea109df2cc8c490e7c9a",
          "body": "- examples/chat.html: the model picker now leads with the three GGUF builds\n  (same weights, a little smaller on the wire) and keeps the ONNX builds as\n  labeled alternatives; per-model data/tokenizer URLs (tokenizers come from\n  the ONNX repos - the GGUF repos don't host them)\n- README + models/REA\n[…]\nry (the ONNX loader is frozen\n  code, all geometries proven at 0.11.0) - 5 runs instead of 7; FULL=1\n  restores the full both-containers matrix for releases that touch the\n  loader, NOSG=all unchanged",
          "is_bot": false,
          "headline": "GGUF-first: demo, docs, and the default gate plan",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-15T10:00:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8fef0c2d3e41b543f8a95d74186f358c7971b53e",
          "body": "- tools/convert-gguf.py: PrismML Q1_0 GGUF -> manifest v2 + ~1.5 KB aux; the\n  .gguf itself stays the data file, streamed byte-for-byte from its hosting\n- engine: q1_0 container de-interleave in the streaming loader (sign bytes\n  feed the same planar buffers the ONNX path builds, f16->f32 scales,\n  \n[…]\n.7b)\n- docs: FORMAT.md (manifest v2, the q1_0 container, baked vs synthesized\n  rope), tools/README, models/README, README\n\nGate: 7/7 PACKAGE OK (1.7b, 1.7b nosg, 1.7b-gguf, 4b, 4b-gguf, 8b, 8b-gguf).",
          "is_bot": false,
          "headline": "GGUF ingestion (Q1_0 containers) + staged-model naming hygiene",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-15T05:53:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2e8eb52559379a0185c17f82760e64be6cb213a5",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.11.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-14T23:47:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c57ba347035dec4d5de5d620a51dcebd705fdf04",
          "body": "Speculative decoding cannot beat plain decoding on this engine's\nprimary path, and the reason is physics, not implementation: 1-bit\nweights make batch-1 decode compute-saturated rather than bandwidth-\nbound, so a k-row batched verify costs ~k single steps (measured: S=9\nverify ~= 9.8x one step; a PE\n[…]\n's speculation section and\nin this commit's ancestors (225b028 added the hook; the orchestration\nexperiment was never committed).\n\nFAST=1 gate mode (also from 225b028) stays - it earns its keep daily.",
          "is_bot": false,
          "headline": "Remove the drafter hook and rewind: measured, not paying their way",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-14T23:06:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "70d4881372e985182bb1c9d4e7c3591030035cab",
          "body": "In-engine two-model orchestration (draft engine sharing the device,\ndraft tokens GPU-resident, one submit + one readback per round) was\nbuilt, measured, and removed: output was gate-proven bit-identical but\nSLOWER than plain decoding, and the measurement shows why no variant\ncan win here. Speculativ\n[…]\nrafter hook and rewind stay: verify batching still wins where\ndispatch latency dominates (the no-subgroup fallback path), which is\nalso exactly when promptLookup's auto-probation keeps speculation on.",
          "is_bot": false,
          "headline": "README: why there is no two-model speculation mode (measured physics)",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-14T23:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "225b0288b48acf6a29eaad50826d8d6ba6e72158",
          "body": "GenerateOptions.drafter: a per-step callback ({history, k} -> up to k\nproposed token ids, may be async) feeding the same batched-verify\nmachinery as promptLookup - so output stays BIT-IDENTICAL to plain\ndecoding no matter what the drafter returns (stronger than rejection\nsampling's distribution guar\n[…]\nstly (in-engine orchestration is the path to the real speedup).\n\nFAST=1 verify:headless: one baseline run, core sections only (~3 min),\nfor development iteration; the full sweep stays the release bar.",
          "is_bot": false,
          "headline": "Pluggable speculative decoding: drafter hook, rewind, FAST gate mode",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-14T08:17:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5bb6e765ae52fe0dd6aad163dd528725e1d82e8f",
          "body": "…at in fixed memory\n\nStreamingLLM-style: the first sinkTokens positions (default 4) plus the\nmost recent window survive; the middle is evicted in batches and\ngeneration or multi-turn chat continues indefinitely - maxTokens is no\nlonger clamped to the window.\n\nKeys are cached UNROPED and rotated at a\n[…]\n; multi-turn reuse and\nsampled decode deterministic across evictions; v2 snapshot round trip\nexact; q8+sinks and f16+sinks pass on both paths. Driver page timeout\nraised to 45 min for the longer runs.",
          "is_bot": false,
          "headline": "Rolling window with attention sinks (overflow: 'sinks'): unbounded ch…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-14T00:43:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16c0a6390bec18ab63f538bbf3047d894d2a72be",
          "body": "chat.html switches kvCache to 'q8' (quarter-of-f32 cache memory on any\nadapter, no shader-f16 needed - Firefox gets it too) and raises the\nwindow to 4096 tokens. After each turn the conversation is snapshot via\nchat.save() - messages plus the KV cache itself - into IndexedDB;\nloading the same model \n[…]\nssly against the local build: load with kv q8 +\nwindow 4096, turn, reload, session restored with bubbles rebuilt,\nfollow-up reused the restored cache (283 ms delta prefill), clear\nremoved the session.",
          "is_bot": false,
          "headline": "Demo: q8 KV, 4096-token window, sessions survive reloads",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-13T22:43:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0dea1493858874fe0afa63d25ac03490d0df749a",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.10.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-13T22:36:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e729bdc6c2b10ff8312a6be71d92e0e137979ff",
          "body": "engine.saveCache()/restoreCache(): the conversation's token history plus\neach layer's cached K/V (and q8 block scales) packed into one\nstructured-cloneable object (IndexedDB / OPFS / postMessage as-is).\nRestore validates a version field, the kvCache mode, and an architecture\nstamp, then uploads in p\n[…]\nf32 restore bit-exact\ninto the same AND a fresh engine, tampered snapshots (mode/arch/\nversion/truncation) rejected 4/4. CPU suite extends verify-chat with\nmock-engine save/restore bookkeeping checks.",
          "is_bot": false,
          "headline": "KV snapshot/restore: conversations survive reloads and engine disposal",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-13T22:35:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c6256aa32ca5f7a5d88c4d968a261a382a5c98c",
          "body": "snorm8 values packed 4-per-u32 with one f32 scale per 32-element block\n(llama.cpp q8_0-style, ~1.125 bytes/value). No adapter feature needed,\nso it works where shader-f16 does not. All attention arithmetic stays\nf32; quantization happens once at cache write (copy_kv8 for prefill and\nV, fused rmsnorm\n[…]\n\nfew percent slower. verify.html gains the q8 section with the deep\nprobe; headless driver page timeout raised to 30 min for the longer\nruns. README gains a KV cache modes section covering f32/f16/q8.",
          "is_bot": false,
          "headline": "q8 KV cache (kvCache: 'q8'): quarter memory on any adapter",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-13T21:39:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6794e35ca67e95fa9611850e76d4df9e695ea29e",
          "body": "Tools toggle (mutually exclusive with JSON mode): the model can call a\ncalculator and a clock that execute inside the page; calls render as\ntheir own bubbles showing the enforced name(arguments) and the result,\nthe round trip extends the KV cache, and the demo caps chained rounds\nat 3. Every reply's\n[…]\nre (geometric\nmean token probability from logprobs: 5). Schema hint lists the 0.9.0\nkeywords. Verified headless: calculator round trip produces 604 for\n12.5% of 4832 with the answer at 90% confidence.",
          "is_bot": false,
          "headline": "Demo: tool calling round trip and confidence readout",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-11T17:38:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63365150280b52888708af49cbae56b2c2cb4c00",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.9.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-11T16:56:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe3f71083fc55dc5e797fb28813c7fbedc53dfdb",
          "body": "Schema subset expansion (all enforced byte-by-byte, invalid schemas throw):\n- oneOf as a DISCRIMINATED union: object branches with additionalProperties\n  false sharing one required single-enum property; the machine tracks live\n  branches (keys draw from their union) until the discriminator commits\n-\n[…]\nodule-worker pattern with an rAF jank\nmeter proving the main thread stays at full frame rate through load,\nprefill, and decode.\n\nGate: 1.7B green incl. 4 new logprobs checks; 156 hermetic chat checks.",
          "is_bot": false,
          "headline": "Schema oneOf/ranges/lengths, true logprobs, worker example",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-11T16:24:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4fa1f0185e12bac05eee08f5491ba9a842ec3e1",
          "body": "The model's own protocol (Qwen3 template tools list + <tool_call> blocks),\nenforced with the same byte machinery as schema mode:\n\n- tools/toolChoice/onToolCall in ChatSendOptions; toolCalls and\n  finishReason 'tool_calls' in ChatResult; tool role and assistant\n  tool_calls in ChatMessage\n- once <too\n[…]\nrip delta exactness) plus byte-exact tool rendering parity vs\ntransformers.js; GPU gate green on 1.7B(+nosg)/4B/8B with forced-call\ndeterminism, schema-valid arguments, and bit-exact round-trip reuse.",
          "is_bot": false,
          "headline": "bitgpu/chat: tool calling with grammar-enforced calls",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-11T15:28:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9169f3596bf613382002a3f491ff9522047d665a",
          "body": null,
          "is_bot": false,
          "headline": "Replace em dashes with plain hyphens in THIRD_PARTY_LICENSES",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-11T10:44:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a46c1bd9a99a31d34c49dfd815acd3346a9522b5",
          "body": null,
          "is_bot": false,
          "headline": "README: plain DEMO link instead of the spelled-out URL",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-11T10:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16cfb4e6730caaee0a314ddc61a4f60e0bb89c0f",
          "body": "The hosted demo URL now appears both in the intro (try-before-install) and\nin the Quickstart, alongside the source link.",
          "is_bot": false,
          "headline": "README: link the live GitHub Pages demo",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-11T10:06:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd0a8048c15be1bd591db7bd6d9d9920b6763dfa",
          "body": "…ocally variants\n\nmodels/README.md states the distribution decision explicitly (lean,\nmodel-neutral engine; hotlink the pinned CDN URLs or copy and own the\nfiles) and fixes an imprecision: passing modelUrl requires the DATA file\nin the directory too - the two copy-locally variants (manifest+aux with a\nHub dataUrl, vs fully first-party with the single-URL form) are now\nspelled out. tools/README.md drops the stale manual http.server step (the\nverify driver serves the repo itself since 0.7.0).",
          "is_bot": false,
          "headline": "docs: models are intentionally not in the npm package; precise copy-l…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-11T10:01:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2635dd8b40db01836d21bf66691f4ccbac85d4fc",
          "body": "JSON Schema enforcement lands on top of 0.7.0's constrained decoding:\nformat: { json: { schema } } makes the reply's SHAPE impossible to violate\n- types, required keys, additionalProperties: false, item counts, string\nenums - enforced token-by-token, still zero dependencies. Guaranteed\nclassificatio\n[…]\nun cap that closes the one unbounded\ndegree of freedom the grammar left a reluctant model to loop on.\n\nNo changes to the engine or to existing chat options; format: 'json'\nbehaves exactly as in 0.7.0.",
          "is_bot": false,
          "headline": "bitgpu 0.8.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-10T23:13:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da90ba6d69e3bcca1ee06e7b53193856b82dd755",
          "body": "format:'json' guaranteed the reply parses; a schema now guarantees it\nparses into the RIGHT SHAPE, enforced token-by-token in the same byte-level\nmachine: value types (incl. integer, which bans fraction/exponent), object\nrequired keys and additionalProperties:false (key names become a\nprefix-constra\n[…]\n every\ndecision point and is forced to [{name:A},{name:B}]) - 83 total; plus a\nper-model GPU gate check (greedy, exact 3 items/keys/types on the real\nTurkey prompt): 4 runs, 152 checks, PACKAGE OK x4.",
          "is_bot": false,
          "headline": "JSON Schema enforcement: format { json: { schema } }",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-10T23:12:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0afdd95a75ead06a73d49e0275a40a041edbcdbf",
          "body": "examples/chat.html grows from a proof-of-concept into a usable demo:\n\n- light/dark theme with a manual toggle (system default, persisted)\n- Send doubles as Stop mid-generation (real AbortSignal); Clear chat resets\n  the transcript AND the KV cache\n- models are cached for real: the Cache Storage API \n[…]\nsDelivr manifests, HF weights): page load clean, theme toggle,\n1.7B load through the cache layer, streamed chat turn, JSON turn parses,\nclear empties the transcript, 4 cache entries land - 8/8 checks.",
          "is_bot": false,
          "headline": "Demo: real-world chat page",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-09T00:04:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5096b6f48d69da2139f7cae385bac0f14e6c4f40",
          "body": "The tag-push workflow published to npm but never created the matching\nGitHub Release, so the repo's Releases page silently fell behind (stuck at\nv0.4.0 while npm served 0.6.0). Create it in the same run with\nauto-generated notes; contents permission raised to write for that step.",
          "is_bot": false,
          "headline": "Release workflow: mirror every npm release as a GitHub Release",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T23:47:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5ebc2c2c8086d3333dcdbc6a4e9b71308e69359",
          "body": "Constrained decoding lands: a generic candidateFilter hook on the engine\nand format:'json' in bitgpu/chat - guaranteed-valid, complete JSON from\n1-bit models, entirely on-device. Alongside it: promptLookup:'auto'\n(speculate only when it pays, output identical either way), GPU prefill\nembedding gathe\n[…]\nadoption kit: committed manifests for all three Bonsai sizes + a\nsingle-file demo page - no conversion, no hosting, no build step.\n\nNo public API removals or signature changes; all defaults unchanged.",
          "is_bot": false,
          "headline": "bitgpu 0.7.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T23:34:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "535c9b657835e63356a86099e61982c2a178bdd9",
          "body": "…rsion quickstart\n\nGetting started previously required Python + onnx + convert.py before any\ncode ran. The manifest format makes that unnecessary to inflict on users:\nthe two small files per model (~200 KB total for all three Bonsai sizes)\nare now committed under models/, and the multi-hundred-MB we\n[…]\nache-reuse stats, and a JSON-mode\ntoggle showcasing constrained decoding.\n\nmodels/README.md documents the layout and the per-model URLs; the files\nare reproducible byte-for-byte with tools/convert.py.",
          "is_bot": false,
          "headline": "Adoption kit: committed model manifests, single-file demo, zero-conve…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T23:33:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ff198467b47053654a7de9bceb61d5e3ea57508b",
          "body": "Three conveniences both production consumers hand-rolled:\n\n- chat.countTokens(messages) - token count of the rendered prompt, for\n  window budgeting against engine.capabilities.maxSeqLen.\n- stopSequences: stop STRINGS matched across token boundaries on the\n  visible channel (same holdback technique \n[…]\nd: 7 new Node checks (count parity, exact cut + stream equality,\nstraddled-match holdback via the byte-level mock, cache drop after a stop\ncut, overflow retry with trimmed ids, overflow info payload).",
          "is_bot": false,
          "headline": "chat: countTokens, stopSequences, onOverflow",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T23:33:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79d47dc8fcc468bd6699c9a5931b6ffa63179001",
          "body": "Prompt embeddings were dequantized on the CPU (embedDequant) and uploaded\nas S*H floats per segment, which required CPU copies of the packed\nembedding tables (~50 MB at 1.7B, ~100 MB at 8B) held for the engine's\nlifetime - real memory pressure on phones. A new embed_gather_batch kernel\n(same stride \n[…]\na fresh single-model run (37/37, PACKAGE OK, 13.1 tok/s;\nsampled 1.7B also up at 37.6 tok/s from the removed upload). All bit-exact\nchecks unchanged: the GPU gather reproduces the CPU dequant exactly.",
          "is_bot": false,
          "headline": "Prefill embeddings gathered on the GPU; CPU embedding tables removed",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T23:33:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "72954891f4ef3284b6a97623799da2ac61881662",
          "body": "The engine gains one generic, experimental hook: candidateFilter receives\neach step's top-K candidates (the sampled path already round-trips them to\nthe CPU) and returns the permitted subset - greedy picks the best permitted\ncandidate, sampling renormalizes the draw over them (still exactly one RNG\n\n[…]\nic on a JSON prompt, and forced structure on a PROSE\nprompt (exercises the full-vocab fallback on real hardware). Full gate:\n4 runs, 148 checks, PACKAGE OK x4, all existing bit-exact checks\nunchanged.",
          "is_bot": false,
          "headline": "Constrained decoding: engine candidateFilter hook + chat format:'json'",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T22:55:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08cf3bbbe51f525ca4a6f12abfbb37c99dec8a60",
          "body": "Prompt-lookup decoding is a win only when the content actually repeats; on\nlow-acceptance content it is SLOWER than plain decoding (measured 6.3 vs\n12.7 tok/s greedy on 8B), so leaving it on was a per-model, per-workload\njudgment call. 'auto' makes it safe to always enable: the first\nPLD_PROBATION (\n[…]\noff paths since the fixture content is below\nbreak-even) - 4 runs, 140 checks, PACKAGE OK x4. The absolute tok/s dip in\nthe gate run was confirmed thermal (41.1 tok/s after cooldown, identical\nbuild).",
          "is_bot": false,
          "headline": "promptLookup: 'auto' - speculate on probation, bail when it doesn't pay",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T22:23:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e707dcafce2ce2d26092ab887bccde269b18c53",
          "body": "The sampled loop awaited onSubmittedWorkDone and then mapAsync on the\nreadback buffer - two full round-trips per token, where mapAsync alone\nalready waits for the submitted work its copy depends on. Same at the\nfirst-token readback after prefill. Drop the redundant sync; the map wait\n(GPU-dominated)\n[…]\nnosg/4B),\nnoise-level on 8B - macOS makes the second sync cheap; the structural win\nis larger on higher-overhead backends. Full gate: 4 runs, 132 checks,\nPACKAGE OK x4, all bit-exact checks unchanged.",
          "is_bot": false,
          "headline": "Sampled decode: one CPU-GPU sync per token instead of two",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T22:07:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "867c1448c716671b419f071a35596197491ad39f",
          "body": "Gate hardenings, no engine changes:\n\n- headless-verify serves the repo root itself (built-in node:http static\n  server on an ephemeral port, streaming the multi-GB weight files) instead\n  of requiring a manually started http.server on :8000 - the gate is now a\n  true one-command operation and cannot\n[…]\n-check).\n\nVerified: full default gate, 4 runs (1.7B, 1.7B nosg, 4B, 8B), 132 checks,\nPACKAGE OK x4, self-served with no manual server; NOSG=all and PLAN=1\nvalidated via the plan dry-run (6 vs 4 runs).",
          "is_bot": false,
          "headline": "Verify gate: self-served, fallback release-gated, NOSG=all deep mode",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-08T11:29:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "105f43f4f09ad797722427b4b5cbe43be3297340",
          "body": "bitgpu/chat lands: a new subpath entry that turns the ids-in/ids-out engine\ninto messages-in/streamed-text-out, entirely on-device - chat template,\ntokenization, incremental decode streaming, <think> routing, EOS handling,\nand exact-token KV-cache reuse across turns. The text libraries are inlined\nat build time, so the package keeps zero runtime dependencies and the core\nentry is byte-unaffected.\n\nNo engine changes; the public API of 'bitgpu' is untouched.",
          "is_bot": false,
          "headline": "bitgpu 0.6.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T23:21:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33dc79a78658f214915139e6ca6df888b9a96e54",
          "body": "New subpath entry (import { createChat } from 'bitgpu/chat') that owns the\ntext boundary both production consumers were reimplementing: the model's own\nJinja chat template, tokenization, UTF-8-safe incremental decode streaming,\n<think> block routing, EOS handling, and cross-turn KV-cache reuse with\n\n[…]\n model - seeded\ndeterminism, stream==send, reuse turn == cold prefill of the same token\nsequence (bit-exact), think stripping - PACKAGE OK on 1.7B, 4B and 8B.\nattw/publint green for both entry points.",
          "is_bot": false,
          "headline": "bitgpu/chat: messages in, streamed text out, still zero dependencies",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T23:20:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2dd393e063e0761ecb14a0e7811ddd03e3623bd",
          "body": "…el repo links\n\n- Tokenization section grows the concrete @huggingface/tokenizers +\n  @huggingface/jinja pairing (mirrors the production consumer's usage) while\n  the engine itself stays zero-dependency, ids-in/ids-out.\n- Usage shows penalties under greedy decoding (0.5.0 behavior).\n- BYOM section names the three onnx-community Bonsai export repos and the\n  untied-lm_head support.",
          "is_bot": false,
          "headline": "README: tokenizer/chat-template pairing recipe, greedy penalties, mod…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T22:46:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "365af29408ceb8b1dcc23b2d978164697663233b",
          "body": "Bonsai 8B lands: device limits negotiated from the manifest (raised only\nwhen a model needs them; smaller models keep WebGPU's guaranteed minimums),\nuntied-lm_head support in the converter, and the q2 zero-point derived from\nthe manifest with loud validation. The verify gate now covers all three\nBon\n[…]\nd failure instead of\n  leaking the partially-loaded weights until GC\n- maxSeqLen is validated against the baked RoPE cache at load\n\nNo public API removals or signature changes; all defaults unchanged.",
          "is_bot": false,
          "headline": "bitgpu 0.5.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T22:37:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "143ef7b6e5762c2dee2986e1c06bf1b687b244ce",
          "body": "Adds committed forward-8b fixtures (hidden 4096, 36 layers, untied lm_head)\ngenerated with golden.py + reference.py on the Bonsai-8B q1 export - the\nnumpy oracle matches onnxruntime exactly (0.0 logit diff) - plus the\nengine's greedy continuation pinned as known_good. With forward (1.7B) and\nforward\n[…]\n alignment claim that did not\n  match the per-element routing)\n\nVerified: full headless gate on all three staged models - PACKAGE OK x3,\n87/87 checks, greedy 41.6 / 21.6 / 10.6 tok/s (1.7B / 4B / 8B).",
          "is_bot": false,
          "headline": "Bonsai-8B fixture set + hardening polish; gate runs three geometries",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T22:37:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "38e508ba069a908dd0a72e2538f3d23363068ae6",
          "body": "The lm_head branch unconditionally pointed the weight bytes at\nmodel_embed_tokens_weight_quant - correct only for tied exports. Bonsai-8B\nhas tie_word_embeddings: false and carries its own lm_head_MatMul_weight_quant;\nthe hardcode would have paired the embedding bytes with lm_head's scales and\nprodu\n[…]\nd Bonsai-4B manifest + aux are byte-identical to the\nshipped ones (tied path unchanged); the Bonsai-8B export converts with the\nlm_head at its own data-file range and passes the round-trip self-check.",
          "is_bot": false,
          "headline": "convert.py: support untied lm_head exports (Bonsai-8B)",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T22:21:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2e5cd5944328f9c4a6ac40c5f38da096811a65b",
          "body": "transformers.js applies repetition_penalty / no_repeat_ngram under greedy\nsearch too; the engine silently ignored them unless sampling was on (a\nmigration trap for apps that pass the options with temperature unset). A\ngreedy turn that requests processors now routes through the sampler-chain\npath - t\n[…]\nact), and\nmaxTokens:0 followed by a reuse turn == cold prefill (bit-exact).\n\nVerified: headless gate PACKAGE OK on 1.7B and 4B, 58/58 checks green,\nexisting check outputs unchanged, tok/s at baseline.",
          "is_bot": false,
          "headline": "Apply penalties under greedy decoding; make maxTokens: 0 prefill-only",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T22:19:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4feb13beb3c320c79832c3f652c2ceb7be1fee54",
          "body": "Four robustness fixes, none touching the decode hot path:\n\n- forward() now runs segmented like runPrefill (bit-exact by the same\n  composition the reuse gates prove). Un-segmented, a long forward()\n  dispatched S*heads workgroups in one dimension (>65535 at maxSeqLen on\n  32-head models) and bound a\n[…]\n manifest must carry cos_cache/sin_cache (a missing one previously\n  died on an unhelpful TypeError).\n\nVerified: headless gate PACKAGE OK on 1.7B and 4B, all bit-exact checks\ngreen, tok/s at baseline.",
          "is_bot": false,
          "headline": "Close cache-consistency holes; destroy the device on load failure",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T22:09:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18220e7f0712d0ce9efd4c2e704063fb1aac6c3b",
          "body": "The engine ignored the manifest's zp ref for q2 tensors and fed a literal 2\nto the matmul_q2 kernels. Correct for the current q1 exports (their zp bytes\nare uniformly 0xAA = midpoint 2 in every block), but any export with real\nper-block zero-points would dequantize the lm_head silently wrong while t\n[…]\nnts the constraint. The kernels themselves are untouched (no\nper-block zp fetch in the hottest GEMV).\n\nVerified: headless gate PACKAGE OK on 1.7B and 4B, all bit-exact checks\ngreen, tok/s at baseline.",
          "is_bot": false,
          "headline": "Derive the q2 zero-point from the manifest instead of hardcoding 2",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T22:03:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f3cd7375161d337dd9f831b39e232998c8f2eb64",
          "body": "…annot fit\n\nThe device was always requested at WebGPU's guaranteed minimums, with a\n1.7B-only comment asserting the largest binding fits 128 MiB. It is 92.6 MiB\nat Bonsai-4B and ~148 MiB at 8B (hidden 4096): binding-limit violations are\ndeferred VALIDATION errors, which the load's out-of-memory scop\n[…]\notprint instead of a hardcoded ~350 MB.\n\nVerified: headless gate PACKAGE OK on both staged models (1.7B, 4B), all\nbit-exact checks green; requiredLimits is empty for both (decode path\nbyte-identical).",
          "is_bot": false,
          "headline": "Negotiate device limits from the manifest; fail loudly when a model c…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T22:02:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76608b1b28719c7b578eb25600f654669a32e456",
          "body": "verify.html takes ?model=<tag>: loads examples/model-<tag> against\ntest-fixtures/forward-<tag>, with each fixture set's known-good greedy\ncontinuation moved from an inline constant into its params.json. The\nheadless driver runs every staged model by default and exits non-zero\nunless each prints PACK\n[…]\nmbed-stride bug fixed in the previous\ncommit would have been caught by this gate. Default no-arg behavior is\nunchanged. Both gates pass: 1.7B greedy 42.0 tok/s, 4B greedy 22.0\ntok/s, all checks green.",
          "is_bot": false,
          "headline": "Model-parametric verify gate with a second (4B) fixture set",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T19:18:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "db01d05e8e15dd02c49cc4b53a1524454931973c",
          "body": "The embed dequant (CPU embedDequant and embed_gather.wgsl) hardcoded the\nBonsai-1.7B row geometry: 256 weight bytes, 16 scales, 8 zero-point bytes\nper row. Those are hidden/8, hidden/128 and hidden/256 at hidden=2048, so\nany other width (Bonsai-4B is 2560, 8B is 4096) read every embedding row\nat the\n[…]\nolden.py +\nreference.py on the Bonsai-4B q1 export, RESULT: MATCH vs onnxruntime)\ngoes from embed cosine -0.002 to 1.0 on all four forward stages with\nevery KV-reuse and PLD consistency check passing.",
          "is_bot": false,
          "headline": "Generalize q4 embedding strides to any hidden size",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-07T18:57:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2c0284a27c81bf5c4d8a20c4f5a8a9e787e181a4",
          "body": "bitgpu was only adoptable by someone who already had a manifest + aux\nfile, and the tool that makes them lived in the aidekin repo. Port the\npipeline here as tools/ (convert.py generalized: data-file name read\nfrom the graph's external-data location, aux name an option, the\nnetwork round-trip check \n[…]\nh the\ncompatibility envelope and the host-two-small-files flow.\n\nVerified: the ported convert.py, run against the public Bonsai export,\nreproduces the shipped manifest.json and aux file BYTE-FOR-BYTE.",
          "is_bot": false,
          "headline": "Bring-your-own-model: converter tooling, format spec, README section",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-04T14:40:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e82e55cb87196cb5fdb89e1cd326b6025081c38c",
          "body": null,
          "is_bot": false,
          "headline": "Bump devDependencies (types, tsx) to latest",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-04T13:31:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa5dbe8af487d96dd60cf6acef753a9354002981",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.4.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-04T10:39:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3aed4587744ffd2feb7cd7a664c293b60ad1561",
          "body": "Every data-file tensor is wired as a route (byte range -> GPU buffer,\noptionally through the per-byte sign-table or q2 code-expansion\ntransform, and/or a CPU array for the embedding tables), and the file\nstreams through the routes in one sequential pass. Fused qkv/gate-up\nbuffers fill slice-by-slice\n[…]\nmory: a peak that let phones\nload the model and then die at the next OS memory event. All gates PASS\non both kernel paths including the f16 KV sections; greedy ids\nbit-identical; throughput unchanged.",
          "is_bot": false,
          "headline": "Streaming weight loader: the data file never sits in memory at once",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-04T10:39:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dac1dcb675816aaeec9326c19c45d8c6d7caaed9",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.3.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-04T09:20:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7207874303c9e7668c5d1c6f833fe11bd5e79513",
          "body": "Stores cached K/V as f16 while ALL arithmetic stays f32: each value is\nrounded exactly once at cache-write. Four lockstep shader variants\n(attention_sg/wg, the fused-path K write in rmsnorm_rope_sg, the cache\nappend copy); buffer sizes and growth copies switch on the mode. Falls\nback to f32 silently\n[…]\nreuse-equals-cold EXACT, and\ngreedy f32-vs-f16 token agreement 96/96 across all probes at identical\nspeed. Halves KV VRAM: the 2048-position cache drops from ~448 MB to\n~224 MB, a 1024 cap to ~112 MB.",
          "is_bot": false,
          "headline": "f16 KV cache storage (kvCache: 'f16'), industry-standard memory halving",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-04T09:19:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6583942874c5017cad58ff31a20a19fafe9e1c3b",
          "body": null,
          "is_bot": false,
          "headline": "bitgpu 0.2.0",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-03T21:52:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21debcfff418a3a121814a4899d30ecddeb89b51",
          "body": "…p size 16\n\nProfiling on real fallback hardware (iPhone 14 Pro WebKit, CMF Phone 1\nMali-G615) plus an M1 forceNoSubgroups A/B showed the fallback's cost was\nnot dispatch count or the wg matmuls: the generic rmsnorm ran one THREAD\nper row (2x2048 serial loads at decode, twice per layer) and\nattention\n[…]\nali):\nthe GEMV/norm/rope kernels were already SG-parametric; attention_sg's\nper-lane accumulator grows to head_dim/16 = 8 entries. Verify page gains\n?nosg=1 to force the fallback on subgroup hardware.",
          "is_bot": false,
          "headline": "Fallback path: cooperative rmsnorm + attention kernels; allow subgrou…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-03T21:52:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c784ade76ecddce55c8fb71fd65612a66ef7b33",
          "body": "npm publish now runs from a tag-triggered workflow using OIDC trusted\npublishing: no long-lived token, provenance attached by default. The\nworkflow re-runs the CPU checks and refuses to publish when the tag does\nnot match the package version. Document the release flow in the README.",
          "is_bot": false,
          "headline": "Release via GitHub Actions trusted publishing",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-03T20:44:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3da2a76c7e9d5dc6d8f1c11d8a59f3b8a7dfdb9",
          "body": "…ted)",
          "is_bot": false,
          "headline": "CI: bump checkout to v7 and setup-node to v6 (Node 20 actions depreca…",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-03T20:12:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e81ea04533293787f55ae2b82c2ecb9eaa383fd9",
          "body": "Extracted from the aidekin monorepo (packages/bitgpu) as a standalone\npackage. Bit-exact forward and sampling vs the reference implementation\n(transformers.js v4.2.0 sampler parity), subgroup GEMV kernels with a\nworkgroup-reduction fallback, GPU-resident greedy and sampled decode,\ncross-turn KV reus\n[…]\npple M1 (Metal): PACKAGE OK, greedy 40.08 / sampled\n36.04 tok/s. CI covers typecheck, sampler and drafter parity, and\npackaging (publint + attw); the GPU gate runs locally via\nnpm run verify:headless.",
          "is_bot": false,
          "headline": "bitgpu 0.1.0: WebGPU runtime for 1-bit LLMs in the browser",
          "author_name": "Sait Furkan Teke",
          "author_login": "stfurkan",
          "committed_at": "2026-07-03T20:10:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 18,
      "commits_last_year": 99,
      "latest_release_at": "2026-07-22T02:12:29Z",
      "latest_release_tag": "v0.19.1",
      "releases_from_tags": false,
      "days_since_last_push": 7,
      "active_weeks_last_year": 3,
      "days_since_latest_release": 8,
      "mean_days_between_releases": 0.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "bitgpu",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "webgpu",
            "llm",
            "low-bit",
            "1-bit",
            "quantization",
            "binary",
            "inference",
            "browser",
            "on-device",
            "qwen3"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/bitgpu",
          "is_deprecated": false,
          "latest_version": "0.19.1",
          "repository_url": "https://github.com/stfurkan/bitgpu",
          "versions_count": 21,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3349,
          "first_published_at": "2026-07-03T20:21:28.506000Z",
          "latest_published_at": "2026-07-22T02:12:25.490000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        }
      ]
    },
    "popularity": {
      "forks": 2,
      "stars": 19,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-20",
            "count": 1
          },
          {
            "date": "2026-07-26",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 2,
        "total_forks": 2
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 167981,
      "source_files_sampled": 38,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "stfurkan",
          "commits": 99,
          "avatar_url": "https://avatars.githubusercontent.com/u/35101659?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": false,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "ba0f5957404a4ca08623b22541a23b5043770ca6",
        "ran_at": "2026-07-31T00:05:46Z",
        "aggregate_score": 3.3,
        "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-23T15:43:30Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/stfurkan/bitgpu",
    "host": "github.com",
    "name": "bitgpu",
    "owner": "stfurkan"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "weak",
      "name": "Overall health",
      "note": "The weighted overall 47 is calibrated to 45 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 47,
            "calibrated": 45,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 45,
      "inputs": {
        "security": 33,
        "vitality": 74,
        "community": 40,
        "governance": 36,
        "calibration": "2026-08-02",
        "engineering": 52,
        "ai_readiness": 42,
        "weighted_overall_raw": 47
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "commits_last_year": 99,
              "human_commit_share": 1,
              "days_since_last_push": 7,
              "active_weeks_last_year": 3
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "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": "99 commits in the last year",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "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": "exceptional",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "v0.19.1",
              "releases_from_tags": false,
              "days_since_latest_release": 8,
              "mean_days_between_releases": 0.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 8 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "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": "weak",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "forks": 2,
              "stars": 19,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "19 stars",
                "points": 20.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "2 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "packages": [
                "bitgpu"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3349
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,349 downloads/month across npm",
                "points": 47,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3349,
                      "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": "weak",
        "name": "Sustainability & Governance",
        "value": 36,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance, Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance",
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 52,
            "inputs": {
              "followers": 25,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "stfurkan",
              "public_repos": 20,
              "account_age_days": 3129
            },
            "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": "25 followers of stfurkan",
                "points": 10.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 25,
                      "login": "stfurkan"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "20 public repos, account ~8 yr old",
                "points": 21.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 20
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 8
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "bitgpu"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 8
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 8 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "21 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 52,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": true,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "1-bit",
                "browser",
                "inference",
                "llm",
                "on-device-ai",
                "quantization",
                "webgpu"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": 33,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 33,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.3
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "weak",
        "name": "AI Readiness",
        "value": 42,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "weak",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.859,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "85 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 85,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 23,
            "inputs": {
              "has_nix": false,
              "has_tests": false,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 99",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 99
                    }
                  }
                ],
                "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 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 97,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 167981,
              "source_files_sampled": 38,
              "oversized_source_files": 2
            },
            "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": "2/38 source files over 60KB",
                "points": 52.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 38,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "library"
      ],
      "scores": {
        "library": 6
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "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-31T00:05:55.066469Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/stfurkan/bitgpu.svg",
  "full_name": "stfurkan/bitgpu",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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 v2.3.1, 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.