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

ethanolivertroy / wilma

Wilma - AWS Bedrock Security Configuration Checker

PythonGPL-3.0★ 3 estrellas⑂ 1 forkdesde may 2025Ver en GitHub ↗

ethanolivertroy/wilma tiene un índice de salud de 67 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (82/100) y la más baja, Community & Adoption (39/100). Se actualizó por última vez hace 2 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

67
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

Ethan TroyCuenta personal
220 seguidores198 repositorios públicosdesde abr 2020Cursor

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
PyPIwilma-sec1.1.0-3hace 259 díasawsbedrocksecuritygenaiaimlauditcompliancewilma

Métricas por categoría

Vitalidad

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

82Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 2 días
7.6/36Cadencia de commits — 11/52 semanas con commits
16.8/18Volumen de commits — 74 commits en el último año
10/10OpenSSF Scorecard: Maintained — 11 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year74
human_commit_share0,865
days_since_last_push2
active_weeks_last_year11
Cómo se puntúa
27/27Publica versiones — 2 versiones publicadas
36/36Recencia de las versiones — última versión hace 2 días
27/27Cadencia de publicación — una versión cada ~3,7 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count2
latest_release_tagv0.2.2
releases_from_tagsno
days_since_latest_release2
mean_days_between_releases3,7
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?

39En riesgo · 18% del índice global
Cómo se puntúa
4.9/60Estrellas — 3 estrellas
0/25Forks — 1 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks1
stars3
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (GPL-3.0)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_template

Sostenibilidad y Gobernanza

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

53Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
1.4/22.5Distribución de commits — el principal contribuyente firma el 94% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,938
Cómo se puntúa
46/46.8Resolución de issues — 98% de issues cerradas
11.2/38.3Aceptación de PR — 17/58 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/10 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs17
open_issues1
closed_issues62
issue_closed_ratio0,984
closed_unmerged_prs41
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
16.9/25Alcance del propietario — 220 seguidores de ethanolivertroy
25/25Trayectoria — 198 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers220
owner_typeUser
is_verified
owner_loginethanolivertroy
public_repos198
account_age_days2287
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 pypi
26/35Recencia de publicación — última publicación hace 259 días
12/20Historial de versiones — 3 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageswilma-sec
ecosystemspypi
any_deprecatedno
min_days_since_publish259

Calidad de Ingeniería

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

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

Documentación

60Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 5 topics
10/10Wiki
Datos de entrada utilizados
topicsaws, bedrock, genai, llm, security
has_wiki
homepage
has_readme
has_docs_dirno
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?

81Bueno · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
2.5/2.5CI-Tests — 15 out of 15 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/10 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 11 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
2/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
5/5SAST — SAST tool is run on all commits
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate7,6
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, packaging, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages10
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de pypi:wilma-sec@1.1.0 —lo que arrastra la instalación del paquete publicado—: 10 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? 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)
40/40Historial de commits legible — 57 de 64 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,891
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes11.688
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato
0/11Verificación estática de tipos
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 20 de los últimos 74 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 10 de los últimos 74 commits son actualizaciones automáticas de dependencias
4/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,27
toolchain_manifests
dependency_bot_commit_share0,135
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
50.9/55Tamaños de archivo manejables — 3/40 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes125.690
source_files_sampled40
oversized_source_files3

Datos clave

3estrellas de GitHub
2contribuidores
74commits en los últimos 12 meses
2días desde el último push
2versiones publicadas
1factor bus
1issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Más detalle

OpenSSF Scorecard 7.6 / 10
7.6agregado

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

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests15 out of 15 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/10 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained11 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
4Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 4
10SASTSAST tool is run on all commits
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
8Vulnerabilities2 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
PyPIboto3>=1.43.51,<2.0.0pyproject.toml
PyPIbotocore>=1.43.51,<2.0.0pyproject.toml
PyPIrich>=15.0.0,<16.0.0pyproject.toml
PyPIpyyaml>=6.0.3,<7.0.0pyproject.toml
Todas las dependencias 19

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

RegistroPaqueteVersiónRelación
PyPIboto3directa
PyPIbotocoredirecta
PyPIpyyamldirecta
PyPIrichdirecta
PyPIbanditindirecta
PyPIboto3-stubsindirecta
PyPIbuildindirecta
PyPIipythonindirecta
PyPImotoindirecta
PyPImypyindirecta
PyPIpre-commitindirecta
PyPIpytestindirecta
PyPIpytest-covindirecta
PyPIpytest-mockindirecta
PyPIpytest-xdistindirecta
PyPIruffindirecta
PyPIsetuptoolsindirecta
PyPItwineindirecta
PyPItypes-pyyamlindirecta
Avisos de dependencias 0

Instalar pypi:wilma-sec@1.1.0 arrastra 10 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "aws",
        "bedrock",
        "genai",
        "llm",
        "security"
      ],
      "is_fork": false,
      "size_kb": 979,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Python": 738656
      },
      "pushed_at": "2026-07-21T17:33:11Z",
      "created_at": "2025-05-29T18:01:07Z",
      "owner_type": "User",
      "updated_at": "2026-07-21T13:30:57Z",
      "description": "Wilma - AWS Bedrock Security Configuration Checker",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "GPL-3.0",
      "default_branch": "main",
      "license_spdx_raw": "GPL-3.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "https://ethantroy.dev",
      "name": "Ethan Troy",
      "type": "User",
      "login": "ethanolivertroy",
      "company": "Cursor",
      "location": "Florida",
      "followers": 220,
      "avatar_url": "https://avatars.githubusercontent.com/u/63926014?v=4",
      "created_at": "2020-04-18T18:35:36Z",
      "is_verified": null,
      "public_repos": 198,
      "account_age_days": 2287
    },
    "license": {
      "state": "standard",
      "spdx_id": "GPL-3.0",
      "raw_spdx": "GPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-07-21T13:29:59Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-07-17T21:08:28Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7cfc9e8591ef3bd31706f9666c4ded14d26f0c2d",
          "body": "….2.2 (#121)\n\n* Drop Python 3.9 support and apply deferred dependency updates\n\n- requires-python >=3.10, remove 3.9 classifier, CI matrix, docs\n- boto3/botocore >=1.43.51, pytest >=9.1.1, moto >=5.2.2,\n  types-PyYAML >=6.0.12.20260518, build >=1.5.0\n- ruff target-version py310, mypy python_version 3\n[…]\norted kwargs\n\nWilmaConfig.__init__ only accepts config_path; the fixture passed\nregion/checks_enabled/min_risk_level kwargs that would raise TypeError\nif any test used it. Flagged by CodeQL on PR 121.",
          "is_bot": false,
          "headline": "Drop Python 3.9 support, apply deferred dependency updates, release 0…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-07-21T13:27:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea5ba7b443e126b34a2a313846b35bbb52d749be",
          "body": "…, #116, #119) (#120)\n\n* Apply outstanding Dependabot dependency updates (#105-#112, #114, #116-#119)\n\n* Exclude moto 5.2.x bump (requires Python >=3.10)\n\n* Exclude types-PyYAML 2026 stubs bump (requires Python >=3.10)\n\n* Exclude build 1.5.0 bump (requires Python >=3.10)",
          "is_bot": false,
          "headline": "Consolidate Dependabot dependency updates (#105-#107, #110-#112, #114…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-07-21T12:48:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f424f8b7840b5a31b530c6781fefbfc7b1d359c",
          "body": null,
          "is_bot": false,
          "headline": "Fix OpenSearch policy assessment regressions (#104)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-07-18T00:16:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4eb270a854c895aea815eae510d63fb5d81d158a",
          "body": "* Fix thermo-nuclear code quality review findings\n\nBlockers:\n- Replace phantom bedrock-agent policy getters (get_collection_security_policy,\n  get_data_access_policy) with real opensearchserverless list/get policy APIs.\n  The old duck-typed getattr calls only executed under test mocks and were\n  sil\n[…]\nS network and data-access check failures so an API error on\n  one policy type no longer skips the other check.\n- Add regression tests for null/missing Action+Resource and None AOSS\n  policy documents.",
          "is_bot": false,
          "headline": "Fix thermo-nuclear code quality review findings (#103)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-07-18T00:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab6d46f8ac5b7489ce67308ae15cbd4ab92057e9",
          "body": "…date-50c7\n\nConsolidate outstanding PRs: modernized Bedrock checks, dependency updates, 0.2.1 release",
          "is_bot": false,
          "headline": "Merge pull request #102 from ethanolivertroy/cursor/project-health-up…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-07-17T21:05:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5e9e9f4e73bbe280b82254d98ce301337dc791e",
          "body": "Co-authored-by: Ethan Troy <ethanolivertroy@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Bump version to 0.2.1 and add changelog entry",
          "author_name": "Cursor Agent",
          "author_login": "cursoragent",
          "committed_at": "2026-07-17T19:44:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6b97c3516755ad7a88e62ed4f0097b6303b1878",
          "body": "Co-authored-by: Ethan Troy <ethanolivertroy@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Apply outstanding Dependabot dependency updates (#90-#100)",
          "author_name": "Cursor Agent",
          "author_login": "cursoragent",
          "committed_at": "2026-07-17T19:44:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bc255a0a748f3a110996782abd31f82a3402e5c",
          "body": "Co-authored-by: Ethan Troy <ethanolivertroy@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Add report coverage and lint adjustments",
          "author_name": "Cursor Agent",
          "author_login": "cursoragent",
          "committed_at": "2026-06-28T02:45:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f6aa24008f4b7f94b9534a0060362401ca26a2a",
          "body": "Co-authored-by: Ethan Troy <ethanolivertroy@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Modernize Bedrock checks and library API",
          "author_name": "Cursor Agent",
          "author_login": "cursoragent",
          "committed_at": "2026-06-28T02:41:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adec1d224f7e5bce79b7144288eed380adb61d9a",
          "body": null,
          "is_bot": false,
          "headline": "Apply Dependabot dependency updates",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-05-11T04:21:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc5d1c0e249c3b7d09afe02811a162a5d9923346",
          "body": null,
          "is_bot": false,
          "headline": "Reboot Wilma posture assessment beta",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-05-11T04:10:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa86a50eb9f4b1974ce9059d00c793dbc738d5f0",
          "body": "…/github/codeql-action-4.32.3\n\nci(deps): bump github/codeql-action from 4.32.2 to 4.32.3",
          "is_bot": false,
          "headline": "Merge pull request #74 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-02-16T15:50:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53398819884fffdad7664057b67fa4e03c244ac9",
          "body": "Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.2 to 4.32.3.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/4\n[…]\nendency-name: github/codeql-action\n  dependency-version: 4.32.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump github/codeql-action from 4.32.2 to 4.32.3",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-02-16T03:13:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ab2b75d438947f67f35a1eb397c65b44d726724",
          "body": "…/github/codeql-action-4.32.2\n\nci(deps): bump github/codeql-action from 4.32.0 to 4.32.2",
          "is_bot": false,
          "headline": "Merge pull request #73 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-02-10T06:48:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e6fd0e5406b953a81a9cba534a467edf9ec68a1",
          "body": "Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.32.0 to 4.32.2.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/b\n[…]\nendency-name: github/codeql-action\n  dependency-version: 4.32.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump github/codeql-action from 4.32.0 to 4.32.2",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-02-09T03:14:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7554f03e861884e041624ab204424e3bec2f8ee",
          "body": "…/actions/setup-python-6.2.0\n\nci(deps): bump actions/setup-python from 6.1.0 to 6.2.0",
          "is_bot": false,
          "headline": "Merge pull request #72 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-28T18:47:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e3023380899b6651f39d0379bce52373a36618f",
          "body": "…/github/codeql-action-4.31.11\n\nci(deps): bump github/codeql-action from 4.31.9 to 4.31.11",
          "is_bot": false,
          "headline": "Merge pull request #71 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-28T18:47:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f1639c902e8dc937e8b98a8ef2fcf60fda9dbfc",
          "body": "…/actions/checkout-6.0.2\n\nci(deps): bump actions/checkout from 6.0.1 to 6.0.2",
          "is_bot": false,
          "headline": "Merge pull request #70 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-28T18:46:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c763402268cd46fdbf65e565827fa9c40952d350",
          "body": "Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.9 to 4.31.11.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/\n[…]\nndency-name: github/codeql-action\n  dependency-version: 4.31.11\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump github/codeql-action from 4.31.9 to 4.31.11",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-28T18:41:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "53974d9e23c3a5f7dc766f9276baf15cb5326934",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.1 to 6.0.2.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/8e8c483db84b4bee98b60c0\n[…]\n- dependency-name: actions/checkout\n  dependency-version: 6.0.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump actions/checkout from 6.0.1 to 6.0.2",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-28T18:41:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f171d261251224a7ce7f7d78ac8584e720735700",
          "body": "Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.1.0 to 6.2.0.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/83679a892e2d95755f2dac6acb0bfd1e9ac5d548...a309ff8b426b58ec0e2a45f0f869d46889d024\n[…]\npendency-name: actions/setup-python\n  dependency-version: 6.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump actions/setup-python from 6.1.0 to 6.2.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-28T18:41:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd0d14a2cedb4868e9367b8252d655c69cc93339",
          "body": "- Add missing methods to check classes to resolve AttributeError issues\n- Fix S3 encryption exception handling for moto compatibility\n- Update test assertions to match actual finding field names\n- Create mock AWS managed policies for IAM tests\n- Change expected risk levels to match implementation",
          "is_bot": false,
          "headline": "Fix failing tests - add missing check methods and fix test assertions",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-28T17:58:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9585a3cb7ea44ecf6b434af2c362f6111fc1006",
          "body": "…/actions/upload-artifact-6.0.0\n\nci(deps): bump actions/upload-artifact from 4.6.2 to 6.0.0",
          "is_bot": false,
          "headline": "Merge pull request #51 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-16T05:23:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a7021dd4b70eab3856ad6e7a1b7725931cc4b9e",
          "body": "…/actions/setup-python-6.1.0\n\nci(deps): bump actions/setup-python from 5.6.0 to 6.1.0",
          "is_bot": false,
          "headline": "Merge pull request #52 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-16T05:23:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08819252c0e7ebe6177d8400d4e5a74231c9bd62",
          "body": "…/actions/checkout-6.0.1\n\nci(deps): bump actions/checkout from 4.3.1 to 6.0.1",
          "is_bot": false,
          "headline": "Merge pull request #53 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-16T05:23:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90b4813a5957c8411c9d421b27831e07a3567143",
          "body": "…/github/codeql-action-4.31.9\n\nci(deps): bump github/codeql-action from 3.31.9 to 4.31.9",
          "is_bot": false,
          "headline": "Merge pull request #54 from ethanolivertroy/dependabot/github_actions…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-16T05:23:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4e23aacf479b9d83b587a40c91b0cc3111603a4",
          "body": "…3.7.0-and-lt-15.0.0\n\ndeps(deps): update rich requirement from <14.0.0,>=13.7.0 to >=13.7.0,<15.0.0",
          "is_bot": false,
          "headline": "Merge pull request #68 from ethanolivertroy/dependabot/pip/rich-gte-1…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2026-01-16T05:23:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cddd8eaf5277b6e98075a6c33ef3c53e5497097c",
          "body": "Updates the requirements on [rich](https://github.com/Textualize/rich) to permit the latest version.\n- [Release notes](https://github.com/Textualize/rich/releases)\n- [Changelog](https://github.com/Textualize/rich/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/Textualize/rich/compare/v13.7.0...v14.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: rich\n  dependency-version: 14.2.0\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "deps(deps): update rich requirement",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-05T03:29:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e5d82e42877fb4d1c1f3de6f15e57644a554f72",
          "body": "…0% COMPLETE 🎉\n\nImplemented comprehensive Fine-Tuning security module with all 11 security checks:\n\n**fine_tuning.py** - Complete rewrite (243 → 1,169 lines, +926 insertions):\n1. Training Data Bucket Security (266 lines) - Public access, encryption, versioning\n2. Training Data PII Detection (107 lin\n[…]\nnged: 5\nInsertions: ~1,000 lines\nModule: Fine-Tuning Security (100% complete)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement AWS Bedrock Fine-Tuning Security Module - PRIORITY 1 NOW 10…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-31T09:33:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4bec7a4c4ffd13708793b0dc27f4f236125bf451",
          "body": "Added comprehensive entry for AWS Bedrock Knowledge Bases (RAG) Security Module:\n- All 12 security checks documented\n- OWASP LLM01, LLM03, LLM06, LLM07 coverage\n- MITRE ATLAS AML.T0020 (Poison Training Data) coverage\n- Compliance: HIPAA, PCI-DSS, SOC 2, ISO 27001, GDPR Art. 32\n- 2,237 lines of code,\n[…]\nlines, 25 tests (80% passing)\n\nTotal: 33 security checks, 5,271 lines of code\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Knowledge Bases module to CHANGELOG",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-31T09:02:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68cd6bdf61509cc096a7f8bf80d3429ab3852e95",
          "body": "Updated ROADMAP.md to accurately reflect project status:\n- Knowledge Bases (RAG): Marked as 100% complete (12 of 12 checks)\n- Detailed all 12 implemented security checks with line counts\n- Updated coverage statistics: OWASP 70%, MITRE ATLAS 50%, Bedrock 75%\n- Corrected outdated module completion per\n[…]\necurity checks\n\nTotal: 5,271 lines of security checking code across 33 checks\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Document Knowledge Bases module completion and fix test structure",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-31T09:01:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f1d3f36fc8cf431ec1f7911b324c5a6dc456b612",
          "body": "Added comprehensive documentation for AWS Bedrock Guardrails Security Module\nacross all three documentation files:\n\n**README.md:**\n- Added \"Guardrails Security\" section with all 11 security checks\n- Highlighted key features: strength configuration, automated reasoning,\n  PROMPT_ATTACK filter, PII fi\n[…]\nes documenting 11 security checks\nModule: Guardrails Security (100% complete)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update documentation for Guardrails module completion",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-31T08:01:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4bba66404785309dfe4f901531eca45f61f66a3",
          "body": "Added both critical security modules to BedrockSecurityChecker:\n\n**Agents Module (10 checks):**\n- Action confirmation validation\n- Guardrail enforcement\n- Service role permissions\n- Lambda function security\n- Knowledge base access\n- Memory encryption\n- Resource tagging\n- PII detection\n- Prompt injec\n[…]\nun_all_checks() method\n- ✅ Updated class docstring with OWASP mappings\n- ✅ Prioritized critical checks first (Agents, Guardrails, KB)\n\nAll 33 checks (10 Agents + 11 Guardrails + 12 KB) now integrated!",
          "is_bot": false,
          "headline": "Integrate Agents and Guardrails modules into main security checker",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T23:33:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5ce813d60b30886dfe92385344a1a72a30aa2186",
          "body": "Completed implementation of all 11 Guardrails security checks:\n1. ✅ Strength Configuration - Validates HIGH filter strength (not LOW/MEDIUM)\n2. ✅ Automated Reasoning - Checks hallucination prevention (NEW 2025 feature)\n3. ✅ Content Filter Coverage - Validates all threat categories including PROMPT_A\n[…]\nhandling\n- Detailed findings with remediation steps\n- OWASP category mappings throughout\n- \"WHY CRITICAL\" explanations in all docstrings\n\nNext: Integration into main checker, test suite, documentation",
          "is_bot": false,
          "headline": "Implement AWS Bedrock Guardrails Security Module (11 of 11 checks)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T23:01:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e93aeeea6bc0098e43f491c21c2d26283f4fda02",
          "body": "Resolved test failures caused by outdated method names:\n- check_data_source_encryption() → check_s3_bucket_encryption()\n- check_chunking_configuration() → check_knowledge_base_chunking_config()\n- check_iam_permissions() → check_knowledge_base_access_patterns()\n- check_pii_exposure() → check_pii_in_e\n[…]\nsults:\n- Before: 14/25 passing (56%)\n- After: 19/25 passing (76%)\n- Remaining 6 failures are test setup issues, not implementation bugs\n\nAll 12 KB security checks are fully implemented and functional.",
          "is_bot": false,
          "headline": "Fix Knowledge Bases test suite method name mismatches",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T21:33:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d10c49f46413d83e3941a5b7550294c8275190c",
          "body": "Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.31.9 to 4.31.9.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/4\n[…]\nendency-name: github/codeql-action\n  dependency-version: 4.31.9\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump github/codeql-action from 3.31.9 to 4.31.9",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-12-30T21:11:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0fb21bae6735566d053efc22a0f18660b9abb873",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.2 to 6.0.0.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/ea165f8d65b6e75b540449e92b4886f43607fa02...b7c566a772e6b6bfb58ed0dc25\n[…]\ndency-name: actions/upload-artifact\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump actions/upload-artifact from 4.6.2 to 6.0.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-12-30T21:10:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4f4bc9b394d15d398b4686d31d695ad4be05178",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4.3.1 to 6.0.1.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/34e114876b0b11c390a5638\n[…]\n- dependency-name: actions/checkout\n  dependency-version: 6.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump actions/checkout from 4.3.1 to 6.0.1",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-12-30T21:10:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "53811b2ff6f0a77fc4cc21a6f523897b0bb6594b",
          "body": "Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.6.0 to 6.1.0.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/a26af69be951a213d495a4c3e4e4022e16d87065...83679a892e2d95755f2dac6acb0bfd1e9ac5d5\n[…]\npendency-name: actions/setup-python\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "ci(deps): bump actions/setup-python from 5.6.0 to 6.1.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2025-12-30T21:10:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84523dc64658a585196180220d7a5d8065f7b9b3",
          "body": "- Updated README.md with Agents Security section (10 checks)\n- Updated CHANGELOG.md with full feature list and compliance mappings\n- Updated ROADMAP.md to show 100% completion with detailed statistics\n- Closed all GitHub issues: #4, #29-#38\n\nDocumentation changes reflect:\n- 1,838 lines of production\n[…]\nAMP, SOC 2, ISO 27001, GDPR\n- Addresses #1 attack vector for 2025 per ROADMAP\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update documentation for Agents module completion",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T19:53:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4eefd04fa7964aded360bdd9aa8738e328891f58",
          "body": "- Implemented check_agent_memory_encryption() (Issue #33, Risk 7/10)\n  * Validates memory configuration and encryption\n  * Flags agents with memory enabled for manual KMS verification\n  * Compliance: HIPAA, PCI-DSS, FedRAMP\n\n- Implemented check_agent_tags() (Issue #35, Risk 5/10)\n  * Validates prese\n[…]\ntation: 1,838 lines\n\nPhase 3 complete! All agent security checks implemented.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement final 4 agent security checks (Issues #33, #35, #36, #38)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T19:44:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "889985807a1f28db47f4ab94141ec8603b4ff2c4",
          "body": "- Added check_agent_knowledge_base_access() to validate KB security\n- Implemented security checks:\n  * Cross-account knowledge base access (MEDIUM finding)\n  * Missing/non-existent KB references (MEDIUM finding)\n  * Same-account KB access (good practice, no finding)\n- Added 5 comprehensive test case\n[…]\nEDIUM)\nOWASP: LLM08 (Excessive Agency)\nLines: +185 implementation, +180 tests\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement agent KB access check (Issue #34)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T18:56:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4d28cb0152933001e4a8e9901e4b7ba0bc8e702",
          "body": "- Added check_agent_lambda_permissions() to validate Lambda security\n- Added helper method _analyze_lambda_security() for detailed analysis\n- Added Lambda client initialization in AgentSecurityChecks.__init__()\n- Implemented security checks:\n  * Public Lambda invocation access (CRITICAL finding)\n  *\n[…]\n(HIGH)\nOWASP: LLM08 (Excessive Agency)\nLines: +425 implementation, +320 tests\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement agent Lambda permissions check (Issue #32)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T18:17:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31148cdb92275a1ef47a7775126198322fcb1983",
          "body": "Implement the fourth HIGH-priority security check for AWS Bedrock Agents:\ncheck_agent_service_roles() validates agent service role IAM permissions\nfollow least privilege principles.\n\nWHY CRITICAL: Agents with overly permissive service roles (e.g.,\nAdministratorAccess) can access AWS resources beyond\n[…]\nn + tests)\n\nAgents Module Progress: 40% complete (4 of 10 checks implemented)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement agent service roles check (Issue #31)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T16:51:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d0ecb26c27dc01421840f6cc182fac902399662f",
          "body": "Implement the third HIGH-priority security check for AWS Bedrock Agents:\ncheck_agent_prompt_injection_patterns() scans agent instructions for\nknown prompt injection vulnerabilities and missing security guidance.\n\nWHY CRITICAL: Agent instructions containing vulnerable patterns or\nlacking security bou\n[…]\n% complete (3 of 10 checks implemented)\nPhase 1 (Critical checks): COMPLETE ✅\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement agent prompt injection patterns check (Issue #37)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T14:49:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73d470d31a54795055acdec2ddfb1a27e77a72d9",
          "body": "Implement the second CRITICAL security check for AWS Bedrock Agents module:\ncheck_agent_guardrails() validates that agents have guardrails configured\nto protect against prompt injection attacks.\n\nWHY CRITICAL: 70% of agents in production are deployed without guardrails,\nmaking them vulnerable to ind\n[…]\nn + tests)\n\nAgents Module Progress: 20% complete (2 of 10 checks implemented)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement agent guardrails check (Issue #30)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T14:44:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4d1d0d0bbe78015dd54ae4acc0c4cb1f34b630d",
          "body": "Implement the first CRITICAL security check for AWS Bedrock Agents module:\ncheck_agent_action_confirmation() validates that agents require human\nconfirmation before executing mutating operations.\n\nWHY CRITICAL: 60% of agents in production lack action confirmation,\nallowing autonomous execution of da\n[…]\nn + tests)\n\nAgents Module Progress: 10% complete (1 of 10 checks implemented)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement agent action confirmation check (Issue #29)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-30T14:41:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68fdac8ae4c83ce9ce58250586ae700c74eb78b2",
          "body": "…ve code quality\n\nBREAKING CHANGE: Minimum Python version raised from 3.8 to 3.9\n- Aligns with AWS CloudShell default (Python 3.9.16)\n- Python 3.8 reached EOL October 2024\n\nCritical Fixes:\n- Fix version triple-mismatch: unified to 1.2.0 across __init__.py, setup.py, pyproject.toml\n- Delete requireme\n[…]\nts\n- requirements.txt - DELETED\n\nNet Result: -16 lines (78 added, 94 removed)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Repository cleanup: fix version mismatches, update Python 3.9+, impro…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-29T15:16:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2815c5fe7039ad6b2a66021454a9610a361a4ac0",
          "body": "Remove problematic SARIF artifact upload step that used\nrelative pathing '../results/python.sarif' which is not\nallowed by GitHub Actions.\n\nThe codeql-action/analyze already uploads SARIF results\nto GitHub Security tab, so separate artifact upload is\nredundant.\n\nError fixed:\n  ##[error]Invalid pattern '../results/python.sarif'.\n  Relative pathing '.' and '..' is not allowed.",
          "is_bot": false,
          "headline": "Fix CodeQL workflow artifact upload path",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T19:33:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3cd21cfac0ee2ba276afe8cccfb99ff6f1595e55",
          "body": "Static Application Security Testing:\n- Add CodeQL workflow for automated code scanning\n- Scans Python code for security vulnerabilities\n- Runs on push, pull requests, weekly schedule, and manual trigger\n\nConfiguration:\n- Language: Python\n- Queries: security-extended + security-and-quality\n- Schedule\n[…]\nact:\n- SAST: 0/10 → 10/10 (+10 points)\n- Overall OSSF Score: 6.4/10 → ~6.9/10\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add CodeQL security analysis workflow (SAST)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T13:47:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa5cefd3ddca016735182d0fded5f3b6aee41886",
          "body": "Security Policy:\n- Add SECURITY.md with comprehensive vulnerability reporting process\n- Document security best practices for AWS credential handling\n- List known limitations and security tooling\n- Establish coordinated disclosure timeline\n\nDependency Management:\n- Add Dependabot configuration for au\n[…]\nection (requires repo admin)\n- Code review enforcement (requires PR workflow)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Implement OSSF Scorecard security improvements (4/10 → 7+/10)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T12:53:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "76d5b12c07cb71c543d50dc8741e63027bd9de51",
          "body": "Workflow Fixes:\n- Remove non-existent develop branch from test.yml and publish.yml\n- Update mypy comments to clarify intentional continue-on-error behavior\n- Update coverage comments to match PR template requirements (50%)\n- Add tomli fallback comment in publish.yml version check\n- Add tomli to pypr\n[…]\nekly security health checks\n- README.md: Added OSSF Scorecard badge (line 10)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix GitHub workflows and add OSSF Scorecard security assessment",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T04:11:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7d29e22a4f14cc03dcc8cd4815aca862638bf5d",
          "body": "Removed:\n- ISSUE_STATUS.md - Moved tracking to GitHub Issues\n- GITHUB_ISSUES_ARCHIVED.md - Archived and obsolete\n- IMPROVEMENTS.md - Preparing for project reset\n\nRationale:\n- GitHub Issues provides better tracking for active work\n- Completed work already documented in CHANGELOG.md\n- Reduces redundant tracking files in repository\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Clean up obsolete markdown tracking files",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T03:01:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a3f69369edfc2f03ec952fae5d5da89757eca118",
          "body": "ENHANCEMENT: Added comprehensive IAM policy analysis to embedding model\naccess control check. Now detects overly permissive IAM policies on\nKnowledge Base execution roles.\n\nImplementation Changes:\n- Added _analyze_iam_policies_for_embedding_model() method (lines 2055-2204)\n  * Analyzes attached mana\n[…]\n checks\n- Provides actionable remediation guidance with specific ARNs\n- No breaking changes - additive enhancement only\n\nRelated commits:\n- 5453fdd: Add comprehensive unit tests for KB security checks",
          "is_bot": false,
          "headline": "Enhance embedding model check with deep IAM policy analysis",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T01:57:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5453fddca238d4fba3ab80bf629dc6ace4eed21d",
          "body": "Added 9 unit tests covering the 3 remaining Knowledge Bases checks:\n\nS3 Public Access Tests (3 tests):\n- test_s3_bucket_fully_blocked: Validates buckets with all 4 BPA settings\n- test_s3_bucket_partially_blocked: Detects missing BPA settings\n- test_s3_bucket_no_bpa_config: Handles buckets without BP\n[…]\nlly overriding kb_checks.bedrock_agent with mocked client\n- Moto exception handling limitation documented in test_s3_bucket_no_bpa_config\n\nRelated: ISSUE_STATUS.md update (KB module now 100% complete)",
          "is_bot": false,
          "headline": "Add comprehensive unit tests for KB security checks",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T01:43:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0cf66e1fa4c13e8080b4853dd99d3cb0914d14e5",
          "body": "CRITICAL DISCOVERY: The 3 'missing' Knowledge Bases checks were already\nfully implemented! This was a documentation issue, not a code issue.\n\nChanges:\n- README.md: Use local wilma-logo.jpg instead of GitHub assets URL\n- ISSUE_STATUS.md: Update KB module completion from 67% to 100%\n- Move checks #10-\n[…]\n2053) - COMPLETE (basic)\n\nNext: Add comprehensive unit tests for all 3 checks\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update docs: KB module is 100% complete, fix README image",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T00:59:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "834ca1d63356119e24a9476467f93d03099710d8",
          "body": null,
          "is_bot": false,
          "headline": "Add Rich UI demo script - showcase beautiful terminal output",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T00:42:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b84bcc81652c0fd0f77ce6069892a603a75135c8",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG for v1.2.0 - Rich UI and Wiki",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T00:33:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4ad8e0ce7d3add267cdb3dd18a936f792f7d596",
          "body": "Replaced colorama + tabulate with rich for Charmbracelet-quality output:\n- Beautiful tables with borders and colors\n- Summary panels with proper formatting\n- Risk-based color coding (red/yellow/blue)\n- Blinking critical alerts\n- Clean grid layouts for info\n- Enhanced learning mode with styled tables\n[…]\nes both)\n\nVersion bump: 1.1.0 → 1.2.0\n\nThe terminal output is now gorgeous! 🎨\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add rich library for beautiful terminal UI (v1.2.0)",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T00:32:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "455eff73b8a734b5718faaf76cab8691d3550831",
          "body": "Created wiki pages teaching AWS Bedrock security threats:\n- Home: Overview and navigation\n- GenAI Security Fundamentals: 7 pillars of GenAI security\n- OWASP LLM Top 10: Industry standard threat taxonomy\n- Knowledge Bases (RAG) Security: Deep dive into 12 security checks\n- Installation Guide: Get sta\n[…]\nx.\nEach page includes real-world examples, attack scenarios, and remediation.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add comprehensive educational wiki content for GenAI security",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-12-28T00:15:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ea7a64b8da0b763485bb1133b3cfc5e32c1f926",
          "body": "- Rewrote ALL 41 remaining tests to use hybrid approach\n- test_logging_checks.py: 11 tests - S3 buckets and CloudWatch logs with Moto\n- test_kb_checks.py: 10 tests - Knowledge bases with Bedrock Agent mocks + S3/IAM via Moto\n- test_network_checks.py: 8 tests - VPC endpoints and security groups with \n[…]\ning checks\n\nTotal tests rewritten: 49 (8 GenAI/IAM + 41 remaining)\nAll tests now use real AWS resource creation via Moto where supported\nBedrock operations use MagicMock due to incomplete Moto support",
          "is_bot": false,
          "headline": "Complete test suite rewrite with Moto + MagicMock hybrid approach",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-06T17:53:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a40264b2fce087d0510598141b4e5ba430b28f50",
          "body": "- Rewrite GenAI tests to create real S3/CloudWatch resources\n- Rewrite IAM tests to create real IAM policies and roles\n- Remove patching in favor of Moto integration testing\n- All 10 tests now use hybrid Moto + MagicMock approach",
          "is_bot": false,
          "headline": "Fix GenAI and IAM tests to use Moto properly",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-06T17:14:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c10cead07741f3c70895ca5af76007fd82c1b90",
          "body": "- Rewrite conftest.py to use MagicMock for Bedrock (incomplete Moto support)\n- Keep Moto for S3, IAM, EC2, CloudWatch (fully supported)\n- Add helper functions for common Bedrock mock setups\n- Skip unsupported Bedrock contract tests\n- Lower coverage threshold to 50% temporarily\n- Fix linting issues in test files",
          "is_bot": false,
          "headline": "Implement hybrid Moto + MagicMock testing approach",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-06T16:52:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb6f1c9cd10c8e41bfc69b273e68f5dae61b4903",
          "body": "- Add explicit skip codes (-s flag) to Bandit commands\n- Skip B101, B106, B107, B112, B601 (false positives)",
          "is_bot": false,
          "headline": "Fix Bandit configuration in CI/CD workflows",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-06T15:35:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "754e4c1f7f19d9a620ca0802c70d22cff6bb2783",
          "body": "- Sort imports alphabetically in tests/helpers.py\n- Remove redundant scope='function' from pytest fixtures\n- Break down compound assertion per PT018",
          "is_bot": false,
          "headline": "Fix ruff linting violations in test files",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-06T14:36:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b883b562be48899af8c86b975ec737be5000ece0",
          "body": "- Fix Bandit false positives blocking workflows\n- Migrate from MagicMock to Moto for realistic AWS mocking\n- Reorganize tests into unit/integration/contract structure\n- Add test helpers and contract tests for AWS APIs\n- Update CI/CD workflows with proper test configuration",
          "is_bot": false,
          "headline": "Overhaul testing infrastructure with Moto and fix CI/CD",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-06T10:20:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "471084933ed99b09663630612c754bd8c3a19090",
          "body": "- Updated ruff configuration to be more pragmatic (120 char limit, ignore false positives)\n- Auto-fixed import sorting and unused imports across codebase\n- Added inline comments explaining security false positives (S106/S107 for AWS pagination tokens)\n- Added pre-commit hooks for automated code qual\n[…]\nrotection\n- GitHub release creation integrated into publish workflow\n- Pre-commit package added to requirements-dev.txt\n\nThis resolves all CI/CD test failures and enables automated release management.",
          "is_bot": false,
          "headline": "Fix CI/CD: Resolve ruff linting violations and add automation",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-06T04:07:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a20b10fe432f12f567d6b6bb0d947f888d0c9c4",
          "body": "- Published to PyPI as wilma-sec package\n- Implemented GitHub Actions workflows for automated testing and publishing\n- Added 2,114 lines of tests across 7 modules with 80% coverage requirement\n- Integrated security scanning (bandit), linting (ruff), and type checking (mypy)\n- Created comprehensive t\n[…]\n1.1.0 release\n- Added CI/CD status badges to README\n- Created PR template for consistent contributions\n- Cleaned up MANIFEST.in for leaner package distribution\n- Archived historical planning documents",
          "is_bot": false,
          "headline": "Release v1.1.0: Add CI/CD automation and comprehensive test suite",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-06T03:36:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1699fc74631e00b94af2a012bf481b5962e54f7",
          "body": "Enhanced comments and docstrings across all modules:\n\nCore modules:\n- checker.py: Added architecture overview, detailed method docs\n- reports.py: Clarified output format structure and usage\n\nSecurity check modules:\n- knowledge_bases.py: Comprehensive 12-check overview with threat mapping\n- genai.py:\n[…]\nelopers\n- Removed redundant comments, kept essential security context\n\nGoal: Help developers and AI assistants understand code purpose,\nsecurity rationale, and extension points for future development.",
          "is_bot": false,
          "headline": "Improve code documentation for v1.0",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-05T23:24:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1c2443f88adea37f0747e575b017a1ddae32525e",
          "body": "Previously only 6 checks were documented in learn mode.\nNow includes all 19 checks:\n- 3 GenAI checks (prompt injection, PII, cost)\n- 4 traditional checks (IAM, logging, network, tagging)\n- 12 Knowledge Base checks (S3, vector stores, PII, chunking, etc.)\n\nEach check has clear description, relatable example, and explains why it matters.\nKeeps Wilma's practical, sensible tone throughout.",
          "is_bot": false,
          "headline": "Expand learn mode to cover all 19 security checks",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-05T22:21:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c7c6cc8148fb6b2bc52a75aaa8e006c6129c30c",
          "body": "Changes:\n- Added ASCII art WILMA banner that displays at scan startup\n- Added decorative ASCII report header and section dividers (◆ ◇ ◆)\n- Updated messages with Wilma's practical, sensible personality\n- Changed headers to emphasize \"Wilma\" branding over generic AWS text\n- Added personality to succe\n[…]\nices are properly configured\"\n- \"There! That wasn't so hard, was it?\"\n\nThis enhances brand recognition and user experience while maintaining\nprofessional functionality and clear technical information.",
          "is_bot": false,
          "headline": "Add Flintstones-themed branding with ASCII art and Wilma personality",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-05T21:34:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e5035f229ecb9ac632240671e06f2e5493223c97",
          "body": "Changes:\n- Removed BEGINNER and EXPERT modes, keeping only STANDARD and LEARN\n- STANDARD mode now shows both simple explanations and technical details\n- Removed --expert CLI flag\n- Updated all check modules to always show warnings and technical details\n- Fixed IAM client reference bug in knowledge_b\n[…]\nexpert mode was more thorough. The new STANDARD mode\nprovides comprehensive information to all users, combining the best of both\nprevious modes while maintaining the valuable LEARN mode for education.",
          "is_bot": false,
          "headline": "Simplify security modes by removing beginner/expert distinction",
          "author_name": "ethanolivertroy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-05T20:44:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "660003d4d4ca116737312bc35ea5f58e60421e5c",
          "body": "- Add IAM policy creation with bedrock:* wildcard (tests IAM checks)\n- Add unencrypted log bucket creation (tests GenAI checks)\n- Expand Knowledge Base creation to full OpenSearch Serverless setup\n- Add comprehensive security issue summary in output\n- Update cleanup to remove all new resources (IAM \n[…]\nwledge Base security checks ✓\n- 2 IAM security checks ✓\n- 2 Logging checks ✓\n- 1 Network check ✓\n- 3 GenAI checks ✓\n- 1 Tagging check ✓\n\nTotal: 21/21 implemented checks verified working (95% coverage)",
          "is_bot": false,
          "headline": "Enhance demo script to test all 21 Wilma security checks",
          "author_name": "ethanolivertroy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-05T19:21:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c0afcdfe09fc6201aab679d0a356789849fdaed1",
          "body": "…cker\n\nComplete security auditing tool for AWS Bedrock with focus on:\n- Knowledge Base (RAG) security (12 checks)\n- IAM and access control\n- Encryption and data protection\n- GenAI-specific vulnerabilities (prompt injection, PII detection)\n- Logging and monitoring\n- Network security\n- Resource tagging compliance\n\nIncludes demo setup script for testing with intentionally insecure resources.",
          "is_bot": false,
          "headline": "Initial commit: Wilma v1.0.0 - AWS Bedrock security configuration che…",
          "author_name": "Ethan Troy",
          "author_login": "ethanolivertroy",
          "committed_at": "2025-11-05T15:52:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 2,
      "commits_last_year": 74,
      "latest_release_at": "2026-07-21T13:29:59Z",
      "latest_release_tag": "v0.2.2",
      "releases_from_tags": false,
      "days_since_last_push": 2,
      "active_weeks_last_year": 11,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 3.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "wilma-sec",
          "exists": true,
          "license": "GPL-3.0-or-later",
          "keywords": [
            "aws",
            "bedrock",
            "security",
            "genai",
            "ai",
            "ml",
            "audit",
            "compliance",
            "wilma",
            "Development Status :: 4 - Beta",
            "Intended Audience :: Developers",
            "Intended Audience :: System Administrators",
            "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.8",
            "Programming Language :: Python :: 3.9",
            "Topic :: Security",
            "Topic :: System :: Systems Administration"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/wilma-sec/",
          "is_deprecated": false,
          "latest_version": "1.1.0",
          "repository_url": "https://github.com/ethanolivertroy/wilma",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2025-11-06T02:07:09.918746Z",
          "latest_published_at": "2025-11-06T02:07:11.014252Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 259
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 3,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-04-15",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 125690,
      "source_files_sampled": 40,
      "oversized_source_files": 3,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 11688
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml",
        "requirements-dev.txt",
        "setup.py"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 10,
        "malicious_count": 0,
        "assessed_package": "pypi:wilma-sec@1.1.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "boto3",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.43.51,<2.0.0"
        },
        {
          "name": "botocore",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.43.51,<2.0.0"
        },
        {
          "name": "rich",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=15.0.0,<16.0.0"
        },
        {
          "name": "pyyaml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0.3,<7.0.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "boto3",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "botocore",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyyaml",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "rich",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "bandit",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "boto3-stubs",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "build",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ipython",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "moto",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "mypy",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pre-commit",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-cov",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-mock",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest-xdist",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "ruff",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "setuptools",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "twine",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "types-pyyaml",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 19,
        "direct_count": 4,
        "indirect_count": 15
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 17,
        "open_issues": 1,
        "closed_ratio": 0.984,
        "closed_issues": 62,
        "closed_unmerged_prs": 41
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "ethanolivertroy",
          "commits": 60,
          "avatar_url": "https://avatars.githubusercontent.com/u/63926014?v=4"
        },
        {
          "type": "User",
          "login": "cursoragent",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/199161495?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.938
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "codeql.yml",
        "publish.yml",
        "scorecard.yml",
        "test.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "15 out of 15 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/10 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "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": "11 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 4,
            "reason": "dependency not pinned by hash detected -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "7cfc9e8591ef3bd31706f9666c4ded14d26f0c2d",
        "ran_at": "2026-07-23T22:05:46Z",
        "aggregate_score": 7.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T13:28:26Z",
      "oldest_open_prs": [
        {
          "number": 122,
          "created_at": "2026-07-21T17:18:16Z",
          "last_comment_at": "2026-07-21T17:18:39Z",
          "last_comment_author": "coderabbitai"
        }
      ],
      "last_merged_pr_at": "2026-07-21T13:27:35Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 83,
          "created_at": "2026-04-15T16:13:43Z",
          "last_comment_at": "2026-05-11T04:51:13Z",
          "last_comment_author": "ethanolivertroy"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ethanolivertroy/wilma",
    "host": "github.com",
    "name": "wilma",
    "owner": "ethanolivertroy"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 67,
      "inputs": {
        "security": 81,
        "vitality": 82,
        "community": 39,
        "governance": 53,
        "engineering": 80
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 82,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 74,
              "human_commit_share": 0.865,
              "days_since_last_push": 2,
              "active_weeks_last_year": 11
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "11/52 weeks with commits",
                "points": 7.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 11
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "74 commits in the last year",
                "points": 16.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 74
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "11 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "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": 100,
            "inputs": {
              "releases_count": 2,
              "latest_release_tag": "v0.2.2",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 3.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "2 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.7
                    }
                  }
                ],
                "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": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "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": 39,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 5,
            "inputs": {
              "forks": 1,
              "stars": 3,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3 stars",
                "points": 4.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (GPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "GPL-3.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 53,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 19,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.938
            },
            "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 94% of commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 94
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "merged_prs": 17,
              "open_issues": 1,
              "closed_issues": 62,
              "issue_closed_ratio": 0.984,
              "closed_unmerged_prs": 41
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "98% of issues closed",
                "points": 46,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "17/58 decided PRs merged",
                "points": 11.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 17,
                      "decided": 58
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/10 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": 65,
            "inputs": {
              "followers": 220,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ethanolivertroy",
              "public_repos": 198,
              "account_age_days": 2287
            },
            "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": "220 followers of ethanolivertroy",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 220,
                      "login": "ethanolivertroy"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "198 public repos, account ~6 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 198
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "good",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "packages": [
                "wilma-sec"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 259
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 259 days ago",
                "points": 26,
                "status": "partial",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 259
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "3 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": 80,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "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": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "15 out of 15 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "topics": [
                "aws",
                "bedrock",
                "genai",
                "llm",
                "security"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": "good",
        "name": "Security",
        "value": 81,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "good",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 76,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 7.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "15 out of 15 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/10 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "11 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:wilma-sec@1.1.0 runtime dependency closure — what installing the published package pulls in — 10 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:wilma-sec@1.1.0",
                  "assessed": 10
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 10,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 10,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "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": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.891,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 11688
            },
            "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": "57 of 64 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 57,
                      "sampled": 64
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.27,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.135
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "20 of the last 74 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 20,
                      "sampled": 74
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "10 of the last 74 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 10,
                      "sampled": 74
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 125690,
              "source_files_sampled": 40,
              "oversized_source_files": 3
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "3/40 source files over 60KB",
                "points": 50.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 40,
                      "oversized": 3
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T22:06:01.563839Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/ethanolivertroy/wilma.svg",
  "full_name": "ethanolivertroy/wilma",
  "license_state": "standard",
  "license_spdx": "GPL-3.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 agregadasPyPI.