Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 00:21 UTC

getsigit / sigit

A local-Llm-first coding agent. Runs Qwen 2.5 and Qwen 3

RustLicencia propia★ 20 estrellas⑂ 1 forkdesde mar 2026Ver en GitHub ↗

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

59
global / 100
Moderado

Índice de salud del software

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

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

Perfil de puntuación

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

Titularidad

siGit Code & DeployOrganización
1 seguidor4 repositorios públicosdesde abr 2026

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
crates.iosigit1.5.08114hace 0 díasaiclillmcoding-agentsigitcommand-line-utilities
PyPIsigit-code1.5.0-16hace 0 díassigitcliaicoding-agentllmon-device

Métricas por categoría

Vitalidad

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

79Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
6.9/36Cadencia de commits — 10/52 semanas con commits
18/18Volumen de commits — 297 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year297
human_commit_share1
days_since_last_push0
active_weeks_last_year10
Cómo se puntúa
27/27Publica versiones — 17 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~4,8 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count17
latest_release_tagv1.5.0
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases4,8

Comunidad y Adopción

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

32En riesgo · 18% del índice global
Cómo se puntúa
20.7/60Estrellas — 20 estrellas
0/25Forks — 1 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks1
stars20
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
16.9/22.5Licencia — archivo de licencia presente, no es una licencia reconocida
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
25.5/80Descargas mensuales — 81 descargas/mes en crates, pypi
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagessigit, sigit-code
dependents
ecosystemscrates, pypi
total_downloads266
monthly_downloads81
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

56Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
10.6/22.5Distribución de commits — el principal contribuyente firma el 53% de los commits
5.4/13.5Amplitud de contribuyentes — 4 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled4
top_contributor_share0,529
Cómo se puntúa
32.7/46.8Resolución de issues — 70% de issues cerradas
35.8/38.3Aceptación de PR — 29/31 PR decididos fusionados
1.5/15OpenSSF Scorecard: Code-Review — Found 2/20 approved changesets -- score normalized to 1
Datos de entrada utilizados
merged_prs29
open_issues3
closed_issues7
issue_closed_ratio0,7
closed_unmerged_prs2
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
2.2/25Alcance del propietario — 1 seguidores de getsigit
5.6/25Trayectoria — 4 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers1
owner_typeOrganization
is_verified
owner_logingetsigit
public_repos4
account_age_days102
Cómo se puntúa
25/25Publicado y resoluble — 2 paquete(s) en crates, pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 16 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagessigit, sigit-code
ecosystemscrates, pypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

81Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 7 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 3 out of 3 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://zed.dev/acp/agent/sigit
10/10Descripción del repositorio
10/10Topics — 9 topics
10/10Wiki
Datos de entrada utilizados
topicsagent-client-protocol, code-editor, coding-agent, cargo, crates-io, inference-engine, rust-lang, qwen2-5, qwen3
has_wiki
homepagehttps://zed.dev/acp/agent/sigit
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?

36En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 3 out of 3 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0.8/7.5Code-Review — Found 2/20 approved changesets -- score normalized to 1
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 13 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,6

Preparación para IA

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

73Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — .agents/AGENTS.md, AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 75 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,75
agent_instruction_files.agents/AGENTS.md, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes17.808
Cómo se puntúa
12.6/18Arranque con un solo comando — Cargo.toml (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — npm/sigit/tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 19 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Datos de entrada utilizados
has_nixno
has_tests
lockfilesCargo.lock
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configsnpm/sigit/tsconfig.json
agent_commit_share0,19
toolchain_manifestsCargo.toml
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
49.1/55Tamaños de archivo manejables — 3/28 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes181.610
source_files_sampled28
oversized_source_files3
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

20estrellas de GitHub
4contribuidores
297commits en los últimos 12 meses
0días desde el último push
17versiones publicadas
1factor bus
3issues abiertas
crates.io, PyPIecosistemas 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
  • deps.dev does not index crates:sigit@1.5.0; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 3.6 / 10
3.6agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-23 00:21 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests3 out of 3 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
1Code-ReviewFound 2/20 approved changesets -- score normalized to 1
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities13 existing vulnerabilities detected
Dependencias directas 19
RegistroPaqueteRestricción de versiónManifiesto
crates.ioagent-client-protocol1.0Cargo.toml
crates.ioonde1.1.2Cargo.toml
crates.iotokio1Cargo.toml
crates.iotokio-util0.7Cargo.toml
crates.iofutures0.3Cargo.toml
crates.ioratatui0.29Cargo.toml
crates.iocrossterm0.29Cargo.toml
crates.ioanyhow1Cargo.toml
crates.iolibc0.2Cargo.toml
crates.iolog0.4Cargo.toml
crates.iotracing-subscriber0.3Cargo.toml
crates.ioserde1Cargo.toml
crates.ioserde_json1Cargo.toml
crates.iotoml0.8Cargo.toml
crates.ioasync-trait0.1Cargo.toml
crates.ioregex1Cargo.toml
crates.ioreqwest0.12Cargo.toml
crates.iouuid1Cargo.toml
crates.iorpassword7Cargo.toml
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "agent-client-protocol",
        "code-editor",
        "coding-agent",
        "cargo",
        "crates-io",
        "inference-engine",
        "rust-lang",
        "qwen2-5",
        "qwen3"
      ],
      "is_fork": false,
      "size_kb": 1085,
      "has_wiki": true,
      "homepage": "https://zed.dev/acp/agent/sigit",
      "languages": {
        "Rust": 834040,
        "Shell": 1463,
        "JavaScript": 7728,
        "Go Template": 1569
      },
      "pushed_at": "2026-07-22T21:49:55Z",
      "created_at": "2026-03-19T11:51:12Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T21:33:11Z",
      "description": "A local-Llm-first coding agent. Runs Qwen 2.5 and Qwen 3",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://sigit.si",
      "name": "siGit Code & Deploy",
      "type": "Organization",
      "login": "getsigit",
      "company": null,
      "location": "Indonesia",
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/275235537?v=4",
      "created_at": "2026-04-11T05:52:53Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 102
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-07-22T22:11:59Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-07-10T06:20:20Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-07-07T15:23:14Z"
        },
        {
          "tag": "v1.3.2",
          "kind": "patch",
          "published_at": "2026-07-04T23:42:11Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-07-02T06:49:37Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-06-30T08:34:21Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-06-28T13:12:03Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-06-25T06:39:53Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-06-23T19:35:29Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-06-10T00:52:12Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-05-29T16:13:32Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-04-30T11:10:01Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-04-29T22:00:21Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-04-28T06:15:09Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-04-26T12:55:51Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-04-25T10:05:03Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-04-24T11:58:13Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "431bc0d8aa3ffa39d48002480cbe33a6a79eb4df",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'development'",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:27:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7fed6d96adbea4c94863013a1e30baaafe0345b",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'release/v1.5.0' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:25:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4b8b0f338cc88be848840e57acdf788625e8ad0",
          "body": null,
          "is_bot": false,
          "headline": "v1.5.0",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:19:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c6a4eac20aa43206bf5f663b4050e2895ae54f2",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/mcp-registry-listing' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T20:59:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "674b836af43db766b20c04deeec634dcace31825",
          "body": null,
          "is_bot": false,
          "headline": "Add MCP registry",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T20:59:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d43d986f62613c6fedab8094381ca312762747eb",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #41 from getsigit/feature/smbcloud-mcp-builtin",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-20T18:02:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e928a35a8e009696986ae82ba1d109d1a7e13fc0",
          "body": "The official server's query tools already run without prompting; give the\nbaked-in smbCloud CLI server the same treatment for its read-only tools\n(me, deployments, project_list, project_show).\n\nUnlike the official server's list_/get_ name-shape check, this is an\nexplicit allow-list, since smb's tool\n[…]\nention. A\nname the list doesn't know (say, from a newer smb release) fails safe to\nmutating, and the exemption only applies when smbcloud is the whole\nserver name, so a foreign server can't borrow it.",
          "is_bot": false,
          "headline": "feat: exempt smbCloud read tools from permission prompts",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-19T12:00:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7742455ea7656a17b6543c02983cf6edb9b34d9a",
          "body": "sigit already bakes in its official HTTP MCP server. This adds a second\nbuilt-in entry: the smbCloud CLI's stdio server (smb --mcp), so smbCloud\nproject and deployment tools are available without any mcp.toml setup.\n\nThe entry is only added when the smb binary is actually on PATH, so users\nwithout s\n[…]\n/mcp. A user-defined server named smbcloud overrides the baked-in one, and\nit can be switched off with smbcloud = false in mcp.toml or\nSIGIT_MCP_SMBCLOUD=off, mirroring the official server's opt-outs.",
          "is_bot": false,
          "headline": "feat: bake in the smbCloud CLI's stdio MCP server",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-19T11:55:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "656a4bf5ef9d2df93d9d30c0045b0fb9eb1de982",
          "body": "Fix post-v1.4.1 review findings",
          "is_bot": false,
          "headline": "Merge pull request #39 from getsigit/fix/post-v1.4.1-review-findings",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-12T14:33:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f98cc9ff34d7b49190d382b5169fef3471178528",
          "body": "Serialize cwd-mutating tests on ENV_TEST_LOCK",
          "is_bot": false,
          "headline": "Merge pull request #38 from getsigit/fix/discovery-test-cwd-race",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-12T14:32:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14228086412565adf6a141bd13513580911e6339",
          "body": "The Linux CI runner exposed a hole in the hook timeout: sh -c on dash forks\nthe command instead of exec'ing it, so killing the shell at the deadline\nleft the grandchild alive. It kept the stdout/stderr pipes open, and the\ndrain threads' read_to_end blocked the caller until the grandchild exited\non i\n[…]\nd straggler that escaped the group and still holds a pipe\ncan only delay the caller briefly instead of hanging it. The test now uses\na two-command hook to force the fork on every shell, not just dash.",
          "is_bot": false,
          "headline": "fix: kill the hook's whole process group on timeout",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T14:03:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2b547a984017eba79a51b20d30b872123ce068fe",
          "body": "decision_for returned Allow for any read-only tool at its first line, before\nconsulting the settings.toml deny rules or per-tool overrides. Once the\nweb-search and repo-tabs work reclassified mcp__sigit__{list_*,get_*,\nsearch_code,web_search} as read-only, a user's explicit deny of one of those\ntool\n[…]\nt override rather than the effective mode, so the default ask or\ndeny mode never starts prompting on ordinary read_file calls. Read-only\ntools that aren't explicitly denied still run without a prompt.",
          "is_bot": false,
          "headline": "fix: keep explicit denies working for read-only first-party tools",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cecfb9379225cda7d1f1b379ef50674f6bd946ab",
          "body": "Two bugs in the Repo tab detail view. First, RepoUpdate::Detail carried no\nidentity for which issue or PR it was fetched for, so a slow reply filled\nwhatever detail happened to be open: open issue #12, press Esc, open PR #7,\nand #12's body could render under the #7 title. Detail fetches now carry a\n\n[…]\ntised \"r refresh\" but pressing r in the detail view\ncalled refresh_repo, which reloads the lists and clears repo_detail, so the\nview the user was reading vanished. r now re-fetches the item on screen.",
          "is_bot": false,
          "headline": "fix: correct the Repo tab detail view's stale-fetch and refresh handling",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16655e188dc0c48d107b15ebb13cd8b61b9626af",
          "body": "A .sigit/agents/*.md type with a tools: field naming only tools outside the\nsubagent read-only set (for instance grep or bash carried over from a Claude\nCode config) resolved to an empty allow-list. The task ran anyway: the\nsubagent was offered zero tools, so it answered from the model's priors with\n[…]\ne caller instead of running a toolless subagent. A\ntype that lists a mix of valid and invalid tools still narrows to the valid\nsubset, and one with no tools: field still inherits the full default set.",
          "is_bot": false,
          "headline": "fix: reject a subagent type whose tools list resolves to nothing",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "358ac78dffae036bffa3993ef26a366f5fc7997a",
          "body": "render substituted $ARGUMENTS first and then re-scanned the whole result\nfor positional $1..$9. When a user's arguments themselves contained a\nliteral $1 (say, asking what $1 means in a shell script), that text got\nre-expanded with the first argument word, quietly corrupting the prompt.\n\nThe substitution is now one left-to-right walk over the template, so\ninserted argument text is never re-examined for further placeholders. An\nunsupplied positional like $2 is still left untouched, as before.",
          "is_bot": false,
          "headline": "fix: render command templates in a single substitution pass",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebfb3ad7bdeacfe526d07679e5120bb131f94f30",
          "body": "run_hook called std::process::Command::output() with no timeout, straight\nfrom the async execute_tool path and from the ACP session start handlers.\nA hook that never returns (waits on input, a stalled network mount, a\ndeadlocked build) blocked every tool call or session creation forever, with\nno err\n[…]\nkilled if it exceeds it. stdout and stderr are\ndrained on their own threads so a hook that writes a lot, like a build,\nkeeps making progress instead of blocking on a full pipe and looking like a\nhang.",
          "is_bot": false,
          "headline": "fix: bound hook execution with a timeout",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "07fd7e5a63dc003db17a946b3fe281d1b1896b57",
          "body": "extract_frontmatter tolerates CRLF line endings, a leading UTF-8 BOM, and\nblank lines before the opening ---, but strip_frontmatter required the\nopener to be exactly \"---\\n\" at byte 0. So a command or agent-type file\nsaved with CRLF (common on Windows, or any core.autocrlf checkout) parsed\nits name \n[…]\n as if it were content.\n\nstrip_frontmatter now scans line by line and compares trimmed lines, the\nsame way extract_frontmatter does, so whenever one finds a block the other\nremoves exactly that block.",
          "is_bot": false,
          "headline": "fix: strip frontmatter with the same leniency it is parsed with",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8ef46addc5f24813bb771871ee93e1d9eba04a9",
          "body": "The discovery tests in skills.rs, commands.rs and subagents.rs, plus the\nsubagent end-to-end test in tools.rs, all change the process-wide current\ndirectory. cargo runs tests in parallel, so one test could move the cwd\nwhile another was mid-discovery. That is what broke CI on macOS x86_64:\nsubagents\n[…]\nts now take the same lock. The async\ntest in tools.rs holds the guard across an await on purpose; each\ntokio::test runs its own single-threaded runtime, so nothing on that\nexecutor can contend for it.",
          "is_bot": false,
          "headline": "fix: serialize cwd-mutating tests on ENV_TEST_LOCK",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T07:58:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83de66ec0baa42a5f2a9a5d40eee597eed4d2d7c",
          "body": "# Conflicts:\n#\t.agents/AGENTS.md\n#\tsrc/permissions.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/web-search' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:26:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5016d049198816ca74e936560c79f105e13b9e1",
          "body": "# Conflicts:\n#\t.agents/AGENTS.md\n#\tsrc/chat.rs\n#\tsrc/main.rs\n#\tsrc/skills.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/configurable-sub-agents' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5937d1656fe2701ddb3ab4ba449b2d04ec8ba9b",
          "body": "# Conflicts:\n#\tsrc/chat.rs\n#\tsrc/main.rs\n#\tsrc/mcp.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/tui-repo-tabs' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:14:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f594ce1c8675d8de992274bac92fedf009952ec6",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/user-defined-slash-commands' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:09:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e97c2ffb28e5b9a4db9c276d3860f187f80f39b",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/hooks' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:09:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d2bb52e015d18cb2fe6602d75ce9c67ee6beba3",
          "body": "sigit-si already runs a Brave-Search-backed web_search tool on its official\nMCP server (WebSearchService + Mcp::Tools::WebSearch, api/v1/mcp), and\nmcp.rs's existing generic MCP client already discovers and can forward to\nit as mcp__sigit__web_search whenever the user is signed in. That path\nalone is\n[…]\nntributes no tools) for an unauthenticated request — which is\nwhat web_search_available() relies on instead of adding a separate\nsign-in check.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add web_search tool backed by siGit Code Cloud's Brave Search API",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T21:59:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "347a11bd49ec9278746c9616a22328bcb9be12cd",
          "body": "A subagent type is a Markdown file with YAML frontmatter (name,\ndescription, and an optional comma-separated tools: allow-list) whose body\nbecomes the task tool's system prompt for that run. Discovered from\n.sigit/agents/ and .claude/agents/ in the project, then\n$SIGIT_CONFIG_DIR/agents/ and ~/.clau\n[…]\nregistered factory\ncan serve the default prompt or any resolved type's prompt.\n\nAlso adds /agents to list what's discovered, mirroring /skills.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add configurable subagent types (.sigit/agents/*.md)",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T21:13:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a7deedaac316f6a29d93913d1f15230e44dcfd5b",
          "body": null,
          "is_bot": false,
          "headline": "WIp",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T18:54:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51039d77ab55f412921238b258bcc8b632462e72",
          "body": "Custom slash commands are Markdown files with optional YAML frontmatter\n(description, argument-hint) and a prompt-template body. Discovered from\n.sigit/commands/ and .claude/commands/ in the project, then\n$SIGIT_CONFIG_DIR/commands/ and ~/.claude/commands/ (personal). A\nsubdirectory namespaces the c\n[…]\nout of skills.rs into a new\nfrontmatter.rs shared by both formats, since commands.rs needs the same\n\"YAML frontmatter + Markdown body\" parsing.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add user-defined slash commands (.sigit/commands/*.md)",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T17:25:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c2f52f7023636a1c632b3423de707a183da05b8",
          "body": "Self-review of the initial hooks commit turned up four real bugs:\n\n- Hook commands always shelled out via `sh -c`, which doesn't exist by\n  default on Windows. `spawn_shell` in tools.rs already handles this with a\n  sh/cmd platform split; run_hook now follows the same pattern.\n- `{cwd}` and `{tool_n\n[…]\nthat runs a real `sh -c` with a crafted tool_name\nto confirm injected shell syntax never executes, plus unit tests for both\nquoting functions.\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: harden hooks against shell injection and Windows breakage",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T17:04:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "730381aada62dd7cb7a43b903e666e204cded4c6",
          "body": "Implement SessionStart, PreToolUse, and PostToolUse hooks that allow users to\nrun custom shell commands at key moments in the agent lifecycle. Hooks support\nvariable substitution for context information and run in the session working\ndirectory.\n\nConfiguration example in ~/.config/sigit/settings.toml\n[…]\nution in\n  src/tools.rs\n- Added documentation and example configuration files\n\nAll existing tests pass (178 unit tests + 5 integration tests).\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add extensibility hooks for agent lifecycle and tool execution",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T16:56:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd4e49e71dc9c48877a9d56fc51d609c77d9f018",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.4.1 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-10T06:12:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89dc4834911b9a8a70fb0d810c65979e5c60c9e4",
          "body": "Release v1.4.1",
          "is_bot": false,
          "headline": "Merge pull request #37 from getsigit/claude/v1-4-1-release-8c1ws0",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T06:11:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32c486a40883f4d771449f82159daa69fa31fdf0",
          "body": null,
          "is_bot": false,
          "headline": "Release v1.4.1",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-10T05:48:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b12ae1db89b4cd8fe4287c933483628e2ed4af1",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #36 from getsigit/fix/co-author-noreply-email",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T04:56:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4ca936b5f218bc40e3cdf905d5206c76d614dc3",
          "body": "fix(docs): trust the Homebrew tap with brew trust",
          "is_bot": false,
          "headline": "Merge pull request #35 from getsigit/feature/homebrew-tap-trust",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T20:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "153400ab38033c50ea2598e7699c737b30dd5b68",
          "body": "Switch the Co-Authored-By trailer email from sigit@sigit.si to the\nGitHub noreply address 297239231+sigitc@users.noreply.github.com for\nthe sigitc account, so GitHub reliably attributes co-authored commits\nto the siGit Code profile.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "fix: use noreply address for siGit Code co-author trailer",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T20:01:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c9eea02d13891b07a2b1373485ecf2649a0b2f8",
          "body": "The untrusted-tap error (Homebrew 6.x UntrustedTapError) is cleared by\ntrusting the tap, which writes it into Homebrew's trust.json. `brew tap\n--force` only forces core taps under API mode and does not affect trust,\nso the install command still failed with the same error.\n\nUse `brew trust --tap gets\n[…]\nthe tap and install steps, and\napply it to npm/README.md.tmpl too so the generated npm README does not\nrevert on the next release.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): trust the tap with brew trust, not brew tap --force",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T19:49:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ec8f2c6eac360539b468878136b74be0367bc0f",
          "body": "--force-auto-update doesn't exist; --force is the correct flag to\ntrust and install a third-party tap.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "Fix brew tap flag: use --force instead of --force-auto-update",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T14:53:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fd392798a6f225dbba2e4336452f314e4218c48",
          "body": "Adds the --force-auto-update flag to the brew tap command so Homebrew\nmarks the tap as trusted, fixing the 'Refusing to load formula from\nuntrusted tap' error users hit on fresh installs.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "Use --force-auto-update in brew tap to trust the tap",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T14:49:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acec30c0d3d2e885485522e12e7d780d58a045d3",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.4.0 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T11:05:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29c30ae74b800931f887019c2441b0b3b1085307",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.4.0 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T11:05:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ea06acee91f89fdd0854bde2a1aae5ac6e8df83",
          "body": "Headless -p mode, permission rule patterns, MCP stdio transport, the\n/init command, and TUI tabs, thinking display, and collapsible tool\ncalls. Details in CHANGELOG.md.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017vyPTyfUMzM2hd8DzzLf2E",
          "is_bot": false,
          "headline": "Release v1.4.0",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T07:16:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f3058f61f1b638e605adb75dfa6cbf2a4b389fd0",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #31 from getsigit/feature/init-command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-07T02:39:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8334d86a66a592f01f90bb7590fbeb365ca3975b",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #26 from getsigit/feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T21:18:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2aa2db58217c5a69cf2b92ad22b2e232e7219b37",
          "body": "Development moved the instruction files to .agents/AGENTS.md with\nsymlinks at the root, so this branch's CLAUDE.md edit (the /init\nparagraph) is ported into .agents/AGENTS.md and the symlink layout is\nkept. The headless.rs conflict was only a comment both sides' identical\nsignature fix; the comment stays.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge origin/development into feature/init-command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:57:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8cc111a3add7508fdff9fb64220895fcde3a7783",
          "body": "Both sides made the same grant_for_session signature fix; the conflict\nwas only the explanatory comment added on this branch, which is kept.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge origin/development into feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:52:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec9c84a634e2fed54662eb45a5ebcc3a6190dbd0",
          "body": "Make .agents/ the single home for agent assets",
          "is_bot": false,
          "headline": "Merge pull request #33 from getsigit/feature/agents-dir-unification",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:48:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53ffdafdf9cc86b4f0ecf7ed38c3b86d3671617b",
          "body": "Move the run-sigit skill into .agents/skills so all six project skills\nlive in one place, and point .claude/skills there with a symlink. Make\n.agents/AGENTS.md the canonical project instructions file: the root\nAGENTS.md and CLAUDE.md are now symlinks to it, so agents.md tools,\nClaude Code, and sigit's own instructions loader all read the same\nfile. The instructions loader prefers AGENTS.md over CLAUDE.md in the\nsame directory, so the content is injected once.",
          "is_bot": false,
          "headline": "Unify agent assets under .agents/",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T19:57:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84ec0580d47c6836fc43b229dee2d20454854e01",
          "body": "Fix headless build after permission rules signature change",
          "is_bot": false,
          "headline": "Merge pull request #32 from getsigit/fix/headless-permission-call-args",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43cd3513b05bbd3716449e46a4e1e162d3cef3ba",
          "body": "PR #27 (headless mode) and PR #28 (permission rule patterns) were\ndeveloped in parallel. #28 added an arguments parameter to decision_for\nand grant_for_session, and merging it after #27 left the two call sites\nin headless.rs on the old signatures, so cargo clippy --tests no longer\ncompiles on development.\n\nPass the tool call's raw arguments to decision_for, and an empty string\nfor --allow-tool grants, which records the bare tool name and keeps the\nwhole-tool grant the flag intends.",
          "is_bot": false,
          "headline": "Fix headless build after permission rules signature change",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:52:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d12b0b806da613bb3fcf29786b1d25833b9a68bf",
          "body": "/init is not a status command: both surfaces substitute a canned\nprompt (instructions::INIT_PROMPT, next to the loader that consumes\nthe file it produces) and run a normal agent turn, so exploration and\nthe file write go through the ordinary tools and permission checks.\nThe TUI transcript shows the \n[…]\nifests, CI config, and the top of the tree before\nwriting, and to improve an existing AGENTS.md or CLAUDE.md in place\nrather than replacing it.\n\nSpec: sigit-si docs/product/sigit-code-init-command.md.",
          "is_bot": false,
          "headline": "Add /init to generate AGENTS.md from the repo",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:51:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e6d3cc5485e8cc83c41ceea8595947b230f10659",
          "body": "PR #27 (headless mode) and PR #28 (permission rule patterns) merged\ninto development independently: #28 added an arguments parameter to\ndecision_for and grant_for_session, and #27's call sites predate it,\nso development does not compile. Pass the tool call's arguments to\ndecision_for; grants from --allow-tool pass the empty string, which\nrecords the bare tool name and keeps the grant-the-whole-tool\nbehavior. Same fix as the one inside the PR #26 merge commit.",
          "is_bot": false,
          "headline": "Fix headless permissions calls after the rule-pattern API change",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:44:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "786be894d7ee18074ae99d9b205c9c9cd887d54d",
          "body": "Resolves the src/chat.rs conflicts (the /thinking toggle and the\n/tools collapse feature landed in the same spots) and updates the two\npermissions call sites in headless.rs to the three-argument API from\nPR #28, which PR #27 was written before. development itself does not\ncompile without that fix since the two merged independently.",
          "is_bot": false,
          "headline": "Merge origin/development into feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:27:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85dff795350ecfa15f3feba502a12561423943f8",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #28 from getsigit/feature/permission-rules",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:53:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b248e0de3ef1091d2afc57c70a95a02b67bd597c",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #27 from getsigit/feature/headless-mode",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:50:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43d1943f1a7a7055c92f53818785a44665973dc7",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #29 from getsigit/feature/mcp-stdio-transport",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:42:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3434b25f432109d1e0dc4b69908cb940d271f9a",
          "body": "Collapse tool calls in the TUI to title lines with /tools",
          "is_bot": false,
          "headline": "Merge pull request #30 from getsigit/feature/tui-collapsible-tool-calls",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T16:28:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce46b78af082f602f4d4cafe058f50a9a93a3a68",
          "body": "…llapsible-tool-calls\n\n# Conflicts:\n#\tsrc/chat.rs",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/development' into feature/tui-co…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T06:15:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6cdf83f5b2a15f33fc14d65c81b988af83204d8",
          "body": "Add tabbed TUI: session, history, and cloud tabs",
          "is_bot": false,
          "headline": "Merge pull request #25 from getsigit/feature/tui-tabs",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "769241839a8eb50a792e6bc713789acf9381014f",
          "body": "Every tool call used to land in the transcript as a plain system line,\nand argument previews stayed there forever, burying the conversation\nunder command dumps. Each call is now a single collapsed dim line with\na derived title: the command for run_command, the path for file tools,\nthe pattern for se\n[…]\nidden.\n\nDisplay only. The model still receives full outputs, ACP and the\nsession store are untouched, and the result preview rides a separate\ndisplay update so nothing changes in the tool loop itself.",
          "is_bot": false,
          "headline": "Collapse tool calls in the TUI to title lines with /tools",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:45:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0fcb6cbf28f0e0ae1faa50b4633e5c9e35d773c4",
          "body": "When the session's origin remote points at the sigit.si host, the TUI\ngrows a Repo tab between History and Cloud with Issues and Pull\nrequests sections, fetched through the official MCP server's repo\nworkflow tools. Up and Down select, Enter opens a scrollable detail,\ni, p, or Left and Right switch \n[…]\n prompt names the issue and PR tools verbatim\nthrough the new official_tool_name helper, and a test fails if the\ntwo drift. Stacked on the tabbed-TUI branch; rebases onto development\nonce that merges.",
          "is_bot": false,
          "headline": "Add Repo tab: issues and pull requests for sigit.si repos",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:25:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9a445c3d39c723ff2b57ca3768f7672b3b241b5",
          "body": "Nearly every published MCP server is stdio-first, and sigit spoke\nonly Streamable HTTP, so most of the ecosystem could not plug in.\n\nmcp.toml server entries now take command, args, and an env map,\nmutually exclusive with url; both or neither is a config error that\nis logged and skipped. The transpor\n[…]\nhed crate (verified with cargo package\n--list), since cargo install would otherwise ship every bin in the\ncrate. Config changes still need a restart; /reload does not re-run\ndiscovery, now documented.",
          "is_bot": false,
          "headline": "Add stdio transport to the MCP client",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:18:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "96152868c99b9e36933267d365c5f6cc1233b545",
          "body": "The permission system knew three modes and per-tool overrides, which\nmade autonomy all-or-nothing: allowing run_command waved through\nrm -rf along with cargo test. Rules close that gap.\n\n[permissions.rules] in settings.toml holds ordered allow and deny\nlists of tool_name(pattern) entries, e.g. run_c\n[…]\nal prompts gain the same granularity: always-allow on\nrun_command now grants the command family (its first two tokens),\nnot the whole shell. /permissions prints the rule lists and the\ngranular grants.",
          "is_bot": false,
          "headline": "Add permission rule patterns: per-argument allow and deny lists",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:51:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98ed89ac08e6b9dc8420b717d2be52f4faa851da",
          "body": "CI, scripts, and the Cloud Agent sandbox runner all want the same\nthing: hand sigit a prompt, let it run one agent turn with tools, and\nexit with a meaningful code. Until now that required an ACP client or\na TTY.\n\nsigit -p \"prompt\" dispatches before the TTY/ACP split, streams the\nassistant text to s\n[…]\nven over a settings allow, and\nSIGIT_PERMISSIONS=allow stays the blunt instrument. The conversation\nis saved to the session store either way, since a partial transcript\nbeats none for a future resume.",
          "is_bot": false,
          "headline": "Add headless -p mode: run one prompt and exit",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:50:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ed52292e1e1c29c20c597764c6e9d82dfeac9ae",
          "body": "Reasoning models emit their thought process in think tags, and the TUI\neither hid it behind the spinner while streaming or dumped it as a\nbox on every finished message. Both extremes are wrong: watching the\nmodel reason is useful, reading every past thought is noise.\n\nWhile a streamed turn is still \n[…]\nsplay only: nothing changes in what is sent\nto the model, saved to sessions, or streamed over ACP, where editors\nrender reasoning themselves. /thinking stays TUI-only, matching how\n/resume is handled.",
          "is_bot": false,
          "headline": "Show model thinking in the TUI with a /thinking toggle",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:39:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71e2f71e203f498b3d7653a2377f3f9522d7d5c2",
          "body": "The interactive TUI gets a tab bar in the Copilot CLI style, cycled\nwith the Tab key (only when the input is empty) and left with Esc.\n\nThe Session tab is the chat, unchanged. The History tab lists the\nsaved sessions from the session store with age and message count:\nEnter restores one into the live\n[…]\nk to Session so the y/a/n prompt\nis never invisible. Pure helpers (tab cycling, age and row formatting,\nsession listing) live outside the unix-only module so all four CI\ntargets compile and test them.",
          "is_bot": false,
          "headline": "Add tabbed TUI: session, history, and cloud tabs",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:32:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6b8b6946d17cf0a5795f13a7054e61b2dc1ac7f1",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.2 release",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a64853fb175ea0af47a547275fb84c6f9c5c770",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.2 into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc025da20d7d53d81859c2eaa8b24b0b5da57614",
          "body": "Tool permission system with plan mode, durable sessions with context\ncompaction, background command execution, the task subagent tool, and\ncommit co-author attribution. Details in CHANGELOG.md.",
          "is_bot": false,
          "headline": "Release v1.3.2",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49937a358223e232cc8a18c81ec3744699c3d4fd",
          "body": "Add background command execution to run_command",
          "is_bot": false,
          "headline": "Merge pull request #22 from getsigit/feature/background-commands",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T22:43:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b1465ab754308ea9ca33cea327065616605658b",
          "body": "Brings in the merged #21, #23, and #24. Resolutions worth noting:\n\nThe co-author attribution gate and the background path now share\nexec_run_command: a foreground command keeps the HEAD check and the\namend, while a background task skips the gate, since its commits\nfinish after the tool has already r\n[…]\n#21 did: the capping test\ndrove PowerShell through cmd /C with a quoted one-liner, which cmd\nmangles. It now uses a quote-free cmd-native for /L loop, with\nper-platform line markers in the assertions.",
          "is_bot": false,
          "headline": "Merge development: co-author gate, task tool, sessions",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:52:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "43e718fe148ae8c3f0b5aa76ba58ae5cc986245d",
          "body": "Add task tool: delegate research to a read-only subagent",
          "is_bot": false,
          "headline": "Merge pull request #23 from getsigit/feature/subagent-tool",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:47:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aee1f9c163b424ad36e6387d577b991b99be0ec",
          "body": "…action\n\nAdd durable sessions and context compaction",
          "is_bot": false,
          "headline": "Merge pull request #24 from getsigit/feature/session-persistence-comp…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:46:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c104d7c0b4bc6f87196c580e92fe456ecf8134c8",
          "body": "Enforce siGit Code co-author attribution on new commits",
          "is_bot": false,
          "headline": "Merge pull request #21 from getsigit/feature/commit-coauthor-attribution",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:31:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "395f555f68a1fc623278d1a0f3e9b1bdde88d258",
          "body": "The two new tests drove git through run_command with quoted messages\nand, in one case, the trailer itself on the command line. sh -c strips\nthe quotes; cmd /C does not, and it treats the angle brackets in the\ntrailer's email as redirection, so both tests failed on the Windows\nrunner. The commit comm\n[…]\nnds now use single-word messages, and the\ntrailer-carrying commit is created with direct git args, with\nrun_command exercising the gate through an amend that changes HEAD\nwithout touching the message.",
          "is_bot": false,
          "headline": "Fix Windows CI: keep co-author test commands quote-free",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:58:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "51d281add943a0c545c8a74af87c0cf0fbd9db17",
          "body": "Conversation history lived in RAM, so a restart lost everything and\nthe hard cap of 10 tool rounds was the only defense against blowing\nthe context window. Both problems hurt most on-device, where context\nis smallest.\n\nThe InferenceBackend trait gains history_snapshot, restore_history,\nand compact_h\n[…]\nack\nuntouched, and the rebuilt tail drops tool results whose assistant\nmessage was summarized away, since strict endpoints reject orphans.\nWith compaction in place MAX_TOOL_ROUNDS rises from 10 to 24.",
          "is_bot": false,
          "headline": "Add durable sessions and context compaction",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:32:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "96c0879965f27d99c05e88f4504402438e9698a8",
          "body": "Every file the model reads stays in the main conversation forever,\nwhich fills small context windows fast. The new task tool hands a\nresearch prompt to a fresh conversation that only gets the read-only\ntools (read_file, list_directory, search_files, glob, read_website)\nand returns its final answer, \n[…]\nissions: the nested loop\nhard-gates execution to the read-only set, so a hallucinated call to\nanything else returns an error instead of running. That also keeps\ndelegated research usable in plan mode.",
          "is_bot": false,
          "headline": "Add task tool: delegate research to a read-only subagent",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:27:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c23b5d4fd95d39ac073556b53af46b8ec348a70",
          "body": "Every command used to be killed at the 120 second timeout, so builds,\ntest suites, and dev servers could not run at all. run_command now\ntakes run_in_background: the child goes into a process-global task\ntable and the tool returns its task id right away, while reader\nthreads collect stdout and stder\n[…]\nits output. Foreground commands\nbehave exactly as before, background children die with the sigit\nprocess, and polling is classified read-only so checking on a build\nnever triggers a permission prompt.",
          "is_bot": false,
          "headline": "Add background command execution to run_command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:22:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9cd8eb1b468e3e44d2399e66e8114ceaf2763c6f",
          "body": "Add tool permission system: approval prompts, policy, plan mode",
          "is_bot": false,
          "headline": "Merge pull request #20 from getsigit/feature/tool-permission-system",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T19:48:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72c91b1d13f2a8f4fbd535d80ed459576a37d77d",
          "body": "The system prompt already asked models to end commit messages with the\nCo-Authored-By trailer, but that only works when the model listens.\nSmall local models often don't, and the trailer baked in the crate\nversion, so the co-author identity changed every release.\n\nAttribution is now deterministic. A\n[…]\ngit.si, the email of the sigitc GitHub account, so GitHub\nrenders the co-author with that account's avatar. The system prompt\nquotes the constant verbatim and a unit test fails if the two drift\napart.",
          "is_bot": false,
          "headline": "Enforce siGit Code co-author attribution on new commits",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T19:41:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a99015f03d8944c95eca7645c2e1e84fb7d588c",
          "body": "Three follow-ups from the permission-system review:\n\nThe TUI's inference task used to keep running after Ctrl+C — dropping\nthe update channel only silenced it, so it kept burning model rounds\nand could still execute granted tools in the background. The tool loop\nnow notices the closed channel at eac\n[…]\nssible, ACP mode\nnow honors the OPENAI_BASE_URL/OPENAI_API_KEY provider override at\nstartup like the interactive client does; previously the override was\nsilently ignored there. Docs updated to match.",
          "is_bot": false,
          "headline": "Address review follow-ups: TUI cancel, state pruning, ACP test",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T17:49:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a64cd344294e4a6a2e659793c3b07cea10d46c54",
          "body": "Three fixes from review of the permission system:\n\nCancelling at the ACP permission gate used to return early and leave\nthe assistant's tool calls unanswered in the backend history, so strict\nOpenAI-compatible endpoints rejected every later request in the session.\nThe prompt loop now closes out the \n[…]\nf a long command from the person approving\nit. A shared approval_preview helper caps at 500 chars and flags any\nhidden remainder explicitly; the ACP dialog also carries the full\narguments as rawInput.",
          "is_bot": false,
          "headline": "Fix review findings: cancelled turns, approval visibility",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T17:25:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4759839b3ee96b39fbe4e819f5db0d65a14c834",
          "body": "`TUI_SESSION` is only referenced by the `#[cfg(unix)]` TUI (chat.rs), so\nthe Windows target sees it as unused and `-D dead-code` fails the Clippy\njob. Suppress the lint on non-Unix targets only — the same mechanism\nbackend.rs/provider.rs use — rather than module-wide, since the rest of\npermissions.rs is live on every platform (main.rs/ACP uses it on Windows).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Fix Windows dead-code: gate TUI_SESSION on cfg(unix)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T12:08:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4eeda0f36fd0de5a09fd59200ef85f5973e11c88",
          "body": "Working branches start from the latest origin/development. Exception:\nwork that depends on an unmerged feature branch may stack on it — merge\nthe base PR first, then rebase the stacked branch onto development\nbefore opening its pull request.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: branch off development, with a stacking exception",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c485955006d788b1fe8ff6b41ea1b62e84950d1",
          "body": "Branch names use feature/ (new functionality) or fix/ (bug fixes) with a\ndescriptive kebab-case slug — no tool- or agent-name prefixes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: require feature/ or fix/ branch prefixes",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7244898f9f0a2bc4e678c0e7c4fb39b8b98bdc2f",
          "body": "Every tool call now passes a permission gate before executing. Read-only\ntools (read_file, list_directory, search_files, glob, read_website,\nwrite_todos, skill) always run; mutating tools — including all mcp__* and\nunknown tools, the safe default for external side effects — are governed\nby layered p\n[…]\ning the\nspawned-handler restructure does not deadlock the dispatch loop.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Add tool permission system: approval prompts, policy, plan mode",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86e00d5d6be7489f8d8ce4ca6ea351f80ee92710",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.1 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:54:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30aae0b1be161a32ff46743af207954cc2570792",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.1 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:54:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d4757fd31d5b0e570ed7206166344430313b7b8",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LsGodCvtg3Pdes1SUdxYSw",
          "is_bot": false,
          "headline": "Release v1.3.1",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:53:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b6ab1c46bba77a89ebecd0a520b8b8b0645d3b3",
          "body": "…b-todos-remember",
          "is_bot": false,
          "headline": "Merge pull request #19 from getsigit/claude/agent-tools-multiedit-glo…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-02T03:46:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39d085ebc90bbb844896b2333a9813383b506f3e",
          "body": "- glob: use sort_by_key(Reverse(mtime)) instead of sort_by; this trips\n  clippy::unnecessary_sort_by on Rust 1.96 (CI), which an older local\n  toolchain did not flag.\n- CLAUDE.md: list the new agent tools (glob, multi_edit, write_todos,\n  remember) in the tools.rs architecture note.\n\nRebased onto de\n[…]\nthe CI toolchain (1.96.1): fmt + clippy\n(-D warnings) + test all green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Fix clippy unnecessary_sort_by in glob; sync docs",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:19:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "609c035bc18baf86fa11bdf0af8aac426cf6fdc6",
          "body": "- Describe the file's audience as \"AI coding agents\" rather than naming a\n  specific third-party tool.\n- Require pull requests to target the development branch (main is\n  release-only).\n- Require the full CI gate (fmt + clippy + test) to pass locally before\n  pushing a branch or opening a pull request.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: neutral agent wording, PR target, and pre-push CI rule",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7231c31e001806a08045d269ccc45ca38b98ad53",
          "body": "Add an important rule to CLAUDE.md: name branches after the changes they\ncontain (short kebab-case slug), not after a task/ticket/session id.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: require descriptive, change-based branch names",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d9a2dde51366557761bb02adc1a94893fc32975",
          "body": "Closes several high-leverage gaps with Claude Code in the agent tool layer:\n\n- edit_file: add `replace_all` and return actionable failure context\n  (names the line whose trimmed text matches when only whitespace differs),\n  so the model self-corrects in one round instead of guessing.\n- multi_edit: a\n[…]\n_tools(). Adds unit tests; fmt + clippy (-D warnings) + test all green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Add Tier-0 parity tools: multi_edit, glob, write_todos, remember",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dcabc8de8232453a4cc8cfcf7d4525fe6e128658",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #18 from getsigit/claude/mcp-integration-sigit-hbnh3e",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-01T21:09:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80fcc79e2e23bd33103bc5bae132858434b7d4c7",
          "body": null,
          "is_bot": false,
          "headline": "Update license file branding and legal",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T20:46:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71e198539f22a793496de194f023f2633982eb5c",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/branding-and-legal' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T19:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3de4ab06a3dd7eeaabe34fb96a4804672a20263",
          "body": null,
          "is_bot": false,
          "headline": "Update branding and legal",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T19:56:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "005429b80a4afb1d314e49323c725e8afac7b001",
          "body": "Implement the client half of the Model Context Protocol so siGit Code can\nconnect to MCP servers, discover the tools they expose, and offer them to the\nmodel alongside its built-in tools. Tool calls are forwarded to the owning\nserver and the results fed back into the agent loop.\n\n- New src/mcp.rs: S\n[…]\n-in\n  server.\n\nUpdates CLAUDE.md and CHANGELOG.md (Unreleased section).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LsGodCvtg3Pdes1SUdxYSw",
          "is_bot": false,
          "headline": "Add MCP client support and bake in the official siGit Code MCP server",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T21:24:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9abace7945f03c6466022b5dc3ed82175493793",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.0 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T07:21:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82d6fa75e4dc28e79b0d2ee90791a152a88cdb63",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.0 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T07:21:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 17,
      "commits_last_year": 297,
      "latest_release_at": "2026-07-22T22:11:59Z",
      "latest_release_tag": "v1.5.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "sigit",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ai",
            "cli",
            "llm",
            "coding-agent",
            "sigit",
            "command-line-utilities"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/sigit",
          "is_deprecated": false,
          "latest_version": "1.5.0",
          "repository_url": "https://github.com/getsigit/sigit",
          "versions_count": 14,
          "total_downloads": 266,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 81,
          "first_published_at": "2026-04-12T09:39:32.838363Z",
          "latest_published_at": "2026-07-22T21:53:52.628207Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "sigit-code",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "sigit",
            "cli",
            "ai",
            "coding-agent",
            "llm",
            "on-device",
            "Development Status :: 4 - Beta",
            "Environment :: Console",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: Apache Software License",
            "Operating System :: MacOS",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python :: 3",
            "Programming Language :: Rust",
            "Topic :: Scientific/Engineering :: Artificial Intelligence",
            "Topic :: Software Development",
            "Topic :: Utilities"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/sigit-code/",
          "is_deprecated": false,
          "latest_version": "1.5.0",
          "repository_url": "https://github.com/getsigit/sigit",
          "versions_count": 16,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-04-24T12:03:07.901987Z",
          "latest_published_at": "2026-07-22T22:11:10.515164Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 20,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-13",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "npm/sigit/tsconfig.json"
      ],
      "toolchain_manifests": [
        "Cargo.toml"
      ],
      "largest_source_bytes": 181610,
      "source_files_sampled": 28,
      "oversized_source_files": 3,
      "agent_instruction_files": [
        ".agents/AGENTS.md",
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 17808
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "pypi/pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "agent-client-protocol",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "onde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1.2"
        },
        {
          "name": "tokio",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio-util",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "futures",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "ratatui",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.29"
        },
        {
          "name": "crossterm",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.29"
        },
        {
          "name": "anyhow",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "libc",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "log",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "serde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "toml",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "async-trait",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "regex",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "reqwest",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "uuid",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "rpassword",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "7"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 29,
        "open_issues": 3,
        "closed_ratio": 0.7,
        "closed_issues": 7,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "paydii",
          "commits": 157,
          "avatar_url": "https://avatars.githubusercontent.com/u/193906237?v=4"
        },
        {
          "type": "User",
          "login": "setoelkahfi",
          "commits": 104,
          "avatar_url": "https://avatars.githubusercontent.com/u/1797197?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 25,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "keypair34",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/216233964?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.529
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release-crates.yml",
        "release-github.yml",
        "release-homebrew.yml",
        "release-mcp-registry.yml",
        "release-npm.yml",
        "release-pypi.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 1,
            "reason": "Found 2/20 approved changesets -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "13 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "431bc0d8aa3ffa39d48002480cbe33a6a79eb4df",
        "ran_at": "2026-07-23T00:21:19Z",
        "aggregate_score": 3.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T22:12:13Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-20T18:02:28Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 5,
          "created_at": "2026-04-30T11:07:24Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 34,
          "created_at": "2026-07-06T20:35:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 40,
          "created_at": "2026-07-15T16:00:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/getsigit/sigit",
    "host": "github.com",
    "name": "sigit",
    "owner": "getsigit"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 36,
        "vitality": 79,
        "community": 32,
        "governance": 56,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 297,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 10
            },
            "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": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "297 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 297
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 17,
              "latest_release_tag": "v1.5.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "17 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "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.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 21,
            "inputs": {
              "forks": 1,
              "stars": 20,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "20 stars",
                "points": 20.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "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": 32,
            "inputs": {
              "packages": [
                "sigit",
                "sigit-code"
              ],
              "dependents": null,
              "ecosystems": "crates, pypi",
              "total_downloads": 266,
              "monthly_downloads": 81
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "81 downloads/month across crates, pypi",
                "points": 25.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 81,
                      "ecosystems": "crates, pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.529
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 53% of commits",
                "points": 10.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 53
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "merged_prs": 29,
              "open_issues": 3,
              "closed_issues": 7,
              "issue_closed_ratio": 0.7,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "70% of issues closed",
                "points": 32.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 70
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "29/31 decided PRs merged",
                "points": 35.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 29,
                      "decided": 31
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/20 approved changesets -- score normalized to 1",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "followers": 1,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "getsigit",
              "public_repos": 4,
              "account_age_days": 102
            },
            "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": "1 followers of getsigit",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "getsigit"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~0 yr old",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "sigit",
                "sigit-code"
              ],
              "ecosystems": "crates, pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on crates, pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "crates, pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "16 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "7 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "agent-client-protocol",
                "code-editor",
                "coding-agent",
                "cargo",
                "crates-io",
                "inference-engine",
                "rust-lang",
                "qwen2-5",
                "qwen3"
              ],
              "has_wiki": true,
              "homepage": "https://zed.dev/acp/agent/sigit",
              "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://zed.dev/acp/agent/sigit",
                "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": "9 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 36,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 2/20 approved changesets -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "13 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "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": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.75,
              "agent_instruction_files": [
                ".agents/AGENTS.md",
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 17808
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".agents/AGENTS.md, AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".agents/AGENTS.md, AGENTS.md, 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": "75 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 75,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "npm/sigit/tsconfig.json"
              ],
              "agent_commit_share": 0.19,
              "toolchain_manifests": [
                "Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "npm/sigit/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "npm/sigit/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "19 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 19,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 181610,
              "source_files_sampled": 28,
              "oversized_source_files": 3
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "3/28 source files over 60KB",
                "points": 49.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 28,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index crates:sigit@1.5.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T00:21:30.349593Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/getsigit/sigit.svg",
  "full_name": "getsigit/sigit",
  "license_state": "custom",
  "license_spdx": null
}

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

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

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadascrates.io, PyPI.