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

aretta-ai / aristo

An SDK for verifiable intent, inline with code: one-line claims above your functions, verified at the rigor you choose and flagged when they drift. Agent-first, MIT.

RustMIT★ 32 estrellas⑂ 1 forkdesde may 2026Ver en GitHub ↗

aretta-ai/aristo tiene un índice de salud de 61 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (75/100) y la más baja, Security (44/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

61
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.

61
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

Aretta AIOrganización
2 seguidores10 repositorios públicosdesde feb 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.ioaristo0.6.033.66019hace 0 díassdkverificationannotationproofintentdevelopment-tools
crates.ioaristo-cli0.6.029819hace 0 díassdkverificationannotationproofintentcommand-line-utilitiesdevelopment-tools
crates.ioaristo-core0.6.033519hace 0 díassdkverificationannotationproofintentdevelopment-toolsparsing
crates.ioaristo-macros0.6.033.69119hace 0 díassdkverificationannotationproofintentdevelopment-tools

Métricas por categoría

Vitalidad

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

71Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
5.5/36Cadencia de commits — 8/52 semanas con commits
18/18Volumen de commits — 501 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year501
human_commit_share1
days_since_last_push0
active_weeks_last_year8
Cómo se puntúa
16.2/27Publica versiones — 27 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count27
latest_release_tagv0.6.0
releases_from_tags
days_since_latest_release0
mean_days_between_releases4
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

62Moderado · 18% del índice global
Cómo se puntúa
24.2/60Estrellas — 32 estrellas
0/25Forks — 1 forks
0/15Observadores — 2 observadores
Datos de entrada utilizados
forks1
stars32
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template
Cómo se puntúa
64.4/80Descargas mensuales — 67.984 descargas/mes en crates
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesaristo, aristo-cli, aristo-core, aristo-macros
dependents
ecosystemscrates
total_downloads203.953
monthly_downloads67.984
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?

54Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
4.2/22.5Distribución de commits — el principal contribuyente firma el 81% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,814
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
34.9/38.3Aceptación de PR — 63/69 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/4 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs63
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs6
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
3.4/25Alcance del propietario — 2 seguidores de aretta-ai
8.4/25Trayectoria — 10 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers2
owner_typeOrganization
is_verified
owner_loginaretta-ai
public_repos10
account_age_days154
Cómo se puntúa
25/25Publicado y resoluble — 4 paquete(s) en crates
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 19 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesaristo, aristo-cli, aristo-core, aristo-macros
ecosystemscrates
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 4 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 — 4 out of 4 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
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 8 topics
0/10Wiki
Datos de entrada utilizados
topicscli, code-verification, coding-agents, formal-methods, mit-license, rust, verification, design-by-contract
has_wikino
homepage
has_readme
has_docs_dir
has_description

Seguridad

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

44En 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 — sin datos
2.5/2.5CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/4 approved changesets -- score normalized to 0
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.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,4
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? 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.

75Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 97 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,97
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes22.376
Cómo se puntúa
18/18Arranque con un solo comando — crates/aristo-cli/tests/cmd/active/lang_detect_c.in/Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Rust (tipado estático)
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 76 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesCargo.lock
has_dockerfileno
typed_language
bootstrap_filescrates/aristo-cli/tests/cmd/active/lang_detect_c.in/Makefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,76
toolchain_manifestsCargo.toml, crates/aristo-cli/Cargo.toml, crates/aristo-cli/tests/cmd/active/lang_detect_rust.in/Cargo.toml, crates/aristo-core/Cargo.toml, crates/aristo-macros/Cargo.toml, crates/aristo/Cargo.toml
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
54.2/55Tamaños de archivo manejables — 4/268 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes73.897
source_files_sampled268
oversized_source_files4
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

32estrellas de GitHub
2contribuidores
501commits en los últimos 12 meses
0días desde el último push
27versiones publicadas
1factor bus
0issues abiertas
crates.ioecosistemas 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:aristo@0.6.0; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 4.4 / 10
4.4agregado

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

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/4 approved changesets -- score normalized to 0
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
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
Dependencias directas 36
RegistroPaqueteRestricción de versiónManifiesto
crates.ioaristocrates/aristo-cli/Cargo.toml
crates.ioaristo-corecrates/aristo-cli/Cargo.toml
crates.ioanstyle1crates/aristo-cli/Cargo.toml
crates.ioanstream0.6crates/aristo-cli/Cargo.toml
crates.iobadge-maker0.3.1crates/aristo-cli/Cargo.toml
crates.ioclap4.5crates/aristo-cli/Cargo.toml
crates.iodirs5.0crates/aristo-cli/Cargo.toml
crates.iogetrandom0.2crates/aristo-cli/Cargo.toml
crates.ioproc-macro21.0crates/aristo-cli/Cargo.toml
crates.ioserde1.0crates/aristo-cli/Cargo.toml
crates.ioserde_json1.0crates/aristo-cli/Cargo.toml
crates.iosyn2.0crates/aristo-cli/Cargo.toml
crates.iotextwrap0.16crates/aristo-cli/Cargo.toml
crates.iotime0.3crates/aristo-cli/Cargo.toml
crates.iotoml0.8crates/aristo-cli/Cargo.toml
crates.iowalkdir2.5crates/aristo-cli/Cargo.toml
crates.ioaristocrates/aristo-core/Cargo.toml
crates.ioglobset0.4crates/aristo-core/Cargo.toml
crates.ioproc-macro21.0crates/aristo-core/Cargo.toml
crates.ioschemars0.8crates/aristo-core/Cargo.toml
crates.iosemver1crates/aristo-core/Cargo.toml
crates.ioserde1.0crates/aristo-core/Cargo.toml
crates.ioserde_json1.0crates/aristo-core/Cargo.toml
crates.iosha20.10crates/aristo-core/Cargo.toml
crates.iosyn2.0crates/aristo-core/Cargo.toml
crates.iothiserror2.0crates/aristo-core/Cargo.toml
crates.iotime0.3crates/aristo-core/Cargo.toml
crates.iotoml0.8crates/aristo-core/Cargo.toml
crates.iotree-sitter0.24crates/aristo-core/Cargo.toml
crates.iotree-sitter-c0.23crates/aristo-core/Cargo.toml
crates.ioureq3.3crates/aristo-core/Cargo.toml
crates.iowalkdir2.5crates/aristo-core/Cargo.toml
crates.ioproc-macro21.0crates/aristo-macros/Cargo.toml
crates.ioquote1.0crates/aristo-macros/Cargo.toml
crates.iosyn2.0crates/aristo-macros/Cargo.toml
crates.ioaristo-macroscrates/aristo/Cargo.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": [
        "cli",
        "code-verification",
        "coding-agents",
        "formal-methods",
        "mit-license",
        "rust",
        "verification",
        "design-by-contract"
      ],
      "is_fork": false,
      "size_kb": 3408,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "C": 3271,
        "Rust": 2753064,
        "Shell": 14709,
        "Python": 1460,
        "Mermaid": 808,
        "Makefile": 14
      },
      "pushed_at": "2026-07-22T23:57:03Z",
      "created_at": "2026-05-15T23:51:40Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T23:57:07Z",
      "description": "An SDK for verifiable intent, inline with code: one-line claims above your functions, verified at the rigor you choose and flagged when they drift. Agent-first, MIT.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://aretta.ai/",
      "name": "Aretta AI",
      "type": "Organization",
      "login": "aretta-ai",
      "company": null,
      "location": "United States of America",
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/262414676?v=4",
      "created_at": "2026-02-18T18:18:21Z",
      "is_verified": null,
      "public_repos": 10,
      "account_age_days": 154
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-22T23:57:00Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-07-22T18:24:33Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-07-04T06:03:12Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-02T09:44:43Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-07-01T03:15:45Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-29T18:56:11Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-06-28T23:44:54Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-28T09:08:55Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-06-17T23:45:23Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-06-16T17:59:48Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-06-16T16:40:01Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-06-09T09:41:41Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-06-09T07:21:07Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-06-08T18:06:30Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-08T07:44:25Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-06T06:52:54Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-05T05:45:52Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-04T18:31:08Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-05-29T20:09:51Z"
        },
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2026-05-19T02:30:32Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2026-05-18T23:52:35Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2026-05-18T01:23:20Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2026-05-16T19:57:34Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2026-05-16T04:43:13Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2026-05-15T23:51:56Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2026-05-15T22:54:41Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2026-05-15T22:12:17Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "68007feacbc18f6a8cdd692be74975d9cf68a055",
          "body": "release: v0.6.0 — C support + zero-config discovery + multi-repo credentials",
          "is_bot": false,
          "headline": "Merge pull request #73 from aretta-ai/release/v0.6.0-staged",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:57:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63045c58cbf37ead95030a785251f5f7b804a737",
          "body": "Now that data_plane_base blank-filters the env tier, an unset repo\nVariable (which expands to \"\") is treated as unset, not a misroute. The\ngenerated aristo-verify.yml comment no longer warns against an empty\nvalue; it explains the safe fall-through instead.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(cli): soften init verify-workflow empty-ARETTA_API_URL note",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:43:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "791bffc62dea89859492842ef81fd14767c2ab0f",
          "body": "`data_plane_base` returned a present env override verbatim without a\nblank check, so an empty ARETTA_API_URL (e.g. an unset CI Variable that\nexpands to \"\") routed verify / canon-match to an empty base URL. Now the\nenv tier blank-filters exactly like the login resolver (`login_server`):\nblank/whitesp\n[…]\nt treat the regenerated doc artifact as\nverification. Regenerated .aristo/doc/data_plane_base_precedence.md so\n`aristo doc --check` stays green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auth): treat blank ARETTA_API_URL as unset in data_plane_base",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:41:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1361170ea3c901acea6ac75ea33ad4e5c5a9ec53",
          "body": "Operator-ruled surface removal (minimize-surfaces): dev.aretta.ai is\nretired, so drop the `ServerUrl::Dev` variant, its `DEV` const, and the\n`dev` / `development` / `staging` parse aliases. Those strings now fall\nthrough to the ordinary custom-host path like any other input (`dev` ->\nhttps://dev) — \n[…]\n `dev_resolves_to_dev_aretta_ai` removed — both are the\nintended effect of the removal, NOT regressions.\n\nCHANGELOG: Removed bullet under 0.6.0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(auth): remove the retired dev.aretta.ai server aliases",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:35:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ef1cd2f10c149f239102b998e4d6bff14e1c088",
          "body": "A bare ARETTA_TOKEN resolves the data plane to the code.aretta.ai default\n(env-token auth forces the prod server, no discovery), so the generated\nverify workflow — which wired only the token — silently sent a hosted\norg's `aristo verify` to the wrong server. The generated aristo-verify.yml\nSetup com\n[…]\nse\nreturns an empty ARETTA_API_URL verbatim — a separate latent bug flagged\nfor follow-up — so the workflow instructs rather than auto-wires it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): init --ci-verify steers hosted orgs to their own server",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:25:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0782b9f22a5bfdbbc2c487ba2492c3cb8b345715",
          "body": "Document on `login_server_discovering` that a present ARETTA_API_URL wins\noutright and skips the discovery lookup, so ARETTA_DISCOVERY_URL (which\nrelocates the discovery platform) is ignored when both are set. The two\nenv vars never both take effect.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(auth): note ARETTA_API_URL short-circuits discovery",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:25:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8eb38d704c6995c889ce4659df6d662eff8b1c1",
          "body": "The \"no token provided\" help pointed at\nhttps://code.aretta.ai/dashboard/settings/tokens, which 404s. Replace it\nwith current guidance: `aristo auth login` (OAuth, default) mints one\ninteractively; `--stdin` / `--token` remain for an existing arta_* token.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auth): drop dead dashboard token URL from login help",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:25:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1614f3fd8553f684f202822e20b19de503993c8a",
          "body": "`CliTokenResponse.jwt` / `token_id` / `last_4` are recorded but unused by\nthe SDK's login flow, yet were decode-required — a conductor dropping any\nof them would fail login outright. Mark the three `serde(default)` so only\n`arta_token` / `user` / `repo_full_name` remain required. Fields are kept\n(not removed) since this is a release-staged branch. Locked by a decode\ntest with the three fields absent.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auth): tolerate missing SDK-unused fields in cli-token response",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:25:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91ef1f9e6ed37fef72921ac91d4e253749752578",
          "body": "The retired platform default answers `POST /auth/cli-token` with 410 Gone\nonce it stops minting CLI tokens. Previously that surfaced as a bare\n\"HTTP 410: <body>\". Special-case 410 into a message that names the cause\n(CLI pointed at the retired platform default) and the fix (re-run against\nthe org's \n[…]\nrade), while still\nshowing the server's own body. Covered by a map_response unit test and a\nmock-server E2E returning 410 on the token exchange.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(auth): friendly 410 Gone message on auth login",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T23:25:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f82e39400cd0a243392ee555ef83bab7321eba8",
          "body": "…po credentials\n\nBumps [workspace.package] version and the 3 internal path-dep pins\n0.5.1 -> 0.6.0, regenerates Cargo.lock, and promotes CHANGELOG\n[Unreleased] -> [0.6.0] (Added consolidated, Fixed at the end).\n\nContent of 0.6.0 (held since 0.5.1 + the auth feature branch):\n- C support: annotation (\n[…]\n/token/logout).\n- The ARETTA_API_URL login-server precedence fix (#71) — also shipped\n  standalone as the interim 0.5.2 release; folded in here.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build(release): v0.6.0 — C support + zero-config discovery + multi-re…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T22:36:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2c06e01b836f4384d6c0290a5bb082351946050c",
          "body": "…po credentials\n\n# Conflicts:\n#\tcrates/aristo-cli/src/commands/auth.rs\n#\tcrates/aristo-cli/src/lib.rs\n#\tcrates/aristo-core/src/auth/mod.rs\n#\tcrates/aristo-core/src/auth/server.rs",
          "is_bot": false,
          "headline": "Merge feat/auth-discovery-multirepo: zero-config discovery + multi-re…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T22:34:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c0487ff22e2a81c7217b3c3d00bb3c3b709ccba",
          "body": "fix(cli): honor ARETTA_API_URL for auth login server resolution",
          "is_bot": false,
          "headline": "Merge pull request #71 from aretta-ai/fix/login-server-precedence",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-07-22T21:56:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c41ee124a30c5054d8ed4f7e71bef4eb6950789e",
          "body": "Complete the multi-repo surface on the read/remove side.\n\n- `auth status` lists every stored credential (server, repo, user —\n  never the token), plus any `ARETTA_TOKEN` override.\n- `auth token [--repo]` resolves the token for the given repo (strict —\n  an explicit `--repo` with no match errors, rat\n[…]\nd in resolve independently by `--repo`\nand by cwd, status lists both without leaking tokens, and repo-scoped\nvs `--all` logout behave correctly.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): multi-repo `aristo auth token`/`status`/`logout`",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T19:45:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "92265e7fd6d42e3bcf7dc2c10cdab4b9e6d7dffc",
          "body": "Both login paths now persist a keyed entry. The core writers `save`\nand `save_full` delegate to `upsert_entry`, so an OAuth login upserts\nthe entry for its (server, repo) and migrates any old single-slot file\nin place. The `--token` / `--stdin` bypass now honors `--server` and\n`--repo` (repo best-ef\n[…]\nlve_repo_best_effort` (repo optional) for the bypass. Update the\n`--repo` help and the credentials-file format test (`issued_at` →\n`minted_at`).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): route `aristo auth login` into the multi-repo store",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T19:39:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2acd26fe1b7fe1408fd1321652f6de8aeac6f69b",
          "body": "`resolve_full`/`resolve_full_with` now read the multi-repo store and\npick the entry scoped to the current repo. `resolve_full_with` gains a\n`repo_hint` and applies: `ARETTA_TOKEN` env > the entry matching\n`repo_hint` > the sole stored entry (single-repo grace, so a\none-credential user resolves uncha\n[…]\nl sites keep calling the\nno-arg `resolve_full()` unchanged — only its internals moved onto the\nstore, so it transparently reads v1 and v2 files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): resolve credentials by repo from the multi-entry store",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T19:33:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2c7e4db0c39e39fa457fd79e9b335b76296bde2f",
          "body": "Add a keyed, versioned credential store so a user can be signed in to\nseveral repos (and servers) at once. `CredentialStore` holds\n`CredentialEntry` records keyed by `(server, repo)`, with `find_by_repo`\n(most-recent on a shared repo), `sole` (single-repo grace), `upsert`,\nand `remove_by_repo`.\n\nOn \n[…]\ne write.\n\nPurely additive here — the existing v1 writers, the resolver, and the\nCLI are rerouted in following commits, so behavior is unchanged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): versioned multi-repo credential store",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T19:30:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b9e05e62584612532bf76205f8e875785f3e581a",
          "body": "Wire org discovery into login. With no `--server` and no\n`ARETTA_API_URL`, login now resolves the repo first, then asks the\nplatform where the repo's org lives and authenticates against the\ndiscovered conductor — announcing e.g.\n`Authenticating against https://turso.aretta.ai (discovered for owner/r\n[…]\nnetwork):\ndiscovery hit → redirected to the org server; 404 → clean fallback;\n`--server` → a request-counting probe records ZERO discovery hits.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): zero-config server discovery at `aristo auth login`",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T19:23:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1df7dc2c7306467c6d0e114cd92498e516229c69",
          "body": "Add `auth::login_server_discovering`, which extends the login-server\nresolver with a discovery tier: `--server` flag > `ARETTA_API_URL` env\n> discovery (queried at the prod default) > prod default. It delegates\nthe flag/env/default tiers to `login_server` so the two can't drift,\nand runs the injecte\n[…]\n announces as\n`(discovered for <owner/repo>)`. The CLI announce call site is updated\nfor the new signature (discovery wiring itself lands next).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): fold org discovery into login-server precedence",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T19:14:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64fedd62666dd85e29c91c0cae51a9c83c8acb5a",
          "body": "Add `auth::discover_org` — a best-effort client that asks a platform\nwhere a repo's hosted org lives, via\n`GET <platform>/.well-known/aretta-org?repo=<owner/repo>`.\n\nA 200 carrying a usable `base_url` returns the discovered org; a 404,\nany other non-2xx, a 3s timeout, a transport error, or an\nunpars\n[…]\ns covered by a graceful-fallback test against a closed port.\nReuses the oauth module's `url_encode` (now `pub(crate)`) for the repo\nquery param.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): zero-config org discovery client",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T19:10:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bfecdc0121f30260c7b91cca41b4753c17ab96ad",
          "body": "`aristo auth login` resolved its server only from `--server` (clap\ndefault `prod` = code.aretta.ai) and ignored `ARETTA_API_URL`, which the\nrest of the CLI honors as the highest-precedence data-plane override\n(see `data_plane_base`). A user who exported\n`ARETTA_API_URL=https://turso.aretta.ai` still\n[…]\ng against …\" line now\nnames the source when it isn't the default (e.g. `(from ARETTA_API_URL)`)\nso a stale export is visible before authorizing.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): honor ARETTA_API_URL for auth login server resolution",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T19:04:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f085080c846be23f40dedca2a3b4f48c616b5a95",
          "body": "`aristo auth login` resolved its server only from `--server` (clap\ndefault `prod` = code.aretta.ai) and ignored `ARETTA_API_URL`, which the\nrest of the CLI honors as the highest-precedence data-plane override\n(see `data_plane_base`). A user who exported\n`ARETTA_API_URL=https://turso.aretta.ai` still\n[…]\ng against …\" line now\nnames the source when it isn't the default (e.g. `(from ARETTA_API_URL)`)\nso a stale export is visible before authorizing.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): honor ARETTA_API_URL for auth login server resolution",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-22T10:10:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7cc3fe3f00a673d34a2aef76e5147d88b76d6411",
          "body": "feat: C instrumentation (Tier 2) — runtime + Inspect + expose codegen (I-1..I-4)",
          "is_bot": false,
          "headline": "Merge pull request #67 from aretta-ai/feat/c-instrumentation",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:31:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "feed233559fb0f71cf13ccfdc175814bebd0729f",
          "body": "feat: C language front-end — annotation surface (C-1 + C-2 + C-3)",
          "is_bot": false,
          "headline": "Merge pull request #66 from aretta-ai/feat/c-annotate",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:30:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7f8acb55922f1ee71e96e88c31c91fa3fab3341",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feat/c-annotate' into feat/c-instrumentation",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:26:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6681a7958c261f692bd6f7e5fbc2c13720d419eb",
          "body": "`count_fns_per_module_with` (the tier/metrics denominator) reuses\n`walk_for_freshness_with`, which was broadened to include `.c`/`.h` for\nthe C freshness preflight. But the counter parses each file as Rust with\n`syn`, so a single `.c` file made `aristo status` and `aristo metrics`\nfail with a parse \n[…]\n.c` test fixture). Skip non-`.rs` files in the\ncounter; add a regression test and a dogfood intent locking the\nRust-only contract.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): aristo status/metrics skip C files in tier computation",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:26:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a0c316a17244cee4b395d119863ca08653501e6",
          "body": "The four dogfood intents added by the C instrumentation work\n(instrument_write_is_idempotent, expose_prototype_is_verbatim_signature_\nnot_reconstructed, extract_c_inspect_attaches_across_mixed_directive_block,\nc_struct_field_completeness_gates_unknown_field_rejection) need committed\ndoc artifacts for `aristo doc --check`. Purely mechanical `aristo doc`\noutput; the pre-existing staleness was handled on the base branch.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(docs): regenerate .aristo/doc for the C instrument-surface intents",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:20:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7e891481efbfcf27c8f41d88634d510db5af707",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feat/c-annotate' into feat/c-instrumentation",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:20:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a94d9f11e5d88e08be2882448cd51465afc68a6",
          "body": "`aristo doc --check` (the dogfood CI gate) was red: 12 intents had no\ncommitted doc artifact (the new C-extractor intents plus pre-existing\nones whose artifacts were never generated) and 26 were stale after their\nsource prose was reworded in earlier sessions. Regenerate all of them so\nthe gate is green. Purely mechanical `aristo doc` output.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(docs): regenerate .aristo/doc artifacts (aristo doc --check)",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:20:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b244dd0f7e39f57d6ff9321bb441084eacf76239",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feat/c-annotate' into feat/c-instrumentation",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:14:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1efe5191ab1546256f8712a7a1ecf4041e7fd8ab",
          "body": "The C extractor's module doc used an intra-doc link `[`AnnotationArgs`]`,\nbut that struct is `pub(crate)`. Under the `cargo doc` CI gate\n(`RUSTDOCFLAGS=-D warnings`), a link from public docs to a private item\nis `rustdoc::private_intra_doc_links` = an error, breaking the doc build.\nDrop the link brackets (keep the code formatting). Two occurrences.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): unlink crate-private AnnotationArgs in C extractor doc",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-06T05:14:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5387def802603a99547b7e5ec848841e4da5b5bd",
          "body": "…(I-4)\n\nA harness cannot call a translation-unit-local function without a\nprototype; hand-writing one risks silent drift from the definition. `gen-c`\nnow reads `// @aristo expose` on a function and emits its VERBATIM source\nsignature as a prototype into aristo_generated.h. Paired with the\nARISTO_TU_\n[…]\nrecover_replay through the\ngenerated prototype under gcc -Werror; production compiles clean with it\nlocal and zero aristo symbols.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): gen-c emits type-checked prototypes for // @aristo expose …",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T21:34:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1375fcd031032d8e0fcc941f9d92e15b9e497808",
          "body": "gen-c is the only validator of an inspect directive (it's a comment; no\ncompiler checks it), so a malformed one must be a hard error, not a\nsilent drop. `extract_c_inspect_directives` now errors — naming the line\nand reason — on: a directive missing the required `ret`, an unknown\nargument, or a `fie\n[…]\ne build break is worse than the silent-drop it replaces).\n\nBoth surfaced by the adversarial tester validating I-2 against finch-C.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core): reject malformed C inspect directives loudly (dogfood F1/F2)",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T21:20:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a96cbd31326c5b13c1fcdc98af21e4b60c79cfab",
          "body": "Render `// @aristo inspect` directives into a gated aristo_generated.{h,c}\npair of read-only accessors (`aristo_inspect_<Type>_<field>`) so a harness\ncan read a SUT's private struct fields through its opaque handle — the\nblocker the finch-C dogfood hit. Clone mode returns the field; projection\n(`wit\n[…]\ner gcc -Werror and\nreads a private next_seqno=42 through an opaque Db, with zero aristo\nsymbols in the flag-off production object.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): aristo instrument gen-c — Inspect accessor codegen (I-2b)",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T21:02:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b0255bc1ecda90d9a8cab0570bf1198087df156e",
          "body": "Teach the C extractor the inspect directive — the codegen input for a\nread-only field accessor (Tier 2). `extract_c_inspect_directives` returns\n`CInspectDirective { type_name, field, ret, with, name, line }` with an\n`accessor_name()` = `aristo_inspect_<Type>_<field>` (or the `name`\noverride). Parsed\n[…]\nhe last aristo directive of any kind (a plain comment or blank line\nstill detaches). Parse-only; accessor rendering lands in I-2b.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): parse C `// @aristo inspect` directives (I-2a)",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T20:58:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e603a1186fb6ed0a6c75ee4fb2b7a9a788c1f195",
          "body": "Two fixes surfaced by the adversarial tester dogfooding vendor-c against\nfinch-C:\n\n- G1: aristo.c now carries the `ARISTO_C_INCLUDED` include-once guard the\n  design promised. A unity/amalgamation build that `#include`s aristo.c\n  can no longer error on `redefinition of g_fault_fn`.\n\n- G2: hook disp\n[…]\nC-compiler self-test now covers both: a self-clearing one-shot that\nmust stay cleared, and a double-#include TU that must compile.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): C runtime — include-once guard + self-clear-safe dispatch",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T19:45:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6a0dfb42654ddb255a84bb8054896312a4cbef7",
          "body": "Make the by-hand gcc/clang verification a CI-enforced test: emit the\nruntime + a self-test harness to a tempdir, compile with a detected C\ncompiler (cc/gcc/clang, skip if none) under -std=c11 -O1 -Wall -Wextra\n-Werror -Wpedantic -DARISTO_INSTRUMENT, and run it — asserting no-hook\nContinue, fail-Nth \n[…]\nU that uses every macro and asserts it compiles clean with no\n-D. Locks the runtime's behavior and its cost-zero macro expansions.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(cli): C-compiler self-test for the vendored runtime (I-1a)",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T19:29:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7e4fe979487146042b6707f84f112982257cbd6",
          "body": "The first C instrumentation command. `aristo instrument vendor-c` emits a\n~150-line C11 runtime (aristo.h + aristo.c) into a SUT: the\nARISTO_YIELD_POINT / ARISTO_FAULT_POINT macros, a _Thread_local\nfault/observe hook API with take-call-restore re-entrancy, and\naristo_decision as a tagged struct {inj\n[…]\nith the\nmacros vanishing under cc -E. New branch: instrumentation is Tier 2, a\nseparate workstream from the C-annotation PR (#66).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): aristo instrument vendor-c — vendored C runtime (I-1a)",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T19:27:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c7c637fa3c8de363dbb9aac5ca06c9b4266e55ef",
          "body": "Teach `aristo lang` a second language. Detection: a C build manifest\n(Makefile / CMakeLists.txt / compile_commands.json / meson.build /\nconfigure.ac / GNUmakefile) or a `.c`/`.h` source in the directory —\nCargo.toml still wins in a mixed root — plus `--file foo.c`/`.h` for\nper-file detection in a po\n[…]\nst, C\".\n\nCloses the C annotation surface (C-1 + C-2 + C-3); instrumentation\n(Tier 2) remains deferred until a real C SUT needs it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): aristo lang detects C and emits a C cheat sheet",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T18:06:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e67588b3c721a698864c8b264217c8989055c63",
          "body": "A directive placed inside a function body attaches to the statement on\nthe line directly below it, at any nesting depth (loop, if, or nested\nblock bodies), with the enclosing function as its site and\nCoveredRegion::Statement. Pass 2 descends into each function body via a\nrecursive walk over named ch\n[…]\nent annotations interleave\nwith file-scope ones in source order. This completes the C-2 surface:\nfunctions, types, and statements.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): statement-form C directives (intent_stmt analog)",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T09:33:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9396580e00085f47a7a30d18c3dd34602308bcee",
          "body": "Add a leading `site = \"name\"` argument to C directives: instead of\nadjacency, the directive attaches to the function or type named `name`\nanywhere in the file. This reaches targets adjacency cannot — a function\ndefined by a macro tree-sitter can't parse (kernel `SYSCALL_DEFINE`, X-\nmacros) via `site\n[…]\nnd row, then resolve each directive run by site (name) or\nadjacency (row). AnnotationArgs gains Clone so it can be reused per run.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): C site=\"...\" explicit target selector for directives",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T09:28:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f0123c93aba112d42f49f41534159ca5b1ad263",
          "body": "Generalize the C extractor around a `CItem` (site label, body node, region)\nso a directive attaches to a tagged or typedef `struct`/`union`/`enum`\ndefinition, not just a function. The covered region is the type's brace\nfield/enumerator list, hashed like a Rust struct body — adding or changing\na field marks the intent stale, a prose-only directive edit does not.\nParent lists already work via the shared argument grammar.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): attach C directives to struct/union/enum definitions",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T09:12:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2572d17dcea504f30d044679c9f2357c4a33f82a",
          "body": "Close slice C-1 with its executable spec. The `c_annotate_basic` trycmd\nscenario runs the read-only `aristo stamp --check` against a committed C\nindex fixture (canon disabled for offline hermeticity), asserting the\nbyte-exact CLI output — the walk finds the two intents in `db.c` and\nconfirms the ind\n[…]\ns nothing, so the fixture stays clean across\nruns — unlike `aristo index`, a non-deterministic writer the repo tests\nimperatively.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(cli): lock C annotation discovery with a scenario + content test",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T09:03:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cd8f0517834755781f639f76caed3f33507f8254",
          "body": "Route the annotation walk and the freshness preflight through a single\n`language_for_extension` authority that maps `.rs` to the Rust extractor\nand `.c`/`.h` to the C extractor. A mixed Rust+C project now indexes\nannotations from both, and because both walks share the one extension\nset, C files are re-checked for drift exactly like Rust files — a\none-sided filter would silently index C once and never re-verify it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): scan .c/.h files in the directory walk",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T03:56:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "068b08ebad9ae78caa0cb52273c8392a11bcda4b",
          "body": "Add `extract_from_c_source`: a tree-sitter-c front-end that reads\n`// @aristo intent(...)` / `assume(...)` line-comment directives placed\ndirectly above a function and produces the same `ExtractedAnnotation`\nrecords as the Rust `syn` extractor. The parenthesized argument list\nreuses the Rust `Annota\n[…]\nnt (no\nblank line between directive and function), contiguous directive runs.\nNot yet wired into the filesystem walk (next slice).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): extract Aristo annotations from C source via tree-sitter",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-05T03:53:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dfd09fd80fe4c41c2d283964adc4279c6d75e36d",
          "body": "chore(release): v0.5.1",
          "is_bot": false,
          "headline": "Merge pull request #65 from aretta-ai/release/v0.5.1",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-07-04T06:03:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e9d95ee647ee35336679da41530fe2cf8783425",
          "body": "Patch release: canon-matches reconcile on scan.\n\n- Reconcile (#64): `aristo stamp` prunes .aristo/canon-matches.toml\n  entries for annotations deleted from source (extra warning when the\n  pruned rows carried accepted bindings) and drops accepted matches on\n  ids that are local in source; the live-i\n[…]\nits non-zero naming the affected ids.\n\nBumps [workspace.package] + internal dep pins 0.5.0 -> 0.5.1; promotes\nCHANGELOG [Unreleased] -> [0.5.1].\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.5.1",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-04T03:36:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3cb7b5a1a07202a88cd59264f2e9864e76fd2f6",
          "body": "…scan\n\nfix(canon): reconcile canon-matches.toml with source on scan",
          "is_bot": false,
          "headline": "Merge pull request #64 from aretta-ai/fix/canon-matches-reconcile-on-…",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-07-04T00:36:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf5755aa37122d9abbf27ce9a53a64c2725963ec",
          "body": "The committed .aristo/canon-matches.toml was never garbage-collected:\ndeleting an annotation from source left its entry lingering forever.\nReal incident: tursodatabase/turso removed the\naristos:wal_checkpoint_error_no_db_leak intent (their PR #7725) but the\naccepted binding stayed in canon-matches.t\n[…]\n is now pruned on the next stamp (that memory was functionally\nlost already). `aristo canon unbind` remains the way to unbind a\nLIVE annotation.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(canon): reconcile canon-matches.toml with source on scan",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-07-04T00:24:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "19d4e2b2396463017e8ca84c95bb1edb241ee168",
          "body": "chore(release): v0.5.0",
          "is_bot": false,
          "headline": "Merge pull request #63 from aretta-ai/release/v0.5.0",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T09:44:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f4f1527752ca19be41d6763c628e5b321aac9cb",
          "body": "Minor release: the canon catalogue CLI/skill + the P-008\ninstrumentation-presence probe.\n\n- Canon catalogue (#61): `aristo canon catalogue` downloads the corpus\n  to a gitignored `.aristo/catalogue.json` snapshot (server-stamped\n  proprietary notice, `[instance]`-routed, logged-in); the\n  `aristo-ca\n[…]\nmatch→accept metadata carry-through.\n\nBumps [workspace.package] + internal dep pins 0.4.1 -> 0.5.0; promotes\nCHANGELOG [Unreleased] -> [0.5.0].\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.5.0",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T09:44:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4986e4bfebabcd9db538bd2cd1e635987b36062",
          "body": "P-008: instrumentation bundles — wire types, match->accept carry, S2 presence probe, skill integration",
          "is_bot": false,
          "headline": "Merge pull request #62 from aretta-ai/feat/p008-instrumentation-bundle",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T09:30:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c880592e6f7bd239a77beb8a90effb1ef8daa7a",
          "body": "feat: aristo canon catalogue — download the corpus (+ skill, + confidential notice)",
          "is_bot": false,
          "headline": "Merge pull request #61 from aretta-ai/feat/canon-catalogue",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T09:30:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d680b0bf2a3ec5260329d8e7a77758b5adccbb5",
          "body": "The golden fixture and its mirrored test/doc literals carried internal\ntaxonomy that ships to users on bundle records and escalation cards\n(DOI oracle, Bug tag C-1, WR-03, ACCESSORS.md rows). Rewritten to\nSUT-meaningful contract language; fixture stays byte-identical with the\nconductor's copy.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: scrub internal aretta-books references from wire-example strings",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T09:10:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7a28ccc3a08af882fe7667d44ef81a69b8e07eed",
          "body": "…stions Stage A\n\nThe intent-suggestions orchestrator already owns the full match-review\nQ&A (AskUserQuestion batches, canon show card previews, per-match\nAccept/Reject/Skip); the authoring skill now routes pending PRIMARY\nmatches to it as a step instead of reiterating an incomplete inline\nversion. The rule stands: accept is the user's decision; auto-accept\nonly under explicit standing authorization.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(skills): authoring defers canon-match review to intent-sugge…",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T07:39:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bacd9aa0ab2a2acf1f4ca4dd60489ff161339492",
          "body": "… and ask\n\nAccept rewrites source to the canonical text and creates a durable\nbinding; the skill now requires presenting the match (text diff, tiers,\nconfidence, consequences) with concrete options and a recommendation\nbefore running canon accept — auto-accept only under explicit standing\nauthorization. Complements the instrumentation-contract section, which\nalready scoped escalation for post-accept probe failures.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(skills): canon accept is the user's decision — surface the match…",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T07:34:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6a7bd4658e5a45f78cdef19c1261e09c6a648d1d",
          "body": "…tract\n\nA canon match can now deliver an instrumentation bundle; the authoring\nskill gains 'After accept: the instrumentation contract' — run the S2\npresence probe on bundle-carrying accepted matches, ACT on the per-\naccessor classifications (apply mechanical landing fixes from the\nescalation card; \n[…]\nerence.\nExit-code contract: never report a binding complete while the probe\nfails. Mirrors the P-008 PROPOSAL Confirm section + escalation card.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(skills): teach the authoring skill the P-008 instrumentation con…",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T06:49:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41712cdef3fb6daf6a8c81bf9d653d084466865e",
          "body": "The server can return the same canon entry at BOTH prefix tiers (a\nkanon: row and an aristos: row, same canon_id, typically equal\nconfidence). accept sorted candidates by confidence only and took the\nserver's first row — the kanon: one — writing a kanon:-prefixed id into\nSUT source. aristo-macros 0.\n[…]\nacro grammar accepts.\nRegression test drives the dual-tier tie end-to-end and asserts the\nrewritten source + index carry aristos: and no kanon:.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): canon accept prefers the aristos tier on confidence ties",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T05:27:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "caa75f0c94f1ccc83ae8b6085daee2086578d46c",
          "body": "… bundles\n\nGenerate an ephemeral probe crate from the unioned accepted-match\nbundles (verbatim harness_probe lines when self-contained, else calls\nsynthesized from expected_symbol/signature), [patch] turso_core to the\nuser's --sut-path checkout, and compile feature-on + feature-off.\nBuild-graph shar\n[…]\nrity warning when accepted matches route test binaries but\ncarry no bundle. E2E-validated against instrumented + uninstrumented\nturso checkouts.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): aristo canon probe — S2 presence probe for instrumentation…",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T02:52:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "405c56d12a24a821dee7cdced3657d784bfeb8cf",
          "body": "The match->PendingMatch builder dropped VerificationMetadata entirely;\ncarry the whole block (coverage_level + test_binaries + instrumentation\nbundle) into PendingMatch/AcceptedMatch with the additive 'linked'-field\nrecipe, so bundles survive stamp -> canon accept -> canon-matches.toml.\nBundle Value\n[…]\nkeep a covering server-issued bundle_id\nverbatim and rederive client-side otherwise with the server's pinned\nsha256(sorted ids joined ',') rule.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli,core): carry verification metadata match->accept + bundle union",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T02:52:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "24b266f018c8c8be1bfd0de493f175a84d74b590",
          "body": "…adata\n\nMirror the conductor's InstrumentationBundle JSON (SLICE23-SPEC wire\ncontract): bundle_id, provenance{base_ref, payload_ref, macro_grammar_rev,\nsut_binding, authored_at}, compile_check, role-tagged companions, and\nper-accessor records (landing coordinates + verbatim annotation, presence\n{exp\n[…]\nulls so the cross-repo golden fixture round-trips\nValue-equal (fixture byte-identical to the books source; the conductor\ncarries the same copy).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): P-008 InstrumentationBundle wire types on VerificationMet…",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-02T02:52:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d76f604e3dbd7885538e31aeebe1804152e713b7",
          "body": "Weaves `aristo canon catalogue` into the two canon-adjacent skills so the\nstandalone catalogue skill isn't the only entry point:\n- aristo-authoring: a \"reuse before novel\" step — consult the catalogue\n  for an existing canon entry to bind to before writing one-off prose.\n- aristo-intent-suggestions: a pointer to browse the full corpus (vs the\n  per-intent matches it reviews).\nA test locks both routings.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): route aristo-authoring + intent-suggestions to the catalogue",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T22:37:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d01be7ec312a1545a98536cb248576dcb6325540",
          "body": "CanonCatalogue gains a `notice` field (first, serde-default), so a\nserver-stamped proprietary/confidential notice is written at the top of\n`.aristo/catalogue.json` and echoed by `aristo canon catalogue`. The\naristo-catalogue skill tells agents the marking is authoritative — never\nstrip it, never let the file leave the org. Backward-compatible:\nconductors that don't send `notice` default it to empty.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: surface the server-stamped catalogue confidential notice",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T20:07:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "10a100d1cb250c93892e25bc238142e068376508",
          "body": "Adds the `aristo-catalogue` bundled skill: it teaches an agent to run\n`aristo canon catalogue` (download the corpus) and then read/search\n`.aristo/catalogue.json` to answer \"what canon entries exist / what\nshould I bind to?\". The skill makes explicit that the snapshot is a\ngitignored local cache — n\n[…]\nlls BUNDLED set + documented in aristo-help (the\nhelp-coverage test enforces the mention); `aristo install-skills` ships\nit to all five agents.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): aristo-catalogue skill",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T19:52:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b61dc7c6d7c3450c64a584f376ace540b1b471ad",
          "body": "…d snapshot\n\n`aristo canon catalogue` (logged-in only) fetches the full canon\ncatalogue via CanonClient::catalogue() and writes it to\n`.aristo/catalogue.json` — a regenerable local snapshot — then prints a\nsummary (total, backed/unbacked, per-category counts, the path). The\nbase URL resolves through\n[…]\nt; else the default\nserver. `aristo init` adds `.aristo/catalogue.json` to its generated\n.gitignore (the download is a cache, never committed).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): aristo canon catalogue downloads the corpus to a gitignore…",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T19:52:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d61e05ea962a1ab88cc90187ce300c04a1220ff",
          "body": "Adds `GET /catalogue` support to the canon client: a `catalogue()` trait\nmethod (impl'd across HTTP / noop / mock) that fetches the full active\ncanon corpus catalogue, plus the `CanonCatalogue` / `CanonCatalogueEntry`\nwire types. Each entry carries canon_id, version, canonical_text,\ncategory, applie\n[…]\nlabel()` derives aristos/kanon from `backed_by` (mirroring the\ndashboard's client-side derivation). Backs the `aristo canon catalogue`\ncommand.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): CanonClient::catalogue() + CanonCatalogue wire type",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T19:51:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b6f9585a26a5ff2064134143aa10c813d2795546",
          "body": "chore(release): v0.4.1",
          "is_bot": false,
          "headline": "Merge pull request #60 from aretta-ai/feat/instance-data-plane-routing",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T03:15:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de93bbad673313e1bbd53a96ee45cb62a1f2cbb2",
          "body": "Patch release: per-repo Aristo data-plane routing via aristo.toml.\n\n- feat(cli): canon show / request-verify report \"coming soon\" (no HTTP)\n- feat(core): add aristo.toml [instance] url + data-plane base resolver\n- feat(cli): route verify + canon data-plane requests via [instance] url\n\nA project can \n[…]\nunt\nserver. Auth/login is unchanged.\n\nBumps [workspace.package] + internal dep pins 0.4.0 -> 0.4.1; promotes\nCHANGELOG [Unreleased] -> [0.4.1].\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.4.1",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T02:42:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9a61537682ca6542f92602e2ce3474a928eb3b64",
          "body": "feat: route aristo-cli data-plane requests via aristo.toml [instance] url",
          "is_bot": false,
          "headline": "Merge pull request #59 from aretta-ai/feat/instance-data-plane-routing",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T02:30:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6406f40d4a9d6a52b3c25cab7809257d9f0e2fb4",
          "body": "Wires the B1 resolver into the CLI: verify session dispatch, the\n/canon/match caller (stamp / canon refresh), and canon migrate now\ncompute their base URL via crate::data_plane::resolve_base, which loads\nthe nearest aristo.toml's [instance] url best-effort and applies\nenv > [instance] > server prece\n[…]\n is\npreserved verbatim, so existing verify tests that set ARETTA_API_URL are\nunaffected; precedence itself is unit-tested on the core resolver.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): route verify + canon data-plane requests via [instance] url",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T00:27:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "706c0b4f9204faabc165b818b1e4c981e5c7bf19",
          "body": "Adds an `[instance]` section (`url` key) to the aristo.toml schema and\nthe `data_plane_base(env, instance, server)` resolver behind it, so a\nproject can pin its data-plane requests (verify session dispatch, canon\nmatch) to a specific Aretta deployment — e.g. a per-repo conductor at\n`https://<slug>.a\n[…]\nar ban; regenerates schemas/aristo-config.schema.json\n(schema-sync gate). Not yet wired into the CLI call sites — that is the\nfollowing commit.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): add aristo.toml [instance] url + data-plane base resolver",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T00:24:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e167a09355f1902d61354dc82e07517747649a6",
          "body": "`aristo canon show` and `aristo canon request-verify` now return\nCliError::NotImplemented (exit 64, stderr) instead of calling the canon\nAPI. The two per-entry canon endpoints (GET /canon/entry, POST\n/canon/request-verify) are being reworked to route against the\nper-instance data plane; deferring th\n[…]\ner/auth scenarios with a\ncoming-soon assertion (exit 64, \"not implemented yet\"). stamp / canon\nrefresh / list / accept / unbind are unaffected.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): canon show / request-verify report \"coming soon\" (no HTTP)",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-07-01T00:15:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10df7aa61608a1f96e9f46f4a10bcae5e21b7f9d",
          "body": "…remediation\n\nfix(intents): apply strong-suggest + scope critique remediation",
          "is_bot": false,
          "headline": "Merge pull request #58 from aretta-ai/fix/authoring-intents-critique-…",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-06-30T00:41:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78f4fb69d0a0f67a7422b2919406e11f1d4531fe",
          "body": "…que-round\n\ndocs(skills): §10A reflection on the critique sweep (no new principles)",
          "is_bot": false,
          "headline": "Merge pull request #57 from aretta-ai/docs/authoring-philosophy-criti…",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-06-30T00:41:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb6c64005952d18ac334c0367f9e927a9954504b",
          "body": "Adds 4 intents for claims the scope remediation removed from over-broad sites,\neach placed where the invariant is actually enforced:\n- statusline_render_reads_are_bounded (run, neural) — bounded per-render read\n  set; trap = adding a source-tree walk/stat to a per-keystroke command\n- stamp_refills_e\n[…]\ny covered by an existing intent.\n\n§6 green; aristo verify --audit: the 4 new intents show as unknown, no new\nstale/refuted/orphan.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(intents): re-home dropped scope-claims at their enforcement sites",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T22:31:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6356b6dcdd6633943e8e889e51037731a032992f",
          "body": "…t prose\n\nApplies 25 of 26 strong-suggest/scope findings from the critique sweep, one per\nsource file. Net 155+/189- — the intents got tighter: code/identifier/formula\nsyntax lifted to domain nouns (P-SPEC-STYLE), narration and weasels cut, and\nthe precision contradiction in drain_returns_items_then\n[…]\ne — a code change, out of scope for a prose-only pass.\n\nVerified: cargo check + aristo_check shape validation pass; full §6 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(intents): apply strong-suggest + scope critique findings to inten…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T21:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ddf23032541e52b202fd77ea46257311bd1728b2",
          "body": "The critique sweep (all dogfooded intents) produced 119 findings across 97\nintents. Every recurring cluster mapped to an EXISTING principle — code/\nidentifier-in-prose → P-SPEC-STYLE, silent-staleness scope → P-INVARIANT-AT-\nLOAD-BEARING-SITE, two-invariants → P-NO-DOUBLE-INTENT, narration → P-WHY-A\n[…]\np asides, dev-milestone refs, hardcoded counts).\n\nRemediation (applying the 119 findings to the source) is a separate triage task.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): §10A reflection on the 125-intent critique sweep",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T20:51:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f0b29f319ef593ae81919a4a77540be85ce16d43",
          "body": "docs(instrument): standardize the consumer-alias example on `aristo-instr`",
          "is_bot": false,
          "headline": "Merge pull request #56 from aretta-ai/docs/instrument-alias-aristo-instr",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-06-29T18:56:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88786ee3aad3fdf413fea82d8c37fe520d51a931",
          "body": "…nstr`\n\nThe instrument recipes, skill, and conventions used a mix of\n`differential-accessors` (the original/Turso name) and `fault-injection`\n(introduced with fault_point!) as the consumer feature-alias example. Unify\non a single name — `aristo-instr` — so the canonical examples read\nconsistently. T\n[…]\nes to the real `differential-accessors` name (the Turso\nfork's actual feature + branch) are left intact. Lands in 0.4.0 (pre-tag).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(instrument): standardize the consumer-alias example on `aristo-i…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T18:48:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93e26fe491e9c4dfc984c12fd09327c3c1728377",
          "body": "chore(release): v0.4.0",
          "is_bot": false,
          "headline": "Merge pull request #55 from aretta-ai/chore/release-0.4.0",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-06-29T18:29:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d8ba7e6d0765388412214bfb7a5f97501b4821d",
          "body": "Minor feature release. Bumps the workspace + inter-crate dep versions\n0.3.1 -> 0.4.0 and promotes CHANGELOG [Unreleased] -> [0.4.0] — 2026-06-29.\n\nHighlights:\n- feat(macros): fault_point! — fault-injection decision hook (additive;\n  yield_point! / set_hook unchanged).\n- docs(instrument): Recipes 9–1\n[…]\nment gap reports.\n- fix(macros): lint-clean generated Inspect accessors; field-spanned\n  clone-bound errors.\n\nNo breaking changes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.4.0",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T18:13:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15489456876112f3d3d80b79601e88c1a29befbd",
          "body": "docs(instrument): keyed-lookup recipe + clarify 0.3.0 generalized scalars (Turso audit)",
          "is_bot": false,
          "headline": "Merge pull request #54 from aretta-ai/docs/instrument-turso-audit-notes",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-06-29T17:45:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "665341698dee6ae8bb1c4db4421265924ccb44a7",
          "body": "From an audit of the Turso fork's aristo::instrument usage — most reported\n\"gaps\" were actually expressible under the current contract:\n\n- Recipe 14: keyed / parameterized lookups (e.g. `inspect_commit_ts(tx_id)`)\n  are out of Inspect's `&self`/one-field/no-param shape, and are not an\n  expose_pub t\n[…]\n existing method computes it; otherwise it's a harness-side\n  lookup. Also point the fault hook at fault_point!, not yield_point!.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(instrument): keyed-lookup recipe; clarify 0.3.0 generalized scalars",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T17:11:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1cbcbd15be02c6d232e88c2bb412de7353aa01b",
          "body": "feat(instrument): fault_point! — fault-injection decision hook",
          "is_bot": false,
          "headline": "Merge pull request #53 from aretta-ai/feat/instrument-fault-point",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-06-29T16:49:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9aedf97802a7574260f8fd65a8db258519813f8f",
          "body": "Recipe 11 (gated `pub use`) plus the matching skill pitfall now warn that\nre-exporting an item out of a private module turns it into public API (under\nthe feature), which can wake clippy lints that were dormant while it was\nprivate — e.g. `len_without_is_empty` on a `len`-bearing trait. Fix with a\n`\n[…]\nced by the bench: finch's BlockIo trait tripped len_without_is_empty\nonly under `instr`, once the C3 re-export made it public API.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(instrument): note that a gated re-export can wake public-API lints",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T16:06:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4267d1bf0ae5061ab75451dd602ac7b2998fb4e",
          "body": "- Recipe 13: `fault_point!` for interior faults — a point inside one operation\n  with no I/O-seam call (a non-I/O failure, or a crash mid-construction of a\n  single write). Shows the SUT branch + a capturing harness policy, and the\n  \"when NOT to use it\" boundary (seam-boundary faults live in your F\n[…]\nts\" section; correct yield_point! to observe-only (returns ()), so the\n  agent picks observe vs inject vs seam-fault deliberately.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(instrument): fault_point! recipe; refine the crash-seam recipe",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T15:38:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9eadc50c256b7438e7b86eace21c65fbeed402c8",
          "body": "Adds the fault-injection counterpart to yield_point!, the aristo half of the\naretta-bench crash/fault story. `fault_point!(\"label\")` returns a `Decision`\n(`Continue` / `Inject(u64)`) the SUT branches on; it is backed by a capturing,\nstateful `set_fault_hook(Option<FaultHook>)` so a harness can expre\n[…]\nrst: 6 runtime tests (default Continue, captured-counter fail-the-Nth,\nreplace/clear, re-entrancy-safe) + a trybuild pass fixture.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(macros): fault_point! — a fault-injection decision hook",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T15:35:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a245dd4c903db73ff96a59f07662b9fd8e504aca",
          "body": "instrument: close the aristo-side aretta-bench gaps (C2–C9)",
          "is_bot": false,
          "headline": "Merge pull request #52 from aretta-ai/feat/instrument-bench-gaps-wave1",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-06-29T15:22:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc8ec418093396e3332477ed7caee7a311409c89",
          "body": "Closes the docs portion of the remaining aretta-bench findings — all\ndocumentation, no macro change (each is either expressible today or, for\ncrash testing, intentionally SUT-side):\n\n- Recipe 11 (C3): reach a `pub` item trapped in a private module via a\n  feature-gated, doc-hidden crate-root `pub us\n[…]\nor I/O / fault\n  boundaries; observe a pure in-memory structure with a typed `Inspect`\n  projection, not a label-only yield point.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(instrument): re-export, pure-state, and crash-seam recipes",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T04:04:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "07575ae497403b4ca60cd64aba5c6ad36f63ccac",
          "body": "Bare `#[inspect]` (clone mode) on a non-`Clone` field previously reported the\ndeferred `Clone` bound on the whole `#[derive(Inspect)]` line, so the author\ncouldn't see which field was at fault. The clone-mode accessor is now emitted\nwith `quote_spanned!` at the field's type, so `FieldTy: Clone is no\n[…]\n); the message-injection variant is intentionally not pursued\n(it only reaches outermost-non-Clone fields and adds trait surface).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(macros): point the Inspect clone-bound error at the offending field",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T04:00:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f5251ac02930b6bfafd78a6f4462c5c8499703d",
          "body": "Documentation pass closing aretta-bench findings C7, C8, C9 — all about\nobserving private or nested state with #[derive(Inspect)] without leaking\ntypes. No code change; the projection grammar already expresses every case.\n\n- Recipe 9 (layered derive): reach an inner type's module-private fields\n  ac\n[…]\nconstruction. (C9)\n\nEach is mirrored into the aristo-instrumenting authoring skill so the agent\nsees the guidance, not only docs/.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(instrument): recipes for observing private and nested SUT state",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T02:55:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66c074f1faefe48a9c4d55d5f76ada22215bf1b8",
          "body": "…ect accessors\n\nA projection `ret` (or a clone-mode field type) can be arbitrarily nested —\ne.g. the natural per-SST `Vec<Vec<(Vec<u8>, Vec<u8>, u32)>>` shape — which\ntrips `clippy::type_complexity` on the *generated* accessor. The consumer\ncannot reach that codegen with an `#[allow]` (a derive-help\n[…]\nitted\ntokens are unit-testable; adds a token-level regression test asserting the\nallow is present. Closes aretta-bench finding C5.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(macros): emit #[allow(clippy::type_complexity)] on generated Insp…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-29T02:51:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3296ff0ca58b1e731af3a02049dbb46975bf9d21",
          "body": "chore(release): v0.3.1",
          "is_bot": false,
          "headline": "Merge pull request #51 from aretta-ai/chore/release-0.3.1",
          "author_name": "Adwait Godbole",
          "author_login": "adwait",
          "committed_at": "2026-06-28T23:44:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08573f40b70639be2d18ec3a0bd975a768b5ef24",
          "body": "Patch release bundling the post-0.3.0 [Unreleased] work:\n- metrics: `aristo metrics --json` adds by_verify_level + status_distribution (schema v2)\n- ci: release workflow publishes idempotently + manual workflow_dispatch re-run\n- skills: aristo-instrumenting projector-visibility note (pub(super) over\n[…]\nate types)\n\nBumps workspace + inter-crate dep versions 0.3.0 -> 0.3.1 and promotes\nCHANGELOG [Unreleased] -> [0.3.1] — 2026-06-28.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.3.1",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-28T23:38:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "205771fd208f1b1d93a47f4550edcc7823011ea2",
          "body": "A `with =` projector named from a child module, whose signature mentions a\nmodule-private value type, should be `pub(super)` not `pub(crate)` — the\nlatter trips rustc's `private_interfaces` lint. Surfaced by the first real\nconsumer (the Turso fork MVCC accessor migration).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): document projector visibility across modules",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-28T21:37:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "38254347845bcc95d75be35e3eeb35891377f13a",
          "body": "feat(metrics): add by-verify-level and status-distribution to `aristo metrics --json`",
          "is_bot": false,
          "headline": "Merge pull request #50 from aretta-ai/feat/metrics-breakdowns",
          "author_name": "Sushant Dinesh",
          "author_login": "sushant94",
          "committed_at": "2026-06-28T18:48:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "406c4f2e1384714af2589235ddb7a563116b3278",
          "body": "… recovery\n\nThe v0.3.0 publish hit a transient crates.io index error after aristo-macros\nand aristo had already uploaded, leaving aristo-core/aristo-cli unpublished. A\nplain re-run errored on \"already uploaded\". Make each publish skip a crate\nalready at the target version (any other error still fails), and add a\nworkflow_dispatch trigger so a partial publish can be finished by re-running.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(release): idempotent publishes + manual re-run for partial-failure…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-28T16:28:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b5b3dbde7ca9ea74d95b33e839c1a9cccde26139",
          "body": "Minor release bundling two breaking changes.\n\nWorkflow (index-as-local-cache, Option B):\n- `.aristo/index.toml` is a gitignored, regenerable local cache; reads rebuild it on demand.\n- CI freshness gated by `aristo verify --audit [--strict]`, replacing `aristo stamp --check`.\n- `aristo init` gitignor\n[…]\norkspace.package].version` and the internal `[workspace.dependencies]` pins 0.2.9 -> 0.3.0, and promotes CHANGELOG `[Unreleased]` to `[0.3.0]`.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.3.0",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-28T09:08:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "95e5fb152fe63476071a434823e94e661ab60891",
          "body": "…on forms\n\nMake the named-projector `with` form the canonical recipe for\nsnapshotting a foreign / concurrent collection (with filter + fan-out),\nand add bare-`#[inspect]` clone, inline-closure, and atomic / lock-guarded\nrecipes. Remove the old `#[inspect(T)]` / `From<&V>` SkipMap examples.\nUpdate th\n[…]\n to the new spellings\n(`#[inspect]`, `#[inspect(name = \"x\")]`, `#[inspect(ret = T, with = …)]`)\nand drop the positional / `snapshot =` grammar.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: refresh instrument recipes + conventions for the clone/projecti…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-28T09:02:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "03e5a31bc16be9fd4d3106fad7a59595d65347b8",
          "body": "… 0.3.0 breaking change\n\nMark the ADR's \"Implementation debt — Inspect narrowed to SkipMap\"\nsection RESOLVED as of v0.3.0, keeping the historical narrative intact.\nThe widening was achieved not by the per-shape codegen the section\nanticipated, but by making projection a whole-field `with`-closure, s\n[…]\nanding\n\"field-shape widening\" work item and update the Negative consequence\nbullet. Reconcile the matching forward-looking claim in ROADMAP.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(decisions): close the Inspect SkipMap-narrowing debt; record the…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-28T09:00:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7402be4354f1d60810d09d65530c37cafc2185ee",
          "body": "…n contract\n\nRewrite the `aristo-instrumenting` skill's `Inspect` section for the\ntype-agnostic derive that landed in 0.3.0. Bare `#[inspect]` now clones\nany `Clone` field (returning the field's own type verbatim);\n`#[inspect(ret = T, with = <projector>)]` projects everything else via a\n`Fn(&FieldTy\n[…]\now reachable via clone / `with`, and\nhand-written `inspect_*` accessors are forbidden (the SDK macros are the\nonly sanctioned instrumentation).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): update the instrumenting skill to the clone + projectio…",
          "author_name": "Adwait",
          "author_login": "adwait",
          "committed_at": "2026-06-28T08:58:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 27,
      "commits_last_year": 501,
      "latest_release_at": "2026-07-22T23:57:00Z",
      "latest_release_tag": "v0.6.0",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "aristo",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "sdk",
            "verification",
            "annotation",
            "proof",
            "intent",
            "development-tools",
            "development-tools::testing"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/aristo",
          "is_deprecated": false,
          "latest_version": "0.6.0",
          "repository_url": "https://github.com/aretta-ai/aristo",
          "versions_count": 19,
          "total_downloads": 100981,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 33660,
          "first_published_at": "2026-05-29T19:12:43.827047Z",
          "latest_published_at": "2026-07-22T23:57:30.502834Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "aristo-cli",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "sdk",
            "verification",
            "annotation",
            "proof",
            "intent",
            "command-line-utilities",
            "development-tools"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/aristo-cli",
          "is_deprecated": false,
          "latest_version": "0.6.0",
          "repository_url": "https://github.com/aretta-ai/aristo",
          "versions_count": 19,
          "total_downloads": 894,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 298,
          "first_published_at": "2026-05-29T20:10:08.767207Z",
          "latest_published_at": "2026-07-22T23:58:26.945413Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "aristo-core",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "sdk",
            "verification",
            "annotation",
            "proof",
            "intent",
            "development-tools",
            "parsing"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/aristo-core",
          "is_deprecated": false,
          "latest_version": "0.6.0",
          "repository_url": "https://github.com/aretta-ai/aristo",
          "versions_count": 19,
          "total_downloads": 1004,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 335,
          "first_published_at": "2026-05-29T19:13:49.270647Z",
          "latest_published_at": "2026-07-22T23:58:02.418192Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "aristo-macros",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "sdk",
            "verification",
            "annotation",
            "proof",
            "intent",
            "development-tools",
            "development-tools::procedural-macro-helpers"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/aristo-macros",
          "is_deprecated": false,
          "latest_version": "0.6.0",
          "repository_url": "https://github.com/aretta-ai/aristo",
          "versions_count": 19,
          "total_downloads": 101074,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 33691,
          "first_published_at": "2026-05-29T19:12:26.286402Z",
          "latest_published_at": "2026-07-22T23:57:26.054763Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 32,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-06",
            "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": [
        "crates/aristo-cli/tests/cmd/active/lang_detect_c.in/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml",
        "crates/aristo-cli/Cargo.toml",
        "crates/aristo-cli/tests/cmd/active/lang_detect_rust.in/Cargo.toml",
        "crates/aristo-core/Cargo.toml",
        "crates/aristo-macros/Cargo.toml",
        "crates/aristo/Cargo.toml"
      ],
      "largest_source_bytes": 73897,
      "source_files_sampled": 268,
      "oversized_source_files": 4,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 22376
    },
    "dependencies": {
      "manifests": [
        "Cargo.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"
      ],
      "dependencies": [
        {
          "name": "aristo",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "aristo-core",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "anstyle",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "anstream",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6"
        },
        {
          "name": "badge-maker",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3.1"
        },
        {
          "name": "clap",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4.5"
        },
        {
          "name": "dirs",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "5.0"
        },
        {
          "name": "getrandom",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "proc-macro2",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "serde",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "serde_json",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "syn",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.0"
        },
        {
          "name": "textwrap",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.16"
        },
        {
          "name": "time",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "toml",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "walkdir",
          "manifest": "crates/aristo-cli/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.5"
        },
        {
          "name": "aristo",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "globset",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "proc-macro2",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "schemars",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "semver",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "serde_json",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "sha2",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "syn",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.0"
        },
        {
          "name": "thiserror",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.0"
        },
        {
          "name": "time",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "toml",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "tree-sitter",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.24"
        },
        {
          "name": "tree-sitter-c",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.23"
        },
        {
          "name": "ureq",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3.3"
        },
        {
          "name": "walkdir",
          "manifest": "crates/aristo-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.5"
        },
        {
          "name": "proc-macro2",
          "manifest": "crates/aristo-macros/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "quote",
          "manifest": "crates/aristo-macros/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "syn",
          "manifest": "crates/aristo-macros/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2.0"
        },
        {
          "name": "aristo-macros",
          "manifest": "crates/aristo/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 63,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 6
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "sushant94",
          "commits": 408,
          "avatar_url": "https://avatars.githubusercontent.com/u/3993360?v=4"
        },
        {
          "type": "User",
          "login": "adwait",
          "commits": 93,
          "avatar_url": "https://avatars.githubusercontent.com/u/32107329?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.814
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "aristo.yml",
        "ci.yml",
        "notify-docs.yml",
        "release.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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/4 approved changesets -- score normalized to 0",
            "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": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "68007feacbc18f6a8cdd692be74975d9cf68a055",
        "ran_at": "2026-07-23T14:11:03Z",
        "aggregate_score": 4.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T23:58:36Z",
      "oldest_open_prs": [
        {
          "number": 68,
          "created_at": "2026-07-06T20:09:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 69,
          "created_at": "2026-07-06T22:25:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 70,
          "created_at": "2026-07-07T01:23:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-22T23:57:00Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/aretta-ai/aristo",
    "host": "github.com",
    "name": "aristo",
    "owner": "aretta-ai"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 61,
      "inputs": {
        "security": 44,
        "vitality": 71,
        "community": 62,
        "governance": 54,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 71,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "commits_last_year": 501,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 8
            },
            "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": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "501 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 501
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 27,
              "latest_release_tag": "v0.6.0",
              "releases_from_tags": true,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "27 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "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 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 62,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "forks": 1,
              "stars": 32,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "32 stars",
                "points": 24.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "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": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "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": 81,
            "inputs": {
              "packages": [
                "aristo",
                "aristo-cli",
                "aristo-core",
                "aristo-macros"
              ],
              "dependents": null,
              "ecosystems": "crates",
              "total_downloads": 203953,
              "monthly_downloads": 67984
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "67,984 downloads/month across crates",
                "points": 64.4,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 67984,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "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": 54,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 22,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.814
            },
            "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 81% of commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 81
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 66,
            "inputs": {
              "merged_prs": 63,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 6
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "63/69 decided PRs merged",
                "points": 34.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 63,
                      "decided": 69
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/4 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "followers": 2,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "aretta-ai",
              "public_repos": 10,
              "account_age_days": 154
            },
            "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": "2 followers of aretta-ai",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "aretta-ai"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "10 public repos, account ~0 yr old",
                "points": 8.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 10
                    }
                  },
                  {
                    "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": [
                "aristo",
                "aristo-cli",
                "aristo-core",
                "aristo-macros"
              ],
              "ecosystems": "crates",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "4 package(s) on crates",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 4,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "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": "19 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "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": 71,
        "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": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "cli",
                "code-verification",
                "coding-agents",
                "formal-methods",
                "mit-license",
                "rust",
                "verification",
                "design-by-contract"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 44,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/4 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 3
            },
            "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": 75,
        "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.97,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 22376
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "97 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 97,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "crates/aristo-cli/tests/cmd/active/lang_detect_c.in/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.76,
              "toolchain_manifests": [
                "Cargo.toml",
                "crates/aristo-cli/Cargo.toml",
                "crates/aristo-cli/tests/cmd/active/lang_detect_rust.in/Cargo.toml",
                "crates/aristo-core/Cargo.toml",
                "crates/aristo-macros/Cargo.toml",
                "crates/aristo/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "crates/aristo-cli/tests/cmd/active/lang_detect_c.in/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "crates/aristo-cli/tests/cmd/active/lang_detect_c.in/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "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": "76 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 76,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 73897,
              "source_files_sampled": 268,
              "oversized_source_files": 4
            },
            "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": "4/268 source files over 60KB",
                "points": 54.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 268,
                      "oversized": 4
                    }
                  }
                ],
                "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:aristo@0.6.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T14:11:21.723959Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/aretta-ai/aristo.svg",
  "full_name": "aretta-ai/aristo",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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