Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-08-01 04:06 UTC

denful / den

Aspect-oriented, context-driven Nix configurations.

NixApache-2.0★ 530 estrellas⑂ 49 forksdesde oct 2025Ver en GitHub ↗

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

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

64
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

denfulOrganización
36 seguidores32 repositorios públicosdesde abr 2026

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

Métricas por categoría

Vitalidad

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

92Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
22.8/36Cadencia de commits — 33/52 semanas con commits
18/18Volumen de commits — 651 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 27 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year651
human_commit_share1
days_since_last_push0
active_weeks_last_year33
Cómo se puntúa
27/27Publica versiones — 18 versiones publicadas
36/36Recencia de las versiones — última versión hace 38 días
27/27Cadencia de publicación — una versión cada ~13,7 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count18
latest_release_tagv0.18.0
releases_from_tagsno
days_since_latest_release38
mean_days_between_releases13,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?

57Moderado · 18% del índice global
Cómo se puntúa
44.2/60Estrellas — 530 estrellas
14/25Forks — 49 forks
5.6/15Observadores — 11 observadores
Datos de entrada utilizados
forks49
stars530
watchers11
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

58Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
5/22.5Distribución de commits — el principal contribuyente firma el 78% de los commits
13.5/13.5Amplitud de contribuyentes — 29 contribuyentes
10/10OpenSSF Scorecard: Contributors — project has 30 contributing companies or organizations
Datos de entrada utilizados
bus_factor1
contributors_sampled29
top_contributor_share0,779
Cómo se puntúa
42.2/46.8Resolución de issues — 90% de issues cerradas
35.3/38.3Aceptación de PR — 332/360 PR decididos fusionados
10.5/15OpenSSF Scorecard: Code-Review — Found 21/30 approved changesets -- score normalized to 7
Datos de entrada utilizados
merged_prs332
open_issues14
closed_issues129
issue_closed_ratio0,902
closed_unmerged_prs28
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
11.3/25Alcance del propietario — 36 seguidores de denful
11.6/25Trayectoria — 32 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers36
owner_typeOrganization
is_verified
owner_logindenful
public_repos32
account_age_days102

Calidad de Ingeniería

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

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

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — http://den.denful.dev/
10/10Descripción del repositorio
10/10Topics — 12 topics
0/10Wiki
Datos de entrada utilizados
topicsdendritic, nix, os-configuration, aspect-oriented, home-manager, nix-darwin, nixos, den, nix-build, unflake, flake, context-driven
has_wikino
homepagehttp://den.denful.dev/
has_readme
has_docs_dir
has_description

Seguridad

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

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

Preparación para IA

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

61Moderado · 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 — 94 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,94
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes9327
Cómo se puntúa
18/18Arranque con un solo comando — Justfile
0/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — docs/tsconfig.json
10/10Entorno reproducible — Nix, lockfile
4/10Práctica demostrada con agentes — 2 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nix
has_testsno
lockfilespnpm-lock.yaml
has_dockerfileno
typed_languageno
bootstrap_filesJustfile
has_devcontainerno
has_linter_configno
typecheck_configsdocs/tsconfig.json
agent_commit_share0,02
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
27/45Código verificable por tipos — Nix con configuración de verificación de tipos (docs/tsconfig.json)
55/55Tamaños de archivo manejables — 0/3 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageNix
largest_source_bytes8544
source_files_sampled3
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — example
Datos de entrada utilizados
example_dirsexample
has_mcp_signalno
api_schema_files

Datos clave

530estrellas de GitHub
29contribuidores
651commits en los últimos 12 meses
0días desde el último push
18versiones publicadas
1factor bus
14issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

Historial de estrellas y forks 0 ★ / 49 ⇿
0Estrellas
49Forks
16Versiones

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

010203040504922025-112026-032026-07
Mayor 0Menor 16Parche 0
OpenSSF Scorecard 4.5 / 10
4.5agregado

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-08-01 04:05 UTC

10Binary-Artifactsno binaries found in the repo
5Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
7Code-ReviewFound 21/30 approved changesets -- score normalized to 7
10Contributorsproject has 30 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 27 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities32 existing vulnerabilities detected
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "dendritic",
        "nix",
        "os-configuration",
        "aspect-oriented",
        "home-manager",
        "nix-darwin",
        "nixos",
        "den",
        "nix-build",
        "unflake",
        "flake",
        "context-driven"
      ],
      "is_fork": false,
      "size_kb": 2958,
      "has_wiki": false,
      "homepage": "http://den.denful.dev/",
      "languages": {
        "Nix": 1902164,
        "Just": 2592,
        "Shell": 3543
      },
      "pushed_at": "2026-07-31T20:59:58Z",
      "created_at": "2025-10-23T02:56:00Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-31T21:00:01Z",
      "description": "Aspect-oriented, context-driven Nix configurations.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Nix",
      "significant_languages": [
        "Nix"
      ]
    },
    "owner": {
      "blog": "https://denful.dev",
      "name": "denful",
      "type": "Organization",
      "login": "denful",
      "company": null,
      "location": null,
      "followers": 36,
      "avatar_url": "https://avatars.githubusercontent.com/u/277897018?v=4",
      "created_at": "2026-04-20T21:32:15Z",
      "is_verified": null,
      "public_repos": 32,
      "account_age_days": 102
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-06-23T22:07:30Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-05-21T15:47:11Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-04-15T04:07:37Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-04-07T09:15:45Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-03-30T00:30:20Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-03-19T23:42:08Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-03-13T01:38:46Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-03-06T01:18:57Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-02-24T22:17:14Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-02-20T08:00:26Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-02-12T17:20:58Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2025-12-17T04:32:21Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2025-11-21T07:07:39Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2025-11-16T10:24:01Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2025-11-12T01:41:28Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2025-11-05T03:59:25Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2025-11-02T10:28:31Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2025-10-29T09:48:00Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "2040b61346a7215fd7b7f51d4a457544b6e597d0",
          "body": "… (#643)\n\nFixes #642, #644, #645, #640.\n\nThe first three are regressions from 41aa2558 (#603) in how custom\n`_.forward` classes are delivered; #640 is a pre-existing\nstandalone-home defect. They share a shape — content or a declaration\ngoes missing with nothing said about it — but four distinct mech\n[…]\nanding projected content (#642, #645), breaking legitimate\nhost-content sharing (#644), or disturbing the declared-host path\n(#640).\n\nFull CI: `1079/1079`, 0 failures, 0 eval errors. `just fmt` clean.",
          "is_bot": false,
          "headline": "fix: four silent-drop defects in forward classes and standalone homes…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-07-31T20:59:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f11ba1494052fd3ac52c1342915bcb52ba08f07",
          "body": "Hello, I'm migrating my nix config to den and found that when\nhome-manager and the OS are managed as separate outputs, a few strange\nthings will happen.\n\nTwo standalone home configs that share a username but target different\nhosts (`user@hostA`, `user@hostB`) were stepping on each other: each\nflake \n[…]\nparated\nwhile their user-facing name and description are untouched.\n\nIt ships as two commits (one per keying layer, since both are needed)\nplus regression tests covering the `id_hash` and scope paths.",
          "is_bot": false,
          "headline": "fix: keep same-username homes on different hosts distinct (#641)",
          "author_name": "Alessio Caiazza",
          "author_login": "nolith",
          "committed_at": "2026-07-30T01:36:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "99cc0c5a1cc846cb1be681344b10d2731d430e13",
          "body": "Fixes #629.\n\n## Problem\n\nRequesting an entity arg (e.g. `user`) inside a class module was\nsilently dropped when the aspect is included at a scope where that\nentity is a *descendant* — the reporter's `nixos = { user, ... }:` at\nhost scope:\n\n```nix\nden.aspects.desktop.cosmic.nixos =\n  { user, ... }:\n \n[…]\n.\n- `user-scoped-host-class-fanout`, `nested-class-module-args` (incl.\n`test-guard-skips-without-context`), `top-level-parametric`,\n`auto-parametric` all green.\n- Full suite: **1059/1059 successful**.",
          "is_bot": false,
          "headline": "fix: fan class-module entity args over scope descendants (#629) (#634)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-07-18T00:37:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2fcac84eae76c5cb3fc964a4cbcea36c8789af1c",
          "body": "… spawns (#633)\n\n## Problem\n\nA quirk produced within a user's class context (a `homeManager` aspect's\nbare quirk key) does not reach that user's `homeManager` consumer when\nthe consumer is projected onto the user via\n`den.batteries.host-aspects`. The projected consumer sees only\nhost-scope emits (re\n[…]\nne\n- `test-user-quirk-local-home` — user ↔ own home baseline\n- `test-user-quirk-into-host-aspects-projected-consumer` — the repro\n(failed pre-fix: consumer read `[]`)\n\nFull suite green: **1057/1057**.",
          "is_bot": false,
          "headline": "fix: surface the requesting scope's own quirk emits into host-aspects…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-07-17T22:43:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7bebdeb796ba1721f842b8c5d1dd25a41fa2707",
          "body": "## Problem\n\nA deferred `spawn` policy (e.g. the `host-aspects` battery) projects an\naspect into a post-walk nested scope. The aspect's static quirk emit\nonly materialized inside the spawned node, so a pipe policy\n(`broadcast`/`collect`/`expose`/local) at the scope that **requested**\nthe projection r\n[…]\n is currently INERT — no consumer wires\n`config.identity`, so the eager branch always runs. It is a forward hook\nfor the cross-host case; wiring it (or cutting it) plus a covering\nfixture is deferred.",
          "is_bot": false,
          "headline": "fix: surface spawn-projected quirk emits at the requesting scope (#625)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-07-17T15:42:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84b514929d25c7b2f8e9cfba5ff87d395c2b9263",
          "body": "Signed-off-by: k2on <22125083+k2on@users.noreply.github.com>",
          "is_bot": false,
          "headline": "docs: fixed typo in custom-classes documentation (#630)",
          "author_name": "k2on",
          "author_login": "k2on",
          "committed_at": "2026-07-13T17:45:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1614f6f8ed435c5bb257408bf91fd662f9aac43e",
          "body": "## Problem\n\nRefs #620.\n\nThe documented platform-specific `hmPlatforms` example can fail when a\nuser-scoped complex forward includes a `fromClass` whose class key never\nappears\nin the user's aspect tree and is not explicitly registered in\n`den.classes`.\n\nFor example, a user may include `hmPlatforms` \n[…]\n My contribution aligns with Den LICENSE and does not violate any\nother projects licenses (e.g. GPL)\n- [x] I will truthfully answer and provide any requested details on how\ncontribution was generated.",
          "is_bot": false,
          "headline": "fix: preserve source entity binding in forward fallback (#627)",
          "author_name": "Zetab",
          "author_login": "ZetabS",
          "committed_at": "2026-07-02T16:53:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3932adfe8ef02d322168aa5b07d9371d8ec1664d",
          "body": "## Problem\n\nA **static** (constant-name) aspect included via\n`den.schema.<kind>.includes` whose host-class (`nixos`/`darwin`) content\n**names an entity kind** — e.g. `nixos = { user, ... }: …` — collapsed\n**N sibling entities → 1** at the shared host merge. With three users on\na host, only one user'\n[…]\nhat let this through).\n- **Byte-identical** existing output: real nixos + k8s hosts produce the\nsame toplevel derivation pre/post fix (drvPath diff). Only\npreviously-miskeyed per-user content changes.",
          "is_bot": false,
          "headline": "fix: derive class-content emit ctx from authoritative scope state (#624)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-26T08:32:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "11866c167f5b4408149a4914966ae1a050054358",
          "body": "## Summary\n\nAdds a cross-scope **broadcast** primitive to the pipe/quirk system,\nmakes `collect` compose with `expose`, and fixes config-thunk resolution\nto honour the **producing** class + scope — then makes that resolution\n**class-neutral** so it no longer assumes NixOS.\n\n### `pipe.broadcast pred`\n[…]\nproducer-class config-thunk resolution + broadcast review fixes\n3. derive config-thunk host navigation from the class registry\n4. make config-thunk resolution class-neutral (no host/osConfig\nliterals)",
          "is_bot": false,
          "headline": "feat: pipe.broadcast cross-scope push + collect reads exposed (#623)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-26T04:25:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5df0987658d6e44268abba953406480e9f066928",
          "body": "This fixes an issue when using another nix runtime (like lix) that can't\nmerge multiple attrs with the same name in different brackets.\n\n(ref: #615)",
          "is_bot": false,
          "headline": "fix: flattening default den.schema (#616)",
          "author_name": "Mohamad Fikri",
          "author_login": "fmway",
          "committed_at": "2026-06-16T14:59:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2589d732f020970c83541b249d97bec4932ee163",
          "body": "…ification (#563)\n\n## What this delivers\n\nThis branch began as the gen-schema entity port and grew into a\nfive-part stabilization of den's resolver and delivery pipeline. Each\npart builds on the last and is covered by CI. **1023/1023 tests** (up\nfrom 825 at branch start).\n\n### 1. gen-schema entity p\n[…]\nt` shim restored; docs corrected. Specs, plans, the\nper-task deviation ledger, and the frozen parity contract live in the\nden-architecture papers; a net-behavior-change summary is published as a\ngist.",
          "is_bot": false,
          "headline": "feat: gen-schema entity port + resolver decoupling + delivery-edge un…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-15T16:05:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfc4617c22e326892bf47a1a1a72a13d46aabb3e",
          "body": "The original repository has been force-pushed, archived, and the pattern\nhas been removed. Thus, the link is removed entirely.",
          "is_bot": false,
          "headline": "fix(docs): Remove deprecated link (#612)",
          "author_name": "David Chocholatý",
          "author_login": "Adda0",
          "committed_at": "2026-06-13T18:42:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe63b4bff3358e51687b6f88fa8746d5b3dc1bd5",
          "body": "## Why\n\nPR #606 exposed a CI gating bug: re-running the failed `allow-ci` job\nkept failing even after the `allow-ci` label was added. The label check\nread `github.event.pull_request.labels` — a payload frozen at trigger\ntime, which re-runs reuse verbatim. A general audit of the workflows\nturned up s\n[…]\nst_review` keeps no paths filter by design: it's the\nre-trigger lever and the docs-only-merge mechanism.\n\nValidated with `actionlint` (only pre-existing info-level SC2086 notes\nremain) and `just fmt`.",
          "is_bot": false,
          "headline": "fix(ci): live label queries, real allow-ci gating, dead triggers (#607)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-11T16:56:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8f94c27bc28e53f07db8dc309d65c675e2f62c4",
          "body": "With PR #605 standalone homes have a host identity. This caused the\ncheck to pass even though the host has no class causing the unfree\nbattery to fail with the following error:\n```\n       error: attribute 'class' missing\n       at /nix/store/wnv7bc1psj89ylp29z3kabkbpwja0npn-source/modules/aspects/ba\n[…]\nes\n             |                            ^\n           45|         ) { ${host.class}.unfree.packages = allowed-names; };\n```\nThis PR changes a host existence check to the availability of its class.",
          "is_bot": false,
          "headline": "fix: missing host class in batteries (#606)",
          "author_name": "KP64",
          "author_login": "KP64",
          "committed_at": "2026-06-11T15:55:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f5e79c37d9528917d69217f355a6a1294f31486c",
          "body": "## Summary\n\nA standalone home named `user@host` could not resolve host-keyed config\n(`provides.<host>`, `policy.when ({ host, ... }: ...)`) unless the host\nwas declared in `den.hosts.<system>` — and declaring it forces\ninstantiation of the host's platform builder (e.g.\n`inputs.darwin.lib.darwinSyste\n[…]\nnclude\ngrammars (set + list + nested-list), multi-include, non-include-effect\nerror, the `hostname` battery staying inert on a synthetic host, and the\nno-fire plain-home path.\n\n`just ci`: **889/889**.",
          "is_bot": false,
          "headline": "feat: synthesize host identity for standalone user@host homes (#605)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-10T23:06:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7db422018a476efad229bd28c6c4bfa9cccd28d4",
          "body": null,
          "is_bot": false,
          "headline": "fix: move deadbug to proper location (#604)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-06-10T16:32:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41aa2558b31c9b7c539a400e332b32876f7238e9",
          "body": "… multi-def forwarded identity (#603)\n\nThree pipeline fixes plus a shared-helper cleanup, each fix with a\ndeadbugs regression test. Full CI: 879/879.\n\n## fix: sibling `policy.when` guards no longer collide at the dedup gate\n\nTwo `policy.when` includes in the same aspect both compile to\nconditional a\n[…]\nes in spawned resolution\n- `deadbugs/multi-def-namespace-identity.nix` — multi-def namespace\nchild keeps identity, no double emission\n\nAll three tests verified to fail on main and pass on this branch.",
          "is_bot": false,
          "headline": "fix: sibling policy.when guard dedup collision; spawn subtree routes;…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-10T06:41:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88161dab59a81fd8c1e26fe66c3bad0309bf06af",
          "body": "…#602)\n\n## Summary\n\nIn-context `.hasAspect` — the `user`/`host` arg inside a parametric\naspect body or resolved context — now answers **projected** membership\n(\"is aspectX *delivered into* this scope\") instead of the entity's\nstandalone structural tree. This fixes `user.hasAspect <x>` returning\n`fal\n[…]\n=true`), multi-user\n(`tux`/`pingu`), multi-host (`igloo`/`iceberg`)\n- [x] `has-aspect` (35/35) and `issue-540-exclude-guard` stay green\n- [x] full CI: **874/874 successful**\n\nDiff: 11 files, +386/-11.",
          "is_bot": false,
          "headline": "feat: in-context hasAspect honors projected (delivered) scope state (…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-10T04:43:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "590e20a84c8d9fbb1c11f9929c41c09196ee858a",
          "body": "## Summary\n\nFixes two related bugs in simple `policy.route`, surfaced by a guarded\nroute using `intoPath`.\n\n### Bug 1 — guarded empty-path route crashes when the guard is false\n\nA guarded route whose source is the raw collector module (`{ key; _file;\nimports }`, the empty-path case) crashed with:\n\n`\n[…]\nute-skips-cleanly` — guard false → route contributes\nnothing, no crash.\n- `test-intopath-nests` — `intoPath` nests content at the target path.\n\nFull CI: **866/866** passing. Formatted with `just fmt`.",
          "is_bot": false,
          "headline": "fix: guarded empty-path route skips cleanly; honor intoPath alias (#600)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-09T14:02:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "79048eb2bdb02732932b7f9292a8e930915d5ab4",
          "body": "A very small PR fixing some typos I noticed while reading the docs. It's\nnot exhaustive at all of course, only the ones I've seen\n\nCo-authored-by: groveless <7pkrvqcu@addy.to>",
          "is_bot": false,
          "headline": "docs: fix some typos (#597)",
          "author_name": "quokkbit",
          "author_login": "quokkbit",
          "committed_at": "2026-06-07T03:40:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a309fa74a255b416cdee1e56f4bb1e0d44529c4",
          "body": "## Summary\n\n- Extract den's diagram library (`nix/lib/diag/`) into standalone repo\n[denful/den-diagram](https://github.com/denful/den-diagram)\n- Den keeps only `capture.nix` (fx pipeline tracing); all graph IR,\nrenderers, filters, fleet views, and export helpers move to den-diagram\n- den-diagram dep\n[…]\ntext, graph, fleet, namespace)\n- [x] `diagram-demo` packages evaluate\n- [x] `fleet-demo` packages evaluate\n- [x] No `den.lib.diag` references remain in den\n- [x] Den CI has zero den-diagram dependency",
          "is_bot": false,
          "headline": "refactor: Extract diagram library to sini/den-diagram (#564)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-05T19:52:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33bbc9e755da0c96bfd51fd447e60ca82037f4ae",
          "body": null,
          "is_bot": false,
          "headline": "docs: update links (#595)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-06-05T03:29:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26404f775fefa609f2628a9d09a99588a79a0022",
          "body": null,
          "is_bot": false,
          "headline": "docs: update README remove extensive code examples (#594)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-06-05T03:04:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cece515d25b40808ee48d666a5b73f8718d15920",
          "body": null,
          "is_bot": false,
          "headline": "docs: update docs from source (#593)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-06-05T02:53:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40a93a9bc2e30e5d863dfe8f6431786e5b778eca",
          "body": null,
          "is_bot": false,
          "headline": "improve: organize tests public-api/internal-api/deadbugs (#592)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-06-05T01:42:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b57da20ac352d5cc98f25a98a6ec93db427dd2e",
          "body": null,
          "is_bot": false,
          "headline": "fix: gh-pages dont fail if no cached versioned docs exist (#591)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-06-05T00:39:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b093746f03007bae98175f6d2032698243872288",
          "body": null,
          "is_bot": false,
          "headline": "fix: order simple routes before forwards that consume their class (#584)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-03T02:33:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd3160212387b275550d88e92ac4a771ef37be08",
          "body": "Backports the standalone aspect-pipeline bug fixes that accumulated on\n`feat/entity-gen-schema-port` so they can land on `main` independently\nof the gen-schema entity port (which is still in flight) and the\nden-diagram extraction (tracked in its own PR).\n\nMost commits carry a `(cherry picked from co\n[…]\ntx` 1/1 (parametric host quirk survives projection\nvia the threaded scope-tree state, with chainCtx removed), `pipe-scope`\n16/16, `pipes` 9/9, `deadbugs` 23/23, `has-aspect` 35/35.\n- `just fmt` clean.",
          "is_bot": false,
          "headline": "fix: backport aspect-pipeline fixes from entity-gen-schema-port (#589)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-03T02:25:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "73f2af9028c0b93181e4520e0d8f0701ac22e058",
          "body": "## Problem\n\nThe reference page for flake outputs\n(`docs/src/content/docs/reference/output.mdx`) instructs:\n\n```nix\nden.schema.flake-packages.includes = [ den.aspects.foo ];\n```\n\nBut `flake-packages` is not a registered schema kind. The registered\nrouting kinds are `flake`, `flake-system`, `flake-par\n[…]\nke-packages.includes` gives no `packages` output at all\n- `den.schema.flake-system.includes` exports `hello` for every system,\nno host required\n\nMatches the workaround the reporter found.\n\nFixes #586.",
          "is_bot": false,
          "headline": "fix: correct flake output include to flake-system schema kind (#587)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-01T21:42:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9deef6d6768d7e534fc1497a8f92f38623510f60",
          "body": "## Problem\n\nFixes #583. When two aspects contribute to the same forward source class\nand the forward fires at a child (user) scope while routing into a\nparent (host) class, the host's own contribution is silently dropped:\n\n```nix\nden.aspects.atuin = {\n  includes = [ atuinClass ];   # forwards `atuin\n[…]\nforwarding-overwrite.nix`\n(mirrors the report): overwrite → ✅ 1/1\n- `host-aspects` ✅ 10/10 and `user-host-mutual-config` ✅ 9/9 — opt-in\nprojection unchanged\n- Full CI: **839/839** ✅\n- Formatting clean",
          "is_bot": false,
          "headline": "fix: forwarded content overwritten across scopes (#583)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-06-01T18:01:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "294d58404758df423e0332646a241b98ed087d78",
          "body": "Closes #575\n\n## Summary\n\nPositional functions (`ctx: ...`) in `includes` were silently dropped by\nthe pipeline. The compile router sent them to `compile-static` (because\n`__args == {}`), which stripped `__fn` as a structural key — the\nfunction was never called.\n\n## Root cause\n\nThe compile shape rout\n[…]\npositional context function.\n\n## Test plan\n\n- [x] 834/834 CI tests pass (833 existing + 1 new, 1 updated expected)\n- [x] Formatting clean\n\nCo-authored-by: Michael Utz <theutz@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix: resolve positional functions in includes with scope context (#578)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-31T23:41:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18e0d1c1a0c993eb419cb9b21ee9963dda34e758",
          "body": null,
          "is_bot": false,
          "headline": "perf: break closure chains and lazy instantiation backport (#579)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-31T23:32:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0b1cfaed25535ddaaaee9d48e92068a9060af6c",
          "body": null,
          "is_bot": false,
          "headline": "fix: don't force aspect content during key classification (#580) (#581)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-31T06:20:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30ebfdc1b6b3e02f668b2559c0af75cbd1cfe086",
          "body": "## Summary\n- `entry.system or \"unknown\"` in the disambiguation warning throws\n`cannot coerce null to a string` when `entry.system` is `null`\n- Nix's `or` only applies to attribute access (`a.b or default`), not\nstandalone values\n- Use explicit `if` check instead\n\nIntroduced in #565 (`0b250e17`).\n\n## Test plan\n- [ ] `nix flake check` passes\n- [ ] Flake with duplicate instantiate specs on null-system entities no\nlonger crashes",
          "is_bot": false,
          "headline": "fix: null coercion in disambiguate warning message (#576)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-29T23:41:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dfaf7443af65e742f97b306dc4df1de181def3f",
          "body": "Closes #572, closes #567\n\n## Summary\n\nThree route application fixes in the fx pipeline:\n\n**#572 — Multiple aspects defining the same flake output class clobber\neach other.** `wrapRouteModules` evaluated each source module\nindependently through `nestWithAdaptArgs`, producing separate config\ndefinitio\n[…]\n833 CI tests pass\n- [x] `flake-parts-modules` template passes (previously failed with\n`raw` freeform type)\n- [x] All other templates pass `just check-all` (same results as main)\n- [x] Formatting clean",
          "is_bot": false,
          "headline": "fix: route wrapping merge semantics and forward ordering (#574)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-29T22:24:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fba67817bd16955e10ff158c9758874031af089c",
          "body": null,
          "is_bot": false,
          "headline": "ci: bump nix-effects to den branch (#529)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-27T22:01:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3e424048b42096b1e534289dead8c6c7ed8cc0b",
          "body": "Fixes #570  (#568)",
          "is_bot": false,
          "headline": "fix: remove __denTest hack (#571)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-26T14:38:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b250e179282832e7ba9b7f95ffb8e6b87a973fe",
          "body": "…s output (#565)\n\n## Summary\n\n- When the same user name is declared under `den.homes` on multiple\nsystems (e.g. `x86_64-linux` + `aarch64-darwin`), both default\n`intoAttr` to `homeConfigurations.<name>`. Previously\n`lib.recursiveUpdate` silently merged the two independent module-system\nevaluations, \n[…]\nollect-fleet` passes (same-entity via fleet\n+ direct policy not broken)\n- [x] Verified against `benbelov-nixconfig` — produces\n`ben@x86_64-linux` and `ben@aarch64-darwin` with correct system pkgs\neach",
          "is_bot": false,
          "headline": "fix: disambiguate multi-system homes targeting same homeConfiguration…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-25T07:14:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f1a59448043677ac8bc7854348c1b8ee6889c0b",
          "body": "## Summary\n\n- **policy.when arg safety**: wrappers now pre-check the predicate's\nrequired args against the dispatch context before calling it. Prevents\ncrash when `{ host, ... }` predicates dispatch in non-host contexts\n(e.g., standalone home resolution via late dispatch).\n- **Fold hmHostBridge into\n[…]\n\n\n## Test plan\n\n- [ ] 6 new regression tests in `deadbugs/` (policy-when arg safety,\nstandalone crash, homeManager forwarding)\n- [ ] 829/829 existing CI tests pass\n- [ ] `nix develop -c just ci` clean",
          "is_bot": false,
          "headline": "fix: hm-host crash with standalone homes + homeManager forwarding (#559)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-20T13:48:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec25bb99ce39332f26827ec805e52d81ef3f6c40",
          "body": "## Summary\n\n- **Root cause**: `auto-allow-ci` adds the `allow-ci` label via\n`GITHUB_TOKEN`, but actions using `GITHUB_TOKEN` [do not trigger new\nworkflow\nruns](https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow).\nThe `labeled` event never f\n[…]\nrmission fails,\ndownstream blocked |\n\n## Test plan\n\n- [ ] Open a collaborator PR without manually adding label → template\nchecks should run\n- [ ] Verify `allow-ci` label still works as manual override",
          "is_bot": false,
          "headline": "fix: inline permission check in allow-ci job (#560)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-19T20:45:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "18dc079141797f6f07d7f2d4a362d2bb10f637f5",
          "body": "… of whatever node=latest means (#558)",
          "is_bot": false,
          "headline": "fix(ci): I had an amazing idea, what if we just like, use Nix instead…",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-17T18:37:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f3f05afe894946c2fa377f01df895b6c2a27b4c",
          "body": null,
          "is_bot": false,
          "headline": "fix: use node latest on docs actions (#557)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-17T18:13:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a29ac513f034ed96148e0f4e4a6095d6ac9d34fb",
          "body": null,
          "is_bot": false,
          "headline": "fix: obviously, im just a human (#556)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-17T18:06:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "550a6bd0ebeab2f9db0c9637c812bbd89ef660af",
          "body": null,
          "is_bot": false,
          "headline": "docs: dont download expired doc archives (#555)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-17T18:03:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0cc2ba15325e52db8dab1c2c42c5a1f4ff5ece2",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix expired check (#554)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-17T17:59:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b371b3f71bf438235c9cc1769980265f32f3319d",
          "body": "Fixing an error in docs as discussed in\nhttps://github.com/denful/den/discussions/549\n\nSigned-off-by: Jesperi Luoto <jesperi.luoto@iki.fi>",
          "is_bot": false,
          "headline": "docs: add missing \"provides\" to aspect (#550)",
          "author_name": "Jesperi Luoto",
          "author_login": "JeppeX",
          "committed_at": "2026-05-16T20:35:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aee486b275ec40c3fe6b65c3602947da841504a9",
          "body": "## Summary\n- `aspectContentType` now forwards `provides` children onto the content\nwrapper, matching `mergeWithAspectMeta` behavior for root aspects\n- `den.aspects.parent.child.monitoring` now resolves to\n`den.aspects.parent.child.provides.monitoring`\n- Sets `__providesForwarded` so the pipeline can\n[…]\n\n- [x] `test-nested-provides-direct-wins` — direct freeform keys override\nforwarded provides\n- [x] `test-nested-provides-multiple` — multiple provides children\nforwarded\n- [x] Full CI: 813/813 passing",
          "is_bot": false,
          "headline": "feat: forward provides children onto nested aspects (#547)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-15T22:30:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6ac11ad29e7fd4f164af8c0b4268c58a05edf8c",
          "body": "## Summary\n- Adds `._` synthesis to `aspectContentType`, matching the existing\nbehavior on root aspects via `mergeWithAspectMeta`\n- Nested aspects wrapped by `aspectContentType` now collect child keys\n(excluding class, pipe, structural, and internal keys) into a synthetic\n`._` with a zero-arg functo\n[…]\nkeys\nexcluded from nested `._`\n- [x] `test-include-children-nested-parametric` — parametric children\nresolve through nested `._`\n- [x] All 12 include-children tests pass\n- [x] Full CI: 813/813 passing",
          "is_bot": false,
          "headline": "feat: extend ._ shorthand to nested aspects (#546)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-15T22:07:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "40ed2f9f9506a9f8883fd8a9b651711e9aa00a20",
          "body": "## Summary\n\nMakes flake-parts a built-in entity kind, eliminating ~80 lines of\nboilerplate users previously had to write for flake-parts integration\n(custom policies, manual `perSystem.imports` injection, `systems`\nderivation, `isEntity` flag).\n\n- Register `flake-parts` as unconditional schema kind\n\n[…]\nges-to-flake-parts ];\n```\n\n## Test plan\n\n- [x] `nix develop -c just ci` — 808/808 tests pass\n- [x] `nix develop -c just check-all` — all templates pass\n- [x] Code review — no critical/important issues",
          "is_bot": false,
          "headline": "feat: built-in flake-parts entity kind (#543)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-15T08:18:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2c7f942907c062bbb8925cff79b72e5305e0f59a",
          "body": "## Summary\n\n- Nested keys defined without `_` prefix (e.g., `my-aspect.sub-aspect1`)\nproduce content wrappers `{ __contentValues, __provider }` with no\n`name` field\n- When passed to `excludes`, `identity.key` produced `\"<anon>\"` instead\nof the actual key name, so the constraint never matched the asp\n[…]\nuted identity on the raw wrapper before\nnormalization injected the name.\n\n## Test plan\n\n- [x] `test-nested-key-exclude` — excludes both `_`-prefixed and\nnon-prefixed sub-aspects\n- [x] Full CI: 809/809",
          "is_bot": false,
          "headline": "fix: excludes work on nested keys without _ prefix (#542)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-15T07:00:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e9e44e2867dc4b41077a7bb5761bcde2ef4e161",
          "body": "cc @theutz. Tested by doing:\n\n```nix\ncd templates/scoped-import-tree\nnix repl\n> :lf . \n> did-scoped.hasBrackets\n```",
          "is_bot": false,
          "headline": "feat: scoped-import-tree example (#544)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-15T05:44:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ab23d3d57c65c5609aec394b3fec902a871ded7",
          "body": "…(#541)\n\n## Summary\n\n- Fixes #540: `policy.when` with `hasAspect` failed when the conditional\nwas the first include and its dependency was a later sibling\n- `drain-conditionals` was firing inside every `resolve-children` call,\nincluding nested aspects — the guard re-evaluated before siblings were\nwa\n[…]\nes\n- [x] `test-conditional-same-level-schema` — same pattern via schema\nincludes\n- [x] Full CI: 805/805 passing (including all prior #525/#530 tests)\n\nCo-Authored-by: @fmway who provided amazing tests",
          "is_bot": false,
          "headline": "fix: deferred conditional guards drain at correct scope level (#540) …",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-14T17:19:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ee83546728a7164ec21703472f8df0bf11ae479",
          "body": "## Summary\n\n- `den.aspects.foo._` now acts as a synthetic aspect that auto-includes\nall immediate child aspect keys of `foo`\n- Enables `includes = [ den.aspects.foo._ ]` instead of enumerating each\nchild explicitly\n- Synthetic keys hidden behind `__functor` so existing `lib.attrValues`\npatterns on `\n[…]\nructuralKeysSet`.\n\n## Test plan\n\n- [x] 7 new tests in `include-children` suite (basic, empty, mixed,\nprovides-coexistence, parametric, attrValues compat, no-grandchildren)\n- [x] 801/801 full CI passes",
          "is_bot": false,
          "headline": "feat: ._ shorthand to include all child aspects (#536)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-14T04:01:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f575522ff8886259a10274ea8e555301e6e9c21b",
          "body": "## Summary\n\n- When a route with `adaptArgs` and `path` had no source modules (empty\nclass), the `ensureEntry` placeholder emitted `(_: { imports = []; })`\nas the value at the target path\n- This is a function, not an attrset, causing type errors like\n`perSystem.packages` receiving `<function>` instea\n[…]\n, but `_: { imports = []; }` is a lambda, not an empty\nmodule.\n\n## Test plan\n\n- [x] `test-empty-route-not-function` — route with no source modules\nproduces valid attrset\n- [x] Full CI: 787/787 passing",
          "is_bot": false,
          "headline": "fix: route ensureEntry emitted function instead of attrset (#534)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-13T23:50:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "501b2daa5b0868f231bd8965512fdcabe49f53d0",
          "body": "…effect descriptors (#530)\n\n## Summary\n\n- `policy.for` and `policy.when` now accept policy effect descriptors\n(e.g. `policy.include`) and inline aspect attrsets as arguments, not\njust raw functions or existing policies\n- Fixes crash: `policy.for entity (policy.include aspects.foo)` →\n\"attempt to cal\n[…]\nuser aspect includes\n- [x] `test-deferred-guard-fires-after-walk` — walk-order independence\nvia deferral\n- [x] `test-hasaspect-foranyclass` — `forAnyClass` variant works\n- [x] Full CI: 795/795 passing",
          "is_bot": false,
          "headline": "fix: policy.when with hasAspect no longer cycles, policy.for accepts …",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-13T22:43:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea25150f471d230b8bdaa87a229c8c45763bc4af",
          "body": "…rd (#533)\n\n## Summary\n\n- **User-scope detection for home-env batteries**: The host-scope\nbattery policy relied on `host.users` to detect class membership, which\nfails when users come from external registries resolved via policies\n(e.g. fleet-demo). Added `userDetect` — a user-scope policy on\n`den.s\n[…]\n## Test plan\n\n- [x] 786/786 CI tests pass\n- [x] `nix eval --override-input den . ./templates/fleet-demo#den`\nevaluates cleanly\n- [x] `nix flake check --override-input den . ./templates/minimal`\npasses",
          "is_bot": false,
          "headline": "fix: user-scope detection for home-env batteries and diagram null gua…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-13T21:49:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2831c649c5378ad14c68638b34a23e095a9d2033",
          "body": "## Summary\n- Adds `pull-requests: write` permission so `GITHUB_TOKEN` can add\nlabels\n- Removes `synchronize` trigger so the workflow only runs on PR\nopen/reopen, not on every push\n\nFixes the `Resource not accessible by integration` error from #531.",
          "is_bot": false,
          "headline": "fix: auto-allow-ci permissions and trigger (#532)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-13T21:13:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "367c33bf58a3328ed0b6a9e675877e65f8fe25d8",
          "body": "## Summary\n- Adds `auto-allow-ci` workflow using `pull_request_target` that checks\nif the PR author has write/admin collaborator access and automatically\nadds the `allow-ci` label\n- Adds `CODEOWNERS` to auto-request reviews from @vic and @sini for\nchanges to `nix/` and `modules/`\n\n## Test plan\n- [ ]\n[…]\nllow-ci`\nlabel is added automatically\n- [ ] Open a test PR from a non-collaborator — verify no label is added\n- [ ] Modify a file in `nix/` or `modules/` — verify review is requested\nfrom vic and sini",
          "is_bot": false,
          "headline": "feat: auto-label allow-ci for collaborators and add CODEOWNERS (#531)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-13T19:42:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df9f1c4fbbc42f2c2a7554bef9a46578b293d466",
          "body": "## Summary\n\nThree fixes for users migrating from `provides`/`_` to direct nesting:\n\n**1. Nested sub-aspects no longer auto-walk.** They must be explicitly\nincluded to emit class modules. This matches provides behavior and makes\nactivation explicit. `den.aspects.root = { includes = [\nden.aspects.root\n[…]\nlk: `deadbugs.nested-includes-scoping`\n- [x] Explicit includes: `nested-aspects`, `structural-detection`\n- [x] Formatted with `just fmt`\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "fix: nested includes scoping and content wrapper callability (#527)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-13T18:43:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31dd0ceecba03c770153364b1db5b4acdf09c567",
          "body": "…526)\n\n## Summary\n\n- **Fleet demo**: wire ssh-keys battery, user registry, composite\nmermaid galleries, deep README covering policies/pipes/entities/groups\n- **Diagram theme fix**: fleet-views.nix referenced `theme.accent0..7`\n(named attrs that don't exist) instead of indexing `theme.accentPool` —\na\n[…]\night default theme produces dark text on accent\nfills\n- [x] Verified namespace diagram: uniform color per structural role\n- [x] Verified pipe-flow: entity-kind host coloring, transparent env\nsubgraphs",
          "is_bot": false,
          "headline": "feat: fleet-demo user registry, diagram rendering, and theme fixes (#…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-13T03:47:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7cdfb07bcbf88ba8575cf191ca2b7f70a708544b",
          "body": "## Why\n\nAs den's pipeline grows in complexity, contributors (both human and\nAI-assisted) need clear orientation to work effectively. New\ncontributors face a steep ramp-up: layered abstractions like content\nwrappers, effect handlers, and key classification mean bugs often\nmanifest far from their root\n[…]\newer tokens on average\nand achieved 100% assertion pass rate vs 92% without. Note: the 92% is\nstill with my (sini) local agent memory -- a standalone claude session\nwould likely not perform that high.",
          "is_bot": false,
          "headline": "feat: CLAUDE.md project guide and den-debugging skill (#523)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-12T20:37:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82f080c9f1e8704e98d96fdbcfdb1928d954bff5",
          "body": "## Summary\n\n- **Content wrapper includes merge**: When multiple modules each add\nchildren to an aspect's `includes` list (e.g., `polybar.includes =\n[coreuse]` in one file, `polybar.includes = [wifi]` in another),\n`aspectContentType.merge` shallow-merged forwarded attrs with `foldl'\n//`, keeping only\n[…]\n [x] Existing `nested-aspect-includes` scoping tests pass (2/2)\n- [x] Existing `nested-aspect-merge` test passes (1/1)\n- [x] Existing `nested-aspects` suite passes (6/6)\n- [x] Full CI: 778/778 passing",
          "is_bot": false,
          "headline": "fix: list-merge includes/excludes in content wrapper merge (#524)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-12T20:32:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7ac993033b045dc147caccaf5b16bc65a4740b4",
          "body": "## Summary\n\n- **Multi-definition merge**: When multiple modules define the same\nnested aspect key, class sub-keys are now properly collected instead of\nlast-win overwrite. `emitNestedAspect` reconstructs per-sub-key\n`__contentValues` so all definitions contribute.\n- **Includes scoping**: Explicitly \n[…]\nested class key merge\n- [x] Added regression tests for includes scoping (auto-include\nprevented, explicit include works)\n- [x] All 6 existing `nested-aspects` tests pass\n- [x] Full CI: 776/776 passing",
          "is_bot": false,
          "headline": "fix: nested aspect key merge and includes scoping (#521)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-12T18:12:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc852dd172abdcb5ead00b95368b63b1cc799235",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix links for batteries (#518)",
          "author_name": "Michael Utz",
          "author_login": "theutz",
          "committed_at": "2026-05-12T14:56:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e563e97f4cab473a5fdcc4e29db00be23fa23be8",
          "body": "- **feat: add autologin for vms**\n- **test: add to a template for testing**\n- **docs: update documentation**\n\nFixes #519",
          "is_bot": false,
          "headline": "feat: vm-autologin battery (#520)",
          "author_name": "Michael Utz",
          "author_login": "theutz",
          "committed_at": "2026-05-12T13:52:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "802bc7f53e1250364ff1917522b93451ab1d067d",
          "body": null,
          "is_bot": false,
          "headline": "fix: move links from oeiuwq.com to denful.dev (#516)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-12T02:42:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3806624d07a8ccb85e5b8e98b6ca85b681281bd5",
          "body": null,
          "is_bot": false,
          "headline": "fix: load versions from same server (#515)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-12T02:41:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "042305cf611e98c6caf1e85ac9238ef78bc25500",
          "body": "## Summary\n\nReplaces 21 bare `if/then/else` sites across 13 files with their\nidiomatic `lib.optional`, `lib.optionals`, and `lib.optionalAttrs`\nequivalents.\n\nThis PR eliminates a persistent source of review noise — every PR\ntouching these files triggers the same nit from a certain vigilant\nreviewer.\n[…]\ns**. Zero semantic changes. 771/771 tests pass.\n\n## Test plan\n\n- [x] `just ci` — 771/771 green\n- [x] `just fmt` — no diff\n- [x] drupol mass-nit surface area reduced to zero (until we write more\n`if`s)",
          "is_bot": false,
          "headline": "fix: silence recurring 'drupol' error (#513)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-11T19:19:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01249b06b0cc1bdaff58ff9b64b106b2ab187ad4",
          "body": "## Summary\n\n- import-tree battery now scans `_<class>` directories eagerly via\n`builtins.readDir` instead of relying on the `class` scope parameter,\nwhich the fx-pipeline only provides once per scope (not once per class)\n- Batteries with `__functor` (import-tree, forward, etc.) now forward\n`provides\n[…]\ny have empty fileSystems (no `_nixos` dir)\n- [x] `import-tree.test-no-import-for-missing-dir` passes (pathExists\nguard)\n- [x] `den._.import-tree._.host` resolves correctly (no `attribute '_'\nmissing`)",
          "is_bot": false,
          "headline": "fix: import-tree class resolution and _ alias on batteries (#512)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-11T18:06:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "12a1740bffdf7c9af36efbe9e3caed37c555f615",
          "body": "## Summary\n\n- Guard `home.class` access in all battery `homeAspect` functions with\nconditional checks\n- Prevents crash when `home` entity lacks a `class` attribute (e.g. no\n`den.homes` defined)\n- Affects: unfree-predicate-builder, insecure-predicate-builder,\nflake-parts/self, flake-parts/inputs\n\n## Test plan\n\n- [x] 771/771 CI tests pass\n- [x] unfree and standalone-homes suites pass",
          "is_bot": false,
          "headline": "fix: guard home.class access in battery homeAspect functions (#510)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-11T15:06:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25e2c476b9fb5bf6b38354a2de4bd6927a11bedb",
          "body": "I did another scan against `batteries` usages, and didn't find any other\nstragglers.",
          "is_bot": false,
          "headline": "docs: fix some provides → batteries issues (#508)",
          "author_name": "Michael Utz",
          "author_login": "theutz",
          "committed_at": "2026-05-11T10:43:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "912476c34cf819e8a51d1316ed6815e6548f8881",
          "body": "## Summary\n\nBracket resolution through forwarded attrs on content wrappers (e.g.\n`<gloom/apps/polybar/razermon>`) produces bare attrsets without\n`__contentValues` or `__provider`. Without identity, these get anonymous\nnames and dedup fails when the same content is reached via multiple\nresolution pat\n[…]\nsolution with\nanonymous identity.\n\n## Test plan\n\n- [x] 771/771 CI tests pass\n- [x] den-configs polybar `modules-right` shows each module exactly once\n- [x] diagram-demo template evaluates (148 checks)",
          "is_bot": false,
          "headline": "fix: stable identity for bracket-resolved bare attrsets (#507)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-11T07:38:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00857e7c28b02e134c0a47c259ea24058fd508be",
          "body": "## Summary\n\n- Forward `provides` children onto the merged aspect root in\n`mergeWithAspectMeta`, so `aspect.docker` resolves to\n`aspect.provides.docker` without requiring the `_.docker` accessor\n- Tag forwarded keys via `__providesForwarded` so the pipeline's key\nclassification skips them — prevents \n[…]\nram-demo template evaluates (148 checks)\n- [x] den-configs helix.enable = true\n- [x] `aspect-path.test-excludeAspect-by-provider` passes (validates\nforwarded keys don't affect pipeline classification)",
          "is_bot": false,
          "headline": "fix: forward provides children onto aspect root (#506)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-11T03:19:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "852bc4106924c43088f1b58d7f01938b18cffe44",
          "body": "…oviderType.merge (#505)\n\n## Summary\n\n- Fixes parametric functions (`{ host, user }: { ... }`) placed as\ndirect freeform children of namespace aspects (e.g. `ns.apps.helix`\ninstead of `ns.apps.provides.helix`) being silently dropped during\npipeline resolution\n- The `__contentValues` wrapper from `as\n[…]\nady working, verifies no regression)\n- [x] Full CI suite: 770/770 passing\n- [x] Verified against real config:\n`nixosConfigurations.evo-x2.config.home-manager.users.loom.programs.helix.enable`\n→ `true`",
          "is_bot": false,
          "headline": "fix: parametric functions at direct freeform children leak through pr…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-10T22:53:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cda68ba48dad6ca0b887a2bee9659d00b5b30d9f",
          "body": "…nd `den._` aliases. (#504)\n\nAlso removed `._.` and `.provides.` since they are no longer needed\n(kept templates/ci as is)",
          "is_bot": false,
          "headline": "refactor: Move all batteries to `den.batteries` make `den.provides` a…",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-05-10T22:01:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "638d4f2e06c71f225545f755bb72e9cbe75ccf23",
          "body": "## Summary\n\n- Adds `pipe.as` stage that renames pipe output so data from one quirk\ncan be delivered under a different quirk name\n- Enables derived quirks — quirks with no native emitters, populated\nentirely via collect + transform + rename from other pipes\n- Composes with all existing stages (`pipe.\n[…]\n guide, and reference docs for `pipe.as`\n\n## Test plan\n\n- [x] 767/767 CI tests pass\n- [x] 6 new pipe-policy tests cover all `pipe.as` combinations\n- [x] Existing pipe tests unaffected (no regressions)",
          "is_bot": false,
          "headline": "feat: add pipe.as stage for cross-quirk adaptation (#503)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-10T21:09:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e4dd023b0bbfb216c93cec284f8b769fd815f57",
          "body": "… (#499)\n\n## Summary\n- `policy.for` now accepts a single entity or a list of entities as its\nfirst argument — matching fires if the context entity's `id_hash`\nmatches any entity in the list\n- Fixes `policy.for` never applying when users pass `policy.for [ host1\nhost2 ] (policy.include ...)` — the li\n[…]\n[x] New test: `test-for-no-id-hash` — entities without `id_hash` never\nmatch\n- [ ] Manual verification with the reported user pattern: `policy.for [\nx86_64-linux.yalova ] (policy.include aspects.tlp)`",
          "is_bot": false,
          "headline": "fix: policy.for accepts list of entities and hardens id_hash matching…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-10T14:41:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b0e24786e4bf874f191ba9de1f4109a242e6900",
          "body": "## Summary\n\nThree post-fx-pipeline regressions reported by a user after updating:\n\n- **Nested classification false positive** — freeform data keys with\nsub-keys matching registered class names (e.g. `git.user` colliding with\n`den.classes.user`) were misclassified as nested aspects, causing\ncontent t\n[…]\nsted`\n- [x] User's dotfiles: all 8 nixosConfigurations eval on both `main` and\n`new_den` (migration) branches\n- [x] `den.ctx.hm-host` deprecation warning fires and `useGlobalPkgs`\npropagates correctly",
          "is_bot": false,
          "headline": "fix: nested classification, hm-host bridge, bare aspect access (#501)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-10T13:04:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c2c23612f892f2e1c0d506c3af59f6f4d2122a9b",
          "body": null,
          "is_bot": false,
          "headline": "docs: update references to vic with denful (#494)",
          "author_name": "Michael Utz",
          "author_login": "theutz",
          "committed_at": "2026-05-09T19:24:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0539b60d2cac745d86af3af353e41b17cc3edf1e",
          "body": "…sting templates (#493)\n\nSigned-off-by: Dendronite <github.dendronite@pm.me>",
          "is_bot": false,
          "headline": "fix: updating the new templates to target the same systemstate as exi…",
          "author_name": "Dendronite",
          "author_login": "Dendronite",
          "committed_at": "2026-05-09T19:23:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c96e23066a2ee3bf861db3c4126847b5ef28ebb",
          "body": "## Summary\n- Same bug as #495 (unfree): when a user has `classes = [\"user\"]` (no\nhomeManager), `den.provides.insecure` resolved with `class = \"user\"` —\nnot in `validClasses` — silently dropping the\n`permittedInsecurePackages` emission\n- Fix: add `host` arg and emit to the host's OS class for any\nnon\n[…]\n` — none are\naffected\n\n## Test plan\n- [x] Existing `insecure` test suite passes\n- [x] Verified: user aspect with `classes = [\"user\"]` now correctly\npopulates `igloo.permittedInsecurePackages.packages`",
          "is_bot": false,
          "headline": "fix: insecure provider for non-module-system user classes (#497)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-09T17:31:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cea4092b7d4b3edcaf10f9ab75b39be5b71df75a",
          "body": "## Summary\n- When a user has `classes = [\"user\"]` (no homeManager),\n`den.provides.unfree` resolved with `class = \"user\"` — not in\n`validClasses` — silently dropping the `unfree.packages` emission\nentirely\n- Fix: extend the `hostModule` condition to emit to the host's OS class\nfor any non-module-syst\n[…]\nuced: user aspect chain (user → development → ollama →\nunfree) with `classes = [\"user\"]` now correctly populates\n`igloo.unfree.packages`\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "fix: unfree provider for non-module-system user classes (#495)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-09T14:52:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "625441475c10f3663a0ddc146a3ee512fc561e9f",
          "body": "## Summary\n\nReplace den's legacy recursive resolver with an algebraic effects\npipeline (via nix-effects). The entire resolution lifecycle — from\npolicy routing to aspect compilation to module collection — is now\ndriven by composable effect handlers.\n\n- **Remove legacy resolver** — delete adapters.ni\n[…]\ntation can be previewed at: https://den.json64.dev/\n\n🤖 Generated with the aid of [Claude\nCode](https://claude.com/claude-code)\n\n---------\n\nCo-authored-by: Michael Utz <theutz@users.noreply.github.com>",
          "is_bot": false,
          "headline": "feat: fx effects pipeline — replace legacy resolver (#475)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-05-09T13:46:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0af82e24be89b9fd400bd0b58b0fed5ea0f269ad",
          "body": null,
          "is_bot": false,
          "headline": "Add @sini to FUNDING. We need you help us support @sini",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-20T18:36:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0696fb8b155f1829f8bfe37013c54ab6ee80abbe",
          "body": null,
          "is_bot": false,
          "headline": "chore: update nix-effects",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-19T19:49:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5a49c0cb346ae3c4a1e70d8a303a3bd0d9ff43c",
          "body": null,
          "is_bot": false,
          "headline": "fix(ci): Fix fail count and hint on ci-deep",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-19T09:40:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc422d0a79397be8b6f5a6bfb48a2f5ada44b251",
          "body": null,
          "is_bot": false,
          "headline": "fix: ci.bash only show success if pass == total (#471)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-19T04:59:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "483f5ec6cc43766753fd6f20b3b3942a798d80de",
          "body": "Iterates over `user.classes` instead of just being fixed to\n`homeManager` only. Add tests for hjem class.",
          "is_bot": false,
          "headline": "feat: allow host-aspects to work with other user classes (#470)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-19T04:58:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6efae0bf7ad08fc4d1adc58f802f27505b9de8e4",
          "body": "Signed-off-by: Victor Borja <vborja@apache.org>",
          "is_bot": false,
          "headline": "Update maintainers.mdx",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-19T04:17:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9230ab3e6d9365f0c351548a2bb29f66541e945d",
          "body": null,
          "is_bot": false,
          "headline": "fmt",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-19T04:05:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8603eb10d157c6558322ae0543f703e354cc395a",
          "body": null,
          "is_bot": false,
          "headline": "improve(ci): Run ci fast as first check on PRs (#472)",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-19T04:03:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "815076eca86c48349912574d5f372efb93c31140",
          "body": "Named aspects now get a key attribute (class@identity) on their\ncollected modules. The NixOS module system deduplicates by key across\nindependent resolve calls, so a user can include an aspect directly AND\nreceive it via host-aspects without duplicate option declarations.\n\nAnonymous/synthetic aspect\n[…]\nultiple\nanonymous includes coexist correctly.\n\nAlso fixes the pre-existing duplication where aspects included by both\nhost and user produced duplicate nixos modules via the default context\ntransition.",
          "is_bot": false,
          "headline": "fix: module-level dedup for host-aspects overlap support (#468)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-04-18T21:02:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df2f95ce7a40308613c41f0d13538a3032fdf7de",
          "body": null,
          "is_bot": false,
          "headline": "remove agents file it was outdated",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-17T21:54:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6bf282ac4a97a0f5160ce1e341b30362a1ac9ef4",
          "body": null,
          "is_bot": false,
          "headline": "fix: add fsType on noflake",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-17T21:45:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f002e70b8b1484ae1227a6d302a8ee114366b2a1",
          "body": "## Summary\n- `host-aspects` battery was including the raw `host.aspect` tree via\n`fixedTo`, which caused host nixos modules to be collected again when\nthe user context contributed to the host's resolution\n- Now resolves `host.aspect` specifically for class `\"homeManager\"` and\nemits only a homeManage\n[…]\ncation\n\n## Test plan\n- [x] All existing host-aspects tests pass (6/6)\n- [x] New `test-no-nixos-duplication`: verifies host nixos tags appear\nexactly once, not duplicated\n- [x] Full CI passes (499/499)",
          "is_bot": false,
          "headline": "fix: resolve host-aspects for homeManager class only (#467)",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-04-17T21:39:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b28ae0866ae85ede6a72eff786bd48627c19bf48",
          "body": null,
          "is_bot": false,
          "headline": "fix default fsTypes on templates",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-17T21:36:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73bfd65b5f35e2a6f6a7534c69db16481a6b35d5",
          "body": null,
          "is_bot": false,
          "headline": "use nixos-unstable channel to have hydra cached pkgs",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-17T21:11:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fed2e347cdc1e6d530dd6945b38602b3671abb46",
          "body": "…#466)\n\n## Summary\n- New battery `den._.host-aspects` that projects all homeManager-class\nconfigs from the host's aspect tree onto users who opt in\n- Wraps `host.aspect` with `fixedTo { host, user }` so the pipeline\nresolves it with `class = \"homeManager\"`, collecting only homeManager\nkeys\n- Other c\n[…]\n does not receive host\nhomeManager configs\n- [x] No circular evaluation when accessing both host and user configs\n- [x] Full CI suite passes (498/498)\n\nCo-authored-by: Victor Borja <vborja@apache.org>",
          "is_bot": false,
          "headline": "feat: host-aspects battery for projecting host homeManager to users (…",
          "author_name": "Jason Bowman",
          "author_login": "sini",
          "committed_at": "2026-04-17T20:56:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ad6f25d08b0f236e6488b27eec92b59336c4ff3",
          "body": null,
          "is_bot": false,
          "headline": "docs: maintainers guide. update astrojs",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-17T20:20:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b299e5273f0aefcef6e2ce8c0a48d4b34fb46b9",
          "body": null,
          "is_bot": false,
          "headline": "docs: effect guide, repl using fx from main",
          "author_name": "Victor Borja",
          "author_login": "vic",
          "committed_at": "2026-04-17T18:48:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 18,
      "commits_last_year": 651,
      "latest_release_at": "2026-06-23T22:07:30Z",
      "latest_release_tag": "v0.18.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 33,
      "days_since_latest_release": 38,
      "mean_days_between_releases": 13.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 49,
      "stars": 530,
      "watchers": 11,
      "fork_history": {
        "days": [
          {
            "date": "2025-11-05",
            "count": 1
          },
          {
            "date": "2025-11-06",
            "count": 1
          },
          {
            "date": "2025-11-26",
            "count": 1
          },
          {
            "date": "2026-01-13",
            "count": 1
          },
          {
            "date": "2026-01-28",
            "count": 1
          },
          {
            "date": "2026-01-31",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 1
          },
          {
            "date": "2026-02-20",
            "count": 1
          },
          {
            "date": "2026-02-21",
            "count": 2
          },
          {
            "date": "2026-03-01",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 2
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-03-25",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 1
          },
          {
            "date": "2026-03-28",
            "count": 1
          },
          {
            "date": "2026-03-30",
            "count": 2
          },
          {
            "date": "2026-04-03",
            "count": 1
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-06",
            "count": 1
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-09",
            "count": 1
          },
          {
            "date": "2026-04-12",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-17",
            "count": 1
          },
          {
            "date": "2026-04-23",
            "count": 1
          },
          {
            "date": "2026-05-09",
            "count": 1
          },
          {
            "date": "2026-05-10",
            "count": 1
          },
          {
            "date": "2026-05-16",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 1
          },
          {
            "date": "2026-05-28",
            "count": 1
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-09",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-16",
            "count": 1
          },
          {
            "date": "2026-06-23",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 1
          },
          {
            "date": "2026-07-26",
            "count": 1
          },
          {
            "date": "2026-07-29",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 49,
        "total_forks": 49
      },
      "star_history": null,
      "open_issues_and_prs": 17
    },
    "ai_readiness": {
      "has_nix": true,
      "example_dirs": [
        "example"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Justfile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "docs/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 8544,
      "source_files_sampled": 3,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 9327
    },
    "dependencies": {
      "manifests": [
        "docs/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 332,
        "open_issues": 14,
        "closed_ratio": 0.902,
        "closed_issues": 129,
        "closed_unmerged_prs": 28
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "vic",
          "commits": 507,
          "avatar_url": "https://avatars.githubusercontent.com/u/331?v=4"
        },
        {
          "type": "User",
          "login": "sini",
          "commits": 78,
          "avatar_url": "https://avatars.githubusercontent.com/u/130664?v=4"
        },
        {
          "type": "User",
          "login": "theutz",
          "commits": 14,
          "avatar_url": "https://avatars.githubusercontent.com/u/756348?v=4"
        },
        {
          "type": "User",
          "login": "HeitorAugustoLN",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/44377258?v=4"
        },
        {
          "type": "User",
          "login": "drupol",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/252042?v=4"
        },
        {
          "type": "User",
          "login": "crasm",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/16730716?v=4"
        },
        {
          "type": "User",
          "login": "DylanRJohnston",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/5708800?v=4"
        },
        {
          "type": "User",
          "login": "musjj",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/72612857?v=4"
        },
        {
          "type": "User",
          "login": "Adda0",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/52529234?v=4"
        },
        {
          "type": "User",
          "login": "OscarMarshall",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/3111765?v=4"
        }
      ],
      "contributors_sampled": 29,
      "top_contributor_share": 0.779
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": false,
      "ci_workflows": [
        "auto-allow-ci.yml",
        "benchmark.yml",
        "bogus.yml",
        "docs.yml",
        "gh-pages.yml",
        "latest-tag.yml",
        "semantic-pr.yml",
        "test.yml",
        "versioned-docs.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "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": 5,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 7,
            "reason": "Found 21/30 approved changesets -- score normalized to 7",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 30 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 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": "30 commit(s) and 27 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": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "32 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "2040b61346a7215fd7b7f51d4a457544b6e597d0",
        "ran_at": "2026-08-01T04:05:43Z",
        "aggregate_score": 4.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-31T21:09:03Z",
      "oldest_open_prs": [
        {
          "number": 447,
          "created_at": "2026-04-13T04:54:21Z",
          "last_comment_at": "2026-05-18T05:50:31Z",
          "last_comment_author": "charlesfire"
        },
        {
          "number": 573,
          "created_at": "2026-05-29T04:33:57Z",
          "last_comment_at": "2026-05-30T02:38:14Z",
          "last_comment_author": "Scott-Guest"
        },
        {
          "number": 601,
          "created_at": "2026-06-09T08:02:07Z",
          "last_comment_at": "2026-06-25T03:12:51Z",
          "last_comment_author": "theutz"
        }
      ],
      "last_merged_pr_at": "2026-07-31T20:59:56Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 158,
          "created_at": "2026-02-14T04:33:01Z",
          "last_comment_at": "2026-04-13T18:43:25Z",
          "last_comment_author": "theutz"
        },
        {
          "number": 159,
          "created_at": "2026-02-14T04:36:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 348,
          "created_at": "2026-03-30T16:56:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 443,
          "created_at": "2026-04-12T19:46:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 457,
          "created_at": "2026-04-15T06:38:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 476,
          "created_at": "2026-04-24T05:10:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 483,
          "created_at": "2026-05-05T19:15:16Z",
          "last_comment_at": "2026-05-29T06:55:44Z",
          "last_comment_author": "drupol"
        },
        {
          "number": 528,
          "created_at": "2026-05-13T09:15:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 535,
          "created_at": "2026-05-13T23:21:46Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 537,
          "created_at": "2026-05-14T04:25:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 596,
          "created_at": "2026-06-05T08:29:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 608,
          "created_at": "2026-06-11T16:21:33Z",
          "last_comment_at": "2026-06-11T20:37:33Z",
          "last_comment_author": "sini"
        },
        {
          "number": 619,
          "created_at": "2026-06-22T14:58:08Z",
          "last_comment_at": "2026-06-22T17:00:38Z",
          "last_comment_author": "vic"
        },
        {
          "number": 632,
          "created_at": "2026-07-15T06:30:36Z",
          "last_comment_at": "2026-07-16T16:11:49Z",
          "last_comment_author": "rhedgeco"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/denful/den",
    "host": "github.com",
    "name": "den",
    "owner": "denful"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 64,
      "inputs": {
        "security": 45,
        "vitality": 92,
        "community": 57,
        "governance": 58,
        "engineering": 62
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 87,
            "inputs": {
              "commits_last_year": 651,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 33
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "33/52 weeks with commits",
                "points": 22.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 33
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "651 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 651
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 27 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": 18,
              "latest_release_tag": "v0.18.0",
              "releases_from_tags": false,
              "days_since_latest_release": 38,
              "mean_days_between_releases": 13.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 38 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 38
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~13.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 13.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": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 57,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "forks": 49,
              "stars": 530,
              "watchers": 11,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "530 stars",
                "points": 44.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 530
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "49 forks",
                "points": 14,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 49
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "11 watchers",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 58,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 29,
              "top_contributor_share": 0.779
            },
            "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 78% of commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 78
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "29 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 30 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 88,
            "inputs": {
              "merged_prs": 332,
              "open_issues": 14,
              "closed_issues": 129,
              "issue_closed_ratio": 0.902,
              "closed_unmerged_prs": 28
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "90% of issues closed",
                "points": 42.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 90
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "332/360 decided PRs merged",
                "points": 35.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 332,
                      "decided": 360
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 21/30 approved changesets -- score normalized to 7",
                "points": 10.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "followers": 36,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "denful",
              "public_repos": 32,
              "account_age_days": 102
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "36 followers of denful",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 36,
                      "login": "denful"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "32 public repos, account ~0 yr old",
                "points": 11.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 32
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 62,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "has_ci": true,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "9 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "dendritic",
                "nix",
                "os-configuration",
                "aspect-oriented",
                "home-manager",
                "nix-darwin",
                "nixos",
                "den",
                "nix-build",
                "unflake",
                "flake",
                "context-driven"
              ],
              "has_wiki": false,
              "homepage": "http://den.denful.dev/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "http://den.denful.dev/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "12 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 45,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 21/30 approved changesets -- score normalized to 7",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 30 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is 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": "30 commit(s) and 27 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 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "32 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 26
            },
            "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": 61,
        "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.94,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 9327
            },
            "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": "94 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 94,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "has_nix": true,
              "has_tests": false,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Justfile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "docs/tsconfig.json"
              ],
              "agent_commit_share": 0.02,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Justfile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Justfile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "docs/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "docs/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Nix, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Nix, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "Nix",
              "largest_source_bytes": 8544,
              "source_files_sampled": 3,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Nix with type-check config (docs/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "docs/tsconfig.json",
                      "language": "Nix"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/3 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 3,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "example"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "example",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-01T04:06:10.313988Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/denful/den.svg",
  "full_name": "denful/den",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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