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

scitix / siclaw

AI-powered SRE platform — read-only infrastructure diagnostics with deep investigation, security governance, and team collaboration

TypeScript · PythonApache-2.0★ 223 estrellas⑂ 27 forksdesde mar 2026Ver en GitHub ↗
TipoServidor MCPBibliotecaInterfaz webcómo se determina

scitix/siclaw tiene un índice de salud de 80 sobre 100, lo que lo sitúa en la banda Excelente. Su puntuación más alta es Vitality (86/100) y la más baja, Security (46/100). Se actualizó por última vez hoy. 2 personas concentran la mayor parte del trabajo reciente.

80
global / 100
Excelente

Índice de salud del software

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

80
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

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

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

Titularidad

scitixOrganización
49 seguidores39 repositorios públicosdesde jul 2024

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
npmsiclaw0.1.4455hace 130 díassrekubernetesk8saicopilotdiagnosticsclaudeagent

Métricas por categoría

Vitalidad

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

86Excelente · 21% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
15.2/36Cadencia de commits — 22/52 semanas con commits
18/18Volumen de commits — 1431 commits en el último año
0/10OpenSSF Scorecard: Maintained — sin datos
Datos de entrada utilizados
commits_last_year1431
human_commit_share1
days_since_last_push0
active_weeks_last_year22
Cómo se puntúa
27/27Publica versiones — 20 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~4,7 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count20
latest_release_tagv0.2.9
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases4,7

Comunidad y Adopción

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

59Moderado · 17% del índice global
Cómo se puntúa
38.1/60Estrellas — 223 estrellas
11.8/25Forks — 27 forks
0/15Observadores — 2 observadores
Datos de entrada utilizados
forks27
stars223
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
readme_badges
has_contributing
has_issue_templateno
has_code_of_conduct
readme_badge_services
has_pull_request_template
Cómo se puntúa
22.2/80Descargas mensuales — 45 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagessiclaw
dependents
ecosystemsnpm
total_downloads
monthly_downloads45
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?

69Bueno · 23% del índice global
Cómo se puntúa
25.2/54Factor bus — la mitad de los commits recae en 2 contribuyente(s)
12.7/22.5Distribución de commits — el principal contribuyente firma el 44% de los commits
12.2/13.5Amplitud de contribuyentes — 9 contribuyentes
0/10OpenSSF Scorecard: Contributors — sin datos
Datos de entrada utilizados
bus_factor2
contributors_sampled9
top_contributor_share0,435
Cómo se puntúa
24.7/42Resolución de issues — 59% de issues cerradas
25.9/30Aceptación de PR — 371/429 PR decididos fusionados
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — sin datos
Datos de entrada utilizados
merged_prs371
open_issues7
closed_issues10
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0,588
closed_unmerged_prs58
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Excluidos de la puntuación (sin datos o no aplicable): newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
12.2/25Alcance del propietario — 49 seguidores de scitix
15.7/25Trayectoria — 39 repos públicos, cuenta de ~2 años
Datos de entrada utilizados
followers49
owner_typeOrganization
is_verified
owner_loginscitix
public_repos39
account_age_days731
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 130 días
20/20Historial de versiones — 5 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagessiclaw
ecosystemsnpm
any_deprecatedno
min_days_since_publish130

Calidad de Ingeniería

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

72Bueno · 19% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://siclaw.ai
10/10Descripción del repositorio
10/10Topics — 10 topics
0/10Wiki
Datos de entrada utilizados
topicsai-agent, aiops, devops, kubernetes, llm, sre, openclaw, agent, ai-agents, sre-agent
has_wikino
homepagehttps://siclaw.ai
has_readme
has_docs_dir
has_description

Seguridad

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

46Débil · 16% del índice global
Cómo se puntúa
30/30Política de seguridad (SECURITY.md)
0/25Configuración de Dependabot
0/25Lockfiles de dependencias — biblioteca publicada — los lockfiles son cosa de las aplicaciones, no se esperan aquí
0/20Flujo de trabajo de CodeQL
Datos de entrada utilizados
sourcefile_signals
lockfilespackage-lock.json
manifestspackage.json, portal-web/package.json
has_codeql_workflowno
has_security_policy
has_dependabot_configno
Excluidos de la puntuación (sin datos o no aplicable): Lockfiles de dependencias. Los pesos restantes se han renormalizado.
Cómo se puntúa
14.6/35Dependencias directas libres de avisos conocidos — 1 afectados: @mariozechner/pi-coding-agent 0.55.4 (high 7.3)
13.2/25Dependencias indirectas libres de avisos conocidos — 1 afectados: @hono/node-server 1.19.15 (moderate 5.9)
40/40Sin avisos pendientes — ningún aviso lleva público más de 90 días
Datos de entrada utilizados
sourceosv
advisories4
affected_packages2
assessed_packages424
unassessed_packages0
affected_by_severityhigh 1, moderate 1
direct_affected_packages1
Se cotejó el cierre de dependencias en tiempo de ejecución de npm:siclaw@0.1.4 —lo que arrastra la instalación del paquete publicado—: 424 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? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

78Bueno · 4% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md, kbc/CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 92 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,92
agent_instruction_filesAGENTS.md, CLAUDE.md, kbc/CLAUDE.md
agent_instruction_max_bytes25.866
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json
10/10Entorno reproducible — Dockerfile, lockfile
4/10Práctica demostrada con agentes — 2 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configsmcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json
agent_commit_share0,02
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
53.2/55Tamaños de archivo manejables — 21/643 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes370.531
source_files_sampled643
oversized_source_files21
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signal
api_schema_files

Datos clave

223estrellas de GitHub
9contribuidores
1431commits en los últimos 12 meses
0días desde el último push
20versiones publicadas
2factor bus
7issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • OpenSSF Scorecard did not return a usable result (2026/07/28 05:46:07 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks

Más detalle

Historial de estrellas y forks 0 ★ / 27 ⇿
0Estrellas
27Forks
19Versiones

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

0510152025302722026-032026-052026-07
Mayor 0Menor 2Parche 17
Dependencias directas 36
RegistroPaqueteRestricción de versiónManifiesto
npm@anthropic-ai/sdk^0.71.2package.json
npm@arizeai/openinference-semantic-conventions^2.5.0package.json
npm@clack/prompts^1.1.0package.json
npm@earendil-works/pi-agent-core^0.80.7package.json
npm@earendil-works/pi-coding-agent0.80.7package.json
npm@earendil-works/pi-tui^0.80.7package.json
npm@kubernetes/client-node^1.4.0package.json
npm@modelcontextprotocol/sdk^1.27.1package.json
npm@opentelemetry/api^1.9.1package.json
npm@opentelemetry/exporter-trace-otlp-proto^0.219.0package.json
npm@opentelemetry/resources^2.8.0package.json
npm@opentelemetry/sdk-trace-node^2.8.0package.json
npm@sinclair/typebox^0.34.0package.json
npmadm-zip^0.5.17package.json
npmdiff^8.0.3package.json
npmglob^13.0.6package.json
npmjs-yaml^4.1.1package.json
npmjsonwebtoken^9.0.3package.json
npmmarkdown-it^14.1.0package.json
npmmysql2^3.22.0package.json
npmnode-forge^1.3.3package.json
npmprom-client^15.1.3package.json
npmsqlite-vec^0.1.7-alpha.2package.json
npmssh2^1.17.0package.json
npmtar^7.5.15package.json
npmws^8.18.0package.json
npmcron-parser^5.5.0portal-web/package.json
npmlucide-react^0.460.0portal-web/package.json
npmmermaid^11.15.0portal-web/package.json
npmprismjs^1.30.0portal-web/package.json
npmreact^18.3.1portal-web/package.json
npmreact-dom^18.3.1portal-web/package.json
npmreact-markdown^10.1.0portal-web/package.json
npmreact-router-dom^7.0.0portal-web/package.json
npmreact-simple-code-editor^0.14.1portal-web/package.json
npmremark-gfm^4.0.1portal-web/package.json
Todas las dependencias no recopilado

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

Avisos de dependencias 2

Instalar npm:siclaw@0.1.4 arrastra 424 paquetes, directos y transitivos: 2 tienen avisos conocidos, de los cuales 1 son dependencias directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
@mariozechner/pi-coding-agent0.55.4directaalta30.78.1
@hono/node-server1.19.15indirectamoderada12.0.5

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "ai-agent",
        "aiops",
        "devops",
        "kubernetes",
        "llm",
        "sre",
        "openclaw",
        "agent",
        "ai-agents",
        "sre-agent"
      ],
      "is_fork": false,
      "size_kb": 15451,
      "has_wiki": false,
      "homepage": "https://siclaw.ai",
      "languages": {
        "CSS": 1761,
        "HTML": 773,
        "Shell": 70560,
        "Python": 1459359,
        "Makefile": 7051,
        "Dockerfile": 3327,
        "JavaScript": 105832,
        "TypeScript": 6673844,
        "Go Template": 7209
      },
      "pushed_at": "2026-07-28T04:54:04Z",
      "created_at": "2026-03-02T04:31:11Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-27T08:32:31Z",
      "description": "AI-powered SRE platform — read-only infrastructure diagnostics with deep investigation, security governance, and team collaboration",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "scitix",
      "company": null,
      "location": null,
      "followers": 49,
      "avatar_url": "https://avatars.githubusercontent.com/u/176687877?v=4",
      "created_at": "2024-07-26T14:06:40Z",
      "is_verified": null,
      "public_repos": 39,
      "account_age_days": 731
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": null,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-07-27T09:29:27Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-07-23T12:36:52Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-07-22T11:37:32Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-07-17T16:37:08Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-07-09T17:37:23Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-06-30T15:15:42Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-26T11:11:12Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-24T11:23:37Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-22T13:17:56Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-15T08:12:58Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-06-10T13:14:09Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-06-09T09:36:33Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-06-03T13:29:45Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-05-27T09:13:38Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-04-28T12:47:02Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-03-19T11:40:32Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-03-15T10:19:46Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-03-13T12:47:09Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-03-07T07:25:05Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-03-07T05:22:08Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "35f3d9b2a29a6f98882f0cf433fbb6c80d8a6da7",
          "body": "kbc box: rebuild and continue on compile-turn stall or SDK subprocess death",
          "is_bot": false,
          "headline": "Merge pull request #448 from scitix/fix/kbc-compile-stall-coverage",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T05:29:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46ea747aec40308bcebce7488ee059967595edd1",
          "body": "posixpath and urllib.parse have no call sites in this module. They arrived with\nthe record-stream recognisers — the ones that decided for the model what a source\nwas — and outlived the revert that removed them.\n\nCaught in review. My first check said urllib was still used; the grep had counted\n`import urllib.parse` as a call site. Both are gone.",
          "is_bot": false,
          "headline": "chore(kbc): drop the imports the reverted classifiers left behind",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T04:23:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16990b53ec9b9b89ace7fe31cc680d6870cb9a54",
          "body": "…ranscript\n\nThree consecutive batches of one live compile transcribed the same tickets. An\naggregate ledger of 1,177 records. Then twenty-one weekly exports the ledger was\nbuilt from. Then an 825-record bitable dump of the same period, read in\nthirty-two windows and appended chunk by chunk.\n\nThe com\n[…]\nvers one specification\npresented twice, an old and a new revision of a process, a table that exists as\nboth a screenshot and text — anywhere the corpus carries one body of fact in\nmore than one shape.",
          "is_bot": false,
          "headline": "docs(kbc): compile the delta of an overlapping source, not a second t…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:58:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "192bc75897a7a5d6f871783066fa32cf4b796c9b",
          "body": "…or our machinery\n\nThe batch train ended on things that were never the owner's knowledge going\nwrong. A stalled turn or a dead SDK subprocess ended the run instead of being\nrebuilt and continued. A content shape the planner disliked wedged it. One\nunreadable PDF page — a missing extractor, a file th\n[…]\nthe unreadable section and box_role all deferred to it\nin the same commit, because a rule taught to one component and not its siblings\nis the shape of every contradiction this codebase produced today.",
          "is_bot": false,
          "headline": "fix(kbc): keep the batch train alive, and stop making the owner pay f…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:37:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f129c4932a876c6abfe54cdc605b1d8d2654f2f",
          "body": "…its forms\n\nTwo knowledge bases could not be compiled at all — the box started, planned, and\ndied before reading a page:\n\n  RuntimeError: hierarchical batch planner produced an invalid plan: batch h026:\n  attachment …/assets/…pptx is separated from the document that embeds it\n\nThe two packers disagr\n[…]\n\"reproduction\"\nof this bug passed attachment_edges=None, where nothing owns anything, no family\nforms, and the defect cannot fire. A test that cannot fail on the defect it\nnames is worse than no test.",
          "is_bot": false,
          "headline": "fix(kbc): a document family never splits, and the ledger counts both …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:35:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4bd98810f50a23e53b96bc5813292fceadd7e680",
          "body": "…e kept\n\nA deck or a workbook arrived as one opaque blob: the pre-render carried its text\nand everything else — every slide picture, every chart — was simply gone, with\nnothing anywhere saying so. A hardware manual whose diagrams are the content\ncompiled to a page about a document that had no diagra\n[…]\nwner can see is a different\nthing from a gap nobody knows about.\n\nScope is deliberate: the common shapes, extracted cheaply and predictably. Rare\nones are named as unsupported instead of half-handled.",
          "is_bot": false,
          "headline": "feat(kbc): keep what is inside an Office file, and name what cannot b…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:33:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f936f482180a72a208212d937eb46ea10529e48",
          "body": "…essage-location\n\nfix(lark): link feedback cards to persisted messages",
          "is_bot": false,
          "headline": "Merge pull request #447 from glow-Kev1n/fix/siclaw-channel-feedback-m…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-24T13:44:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7975b2cc212bdf493b508e8d20c7860645c64758",
          "body": null,
          "is_bot": false,
          "headline": "fix(lark): persist delta-only replies for feedback",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-24T08:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba2661c98068e0ed589df162ad69d8dad21cfc89",
          "body": null,
          "is_bot": false,
          "headline": "fix(lark): link feedback cards to assistant messages",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-23T12:48:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a433c2d905b1830dab1e3b02d8b24d112193370",
          "body": "feat(kb): platform hardening batch — coverage v2, box naming, MCP multi-key, test-session resilience, custom prompt fix",
          "is_bot": false,
          "headline": "Merge pull request #446 from scitix/feat/kb-platform-batch-20260723",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:45:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1738a60b0d21aea9e239359e06d71da724a1d1f",
          "body": "…ragment/?query\n\nAn anchored angle destination — ![f](<assets/a b.png>#fig1) — defeated the\nunwrap: the link regex's angle alternation only matches when `>` is\nimmediately followed by `)`, so the whole `<...>#fig1` fell to the bare\nbranch, endswith(\">\") was false, the brackets were never stripped, a\n[…]\n lockstep); the shared asset-provenance fixture pins the case\nwith a new `guide/assets/c d.png` referenced only via\n`<assets/c d.png>#fig1` — the old parser demonstrably drops that edge in\nboth repos.",
          "is_bot": false,
          "headline": "fix(kbc): unwrap angle-bracketed link destinations with a trailing #f…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:27:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab3cbb162036650b46c43e0b29723abb9bd3b70c",
          "body": "…w generation-specific\n\nTwo review findings on the stall-reap path:\n\n1. The pending-terminator window was armed only AFTER interrupt() returned,\n   but the stall turn_done frees the UI BEFORE that await — a retry landing\n   while interrupt() was in flight saw neither _needs_rebuild nor a pending\n   \n[…]\ne reaper inside a blocked interrupt(),\nretries in exactly that gap, and asserts one stall, a rebuild, and the\nretry's answer displayed. Verified it fails on the previous head with the\nretry swallowed.",
          "is_bot": false,
          "headline": "fix(kbc-box): close the reap-to-arm gap and make the terminator windo…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:27:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "916d85d80b0c03261366aa6e0619881503dfc84f",
          "body": "…ndow is unresolved\n\nAfter a stall reap whose interrupt() succeeded, the watchdog frees the UI\n(turn_done) and arms a bounded window waiting for the torn-down turn's\nResultMessage. But the UI can retry immediately inside that window, and\narming the retry on the old client is ambiguous (review P1): i\n[…]\ntall timeout, the second answer is displayed, the\nclient was rebuilt, and no stale-frame drops occurred. Verified it fails\non the previous head with two turn_stalled events and the retry answer\neaten.",
          "is_bot": false,
          "headline": "fix(kbc-box): rebuild on retry while the post-interrupt terminator wi…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:06:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf1b9b6096e4719f3eb206cf5fceabd391e93889",
          "body": "…t-message\n\nAfter a rebuild whose reconnect failed, the driver clears `connected` and\nparks until the next rebuild request. But handle_test_message waited on\n`connected` first, so every retry timed out at the liveness gate (503\n\"session is still starting\") and the rebuild retry path never ran — the\n\n[…]\nonnect fails (immediate retryable 503, flag re-armed), second retry\nrebuilds on a fresh client and the turn is answered. Verified the test\nfails on the previous head with exactly the reported symptom.",
          "is_bot": false,
          "headline": "fix(kbc-box): consult _needs_rebuild before the liveness gate in /tes…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T10:32:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35d1860daed4b8412c5327401befb017978129b7",
          "body": "…ator is lost\n\nReview P1 on the per-turn generation guard. The guard assumes a stall-reaped\ntest turn's torn-down ResultMessage eventually arrives and advances\n_results_seen. But the reaper's client.interrupt() can be swallowed by the same\nblack hole that wedged the turn, so that terminator may NEVE\n[…]\n interrupt but terminator never arrives -> window elapses -> rebuild;\nterminator arrives in-window -> no rebuild, existing drop path (regression\nguard). Full suite green across three consecutive runs.",
          "is_bot": false,
          "headline": "fix(kbc-box): rebuild test-session client when a reaped turn's termin…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T10:15:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85e8ce34f4d20640cf6589e3d25359baf43319bc",
          "body": "…y + per-turn generation guard\n\nP1-1 (idempotency key not run-isolated): the open-test dedup map was keyed by\nclient_request_id alone, so on a shared box two runs colliding on a request id\nwould replay each other's tid/snapshot/fingerprint. Key it by (parent_run_id,\nclient_request_id) and re-verify \n[…]\ndog reap, then injects the reaped turn's late partial + ResultMessage via a\nnew queue-driven fake, asserting the fresh turn survives and completes on its own\nresult while both stragglers are dropped).",
          "is_bot": false,
          "headline": "fix(kbc-box): review P1s in test-session path — run-scoped idempotenc…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T08:51:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eaf53f0b40b4dac33d53576895d981724c402df2",
          "body": "…le pods\n\nIntegration fix for the #442 × #444 merge interaction. #442 renamed the\ncompile-box pod prefix (agentbox- → kbc-box-, profile-derived) and updated\nonReap/onAdopt to pass rec.profile, but left the other capability call sites\nresolving the pod name with the default \"agentbox\" prefix. On main\n[…]\nmory-cold testClose/testSessions now assert getAsync is called with\nthe recovered \"kb-compile\" profile (→ kbc-box-<id>); cancel asserts stop carries\nthe profile for both in-memory and store-only runs.",
          "is_bot": false,
          "headline": "fix(capability): thread run profile into box discovery/stop for compi…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:59:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf4fd46cd56dd4914377cd0d16ca84a333e99c27",
          "body": "Box turn-stall watchdog, idle-TTL reaper, test-session list; gateway proxy/idempotency + relay predicate.",
          "is_bot": false,
          "headline": "Merge PR #444 fix/kb-test-session-resilience into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "183edb0e17eb0f8f9ff22e1234fdd5f248b8cca2",
          "body": "Apply agent custom system prompt fallback on the web chat path (gateway chat.send).",
          "is_bot": false,
          "headline": "Merge PR #445 fix/chat-custom-system-prompt into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26d494acb2cac3006b9c32e7cd412bf0029da50e",
          "body": "selfcheck coverage v2 (media assets auto-attach via citing docs) + fixtures + box role discipline + mediaverify interop.",
          "is_bot": false,
          "headline": "Merge PR #439 feat/kb-asset-provenance into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18078ac40718e0e56f39b624b061b37564ca81bc",
          "body": "Rename compile box image to siclaw-kbc-box and pod prefix to kbc-box; upgrade cleans old pods.",
          "is_bot": false,
          "headline": "Merge PR #442 feat/kbcbox-naming into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3f57579834607e0d93293736a763690f1b30fc1",
          "body": "Support multiple named A2A keys selected by alias in mcp/sicore-a2a-adapter.",
          "is_bot": false,
          "headline": "Merge PR #443 feat/mcp-multi-key-alias into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7104d97b7556ca796b14d88f27db4f888d4c17f",
          "body": "chat.send only read params.systemPrompt when building the box prompt.\nsicore's web-chat proxy never forwards that param, so a custom-prompt\nagent silently fell back to AgentBox's built-in default SRE persona on\nsicore web chat — while channel paths (dingtalk/lark) resolved the\nagent's own template a\n[…]\nsystem-prompt.test.ts covering: explicit param wins and\nskips the lookup; omitted param resolves the agent's custom prompt; no\ncustom prompt / lookup failure -> undefined default (send still acks ok).",
          "is_bot": false,
          "headline": "fix(runtime): apply agent custom system prompt on the web chat path",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:50:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6239a80c2c3c95113aef217800f2bc95be750762",
          "body": "Align the testStart idempotency key with sicore (MR!696) and the codebase's\nexisting convention: every consumer-minted idempotency key here is a `<noun>_id`\n(message_id for a turn, command_id for a typed command, operation_id for a\nmutation receipt) — there is no `idempotency_key`. So the field is\n`\n[…]\n → open fresh. Box read + TestRun attribute +\nteardown cleanup, the gateway request type + passthrough, and the box test's\nwire bodies all renamed. box suite 70 green; tsc clean; gateway vitest green.",
          "is_bot": false,
          "headline": "Rename test-session idempotency field to client_request_id",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:47:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a14548704368ecad39fab9d1b85950c86ac59337",
          "body": "Follow-up to the testStart idempotency change: the relay-skip guard only fires\non the rare idempotent-replay path, and a future refactor of the testStart\nhandler could silently drop it — splitting the box's single-consumer\n/test-events stream. Extract the decision into a pure predicate\n(shouldRelayT\n[…]\n unit-test both branches\n(replay → no relay; fresh open or flag absent → relay); the handler now calls\nthe predicate instead of an inline check. Behavior unchanged. tsc clean;\ntest-relay vitest green.",
          "is_bot": false,
          "headline": "Extract shouldRelayTestSession predicate + unit-test both branches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:35:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a0a995e8794bc9623128d82e4129f0ac2157d38",
          "body": "Two P2 follow-ups from the sicore MR review, layered on the test-session work.\n\n1. testStart idempotency (kbc/platform/pod/compile_box.py + gateway):\n   handle_open_test accepts an optional `idempotency_key`. A retried open with\n   the same key returns the SAME live session (same tid/snapshot_hash/p\n[…]\ndrops the key (fresh afterwards), no-key never deduped;\ngateway test asserts a shared box's two runs are mutually invisible in the list.\ntsc --noEmit clean; gateway vitest green; box suite 70 passing.",
          "is_bot": false,
          "headline": "Add testStart idempotency key + run-scoped test-session listing",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:32:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "651dc321a627f1b17450e4d1c085ee55f9f27679",
          "body": "…session limit\n\nWire the box-side test-session resilience through the TS gateway so the consumer\ncan reach it, aligned with the sicore side.\n\n1. capability.testSessions (src/gateway/server.ts): new RPC method proxying the\n   box's GET /test-sessions. Read-only reconciliation — mirrors testClose's bo\n[…]\nest-sessions.test.ts (passthrough with\ntid preserved / empty on absent box / run_id required); box test asserts the\nstructured 429 body. tsc --noEmit clean; gateway vitest green; box suite 69\npassing.",
          "is_bot": false,
          "headline": "Add capability.testSessions runtime method + structured 429 for test-…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:24:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fcb40b1ee19f0d4344784202479811b4972ad46",
          "body": "…fecycle logs\n\nThree production-confirmed defects in the read-only test-session path\n(kbc/platform/pod/compile_box.py), all box-side:\n\n1. Test turns hung on \"thinking\" forever. The test-session receive loop\n   (test_session_driver) was a bare `async for msg in receive_messages()`\n   with no model-st\n[…]\ndged turn and keeps the\nsession live for a follow-up question; idle-TTL sweep drops orphans and spares\nactive sessions; GET /test-sessions returns the agreed wire shape. Full suite\ngreen (69 passing).",
          "is_bot": false,
          "headline": "Add test-session resilience: turn-stall watchdog, idle-TTL reaper, li…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:09:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9475d94ea4ad8041920e330e503a1b497602e685",
          "body": "One adapter process could previously bind only a single A2A key, so\nswitching Siclaw agents meant editing config and restarting. Passing the\nkey as a tool argument is not an option: credentials must never flow\nthrough the model context.\n\nAdd configuration-side named keys, selected at call time by al\n[…]\nw logic through an AgentRouter; keep SicoreA2aClient per-key.\nExisting tests updated to the router API; add router unit tests, multi-key\nrouting tool tests, and a two-alias stdio e2e cold-start smoke.",
          "is_bot": false,
          "headline": "feat(sicore-a2a-mcp): support multiple named A2A keys selected by alias",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:07:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7074badb90aebb8ca7b7440e6fe98675d7aaff7",
          "body": "…to kbc-box\n\nMotivation (operations): during production troubleshooting every pod was\nnamed `agentbox-<id>`, so a KB compile box and a chat agentbox could only be\ntold apart by label/image filtering — the compile box has bitten on-call more\nthan once. Make the compile box distinguishable at a glance\n[…]\nfor prod.\n\nTests: box-profile / k8s-spawner / manager suites green, including new coverage\nfor the kbc-box prefix, the legacy-pod reap, the chat-pod guard, and the\nprofile-aware stop/getAsync lookups.",
          "is_bot": false,
          "headline": "feat(kbc): rename compile box image to siclaw-kbc-box and pod prefix …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T14:57:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d581f3731bb03f9af2182e285b1b64ce97f99f6d",
          "body": "Two implementation-level details locked byte-for-byte with the sicore adoption\nledger (shared fixture, DESIGN §六), after cross-checking the two implementations:\n\n1. is_media_asset segment match is now case-INSENSITIVE (`Assets/`, `report.ASSETS/`\n   count too). The platform always writes lowercase `\n[…]\ner change alters any prior fixture\noutput; expected.json is regenerated from the reference implementation with an\nin-generator sanity assert on the invariants. All selfcheck + mediaverify tests\ngreen.",
          "is_bot": false,
          "headline": "feat(kbc): align coverage-v2 edge semantics with sicore ledger mirror",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:38:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5790bf354a3cf72de169acafe7629544c19dc7f9",
          "body": "Follow-up to coverage v2. media_citing_pages() gains a third discovery path:\na candidate page that cites a DOCUMENT d in its compiled_from now inherits the\nimage numeric-fidelity check of every image d embeds in its body (via\nasset_attribution_edges), unioned with the existing two paths (directly-ci\n[…]\ntion surface),\nso a media asset like .tiff is accounted by coverage but not numerically re-read.\nAdditive only: no existing media test used an assets/ raw path, so all prior\nassertions pass unchanged.",
          "is_bot": false,
          "headline": "feat(kbc): media numeric re-verification follows attribution edges",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:25:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec1b74c85ae34a37334359641834be27ae970995",
          "body": "Media assets (images under assets/) are document attachments, not first-class\nsources. Coverage v2 auto-accounts an image against any document that embeds it\nin its body, once that document is itself cited or excluded — so compiled_from\nno longer needs a token per image and the exclusion ledger no l\n[…]\nells the compile agent to cite documents only —\nimages auto-attach; do not cite or exclude them one-by-one; orphan images still\nneed a reasoned exclusion; assets/sheets/ placeholders handled as usual.",
          "is_bot": false,
          "headline": "feat(kbc): coverage v2 — media assets auto-attach via citing docs",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:19:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef14a19e338a0bc0444091d9352a1f219fdde2a6",
          "body": "fix(kbc): de-stream v2 — default-on session-scoped activation + stall-watchdog floor (follow-up to #434)",
          "is_bot": false,
          "headline": "Merge pull request #438 from scitix/fix/kb-destream-session-scoped",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T11:36:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d1814132bca503be6ff75f00cdf967607655118",
          "body": "The v2 de-stream tests (test_destream.py) were not executed by the KBC Box\nCI job, so the green \"KBC Box Test\" check did not cover this PR's shim/session\n-scoping/watchdog-floor tests. Run it explicitly alongside test_compile_box.py.",
          "is_bot": false,
          "headline": "ci(kbc): run test_destream.py in the KBC Box CI workflow",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:52:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "041147a24bce89ec9a47484f103d9b6cc8afb440",
          "body": "…dog floor to model phase\n\nFollow-up review fixes for #438 (de-stream v2):\n\n- The two non-interactive Claude reviewer sessions — explicit test\n  recommendation (_recommendation_session_opts) and reference-answer assist\n  (_reference_assist_session_opts) — still ran with an empty SDK env and hit\n  th\n[…]\nt_destream.py gains two integration assertions: both reviewer callers'\n  opts.env carry the shim URL (and clear to {} on operator opt-out), and the\n  watchdog floor never extends a pending-tool bound.",
          "is_bot": false,
          "headline": "fix(kbc): route reviewer sessions through de-stream shim; scope watch…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:52:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "614a7b65edb029a5e7539c2e4b39eca61ffd445d",
          "body": "fix(agentbox): distinguish probe failures from unreachable clusters",
          "is_bot": false,
          "headline": "Merge pull request #428 from caihongwei2006/feat/probe-error-codes",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:26:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49591c609e607679f54de4fdeb7c588e4a8c3be0",
          "body": "…-watchdog floor\n\nFollow-up to #434, which merged while the shim was still at v1. v1 activated\nthe de-streaming shim with a global env rewrite (ANTHROPIC_BASE_URL) gated on\nan opt-in KBC_DESTREAM flag, and did not account for the stall watchdog. Two\nproblems with that shape:\n\n- Global env rewrite ha\n[…]\ne honest price, still far\n  under the CLI's own ~60min request timeout.\n\nBlast radius: the kbc-compile-box image only (127.0.0.1 listener); runtime,\nagentbox and sicore-side LLM callers are untouched.",
          "is_bot": false,
          "headline": "fix(kbc): de-stream v2 — default-on session-scoped activation + stall…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:18:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9539778c3d2796b935ce549b7b55aab88830fcc",
          "body": "feat(kbc): de-stream the compile box's Anthropic calls to dodge the gateway charset bug",
          "is_bot": false,
          "headline": "Merge pull request #434 from scitix/feat/kb-compile-destream",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T08:34:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae5555f01fa48f7a03e223adfdbcbb86e7f04b9f",
          "body": "fix(kbc): scale L1 auto-repair budget with open-violation workload",
          "is_bot": false,
          "headline": "Merge pull request #430 from scitix/fix/kb-l1-repair-budget-scaling",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T08:16:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c2cc962b7845b5149c262ea83a5d0136e30dd32",
          "body": "fix(tools): filter kubectl exec transport noise",
          "is_bot": false,
          "headline": "Merge pull request #436 from caihongwei2006/fix/pod-exec-transport-noise",
          "author_name": "jacoblee-io",
          "author_login": "jacoblee-io",
          "committed_at": "2026-07-22T08:09:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69a38c3520062f1e209fbcda08cebad533c3b417",
          "body": "Default debug mode can expose Docker/Moby and kubectl exec Go transport diagnostics in pod_exec stderr. Remove known SPDY/WebSocket stream log lines while preserving the actual container or OCI error.",
          "is_bot": false,
          "headline": "fix(tools): filter kubectl exec transport noise",
          "author_name": "jtang",
          "author_login": null,
          "committed_at": "2026-07-22T07:57:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "430aa1b996ea8686adbf1ba40939521b439e698a",
          "body": "Review finding: the limit derives from the OPEN workload, which shrinks as\nrepairs land, so gating on a per-turn recomputation closes the gate at\nroughly half-repaired (55-item motivating case: stops at turn 4 with ~19\nleft). Mirror the evaluation timing of _batch_media_verify_round_limit, not\njust \n[…]\n the shrinking-workload path: 30-violation episode\nrecords limit 3, workload collapses to 2 after the first repair, the gate\nstays open for rounds 2-3, and the unconverged report shows used=3/limit=3.",
          "is_bot": false,
          "headline": "fix(kbc): gate the repair loop on a per-episode high-water budget",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:50:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d676ca8d2a4a044d0ffd76a63c966c8422b853a",
          "body": "…kload\n\nA flat 2-round repair budget is sized for ordinary drift. A first full\ncompile or a wiki adoption over a large KB opens dozens of mechanical\nviolations at once, so the budget is structurally spent before the loop can\nconverge and the whole tail lands in the owner's question queue as one\nopaq\n[…]\nELFCHECK.json additionally reports repair_rounds_limit for\nobservability. Existing flat-budget gate tests are unaffected (small\nworkloads keep the floor); new unit test covers floor, scaling, and cap.",
          "is_bot": false,
          "headline": "fix(kbc): scale the L1 auto-repair budget with the open-violation wor…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:50:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1395a96eddbac7f90f16b88da0cf7240ba3944ea",
          "body": "…repair-20260721\n\nfix(kbc): normalize unambiguous source citations",
          "is_bot": false,
          "headline": "Merge pull request #426 from scitix/fix/kbc-deterministic-provenance-…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:22:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "125bc5ea00470733ca851695f509d816a709a01a",
          "body": "…riage\n\nfix(kbc): auto-resolve image-verification doubts backed by co-cited text sources",
          "is_bot": false,
          "headline": "Merge pull request #433 from scitix/fix/kb-media-verify-text-backed-t…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:22:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4f56f4411d3ad08d314e167686477d0c6f006cc",
          "body": "…fix)\n\nmassapi's Anthropic-compatible STREAMING route corrupts multibyte characters\nwhose bytes straddle an SSE chunk boundary (per-chunk UTF-8 decode with\nerrors=replace -> U+FFFD); its non-streaming route returns identical bytes\nintact (gateway bug report, 2026-07). The compile box is non-interact\n[…]\nesis round-trip (byte-perfect CJK text, tool_use\npartial_json, usage split), keepalive under a slow upstream, error mapping,\nraw passthrough, and activation env logic (opt-in/opt-out/codex untouched).",
          "is_bot": false,
          "headline": "feat(kbc): in-pod de-streaming shim for the Anthropic route (charset …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:11:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2ef03de922e03cda41bd0e863d198ba48dbcb62",
          "body": "feat(gateway): persist prompt trace attribution",
          "is_bot": false,
          "headline": "Merge pull request #429 from glow-Kev1n/feat/siclaw-trace-audit",
          "author_name": "chent1996",
          "author_login": "chent1996",
          "committed_at": "2026-07-22T05:27:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0deae055fdd87fd3ac086d149eb17bc67cad7f0",
          "body": "…sources\n\nThe blind-verify comparer flags 超出转写范围 when a cited image cannot\nsupport a claim. That inference is only valid when the image is the claim's\nsole source — curated pages routinely cite whole asset sets as corroboration\nwhile the figure comes from a co-cited text export. Live adoption run\n(2\n[…]\nbacked claim conflicting with what the image shows is a\ngenuine cross-source conflict. Qualitative claims without distinctive\nnumbers keep escalating.\n\nImplements the triage step of scitix/siclaw#431.",
          "is_bot": false,
          "headline": "fix(kbc): auto-resolve image doubts verbatim-backed by co-cited text …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T04:45:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7fd26e7b455172a60f07db92398d6e9ca298c9ad",
          "body": "cluster_list's kubectl probe reported every failure as reachable:false,\nso a local kubeconfig/credential/tooling problem read as \"cluster down\"\nand invited the model to hallucinate an outage.\n\nClassify probe outcomes as success / unreachable / probe_failed with a\nstructured reason. unreachable now r\n[…]\nReverts the global test-ignore .gitignore block so tests stay versioned;\nadds table-driven classifier tests and three-state cluster_list tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agentbox): distinguish probe failures from unreachable clusters",
          "author_name": "jtang",
          "author_login": null,
          "committed_at": "2026-07-22T03:43:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4e83fc98f5097ee590e2edbea6a2d276507674c",
          "body": "Standalone Portal must mirror the trace-binding RPC or every local prompt logs an unknown-method warning. Keep the mutation narrow and idempotent, and dispatch best-effort binds without delaying response streaming.\n\nTested: tsc --noEmit; git diff --check; SQLite SQL probe\nNot-tested: local Vitest (esbuild is not executable); GitHub Actions pending",
          "is_bot": false,
          "headline": "fix(gateway): complete trace message binding",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T03:20:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b71ea50747a794ded569903b1347ad32914b7b5d",
          "body": "The mechanical normalizer re-parses each payload wrapped in ASCII parens.\nA payload holding an unbalanced ASCII \")\" inside a full-width marker makes\nthat re-parse close before the span's true end, so the parsed item covers\nonly a prefix of the span; rewriting the whole span from it would silently\ndrop the tail. Require the parsed item to cover the payload (modulo the\nseparator strip the parser itself applies) and otherwise leave the span\nmalformed for semantic repair.",
          "is_bot": false,
          "headline": "fix(kbc): skip span-truncating citation rewrites",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-22T03:13:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8daf382f21d6aab263cd4e46c6d9894efd30c9ae",
          "body": null,
          "is_bot": false,
          "headline": "test(gateway): make trace binding mocks async",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:54:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ac79b05b2637adb9217cd40e6f9fcbea4e18270",
          "body": "A concurrent chat.send is persisted before AgentBox can report that the session is already running. Once the fallback steer succeeds, relabel that exact row so transcript and trace readers keep additional input separate from the prompt that started the active trace.",
          "is_bot": false,
          "headline": "fix(gateway): mark automatic steer messages",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c9115dfd21654a3b388b296a26aec05e90f9bdb",
          "body": null,
          "is_bot": false,
          "headline": "feat(gateway): persist prompt trace attribution",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16b160994c2ef283aad5c84ddb1525a3f857edb5",
          "body": "Move exact provenance formatting repairs ahead of the model repair budget while preserving incremental page isolation.\n\nTested: test_selfcheck.py; test_incremental.py; test_compile_box.py\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "fix(kbc): normalize unambiguous source citations",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T11:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c76d2334b502eaad95f180d3b7b6b2dbf82f1ba",
          "body": "feat(mcp): add Sicore A2A adapter for coding agents",
          "is_bot": false,
          "headline": "Merge pull request #420 from scitix/feat/a2a-mcp-adapter",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T10:59:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b6d61442bad6360b790f436e024e83935ac5285",
          "body": "fix(kbc): allow the Codex nested writer sandbox",
          "is_bot": false,
          "headline": "Merge pull request #425 from scitix/fix/kbc-codex-bwrap-sandbox-20260721",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T10:57:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "429d1d64d1f06bb096456328d48e26b128641dbf",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): allow the Codex nested writer sandbox",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T09:31:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab4a4a95e45bed6b25188f22caf29b821fe20c50",
          "body": "fix(kbc): accept bounded large source snapshot parts",
          "is_bot": false,
          "headline": "Merge pull request #424 from scitix/fix/kbc-large-source-parts-20260720",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T09:24:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "659795a0dbdfe5de0f6eaaf89536b56f8f332bc1",
          "body": "… absent\n\nSicore agent API keys are per-agent, so requiring the operator to also\ncopy the agent UUID into MCP config was redundant friction. When\nSICLAW_AGENT_ID is unset the adapter now asks GET /api/v1/a2a/self\n(sicore MR feat/a2a-key-self-endpoint) which agent the key is bound to,\nwith the same bounded idempotent-read retry as other GETs. Setting\nSICLAW_AGENT_ID still pins the agent explicitly and remains required\nagainst older Sicore deployments without /self (actionable 404 error).",
          "is_bot": false,
          "headline": "feat(mcp): resolve the agent from the A2A key when SICLAW_AGENT_ID is…",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T07:39:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4b7f268e46b8cf0c41ad2c9efd00c33ea6bcc4a",
          "body": "A successful message:send followed by a fully failed bounded wait used to\nreturn a plain tool error without the task_id. The task already exists\nserver-side, so the error invited the client model to resubmit a duplicate\ninvestigation. Return the submitted task as a compact working view with a\nwait_error note instead.",
          "is_bot": false,
          "headline": "fix(mcp): keep task_id when the bounded wait fails after submission",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T06:38:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d36ca9b9ee32edc094c48f1d0a9be57498461601",
          "body": null,
          "is_bot": false,
          "headline": "fix(mcp): retry transient A2A task reads",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8a04582b25a653058f8a665d6da9206bfe833d2",
          "body": "Root-level Vitest discovers the adapter tests before the nested package has built its ignored dist output. Start the subprocess through tsx so both the repository CI suite and the standalone package exercise the same source entrypoint.\n\nTested: npm test in adapter package; root npx vitest stdio e2e; root npm test (4502 passed, 2 skipped)\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "test(mcp): run stdio e2e from TypeScript source",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "191752889354a8c424bbf31fe6f080adb2376a73",
          "body": "Codex and Claude need a thin local bridge to reuse a user's existing Siclaw agent without receiving cluster credentials or choosing a different agent at runtime. Keep long investigations durable in Sicore, expose a bounded same-turn watchdog, and suppress repeated partial reports until the task is terminal.\n\nTested: npm ci; npm test; npm audit --omit=dev; live Sicore A2A WATCHDOG_READY smoke test\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "feat(mcp): add Sicore A2A adapter for coding agents",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e526e7b7e28695dd8d370a29a2945ebb05286944",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): bound large source materialization",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T02:57:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f243b4cd7c19ed077861e969775c2dad57d38de2",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): accept bounded large source parts",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T17:17:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adfb49f10b62d5a2edbfe681867337a8d910446b",
          "body": "…260719\n\nfeat(kbc): support attachment-aware PDF batch slices",
          "is_bot": false,
          "headline": "Merge pull request #423 from scitix/feat/kbc-attachment-family-pdf-20…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T11:20:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a66073fd6f5a564c7a5527a1f12d34b27ac174a",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): integrate PDF batches with Codex engine",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T08:35:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e38e9ee6ecd695bcec1fc77c39d2c05e16e7de0",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): enforce batch raw read scope",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:59:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0ad0108509bd9f39ffb80917da93e5ed2d83d4f",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): keep PDF metadata off the small-KB path",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc6bdabbd2024cf80275ac858c2e0f5d956acee0",
          "body": null,
          "is_bot": false,
          "headline": "Support attachment-aware PDF batch slices",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b9683cf80302fa58ba9994f3fe80cddb919abd7",
          "body": "…60718\n\nfeat(kbc): add hierarchical compilation for very large corpora",
          "is_bot": false,
          "headline": "Merge pull request #422 from scitix/feat/kbc-hierarchical-compile-202…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:51:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7621a7b6ef48ad0605355c7689b56752633ea1a0",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): make batch resume phase-aware",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T07:24:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "238da21e52fbff521552474fbf664f79b630b06c",
          "body": null,
          "is_bot": false,
          "headline": "test(kbc): cover hierarchical engine integration",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T06:40:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1539e14b5de0ab8685cad07ed1a6dd1c32e80fb",
          "body": null,
          "is_bot": false,
          "headline": "Reverify ledger-clean media repairs",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db54c1e33181da516c6bdd598225b9bc974d17fc",
          "body": null,
          "is_bot": false,
          "headline": "Slice oversized Markdown batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "459c08c6049947a734ec7f421eb80f7f7ae54611",
          "body": null,
          "is_bot": false,
          "headline": "Reduce hierarchical vision context",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72acb4ce71beaa7b167b4f68b15df34ec052dda2",
          "body": null,
          "is_bot": false,
          "headline": "Bound image-heavy hierarchical batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e531b8c99c6e7b5c6bdb0fefabbb886abec3c587",
          "body": null,
          "is_bot": false,
          "headline": "Keep hierarchical media verification resumable",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96423309e6ce6b90b12c220e9754ea9899c162fa",
          "body": null,
          "is_bot": false,
          "headline": "Fail closed on invalid batch results",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ee96a9b7710d57db9b082b6976aad2ea8c6b43f",
          "body": "Bind image verification to page and image content so repaired pages cannot inherit a stale pass. Add an explicitly scoped candidate-page delete tool and accept common plural page locators.\n\nTested: KBC compile-box, selfcheck, batching, Office ingest, red-blue, and mTLS suites\n\nScope-risk: moderate",
          "is_bot": false,
          "headline": "Harden media verification and candidate cleanup",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5abaffc4c8fe20d0d9c6bcc559a6b1d8aa4c5778",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): relax stall timeout for hierarchical batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f27d528861e4e3db94456396aa1a18085666630",
          "body": "Keep the existing single-session and flat-batch routes unchanged, while grouping document assets, adding bounded section reduction, and persisting resumable map/reduce/final phases.\n\nTested: KBC Python suites; npm test; npm run build; 628MB GPU Raw planner dry-run\n\nScope-risk: moderate",
          "is_bot": false,
          "headline": "feat(kbc): add hierarchical compilation for very large corpora",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1cf7ddb60211e6e5d1a279835b3dd6d92721bcb",
          "body": "feat(kbc): add resumable Source Snapshot v2 delivery",
          "is_bot": false,
          "headline": "Merge pull request #421 from scitix/feat/kbc-source-snapshot-v2-20260718",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:26:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ae32ad1ace6ee8b325db2bb37e1f5059b2f4f9f",
          "body": "Tested: npm test; npm run build; compile-box and source-snapshot protocol tests\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "fix(kbc): distinguish snapshot conflicts from live runs",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fa670656b56c7c93ac036c01bb5b00a0cd5cfde",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): match Go snapshot manifest escaping",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d85dcf0246b0d67978be4cbdf7911d23e1e4506",
          "body": null,
          "is_bot": false,
          "headline": "Accept standard authoring tar roots",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcfda74549a44df35af6d7f8c07667d5311b34e0",
          "body": null,
          "is_bot": false,
          "headline": "feat(kbc): add resumable source snapshot delivery",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afcf159f20e364b919b9da2a45fad7c838196b60",
          "body": "feat(kbc): add Codex SDK compiler engine",
          "is_bot": false,
          "headline": "Merge pull request #419 from scitix/feat/kb-codex-engine",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:56:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ba4d90e509882e6e69a2bba134631afd2b12e70",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): expose pinned Codex runtime to sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:53:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01ccb4e6c59d797b482e87170a4c2173865248eb",
          "body": null,
          "is_bot": false,
          "headline": "ci(kbc): allow Codex namespace sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0452655b4337ce084c8dc04bb8dee5fb2f5419f6",
          "body": null,
          "is_bot": false,
          "headline": "build(kbc): install Codex Linux sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:47:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "407bf5168b45fe309e1df8c12ad1ca6adac169ed",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): sandbox Codex writer sessions",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "860e45309f939bd680e2bb21b2f68e58546e637c",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): enforce Codex read-only boundaries",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T03:59:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b790233ccea991db26ada814d1a340029ad2623d",
          "body": "Keep KBC workflow and tool semantics engine-neutral while adding an isolated official Codex SDK adapter for OpenAI Responses providers.\\n\\nTested: KBC compile-box regression, Codex adapter tests, capability tests, npm build\\nConfidence: high\\nScope-risk: moderate",
          "is_bot": false,
          "headline": "feat(kbc): add Codex SDK compiler engine",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-18T09:37:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63461813512b868201367341a0af6849fd2bbfbc",
          "body": "fix(gateway): pair tool results by toolCallId, not per-name FIFO",
          "is_bot": false,
          "headline": "Merge pull request #417 from scitix/investigate/tool-output-mismatch",
          "author_name": "jacoblee-io",
          "author_login": "jacoblee-io",
          "committed_at": "2026-07-17T16:36:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "895c23e4954fae56013b27c6cd693d8f77791356",
          "body": "pi-agent executes a same-turn tool batch in parallel: all\ntool_execution_start events fire in call order, but each\ntool_execution_end fires on its own completion. The SSE consumer paired\nstarts and ends through per-toolName FIFO queues, so when same-name\ncalls (e.g. several MCP navix invocations) co\n[…]\nCall record; events lacking an id\nkeep the per-toolName FIFO as fallback. The abort finalizer now walks\nthe same records, unchanged in behavior.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(gateway): pair tool results by toolCallId, not per-name FIFO",
          "author_name": "lrli",
          "author_login": "nightmeng",
          "committed_at": "2026-07-17T16:14:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c2329082fab3da6208619cb885a9363f4e9286a",
          "body": "fix(kbc): make reference assistance reliable",
          "is_bot": false,
          "headline": "Merge pull request #416 from scitix/feat/kb-reference-assist-20260717",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-17T15:43:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "334a8704456720ba374a20f324917eadd78604aa",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): allow bounded background reference assistance",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-17T15:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 20,
      "commits_last_year": 1431,
      "latest_release_at": "2026-07-27T09:29:27Z",
      "latest_release_tag": "v0.2.9",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 22,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "siclaw",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "sre",
            "kubernetes",
            "k8s",
            "ai",
            "copilot",
            "diagnostics",
            "claude",
            "agent"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/siclaw",
          "is_deprecated": false,
          "latest_version": "0.1.4",
          "repository_url": "https://github.com/scitix/siclaw",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 45,
          "first_published_at": "2026-03-07T05:08:53.215000Z",
          "latest_published_at": "2026-03-19T11:44:03.902000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 130
        }
      ]
    },
    "popularity": {
      "forks": 27,
      "stars": 223,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-03-10",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-15",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-04-14",
            "count": 2
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-04-19",
            "count": 2
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-09",
            "count": 1
          },
          {
            "date": "2026-05-10",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 1
          },
          {
            "date": "2026-07-21",
            "count": 1
          },
          {
            "date": "2026-07-27",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 27,
        "total_forks": 27
      },
      "star_history": null,
      "open_issues_and_prs": 11
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "mcp/create-chart/tsconfig.json",
        "mcp/sicore-a2a-adapter/tsconfig.json",
        "portal-web/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 370531,
      "source_files_sampled": 643,
      "oversized_source_files": 21,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "kbc/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 25866
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "portal-web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "@mariozechner/pi-coding-agent",
            "direct": true,
            "version": "0.55.4",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.3,
            "advisory_ids": [
              "GHSA-7v5m-pr3q-6453",
              "GHSA-jfgx-wxx8-mp94",
              "GHSA-r95r-rj6r-c39x"
            ],
            "fixed_version": "0.78.1",
            "advisory_count": 3,
            "oldest_advisory_days": 41
          },
          {
            "name": "@hono/node-server",
            "direct": false,
            "version": "1.19.15",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.9,
            "advisory_ids": [
              "GHSA-frvp-7c67-39w9"
            ],
            "fixed_version": "2.0.5",
            "advisory_count": 1,
            "oldest_advisory_days": 6
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 1,
          "moderate": 1
        },
        "advisory_count": 4,
        "affected_count": 2,
        "assessed_count": 424,
        "malicious_count": 0,
        "assessed_package": "npm:siclaw@0.1.4",
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@anthropic-ai/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.71.2"
        },
        {
          "name": "@arizeai/openinference-semantic-conventions",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.5.0"
        },
        {
          "name": "@clack/prompts",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "@earendil-works/pi-agent-core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.80.7"
        },
        {
          "name": "@earendil-works/pi-coding-agent",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.80.7"
        },
        {
          "name": "@earendil-works/pi-tui",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.80.7"
        },
        {
          "name": "@kubernetes/client-node",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.0"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.27.1"
        },
        {
          "name": "@opentelemetry/api",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.9.1"
        },
        {
          "name": "@opentelemetry/exporter-trace-otlp-proto",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.219.0"
        },
        {
          "name": "@opentelemetry/resources",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.0"
        },
        {
          "name": "@opentelemetry/sdk-trace-node",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.0"
        },
        {
          "name": "@sinclair/typebox",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.34.0"
        },
        {
          "name": "adm-zip",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.5.17"
        },
        {
          "name": "diff",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.0.3"
        },
        {
          "name": "glob",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.6"
        },
        {
          "name": "js-yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.1"
        },
        {
          "name": "jsonwebtoken",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.0.3"
        },
        {
          "name": "markdown-it",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.1.0"
        },
        {
          "name": "mysql2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.22.0"
        },
        {
          "name": "node-forge",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.3"
        },
        {
          "name": "prom-client",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.1.3"
        },
        {
          "name": "sqlite-vec",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.1.7-alpha.2"
        },
        {
          "name": "ssh2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.17.0"
        },
        {
          "name": "tar",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.5.15"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.18.0"
        },
        {
          "name": "cron-parser",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.0"
        },
        {
          "name": "lucide-react",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.460.0"
        },
        {
          "name": "mermaid",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.15.0"
        },
        {
          "name": "prismjs",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.30.0"
        },
        {
          "name": "react",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-dom",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-markdown",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "react-router-dom",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "react-simple-code-editor",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.1"
        },
        {
          "name": "remark-gfm",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        }
      ],
      "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": 4,
        "merged_prs": 371,
        "open_issues": 7,
        "closed_ratio": 0.588,
        "closed_issues": 10,
        "closed_unmerged_prs": 58
      },
      "bus_factor": 2,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "LikiosSedo",
          "commits": 601,
          "avatar_url": "https://avatars.githubusercontent.com/u/107271763?v=4"
        },
        {
          "type": "User",
          "login": "jacoblee-io",
          "commits": 337,
          "avatar_url": "https://avatars.githubusercontent.com/u/267827480?v=4"
        },
        {
          "type": "User",
          "login": "nightmeng",
          "commits": 229,
          "avatar_url": "https://avatars.githubusercontent.com/u/8165086?v=4"
        },
        {
          "type": "User",
          "login": "chent1996",
          "commits": 191,
          "avatar_url": "https://avatars.githubusercontent.com/u/106315742?v=4"
        },
        {
          "type": "User",
          "login": "a-yeyang",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/88581400?v=4"
        },
        {
          "type": "User",
          "login": "fred-scitix",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/191930924?v=4"
        },
        {
          "type": "User",
          "login": "silence8013",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/70105334?v=4"
        },
        {
          "type": "User",
          "login": "wangao1236",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/12544973?v=4"
        },
        {
          "type": "User",
          "login": "Likio-scitix",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/267880712?v=4"
        }
      ],
      "contributors_sampled": 9,
      "top_contributor_share": 0.435
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "kbc-ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": null,
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T05:31:30Z",
      "oldest_open_prs": [
        {
          "number": 418,
          "created_at": "2026-07-18T02:02:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 435,
          "created_at": "2026-07-22T06:21:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 440,
          "created_at": "2026-07-22T13:18:38Z",
          "last_comment_at": "2026-07-22T13:27:38Z",
          "last_comment_author": "LikiosSedo"
        },
        {
          "number": 450,
          "created_at": "2026-07-28T02:59:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-27T05:29:32Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 123,
          "created_at": "2026-03-17T04:51:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 348,
          "created_at": "2026-06-22T13:00:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 349,
          "created_at": "2026-06-22T13:00:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 427,
          "created_at": "2026-07-21T11:30:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 431,
          "created_at": "2026-07-22T04:33:15Z",
          "last_comment_at": "2026-07-22T04:40:02Z",
          "last_comment_author": "LikiosSedo"
        },
        {
          "number": 432,
          "created_at": "2026-07-22T04:33:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 437,
          "created_at": "2026-07-22T08:48:04Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/scitix/siclaw",
    "host": "github.com",
    "name": "siclaw",
    "owner": "scitix"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": "The weighted overall 68 is calibrated to 80 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 68,
            "calibrated": 80,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 80,
      "inputs": {
        "security": 46,
        "vitality": 86,
        "community": 59,
        "governance": 69,
        "calibration": "2026-08-02",
        "engineering": 72,
        "ai_readiness": 78,
        "weighted_overall_raw": 68
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "commits_last_year": 1431,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 22
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "22/52 weeks with commits",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1431 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1431
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "releases_count": 20,
              "latest_release_tag": "v0.2.9",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "20 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 59,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "forks": 27,
              "stars": 223,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "223 stars",
                "points": 38.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 223
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "27 forks",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "readme_badge_services": [],
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "at_risk",
            "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": 28,
            "inputs": {
              "packages": [
                "siclaw"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 45
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "45 downloads/month across npm",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 45,
                      "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": "good",
        "name": "Sustainability & Governance",
        "value": 69,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 9,
              "top_contributor_share": 0.435
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 44% of commits",
                "points": 12.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 44
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "9 contributors",
                "points": 12.2,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "merged_prs": 371,
              "open_issues": 7,
              "closed_issues": 10,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.588,
              "closed_unmerged_prs": 58,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "59% of issues closed",
                "points": 24.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 59
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "371/429 decided PRs merged",
                "points": 25.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 371,
                      "decided": 429
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "followers": 49,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "scitix",
              "public_repos": 39,
              "account_age_days": 731
            },
            "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": "49 followers of scitix",
                "points": 12.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 49,
                      "login": "scitix"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "39 public repos, account ~2 yr old",
                "points": 15.7,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 39
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "siclaw"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 130
            },
            "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 130 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 130
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "5 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 72,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "ai-agent",
                "aiops",
                "devops",
                "kubernetes",
                "llm",
                "sre",
                "openclaw",
                "agent",
                "ai-agents",
                "sre-agent"
              ],
              "has_wiki": false,
              "homepage": "https://siclaw.ai",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://siclaw.ai",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": "weak",
        "name": "Security",
        "value": 46,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dependency lockfiles. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dependency_lockfiles"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 40,
            "inputs": {
              "source": "file_signals",
              "lockfiles": [
                "package-lock.json"
              ],
              "manifests": [
                "package.json",
                "portal-web/package.json"
              ],
              "has_codeql_workflow": false,
              "has_security_policy": true,
              "has_dependabot_config": false
            },
            "components": [
              {
                "key": "security_policy_security_md",
                "name": "Security policy (SECURITY.md)",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "dependabot_config",
                "name": "Dependabot config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "dependency_lockfiles",
                "name": "Dependency lockfiles",
                "detail": "published library — lockfiles are an application concern, not expected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "lockfiles_not_expected",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "codeql_workflow",
                "name": "CodeQL workflow",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:siclaw@0.1.4 runtime dependency closure — what installing the published package pulls in — 424 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:siclaw@0.1.4",
                  "assessed": 424
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "source": "osv",
              "advisories": 4,
              "affected_packages": 2,
              "assessed_packages": 424,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1, moderate 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: @mariozechner/pi-coding-agent 0.55.4 (high 7.3)",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@mariozechner/pi-coding-agent 0.55.4 (high 7.3)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "1 affected: @hono/node-server 1.19.15 (moderate 5.9)",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@hono/node-server 1.19.15 (moderate 5.9)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "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": 424,
              "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": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "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": 78,
        "weight": 0.04,
        "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.92,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "kbc/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 25866
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, kbc/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, kbc/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": "92 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 92,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "mcp/create-chart/tsconfig.json",
                "mcp/sicore-a2a-adapter/tsconfig.json",
                "portal-web/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.02,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 370531,
              "source_files_sampled": 643,
              "oversized_source_files": 21
            },
            "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": "21/643 source files over 60KB",
                "points": 53.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 643,
                      "oversized": 21
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "mcp-server",
        "library",
        "web-ui"
      ],
      "scores": {
        "web-ui": 4,
        "library": 6,
        "mcp-server": 7
      },
      "primary": "mcp-server",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "mcp-server",
          "source": "dep:@modelcontextprotocol/sdk",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "web-ui",
          "source": "dep:react-dom",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "mcp-server",
          "source": "mcp_signal",
          "weight": 3
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "OpenSSF Scorecard did not return a usable result (2026/07/28 05:46:07 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T05:46:31.003218Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/scitix/siclaw.svg",
  "full_name": "scitix/siclaw",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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