Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-08-01 04:06 UTC

denful / den

Aspect-oriented, context-driven Nix configurations.

NixApache-2.0★ 530 Sterne⑂ 49 Forksseit Okt. 2025Auf GitHub ansehen ↗

denful/den erreicht einen Gesundheitsindex von 64 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (92/100) ab, am schwächsten bei Security (45/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

64
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

64
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

denfulOrganisation
36 Follower32 öffentliche Reposseit Apr. 2026

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

92Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
22.8/36Commit-Rhythmus — 33/52 Wochen mit Commits
18/18Commit-Volumen — 651 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 27 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year651
human_commit_share1
days_since_last_push0
active_weeks_last_year33

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 18 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 38 Tagen
27/27Release-Rhythmus — ein Release etwa alle 13,7 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count18
latest_release_tagv0.18.0
releases_from_tagsnein
days_since_latest_release38
mean_days_between_releases13,7
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

57Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
44.2/60Stars — 530 Stars
14/25Forks — 49 Forks
5.6/15Watcher — 11 Watcher
Verwendete Eingangsdaten
forks49
stars530
watchers11
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

58Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
5/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 78 % der Commits
13.5/13.5Breite der Beitragenden — 29 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 30 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled29
top_contributor_share0,779
Wie die Bewertung erfolgt
42.2/46.8Issue-Lösungsquote — 90 % der Issues geschlossen
35.3/38.3PR-Annahme — 332/360 entschiedene PRs gemergt
10.5/15OpenSSF Scorecard: Code-Review — Found 21/30 approved changesets -- score normalized to 7
Verwendete Eingangsdaten
merged_prs332
open_issues14
closed_issues129
issue_closed_ratio0,902
closed_unmerged_prs28
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
11.3/25Reichweite des Inhabers — 36 Follower von denful
11.6/25Kontohistorie — 32 öffentliche Repos, Kontoalter ca. 0 Jahre
Verwendete Eingangsdaten
followers36
owner_typeOrganization
is_verified
owner_logindenful
public_repos32
account_age_days102

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

62Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 9 Workflow(s)
0/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsnein
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — http://den.denful.dev/
10/10Repository-Beschreibung
10/10Topics — 12 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsdendritic, nix, os-configuration, aspect-oriented, home-manager, nix-darwin, nixos, den, nix-build, unflake, flake, context-driven
has_wikinein
homepagehttp://den.denful.dev/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

45Gefährdet · 16 % des Gesamtindex

Sicherheitslage

45Gefährdet
Wie die Bewertung erfolgt
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.5Lizenz — 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 — keine Daten
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 — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 32 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

61Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 94 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,94
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes9.327
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Justfile
0/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — docs/tsconfig.json
10/10Reproduzierbare Umgebung — Nix, lockfile
4/10Belegte Agentenpraxis — 2 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixja
has_testsnein
lockfilespnpm-lock.yaml
has_dockerfilenein
typed_languagenein
bootstrap_filesJustfile
has_devcontainernein
has_linter_confignein
typecheck_configsdocs/tsconfig.json
agent_commit_share0,02
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
27/45Typprüfbarer Code — Nix mit Typprüfungs-Konfiguration (docs/tsconfig.json)
55/55Handhabbare Dateigrößen — 0/3 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageNix
largest_source_bytes8.544
source_files_sampled3
oversized_source_files0
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — example
Verwendete Eingangsdaten
example_dirsexample
has_mcp_signalnein
api_schema_files

Eckdaten

530GitHub-Sterne
29Mitwirkende
651Commits, letzte 12 Monate
0Tage seit letztem Push
18Releases
1Bus-Faktor
14offene Issues
npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 49 ⇿
0Sterne
49Forks
16Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

010203040504922025-112026-032026-07
Major 0Minor 16Patch 0
OpenSSF Scorecard 4.5 / 10
4.5Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
k. A.Packagingpackaging 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
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities32 existing vulnerabilities detected
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistiken.