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

benjamin-bader / stiletto

Compile-time dependency Injection for .Net, Mono, and MonoTouch

C#Apache-2.0★ 43 estrellas⑂ 14 forksdesde abr 2013Ver en GitHub ↗

benjamin-bader/stiletto tiene un índice de salud de 58 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (74/100) y la más baja, Security (44/100). Se actualizó por última vez hace 13 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

58
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

Ben BaderCuenta personal
73 seguidores135 repositorios públicosdesde dic 2010Together.AI

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
NuGetStiletto1.0.0-16hace 15 díasdependency-injectiondiiocsource-generatordaggeraottrimming

Métricas por categoría

Vitalidad

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

65Moderado · 22% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 13 días
1.4/36Cadencia de commits — 2/52 semanas con commits
13.1/18Volumen de commits — 28 commits en el último año
10/10OpenSSF Scorecard: Maintained — 28 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year28
human_commit_share0,99
days_since_last_push13
active_weeks_last_year2
Cómo se puntúa
27/27Publica versiones — 1 versiones publicadas
36/36Recencia de las versiones — última versión hace 15 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count1
latest_release_tagv1.0.0
releases_from_tagsno
days_since_latest_release15
mean_days_between_releases
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

47En riesgo · 18% del índice global
Cómo se puntúa
26.3/60Estrellas — 43 estrellas
9.3/25Forks — 14 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks14
stars43
watchers1
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)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
47.1/80Descargas totales — 34.282 descargas históricas en nuget
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesStiletto
dependents
ecosystemsnuget
total_downloads34.282
monthly_downloads
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?

57Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.4/22.5Distribución de commits — el principal contribuyente firma el 98% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,984
Cómo se puntúa
35.1/46.8Resolución de issues — 75% de issues cerradas
35.9/38.3Aceptación de PR — 30/32 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/21 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs30
open_issues5
closed_issues15
issue_closed_ratio0,75
closed_unmerged_prs2
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
13.4/25Alcance del propietario — 73 seguidores de benjamin-bader
25/25Trayectoria — 135 repos públicos, cuenta de ~15 años
Datos de entrada utilizados
followers73
owner_typeUser
is_verified
owner_loginbenjamin-bader
public_repos135
account_age_days5711
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en nuget
35/35Recencia de publicación — última publicación hace 15 días
20/20Historial de versiones — 16 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesStiletto
ecosystemsnuget
any_deprecatedno
min_days_since_publish15

Calidad de Ingeniería

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

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

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — http://stiletto.bendb.com
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepagehttp://stiletto.bendb.com
has_readme
has_docs_dir
has_description

Seguridad

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

44En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2/2.5CI-Tests — 16 out of 19 merged PRs checked by a CI test -- score normalized to 8
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/21 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 28 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,4
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

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

65Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
26.9/40Historial de commits legible — 50 de 99 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,505
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes4103
Cómo se puntúa
12.6/18Arranque con un solo comando — samples/Example/Example.csproj, samples/LibraryExample/LibraryExample.csproj, samples/Stiletto.AotSmokeTest/Stiletto.AotSmokeTest.csproj (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — C# (tipado estático)
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 19 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,19
toolchain_manifestssamples/Example/Example.csproj, samples/LibraryExample/LibraryExample.csproj, samples/Stiletto.AotSmokeTest/Stiletto.AotSmokeTest.csproj, src/Stiletto.Generator/Stiletto.Generator.csproj, src/Stiletto/Stiletto.csproj, test/Stiletto.Generator.Tests/Stiletto.Generator.Tests.csproj, test/Stiletto.Integration.External/Stiletto.Integration.External.csproj, test/Stiletto.Integration.Tests/Stiletto.Integration.Tests.csproj, test/Stiletto.Tests/Stiletto.Tests.csproj
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — C# (tipado estático)
54.5/55Tamaños de archivo manejables — 1/117 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageC#
largest_source_bytes83.095
source_files_sampled117
oversized_source_files1
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — example, samples
Datos de entrada utilizados
example_dirsexample, samples
has_mcp_signalno
api_schema_files

Datos clave

43estrellas de GitHub
2contribuidores
28commits en los últimos 12 meses
13días desde el último push
1versiones publicadas
1factor bus
5issues abiertas
ecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

Más detalle

Historial de estrellas y forks 0 ★ / 14 ⇿
0Estrellas
14Forks

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.

0246810121112013-062018-062023-07

Cada punto abarca 10 días.

OpenSSF Scorecard 4.4 / 10
4.4agregado

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
8CI-Tests16 out of 19 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/21 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained28 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 1
RegistroPaqueteRestricción de versiónManifiesto
NuGetMicrosoft.CodeAnalysis.CSharpsrc/Stiletto.Generator/Stiletto.Generator.csproj
Todas las dependencias 6

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 1 paquetes directos y 5 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
NuGetMicrosoft.CodeAnalysis.CSharpdirecta
NuGetMicrosoft.NET.Test.Sdkindirecta
NuGetVerify.SourceGeneratorsindirecta
NuGetVerify.XunitV3indirecta
NuGetxunit.runner.visualstudioindirecta
NuGetxunit.v3indirecta
Avisos de dependencias sin evaluar

El cotejo de avisos no pudo ejecutarse para este informe: No resolved dependencies carried a version and a supported ecosystem

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 1344,
      "has_wiki": true,
      "homepage": "http://stiletto.bendb.com",
      "languages": {
        "C#": 332075,
        "CSS": 6026,
        "HTML": 15199
      },
      "pushed_at": "2026-07-14T06:55:05Z",
      "created_at": "2013-04-08T03:25:36Z",
      "owner_type": "User",
      "updated_at": "2026-07-14T14:38:17Z",
      "description": "Compile-time dependency Injection for .Net, Mono, and MonoTouch",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "master",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "C#",
      "significant_languages": [
        "C#"
      ]
    },
    "owner": {
      "blog": "https://www.bendb.com",
      "name": "Ben Bader",
      "type": "User",
      "login": "benjamin-bader",
      "company": "Together.AI",
      "location": null,
      "followers": 73,
      "avatar_url": "https://avatars.githubusercontent.com/u/512212?v=4",
      "created_at": "2010-12-06T21:40:19Z",
      "is_verified": null,
      "public_repos": 135,
      "account_age_days": 5711
    },
    "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": "v1.0.0",
          "kind": "major",
          "published_at": "2026-07-12T07:51:47Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7a98d38bf367adda78cdf7ddd4b07f19b0c02180",
          "body": "release-please's source of truth is .release-please-manifest.json, and the build\ntakes its version from <Version> in src/Stiletto/Stiletto.csproj (kept in sync\nvia extra-files) — nothing reads version.txt. The \"simple\" strategy updates it\nwith createIfMissing:false, so deleting it is permanent: it won't be recreated.\nAlso drops version.txt from CLAUDE.md's list of release-please-owned files.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: drop redundant version.txt (#53)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-13T22:38:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e915ba465730f723ac6e2809dfb72977013a0bf1",
          "body": "It contained only the VS2013-era solution setting\n`disableSourceControlIntegration` for the legacy packages.config/packages-folder\nrestore — a no-op for modern SDK-style (PackageReference) restore, and it\ndefines no package sources. Nothing in the build references it.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build: remove obsolete .nuget/NuGet.Config (#52)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-13T22:11:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6663a3fd16362a7208e7af3e1dc491d9cc96851f",
          "body": "…ed (#51)\n\nAdds docs/architecture.md — a high-level \"how Stiletto works\" guide covering the\nbuild-time (source generator) and runtime (Container/Resolver/loaders) phases,\nthe string-key model, loader registration incl. the eager cross-assembly anchor,\nthe NativeAOT feature switch, packaging, and a r\n[…]\n/cross-assembly-loader-registration.md from \"proposed\" to\n\"implemented\" (shipped in #49) and adjusts the summary's proposal voice.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add architecture guide and mark cross-assembly design implement…",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-13T18:38:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d1f76da9c611e1c998551bab2af4ed85ac7dafeb",
          "body": "…chors (#49)\n\n* docs: design for eager cross-assembly loader registration\n\nDocument the ModuleInitializer timing gap (a contributing assembly that is\nnever touched before Container.Create never registers its loader, a hard\nfailure in registry-only/AOT mode) and the codegen fix: anchor an eager\naggre\n[…]\nocs/design/cross-assembly-loader-registration.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(generator): eagerly register cross-assembly loaders at Create an…",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-13T06:23:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4ccdb0501ec17f331c9aafcd544b7d7ca660da8",
          "body": "Make `www/` on master the self-contained source of truth for the marketing\nsite (stiletto.bendb.com) and add a manual GitHub Actions deploy, replacing\nthe hand-maintained gh-pages branch.\n\n- www/CNAME and www/google28922fbc71f875bb.html: the deploy-only files that\n  previously lived only at the gh-p\n[…]\nes via actions/deploy-pages.\n\nGoing live still requires flipping the repo Pages source from the gh-pages\nbranch to GitHub Actions.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: publish www to Pages via a manual deploy workflow (#48)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T16:05:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d0ae9999d16518a3ca1912c8a4ecab50b591cc13",
          "body": "Remove the net4.0 Fody-era projects now that the Roslyn source generator has\nfully replaced them: Stiletto.Fody, the iOS/Android/Windows Phone heads,\nStiletto.Test(.PostWeaving), ValidateBuilds, the IntegrationTests harness, and\nTools.\n\nPort the Example and LibraryExample coffee samples to SDK-style\n[…]\nthe old micro-benchmark.\n\nUpdate the stale \"kept for reference\" notes in Directory.Build.props and\nCLAUDE.md, and tidy .gitignore.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: drop legacy projects and modernize the sample apps (#47)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T15:51:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2e0a8896dc9eca900122c991910675268a872c33",
          "body": "…new layout (#46)\n\nBring over the Stiletto.Test and IntegrationTests cases that still describe\ndistinct behavior under the source generator:\n\n- Stiletto.Tests (reflection runtime): LazyInjectionTests,\n  ProviderInjectionTests, SetInjectionTests, ValidatorTests, and the\n  remaining KeyTestsBase cases\n[…]\nCallsRewritten, the orphan-set builds) are covered by the\nabove and the existing ToolchainEndToEndTests, so they are not re-added.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: port lazy/provider/set/validator + cross-assembly tests to the …",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T08:20:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b744f2ae310b2d9184db951c5c2a0ddc037490f",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(master): release 1.0.0 (#43)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T07:51:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0d99a612afe9edbeeaf89646cb8f7be0e8af8b2",
          "body": "Stiletto 1.0 drops the Fody/IL-weaving pipeline in favor of a Roslyn source\ngenerator bundled in the Stiletto package, which emits binding code at compile\ntime and works under NativeAOT and trimming.\n\nThe generator/weaver change itself landed in commits that predate the\nrelease-please baseline (boot\n[…]\nator ships\nin the Stiletto package and runs automatically. 1.0 targets net10.0 only. The\npublic API ([Inject]/[Module]/[Provides]/[Named]/[Singleton]/Container.Create)\nis unchanged.\n\nRelease-As: 1.0.0",
          "is_bot": false,
          "headline": "feat!: replace the Fody weaver with a Roslyn source generator (#45)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T07:50:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "65db585942a3ed13402d0a34d3b37698c6450b03",
          "body": "release-please keeps advancing a prerelease baseline (1.0.0-alpha.1 ->\n1.0.1-alpha.1) rather than dropping the -alpha automatically; graduating\nto stable needs an explicit Release-As override. Document that, and use it\nhere to cut the first stable release.\n\nRelease-As: 1.0.0",
          "is_bot": false,
          "headline": "docs: graduate to 1.0.0 and clarify prerelease graduation (#44)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T07:38:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fd3f923eedc5e4aa422af599ce36043ef78ded8",
          "body": "Key.SubstringStartsWith used IndexOf(...) >= 0, which is true when the\nprefix appears anywhere at or after the offset - not only when the type\n*starts* with it. Its callers (GetProviderKey/GetLazyKey/GetSetElementKey)\nthen hand the match to ExtractKey, whose slicing assumes the prefix begins\nexactly\n[…]\n (== offset) so only an outermost wrapper is detected.\nAdd KeyTests covering the extract-happy-path and the nested-argument cases.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: don't misclassify keys that merely nest Provider/Lazy/Set (#42)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T07:31:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "623f9281f4620615f7e0dc741d46aab14143aa2e",
          "body": "Add release-please to own versioning, changelog, and NuGet publishing:\n\n- release-please-config.json / .release-please-manifest.json / version.txt\n  seed the single package at 1.0.0-alpha.1; the next release graduates to\n  1.0.0 and normal semver applies thereafter.\n- release-please.yml opens the re\n[…]\nquash-merge = title\n  becomes the commit release-please parses).\n- CLAUDE.md documents the commit convention and the release flow.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build: automate releases with release-please (#41)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T07:19:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a35fcbc43095eccb607aa1663669e542042c2e1",
          "body": null,
          "is_bot": false,
          "headline": "chore: apply IDE suggestions (#40)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T06:52:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df7ae71de61e445a605a3d2c03a5f3e3177650c6",
          "body": "Replace the obsolete Fody-era packaging with a single Stiletto package that\nships the runtime (lib/net10.0) and the Roslyn source generator\n(analyzers/dotnet/cs) together, so one PackageReference wires up both.\n\n- Delete the NuGet/ folder (Fody nuspecs, install/uninstall scripts, the\n  hand-rolled N\n[…]\no nuget.org\n  via Trusted Publishing (OIDC, no static API key).\n- Refresh README install/build docs; drop stale NuGetBuild ignore.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build: modernize NuGet packaging, drop Fody (#39)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-12T06:47:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a92882fa18e35dfdb26ec68470c37a4b483e3f4",
          "body": null,
          "is_bot": false,
          "headline": "feat: add nullability annotations",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-11T23:29:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5a439ea2b15752f221e2cd567f7fe4c6a2d2833",
          "body": "* Remove dead reflection-loader discovery code\n\nReflectionUtils.GetCompiledLoaders (and its AppDomain.AssemblyLoad hook, the\n`loaders` field, HasAssemblyBeenExamined, and TypeComparer) were the old\n$CompiledLoader$ scan, unused since loader discovery moved to LoaderRegistry.\nAlso drops the now-unuse\n[…]\n (required for Roslyn analyzers). 47 tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: remove dead reflection-loader, go net10-only (#38)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T23:32:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4d84d80ffb6b64db81cdfc88954d8e426b1e63b",
          "body": "P3: NativeAOT / trimming support via a reflection-fallback feature sw…",
          "is_bot": false,
          "headline": "Merge pull request #36 from benjamin-bader/p3-aot-trimming",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T22:29:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caca0641a32afb208e8d38711249538d56e1bcde",
          "body": "…itch\n\nAdds Container.ReflectionFallbackEnabled, backed by the Stiletto.ReflectionFallback\nfeature switch (default on). When off, Container.Create is registry-only: the\nreflection loaders (CodegenLoader + ReflectionLoader) are not consulted, so under\ntrimming/NativeAOT they're removed entirely and a\n[…]\n linux-x64 and runs\nthe binary as a hard gate.\n\n47 tests green; runtime multitargets net10.0;netstandard2.0 (annotations #if NET).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "P3: NativeAOT / trimming support via a reflection-fallback feature sw…",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T22:19:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a635de735167370c555dae7bd36682689b5ecd1b",
          "body": "Ci GitHub actions",
          "is_bot": false,
          "headline": "Merge pull request #35 from benjamin-bader/ci-github-actions",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T21:32:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5e431b5b79d1dc24becb190282b1c13febbd53b",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Use actions/checkout@v5",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T21:21:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4498f97adb722c2d28493a801567c1610aad070d",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Use actions/setup-dotnet@v5",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T21:20:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eb0cb6ffa2768f47a4434eb53d26a109b9bb90f3",
          "body": "P2: compile Lazy<T> and IProvider<T> bindings",
          "is_bot": false,
          "headline": "Merge pull request #34 from benjamin-bader/p2-lazy-provider-bindings",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T21:18:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40e6a3df962e814f036bda1631e60e7412cda6e0",
          "body": "Runs on pull_request targeting master and on push to master. Installs the SDK\npinned by global.json, then restores, builds (Release), and tests Stiletto.slnx\n— so only the modern SDK-style projects are exercised (the legacy net4.0\nprojects aren't in the solution). Concurrency cancels superseded runs per ref.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add GitHub Actions CI (build + test on PRs and master)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T21:18:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c34e1e117329b163e42ae30e79921db6fd10cee",
          "body": "Removes the last reflection from the resolved object graph. Previously Lazy<T>\nand IProvider<T> dependencies fell through to the reflection fallback\n(ReflectionLazyBinding / ReflectionProviderBinding, which use MakeGenericType +\nActivator); the aggregated loader returned null for them.\n\nRuntime: add\n[…]\no-end test resolves a deferred Lazy<Leaf> and an IProvider<Leaf> through\na live Container via the compiled loader. 46 tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "P2: compile Lazy<T> and IProvider<T> bindings",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T21:03:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b4ec8c91eed602f3e3677b914afb77514b3492f",
          "body": "Modernize to SDK-style + port Dagger codegen to a Roslyn source generator",
          "is_bot": false,
          "headline": "Merge pull request #33 from benjamin-bader/modernize-source-generator",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T20:39:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df6221ad22508a875fa4e05762d978da45058e81",
          "body": "Every other generator test hand-constructs the driver (new StilettoGenerator()),\nwhich bypasses [Generator] discovery, analyzer loading, and natural\n[ModuleInitializer] registration. This new project closes that gap: it references\nStiletto.Generator with OutputItemType=\"Analyzer\", so csc discovers a\n[…]\ndule). No Lazy<T>/IProvider<T>, so it needs nothing from P2.\n\nAdds InternalsVisibleTo for LoaderRegistry.Snapshot. 45 tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add toolchain end-to-end fixture (generator referenced as an analyzer)",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T20:36:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57d8341f8c6a33786dc606f1639ed03a10a5a68b",
          "body": "Removes remnants left when InjectBindingGenerator/ModuleGenerator were folded\ninto StilettoGenerator:\n- Drops a stray [Generator] attribute dangling on ModuleEmitter (inert, since\n  Roslyn ignores a [Generator] type that doesn't implement the interface).\n- Removes the duplicate class-level doc comme\n[…]\nredicates now live only in StilettoGenerator).\n\nStilettoGenerator is now the sole [Generator]. No behavior change; 44 tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Clean up generator-merge leftovers",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T20:30:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "be556d65f1bbda796cf6162cf35052a2725648cd",
          "body": "…ator\n\nRestructures the repo (src/ + test/, SDK-style projects, Central Package\nManagement, .slnx) targeting net10.0;netstandard2.0, and replaces the Fody /\nMono.Cecil IL weaver with a Roslyn incremental source generator that emits\nreadable C# instead of IL.\n\nRuntime (src/Stiletto):\n- Moved to src/,\n[…]\n projects (Stiletto.Fody, ValidateBuilds, mobile heads, Example)\nare left in place as reference and are not part of Stiletto.slnx.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Modernize to SDK-style + port Dagger codegen to a Roslyn source gener…",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2026-07-10T19:09:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "be21715d3c6be6f0846a49da7d1b4fef137662f5",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Ben Bader",
          "author_login": "benjamin-bader",
          "committed_at": "2017-11-17T02:01:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97027b407f371c09791e641734b3fa5625f987e0",
          "body": "… set",
          "is_bot": false,
          "headline": "Allowing compiled and non-compiled bindings to contribute to the same…",
          "author_name": "Benjamin Bader",
          "author_login": null,
          "committed_at": "2013-11-15T22:19:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82227ec32d512be1d66382bee9d27af5e0060911",
          "body": "Sets and libraries",
          "is_bot": false,
          "headline": "Merge pull request #30 from benjamin-bader/sets-and-libraries",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-11-15T21:17:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04a9cf1276ca31ea785a100ac1da8ae67c6a3604",
          "body": null,
          "is_bot": false,
          "headline": "Already forgot what these flags are, so I added a comment.",
          "author_name": "Benjamin Bader",
          "author_login": null,
          "committed_at": "2013-11-15T20:23:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f768615e089b2b455b2dde051e3c4bb836d1921b",
          "body": "The way this works is basically (but not actually):\n\nIsLibrary = contributors.All(c => c.IsLibrary)",
          "is_bot": false,
          "headline": "Propagating library-ness of set binding contributions.",
          "author_name": "Benjamin Bader",
          "author_login": null,
          "committed_at": "2013-11-15T20:21:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b13d5d94218212e1dc34eadb3896714898055016",
          "body": "Already hit the too-many-rows limit for bytes... oh well.",
          "is_bot": false,
          "headline": "Promoting Trie repr from byte array to ushort array",
          "author_name": "Benjamin Bader",
          "author_login": null,
          "committed_at": "2013-11-15T20:19:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e01b57cf9bbe226a24e0058313f138db1501c880",
          "body": "It's valid for more than one module to declare the same type as an Injects\nentry-point.",
          "is_bot": false,
          "headline": "Deduplicating Injects entries",
          "author_name": "Benjamin Bader",
          "author_login": null,
          "committed_at": "2013-11-15T20:18:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8024b989b87516e9217f37f52505330e1da9cfb5",
          "body": null,
          "is_bot": false,
          "headline": "Adding tests around enforcing/suppressing orphan analysis of sets",
          "author_name": "Benjamin Bader",
          "author_login": null,
          "committed_at": "2013-11-15T20:16:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ccfc9842f143aa5c63ca3fd75e138ebc648cf3a",
          "body": "This hopefully eliminates an entire category of stupid crashes.\nAlso updating LoaderGenerator comments describing generated code, as they\nwere pretty out-of-date.",
          "is_bot": false,
          "headline": "Adding proper error reporting for CompilerLoader.",
          "author_name": "Benjamin Bader",
          "author_login": null,
          "committed_at": "2013-11-15T18:48:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9eafa4a8b241dcb9dc252ffeab8c17b2660040d",
          "body": "* VS 2013 has eliminated MSBuild-integrated package restore, so removing nuget targets and bundled .exe\n* The ILMerge build-step assumed no spaces in the command - fixed.\n* When an injected type inherited from a non-injectable that had a non-default constructor, the reflection loader would fail.  This was not correct, and has been resolved.",
          "is_bot": false,
          "headline": "Getting builds running on Win 8.1 with VS 2013 and fixing two bugs.",
          "author_name": "Benjamin Bader",
          "author_login": null,
          "committed_at": "2013-11-15T02:16:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42fdc4471825202edef372a6b5c636426563c3fc",
          "body": "Allow injections across assemblies",
          "is_bot": false,
          "headline": "Merge pull request #29 from benjamin-bader/inject-cross-assembly",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-08-25T00:09:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6009b2ac9900192857489db5f29752365dfb7091",
          "body": "The issue was actually quite simple; the equality comparer for type\nreferences was verifying that actual subtypes were the same, such that a\nTypeReference to Foo was not equal to the TypeDefinition of Foo.  Removing\nthat check resolves this issue nicely.\n\nThere may be implications further down the r\n[…]\nrences with the same FullName are equal, but I think that's what I\nintended anyways.  This could potentially allow for version-mismatching in\nreferences, but that's a problem which has yet to surface.",
          "is_bot": false,
          "headline": "Fixing issue #28",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-08-24T23:41:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b01b4d2f22b0f181ea7079f13242fe40b278d131",
          "body": null,
          "is_bot": false,
          "headline": "Established a repro case and fixing a FodyHelper issue.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-08-24T23:40:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a667e3da2a3a6031c7560a4cf6af3aa60637c11",
          "body": "Adding example of set bindings to README.",
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-08-12T04:21:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "066fcb67e71a53b70fee25db8d6483fb2907b4e8",
          "body": "Implementing ISet<T> multibindings.",
          "is_bot": false,
          "headline": "Merge pull request #26 from benjamin-bader/set-bindings",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-08-12T03:11:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9de091df54fbf27cff1440eab598acc3f96bf395",
          "body": "* Introducing [Provides(ProvidesType.Set)] for set membership\n* Reflection chicanery to support yielding ISet<T>\n* So many things had to be touched to make this work.  Too complicated!\n* More integration tests forthcoming.",
          "is_bot": false,
          "headline": "Implementing ISet<T> multibindings.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-08-11T09:40:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed0d22d7484504dea487a81578568b19c362f832",
          "body": "…-bugs\n\nFixes issue #24.",
          "is_bot": false,
          "headline": "Merge pull request #25 from benjamin-bader/fix-duplicate-inject-types…",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-08-03T00:46:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db01e8adb51d11aa3c7e0329891039191511b3d1",
          "body": "The compiler now catches duplicate types in Injects lists, both within\nindividual modules and in the network of a complete module plus its\ninclusions.\n\nThe reflection fallback always threw on this error, but now provides a\nmore descriptive error.",
          "is_bot": false,
          "headline": "Fixes issue #24.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-08-03T00:34:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72972516984472343e6a4f70ce2712c0fa1fe46f",
          "body": "Cleaning up code style for consistency, no functional changes.",
          "is_bot": false,
          "headline": "Merge pull request #22 from benjamin-bader/reformat",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-07-26T01:49:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11f3999e98fe7e6d5f32897373415e0359728e1e",
          "body": null,
          "is_bot": false,
          "headline": "Cleaning up code style for consistency, no functional changes.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-26T01:35:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35a7eeeb1134323016ebe69b990c34b32cc197f6",
          "body": "Adding CodeBetter/JetBrains love",
          "is_bot": false,
          "headline": "Merge pull request #21 from benjamin-bader/add-sponsor-appreciation",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-07-25T21:54:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8565dd4b7201ef2de56dd01a28dfe5b51f672d18",
          "body": null,
          "is_bot": false,
          "headline": "Adding CodeBetter/JetBrains love",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-25T21:44:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "639f631034626f4a0577edfb5ef4d42bd560f1b7",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-07-24T06:09:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef4c6158984e86fc87b27ef0da50397f06fe581f",
          "body": "Rename 'IPlugin' to 'ILoader'.",
          "is_bot": false,
          "headline": "Merge pull request #19 from benjamin-bader/plugins-become-loaders",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-07-23T21:25:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd23d12f572a9d4478ef87f22eeea3a8c66435c3",
          "body": "This tracks dagger terminology so we don't get too far out of sync.\nOthers (like Resolver) should probably change as well, but not now.",
          "is_bot": false,
          "headline": "Rename 'IPlugin' to 'ILoader'.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-23T00:14:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "303203c7aebc655e176b56870167ac278e62e16f",
          "body": null,
          "is_bot": false,
          "headline": "Update TODO",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-07-20T07:27:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5c782f758c2ba763514c12da760c9f550217a2b9",
          "body": "Addresses issue #18.  Parameters to provider methods can now be sourced\nfrom outside of the containing module.\n\nThis is accomplished by deferring validation to a second validation phase,\nin which all available keys are gathered into a set for consideration.\nCircular dependency detection will catch any true errors.",
          "is_bot": false,
          "headline": "Fix validation of provider-method parameters.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-19T01:54:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02b96212a3db6998e0e26dc920c5e1e91b8c2bf5",
          "body": null,
          "is_bot": false,
          "headline": "Fix a null-requiredBy value.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-18T01:13:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f4ed6299c57abfba7b915dd1bc746d0488cd453",
          "body": null,
          "is_bot": false,
          "headline": "Treat weaver exceptions as integration test failures.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-17T22:13:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b611c1aec0ea0cbd21dc8b98b424ad79cbba34c",
          "body": null,
          "is_bot": false,
          "headline": "Adding a unit test for weaver validation of module constructors.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-17T22:12:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1a11598b57b6c97ef5323a7237be0a78a543395",
          "body": "LGTM, Fixes #10",
          "is_bot": false,
          "headline": "Merge pull request #14 from SimonCropp/master",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-07-17T21:47:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f78d7f03e8c9342ea84066967a818d3865a99531",
          "body": "This fixes a crash when validating a module that has no default constructor.  This should also be covered by an integration test.",
          "is_bot": false,
          "headline": "Don't import a null module constructor.",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-07-17T01:54:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3011ffa9f7f9b343261637f025e72f04837c05e",
          "body": null,
          "is_bot": false,
          "headline": "fixes issue #10",
          "author_name": "Simon Cropp",
          "author_login": "SimonCropp",
          "committed_at": "2013-07-14T07:24:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd699faf78640b0e0df21c4e782db7ad47d4de9a",
          "body": null,
          "is_bot": false,
          "headline": "Rename EntryPoints to Injects in readme",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-07-03T20:20:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6bb3573b012971f9b64dd30952e1885b4c8c8c82",
          "body": null,
          "is_bot": false,
          "headline": "nit: commented-out code.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-03T00:38:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fd496fe8f011c29437bc5c99e7c8e63ba2377b2",
          "body": null,
          "is_bot": false,
          "headline": "s/ModuleDefinition.Import/Import/g",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-03T00:38:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45ab24e2b61084970c821e81161da79501873be2",
          "body": "These overloads, though unused, are dangerous - they potentially create\nreferences to the .NET libraries loaded by Fody, which may differ from the\nactual target frameworks.  Better to remove them entirely and enforce\nproper usage of Cecil.",
          "is_bot": false,
          "headline": "Removing (unused) Import overloads that take CLR references.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-07-03T00:36:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80c03fd38cc5e689f607c266c5c6aa52e12c05eb",
          "body": null,
          "is_bot": false,
          "headline": "Renaming EntryPoints to Injects to track Dagger's nomenclature.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-26T21:19:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f471339c120a70bbac66796914d1a472c2a28bef",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' of github.com:benjamin-bader/stiletto",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-26T18:27:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a97959a2eb89bf4bf182ca1420894791736d8de",
          "body": "This file incorrectly had only the copyright header, now it has the full text.",
          "is_bot": false,
          "headline": "Placing the full text of Apache 2.0 license in LICENSE file.",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-06-19T19:43:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb7cef8fa07a53dad63ecc787da9ea66b21fabed",
          "body": null,
          "is_bot": false,
          "headline": "Tightening up CompiledModule constructors.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-19T01:35:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "831c68a17b78d56206285712ee25ba7fadb78514",
          "body": "Take one of weaver integration tests",
          "is_bot": false,
          "headline": "Merge pull request #12 from benjamin-bader/integration",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-06-19T01:28:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a3c6a631b33b86f78e43f1a3495d04b7440dc1d",
          "body": null,
          "is_bot": false,
          "headline": "Removing unused Fody-provided properties from ModuleWeaver.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-17T05:35:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "676f415a4d3019ed1dfb03cbf813f3a06bd59c1e",
          "body": null,
          "is_bot": false,
          "headline": "Moving some clutter out of the way.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-17T05:19:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1725f58c1c4e6837b6a7e69e41b77262783ec9e9",
          "body": null,
          "is_bot": false,
          "headline": "Adding an exit code.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-17T05:04:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcd687f792261564189b71eccf6face668bdd010",
          "body": null,
          "is_bot": false,
          "headline": "Adding NLog logging to stderr.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-17T05:00:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b0b39db99bf959fa936fba662edf8821d9a78fc",
          "body": null,
          "is_bot": false,
          "headline": "Adding command-line options and refactoring IErrorWriter stuff.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-17T04:58:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98f719777d2e766822b1e20f027aea5471a9b750",
          "body": null,
          "is_bot": false,
          "headline": "Adding a test verifying IsLibrary suppression of unused binding errors.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-17T04:51:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "934bf7c6c076b833353c8a95e544d5558ac76ad9",
          "body": null,
          "is_bot": false,
          "headline": "More tests, cleaned cruft, added SuppressGraphviz for Fody config.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-13T22:26:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cf6fdfe113b6183c47cc9ecaaf240afa0f77dff",
          "body": null,
          "is_bot": false,
          "headline": "Take one of weaver integration tests",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-13T01:17:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7f9d4f98c437246bf701f160dd805e1ae893e2d",
          "body": null,
          "is_bot": false,
          "headline": "Removing spurious nuspec files",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-11T02:16:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e3bb51bfea6eafdfc5422396c84e035f0a74fd2",
          "body": null,
          "is_bot": false,
          "headline": "Spiffing up the validator test error message.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-11T01:59:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a835eafb21951fa897f33a66c37d094cf2cd3e5",
          "body": "…nerator.",
          "is_bot": false,
          "headline": "Adding a null guard against primitive entry points in InjectBindingGe…",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-11T01:56:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf0a22b684fead3df8a879da4556f1e6f1507870",
          "body": null,
          "is_bot": false,
          "headline": "Removing a redundant entries from cycle error messages, I think.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-11T01:30:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7967e4eb9204521a283ca9ea9e51d28b7cb0e9ef",
          "body": null,
          "is_bot": false,
          "headline": "Fixing bugs with module validation and InternalsVisibleTo writing.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-11T01:29:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "206191b8894ce0fc5f8dfa4b60f6269b939a722c",
          "body": null,
          "is_bot": false,
          "headline": "Adding ModuleReader.cs",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-10T21:09:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b62ec0bd1c2268a3cf73c47a457d2524bac9fd69",
          "body": "docs.",
          "is_bot": false,
          "headline": "Shrinking Trie.Node.Height implementation.  Also license, whitespace,",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-10T21:06:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6e2f32f6dcb4381b613535499f1b58792529da0",
          "body": "Briefly, Mono.cecil.TypeReference.Resolve() sometimes returns null\nwhen trying to resolve a system type defined in a portable assembly.\nThis breaks cross-platform code generation, unless we manually fix all\ntype references and assembly references by hand.\n\nA less error-prone approach is to restrict \n[…]\nion is demonstrated to work.  Code generation\nin other assemblies is limited to adding an InternalsVisibleTo attribute\nallowing generated code to see internal and protected internal types and\nmethods.",
          "is_bot": false,
          "headline": "Only generating code inside of the main target assembly.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-10T20:57:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea68befeb3467ac0bf77afc8c6f28ed57d29b08c",
          "body": null,
          "is_bot": false,
          "headline": "Buffing up the .gitignore",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-10T19:10:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb15c53027af27ab1f28b7839ba9a87d1651b2c8",
          "body": "TypeAttributesExtensions.\n\nAlso moving TypeReferenceComparer into its own file.",
          "is_bot": false,
          "headline": "Replacing AttributesExtensions with the more general",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-10T19:09:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c996f8ca57adf48367b8c76e665755ee10aa4791",
          "body": null,
          "is_bot": false,
          "headline": "Adding graphviz visualizations.  One per complete module.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-10T06:42:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f1a80e4b481a57fb4a39ebca26907316de71111",
          "body": null,
          "is_bot": false,
          "headline": "Update TODO",
          "author_name": "benjamin-bader",
          "author_login": "benjamin-bader",
          "committed_at": "2013-06-05T01:16:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fb297bce738d1fcfbf8cb6ccfcb855aec4817c4",
          "body": "I doubt anyone will have classnames with an alphabet even approaching 255\ncharacters.\n\nFastHash never really worked reliably, and as it was strictly an\noptimization it can be disregarded (and discarded).",
          "is_bot": false,
          "headline": "Moved trie from ushorts to bytes and removed FastHash.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-05T01:12:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "449ca520c75fac58d78e777d06bdc92f97ca9eea",
          "body": "…ding a few missing license headers.",
          "is_bot": false,
          "headline": "Scrubbing weird unicode BOMs left from adding license headers, and ad…",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-05T01:11:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fe0a1ff7038c78569703bf8910e0f408074dcae",
          "body": null,
          "is_bot": false,
          "headline": "Fixing post-weaving test build.  NEED MOAR INTEGRATION TESTS.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-04T23:40:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e7dd328e2e30d38104c7ee6c8d9e43d274d6857",
          "body": null,
          "is_bot": false,
          "headline": "Fixing a stray RequiredBy bug.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-04T23:40:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "333324828af1691ac9aacc7ee3bd06d215cab4b4",
          "body": null,
          "is_bot": false,
          "headline": "Disabling IProvider<T> injection in the Reflection plugin on MonoTouch.j",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-04T23:40:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "188d7a6c21d96e5c9ef8f7d4112b1dbba7be9cf8",
          "body": "… IL.",
          "is_bot": false,
          "headline": "Cleaning up attribute argument parsing and simplifying some generated…",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-04T23:40:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ba881027064e8387cf5de730bbaf479ca7e89a1",
          "body": null,
          "is_bot": false,
          "headline": "Fixing some more RequiredBy cases.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-04T23:40:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52ee10e7af1deb110301643c5a137347121662a5",
          "body": null,
          "is_bot": false,
          "headline": "Exposing ModuleDefinition.TypeSystem types in References.",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-04T23:40:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac405bb4637fa5f551cc24b090d1a269d76d2b1c",
          "body": "…ion.",
          "is_bot": false,
          "headline": "Fixing some bad values for Binding.RequiredBy in compiler and reflect…",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-04T23:40:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af8ece3844b778608103c0a0441e05526c7d972f",
          "body": "post-weaving tests won't compile them.  Excluding them from the\npostweaving build.",
          "is_bot": false,
          "headline": "Enhancing cycle-detection tests, which unfortunately means the",
          "author_name": "Ben Bader",
          "author_login": null,
          "committed_at": "2013-06-04T23:40:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 1,
      "commits_last_year": 28,
      "latest_release_at": "2026-07-12T07:51:47Z",
      "latest_release_tag": "v1.0.0",
      "releases_from_tags": false,
      "days_since_last_push": 13,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 15,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "Stiletto",
          "exists": true,
          "license": null,
          "keywords": [
            "dependency-injection",
            "di",
            "ioc",
            "source-generator",
            "dagger",
            "aot",
            "trimming"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/Stiletto",
          "is_deprecated": false,
          "latest_version": "1.0.0",
          "repository_url": "https://github.com/benjamin-bader/stiletto",
          "versions_count": 16,
          "total_downloads": 34282,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-12T07:52:39.840000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 15
        }
      ]
    },
    "popularity": {
      "forks": 14,
      "stars": 43,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2013-06-08",
            "count": 1
          },
          {
            "date": "2014-04-01",
            "count": 1
          },
          {
            "date": "2015-06-18",
            "count": 1
          },
          {
            "date": "2017-04-15",
            "count": 1
          },
          {
            "date": "2017-09-26",
            "count": 1
          },
          {
            "date": "2018-02-01",
            "count": 1
          },
          {
            "date": "2018-04-09",
            "count": 1
          },
          {
            "date": "2018-07-05",
            "count": 1
          },
          {
            "date": "2018-11-15",
            "count": 1
          },
          {
            "date": "2022-02-13",
            "count": 1
          },
          {
            "date": "2023-07-11",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 11,
        "total_forks": 14
      },
      "star_history": null,
      "open_issues_and_prs": 6
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example",
        "samples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "samples/Example/Example.csproj",
        "samples/LibraryExample/LibraryExample.csproj",
        "samples/Stiletto.AotSmokeTest/Stiletto.AotSmokeTest.csproj",
        "src/Stiletto.Generator/Stiletto.Generator.csproj",
        "src/Stiletto/Stiletto.csproj",
        "test/Stiletto.Generator.Tests/Stiletto.Generator.Tests.csproj",
        "test/Stiletto.Integration.External/Stiletto.Integration.External.csproj",
        "test/Stiletto.Integration.Tests/Stiletto.Integration.Tests.csproj",
        "test/Stiletto.Tests/Stiletto.Tests.csproj"
      ],
      "largest_source_bytes": 83095,
      "source_files_sampled": 117,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4103
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "scope": "repository_graph",
        "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": 6,
        "direct_affected_count": 0
      },
      "ecosystems": [],
      "dependencies": [
        {
          "name": "Microsoft.CodeAnalysis.CSharp",
          "manifest": "src/Stiletto.Generator/Stiletto.Generator.csproj",
          "ecosystem": "nuget",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "Microsoft.CodeAnalysis.CSharp",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.NET.Test.Sdk",
            "direct": false,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "Verify.SourceGenerators",
            "direct": false,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "Verify.XunitV3",
            "direct": false,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "xunit.runner.visualstudio",
            "direct": false,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "xunit.v3",
            "direct": false,
            "version": null,
            "ecosystem": "nuget"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 6,
        "direct_count": 1,
        "indirect_count": 5
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 30,
        "open_issues": 5,
        "closed_ratio": 0.75,
        "closed_issues": 15,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "benjamin-bader",
          "commits": 63,
          "avatar_url": "https://avatars.githubusercontent.com/u/512212?v=4"
        },
        {
          "type": "User",
          "login": "SimonCropp",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/122666?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.984
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-www.yml",
        "pr-title.yml",
        "release-please.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 8,
            "reason": "16 out of 19 merged PRs checked by a CI test -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/21 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "28 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "7a98d38bf367adda78cdf7ddd4b07f19b0c02180",
        "ran_at": "2026-07-27T08:37:30Z",
        "aggregate_score": 4.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-13T22:38:49Z",
      "oldest_open_prs": [
        {
          "number": 50,
          "created_at": "2026-07-13T06:23:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-13T22:38:03Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 5,
          "created_at": "2013-05-30T21:26:06Z",
          "last_comment_at": "2013-06-19T01:34:23Z",
          "last_comment_author": "benjamin-bader"
        },
        {
          "number": 13,
          "created_at": "2013-07-03T20:55:11Z",
          "last_comment_at": "2013-07-07T06:13:42Z",
          "last_comment_author": "benjamin-bader"
        },
        {
          "number": 23,
          "created_at": "2013-07-27T00:56:06Z",
          "last_comment_at": "2013-08-06T01:21:35Z",
          "last_comment_author": "benjamin-bader"
        },
        {
          "number": 27,
          "created_at": "2013-08-14T21:02:37Z",
          "last_comment_at": "2013-08-25T00:16:00Z",
          "last_comment_author": "benjamin-bader"
        },
        {
          "number": 31,
          "created_at": "2013-11-15T21:14:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/benjamin-bader/stiletto",
    "host": "github.com",
    "name": "stiletto",
    "owner": "benjamin-bader"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 44,
        "vitality": 65,
        "community": 47,
        "governance": 57,
        "engineering": 74
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 65,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "commits_last_year": 28,
              "human_commit_share": 0.99,
              "days_since_last_push": 13,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 13 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "28 commits in the last year",
                "points": 13.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 28
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "28 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 84,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "v1.0.0",
              "releases_from_tags": false,
              "days_since_latest_release": 15,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 15 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 13,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 13 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 13
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "forks": 14,
              "stars": 43,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "43 stars",
                "points": 26.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 43
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "14 forks",
                "points": 9.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "packages": [
                "Stiletto"
              ],
              "dependents": null,
              "ecosystems": "nuget",
              "total_downloads": 34282,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "34,282 downloads all-time across nuget",
                "points": 47.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 34282,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "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": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.984
            },
            "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 98% of commits",
                "points": 0.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "merged_prs": 30,
              "open_issues": 5,
              "closed_issues": 15,
              "issue_closed_ratio": 0.75,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "75% of issues closed",
                "points": 35.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 75
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "30/32 decided PRs merged",
                "points": 35.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 30,
                      "decided": 32
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/21 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "followers": 73,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "benjamin-bader",
              "public_repos": 135,
              "account_age_days": 5711
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "73 followers of benjamin-bader",
                "points": 13.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 73,
                      "login": "benjamin-bader"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "135 public repos, account ~15 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 135
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "Stiletto"
              ],
              "ecosystems": "nuget",
              "any_deprecated": false,
              "min_days_since_publish": 15
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on nuget",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 15 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "16 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 74,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "16 out of 19 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "http://stiletto.bendb.com",
              "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": "http://stiletto.bendb.com",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 44,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "16 out of 19 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/21 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "28 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "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": 2
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 65,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.505,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4103
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "50 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 26.9,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 50,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.19,
              "toolchain_manifests": [
                "samples/Example/Example.csproj",
                "samples/LibraryExample/LibraryExample.csproj",
                "samples/Stiletto.AotSmokeTest/Stiletto.AotSmokeTest.csproj",
                "src/Stiletto.Generator/Stiletto.Generator.csproj",
                "src/Stiletto/Stiletto.csproj",
                "test/Stiletto.Generator.Tests/Stiletto.Generator.Tests.csproj",
                "test/Stiletto.Integration.External/Stiletto.Integration.External.csproj",
                "test/Stiletto.Integration.Tests/Stiletto.Integration.Tests.csproj",
                "test/Stiletto.Tests/Stiletto.Tests.csproj"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "samples/Example/Example.csproj, samples/LibraryExample/LibraryExample.csproj, samples/Stiletto.AotSmokeTest/Stiletto.AotSmokeTest.csproj (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "samples/Example/Example.csproj, samples/LibraryExample/LibraryExample.csproj, samples/Stiletto.AotSmokeTest/Stiletto.AotSmokeTest.csproj"
                    }
                  }
                ],
                "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": "C# (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "19 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 19,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "C#",
              "largest_source_bytes": 83095,
              "source_files_sampled": 117,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C# (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/117 source files over 60KB",
                "points": 54.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 117,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "example",
                "samples"
              ],
              "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": "example, samples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example, samples"
                    }
                  }
                ],
                "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",
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T08:37:46.145143Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/benjamin-bader/stiletto.svg",
  "full_name": "benjamin-bader/stiletto",
  "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 agregadasNuGet.