Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-24 16:06 UTC

dial9-rs / dial9

Tokio Telemetry you can run in production

Rust · TypeScript · JavaScriptApache-2.0★ 418 estrellas⑂ 38 forksdesde feb 2026Ver en GitHub ↗

dial9-rs/dial9 tiene un índice de salud de 69 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (83/100) y la más baja, Security (60/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

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

69
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

dial9-rsOrganización
3 seguidores2 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.iodial90.3.131549hace 0 díastelemetryprofilingtokiotracingasynchronous
crates.iodial9-core0.5.0-rc0111hace 0 días
crates.iodial9-macro0.3.756.7909hace 0 días
crates.iodial9-utils0.5.0-rc061hace 0 días
crates.iodial9-viewer0.3.1349317hace 0 días
crates.iodial9-perf-self-profile0.4.331.94415hace 0 días
crates.iodial9-trace-format0.4.161.41811hace 0 días
crates.iodial9-tokio-telemetry0.3.1561.37521hace 0 díastelemetryprofilingtokiotracingsymposiumasynchronous

Métricas por categoría

Vitalidad

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

83Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
15.2/36Cadencia de commits — 22/52 semanas con commits
18/18Volumen de commits — 407 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year407
human_commit_share0,99
days_since_last_push0
active_weeks_last_year22
Cómo se puntúa
27/27Publica versiones — 85 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~0,4 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count85
latest_release_tagdial9-v0.5.0-rc1
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases0,4

Comunidad y Adopción

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

70Bueno · 18% del índice global
Cómo se puntúa
42.5/60Estrellas — 418 estrellas
13.1/25Forks — 38 forks
1.7/15Observadores — 3 observadores
Datos de entrada utilizados
forks38
stars418
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
71/80Descargas mensuales — 212.191 descargas/mes en crates
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesdial9, dial9-core, dial9-macro, dial9-utils, dial9-viewer, dial9-perf-self-profile, dial9-trace-format, dial9-tokio-telemetry
dependents
ecosystemscrates
total_downloads683.959
monthly_downloads212.191
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?

62Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
9.3/22.5Distribución de commits — el principal contribuyente firma el 59% de los commits
13.5/13.5Amplitud de contribuyentes — 27 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 15 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled27
top_contributor_share0,587
Cómo se puntúa
28/46.8Resolución de issues — 60% de issues cerradas
34.4/38.3Aceptación de PR — 414/460 PR decididos fusionados
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Datos de entrada utilizados
merged_prs414
open_issues97
closed_issues145
issue_closed_ratio0,599
closed_unmerged_prs46
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
4.3/25Alcance del propietario — 3 seguidores de dial9-rs
4.3/25Trayectoria — 2 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers3
owner_typeOrganization
is_verified
owner_logindial9-rs
public_repos2
account_age_days153
Cómo se puntúa
25/25Publicado y resoluble — 8 paquete(s) en crates
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 21 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesdial9, dial9-core, dial9-macro, dial9-utils, dial9-viewer, dial9-perf-self-profile, dial9-trace-format, dial9-tokio-telemetry
ecosystemscrates
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

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

Documentación

65Moderado
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
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
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?

60Moderado · 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 — 30 out of 30 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
7.5/7.5Code-Review — all changesets reviewed
2.5/2.5Contributors — project has 15 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
4.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 9
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 — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, packaging. 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 — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 98 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes8011
Cómo se puntúa
12.6/18Arranque con un solo comando — Cargo.toml, dial9-core/Cargo.toml, dial9-macro/Cargo.toml (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — dial9-viewer/ui/tsconfig.json
10/10Entorno reproducible — Dockerfile, lockfile
6/10Práctica demostrada con agentes — 3 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
9/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 9
Datos de entrada utilizados
has_nixno
has_tests
lockfilesCargo.lock, package-lock.json
has_dockerfile
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configsdial9-viewer/ui/tsconfig.json
agent_commit_share0,03
toolchain_manifestsCargo.toml, dial9-core/Cargo.toml, dial9-macro/Cargo.toml, dial9-tokio-telemetry/Cargo.toml, dial9-trace-format-derive/Cargo.toml, dial9-trace-format/Cargo.toml, dial9-trace-format/fuzz/Cargo.toml, dial9-utils/Cargo.toml, dial9-viewer/Cargo.toml, dial9/Cargo.toml, examples/memory-local/Cargo.toml, examples/metrics-service/Cargo.toml, examples/simple-local/Cargo.toml, perf-self-profile/Cargo.toml
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
53.9/55Tamaños de archivo manejables — 14/685 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes286.549
source_files_sampled685
oversized_source_files14
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

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

Más detalle

Historial de estrellas y forks 0 ★ / 38 ⇿
0Estrellas
38Forks
72Versiones

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

01325383742026-032026-052026-07
Mayor 0Menor 0Parche 0
OpenSSF Scorecard 6.0 / 10
6.0agregado

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-24 16:05 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: githubv4.Query: non-200 OK status code: 504 Gateway Timeout body: "{\"message\": \"We couldn't respond to your request in time. Sorry about that. Please try resubmitting your request and contact us if the problem persists.\"}\r\n"
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 15 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
9Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 9
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
1Vulnerabilities9 existing vulnerabilities detected
Dependencias directas 110
RegistroPaqueteRestricción de versiónManifiesto
crates.iobon3dial9-core/Cargo.toml
crates.iobytes1dial9-core/Cargo.toml
crates.iocrossbeam-queue0.3dial9-core/Cargo.toml
crates.ioulid1dial9-core/Cargo.toml
crates.iodial9-trace-formatdial9-core/Cargo.toml
crates.iolibcdial9-core/Cargo.toml
crates.iotokio1dial9-core/Cargo.toml
crates.iotokio-util0.7dial9-core/Cargo.toml
crates.iofutures-util0.3dial9-core/Cargo.toml
crates.ioflate21dial9-core/Cargo.toml
crates.iometrique0.1.23dial9-core/Cargo.toml
crates.iometrique-timesource0.1dial9-core/Cargo.toml
crates.ioshuttle0.9.1dial9-core/Cargo.toml
crates.iotracing0.1.44dial9-core/Cargo.toml
crates.iosyn2dial9-macro/Cargo.toml
crates.ioquote1dial9-macro/Cargo.toml
crates.ioproc-macro21dial9-macro/Cargo.toml
crates.iotokio1.52.0dial9-tokio-telemetry/Cargo.toml
crates.iotokio-util0.7dial9-tokio-telemetry/Cargo.toml
crates.ioarc-swap1dial9-tokio-telemetry/Cargo.toml
crates.iolibcdial9-tokio-telemetry/Cargo.toml
crates.iofutures-util0.3dial9-tokio-telemetry/Cargo.toml
crates.iopin-project-lite0.2dial9-tokio-telemetry/Cargo.toml
crates.ioserde1dial9-tokio-telemetry/Cargo.toml
crates.ioserde_json1dial9-tokio-telemetry/Cargo.toml
crates.iosmallvec1dial9-tokio-telemetry/Cargo.toml
crates.iobytes1dial9-tokio-telemetry/Cargo.toml
crates.iodial9-perf-self-profiledial9-tokio-telemetry/Cargo.toml
crates.iodial9-trace-formatdial9-tokio-telemetry/Cargo.toml
crates.iotracing0.1.44dial9-tokio-telemetry/Cargo.toml
crates.iotracing-subscriber0.3dial9-tokio-telemetry/Cargo.toml
crates.iohostname0.4dial9-tokio-telemetry/Cargo.toml
crates.iobon3dial9-tokio-telemetry/Cargo.toml
crates.ioaws-sdk-s31dial9-tokio-telemetry/Cargo.toml
crates.ioaws-config1dial9-tokio-telemetry/Cargo.toml
crates.ioflate21dial9-tokio-telemetry/Cargo.toml
crates.iotime0.3dial9-tokio-telemetry/Cargo.toml
crates.iometrique0.1.23dial9-tokio-telemetry/Cargo.toml
crates.iometrique-timesource0.1dial9-tokio-telemetry/Cargo.toml
crates.ioshuttle0.9.1dial9-tokio-telemetry/Cargo.toml
crates.iodial9-coredial9-tokio-telemetry/Cargo.toml
crates.iodial9-utilsdial9-tokio-telemetry/Cargo.toml
crates.iosyn2dial9-trace-format-derive/Cargo.toml
crates.ioquote1dial9-trace-format-derive/Cargo.toml
crates.ioproc-macro21dial9-trace-format-derive/Cargo.toml
crates.iodial9-trace-format-derivedial9-trace-format/Cargo.toml
crates.ioserde1dial9-trace-format/Cargo.toml
crates.iodial9-coredial9-utils/Cargo.toml
crates.iobon3dial9-utils/Cargo.toml
crates.iotokio1dial9-utils/Cargo.toml
crates.iotracing0.1.44dial9-utils/Cargo.toml
crates.ioaws-sdk-s31dial9-utils/Cargo.toml
crates.ioaws-config1dial9-utils/Cargo.toml
crates.iotime0.3dial9-utils/Cargo.toml
crates.iohostname0.4dial9-utils/Cargo.toml
crates.ioserde1dial9-utils/Cargo.toml
crates.ioserde_json1dial9-utils/Cargo.toml
crates.ioaxum0.8dial9-viewer/Cargo.toml
crates.ioaxum-extra0.10dial9-viewer/Cargo.toml
crates.iobytes1dial9-viewer/Cargo.toml
crates.ioclap4dial9-viewer/Cargo.toml
crates.ioflate21dial9-viewer/Cargo.toml
crates.iofutures0.3dial9-viewer/Cargo.toml
crates.ioserde1dial9-viewer/Cargo.toml
crates.ioserde_json1dial9-viewer/Cargo.toml
crates.iotokio1dial9-viewer/Cargo.toml
crates.iorust-embed8dial9-viewer/Cargo.toml
crates.iomime_guess2dial9-viewer/Cargo.toml
crates.iotower-http0.6dial9-viewer/Cargo.toml
crates.iouuid1dial9-viewer/Cargo.toml
crates.ioform_urlencoded1dial9-viewer/Cargo.toml
crates.iotracing0.1dial9-viewer/Cargo.toml
crates.iotracing-subscriber0.3dial9-viewer/Cargo.toml
crates.iometrique0.1.23dial9-viewer/Cargo.toml
crates.iometrique-writer0.1dial9-viewer/Cargo.toml
crates.iotime0.3dial9-viewer/Cargo.toml
crates.ioaws-config1dial9-viewer/Cargo.toml
crates.ioaws-sdk-s31dial9-viewer/Cargo.toml
crates.ioanyhow1dial9-viewer/Cargo.toml
crates.iobon3dial9-viewer/Cargo.toml
crates.ios3s0.14.1dial9-viewer/Cargo.toml
crates.ios3s-fs0.14.1dial9-viewer/Cargo.toml
crates.ios3s-aws0.14.1dial9-viewer/Cargo.toml
crates.iotempfile3dial9-viewer/Cargo.toml
crates.iodial9-trace-formatdial9-viewer/Cargo.toml
crates.ioarrow54dial9-viewer/Cargo.toml
crates.ioparquet54dial9-viewer/Cargo.toml
crates.ioblake31dial9-viewer/Cargo.toml
crates.iolasso0.7dial9-viewer/Cargo.toml
crates.iorustc-hash2dial9-viewer/Cargo.toml
crates.iodial9-coredial9-viewer/Cargo.toml
crates.iohex0.4dial9-viewer/Cargo.toml
crates.iourlencoding2dial9-viewer/Cargo.toml
crates.iodial9-coredial9/Cargo.toml
crates.iodial9-perf-self-profiledial9/Cargo.toml
crates.iodial9-tokio-telemetry0.5.0-rc0dial9/Cargo.toml
crates.iodial9-macrodial9/Cargo.toml
crates.iodial9-viewer0.5.0-rc1dial9/Cargo.toml
crates.ioanyhow1dial9/Cargo.toml
crates.iotokio1.52.0dial9/Cargo.toml
crates.iobon3dial9/Cargo.toml
crates.iotracing0.1.44dial9/Cargo.toml
crates.iobon3perf-self-profile/Cargo.toml
crates.iobytes1perf-self-profile/Cargo.toml
crates.iocrossbeam-queue0.3perf-self-profile/Cargo.toml
crates.iodial9-coreperf-self-profile/Cargo.toml
crates.iodial9-trace-formatperf-self-profile/Cargo.toml
crates.ioscc2perf-self-profile/Cargo.toml
crates.iotokio1perf-self-profile/Cargo.toml
crates.iotracing0.1.44perf-self-profile/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": [],
      "is_fork": false,
      "size_kb": 75604,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "CSS": 85778,
        "HTML": 699160,
        "Rust": 3638067,
        "Shell": 43544,
        "Python": 5491,
        "JavaScript": 980781,
        "TypeScript": 2620310
      },
      "pushed_at": "2026-07-24T15:13:25Z",
      "created_at": "2026-02-21T00:30:49Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-24T14:07:19Z",
      "description": "Tokio Telemetry you can run in production",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust",
        "TypeScript",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "dial9-rs",
      "company": null,
      "location": null,
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/262900814?v=4",
      "created_at": "2026-02-20T21:52:41Z",
      "is_verified": null,
      "public_repos": 2,
      "account_age_days": 153
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "dial9-v0.5.0-rc1",
          "kind": "other",
          "published_at": "2026-07-24T14:51:41Z"
        },
        {
          "tag": "dial9-viewer-v0.5.0-rc1",
          "kind": "other",
          "published_at": "2026-07-24T14:51:20Z"
        },
        {
          "tag": "dial9-v0.5.0-rc0",
          "kind": "other",
          "published_at": "2026-07-24T01:44:55Z"
        },
        {
          "tag": "dial9-viewer-v0.5.0-rc0",
          "kind": "other",
          "published_at": "2026-07-24T01:44:36Z"
        },
        {
          "tag": "dial9-macro-v0.5.0-rc0",
          "kind": "other",
          "published_at": "2026-07-23T21:21:37Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.5.0-rc0",
          "kind": "other",
          "published_at": "2026-07-23T21:21:29Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.5.0-rc0",
          "kind": "other",
          "published_at": "2026-07-23T21:21:11Z"
        },
        {
          "tag": "dial9-trace-format-v0.5.0-rc0",
          "kind": "other",
          "published_at": "2026-07-23T20:59:09Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.5.0-rc0",
          "kind": "other",
          "published_at": "2026-07-23T20:58:59Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.15",
          "kind": "other",
          "published_at": "2026-07-20T14:50:07Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.14",
          "kind": "other",
          "published_at": "2026-07-09T14:22:46Z"
        },
        {
          "tag": "dial9-v0.3.13",
          "kind": "other",
          "published_at": "2026-05-30T15:03:29Z"
        },
        {
          "tag": "dial9-viewer-v0.3.13",
          "kind": "other",
          "published_at": "2026-05-30T15:03:19Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.13",
          "kind": "other",
          "published_at": "2026-05-30T15:01:52Z"
        },
        {
          "tag": "dial9-v0.3.12",
          "kind": "other",
          "published_at": "2026-05-28T23:31:12Z"
        },
        {
          "tag": "dial9-viewer-v0.3.12",
          "kind": "other",
          "published_at": "2026-05-28T23:31:00Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.12",
          "kind": "other",
          "published_at": "2026-05-28T23:29:37Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.4.3",
          "kind": "other",
          "published_at": "2026-05-28T23:29:02Z"
        },
        {
          "tag": "dial9-trace-format-v0.4.1",
          "kind": "other",
          "published_at": "2026-05-28T23:28:47Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.4.1",
          "kind": "other",
          "published_at": "2026-05-28T23:28:38Z"
        },
        {
          "tag": "dial9-macro-v0.3.7",
          "kind": "other",
          "published_at": "2026-05-28T22:21:37Z"
        },
        {
          "tag": "dial9-v0.3.11",
          "kind": "other",
          "published_at": "2026-05-22T17:55:29Z"
        },
        {
          "tag": "dial9-viewer-v0.3.11",
          "kind": "other",
          "published_at": "2026-05-22T17:55:18Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.11",
          "kind": "other",
          "published_at": "2026-05-22T17:53:48Z"
        },
        {
          "tag": "dial9-v0.3.10",
          "kind": "other",
          "published_at": "2026-05-18T01:34:59Z"
        },
        {
          "tag": "dial9-viewer-v0.3.10",
          "kind": "other",
          "published_at": "2026-05-18T01:34:48Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.10",
          "kind": "other",
          "published_at": "2026-05-18T01:33:19Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.4.2",
          "kind": "other",
          "published_at": "2026-05-18T01:32:48Z"
        },
        {
          "tag": "dial9-v0.3.9",
          "kind": "other",
          "published_at": "2026-05-14T21:02:00Z"
        },
        {
          "tag": "dial9-viewer-v0.3.9",
          "kind": "other",
          "published_at": "2026-05-14T21:01:47Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.9",
          "kind": "other",
          "published_at": "2026-05-14T21:00:21Z"
        },
        {
          "tag": "dial9-v0.3.8",
          "kind": "other",
          "published_at": "2026-05-09T01:27:17Z"
        },
        {
          "tag": "dial9-viewer-v0.3.8",
          "kind": "other",
          "published_at": "2026-05-09T00:24:10Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.8",
          "kind": "other",
          "published_at": "2026-05-09T00:22:46Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.4.1",
          "kind": "other",
          "published_at": "2026-05-09T00:22:10Z"
        },
        {
          "tag": "dial9-trace-format-v0.4.0",
          "kind": "other",
          "published_at": "2026-05-09T00:21:57Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.4.0",
          "kind": "other",
          "published_at": "2026-05-09T00:21:50Z"
        },
        {
          "tag": "dial9-viewer-v0.3.7",
          "kind": "other",
          "published_at": "2026-05-04T20:53:06Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.7",
          "kind": "other",
          "published_at": "2026-05-04T20:51:40Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.4.0",
          "kind": "other",
          "published_at": "2026-05-04T20:51:07Z"
        },
        {
          "tag": "dial9-macro-v0.3.6",
          "kind": "other",
          "published_at": "2026-05-04T20:50:52Z"
        },
        {
          "tag": "dial9-viewer-v0.3.6",
          "kind": "other",
          "published_at": "2026-05-01T19:14:15Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.6",
          "kind": "other",
          "published_at": "2026-05-01T19:12:46Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.3.6",
          "kind": "other",
          "published_at": "2026-05-01T19:12:13Z"
        },
        {
          "tag": "dial9-trace-format-v0.3.6",
          "kind": "other",
          "published_at": "2026-05-01T19:12:00Z"
        },
        {
          "tag": "dial9-viewer-v0.3.5",
          "kind": "other",
          "published_at": "2026-04-24T17:43:28Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.5",
          "kind": "other",
          "published_at": "2026-04-24T17:41:51Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.3.5",
          "kind": "other",
          "published_at": "2026-04-24T17:41:17Z"
        },
        {
          "tag": "dial9-trace-format-v0.3.5",
          "kind": "other",
          "published_at": "2026-04-24T17:41:02Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.3.5",
          "kind": "other",
          "published_at": "2026-04-24T17:40:55Z"
        },
        {
          "tag": "dial9-macro-v0.3.5",
          "kind": "other",
          "published_at": "2026-04-24T17:40:48Z"
        },
        {
          "tag": "dial9-viewer-v0.3.4",
          "kind": "other",
          "published_at": "2026-04-23T18:47:23Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.4",
          "kind": "other",
          "published_at": "2026-04-23T18:45:54Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.3.4",
          "kind": "other",
          "published_at": "2026-04-23T18:45:22Z"
        },
        {
          "tag": "dial9-trace-format-v0.3.4",
          "kind": "other",
          "published_at": "2026-04-23T18:45:08Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.3.4",
          "kind": "other",
          "published_at": "2026-04-23T18:45:02Z"
        },
        {
          "tag": "dial9-macro-v0.3.4",
          "kind": "other",
          "published_at": "2026-04-23T18:44:56Z"
        },
        {
          "tag": "dial9-viewer-v0.3.3",
          "kind": "other",
          "published_at": "2026-04-21T00:22:57Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.3",
          "kind": "other",
          "published_at": "2026-04-21T00:21:20Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.3.3",
          "kind": "other",
          "published_at": "2026-04-21T00:20:49Z"
        },
        {
          "tag": "dial9-trace-format-v0.3.3",
          "kind": "other",
          "published_at": "2026-04-21T00:20:37Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.3.3",
          "kind": "other",
          "published_at": "2026-04-21T00:20:29Z"
        },
        {
          "tag": "dial9-macro-v0.3.3",
          "kind": "other",
          "published_at": "2026-04-21T00:20:25Z"
        },
        {
          "tag": "dial9-viewer-v0.3.2",
          "kind": "other",
          "published_at": "2026-04-20T23:16:01Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.2",
          "kind": "other",
          "published_at": "2026-04-20T23:14:31Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.3.2",
          "kind": "other",
          "published_at": "2026-04-20T23:13:59Z"
        },
        {
          "tag": "dial9-trace-format-v0.3.2",
          "kind": "other",
          "published_at": "2026-04-20T23:13:46Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.3.2",
          "kind": "other",
          "published_at": "2026-04-20T23:13:41Z"
        },
        {
          "tag": "dial9-macro-v0.3.2",
          "kind": "other",
          "published_at": "2026-04-20T23:13:35Z"
        },
        {
          "tag": "dial9-viewer-v0.3.1",
          "kind": "other",
          "published_at": "2026-04-20T20:00:41Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.1",
          "kind": "other",
          "published_at": "2026-04-19T17:57:48Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.3.1",
          "kind": "other",
          "published_at": "2026-04-19T17:57:17Z"
        },
        {
          "tag": "dial9-trace-format-v0.3.1",
          "kind": "other",
          "published_at": "2026-04-19T17:57:03Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.3.1",
          "kind": "other",
          "published_at": "2026-04-19T17:56:56Z"
        },
        {
          "tag": "dial9-macro-v0.3.1",
          "kind": "other",
          "published_at": "2026-04-19T17:56:50Z"
        },
        {
          "tag": "dial9-viewer-v0.3.0",
          "kind": "other",
          "published_at": "2026-04-18T01:25:27Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.3.0",
          "kind": "other",
          "published_at": "2026-04-18T01:23:37Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.3.0",
          "kind": "other",
          "published_at": "2026-04-18T01:22:47Z"
        },
        {
          "tag": "dial9-trace-format-v0.3.0",
          "kind": "other",
          "published_at": "2026-04-18T01:21:46Z"
        },
        {
          "tag": "dial9-trace-format-derive-v0.3.0",
          "kind": "other",
          "published_at": "2026-04-18T01:21:07Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.2.0",
          "kind": "other",
          "published_at": "2026-03-20T16:36:23Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.2.0",
          "kind": "other",
          "published_at": "2026-03-20T16:35:37Z"
        },
        {
          "tag": "dial9-tokio-telemetry-v0.1.1",
          "kind": "other",
          "published_at": "2026-03-03T02:11:14Z"
        },
        {
          "tag": "dial9-perf-self-profile-v0.1.1",
          "kind": "other",
          "published_at": "2026-03-03T02:10:44Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-03-01T21:01:47Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "755d86393c4bfe4423aa72038c015296bfc3c3db",
          "body": "* chore: release\n\n* chore: release 0.5.0-rc1; make dial9 the changelog aggregator\n\n---------\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\nCo-authored-by: Julian <julian@wyeworks.com>",
          "is_bot": true,
          "headline": "chore: release v0.5.0-rc.1 (#709)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T13:56:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcbc00f2489fb3eb6641b9696271106b3c912897",
          "body": "* feat(viewer): support multi-service S3 browsing\n\n* fix(viewer): fix five multi-service browse bugs\n\n- actions-bar: use profileSel.bytes (not nullable sel.bytes) in the\n  size-cap warning, fixing a null-deref when the cap is driven by\n  full-service segments with no box selection.\n- index.html: cle\n[…]\netch mock made\nmock.calls[n][0] index an empty tuple (TS2493). Give it a typed\n_url parameter, matching the other fetch mock in this file.\n\n* docs: remove internal design doc referencing Taskei ticket",
          "is_bot": false,
          "headline": "Add support for service-awareness in the browser (#711)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-24T13:21:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2d254f2b3e71e44f567f011686842f979565d9e4",
          "body": "…#712)\n\n* fix(dial9): viewer/CLI off by default\n\n* update changelog\n\n* test(dial9): gate cli_trace_shape behind the cli feature\n\n* ci: build binstall binary with cli, smoke-test it\n\n* fix(dial9): set tokio_unstable for docs.rs build",
          "is_bot": false,
          "headline": "refactor: make viewer/cli feature off by default & update changelog (…",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-07-24T12:15:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90d973ad0943db09e6d6b8f0d542d31baf015342",
          "body": null,
          "is_bot": false,
          "headline": "fix(release): allow-dirty publish for dial9-viewer (#710)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-07-23T23:51:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcd33aec39f974adf7fd0b34c52a42178fc41e13",
          "body": "The columnar path routes SPAN events out of customEvents into a separate\nspan-event store, so an all-span trace (e.g. a shale trace of only\nSpanEnter__/SpanExit__) leaves customEvents empty while the spans live in\nprecomputedSpanData. computeSpanTrackData bailed to EMPTY_SPAN_TRACK_DATA on\nempty customEvents, dropping the Spans track entirely. Only bail when there is\nneither precomputed span data nor events to build it from.",
          "is_bot": false,
          "headline": "fix(viewer): render spans for all-span traces in new viewer (#705)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-23T20:58:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0e712ab955d853b26b232a6658489994a07feaf",
          "body": null,
          "is_bot": false,
          "headline": "Delete HANDOFF.md (#707)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-23T18:32:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27ac964c35be71884241be50d075911298323cda",
          "body": "Record the number of alive tasks via RuntimeMetrics::num_alive_tasks()\nin each QueueSampleEvent sample. This gives visibility into task\nlifecycle pressure alongside the existing global queue depth metric.\n\n- Wire format: new `active_tasks: u64` field (LEB128 encoded)\n- Analysis: `active_tasks: Option<u64>` (None for old traces)\n- Source: summed from all attached runtimes via Tokio metrics",
          "is_bot": false,
          "headline": "feat: add active task count to QueueSampleEvent (#496) (#675)",
          "author_name": "Scriptize",
          "author_login": "Scriptize",
          "committed_at": "2026-07-23T17:04:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90e06a29006a28f1b61711526a3d5474bbf0ec28",
          "body": null,
          "is_bot": false,
          "headline": "fix(viewer): deflake tight-loop recipe snippet test (#706)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-07-23T17:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9c77785cf9f2feddca86be65cc9d4d002d0bd46",
          "body": null,
          "is_bot": false,
          "headline": "fix(viewer): carry queue step line's true level, not spike (#704)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-07-23T17:01:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "098b6b7137b722a30acfdc0be0bf92629409614f",
          "body": "* test(dial9): compile-test README examples, drop all `ignore`\n\n* ci: don't apt-install jq in check-docs when it's already present",
          "is_bot": false,
          "headline": "test(dial9): compile-test README examples, drop all `ignore` (#703)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-07-23T16:41:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eacf89e2a9d292c29a9a455a725b4a3cf6dea413",
          "body": "* feat(viewer): add sanitized trace shape generation\n\nAdd extract, generate, and direct synthesize workflows for producing\nshareable trace-shaped fixtures without preserving direct source labels or\nabsolute timestamps. Direct synthesis avoids materializing the 744 MB JSON\nrepresentation observed for\n[…]\nry is derived entirely by recompute_summary() over\nthe finished shape events (see the SUMMARY CONSISTENCY comment). These\nwere leftovers from before that refactor.\n\nAddresses PR feedback from @Fluzko.",
          "is_bot": false,
          "headline": "feat(viewer): add sanitized trace generator (#680)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-23T16:21:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "92a76648323f2a8e31a0d811ca85a2ed99cfb562",
          "body": "Consume stream and timestamp resets iteratively in both decoder paths so\nmalformed input cannot exhaust the call stack. Return a decode error when a\ntimestamp delta would overflow instead of wrapping or panicking.\n\nAdd focused regressions for long reset runs and timestamp overflow.",
          "is_bot": false,
          "headline": "fix(format): harden decoder reset handling (#681)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-23T11:59:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68abe25be9f70deb6e2e5cc2df6083152c6895e7",
          "body": "* refactor!: tokio instrumentation as a source\n\nTokio becomes source on a Recorder now, instead of a wrapper around one.\nrecorder(writer).build().attach_runtime(|t| ..) hands back the recorder\nand an instrumented runtime, users call it again to attach a second.\n\nGone: TracedRuntime, TracedRuntimeBui\n[…]\nith Option<Vec<_>>\n\n* refactor: rename attach_runtime to attach_tokio_runtime\n\n* test: read runtime metadata off the sealed trace, not live sources\n\n* test: give background symbolization room to drain",
          "is_bot": false,
          "headline": "refactor!: tokio instrumentation as a source (#698)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-07-22T20:52:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ae328f05bcffe2d6527059f71d05a70d262cf33",
          "body": "* feat(viewer): add Span Explorer with bounded exemplar refresh\n\n* feat(viewer): add spans explorer on new UI\n\n---------\n\nCo-authored-by: fluzko <fnluzko@gmail.com>",
          "is_bot": false,
          "headline": "feat(viewer): add Span Explorer with bounded exemplar refresh (#694)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-22T20:45:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e76dce77a0340193530bd3f1ab776d0f2f9d93f9",
          "body": null,
          "is_bot": false,
          "headline": "feat(viewer): bound and instrument aggregate folding (#693)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-22T18:48:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a124b5a75beee9b97f1b3a06c0cabb9b46464110",
          "body": null,
          "is_bot": false,
          "headline": "feat(viewer): add generalized span analysis APIs (#700)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-22T18:13:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0621a4aec3cdf4a69b6cccff1d7ca5d74437b05",
          "body": null,
          "is_bot": false,
          "headline": "feat(viewer): persist folded tracing spans (#691)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-22T15:32:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f394f078071813ee6f91bed4d1d97070a5f60e3",
          "body": "* fix(viewer): classify IllegalLocationConstraintException as WrongRegion\n\nA BYOC request for a bucket in an opt-in region (e.g. af-south-1) that is\naddressed through a region-specific endpoint the request wasn't signed for\nreturns `IllegalLocationConstraintException` (HTTP 400) instead of the 301\n`\n[…]\nhe server, so make the existing StorageBackend, HTTP, and JS list-buckets contracts region-bearing directly instead of maintaining a duplicate details API.\n\n* fix(viewer): use listed regions in new UI",
          "is_bot": false,
          "headline": "fix(viewer): autodetect regions for listed S3 buckets (#688)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-22T15:26:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "339df5174a28ea2a56a3c5eb8f940d2da734b0d3",
          "body": "* feat(viewer): cache aggregate output locally by default\n\n* feat(profiler): record effective profiling configuration",
          "is_bot": false,
          "headline": "feat(profiler): record effective profiling configuration (#690)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-22T14:28:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67d38733d831acdee70b5f95547a52aad5bbf2d3",
          "body": "* feat(viewer/parity): perf probe with pluggable render source (T12 layer e)\n\nparity/perf-probe.mjs: run a journey to a representative state (defaults\nJ6/J1/J5 per page kind), then drive a scripted interaction storm (hover\nsweeps / drags / wheel zooms / arrow pans in the journey step\nvocabulary) and\n[…]\nrfaces call injected seams (T31/T32/T34).\n\n* docs(exec-plan): T29 merged (cross-ticket tsc break fixed); T31 dispatched\n\n* feat(T34): wire load chrome into the viewer shell (drop zone + New File)\n\nTh…",
          "is_bot": false,
          "headline": "feat(viewer): Migration (#665)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-07-21T20:17:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9bc13ea03812665a1cbfc65d87ba88ea2fe29329",
          "body": "* feat(android): add CPU profiling support\n\nCo-authored-by: Daniel Henry-Mantilla <daniel.henry.mantilla@gmail.com>\n\n* ci: add Android aarch64 build coverage\n\n* fix: address issues from pixel test\n\n- Perf backend double-registration causing EINVAL.\n- Forced CPU-timer fallback producing one-frame sta\n[…]\nipt\n\n* fix(android): avoid registering ART thread with explicit ctimer\n\n* fix(android): bump libc version to 0.2.188\n\n---------\n\nCo-authored-by: Daniel Henry-Mantilla <daniel.henry.mantilla@gmail.com>",
          "is_bot": false,
          "headline": "Add Android CPU Profiling Support (#685)",
          "author_name": "Nick Robinson",
          "author_login": "nickrobinson",
          "committed_at": "2026-07-21T15:47:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "925997e8e0ca2a63f241622445b5a6d0b0d74de7",
          "body": "…(#670)\n\n* feat(viewer): Tokio Stats \"Worker activity\" rollup\n\nPort IRIS's `workers` rollup into the Tokio Stats aggregate page with\nbusyness metric and multi-runtime awareness.\n\nServer: `worker_activity: Vec<WorkerStats>` keyed by (host, worker_id)\nso multi-host scopes don't conflate workers from d\n[…]\nadded\nhostWorkerCounts tests, added busy_pct ≤ 100% invariant to the demo\ntest. cargo test --lib + node ui tests green; fmt + clippy clean.\n\n---------\n\nCo-authored-by: Prabhat Jain <pjainp@amazon.com>",
          "is_bot": false,
          "headline": "feat(viewer): Tokio Stats \"Worker activity\" rollup + focus deep-link …",
          "author_name": "Prabhat Jain",
          "author_login": "prabrat",
          "committed_at": "2026-07-21T00:12:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74bd23f29aea1c7c7b62748e6a1eddaeee63abbc",
          "body": "* feat(dial9): scaffold facade lib (re-exports + record_event)\n\n* refactor!: move the #[main] macro to the dial9 facade\n\n* refactor: relocate remaining examples to the dial9 facade\n\n* refactor: default the flush metrics sink; drop metrique-writer dep\n\n* refactor: make CoreSession the RAII recording \n[…]\n make dial9's readme the main one\n\n* fix(test): restore 10s graceful_shutdown drain in writeback test\n\n* fix(test): migrate task_dump re-poll test to the recorder(MemoryBuffer) API\n\n* update changelog",
          "is_bot": false,
          "headline": "refactor: make dial9 the facade (#614)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-07-20T09:49:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76c61f4232f40e69bb34bfeb282f67a80ab88aaf",
          "body": "To sample a task-dump backtrace, TaskDumped polls the inner future a\nsecond time and discarded the result. On a multi-threaded runtime that\nre-poll can legitimately return Ready (a resource the future is parked\non is readied by another thread between the primary poll and the capture\nre-poll). The co\n[…]\non test that spawns a future which completes on its second\npoll (the capture re-poll); it panicked before this fix and passes now.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(taskdump): propagate Ready from the capture re-poll (#679)",
          "author_name": "mitchsw",
          "author_login": "mitchsw",
          "committed_at": "2026-07-17T20:52:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "215cf8fa9ec1d7ffd200107b8623875ca421d90f",
          "body": "* feat(viewer): cache aggregate output locally by default\n\n* refactor(viewer): bundle aggregate output into one AggOutput value\n\nCollapse the scattered agg_output_bucket / agg_output_backend Option pair\nand its four new_temporary_aggregate() fallbacks into a single non-optional\nAggOutput on AppState\n[…]\nh two named\nconstructors (s3 / temporary) rather than three independently-optional\nfields. No capability change: S3 output (persistent) and temporary local\noutput (default, wiped on drop) both remain.",
          "is_bot": false,
          "headline": "Add local mode for aggregation (#671)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-17T20:43:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "67141e4f39cf4eb742378eb5b113481a10b75d9a",
          "body": "…lls (#661)\n\nClicking a tracing span often failed to jump to its task, and long-lived\nrequest spans (e.g. GET /jobs/next) rendered as 100% active with no idle\nband. Both stem from how span segments were built.\n\nRoot causes:\n- A span segment recorded the ENTER timestamp paired with the EXIT event's\n \n[…]\nentity/multi-segment),\nresolveSpanTask (binary search, gap/unknown-worker/taskId-0 -> null),\nbuildSpanData integration (reconstruction, recycled-task-id not borrowed,\nno-workerSpans backwards compat).",
          "is_bot": false,
          "headline": "fix(viewer): resolve span task + reconstruct active/idle from task po…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-15T10:06:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "13519f63f2ca025aa581ea3d6798ddb3a88303e2",
          "body": "* Add poll-time bands to flamegraph view\n\n* fix(viewer): restore aws_region forwarding + disjoint fast/slow poll split\n\n- flamegraph_diff_view.js: restore aws_region to SERVER_KEYS. It was\n  accidentally dropped when adding min_poll_ns/max_poll_ns, so apiUrlFor\n  stopped forwarding it and cross-regi\n[…]\nn scope\nchange so it re-seeds to the new distribution; 'Refine more' keeps the\nuser's chosen split (same scope, deeper sampling).\n\nAlso drop the extra blank lines flagged by cargo fmt in aggregate.rs.",
          "is_bot": false,
          "headline": "Poll-time aware flamegraphs (#663)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-14T19:53:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0de9b20b8183cdc25c259a51ea2147e3b854a737",
          "body": "* feat(viewer): v0 of flamegraph inspect\n\n* test(viewer): add flamegraph inspect tests missed from v0 commit\n\n* feat(viewer): track viewer state in url for flamegraph\n\n* fix(ci): add missing flamegraph deeplink test and view state module\n\n* Properly integrate and improve the flamegraph view state\n\n*\n[…]\npied link lost the\nzoom). Persist the in-flight pendingZoom target instead; commitZoom still\nclears it first so explicit navigation persists correctly.\n\nAdds a regression test (fails without the fix).",
          "is_bot": false,
          "headline": "feat(viewer): v0 of flamegraph inspect (#664)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-14T18:02:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9359b66700fb074aaf95dcc8d762a25605568012",
          "body": "* viewer: split serve() into build_app() so embedders own binding\n\nserve() both assembled the axum app AND bound the listener, so an embedder\ncould not add routes or wrap middleware (e.g. auth) around the whole app\nwithout duplicating the ~200-line assembly.\n\nSplit it into `pub build_app(ViewerConfi\n[…]\nregation), then `.merge()` custom routes,\n`.layer()` middleware (auth), and bind it yourself. Also demonstrate the\ncaller-owned `init_tracing`, `attach_request_metrics`, and\n`shutdown_signal` helpers.",
          "is_bot": false,
          "headline": "viewer: split serve() into build_app() so embedders own binding (#666)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-14T15:02:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4174031d84ba1d757c019c77bda24468e9ce874f",
          "body": "…bject (#668)\n\n* Drop aws-sdk-s3-transfer-manager, upload segments via aws-sdk-s3 PutObject\n\n`worker-s3` pulled in `aws-sdk-s3-transfer-manager`, which dragged a legacy\nrustls 0.21 / hyper 0.14 TLS stack and `rustls-webpki` 0.101.7 into the graph,\ncarrying RUSTSEC-2026-0098/-0099/-0104. Downstreams \n[…]\nsupplied\nclient passed through `.s3_with_client(..)` keeps its own timeout configuration\nuntouched.\n\nCo-Authored-By: heihutu <heihutu@gmail.com>\n\n---------\n\nCo-authored-by: heihutu <heihutu@gmail.com>",
          "is_bot": false,
          "headline": "Drop aws-sdk-s3-transfer-manager, upload segments via aws-sdk-s3 PutO…",
          "author_name": "houseme",
          "author_login": "houseme",
          "committed_at": "2026-07-14T14:42:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d5ef042833aa2ea9a5406d23a7aeaaa2c51f7d29",
          "body": "Add new example demonstrating how to embed the viewer in a larger system",
          "is_bot": false,
          "headline": "viewer: Support extensibility by exposing `AppState::from_bucket` (#662)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-13T18:13:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d032618339b3f910d1594739c40b9f37734ba6e3",
          "body": "* Revise SECURITY.md for version support and reporting\n\nUpdated the security support table and reporting instructions.\n\n* fix: add correct AWS vulnerability reporting link\n\nRemove template placeholder text and add the actual link to\nhttp://aws.amazon.com/security/vulnerability-reporting/",
          "is_bot": false,
          "headline": "Add SECURITY.md (#612)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-13T15:48:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9793db572dcbc281c6c38dedc038a5aa71ef970",
          "body": "… constructors (#660)\n\nIntroduce CpuProfilingConfig::with_perf_backend() and\nCpuProfilingConfig::with_ctimer_backend() constructors for explicit\nbackend selection:\n\n- with_perf_backend() — perf only, no ctimer fallback. Fails if\n  perf_event_open is blocked.\n- with_ctimer_backend() — ctimer only, avoids perf's per-CPU inherited\n  context overhead on thread-heavy workloads.\n\nhttps://github.com/dial9-rs/dial9/issues/579\n\nCo-authored-by: Jason Gin <jasgin@amazon.com>",
          "is_bot": false,
          "headline": "feat: explicit CPU profiling backend selection via CpuProfilingConfig…",
          "author_name": "Jason Gin",
          "author_login": "jasgin",
          "committed_at": "2026-07-10T18:26:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69947e6a81e9115a1b2d2468f7e5db82dedff164",
          "body": "* viewer: classify S3 NoSuchBucket/NoSuchKey as 404, not 500\n\nBrowsing a nonexistent bucket returned HTTP 500 with a server `fault`.\nThe S3 `NoSuchBucket`/`NoSuchKey` error codes fell through the\n`classify_s3_error` catch-all to `StorageError::Other`, which logged an\n\"unclassified S3 error\" and mapp\n[…]\na well-formed but nonexistent bucket → 404), an invalid\nname is a malformed request, so map it to a new StorageError::BadRequest → HTTP\n400 rather than folding it into NotFound. Add a regression test.",
          "is_bot": false,
          "headline": "viewer: classify S3 NoSuchBucket/NoSuchKey as 404, not 500 (#635)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-10T18:18:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a9011612618c6889532b0d897bc1af0370746be3",
          "body": "* Sample SchedStat::read_current in worker park/unpark\n\nReading /proc/self/task/<tid>/schedstat on every worker park and unpark\nconsumes measurable CPU. As noted in #557, scheduler latency is still\nobservable with periodic sampling, so there is no need to read schedstat\non every park.\n\nRead schedsta\n[…]\nand that Some(0) still counts. All lib tests,\nthe JS-parser round-trip, and viewer JS tests pass.\n\n* fix(clippy): use is_multiple_of in advance_park_counter\n\n* Report schedstat sample rate in metadata",
          "is_bot": false,
          "headline": "Sample SchedStat::read_current in worker park/unpark (#619)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-10T16:16:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e78d8459b792c68ceae26c8f6c4b1575d0ee3726",
          "body": "* fix(viewer): enable flamegraph Export in aggregated/API mode\n\nsetTreeDirect() (API/aggregated render path) bypassed applyFilters(), so\nthe Export button stayed stuck disabled. Extract updateExportState() and\ncall it from both render paths; also fix the exported header prefix to\n\"All threads\" for a\n[…]\n\ntest's `global.navigator = {...}` stub threw \"Cannot set property\nnavigator\". Save/restore its property descriptor and stub via\nObject.defineProperty, which works on both Node 18 (local) and Node 24.",
          "is_bot": false,
          "headline": "fix(viewer): enable flamegraph Export in aggregated/API mode (#650)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-10T14:52:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9b423ed84d6ceaae677fc0ee26b83b228691250b",
          "body": "* fix(viewer): add keyboard search focus to diff flamegraph\n\nSupport Ctrl/Cmd+F and bare \"/\" to focus the highlight/search box in\nthe differential flamegraph view, mirroring the single-flamegraph\nhandler. Escape now returns early after resetting zoom.\n\nFixes #622\n\n* fix(viewer): preserve heatmap sel\n[…]\ns the flamegraph Diff dialog exactly. Presets show only while A is\nset and B is empty; time-shift needs a window on A, and the host\ndropdown is disabled when no other host is present.\n\nRelates to #624",
          "is_bot": false,
          "headline": "fix(viewer): browse-view + flamegraph-diff UI papercuts (#623) (#655)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-10T14:31:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ea5686135c768403f72494de60cda91d7f15daf",
          "body": "…root (#656)\n\nThe browse page has a special case (issue #471) for buckets with no key\nprefix, where trace data lives directly under YYYY-MM-DD/ date partitions:\nit empties the search prefix instead of offering the dates as selectable\nprefixes. isDateLayer() gated this on *every* root child being a d\n[…]\nusing to\nempty the prefix on an ambiguous 50/50 listing.\n\nRepro'd against bamboo-dial9-gamma-us-west-2-0001 (64 dates + diagnostics/):\nisDateLayer was false, empty-prefix browse returns 100k+ objects.",
          "is_bot": false,
          "headline": "fix(viewer): recognize date layer when aux sibling folders share the …",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-10T13:52:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "20388826260d156037e1f022f7ae7aaacde202b1",
          "body": "* Add minimal-spans example / viewer support\n\n* fix(ci): drop dangling test_custom_spans.js ref; bump crossbeam-epoch\n\nTrace Integrity job failed with MODULE_NOT_FOUND: the e2e script\nreferenced dial9-viewer/ui/test_custom_spans.js, which was never\ncreated. The custom-span (SpanEnter__/SpanExit__) c\n[…]\nhe dangling reference.\n\nsecurity_audit failed on RUSTSEC-2026-0204 (crossbeam-epoch 0.9.18,\ninvalid pointer deref in fmt::Pointer), a newly-published advisory.\nBump the lockfile to the patched 0.9.20.",
          "is_bot": false,
          "headline": "Add minimal-spans example / viewer support (#588)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-10T00:59:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "20bc47515ba2bd92860d6d4cc6d23d5b7d942102",
          "body": null,
          "is_bot": false,
          "headline": "Commit branch protection rules to git (#629)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-10T00:59:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ae48f6b5aefb92460797e6a824e6edb32622a89",
          "body": "…se-branch releases (#640)\n\n* feat(release): parameterize publish workflow by release branch\n\nThe publish workflow (`workflow_dispatch`) previously ran the copy of\nrelease.yml on whatever ref it was dispatched against. That meant each\n`release-*` branch carried its own fork of the workflow, and impr\n[…]\n is a workflow input (avoids per-branch\nworkflow drift) and why pr_branch_prefix must differ per series and stay\nslash-terminated (avoids release-* protection collisions and cross-series\nPR closures).",
          "is_bot": false,
          "headline": "feat(release): parameterize publish workflow + document main vs relea…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-10T00:59:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f1bd5a2df8f5e96275b2d8db97352617fa910bc9",
          "body": "…(#621)\n\nThe bucket's region is a property of the bucket, not a credential — yet it\nonly ever traveled as a per-request header derived from this-tab's session\ncredentials. So a viewer/flamegraph/tokio-stats link was NOT self-contained:\nregion survived only because a same-origin new tab inherited the\n[…]\ntest_trace_scope.js (region round-trip incl. empty, scopeFromKeys\nthreading, aggregation round-trip) and test_flamegraph_diff.js (fullScopeQuery\n+ apiUrlFor carry aws_region). All UI logic tests pass.",
          "is_bot": false,
          "headline": "feat(viewer): carry aws_region in viewer/flamegraph/tokio-stats URLs …",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-09T17:42:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ac760a908aabb302e2fc22c736342d00ff57b02",
          "body": "…#610)\n\n* docs(viewer): add UI migration plan, inventories, and perf findings\n\n* add ux findings\n\n* add heavy loads missing docs",
          "is_bot": false,
          "headline": "docs(viewer): add UI migration plan, inventories, and perf findings (…",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-07-09T17:36:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89f8113f7a0474f18d8e9686dd83b63b69de2455",
          "body": "…639)\n\nAdd a top-N longest-polls rollup to the Tokio Stats page: the single\nfutures that held a worker thread longest in one poll (these starve\nother tasks on that worker). The server ranks polls by duration and\nships a bounded top-100 (task_id is high-cardinality, so this is a\nserver-side reduction\n[…]\natency-heat\nhelper and focus_* deep-link params; add test_focus_timebase.js pinning\nthe wall->monotonic round-trip (registered in e2e-trace-tests.sh).\n\nCo-authored-by: Prabhat Jain <pjainp@amazon.com>",
          "is_bot": false,
          "headline": "feat(viewer): Tokio Stats \"Longest polls\" rollup + focus deep-link (#…",
          "author_name": "Prabhat Jain",
          "author_login": "prabrat",
          "committed_at": "2026-07-09T17:29:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a87d732dffaf84af8a34a88ef84cdb6a8da0d7b",
          "body": "release-plz creates its release PR from an ephemeral branch named\n`release-plz-<timestamp>`. That name matches the `release-*`\nbranch-protection rulesets on this repo — in particular the admins-only\n`Restrict release-* creation` ruleset — so GitHub rejects the branch push\nwith \"Cannot create ref due\n[…]\n `release-*` glob does not cross `/`,\nso the slash form is exempt from the rulesets while staying recognizable.\n\nThis restores the Release PR automation (last two runs on main failed for\nthis reason).",
          "is_bot": false,
          "headline": "fix(release): use slash in release-plz PR branch prefix (#633)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-09T13:41:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e825730beafae9296939db3550dc68cd581e06cb",
          "body": "Open perf events only for CPUs in the process's affinity mask, read\nfrom /proc/self/status Cpus_allowed_list. This avoids inheriting perf\ncontexts for CPUs the process can never run on, eliminating the\nthread-spawn overhead that caused blocking-thread amplification under\nTokio.\n\nhttps://github.com/dial9-rs/dial9/issues/579\n\nCo-authored-by: Jason Gin <jasgin@amazon.com>",
          "is_bot": false,
          "headline": "fix(perf): use process affinity mask instead of all online CPUs (#632)",
          "author_name": "Jason Gin",
          "author_login": "jasgin",
          "committed_at": "2026-07-09T02:03:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eaea4e388161b23857b77a01d3a425a680796649",
          "body": "…(#627)\n\nIn local mode (--local-dir), browse now does a flat listing instead of\ndate-prefix fan-out, so on-disk buffer traces ({boot_id}/trace.{N}.bin)\nare discoverable. The heatmap falls back to file mtime when the filename\nhas no epoch, and clicking opens traces directly by key.\n\nCo-authored-by: Jason Gin <jasgin@amazon.com>",
          "is_bot": false,
          "headline": "fix(viewer): browse finds local traces without date-structured paths …",
          "author_name": "Jason Gin",
          "author_login": "jasgin",
          "committed_at": "2026-07-08T17:50:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "878ec0ae7f81d672991c63067789b779128b4390",
          "body": "* feat(viewer): thread aws_role_arn from the URL through to /api requests\n\nThe server-side assume-role path (CredSource::AssumeRole, driven by\n?aws_role_arn=… or the x-dial9-aws-role-arn header) shipped server-only:\nthe frontend parsed bucket/aws_region from the landing-page URL but\ndropped aws_role\n[…]\nset() (the stable scripting API) is preserved. Extends test_creds.js\nwith setRegion static+role coverage and legacy-bag classification;\nreframes the old precedence test as a classify() invariant test.",
          "is_bot": false,
          "headline": "Handle role_arn in the viewer (#615)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-06T20:52:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "036d06672d6041928511321844b36555cc5a8d3a",
          "body": "…s (#616)\n\n* fix(viewer): repair malformed module-doc heading in metrics.rs\n\nThe `## Dimensions` section heading was concatenated onto the end of the\npreceding prose line (`... [`record_request_metrics`]). //! ## Dimensions`),\nso rustdoc rendered it as literal inline text instead of a section headin\n[…]\nadd a .gitignore rule matching the timestamped agent-transcript filename\npattern (YYYY-MM-DD-HHMMSS-*.txt) so future sessions can't be committed by\naccident, while leaving ordinary .txt files tracked.",
          "is_bot": false,
          "headline": "fix(viewer): address AutoCRReviewer findings from last 10 main commit…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-06T20:52:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "177eb987a1ed5c65c852ea6212826dadfd31013b",
          "body": "* feat(viewer): smaller first fold + \"Load more data\" in the diff view\n\nThe diff view opens TWO /api/flamegraph streams at once, and each was folding\nto the server default cap (up to ~100 files x ~40-50 MB). That is ~200\nconcurrent large GETs, enough to saturate a Fargate task's egress and blow the\n\n[…]\n\nAddresses review feedback: callers no longer pass positional `undefined`\nfor the origin arg. apiUrlFor({scope, maxFiles}) reads clearly and lets\ncallers omit fields instead of padding with undefined.",
          "is_bot": false,
          "headline": "small flamegraph / diff improvements (#613)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-06T19:04:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88f2bdde4e969b78abcb9c0d62f52c37865e6efc",
          "body": "… flamegraph/tokio-stats) (#603)\n\n* feat(viewer): stream flamegraph/tokio-stats aggregation over SSE\n\nThe aggregate flamegraph and tokio-stats APIs previously used a client\npolling model: each poll folded a small batch of source files and the\nbrowser re-polled, re-aggregating the whole folded set ev\n[…]\nrs on. Equal-total cases are unchanged\n(shared eps == the old per-side eps when tA == tB), so all existing color\ntests still hold.\n\nAdds regression tests for the lopsided-totals case (and its mirror).",
          "is_bot": false,
          "headline": "feat(viewer): Add differential flamegraph + A/B diff capture (unified…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-06T13:53:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab731f5e7fe1385f2fee1fd68a4349aa34b5b84d",
          "body": null,
          "is_bot": false,
          "headline": "viewer: Improve Tokio stats page (#592)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-06T13:02:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba7205e08374ebbed31d7877853695271e845452",
          "body": "* feat(viewer): stream flamegraph/tokio-stats aggregation over SSE\n\nThe aggregate flamegraph and tokio-stats APIs previously used a client\npolling model: each poll folded a small batch of source files and the\nbrowser re-polled, re-aggregating the whole folded set every time\n(O(folded^2) reads). This\n[…]\n\n  returned promise, which resolves on close, abort, or error alike.\n- sse.js: correct the openSse doc — the returned promise never rejects;\n  errors are reported via onError and the promise resolves.",
          "is_bot": false,
          "headline": "feat(viewer): stream flamegraph/tokio-stats aggregation over SSE (#602)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-06T11:16:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e80cdc756bee9542f510fa10bab88409aa8f8a70",
          "body": "* viewer: Minimal metrique metrics\n\n* viewer: operation-specific request metrics\n\nAdd an OperationMetrics entry enum (metrique tag+subfield) flattened into\nRequestMetrics, carrying per-operation signals the generic\ncount/fault/error/latency fields can't see:\n\n- browse: objects_returned, prefixes_fan\n[…]\nafter the 200 headers are sent and\ncan't fold into the request entry; it gets a standalone ObjectStreamMetrics\nentry armed on the byte stream (emitted on stream end) with the same\noperation dimension.",
          "is_bot": false,
          "headline": "viewer: Minimal metrique metrics (#598)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-05T18:08:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33df2dd3f71332c779130946a0e18d5eb08af4bc",
          "body": "…emely long URLs (#589)\n\n* fix(viewer): carry large S3 selections as a stateless scope to dodge the 414\n\nOpening the viewer or flamegraph from the S3 browser emitted one\n`trace=/api/object?bucket=&key=` component per selected file and carried the\nwhole list in the navigation URL. A large heatmap sel\n[…]\nvice wins\" which silently dropped the others.\n\nNet -120 lines. Tests: test_trace_scope.js gains encodeAggregationParams cases\nand absorbs the parseKey-layout fixtures; all UI tests + cargo check pass.",
          "is_bot": false,
          "headline": "fix(viewer): carry large S3 selections via a time range to avoid extr…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-05T17:59:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0652aeb5a7bc019d0ea235b8e4009efbb52b767",
          "body": "…#611)\n\ns3s 0.13 pinned quick-xml 0.37.5, which is flagged by a RUSTSEC advisory\nfailing CI. s3s/s3s-fs/s3s-aws 0.14.1 move to quick-xml 0.41.0.",
          "is_bot": false,
          "headline": "chore(deps): bump s3s crates to 0.14.1 to pull in patched quick-xml (…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-05T17:46:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84a21e5166484f6b9af76de670749d6819d180c2",
          "body": "…param) (#607)\n\nA bring-your-own-credentials request builds an ephemeral S3 client pinned to\nthe region carried on the request (defaulting to us-east-1). When the target\nbucket lived in another region and no region had been detected — e.g. a bucket\ntyped manually rather than picked, so /api/credenti\n[…]\n\n  not just names containing \"dial9\" (some deployments don't name buckets that\n  way).\n\nTests: Rust regression for PermanentRedirect→WrongRegion classification; JS\nurl_state round-trip for aws_region.",
          "is_bot": false,
          "headline": "fix(viewer): handle cross-region S3 buckets (region as a first-class …",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-02T18:04:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "679ee8f29fd5546321d110cd94482736b475e6f2",
          "body": "Fixes unsoundness in `Error::downcast_mut()` (fixed in anyhow 1.0.101).\n\nCloses #590",
          "is_bot": false,
          "headline": "chore(deps): bump anyhow to 1.0.103 to clear RUSTSEC-2026-0190 (#604)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-01T23:32:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a89e0cc9e347776fd6a0fab5a1a56714ffea4579",
          "body": "* feat(viewer): assume a caller-named role as an alternative to BYOC\n\nAdd a server-side assume-role path alongside bring-your-own-credentials. A\nrequest authenticates one of two ways, never both:\n\n  1. BYOC (existing): x-dial9-aws-{access-key-id,secret-access-key,\n     session-token} — the backend s\n[…]\ne_cred_inputs) and a\n    misleading trait doc comment (region pins the STS endpoint + result region,\n    not \"the STS call is global\").\n\ncargo test (72 unit + 49 integration) / clippy / fmt all green.",
          "is_bot": false,
          "headline": "Allow the viewer to assume roles when accessing buckets (#597)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-01T23:05:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "86270d901b7e2daaf2e6ff0eb66580fbcb1c603c",
          "body": null,
          "is_bot": false,
          "headline": "Group by runtime in the UI (#596)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-01T20:49:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "959133dc73bf48eb58e1962265363e8b9c570d4f",
          "body": null,
          "is_bot": false,
          "headline": "attempt to fix gh actions (#606)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-01T20:25:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0a97e16e13ccfcdc14b71a88ade6db28ae8ae61",
          "body": "…e (#595) (#600)\n\nLoading multiple traces concurrently rendered much slower than one\ncontiguous trace, with doubled UI paints. Two causes:\n\n1. The whole-buffer parser (parseTraceBuffer, used by the multi-trace\n   concat path) yielded a macrotask — clamped to ~4ms AND forcing a\n   repaint — every 100\n[…]\nregistered in\ne2e-trace-tests.sh); fetchTracesStream concat-parity / order /\nconcurrent-dispatch / late-failure-no-unhandled-rejection cases in\ntest_fetch_traces.js; test_heatmap.js assertion updated.",
          "is_bot": false,
          "headline": "fix(viewer): pipeline multi-trace loads and unify parse paint throttl…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-07-01T20:06:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac138234d8126cc97191f3898f3f29c93547cb88",
          "body": "* refactor: move memory profiling to dial9-perf-self-profile\n\nMove the whole memory_profiling module (allocator hook + consolidator Source) and its wire events out of dial9-tokio-telemetry into dial9-perf-self-profile, behind a new `memory-source` feature.\n\n* refactor!: make memory profiling standal\n[…]\nrmat\n\n* fix: clippy and shuttle build after the install_into change\n\n* docs: add memory-local example for dial9 + memory profiling\n\n* refactor: depend on dial9-core, drop the duplicated profiler utils",
          "is_bot": false,
          "headline": "refactor: move memory profiling to dial9-perf-self-profile (#591)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-06-30T20:56:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2df3285a8268e7e594d372bd6182a750a7337dbc",
          "body": "…rdering (#586)\n\nTwo bugs found in code review:\n\n1. browse fan-out used buffer_unordered, which yields results in completion\n   order. The overflow-collection loop indexes prefixes[i] by enumeration\n   position, so a result completing out of order was attributed to the wrong\n   prefix: the overflowe\n[…]\negression tests for both: a deterministic out-of-order\ncompletion test (gated via a oneshot, verified to fail under buffer_unordered)\nand a traversal-rejection test asserting no escape dir is created.",
          "is_bot": false,
          "headline": "fix(viewer): correct browse overflow attribution and path-traversal o…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-30T16:15:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea899f4a90184e05557510ddda2bd575e0072135",
          "body": null,
          "is_bot": false,
          "headline": "fix(viewer): prevent XSS in Tokio stats (#587)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-30T15:31:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3e123c84e3a3dbe73a04bb696e271594fe047e0",
          "body": "* refactor: move create_wake_event off SharedState\n\n* refactor: move clock helpers into dial9-core\n\n* refactor: move bus-owned events into dial9-core\n\n* refactor: move CentralCollector and Batch into dial9-core\n\nFirst piece of the event bus machinery. CentralCollector is internal\nplumbing (#[doc(hid\n[…]\nean up\n\n* refactor(core): encapsulate SharedState fields behind accessors\n\n* ci: extend nightly-build gate\n\n* refactor: rename dial9-s3 crate to dial9-utils\n\n* fix clippy warning\n\n* fix clippy warning",
          "is_bot": false,
          "headline": "refactor: move event bus to dial9-core (#549)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-06-29T22:01:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5847e6f0711f2a8299bf5087ac99bb8ec22ae35f",
          "body": "The trace-browser landing page now mirrors its full state into the query\nstring so a search is shareable and survives reload. State is restored on\nload and re-synced on every state-changing action via history.replaceState.\n\nTracked params: bucket, prefix, tab (browse/raw), tz (utc/local), the\nraw-se\n[…]\nand last wins.\n\nSerialize/parse logic lives in a dependency-free url_state.js module (mirrors\nprefix_detect.js/creds.js), unit-tested in test_url_state.js and registered\nin scripts/e2e-trace-tests.sh.",
          "is_bot": false,
          "headline": "Sync landing-page state to the URL (#585)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-29T18:32:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ede024fc81e64d28cb13b630b72308a928a9757a",
          "body": "* deprecate CpuSampleEvent::worker_id; remove assertion on deprecated field\n\n* flamegraph aggregation wip\n\n* properly serve facets to the flamegarph viewer\n\n* add generic facet system\n\n* lots more fixups\n\n* viewer: clean up aggregator CR — fix bugs, drop dead code, minimize API, sync docs to reality\n[…]\nhe aggregate_test suite goes from minutes (folded_outside_cap\n~70s, refinement_climbs ~63s, fetch_more ~49s) to ~0.8s total. parser_parity\nstill covers Rust<->JS decoder parity on the real demo trace.",
          "is_bot": false,
          "headline": "Add Flamegraph / Tokio Stats Aggregation to dial9-viewer (#570)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-27T21:36:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "97cc9fa1cd911d3c2c9cf0ab86117635e6b974cf",
          "body": "* fix: Avoid truncation when rendering the s3 browser view\n\n* Cleanup unused /api/search and /api/browse\n\n* More cleanups\n\n* load 1h at a time instead",
          "is_bot": false,
          "headline": "fix: Avoid truncation when rendering the s3 browser view (#582)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-27T19:53:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "544afd2534e58319890613c4eb02537dc65de422",
          "body": "* perf(telemetry): skip segment metadata work on idle flush cycles\n\n* fixup! perf(telemetry): skip segment metadata work on idle flush cycles\n\n* test(telemetry): make attached-runtime metadata test deterministic\n\n* test(telemetry): guard segment_metadata zero-alloc invariant\n\n* refactor(telemetry): drop redundant segment_metadata bool",
          "is_bot": false,
          "headline": "perf(telemetry): skip segment metadata work on idle flush cycles (#581)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-06-27T19:53:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27fcb892984648af1046410a322d34fc56231b17",
          "body": "A segment that lands in {trace_dir}/{boot_id}/ locally was uploaded to\nS3 under a different, independently-generated boot_id, so you couldn't\ncorrelate a local trace file with its upload.\n\nNow the runtime injects the namespace boot_id into the S3 config (and\nthe embedded segment metadata) at build t\n[…]\n when S3Config is\nused outside the managed Dial9Config path.\n\nAdds an integration test that decodes a sealed segment and asserts its\nboot_id metadata matches the namespace directory name.\n\nCloses #548",
          "is_bot": false,
          "headline": "feat!: unify S3 boot_id with the on-disk namespace boot_id (#566)",
          "author_name": "Shreyas Kanjalkar",
          "author_login": "skanjalkar",
          "committed_at": "2026-06-25T20:46:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d0768b6df5d5fedd409c8e1d8e6d458995338812",
          "body": "…ples (#580)",
          "is_bot": false,
          "headline": "Optimize queue rendering when there are large quantities of queue sam…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-25T14:28:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f257f195525dfae1cc3f282893721cbc95a8874",
          "body": "* cpu usage viewer\n\n* remove noisy data from cpu usage viewer\n\n* rate limit segment metadata warn\n\n* regenerate demo trace\n\n* fix parseTrace skill\n\n* remove visible intervals from cpu panel\n\n* foldable panels\n\n* change fold triangle char and size\n\n* persistent fold state\n\n* remove cpu usage range crosshairs\n\n* guard queue chart from dragging when folded\n\n* localStorage fallback",
          "is_bot": false,
          "headline": "feat: Add CPU usage visualization to the viewer (#564)",
          "author_name": "Franco Profeti",
          "author_login": "noxware",
          "committed_at": "2026-06-24T19:46:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0de05bbe5097c4fab7a02d4cbf0afc642ed93eaf",
          "body": "…#578)\n\n* feat(viewer): export flamegraph as interactive SVG or folded stacks\n\nAdds an \"Export\" control to the flamegraph toolbar that turns the rendered\ntree into two portable artifacts:\n\n- Interactive SVG: a standalone, self-contained flame graph (hover, click-to-\n  zoom, Ctrl-F regex search, URL \n[…]\nSES at the repo root with the FlameGraph attribution\n  and the full verbatim CDDL-1.0 text.\n\n---------\n\nCo-authored-by: Prabhat Jain <pjainp@amazon.com>\nCo-authored-by: Russell Cohen <rcoh@amazon.com>",
          "is_bot": false,
          "headline": "feat(viewer): export flamegraph as interactive SVG or folded stacks (…",
          "author_name": "Prabhat Jain",
          "author_login": "prabrat",
          "committed_at": "2026-06-24T15:35:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fe1b12c0399f791f39ebbaf41211c52cd1d07a4f",
          "body": "…ing UX) (#568)\n\n* viewer: stream trace decode so download and parse overlap\n\nFor a single large trace, the viewer downloaded the whole file (~7s for\n~50MB) and then parsed it (~7s) sequentially. This decodes chunks as they\nstream in from the network, hiding most of the parse time behind the\ndownloa\n[…]\nompressionStream path is\nunchanged; we just lose the download/parse overlap for that response.\n\nAdds a regression test (gzipped + raw) that fails on the old code with\n'Cannot read properties of null'.",
          "is_bot": false,
          "headline": "viewer: overlap trace download and parse (streaming decode + load-tim…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-24T14:46:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "efe46aa0236e0e960d278b2cbe785306531d21d1",
          "body": "…#569)\n\n* viewer: add pixel-LOD render helpers to trace_analysis (pure + tested)\n\nPure, unit-tested helpers used by the upcoming canvas-render rewiring. No\nbehavior change on their own — they're not wired into the viewer yet.\n\n- makeBarCoalescer({push, flush}): collapse adjacent same-color pixel-spa\n[…]\nd) passes. The active/park lanes keep longest-wins: their\ncolors are categorical, not a duration ramp. The selected-task highlight\npass keeps Infinity weight (single solid color, no red-bias concern).",
          "is_bot": false,
          "headline": "viewer: pixel-LOD canvas rendering + recycled span-id highlight fix (…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-24T13:16:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6b5db0618f0c05ccfef89d49e0b468de6995bf31",
          "body": "…de buffering) (#567)\n\n* viewer: download trace files in parallel, stop decompressing server-side\n\nThe viewer linked to a single /api/trace?keys=a&keys=b URL, which forced\nthe backend to fetch every file, gunzip each one server-side, concatenate\nthem, and ship one large uncompressed blob. That trans\n[…]\nrageBackend implementors may receive, so adding a field\nlater (e.g. content_type) must not be a breaking change. It's only\nconstructed inside this crate, where struct-literal construction still works.",
          "is_bot": false,
          "headline": "viewer: stream trace objects from S3 (parallel download, no server-si…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-24T12:03:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e2cc2928fe740cd6940a842eea25d16f9f145a6a",
          "body": "* fix clock_monotonic_ns fallback\n\n* better clock_monotonic_ns in macos\n\n* improve doc comments\n\n* better unix and darwin handling\n\n* consistent clock_realtime_ns using CLOCK_REALTIME also in darwin\n\n* fix agents.md clippy instruction",
          "is_bot": false,
          "headline": "Improve event timestamps in MacOS & fallback (#573)",
          "author_name": "Franco Profeti",
          "author_login": "noxware",
          "committed_at": "2026-06-24T12:02:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "807a040f8aec7305f7b43329362c291aeba549c3",
          "body": "* feat(dump): add dump control types and trigger channel\n\nGroundwork for on-trigger pipeline runs: DumpId (ULID), DumpControl, DumpRun (dispatch on await or drop, exactly once), DumpReceipt, and DumpError. Not yet wired into the builder or worker; segments still process continuously.\n\n* feat(builder\n[…]\nseal race\n\n* test(dump): deflake remaining seal-race dump tests\n\n* test(dump): deflake lookforward dump tests via stable signals\n\n* test(dump): unify dump-test helpers, re-drive workload while polling",
          "is_bot": false,
          "headline": "feat: Manual trigger for pipeline (#536)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-06-24T10:35:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "95e0eb9d4ed78108e12d064a11c3227df1925b07",
          "body": "* configure memory profiling from dial9config\n\n* clean tests a bit\n\n* address clippy",
          "is_bot": false,
          "headline": "feat: memory profiling in `Dial9Config::from_env` (#558)",
          "author_name": "Franco Profeti",
          "author_login": "noxware",
          "committed_at": "2026-06-23T11:15:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3f03019b296936401add6cc0030e61955844c0d",
          "body": "… (#563)",
          "is_bot": false,
          "headline": "refactor(tracing-layer)!: rename Dial9TokioLayer to Dial9TracingLayer…",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-06-23T00:24:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8f51b2b7ff1a6cc6e0972aa7bc79eda0cfe24f5",
          "body": null,
          "is_bot": false,
          "headline": "test(tracing-layer): make multi-worker assertion deterministic (#560)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-06-22T18:48:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb382b8e810a61c8ff89584759aa6655a0549f5a",
          "body": null,
          "is_bot": false,
          "headline": "fix(viewer): scope enclosing spans to event's worker (#559)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-06-22T18:47:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8513899ad76eaf3ded9d3987ac4fb98fe66e74f",
          "body": "* Add POST route to upload then serve a trace\n\n* Add missing upload.rs module file\n\nThe previous commit (cda260b) referenced `mod upload;` and `upload::*`\nin server/mod.rs but never tracked the module file itself, so CI failed\nto build with E0583 (file not found for module `upload`). Add the file.",
          "is_bot": false,
          "headline": "Add POST route to upload then serve a trace (#553)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-22T15:06:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b69bc70bed7e3d293156c658cf1e1cbbba82829e",
          "body": "* bring-your-own-creds\n\n* fix(viewer): paginate S3 list operations\n\nlist_prefixes issued a single ListObjectsV2 with a delimiter and read\ncommon_prefixes() once. Common prefixes count against the per-response\nMaxKeys (default 1000), so a bucket with more than one page of immediate\nchild prefixes sil\n[…]\nentials\n  for naming consistency with allow_byo_creds\n- document why /api/credentials/check is POST, why temp.region is safe to\n  fall back to, and why a failed check does not clear stored credentials",
          "is_bot": false,
          "headline": "Add support for bring-your-own-credentials (#556)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-19T20:20:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0e67383e4c20e8b9a650e24e9dec781bf844335",
          "body": "* detect when buckets don't have a set prefix\n\n* fix(viewer): address PR #526 feedback\n\n- Extract isDateLayer/lastSegment into pure prefix_detect.js module\n  (loaded by index.html via <script src>, required by the test) so the\n  test no longer regex-extracts source out of index.html.\n- Guard the date-layer reset with !serverHasPrefix so a server-supplied\n  default_prefix is never silently emptied.\n- Wire test_prefix_detection.js into scripts/e2e-trace-tests.sh so it\n  runs in CI.",
          "is_bot": false,
          "headline": "Fix: detect buckets with no prefix (date partitions at root) (#526)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-19T18:25:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a84fdc7d678207c6e18d2504eb470c778c31bd05",
          "body": "* feat(viewer): make custom events clickable to inspect\n\n* feat(viewer): make custom events clickable and task-aware\n\n* fix(viewer): clamp tooltip to viewport bottom edge\n\n* feat(viewer): pin clicked event detail in sidebar\n\n* feat(viewer): make custom events clickable and traceable\n\n* fix(viewer): \n[…]\n keep legend bars above the selected-event marker\n\n* feat(viewer): enhance the event Related tab\n\n* feat(viewer): open the event detail sidebar at 350px\n\n* refactor(viewer): dedup event-detail helpers",
          "is_bot": false,
          "headline": "feat(viewer): Make custom events clickable to inspect (#552)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-06-19T17:54:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "462e09711f6c9bbfef950077a82c9f1babf041d4",
          "body": "* relax agents md\n\n* tiny relaxing of some small conditions\n\n* link agents.md from claude.md\n\n* mention viewer skills discovery in agents.md\n\n* unmention tdd while still requiring test coverage",
          "is_bot": false,
          "headline": "docs(agents): relax workflow-specific instructions (#551)",
          "author_name": "Franco Profeti",
          "author_login": "noxware",
          "committed_at": "2026-06-18T12:04:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d90ad6039f4ee7ea8acdd7f343a1c523bfa3d7cc",
          "body": "The trace= query parameter is now repeatable in the trace viewer and\nflamegraph. Each value is fetched independently and may be individually\ngzipped (unlike /api/trace, which gunzips server-side before serving a\nsingle response), so each component is ungzipped on its own before the\nraw bytes are con\n[…]\ns.\n- e2e-trace-tests.sh: run the new test in CI.\n- AGENTS.md + dial9-viewer/ui/README.md: document that new test_*.js files\n  must be registered in e2e-trace-tests.sh (CI does not auto-discover them).",
          "is_bot": false,
          "headline": "Make trace= viewer param repeatable, ungzipping each component (#546)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-17T13:24:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4116de55205c12f354107c04841638535a7a8c3a",
          "body": "* refactor: scaffold dial9-core, move shared leaf utils\n\n* docs: hide dial9-core internal plumbing from rustdoc\n\n* ci: include dial9-core in cargo package verification",
          "is_bot": false,
          "headline": "refactor: setup dial9-core (#540)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-06-17T10:40:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dac69e73cceb36c43b27114835913d85c623a6d4",
          "body": "…(#534)\n\n* feat: per-process boot_id namespace isolation for shared trace directories\n\nWhen multiple processes share the same trace directory, each process's\nbackground worker loads and processes all peers' files, causing\nmemory/CPU/disk runaway. Fix by namespacing trace segments into\nper-process su\n[…]\nBackProcessor gained a `dir` field but three test sites still used\nthe unit-struct construction syntax, breaking the lib test build (E0423).\n\n---------\n\nCo-authored-by: Russell Cohen <rcoh@amazon.com>",
          "is_bot": false,
          "headline": "Per-process boot_id namespace isolation for shared trace directories …",
          "author_name": "Shreyas Kanjalkar",
          "author_login": "skanjalkar",
          "committed_at": "2026-06-17T01:05:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "549e0d3a0708d293e18110e1f878229b47154e6f",
          "body": "* feat(viewer): density heatmap timeline + region select for S3 browser\n\nReplace the per-host card grid in the S3 browser with a density timeline\nheatmap: one row per service/host, x-axis = time, color = data density\n(each segment's bytes spread uniformly over its [start, last_modified]\nspan, normal\n[…]\n 'no data' stays\n  visually distinct from low-but-present density.\n- Adds 7 unit tests (clamp, realEnd preservation, gap detection,\n  no-clamp-across-real-gaps, unsorted input, seam-no-longer-spikes).",
          "is_bot": false,
          "headline": "improve s3 browser (#528)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-16T20:10:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a1a47a82a0a33679a9942e6a8df7334f325dca57",
          "body": "* refactor: drop thread_roles from FlushContext / Source\n\n* refactor: derive worker attribution at analysis, drop thread_roles",
          "is_bot": false,
          "headline": "refactor: drop thread_roles from FlushContext / Source (#539)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-06-16T19:01:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3810bffefa55f7939b26ba4a90ce3b6cf7e34a5",
          "body": "…t test (#543)\n\n* Fix flaky capture_produces_frames: isolate SIGSEGV-handler-replacement test\n\n`capture_debug_asserts_when_handler_replaced` replaced the *process-wide*\nSIGSEGV handler with SIG_IGN to verify `Unwinder::capture`'s `debug_assert!`\nfires. Its comment assumed nextest's process-per-test \n[…]\n.\n\nAlso reverts the leniency from the previous commit: the test now\nhard-asserts frame 0 == helper again, which is correct given that all\njobs that exercise the unwinder now build with frame pointers.",
          "is_bot": false,
          "headline": "Fix flaky capture_produces_frames: isolate SIGSEGV-handler-replacemen…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-16T18:27:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "abfbcf4b99a9012fef244fa108e506364527ddac",
          "body": "The test rebuilt the producer-side liveset by replaying the event stream in\norder, keying a HashMap on addr alone and insert/remove-ing as it went. That\nassumes the trace stream is strictly timestamp-ordered and that an address is\nnever reused before its FreeEvent appears. Neither holds:\n\n  - Memory\n[…]\n. The\nFreeEvent denormalizes both fields from the same liveset entry the matching\non_alloc inserted, so this is order-independent and address-reuse safe.\n\nVerified: 10/40 failures before, 0/100 after.",
          "is_bot": false,
          "headline": "test: fix flaky hook_realloc_emits_alloc_and_free_when_liveset_on (#545)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-16T18:26:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ed41cd35eb6d261f94bc7251d471353b22f0ac6d",
          "body": "* initial socket accept queues impl\n\n* better feature handling of socket accept queues\n\n* from_env support for socket accept queues\n\n* socket recv full\n\n* metrics-service update for demo trace\n\n* delegate socket accept queues default handling\n\n* cached inode & cookie to avoid fd scan\n\n* document per\n[…]\nueEvent` rename\n\n* address clippy unnecessary try_into\n\n* js fixes\n\n* js cleanup\n\n* reflect js changes in `dial9-trace-loading` skill\n\n* flamegraph recipe 5: find sampled poll\n\n* regenerate demo trace",
          "is_bot": false,
          "headline": "feat: socket accept queues source (#506)",
          "author_name": "Franco Profeti",
          "author_login": "noxware",
          "committed_at": "2026-06-16T17:04:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "858f5727960c6b64c7aa3933ebe82f8530ca2350",
          "body": "* refactor!: collapse handles into Dial9Handle / Dial9TokioHandle\n\n* fix Dial9TokioHandle mention, add entries to CHANGELOG",
          "is_bot": false,
          "headline": "refactor!: collapse handles into Dial9Handle / Dial9TokioHandle (#535)",
          "author_name": "Julián Montes de Oca",
          "author_login": "yulnr",
          "committed_at": "2026-06-16T09:30:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23ea29ab321330f153cfe3f7b91ab95a8ebc2e1e",
          "body": "* refactor(config)!: remove legacy positional config API\n\n* refactor(config): remove references",
          "is_bot": false,
          "headline": "Refactor(config): Remove legacy positional config (#538)",
          "author_name": "Facundo Luzko",
          "author_login": "Fluzko",
          "committed_at": "2026-06-16T00:52:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d73104a3d984bfc8621ef72b1b3b7d0441ef5f1a",
          "body": "…st (#524)",
          "is_bot": false,
          "headline": "tests: Allow for out-of-order tasks and add trace integrity stress te…",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-15T19:16:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e781a67a632d8ad60a5051e2632078a36c37699",
          "body": null,
          "is_bot": false,
          "headline": "feat: dial9::main now enables graceful_shutdown (#527)",
          "author_name": "Russell Cohen",
          "author_login": "rcoh",
          "committed_at": "2026-06-15T18:54:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 85,
      "commits_last_year": 407,
      "latest_release_at": "2026-07-24T14:51:41Z",
      "latest_release_tag": "dial9-v0.5.0-rc1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 22,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 0.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "dial9",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "telemetry",
            "profiling",
            "tokio",
            "tracing",
            "asynchronous",
            "development-tools::profiling"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/dial9",
          "is_deprecated": false,
          "latest_version": "0.3.13",
          "repository_url": "https://github.com/dial9-rs/dial9",
          "versions_count": 9,
          "total_downloads": 463,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 154,
          "first_published_at": "2026-05-08T03:04:25.398120Z",
          "latest_published_at": "2026-07-24T14:51:35.603801Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "dial9-core",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/dial9-core",
          "is_deprecated": false,
          "latest_version": "0.5.0-rc0",
          "repository_url": "https://github.com/dial9-rs/dial9",
          "versions_count": 1,
          "total_downloads": 34,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 11,
          "first_published_at": "2026-07-23T21:09:54.887686Z",
          "latest_published_at": "2026-07-23T21:09:54.887686Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "dial9-macro",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/dial9-macro",
          "is_deprecated": false,
          "latest_version": "0.3.7",
          "repository_url": "https://github.com/dial9-rs/dial9",
          "versions_count": 9,
          "total_downloads": 172322,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 56790,
          "first_published_at": "2026-04-18T01:16:12.771522Z",
          "latest_published_at": "2026-07-23T21:21:32.092778Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "dial9-utils",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/dial9-utils",
          "is_deprecated": false,
          "latest_version": "0.5.0-rc0",
          "repository_url": "https://github.com/dial9-rs/dial9",
          "versions_count": 1,
          "total_downloads": 18,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 6,
          "first_published_at": "2026-07-23T21:10:44.248259Z",
          "latest_published_at": "2026-07-23T21:10:44.248259Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "dial9-viewer",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/dial9-viewer",
          "is_deprecated": false,
          "latest_version": "0.3.13",
          "repository_url": "https://github.com/dial9-rs/dial9",
          "versions_count": 17,
          "total_downloads": 1565,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 493,
          "first_published_at": "2026-04-10T23:52:58.317817Z",
          "latest_published_at": "2026-07-24T14:51:10.320978Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "dial9-perf-self-profile",
          "exists": true,
          "license": "MIT OR Apache-2.0",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/dial9-perf-self-profile",
          "is_deprecated": false,
          "latest_version": "0.4.3",
          "repository_url": "https://github.com/dial9-rs/dial9",
          "versions_count": 15,
          "total_downloads": 97345,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 31944,
          "first_published_at": "2026-03-01T17:40:29.412940Z",
          "latest_published_at": "2026-07-23T21:21:05.456374Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "dial9-trace-format",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/dial9-trace-format",
          "is_deprecated": false,
          "latest_version": "0.4.1",
          "repository_url": "https://github.com/dial9-rs/dial9",
          "versions_count": 11,
          "total_downloads": 205319,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 61418,
          "first_published_at": "2026-03-20T14:44:01.276195Z",
          "latest_published_at": "2026-07-23T20:59:01.642446Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "dial9-tokio-telemetry",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "telemetry",
            "profiling",
            "tokio",
            "tracing",
            "symposium",
            "asynchronous",
            "development-tools::profiling"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/dial9-tokio-telemetry",
          "is_deprecated": false,
          "latest_version": "0.3.15",
          "repository_url": "https://github.com/dial9-rs/dial9",
          "versions_count": 21,
          "total_downloads": 206893,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 61375,
          "first_published_at": "2026-03-01T17:41:50.075389Z",
          "latest_published_at": "2026-07-23T21:21:22.777710Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 38,
      "stars": 418,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-06",
            "count": 2
          },
          {
            "date": "2026-03-16",
            "count": 1
          },
          {
            "date": "2026-03-20",
            "count": 4
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-03-29",
            "count": 1
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-17",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-24",
            "count": 1
          },
          {
            "date": "2026-04-26",
            "count": 1
          },
          {
            "date": "2026-04-27",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-05-01",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-05-15",
            "count": 1
          },
          {
            "date": "2026-05-17",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 1
          },
          {
            "date": "2026-06-07",
            "count": 1
          },
          {
            "date": "2026-06-10",
            "count": 2
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-14",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-14",
            "count": 1
          },
          {
            "date": "2026-07-16",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 37,
        "total_forks": 38
      },
      "star_history": null,
      "open_issues_and_prs": 107
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "dial9-viewer/ui/tsconfig.json"
      ],
      "toolchain_manifests": [
        "Cargo.toml",
        "dial9-core/Cargo.toml",
        "dial9-macro/Cargo.toml",
        "dial9-tokio-telemetry/Cargo.toml",
        "dial9-trace-format-derive/Cargo.toml",
        "dial9-trace-format/Cargo.toml",
        "dial9-trace-format/fuzz/Cargo.toml",
        "dial9-utils/Cargo.toml",
        "dial9-viewer/Cargo.toml",
        "dial9/Cargo.toml",
        "examples/memory-local/Cargo.toml",
        "examples/metrics-service/Cargo.toml",
        "examples/simple-local/Cargo.toml",
        "perf-self-profile/Cargo.toml"
      ],
      "largest_source_bytes": 286549,
      "source_files_sampled": 685,
      "oversized_source_files": 14,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 8011
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "dial9-core/Cargo.toml",
        "dial9-macro/Cargo.toml",
        "dial9-tokio-telemetry/Cargo.toml",
        "dial9-trace-format-derive/Cargo.toml",
        "dial9-trace-format/Cargo.toml",
        "dial9-utils/Cargo.toml",
        "dial9-viewer/Cargo.toml",
        "dial9/Cargo.toml",
        "perf-self-profile/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": "bon",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "bytes",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "crossbeam-queue",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "ulid",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "dial9-trace-format",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "libc",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "tokio",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio-util",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "futures-util",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "flate2",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "metrique",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.23"
        },
        {
          "name": "metrique-timesource",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "shuttle",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.9.1"
        },
        {
          "name": "tracing",
          "manifest": "dial9-core/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.44"
        },
        {
          "name": "syn",
          "manifest": "dial9-macro/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "quote",
          "manifest": "dial9-macro/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "proc-macro2",
          "manifest": "dial9-macro/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.52.0"
        },
        {
          "name": "tokio-util",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "arc-swap",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "libc",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "futures-util",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "pin-project-lite",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "serde",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "smallvec",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "bytes",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "dial9-perf-self-profile",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "dial9-trace-format",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "tracing",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.44"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "hostname",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "bon",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "aws-sdk-s3",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-config",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "flate2",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "time",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "metrique",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.23"
        },
        {
          "name": "metrique-timesource",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "shuttle",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.9.1"
        },
        {
          "name": "dial9-core",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "dial9-utils",
          "manifest": "dial9-tokio-telemetry/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "syn",
          "manifest": "dial9-trace-format-derive/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "quote",
          "manifest": "dial9-trace-format-derive/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "proc-macro2",
          "manifest": "dial9-trace-format-derive/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "dial9-trace-format-derive",
          "manifest": "dial9-trace-format/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "serde",
          "manifest": "dial9-trace-format/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "dial9-core",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "bon",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "tokio",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tracing",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.44"
        },
        {
          "name": "aws-sdk-s3",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-config",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "time",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "hostname",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "serde",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "dial9-utils/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "axum",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "axum-extra",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.10"
        },
        {
          "name": "bytes",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "clap",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "4"
        },
        {
          "name": "flate2",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "futures",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "serde",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "rust-embed",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "8"
        },
        {
          "name": "mime_guess",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "tower-http",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.6"
        },
        {
          "name": "uuid",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "form_urlencoded",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tracing",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "metrique",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.23"
        },
        {
          "name": "metrique-writer",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "time",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "aws-config",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "aws-sdk-s3",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "anyhow",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "bon",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "s3s",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.14.1"
        },
        {
          "name": "s3s-fs",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.14.1"
        },
        {
          "name": "s3s-aws",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.14.1"
        },
        {
          "name": "tempfile",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "dial9-trace-format",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "arrow",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "54"
        },
        {
          "name": "parquet",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "54"
        },
        {
          "name": "blake3",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "lasso",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "rustc-hash",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "dial9-core",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "hex",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "urlencoding",
          "manifest": "dial9-viewer/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "dial9-core",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "dial9-perf-self-profile",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "dial9-tokio-telemetry",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.5.0-rc0"
        },
        {
          "name": "dial9-macro",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "dial9-viewer",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.5.0-rc1"
        },
        {
          "name": "anyhow",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.52.0"
        },
        {
          "name": "bon",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "tracing",
          "manifest": "dial9/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.44"
        },
        {
          "name": "bon",
          "manifest": "perf-self-profile/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "3"
        },
        {
          "name": "bytes",
          "manifest": "perf-self-profile/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "crossbeam-queue",
          "manifest": "perf-self-profile/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "dial9-core",
          "manifest": "perf-self-profile/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "dial9-trace-format",
          "manifest": "perf-self-profile/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": null
        },
        {
          "name": "scc",
          "manifest": "perf-self-profile/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "2"
        },
        {
          "name": "tokio",
          "manifest": "perf-self-profile/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tracing",
          "manifest": "perf-self-profile/Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.44"
        }
      ],
      "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": 10,
        "merged_prs": 414,
        "open_issues": 97,
        "closed_ratio": 0.599,
        "closed_issues": 145,
        "closed_unmerged_prs": 46
      },
      "bus_factor": 1,
      "bot_contributors": 3,
      "top_contributors": [
        {
          "type": "User",
          "login": "rcoh",
          "commits": 236,
          "avatar_url": "https://avatars.githubusercontent.com/u/492903?v=4"
        },
        {
          "type": "User",
          "login": "jlizen",
          "commits": 52,
          "avatar_url": "https://avatars.githubusercontent.com/u/44884346?v=4"
        },
        {
          "type": "User",
          "login": "yulnr",
          "commits": 30,
          "avatar_url": "https://avatars.githubusercontent.com/u/22042418?v=4"
        },
        {
          "type": "User",
          "login": "Fluzko",
          "commits": 29,
          "avatar_url": "https://avatars.githubusercontent.com/u/37568902?v=4"
        },
        {
          "type": "User",
          "login": "noxware",
          "commits": 10,
          "avatar_url": "https://avatars.githubusercontent.com/u/7684329?v=4"
        },
        {
          "type": "User",
          "login": "fmzbl",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/66457708?v=4"
        },
        {
          "type": "User",
          "login": "zz85",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/314997?v=4"
        },
        {
          "type": "User",
          "login": "jasgin",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/67525213?v=4"
        },
        {
          "type": "User",
          "login": "nickrobinson",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/479287?v=4"
        },
        {
          "type": "User",
          "login": "prabrat",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/67966492?v=4"
        }
      ],
      "contributors_sampled": 27,
      "top_contributor_share": 0.587
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "audit.yml",
        "benchmarks-pr.yml",
        "benchmarks.yml",
        "ci.yml",
        "release-pr.yml",
        "release.yml",
        "stress-test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: githubv4.Query: non-200 OK status code: 504 Gateway Timeout body: \"{\\\"message\\\": \\\"We couldn't respond to your request in time. Sorry about that. Please try resubmitting your request and contact us if the problem persists.\\\"}\\r\\n\"",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 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": 10,
            "reason": "all changesets reviewed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 15 contributing companies or organizations",
            "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": 10,
            "reason": "project is 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": 10,
            "reason": "30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 9,
            "reason": "dependency not pinned by hash detected -- score normalized to 9",
            "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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "755d86393c4bfe4423aa72038c015296bfc3c3db",
        "ran_at": "2026-07-24T16:05:37Z",
        "aggregate_score": 6,
        "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-24T15:02:21Z",
      "oldest_open_prs": [
        {
          "number": 152,
          "created_at": "2026-04-01T13:48:55Z",
          "last_comment_at": "2026-06-01T09:34:03Z",
          "last_comment_author": "yulnr"
        },
        {
          "number": 554,
          "created_at": "2026-06-18T20:24:52Z",
          "last_comment_at": "2026-07-23T14:50:03Z",
          "last_comment_author": "Fluzko"
        },
        {
          "number": 572,
          "created_at": "2026-06-24T00:12:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 667,
          "created_at": "2026-07-14T05:11:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 684,
          "created_at": "2026-07-19T23:54:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 695,
          "created_at": "2026-07-21T15:55:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 696,
          "created_at": "2026-07-21T17:27:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 702,
          "created_at": "2026-07-23T14:02:56Z",
          "last_comment_at": "2026-07-24T15:09:49Z",
          "last_comment_author": "rcoh"
        },
        {
          "number": 713,
          "created_at": "2026-07-24T12:51:13Z",
          "last_comment_at": "2026-07-24T13:21:16Z",
          "last_comment_author": "rcoh"
        },
        {
          "number": 714,
          "created_at": "2026-07-24T13:40:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-24T14:05:52Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": [
        {
          "number": 26,
          "created_at": "2026-03-01T13:44:00Z",
          "last_comment_at": "2026-03-10T19:40:54Z",
          "last_comment_author": "jlizen"
        },
        {
          "number": 34,
          "created_at": "2026-03-02T11:36:15Z",
          "last_comment_at": "2026-03-04T21:49:08Z",
          "last_comment_author": "rcoh"
        },
        {
          "number": 50,
          "created_at": "2026-03-04T18:26:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 55,
          "created_at": "2026-03-04T21:47:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 56,
          "created_at": "2026-03-05T12:55:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 62,
          "created_at": "2026-03-06T21:16:30Z",
          "last_comment_at": "2026-03-10T01:36:52Z",
          "last_comment_author": "jlizen"
        },
        {
          "number": 67,
          "created_at": "2026-03-09T16:16:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 68,
          "created_at": "2026-03-09T16:59:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 70,
          "created_at": "2026-03-10T00:40:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 71,
          "created_at": "2026-03-11T01:29:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 75,
          "created_at": "2026-03-13T13:24:48Z",
          "last_comment_at": "2026-03-19T12:13:01Z",
          "last_comment_author": "rcoh"
        },
        {
          "number": 82,
          "created_at": "2026-03-16T17:43:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 83,
          "created_at": "2026-03-16T19:13:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 93,
          "created_at": "2026-03-18T00:55:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 130,
          "created_at": "2026-03-23T17:17:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 132,
          "created_at": "2026-03-24T00:02:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 137,
          "created_at": "2026-03-24T16:00:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 138,
          "created_at": "2026-03-26T12:27:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 156,
          "created_at": "2026-04-02T13:27:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 189,
          "created_at": "2026-04-13T16:03:25Z",
          "last_comment_at": "2026-07-07T18:27:32Z",
          "last_comment_author": "jlizen"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dial9-rs/dial9",
    "host": "github.com",
    "name": "dial9",
    "owner": "dial9-rs"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 69,
      "inputs": {
        "security": 60,
        "vitality": 83,
        "community": 70,
        "governance": 62,
        "engineering": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "commits_last_year": 407,
              "human_commit_share": 0.99,
              "days_since_last_push": 0,
              "active_weeks_last_year": 22
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "22/52 weeks with commits",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "407 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 407
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 85,
              "latest_release_tag": "dial9-v0.5.0-rc1",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 0.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "85 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 85
                    }
                  }
                ],
                "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 ~0.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 70,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "forks": 38,
              "stars": 418,
              "watchers": 3,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "418 stars",
                "points": 42.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 418
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "38 forks",
                "points": 13.1,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "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": 89,
            "inputs": {
              "packages": [
                "dial9",
                "dial9-core",
                "dial9-macro",
                "dial9-utils",
                "dial9-viewer",
                "dial9-perf-self-profile",
                "dial9-trace-format",
                "dial9-tokio-telemetry"
              ],
              "dependents": null,
              "ecosystems": "crates",
              "total_downloads": 683959,
              "monthly_downloads": 212191
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "212,191 downloads/month across crates",
                "points": 71,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 212191,
                      "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": 62,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 27,
              "top_contributor_share": 0.587
            },
            "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 59% of commits",
                "points": 9.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 59
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "27 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 15 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "merged_prs": 414,
              "open_issues": 97,
              "closed_issues": 145,
              "issue_closed_ratio": 0.599,
              "closed_unmerged_prs": 46
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "60% of issues closed",
                "points": 28,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 60
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "414/460 decided PRs merged",
                "points": 34.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 414,
                      "decided": 460
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "all changesets reviewed",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "followers": 3,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "dial9-rs",
              "public_repos": 2,
              "account_age_days": 153
            },
            "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": "3 followers of dial9-rs",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "dial9-rs"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "2 public repos, account ~0 yr old",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 2
                    }
                  },
                  {
                    "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": [
                "dial9",
                "dial9-core",
                "dial9-macro",
                "dial9-utils",
                "dial9-viewer",
                "dial9-perf-self-profile",
                "dial9-trace-format",
                "dial9-tokio-telemetry"
              ],
              "ecosystems": "crates",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "8 package(s) on crates",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 8,
                      "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": "21 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 67,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "7 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 60,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: githubv4.Query: non-200 OK status code: 504 Gateway Timeout body: \"{\\\"message\\\": \\\"We couldn't respond to your request in time. Sorry about that. Please try resubmitting your request and contact us if the problem persists.\\\"}\\r\\n\"",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 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": "all changesets reviewed",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 15 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "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 fuzzed",
                "points": 5,
                "status": "met",
                "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": "30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 9",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "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": 12
            },
            "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.99,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 8011
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "98 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 98,
                      "sampled": 99
                    }
                  }
                ],
                "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",
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "dial9-viewer/ui/tsconfig.json"
              ],
              "agent_commit_share": 0.03,
              "toolchain_manifests": [
                "Cargo.toml",
                "dial9-core/Cargo.toml",
                "dial9-macro/Cargo.toml",
                "dial9-tokio-telemetry/Cargo.toml",
                "dial9-trace-format-derive/Cargo.toml",
                "dial9-trace-format/Cargo.toml",
                "dial9-trace-format/fuzz/Cargo.toml",
                "dial9-utils/Cargo.toml",
                "dial9-viewer/Cargo.toml",
                "dial9/Cargo.toml",
                "examples/memory-local/Cargo.toml",
                "examples/metrics-service/Cargo.toml",
                "examples/simple-local/Cargo.toml",
                "perf-self-profile/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, dial9-core/Cargo.toml, dial9-macro/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, dial9-core/Cargo.toml, dial9-macro/Cargo.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "dial9-viewer/ui/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "dial9-viewer/ui/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "3 of the last 100 commits agent-authored or agent-credited",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 3,
                      "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 9",
                "points": 9,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 286549,
              "source_files_sampled": 685,
              "oversized_source_files": 14
            },
            "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": "14/685 source files over 60KB",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 685,
                      "oversized": 14
                    }
                  }
                ],
                "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T16:06:21.346592Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dial9-rs/dial9.svg",
  "full_name": "dial9-rs/dial9",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas 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.