Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-27 13:10 UTC

noriq-dev / runner

TypeScriptMIT★ 0 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

noriq-dev/runner tiene un índice de salud de 48 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es AI Readiness (79/100) y la más baja, Sustainability & Governance (32/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

48
global / 100
En riesgo

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

Noriq.devOrganización
0 seguidores3 repositorios públicosdesde jul 2026

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@noriq-dev/runner0.13.2313620hace 6 díasnoriqagentsclaudecodexcoding-agentdaemoncli

Métricas por categoría

Vitalidad

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

68Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
1.4/36Cadencia de commits — 2/52 semanas con commits
18/18Volumen de commits — 128 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_year128
human_commit_share1
days_since_last_push6
active_weeks_last_year2
Cómo se puntúa
16.2/27Publica versiones — 18 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 6 días
27/27Cadencia de publicación — una versión cada ~0,4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count18
latest_release_tagv0.13.2
releases_from_tags
days_since_latest_release6
mean_days_between_releases0,4
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?

32En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
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
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
46.6/80Descargas mensuales — 3136 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@noriq-dev/runner
dependents
ecosystemsnpm
total_downloads
monthly_downloads3136
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?

32En riesgo · 24% 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/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
0/25Alcance del propietario — 0 seguidores de noriq-dev
4.4/25Trayectoria — 3 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeOrganization
is_verified
owner_loginnoriq-dev
public_repos3
account_age_days12
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 6 días
20/20Historial de versiones — 20 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@noriq-dev/runner
ecosystemsnpm
any_deprecatedno
min_days_since_publish6

Calidad de Ingeniería

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

60Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — biome.json
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
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

30En riesgo
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
has_readme
has_docs_dirno
has_descriptionno

Seguridad

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

47En 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
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,4
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages12
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@noriq-dev/runner@0.13.2 —lo que arrastra la instalación del paquete publicado—: 12 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

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

79Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 76 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,76
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes9890
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — biome.json
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 81 de los últimos 100 commits con autoría o crédito de agente
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_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0,81
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
53.9/55Tamaños de archivo manejables — 2/102 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes142.651
source_files_sampled102
oversized_source_files2

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.4 / 10
3.4agregado

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-27 13:10 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
8Vulnerabilities2 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
npm@anthropic-ai/claude-agent-sdk^0.3.0package.json
npmsmol-toml^1.3.1package.json
npmws^8.21.1package.json
npmzod^4.0.0package.json
Todas las dependencias no recopilado

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

Avisos de dependencias 0

Instalar npm:@noriq-dev/runner@0.13.2 arrastra 12 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 1616,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "JavaScript": 16414,
        "TypeScript": 1106563
      },
      "pushed_at": "2026-07-20T20:43:48Z",
      "created_at": "2026-07-14T19:47:05Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-20T20:43:52Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://noriq.dev/",
      "name": "Noriq.dev",
      "type": "Organization",
      "login": "noriq-dev",
      "company": null,
      "location": "United States of America",
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/305059202?v=4",
      "created_at": "2026-07-14T19:46:34Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 12
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-07-20T20:43:46Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-07-20T20:11:01Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-07-20T19:41:43Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-20T15:23:09Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-20T01:35:46Z"
        },
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-18T22:18:53Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-18T20:08:43Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-17T20:36:20Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-07-17T07:50:17Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-17T06:48:00Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-17T03:34:00Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-07-17T02:11:27Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-07-17T01:26:52Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-07-17T00:41:53Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-17T00:02:43Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-07-16T22:38:38Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-16T21:19:01Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-16T19:58:09Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6a9d9ada6fd2846aefc5cb5d1dfe42e0ed8e2adb",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.13.2",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T20:43:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8cdbad1e54c4a4e2b08d1b2b280fb3bba6aab29",
          "body": "…5 wire shape\n\nTwo problems with RUN-125, found in live integration testing (v0.13.1 + planar main):\n1. It sent registration `repos[].workflows: {name,base}[]`, but planar's RunnerRepo.workflows\n   is z.array(z.string()) — RegisterRunnerBody.safeParse rejects objects, 400-ing the WHOLE\n   registrati\n[…]\n to planar — now byte-identical, RUN-122\nport loop closed. PLANAR-PORT.md updated to the reconciled state. Full check green (790).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-126): workflow posture is daemon-authoritative; revert RUN-12…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T20:43:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "357ccdc467c490bb9f58edbaccfc2a66890c9ec8",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.13.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T20:11:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9948f9c2125189038bd5111acaaa9b5538dabeb",
          "body": "…nd, not just its name\n\nA custom workflow's permission POSTURE comes from its `base` kind — the supervisor enforces\npermissions off `run.kind`, and `run.workflow` overrides only the prompt. Registration used to\nadvertise `repos[].workflows: string[]` (names only), so the dashboard couldn't derive th\n[…]\nasserts\nthe name+base shape. PLANAR-PORT.md updated: planar `RunnerRepo.workflows` must carry `base` too.\n\nFull check green (789).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-125): registration advertises each custom workflow's base ki…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T20:07:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1036fe3770de15fd9d940454581c95384954d8a",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.13.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:41:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2ca82dc040df3c5e7cf5c74f302c2daccdf3701",
          "body": "…recation window\n\nPhase 5 — cutover prep. No functional runner change; the runner half of the plan is\ncomplete and fully back-compatible.\n\n- RUN-122: PLANAR-PORT.md enumerates the exact vendored→planar shared deltas\n  (coordinate + workflow fields, registration agents[]/repos[].workflows) plus the\n \n[…]\ngent-coordinate.test pins the legacy⟷coordinate\n  equivalence; PLANAR-PORT.md records the removal target.\n\nFull check green (788).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(RUN-122/123/124): contract port manifest, invariant updates, dep…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:36:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "32b5716b26fbaaa22fb0ef1acbd69e05acda37b6",
          "body": "…riants of a kind\n\nPhase 4. A repo can declare [workflow.<name>] blocks: a named variant of a built-in\nkind that inherits its floor-safe posture and swaps in its own prompt.\n\n- RUN-119: shared WorkflowDef {base, prompt} + ProjectManifest.workflows; resolveWorkflow\n  resolves a built-in kind id or a \n[…]\nanifest.workflows / Run.workflow authored in the VENDORED\ncopy with PENDING-PLANAR-PORT markers (RUN-122). Full check green (784).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-119/120/121): configurable workflows — repos define named va…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:32:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "651c35103fa7a097bfcc95c26c4df9913f8269fa",
          "body": "…tch becomes a descriptor\n\nPhase 3, behavior-preserving. The run \"kind\" stops being a switch scattered through\nthe supervisor and becomes a Workflow descriptor the supervisor reads.\n\n- RUN-116: src/workflow.ts — Workflow {promptShape, worktreeWritable, produces,\n  verifyActor, usesPlanBase} + BUILTI\n[…]\nwrite = true. \"Verify\n  executes but never edits\" is now code, not an honor system. THREAT-MODEL updated.\n\nFull check green (777).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-116/117/118): workflows as data — the scope/build/verify swi…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:21:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c51fccf437f78e74f0f0a2facae8d98f4197677",
          "body": "…ffort triple\n\nPhase 2. One dotted coordinate — `claude.opus-4_8.high` — is the canonical agent\nselector; the legacy triple is kept, derived, for one deprecation window.\n\n- RUN-112: src/agent-coordinate.ts — parse/format/merge over `<tool>.<model>.<effort>`,\n  with `.`↔`_` model escaping, partials, \n[…]\nhem into planar and\nfiles the dispatch/dashboard companions. vendor:shared must NOT run before that port.\n\nFull check green (768).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-112/113/114/115): agent coordinates replace the tool/model/e…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T19:12:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cff0da66cf69548a7843945516b850d0b799ae6d",
          "body": "… descriptor, vendor-name purge\n\nPhase 1 of the driver-seam generalization. Makes AgentDriver the clean, self-describing\nboundary the coordinate + workflow work builds on.\n\n- RUN-109: env sanitization becomes a SUPERVISOR guarantee. `DriverStartOptions.env` carries\n  the stripped child env, computed\n[…]\n/steering/budget); a guard test proves lock enforcement keys off the capability,\n  not the driver's name.\n\nFull check green (742).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-109/110/111): harden the driver seam — env hoist, capability…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T18:48:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43b604a95b077f2e0de130f9e5b77aa08348814f",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.12.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T15:23:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19790f2c67673970bb96b262b5f38b88e94ab9a3",
          "body": "`noriq-runner <TAB>` now completes commands, per-command flags, and enum\nflag values. A hidden `completion <bash|zsh>` prints a sourceable script that\ndelegates back to a hidden `__complete` command, so the candidate list lives\nin TS next to parseArgs and never drifts from a hand-maintained copy.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-108): shell tab-completion for the CLI (bash + zsh)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T15:00:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dac768aebe5b4f82911bdd09f577bc4b10c65f9e",
          "body": null,
          "is_bot": false,
          "headline": "v0.11.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:35:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b07fb6c821141e5f562e0adda0edc8275f459bed",
          "body": "Phase 6 (final) of runner-enforced file locking.\n\nRUN-106: lock holds/denials/gates surface in the run view via the RUN-74\ntranscript pipeline (no wire change) — a reactive deny, a hard-floor\ngate, and a predictive refuse each emit a 🔒 milestone naming the paths\nand holders, so a human watching sees\n[…]\nan, and the pass criteria. The\nlive run is a manual step (credentials + server + spend), like\nDOGFOOD.md.\n\nFull suite green (725).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-106/107): lock telemetry in the run view + dogfood runbook",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:33:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e85a655e3344578d9a58ad3ac6261f7680eb2038",
          "body": "…erge\n\nPhase 5 of runner-enforced file locking. Largely delivered by the\narchitecture of Phases 2-4 and made explicit here:\n\n- Cross-worktree coordination is inherent: locks live server-side (the\n  Noriq view), so two runs on one repo — each in its own worktree — see\n  each other's holds. The hard f\n[…]\nlocked, cross-target stays git-merge's job. Tests pin the land→release\nordering and cross-worktree gating; full suite green (724).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-105): worktree/branch lock coordination — hold through the m…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:30:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2cd7ed96651c60697bba79ab2464935af3f73820",
          "body": "Phase 4 of runner-enforced file locking.\n\nRUN-103 (predictive): with a DECLARED scope, the daemon takes its locks\nas the run's holder right after minting the run agent — before the agent\nstarts — and REFUSES a dispatch whose scope clashes (dispose the lease,\nfail with the conflict), rather than raci\n[…]\nich settles their tasks, which releases their locks\nserver-side; TTL is the final backstop.\n\n19 new tests; full suite green (722).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-103/104): dispatch-time predictive locking + terminal release",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:27:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2bc92cfb4f4c05daef2e12fb49a180c438631176",
          "body": "Phase 3 of runner-enforced file locking.\n\nRUN-101 (reactive per-edit hook): src/lock-hooks.ts ports the PLNR\nhook's path extraction and adds a driver-agnostic LockEnforcer. The\nClaude driver wires it as in-process PreToolUse (deny an edit to a\npeer-held path) + Stop (release) hooks via the SDK's hoo\n[…]\nlive-backend native locks apply\nper-edit too. Scope branch = the landing target (RUN-97 §5). 35 new\ntests; full suite green (715).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-101/102): guaranteed lock enforcement in spawned agents",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:20:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa11705d56c8cef6d7781c90c14e76ead7676d86",
          "body": "Phase 2 of runner-enforced file locking. Adds lock/unlock/queryLocks to\nthe VcsBackend seam (optional — a backend with no lock layer omits them,\ncallers treat absence as 'no enforcement here', like checkClaimable).\n\n- LockClient (src/lock-client.ts): MCP-over-HTTP for the four Noriq lock\n  tools, au\n[…]\nds.\n\nBranch scope = the run's landing target, not its throwaway worktree\nbranch (RUN-97 §5). 26 new tests; full suite green (694).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-98/99/100): file-lock capability on the VcsBackend seam",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-20T01:03:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a59e1b50d76304be4d2d4e9eb0356f3363eb6f5e",
          "body": null,
          "is_bot": false,
          "headline": "v0.10.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T22:18:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "298a2e24ecd7dee37f6321426393963e26d4a7bc",
          "body": "…ibution moves to the body\n\n'noriq run <id>: <label>' made every agent commit read identically in\none-line history — the id nobody scans pushed the task key/title\neverybody scans off the right edge. Subject is now the label (task key\n+ title, brief, 'landing fix', …); 'noriq run <id>' rides the body\n[…]\nMessage) for all three checkpoint sites. Perforce\nchangelist descriptions keep their exact 'noriq run <id>' marker — the\nreap parses that shape.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(RUN-96): checkpoint commits lead with WHAT changed; runner attr…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T22:17:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "078c331c94be0799cf2b33a835dd3916a5b1faf8",
          "body": "…ormalized spelling\n\ngit porcelain prints forward slashes where the daemon builds platform\nones, so worktreeRegistered's verbatim compare read a registered\nworktree as absent on Windows and the adopt path ran 'worktree add'\ninto its own checkout — every Windows continue failed, and windows CI\nwith it (red since v0.9.0). comparableWorktreePath unifies slashes,\nrealpaths the 8.3/long split where the path exists, and case-folds on\nwin32.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-95): Windows continue-run adopt — compare worktree paths by n…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T20:08:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a2c3eb7bd333fface0e83d4ae3f8a59fc32ba2b",
          "body": null,
          "is_bot": false,
          "headline": "v0.10.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T19:44:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c17a755b86929ef79f9ec2a04ea0b98cdda6840",
          "body": "… becomes a committed knob\n\nRUN-29's fail→fix→re-verify loop was bounded by a hardcoded K=2; a repo\ncould neither widen it (long-tail suites) nor narrow it to a pure gate.\nSame shape as [verify.agent].maxRounds: int 0–5, default 2 (unchanged\nbehavior), 0 = verdict only, no hand-back. Applies whereve\n[…]\ncks the real bound. noriq init asks for it alongside\nshell/timeout; shared schema vendored from planar branch\nnoriq/verify-max-rounds (783f835).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-94): [verify] maxRounds — the deterministic floor's fix loop…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-18T19:07:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "49500e76719d7a8d5902cf5aa44217931bbc8924",
          "body": null,
          "is_bot": false,
          "headline": "v0.9.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T20:36:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb4d9449e1e987ef3f049a47fa1f689bbd4fe053",
          "body": "…e adopts the run's work\n\nRUN-91 made a continue reuse the kept worktree, but only for git\n(worktree.ts adopts an existing run-branch). On the server-backed\nbackends a re-dispatch of the same run id would fail — and Montana's\nPrototype dogfooding runs on Diversion. The uniform contract is now\n\"lease\n[…]\ne Perforce path warrants a live-p4d confirmation before\nheavy reliance; the primitives are the measured ones, the ordering is new.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-93): continue on server-backed VCS — Diversion/Perforce leas…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T20:25:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9a429f577b3231ef3a3549d818bd283ecf9e77e",
          "body": "…ion ledger\n\nFollow-up to RUN-91. RUN-91 adopts the kept worktree, but the runner's\nper-run state is in-memory and gone once a run terminates, so a\ncontinuation lost two continuities:\n\n- SPEND: a fresh RunTally reported only this sitting's tokens/usd, and\n  recordRunTelemetry (COALESCE takes the fra\n[…]\nund 1, the persist-on-fail / clear-on-pass lifecycle, and the\nstore's on-disk round-trip + corrupt-file degrade. Full check green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-92): continuation continuity — re-seed spend + the adjudicat…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T20:17:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ffa07b449978c5d1e9433b1fb7c474facc0d5627",
          "body": "…budget.maxRounds\n\nThe runner half of \"continue a failed run\" (server + UI is PLNR-180). A\ngate-failed build is kept, not disposed, so its branch and worktree\nsurvive on disk; the server re-dispatches the SAME run id with\nbudget.maxRounds set, and — per the contract — \"resume\" is inferred by\nthe dae\n[…]\n,\nbut a fixed finding refutes against the kept tree), and continue on the\nserver-backed VCS backends (adoption is git-only today).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-91): continue a failed run — adopt the kept worktree, spend …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T18:54:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d7db9b30f0ae85231831dd54eeed64f1fdb17ef",
          "body": "The vendored contract had drifted since planar's RUN-59 server work:\n`RunModelMix`/`RunModelUsage` were name-swapped (runner had Usage=value,\nMix=map; planar has Mix=value, Usage=map), and planar had since added\nUNATTRIBUTED_MODEL_ID, the '(un)attributed' bucket doc, the 'failed'\ntask status, a `mod\n[…]\nly writes the mix via telemetry, so its test literal is null.\n\nTest budget literals carry maxRounds; full check green (655 tests).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(RUN-87): refresh vendored @noriq-dev/shared from planar main",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T18:41:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8ac0e506e9d44f03254c1b77874ac850352e0cb0",
          "body": "The RUN-66 run failed after both fix rounds over eight findings that\nwere all one invariant (\"Enter-through is a no-op\") leaking through\neight unlike mechanisms. The builder patched sites one at a time; the\nreviewer enumerated the family faster than the round budget could close\nit — structural non-c\n[…]\nmechanisms + one named broken\npromise) so it stays a disciplined finding, not a \"feels systemic\"\nescape hatch. Prompt tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-90): reviewer names the invariant-class, not N instances",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T16:13:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40e8adbaa6fef2998981e43594772a16d0843e07",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.8.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T08:34:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2cc6a10ca597bb6891ec4e7467af4c3165b03a89",
          "body": "…class costs one number\n\nBoth RUN-66 and RUN-88 died in the TERMINAL review — the one with no fix\nbudget behind it — on findings raised there for the first time, both\n[medium], neither ever fixable or contestable by the builder.\n\nThe revert test. RUN-76 already said pre-existing code is \"not this\nau\n[…]\nrchitectural pivot in two\nrounds. It should now fail in round 1 with the cause named rather than\nburn three rounds discovering it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-89): the reviewer's scope test is mechanical, and a finding …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T08:34:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "992035367bd3b19a248a6b1a81cb20feeae6f64c",
          "body": "The runner landed RUN-65 (\"Advanced permissions: curate the build\nallowlist and network — never the floor\") on the plan branch, plus its\nreviewer fix round. It adds a [permissions] advanced section, the\n`defaultBranch` identity section, and 30 tests.\n\nConflicts were both additive (ManifestChoices fi\n[…]\nator is asked about a stream. Pinned by assertions in\nthe Perforce flow test.\n\n625 → 655 tests (RUN-65's 30), npm run check green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge RUN-65 (advanced permissions) from the curated-marker plan branch",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T07:59:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48e96aa0de082282a294b5d556f683c56a841734",
          "body": null,
          "is_bot": false,
          "headline": "v0.7.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T07:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48cdec5228feac1de660549e3d451e76897daf51",
          "body": "…t, not \"not reported\"\n\nRunTally made a run's model mix all-or-nothing (RUN-59): one spending\nsession with no per-model attribution dropped the WHOLE mix. With\n[verify.agent] tool = codex, every build spawns a codex reviewer, and\ncodex reports tokens with no per-model split and no cost — so a Claude\n[…]\nv/shared (drivers/types.ts) and pinned by a test until the\nvendored slice is refreshed (RUN-87); the dashboard render is PLNR-179.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-86): fold un-attributable spend into an (unattributed) bucke…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T07:47:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d27c4158bd9621440e6666c0f0e7a145d23cce81",
          "body": "…tion\n\nThe guided marker detected a Diversion workspace but still asked to land\nthe \"rebased\" result, to resolve \"rebase\" conflicts, to \"push\" to a\n\"remote\", warned about `git log origin/main..main`, and closed with\n`git add && git commit` — none of which fit a backend with no rebase,\nwhose publish \n[…]\nway. Git renders byte-for-byte as before — it is the\ndetection fallback.\n\nDaemon-side MR flow is still git+gh — tracked as RUN-85.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-84): init-project speaks the detected VCS, not git-by-assump…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T07:24:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a499d605b354c801e60548ae05fc480912f3d04",
          "body": null,
          "is_bot": false,
          "headline": "noriq run run_mroll8m25i054d5l5w70: reviewer fix round 1",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T07:21:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb2b095518f7391b59c9a6a2e2d8779b45cf6efd",
          "body": "…te the build allowlist and network — never the floor",
          "is_bot": false,
          "headline": "noriq run run_mroll8m25i054d5l5w70: RUN-65 Advanced permissions: cura…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T07:15:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a69d6bf18ea57b15c39fb8fe2cf0d1d001b85573",
          "body": "Merges the curated-init-project plan (RUN-56 rework, RUN-62/63/64 --advanced\noptions + per-kind [defaults], RUN-59 model-usage telemetry) with the reviewer-\ngate + daemon work landed since 0.6.0 (RUN-78 workspace-boundary rule, RUN-79\nadjudication ledger, RUN-81 phase-gate backstop, RUN-82 plan-branch fork base,\nRUN-83 task-lifecycle owned by the run).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.7.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T06:48:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a0089cf3c5a341209e3bb214fbd6ad6da606eb22",
          "body": "# Conflicts:\n#\tsrc/supervisor.ts",
          "is_bot": false,
          "headline": "Merge branch 'noriq/plan-the-curated-marker-init-project--3l5257'",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T06:42:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17c460349b3999fc1b2a4a232b36d065633ca075",
          "body": "A build agent called release_task(review) when it finished, BEFORE the daemon's\nverify/reviewer gate ran. A gate FAILURE then left the task stranded in `review`,\nindistinguishable from work genuinely awaiting a human. The task's lifecycle\nbelongs to the run's terminal outcome, not the agent.\n\nDroppe\n[…]\nInert on its own — the server counterpart (transitionRun authoritative + a new\n`failed` task status) lands alongside in planar. 566 tests green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-83): build agent no longer moves its anchor task — the run does",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T06:13:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9066c742fad4882137863dbdd42b4720ecb7b4c7",
          "body": "A runner agent hit this on RUN-64: its worktree forked from HEAD (main) while the\ntasks it built on (RUN-62/63) had landed only on the plan branch, so it could not\nsee the work it depended on and had to mirror the plan branch's files by hand. The\nreview diff then double-counted the predecessors and \n[…]\nre you land), but such runs' review/verify diffs become \"vs the integration\nbranch\" rather than \"vs main\".\n\n566 tests green (+6); bundle builds.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-82): fork a plan run's worktree from the [land] branch, not main",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T06:00:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a11618d61f5cede5536b60252af38184da40a24",
          "body": "…ble task\n\nRUN-59 (phase 1 of a plan) passed the verifier into REVIEW — not done/approved —\nso phase 2 should have stayed locked. The runner spawned an agent on a phase-2\ntask and continued. The primary cause is server-side (removing plan-task\ndependency edges left claim_task to enforce phase order,\n[…]\ns to report the gate the running agent's own claim would skip.\n\n560 tests green (5 supervisor gate cases + 4 client probe cases); bundle builds.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-81): daemon phase-gate backstop — don't spawn on a non-claima…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T05:14:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4f5a7effb76d7703872f65947f5965373ad4c88",
          "body": "… `[land]` envelope, one typed answer at a time",
          "is_bot": false,
          "headline": "noriq run run_mrofmeas5x305d1s483q: RUN-64 Advanced landing: walk the…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:46:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f24eaf5a2466344979073f2d5f9a3b0db99b06d9",
          "body": null,
          "is_bot": false,
          "headline": "noriq run run_mrof7aay3v3q0d4a2g5m: reviewer fix round 1",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:25:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "633a31078cff07c9f9a41f22c0dd73a438e075de",
          "body": "…hell pin, timeout, reviewer effort & rounds",
          "is_bot": false,
          "headline": "noriq run run_mrof7aay3v3q0d4a2g5m: RUN-63 Advanced verify options: s…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:25:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c7ba619e6688088379c202ccd1b481b9cabe665",
          "body": "… the fork, plus per-kind `[defaults]` model & effort",
          "is_bot": false,
          "headline": "noriq run run_mrof7a1y0i4y2m3l024z: RUN-62 `init-project --advanced`:…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:22:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df3388807b6b00769433597386cb1e5976b99ab6",
          "body": "…op clumping\n\nRUN-77 made intra-turn text byte-faithful (verified live: the vendored CLI\ndelivers text_delta with newlines intact). The remaining clump was BETWEEN\nturns: distinct assistant responses separated by tool calls carry no newline\n— the model never emits one — so raw concatenation reads\n\"…\n[…]\ny byte-exact —\nthe break is inserted at the source of truth for boundaries and rendered by\nthe dashboard's breaks-aware markdown as a paragraph.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-80): paragraph break between assistant turns — transcripts st…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:20:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df27320c6cbc34d0d72d3734a3296ecbe3e66c7a",
          "body": null,
          "is_bot": false,
          "headline": "noriq run run_mrodyo5g0b4x515k1z17: reviewer fix round 1",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6bcef62a1c6cc8f71ba599f41cd413925c84ae2",
          "body": "…models it ACTUALLY used, not just which one was asked for",
          "is_bot": false,
          "headline": "noriq run run_mrodyo5g0b4x515k1z17: RUN-59 A run should report which …",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99326878260b036bbeae39463e0927e0438415d4",
          "body": "Reviewer gate hardening: workspace-boundary rule (RUN-78) — cross-repo/service\nrequirements are follow-up, not findings; and the cross-round adjudication ledger\n(RUN-79) — prior findings + the builder's pointer-based rebuttal ride to each fresh\nreviewer, so a settled finding is verified, not relitigated.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.6.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8e643f756022e9cbdd9855dad3dde4926bcf0d9",
          "body": "… being relitigated\n\nEvery reviewer round is a fresh, stateless session by design (RUN-61) — but total\namnesia also erased what was already ADJUDICATED, so runs re-raised findings the\nbuilder had already answered with evidence (RUN-56 twice, RUN-59's cross-repo P1\nafter two rebuttals). The builder i\n[…]\nof scope: no third-party adjudicator, no FAIL-vote de-duplication,\nmaxRounds untouched — all tracked for after this + RUN-78 measure in dogfood.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-79): cross-round adjudication ledger — settled findings stop…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "08114413258d7948b45093c7b4c4d8a7ce15abda",
          "body": "…not findings\n\nRUN-76 scoped the gate to the diff, but when the intent itself names deliverables\nthat live outside this tree, the prompt gave no rule and fresh reviewers split on\nit. RUN-59 dogfood: rounds 1/3 FAILed a run over a D1 migration + dashboard UI the\nrunner repo can never carry (it is sta\n[…]\nes elsewhere.\n\nRationale on the call sites; tests assert the boundary language and its\nparticipation carve-out in both prompts. 526 tests green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-78): reviewer/verify gate — cross-workspace requirements are …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46d9fabf401ac1817d19b2126e93a123291b8fef",
          "body": "RUN-77 (56b9bd3 / 2640225) landed new test lines over the 110-col limit; both\nits CI runs failed the biome format gate and were pushed to main anyway, so\nmain has been red since. Pure line-wrapping — no tokens or assertions change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: biome-format RUN-77's test additions (main was red)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0fe977b398311650d6242fc1bac292c62a39517f",
          "body": "Codex was already correct — its only text source is the raw\nagentMessageDelta stream, with no assembled-message path to drop newlines\n(unlike claude before this task). Add a parity test that concatenates\ndeltas split mid-word and at newline boundaries and asserts the model's\nbytes survive exactly, so a future refactor can't regress it silently.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(RUN-77): pin codex transcript byte-faithfulness (newlines intact)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fc23bafdc533bc7849400080f59db5daaf553c73",
          "body": "…'s newlines\n\nThe claude driver built transcript text from each assembled `assistant`\nmessage via extractText, which joins content blocks with '' and drops the\nnewlines the model put between them. Invisible in one-line prose, but it\ncollapsed a whole bulleted review into a single paragraph on the da\n[…]\named, so a transport without\npartial messages (and the existing tests) behave unchanged. thinking_delta\nis filtered out — it is not agent prose.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-77): stream raw text deltas so the transcript keeps the model…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:10:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "985c2fed5442a8bce7378e456955d0cc4b69faa4",
          "body": "…op clumping\n\nRUN-77 made intra-turn text byte-faithful (verified live: the vendored CLI\ndelivers text_delta with newlines intact). The remaining clump was BETWEEN\nturns: distinct assistant responses separated by tool calls carry no newline\n— the model never emits one — so raw concatenation reads\n\"…\n[…]\ny byte-exact —\nthe break is inserted at the source of truth for boundaries and rendered by\nthe dashboard's breaks-aware markdown as a paragraph.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-80): paragraph break between assistant turns — transcripts st…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T04:01:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e4ccf9fc700e1d72e74610973417883b244dffd",
          "body": "Reviewer gate hardening: workspace-boundary rule (RUN-78) — cross-repo/service\nrequirements are follow-up, not findings; and the cross-round adjudication ledger\n(RUN-79) — prior findings + the builder's pointer-based rebuttal ride to each fresh\nreviewer, so a settled finding is verified, not relitigated.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.6.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T03:34:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d2d60c3c7d8c1a09e90487351e4100a9bcddb24",
          "body": "… being relitigated\n\nEvery reviewer round is a fresh, stateless session by design (RUN-61) — but total\namnesia also erased what was already ADJUDICATED, so runs re-raised findings the\nbuilder had already answered with evidence (RUN-56 twice, RUN-59's cross-repo P1\nafter two rebuttals). The builder i\n[…]\nof scope: no third-party adjudicator, no FAIL-vote de-duplication,\nmaxRounds untouched — all tracked for after this + RUN-78 measure in dogfood.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-79): cross-round adjudication ledger — settled findings stop…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T03:33:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f79f35bde687db23905baf713e0daa066ae1d7a",
          "body": "…not findings\n\nRUN-76 scoped the gate to the diff, but when the intent itself names deliverables\nthat live outside this tree, the prompt gave no rule and fresh reviewers split on\nit. RUN-59 dogfood: rounds 1/3 FAILed a run over a D1 migration + dashboard UI the\nrunner repo can never carry (it is sta\n[…]\nes elsewhere.\n\nRationale on the call sites; tests assert the boundary language and its\nparticipation carve-out in both prompts. 526 tests green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-78): reviewer/verify gate — cross-workspace requirements are …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T03:17:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48906e169308f67d965215615668e4b130b14d06",
          "body": "RUN-77 (56b9bd3 / 2640225) landed new test lines over the 110-col limit; both\nits CI runs failed the biome format gate and were pushed to main anyway, so\nmain has been red since. Pure line-wrapping — no tokens or assertions change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: biome-format RUN-77's test additions (main was red)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T03:17:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2640225981c826f4d06a42372aab85c4168627db",
          "body": "Codex was already correct — its only text source is the raw\nagentMessageDelta stream, with no assembled-message path to drop newlines\n(unlike claude before this task). Add a parity test that concatenates\ndeltas split mid-word and at newline boundaries and asserts the model's\nbytes survive exactly, so a future refactor can't regress it silently.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(RUN-77): pin codex transcript byte-faithfulness (newlines intact)",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T02:31:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "56b9bd305dce74809722b64b5d45965fe4d5c7a3",
          "body": "…'s newlines\n\nThe claude driver built transcript text from each assembled `assistant`\nmessage via extractText, which joins content blocks with '' and drops the\nnewlines the model put between them. Invisible in one-line prose, but it\ncollapsed a whole bulleted review into a single paragraph on the da\n[…]\named, so a transport without\npartial messages (and the existing tests) behave unchanged. thinking_delta\nis filtered out — it is not agent prose.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-77): stream raw text deltas so the transcript keeps the model…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T02:28:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abfc44a85a0734b34a949e31acbd2d2b78d581ae",
          "body": null,
          "is_bot": false,
          "headline": "noriq run run_mroazpfk3d704r0i4e6j: reviewer fix round 1",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T02:26:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "261e0f279af73d9e28c50ef83446d2bb90aa137f",
          "body": "…` — guided .noriq/project.toml, the last hand-written TOML",
          "is_bot": false,
          "headline": "noriq run run_mroazpfk3d704r0i4e6j: RUN-56 `noriq-runner init-project…",
          "author_name": "Noriq Runner",
          "author_login": null,
          "committed_at": "2026-07-17T02:24:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66caab422866384f9ed215fadbbd731dd405e4d6",
          "body": "Reviewer/verify gate scoped to the diff, intent treated as a floor not a\nceiling (RUN-76) — stops the fresh reviewer flagging pre-existing code and\nextra behavior, restoring a reachable PASS.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.5.3",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T02:11:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fe9e7126935ba05158273582cc7b77d2691d14b5",
          "body": "…floor\n\nThe inline reviewer (RUN-61) and the dispatched verify agent (RUN-20) were\ndriving good runs to a terminal FAIL. Each round spawns a fresh, stateless\nreviewer that read whole changed files and flagged PRE-EXISTING committed code\nas if this run wrote it, measured against a literal brief a lat\n[…]\nd end-to-end; 524 tests green.\n\nMove 2 (cross-round adjudication ledger) and the maxRounds budget are tracked\nfollow-ups, deliberately not here.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-76): scope the reviewer/verify gate to the diff, intent as a …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T02:10:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7da0ad41102b51700e45e511d192f10bb808c873",
          "body": "The conflict prompt spoke git: \"being rebased onto X\", \"git rebase\n--continue\", \"worktree\". But agent conflict-resolution runs on any backend\nwhose conflicts are editable files — the vcs/ seam is built on the integration\nOUTCOME, not git verbs (a server-side-conflict backend sets resolveUrl and\nneve\n[…]\ntrality + parseResolution) and a non-git assertion for the\nverify prompt; documented the agnosticism rule in prompts/README.md. 521 tests\ngreen.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(prompts): make agent prompts VCS/driver-agnostic",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T01:40:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86967f24119ad367fc9bd67f60aeb68900c8abc9",
          "body": "`npm version` rewrites package.json in npm's canonical style (arrays expanded\none item per line), which fails `biome check` — the publish gate died on the\nformatter for v0.5.1 and v0.5.2 before ever reaching npm. Re-cut of v0.5.2\nrides this commit.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: biome-format package.json after the npm version rewrite",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T01:26:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ab2c2a4d0f2701508453d9d6eb054d278cce0113",
          "body": null,
          "is_bot": false,
          "headline": "cut v0.5.2",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T01:22:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd8925d3749965b2cc10500239b4efdb8def85ab",
          "body": null,
          "is_bot": false,
          "headline": "Prompt improvements",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T01:22:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a437ef45aa9ffe88bbd0d714b0e10767fbab02d",
          "body": null,
          "is_bot": false,
          "headline": "v0.5.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T00:41:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "455903110f41902a1c5509171c3bb6d6ce1f449e",
          "body": "…blish\n\nA builder's fix turn writes to the working tree, but two downstream gates read\nCOMMITTED state — the inline reviewer via `git diff base...HEAD`, and landing via\npublish's fast-forward. So a fix was invisible to the fresh reviewer (which re-read\nthe same commit and re-reported the same findin\n[…]\nion the rebase gate had just rejected). Fold the worktree into the\nbranch before each handoff; a clean tree is a no-op checkpoint.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: commit working-tree fixes before re-review and before landing pu…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T00:41:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "14e9a80401a507080989c64874d72317d4088402",
          "body": "The words an agent is handed were scattered across six template literals in five\nfiles; tuning a sentence meant finding it in code. Now prompts/ holds one markdown\nfile per voice (identity/scope/build, verify-agent, reviewer, the two feedback\nturns, conflict, resume) and src/prompts.ts renders them \n[…]\nk, so editing a template\nneeds no build step. Rendered output is byte-identical — the existing prompt\nassertions across the suite are the proof.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: consolidate every static prompt into prompts/*.md templates",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T00:30:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2151f549a54e1bccb3f8f251e494ba888d8cc9cc",
          "body": "The run transcript (RUN-74): the daemon streams every voice in a run — builder turns,\neach inline-reviewer round, the verify command's outcome, daemon milestones — as an\nappend-only role-labeled run.log stream, so a refusal is readable from the dashboard.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.5.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-17T00:02:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f5415f95609b96d5c29b7c0120ed79bb32edacda",
          "body": "…hboard, in order\n\nDogfood pain: both builds were refused by the inline reviewer and the dashboard could not\nsay why — only the core agent's rolling logTail ever left this daemon; the reviewer's\nreport, the verify command's output, and the fix rounds were invisible.\n\nRunTranscript (src/transcript.ts\n[…]\nished' close. New run.log frame via ws-client; logTail unchanged as the live\npreview. Old server drops the unknown frame — compatible both ways.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-74): stream the run TRANSCRIPT — every voice reaches the das…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T23:54:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7357c12b9274b8d1b7f661de0a39ec313f41e04",
          "body": "Codex works again on current CLIs: app-server protocol drift (≥0.144) + silently\ndropped JSON-RPC error responses (RUN-72), a killed/verdict-less reviewer is\nno-judgment rather than a refusal, and the daemon speaks MCP with a real session —\nrestoring anchor-task prompts and the gate comments (RUN-73).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.4.1",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T22:38:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1a380e18c0ba361f1ef8b8232f895d1a0aff3a3",
          "body": "…calls are now refused\n\nThe server started requiring initialize-first (sessionless calls are not attributable),\nand the daemon's mcpCall was a bare tools/call: get_task 400'd, so anchor prompts\ndegraded to bare ids — and add_comment rode the same path, so every gate comment\n(verify failure, reviewer\n[…]\n drops the session and retries ONCE after a\nfresh handshake. Worker isolates recycle sessions at will, so the retry is load-bearing,\nnot polish.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-73): the daemon speaks MCP with a real session — sessionless …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T22:36:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5012b519c354d4b007b9730aff5aee73876a8020",
          "body": "…led-reviewer-reads-as-refusal\n\nFound live: the inline reviewer sat 15 minutes at zero CPU while its run hung in\n'verifying'. Two layers, confirmed by driving a real app-server by hand (0.144.5):\n\nThe transport dropped JSON-RPC error RESPONSES — {id, error} has neither 'result' nor\n'method', so a re\n[…]\nk. The adversarial default holds — the run still cannot pass unjudged.\n\nNot the model name: gpt-5.6-sol is valid and answered a live probe turn.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-72): codex ≥0.144 protocol drift, dropped RPC errors, and kil…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T22:36:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "365130f473ea51acfc5e35366a6ab6db177771bf",
          "body": "The board lock: .noriq/project.toml gains optional `board` (RUN-71) — lock a repo's\nwork to one board within its project, the way `key` locks it to the project.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.4.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T21:19:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f771aa102577e23e0b80741bf79de2d7da7f0b5b",
          "body": "… one board\n\n`key` pins a repo to a project; `board` is the same idea one level down. The marker\ncarries a committed board NAME (ids are server-local; this file travels), discovery passes\nit through verbatim, and registration advertises it per repo — the server resolves it and\nlands the repo's agent\n[…]\nrdId). Old server + new runner: the unknown field is stripped;\nnew server + old runner: defaults null. No behavior change until both sides ship.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-71): project.toml optional `board` — lock the repo's work to…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T21:12:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a747c99ac9b38686c85a6d8e062adaf20f23d176",
          "body": "…indows\n\ndetectVcs probes path.join(root, '.git'); the fakes compared against\n'/root/.git' literally, so on windows-latest the probe (backslashes) never\nmatched, every root fell through to the dv registry, and the two precedence\ntests failed — RUN-42's exact lesson, re-learned inside a test fixture. The\nproduct code was correct; the fakes now compare against the OS's own join.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: vcs-detect test fakes match what path.join actually produces on W…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T20:05:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "564de17a5819c54cf1d051d9c4122ee8c8d72024",
          "body": "…sted publishing\n\nTwo things the v0.3.0 cut surfaced:\n\n1. CI has been red since the init-project tests landed, and only on GitHub:\n   runInitProject called detectTools() directly, so on a box with no\n   claude/codex on PATH the \"Agent driver\" question silently disappears and\n   every positional cann\n[…]\nage.json version, full check, and the packed-binary smoke asserting on\n   output (the 0.2.0 lesson) — all before publish. Provenance rides free.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: fix the wizard suite on runners without CLIs; publish via npm tru…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T20:02:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc33a52d8d3be660bf9434ac46dfcf66a5488127",
          "body": "The VCS-split release, plus the verify stage growing up:\n- Pluggable source control (RUN-49/50/54/55/51/60/52): nine-outcome VcsBackend,\n  git + Diversion + Perforce (live-accepted), per-repo detection and routing.\n- The verify stage is a choice (RUN-61): cmd floor, inline reviewer agent with\n  its \n[…]\no the driver's auto mode (RUN-68).\n- noriq-runner init-project (RUN-56); npm-bin entry-guard fix + packed-tarball\n  CI smoke (the 0.2.0 lesson).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v0.3.0",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T19:58:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ce27d359fef1b81f0e66632985c00a3090812a6e",
          "body": "…different driver\n\nThe strongest form of the reviewer's independence: not just a fresh session, a\ndifferent VENDOR's model judging the work — codex reviewing claude's diff, or\nthe reverse. Null = the run's own driver, unchanged.\n\nTwo sharp edges, both deliberate:\n- A configured tool with no driver o\n[…]\niq/run-70 (aeb029d, off the freshly-merged main —\nrun-47/61/68 all landed upstream while this was in flight); re-vendored.\n490 tests / 36 files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-70): [verify.agent].tool — the inline reviewer may run on a …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T19:54:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb7d898e63002929710f7812eb4228eb78b45d9b",
          "body": "…an + the dependency pair\n\nA live scope run promised in its plan body to cut the five artifact RUN-59\nedges its enforced phase ordering minted, then found its floor denies\nremove_dependency — and update_plan too, so it could not even amend the\npromise. It raise_alerted (correctly) and the cost lande\n[…]\nrun had\nto work it out and could only apologize — and tells the agent to record any\nunavailable cleanup in the plan body rather than promise it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-69): scope's floor lets it TEND the plan it mints — update_pl…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T18:39:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae875c018115dae19c19a0e56831d83c03e04984",
          "body": "…ver's auto mode\n\n\"Bare Bash and danger-full-access are never granted\" becomes \"never granted\nUNINVITED\": a repo's committed manifest may now opt a kind into the driver's\nown auto mode — Claude bypass-permissions; codex danger-full-access — instead\nof the curated allowlist. Default false, and the de\n[…]\nmd, and CLAUDE.md's invariant list.\n\nSchema on planar branch noriq/run-68 (1f52132, stacked on noriq/run-61);\nre-vendored. 486 tests / 36 files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-68): [permissions.<kind>].auto — committed opt-in to the dri…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T18:32:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca55b0d87215b3fd006120969a6246755a509452",
          "body": "…d for now\n\nThe repo carries its own .noriq/project.toml (key RUN, npm run check floor +\nthe RUN-61 inline reviewer) so the runner can supervise work on itself. A\nmarker is normally COMMITTED — ignored here deliberately while the loop gets\nshaken out; drop the ignore line to share it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: ignore .noriq/ — the runner dogfoods itself, marker uncommitte…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T18:12:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9546ab97d0b20ca68b10866e5ba2ff9da5d26fb0",
          "body": "…eviewer agent, both, or none\n\nA static command was the only inline gate, and for complex projects \"the tests\npass\" is a much weaker claim than \"this diff satisfies the intent\". [verify] now\nexpresses a per-repo choice by what it contains: omit it = no verify stage (the\nhuman is the gate); cmd = the\n[…]\nmodel.ts picks up\nPLNR-126's dueAt drift). init-project asks the choice; every .cmd call site\nnarrows through cmdVerify(). 483 tests / 36 files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-61): the verify stage becomes a choice — cmd floor, inline r…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T18:08:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cef3e311b94c453a0c23356a94a676e14e9b3a4b",
          "body": "… verify get_briefing join it\n\nThe daemon now sends noriqToolNamesFor(kind) with createRunAgent, and the server\nadvertises (and registers) exactly that list for the run agent's credential — the\ncatalogue the model sees and the allowlist the drivers enforce become two views of\none policy, ending adve\n[…]\nwedTools, buildMcpServer floor filter). Older servers ignore the\nfield; older daemons omit it and their agents see the full catalogue as before.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-47): declare the Noriq tool floor to the server; heartbeat +…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T17:30:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eba928615f0ab048cafa7f137c9ec5bab6cd1ddf",
          "body": "…ude-only\n\nnoriqToolsFor lived in drivers/claude.ts and nothing else read it, so the\nper-kind Noriq floor — scope proposes but cannot claim; build claims but\ncannot mint plans; verify reads and comments but never mutates — was quietly\na property of ONE DRIVER. The same verify run on codex had every \n[…]\n and the tests pin the exact -c argument per kind,\nmirroring the claude floor tool-for-tool from the single policy.\n\n454/35 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(RUN-46): the per-kind Noriq tool floor reaches codex — it was Cla…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T16:47:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b45af7f34026ca8b107260df8a5fe96ddefdd4c",
          "body": "… live p4d\n\nBuilt on RUN-55's measurements and then PROVEN live: the real backend drove\na real p4d through the full cycle — lease → agent write → checkpoint(shelve)\n→ integrate → publish(submit), landed; then the race (the server's own\nout-of-date refusal → {race}); then a real conflict: paths repor\n[…]\nouted per repo like Diversion, one instance per repo or the lease\ndies. THREAT-MODEL.md carries the Perforce table.\n\n451/35 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-52): PerforceBackend — the third backend, accepted against a…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T16:38:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11f19c8ffc4810139f5bae5ee7720f8202d8e372",
          "body": "DiversionBackend was a proven passenger with no vehicle — the daemon\nhardcoded GitBackend for every repo. Now each discovered repo is detected\nand routed, and DETECTION is the mechanism, never a manifest field: a\ncommitted `vcs = \"git\"` in the wrong checkout is a lie the daemon would\ntrust, and the \n[…]\n workspaces → diversion with correct repo\nids through the /home symlink, unknown roots → git fallback with a reason.\n431/34 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-60): the daemon routes each repo to its VcsBackend by detection",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T16:14:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c6161cc4804114f862b62b77e9b111b045b2520",
          "body": "…backend\n\nThe second VcsBackend, and the seam-finder the plan wanted: no rebase, no\nfast-forward, no honest server-side CAS, conflicts that are not files — and\nthe nine outcomes hold anyway. Grounded end to end: RUN-54 measured the\nserver's behaviour (VCS-SPIKE.md §9), the API mapping was read from\n\n[…]\n NOT yet wired into the daemon — backend selection per repo\nis filed separately; GitBackend remains the only routed backend today.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-51): DiversionBackend — the interface survives a live-model …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T16:03:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "474c981a083b61e7aa968393468899c00ff13df3",
          "body": "…location\n\nThe trap, demonstrated by real server data during RUN-55: one Perforce -Mj\nresolve object carries clientFile (a filesystem path) and //depot/shared.txt\nside by side — and a depot path satisfies BOTH startsWith('/') (RUN-42's bug)\nand path.isAbsolute() (RUN-42's fix) while being no path at\n[…]\nmpt still assembles\n`git diff` text — prompt assembly becomes backend-aware when a second backend\nexists to need it. 402/32 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(RUN-50): Workspace splits the local path from the backend's …",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T15:17:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3d326f04c1f6b46a69326fe01e52fdcc7f635f3a",
          "body": "Stood up a real p4d (2024.2, license-free at this scale) in a scratch dir:\ntwo curls and one command. The plan's \"long pole\" was a fear, not a fact.\nVCS-SPIKE.md §10 is the addendum.\n\nThe headline: Diversion and Perforce swap places. Everything the paper spike\nfeared about Perforce is native and scr\n[…]\ncorded: keep RUN-52 after RUN-51, drop the mechanical half\nof the \"or never\" hedge — what remains of it is demand, not difficulty.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(RUN-55): Perforce hands-on — the difficulty ordering inverts",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T14:58:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "12ead4ead293aa4a9c61270d2acfd4529ca82f33",
          "body": "…t a real server\n\nThe dv CLI was already on this box (v1.0.624, authenticated), so RUN-54's\ninfrastructure cost was zero and the discovery ran today, in a throwaway repo\ndeleted afterwards. VCS-SPIKE.md §9 is the addendum; §4 and §8 now point at it\nwhere it corrects them.\n\nThe headline: there is no \n[…]\nmand, no forge credential\n- everything is authored as the account — no per-invocation identity, no\n  second credential to withhold\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(RUN-54): Diversion hands-on — the paper spike's §4 tested agains…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T14:50:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a7dfc4c5784210ce09ab9dfa7b1cc24238ff27ff",
          "body": "…'s DI seam\n\nThe seam already existed — RunSupervisor's Pick<WorktreeManager> declared\nexactly what it needs from source control — so this renames it rather than\ndesigns it: src/vcs/types.ts names the nine outcomes (VcsBackend), and\nsrc/vcs/git.ts is git's implementation, a thin delegation over Work\n[…]\nsertion changed. Workspace stays an alias of WorktreeInfo: RUN-50 owns\nthe localPath/location split and nothing here pre-empts it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(RUN-49): extract the nine VCS outcomes behind the supervisor…",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-16T14:39:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a672b25e28744381145dfdaae6e294a438f155b8",
          "body": "RUN-40 removed the hand-written-TOML cliff for runner.toml and left the other\nhalf standing: `init` set up the machine, then told you to copy 130 lines of\nproject.toml.example and edit it by hand. Same cliff, one step later.\n\nFollows RUN-40's three rules, which earned their place — validate before\nw\n[…]\nn).\n\nAlso fixes two more stale \"the daemon never pushes\" claims in\nproject.toml.example, and documents init-project in the README.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(RUN-56): `noriq-runner init-project` — the last hand-written TOML",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-15T18:57:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10aeb9dff0ade9e62dce9de3ed2512910e3b7d63",
          "body": "`npm version patch` rewrites package.json with its own formatter, which expands\nthe keywords/files arrays and disagrees with biome. Separated from the fix so\nthe fix commit stays about the fix.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: reformat package.json after the version bump",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-15T18:35:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2615711682febc751145292cce01caac41ac8cda",
          "body": "v0.2.0 is unusable. `npm i -g @noriq-dev/runner && noriq-runner version`\nprints nothing and exits 0 — for every command, on every platform.\n\nThe entry guard compared `import.meta.url` to a raw `process.argv[1]`. Node\nresolves symlinks when it resolves a module, so import.meta.url is the real\npath; a\n[…]\nasserting on OUTPUT rather than exit code: the\nbug was exit 0.\n\nBumped to 0.2.1 — 0.2.0 cannot be fixed in place and does nothing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: the published binary never ran — entry guard vs npm's bin symlink",
          "author_name": "Montana Tuska",
          "author_login": null,
          "committed_at": "2026-07-15T18:35:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 18,
      "commits_last_year": 128,
      "latest_release_at": "2026-07-20T20:43:46Z",
      "latest_release_tag": "v0.13.2",
      "releases_from_tags": true,
      "days_since_last_push": 6,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 0.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 25,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@noriq-dev/runner",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "noriq",
            "agents",
            "claude",
            "codex",
            "coding-agent",
            "daemon",
            "cli"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@noriq-dev/runner",
          "is_deprecated": false,
          "latest_version": "0.13.2",
          "repository_url": "https://github.com/noriq-dev/runner",
          "versions_count": 20,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3136,
          "first_published_at": "2026-07-15T14:44:19.071000Z",
          "latest_published_at": "2026-07-20T20:44:32.746000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "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": 142651,
      "source_files_sampled": 102,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 9890
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 12,
        "malicious_count": 0,
        "assessed_package": "npm:@noriq-dev/runner@0.13.2",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@anthropic-ai/claude-agent-sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.3.0"
        },
        {
          "name": "smol-toml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.1"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.21.1"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 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": "mtuska",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1342434?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 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": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6a9d9ada6fd2846aefc5cb5d1dfe42e0ed8e2adb",
        "ran_at": "2026-07-27T13:10:33Z",
        "aggregate_score": 3.4,
        "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-20T20:44:36Z",
      "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/noriq-dev/runner",
    "host": "github.com",
    "name": "runner",
    "owner": "noriq-dev"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 48,
      "inputs": {
        "security": 47,
        "vitality": 68,
        "community": 32,
        "governance": 32,
        "engineering": 60
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 128,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "128 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 128
                    }
                  }
                ],
                "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": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "v0.13.2",
              "releases_from_tags": true,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 0.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": 58,
            "inputs": {
              "packages": [
                "@noriq-dev/runner"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3136
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,136 downloads/month across npm",
                "points": 46.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3136,
                      "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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 32,
        "weight": 0.24,
        "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. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "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": 46.75
              },
              {
                "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": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "noriq-dev",
              "public_repos": 3,
              "account_age_days": 12
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of noriq-dev",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "noriq-dev"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~0 yr old",
                "points": 4.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@noriq-dev/runner"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "20 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "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": 60,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "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": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 47,
        "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": 34,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.4
            },
            "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": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@noriq-dev/runner@0.13.2 runtime dependency closure — what installing the published package pulls in — 12 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@noriq-dev/runner@0.13.2",
                  "assessed": 12
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 12,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 12,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 1
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.76,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 9890
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "76 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 76,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.81,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "81 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 81,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 142651,
              "source_files_sampled": 102,
              "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/102 source files over 60KB",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 102,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T13:10:39.536239Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/noriq-dev/runner.svg",
  "full_name": "noriq-dev/runner",
  "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 v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

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