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

ahmedtawfeeq1 / loredex

Universal control system for coding agents: shared memory, cross-project handoffs, research management, & MCP + Obsidian dashboards across products/repos.

TypeScriptMIT★ 2 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

ahmedtawfeeq1/loredex tiene un índice de salud de 60 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (77/100) y la más baja, Security (47/100). Se actualizó por última vez hace 3 días. Una sola persona concentra la mayor parte del trabajo reciente.

60
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

60
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Ahmed TawfeeqCuenta personal
0 seguidores7 repositorios públicosdesde abr 2020GenuDo

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npmloredex2.9.0382924hace 5 díasobsidianmarkdownaiclaude-codecodexcursorknowledge-basevaultsecond-brainagents

Métricas por categoría

Vitalidad

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

74Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 3 días
2.8/36Cadencia de commits — 4/52 semanas con commits
18/18Volumen de commits — 150 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year150
human_commit_share0,87
days_since_last_push3
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 22 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count22
latest_release_tagloredex-v2.9.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases1
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

48En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template
Cómo se puntúa
47.8/80Descargas mensuales — 3829 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesloredex
dependents
ecosystemsnpm
total_downloads
monthly_downloads3829
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

51Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 28/28 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/10 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs28
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
0/25Alcance del propietario — 0 seguidores de ahmedtawfeeq1
18.6/25Trayectoria — 7 repos públicos, cuenta de ~6 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_loginahmedtawfeeq1
public_repos7
account_age_days2297
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 24 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesloredex
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

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

Documentación

85Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 15 topics
10/10Wiki
Datos de entrada utilizados
topicsai-agents, claude-code, cli, codex, cursor, knowledge-base, markdown, obsidian, second-brain, agent-memory, developer-tools, knowledge-management, mcp, mcp-server, obsidian-vault
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

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

47En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
1/2.5CI-Tests — 4 out of 10 merged PRs checked by a CI test -- score normalized to 4
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/10 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
2/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,7
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
13.2/25Dependencias indirectas libres de avisos conocidos — 1 afectados: @hono/node-server 1.19.14 (moderate 5.9)
40/40Sin avisos pendientes — ningún aviso lleva público más de 90 días
Datos de entrada utilizados
sourceosv
advisories1
affected_packages1
assessed_packages109
unassessed_packages0
affected_by_severitymoderate 1
direct_affected_packages0
Se cotejó el cierre de dependencias en tiempo de ejecución de npm:loredex@2.9.0 —lo que arrastra la instalación del paquete publicado—: 109 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

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

57Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 86 de 87 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,989
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — biome.json
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 64 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
4/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0,64
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/103 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes23.234
source_files_sampled103
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
0/40Ejemplos ejecutables
Datos de entrada utilizados
example_dirs
has_mcp_signal
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.7 / 10
3.7agregado

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

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
4CI-Tests4 out of 10 merged PRs checked by a CI test -- score normalized to 4
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/10 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
4Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 4
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
Dependencias directas 6
RegistroPaqueteRestricción de versiónManifiesto
npm@modelcontextprotocol/sdk^1.29.0package.json
npmcommander^14.0.3package.json
npmgray-matter^4.0.3package.json
npmjs-yaml^4.3.0package.json
npmpicocolors^1.1.1package.json
npmzod^4.4.3package.json
Todas las dependencias no recopilado

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

Avisos de dependencias 1

Instalar npm:loredex@2.9.0 arrastra 109 paquetes, directos y transitivos: 1 tienen avisos conocidos, de los cuales 0 son dependencias directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
@hono/node-server1.19.14indirectamoderada12.0.5

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "ai-agents",
        "claude-code",
        "cli",
        "codex",
        "cursor",
        "knowledge-base",
        "markdown",
        "obsidian",
        "second-brain",
        "agent-memory",
        "developer-tools",
        "knowledge-management",
        "mcp",
        "mcp-server",
        "obsidian-vault"
      ],
      "is_fork": false,
      "size_kb": 34942,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Shell": 1537,
        "JavaScript": 10368,
        "TypeScript": 477150
      },
      "pushed_at": "2026-07-21T09:20:00Z",
      "created_at": "2026-07-02T22:42:39Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T03:15:15Z",
      "description": "Universal control system for coding agents: shared memory, cross-project handoffs, research management, & MCP + Obsidian dashboards across products/repos.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://genudo.ai",
      "name": "Ahmed Tawfeeq",
      "type": "User",
      "login": "ahmedtawfeeq1",
      "company": "GenuDo",
      "location": "Cairo, Egypt",
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/63398623?v=4",
      "created_at": "2020-04-09T09:49:38Z",
      "is_verified": null,
      "public_repos": 7,
      "account_age_days": 2297
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "loredex-v2.9.0",
          "kind": "other",
          "published_at": "2026-07-18T22:53:39Z"
        },
        {
          "tag": "loredex-v2.8.0",
          "kind": "other",
          "published_at": "2026-07-16T22:18:59Z"
        },
        {
          "tag": "loredex-v2.7.0",
          "kind": "other",
          "published_at": "2026-07-14T23:11:57Z"
        },
        {
          "tag": "loredex-v2.6.0",
          "kind": "other",
          "published_at": "2026-07-14T08:55:54Z"
        },
        {
          "tag": "loredex-v2.5.0",
          "kind": "other",
          "published_at": "2026-07-14T08:02:54Z"
        },
        {
          "tag": "loredex-v2.4.1",
          "kind": "other",
          "published_at": "2026-07-13T03:27:48Z"
        },
        {
          "tag": "loredex-v2.3.2",
          "kind": "other",
          "published_at": "2026-07-12T16:45:36Z"
        },
        {
          "tag": "loredex-v2.3.1",
          "kind": "other",
          "published_at": "2026-07-12T16:13:24Z"
        },
        {
          "tag": "loredex-v2.2.0",
          "kind": "other",
          "published_at": "2026-07-10T09:32:44Z"
        },
        {
          "tag": "loredex-v2.1.0",
          "kind": "other",
          "published_at": "2026-07-10T00:10:39Z"
        },
        {
          "tag": "loredex-v2.0.0",
          "kind": "other",
          "published_at": "2026-07-09T06:21:42Z"
        },
        {
          "tag": "loredex-v1.1.0",
          "kind": "other",
          "published_at": "2026-07-07T07:10:35Z"
        },
        {
          "tag": "loredex-v1.0.0",
          "kind": "other",
          "published_at": "2026-07-05T03:59:32Z"
        },
        {
          "tag": "loredex-v0.8.0",
          "kind": "other",
          "published_at": "2026-07-04T15:16:44Z"
        },
        {
          "tag": "loredex-v0.7.0",
          "kind": "other",
          "published_at": "2026-07-04T12:44:01Z"
        },
        {
          "tag": "loredex-v0.6.0",
          "kind": "other",
          "published_at": "2026-07-04T08:57:54Z"
        },
        {
          "tag": "loredex-v0.5.0",
          "kind": "other",
          "published_at": "2026-07-04T08:13:46Z"
        },
        {
          "tag": "loredex-v0.4.0",
          "kind": "other",
          "published_at": "2026-07-03T08:52:21Z"
        },
        {
          "tag": "loredex-v0.3.2",
          "kind": "other",
          "published_at": "2026-07-03T01:00:00Z"
        },
        {
          "tag": "loredex-v0.3.1",
          "kind": "other",
          "published_at": "2026-07-03T00:47:03Z"
        },
        {
          "tag": "loredex-v0.3.0",
          "kind": "other",
          "published_at": "2026-07-03T00:33:16Z"
        },
        {
          "tag": "loredex-v0.2.0",
          "kind": "other",
          "published_at": "2026-07-02T23:33:28Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "5925a0fd48cbb490ffded31c554938d6916cfa6c",
          "body": "…e + fleet flow\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DbbbbzogUYW3X3mLif88m5",
          "is_bot": false,
          "headline": "docs(user-guide): agent-ops dexes section — init/new/clients/workspac…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-20T03:15:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e7ceae0c49f83238bb14a0369e6fc85d6113fdfd",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DbbbbzogUYW3X3mLif88m5",
          "is_bot": false,
          "headline": "docs(desktop): agent-ops fleet control-room note + fresh version example",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-20T03:13:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a71d5ee289331ca58db6fe157709c18a6e7dfea",
          "body": "…tale desktop version refs\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DbbbbzogUYW3X3mLif88m5",
          "is_bot": false,
          "headline": "docs(readme): surface agent-ops dexes (new/clients/workspace) + fix s…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-20T03:13:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8c739ee2111d66e511271912ec01f0edf6d8cce2",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.9.0",
          "is_bot": false,
          "headline": "Merge pull request #28 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-18T22:53:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62464646048eed8c4481b921788a4a135c81a8d1",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.9.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-18T22:52:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b36606630b71b82c89265ed6d5d6f438353d52e5",
          "body": "feat(lib): desktop agent-ops verbs — copy exports, servers subset, env refs, inbox list",
          "is_bot": false,
          "headline": "Merge pull request #27 from ahmedtawfeeq1/feat/desktop-agent-ops-verbs",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-18T22:51:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5df5e759c83f09dd14c99be41deb05f968713658",
          "body": "…v refs, inbox list\n\nThe desktop Add-Client flow (docs/plan in loredex-desktop:\nagent-ops-desktop-flow.md) needs four seams the lib had but didn't expose or\nlacked entirely:\n\n- lib-export copyWorkspaceSpec/envSuffix/CopyWorkspaceResult (built in PR #24,\n  CLI-only until now)\n- copyWorkspaceSpec {ser\n[…]\nagged as a dead-end\n- CLI parity: workspace --from grows --servers <a,b>\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017VFegLJ1G6YnD7V7wPj2be",
          "is_bot": false,
          "headline": "feat(lib): desktop agent-ops verbs — copy exports, servers subset, en…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-18T05:58:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f57f05a107664af69b2f6960810d2be1c4428d51",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.8.0",
          "is_bot": false,
          "headline": "Merge pull request #26 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-16T22:18:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56fc7f55f8702d85cd0b2a5127e9fd3dc9ff797c",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013xdJCNwvuSYvt2wyg7G8La",
          "is_bot": false,
          "headline": "style: biome fixes for the v3 lib batch (import order, formatting)",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-16T22:16:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d9567d4704e4b87b7f7b84cf8a8bf97ad05d3051",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.8.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T22:14:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "902e7b9307647c05a95e4f6c5d31e99b0df4df6e",
          "body": "Desktop v3 deferred lib work: work-item schema, auth/dex CLI, init --demo",
          "is_bot": false,
          "headline": "Merge pull request #25 from ahmedtawfeeq1/feat/v3-lib-deferred",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-16T22:14:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01415d99f36fded8872508e8caff60d6aa9ace14",
          "body": "…/dex CLI, --demo\n\nDesktop DESIGN v3 §8/§9 companions (loredex-desktop epic26 deferred list):\n\n- work items: core/work-items.ts — ONE board plane over tasks (kind: task\n  notes w/ status backlog|todo|doing|review|done + priority/sprint/owner/\n  delegate) ∪ handoffs/requests (8.1 machine mapped read-\n[…]\nures\n(agent-ops-scaffold git-mv, receipts) unchanged on the base branch.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013xdJCNwvuSYvt2wyg7G8La",
          "is_bot": false,
          "headline": "feat(work,auth,init): desktop v3 deferred lib work — work items, auth…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-16T21:56:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5602ce0c5dfcf0e1c613cbf9fd382d80872ca187",
          "body": "…ommand\n\nRoute renames every note to YYYY-MM-DD-slug.md, but rewriteLinks only knew\nthe current batch's mapping — a wikilink to a sibling routed in an earlier\nsession kept its bare slug and rendered broken in the app and Obsidian.\n\n- rewriteLinks: fall back to a vault-wide index (date-stripped slug \n[…]\ne spans, frontmatter, and _inbox; idempotent;\n  auto-commits like route.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01H6k7GghCd3C1Why82mayES",
          "is_bot": false,
          "headline": "feat(relink): resolve cross-batch wikilinks + loredex relink repair c…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-16T07:38:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93e1b5bdbb5eb088739b26f9b0fc13d63fab29a2",
          "body": "…ent env rewrite\n\nFilling workspace.yml by hand for every client doesn't scale an agency fleet.\n`loredex workspace <client> --from <golden>` copies the golden client's\nworkspace.yml raw (comments survive) and rewrites per-client env refs by slug\nsuffix (${CRM_TOKEN_BRIGHTSMILE_DENTAL} → ${CRM_TOKEN_\n[…]\nalready declares tooling unless\n--force; refuses a template-only source.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017VFegLJ1G6YnD7V7wPj2be",
          "is_bot": false,
          "headline": "feat(workspace): --from copies a golden client's tooling with per-cli…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-15T08:30:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "93b7bb4e4e7af4ce1529095c1a5ecfee4af05417",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.7.0",
          "is_bot": false,
          "headline": "Merge pull request #23 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T23:11:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e89a58fcf2309b09ec37173c2a1cb0dbb08c9535",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.7.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-14T23:09:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77eef12d69db7c72e0e4140b002833a5796dc251",
          "body": "feat: resolve the dex per invocation — two dexes on one machine",
          "is_bot": false,
          "headline": "Merge pull request #22 from ahmedtawfeeq1/feat/multi-dex-resolution",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T23:09:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b74a5a4fd132ee76468d4b9326a13f2b66cc1a3",
          "body": "…nv hacks\n\nOne machine-global vaultPath meant a second dex (research + agent-ops fleet)\nrequired a parallel LOREDEX_CONFIG_DIR and an env prefix on every command,\nand a bare loredex silently hit the wrong dex.\n\nCommands now resolve their dex per invocation: --vault flag → nearest\n_index/dex.json anc\n[…]\no a live research vault.\nstatus/doctor print which dex resolved and why.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017VFegLJ1G6YnD7V7wPj2be",
          "is_bot": false,
          "headline": "feat: resolve the dex per invocation — two dexes on one machine, no e…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T12:18:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d629bc233d3b5ed55c3a8cc0809601a825c736f",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.6.0",
          "is_bot": false,
          "headline": "Merge pull request #21 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T08:55:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b40df2dca45341262a55c6ba5c9b8d54cd59f994",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.6.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-14T08:55:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a6637a1420b3351d17e79d80fd894b0f52f9e4b",
          "body": "feat: agent-ops plugin skill + dex wording; route safety on agent-ops dexes",
          "is_bot": false,
          "headline": "Merge pull request #20 from ahmedtawfeeq1/feat/agent-ops-plugin-skills",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T08:55:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad1acc50724df25f7a72a25e8eecf5739674c8aa",
          "body": "- new /loredex-agent-ops skill: client/pipeline/agent/stage scaffolds, tags,\n  workspace tooling, fleet doctor, schema rules (never hand-create client\n  folders; ${ENV_VAR} secrets; _inbox consumption)\n- /loredex-init documents --type research|agent-ops\n- base /loredex skill: dex explainer, agent-op\n[…]\nlace\n  descriptions + hook comments (flags and MCP tool names untouched)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018n8UCdGkxnsxice2FgZGi9",
          "is_bot": false,
          "headline": "feat(plugin): agent-ops skill + dex wording across skills",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T08:46:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8bd9da55f0cd397c1ee0dc6aa589ddb23703682f",
          "body": "targetDir on an agent-ops dex never builds a topic tree inside a client:\nknown client → projects/<client>/_randoms (searchable, lint-exempt);\nunknown project → research/. Closes the gap where route/adopt/Stop-hook\nmarkdown could break the client schema.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018n8UCdGkxnsxice2FgZGi9",
          "is_bot": false,
          "headline": "fix(route): agent-ops dexes route markdown into the client's _randoms",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T08:46:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "44db0b2d7e8e95e4e58bc6d6196aa7aaa076ca96",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.5.0",
          "is_bot": false,
          "headline": "Merge pull request #19 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T08:02:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19e3ebb9a74fdabbba3c52e647755f272e629b94",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.5.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-14T08:02:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23d3a18f052025ccea1007a5583f7e894490102f",
          "body": "feat: dex types + agent-ops (manifests, scaffolds, doctor, workspace materializer, data indexing)",
          "is_bot": false,
          "headline": "Merge pull request #18 from ahmedtawfeeq1/feat/agent-ops-dex-type",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T08:02:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "989821904f8ef20c280c9aa81889f37d1f3d4859",
          "body": "- scan.ts: single prune implementation (walkFiles) + walkData(DATA_EXTS);\n  walkMarkdown behavior byte-identical\n- tables.ts: csvHead (quote/BOM aware) + yaml/json top-level keys +\n  dataFileSummary — contents never rewritten\n- search: agent-ops data pass (filename +3, keys/headers +2, kind 'data'\n \n[…]\nt-ops dexes\n- doctor: empty scaffold workspace.yml no longer flags drift\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018n8UCdGkxnsxice2FgZGi9",
          "is_bot": false,
          "headline": "feat(scan): structural indexing of yaml/json/csv for agent-ops dexes",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T05:05:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c62e6824d284d696cad8011aed036fea85524b19",
          "body": "….claude settings, AGENTS.md)\n\n- committed, secret-free workspace.yml per client; ${VAR} env expansion at\n  generate time only (never partial; missing vars reported)\n- merge-preserving generation: foreign .mcp.json servers / .claude settings\n  keys survive; AGENTS.md block marker-guarded; byte-stabl\n[…]\nlient\n- js-yaml@^4 declared direct dep (not gray-matter's transitive v3)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018n8UCdGkxnsxice2FgZGi9",
          "is_bot": false,
          "headline": "feat(workspace): workspace.yml → generated agent tooling (.mcp.json, …",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T04:55:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4cf171996699ec62d97dcf1e7826f6eaa2dadb42",
          "body": "…s, doctor, indexer)\n\n- _index/dex.json type manifest (absent → research, unchanged behavior)\n- _index/clients.json client tags manifest + `loredex clients` CRUD\n- fleet scanner (scanClient/scanFleet: pipelines, agents, stages, inbox)\n- `loredex new client|pipeline|agent|stage` scaffolds; strict 01.\n[…]\n + fictional-names guard\n  (existing fixtures renamed to fictional acme)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018n8UCdGkxnsxice2FgZGi9",
          "is_bot": false,
          "headline": "feat(agent-ops): dex types + agent-ops structure (manifests, scaffold…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-14T04:51:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9fdfd4ade0aa59a0849c351f307786c80a8b0813",
          "body": "Each repo's hero now links the other two (CLI · Desktop · Obsidian), so\nlanding on any one surfaces the whole ecosystem.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015F6mqmauagcw1pzHPhu3St",
          "is_bot": false,
          "headline": "docs(readme): add loredex-family crosslink row to the hero",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-13T04:56:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "818f9ea2c342801eeeedcb86acb0c26c76c2a11a",
          "body": "…gn), version-agnostic filenames\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015F6mqmauagcw1pzHPhu3St",
          "is_bot": false,
          "headline": "docs(desktop): correct macOS 'damaged' fix (xattr -cr + ad-hoc codesi…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-13T04:11:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dc2a7263e9d7860dba9e743ef9ca7cdd06b9ae7c",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.4.1",
          "is_bot": false,
          "headline": "Merge pull request #17 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-13T03:27:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbd1c1eaf90a50346d80d1fe280f69a9e54d0027",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.4.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-13T03:22:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad1d29a3d0c3972e3772d67ce230899b5b26884e",
          "body": "stampFrontmatterKey edits the raw frontmatter text to set one top-level key,\nreplacing the line in place or inserting before the closing fence. Replaces the\nserializeDoc round-trip in executePlan's copy-mode stamp, which reflowed long\nscalars into >- blocks and dropped blank lines — cosmetic churn i\n[…]\n\n(preserves the stale-overwrite fix). Full byte-preservation test added.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015F6mqmauagcw1pzHPhu3St",
          "is_bot": false,
          "headline": "fix(router): surgical no-reflow source stamp instead of full reserialize",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-13T03:21:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "25acfdc19378738591313440975850fd5a254076",
          "body": "Publishes the product-grouping exports the desktop needs (loadProducts,\ngroupProjects, productOf). Syncs manifest + plugin.json for a manual OIDC publish.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "chore(release): loredex 2.4.0 — product scoping",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-12T20:23:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5109973de426e3c9479bd3779a1846625f9ac3de",
          "body": "…ic → Note)\n\nA project belongs to at most one product; membership lives in a committed\nvault manifest (_index/products.json) so a shared team vault groups the\nsame everywhere. rebuildIndexes groups Home under product headings and the\nrouter mirrors product into note frontmatter; Dashboard.base gains\n[…]\nssigned projects fall under Ungrouped, so\nexisting vaults are unchanged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "feat(products): group projects into products (Product → Project → Top…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-12T20:17:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e53bc336a694a6b0a31162751374912ea0ea58c9",
          "body": "Answers the skeptic's first objection (folder + convention) and adds a\nfair comparison vs ADR tools / Notion / GitHub wiki / obsidian-wiki, plus\na note that retrieval is primarily agents-over-MCP.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "docs: 'How it compares' — why-not-just-a-folder + alternatives table",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-12T17:27:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f67ca5d1c42aa12bf9a04795f79f4cb6dd4f527c",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.3.2",
          "is_bot": false,
          "headline": "Merge pull request #16 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-12T16:45:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "244888cde2d8072bc61738f3e8433bebcaafc245",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.3.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T16:33:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0d960e3dd532f99c511fe9ccc6d64a850d17a85",
          "body": "…tically\n\nThe Stop (route) and SessionStart (handoffs) hooks ran bare 'npx -y loredex',\nwhich serves npx's cached version — a newly published CLI could lag until the\ncache turned over. Pinning @latest makes every hook run resolve the newest\nrelease, so a loredex publish reaches plugin users on their\n[…]\next turn with no\nmanual update. (Costs one registry check per hook run.)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "fix(plugin): pin hooks to loredex@latest so pushes reach users automa…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-12T16:33:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "947b344f4321d95ec146c752640ebdb3621574dc",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.3.1",
          "is_bot": false,
          "headline": "Merge pull request #15 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-12T16:13:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f85c84a573a4ae922659564989e9fbf687d4213",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.3.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-12T16:03:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6cec4465fb670dd056c7c9dd36e314332bc8db82",
          "body": "Antigravity was already auto-detected (editors.ts) but the --editor help text\nlisted only vscode|cursor|windsurf|system, so agents concluded it was\nunsupported and fell back to `system`.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DBa3tCHkgyuVcMd7xMKVcR",
          "is_bot": false,
          "headline": "fix(cli): list antigravity in --editor help + note auto-detect",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-12T16:03:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51c1f5fd92d6f207597c2adda7a5544004e5f9be",
          "body": "Adopt/route inside a registered project let the LLM classifier override the\nproject with a name guessed from file content, scattering one repo across\ninvented projects (genudo-mcp, genudo-platform-front). A registered root is\nground truth: the LLM now sets only topic/type/tags. Inbox route (no root)\n[…]\nlets it pick the project. Explicit frontmatter still wins.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01DBa3tCHkgyuVcMd7xMKVcR",
          "is_bot": false,
          "headline": "fix(classify): pin project to the registered root, not the LLM guess",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-12T16:03:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7bf935dc5603b720c1e048ff7c3c416affd39dd9",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "docs: fill version placeholders with 0.2.1 — copy-ready install commands",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-12T12:52:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "269e61f80edd86e68483c206c80fd10d0dd498cb",
          "body": "…nux)\n\ndocs/DESKTOP.md: per-OS install (dmg/exe/AppImage/deb, unsigned-launch\nsteps), first run, every view, MCP wiring, and a desktop-vs-Obsidian\ncomparison. README: desktop badge, Quick Actions + TOC + ecosystem +\nDocumentation + Roadmap entries, and a Desktop app section.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "docs: cross-link the desktop app + full install/use guide (mac/win/li…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-12T10:50:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0a6e6e63c1b39b242bfb003888c669c249ba621e",
          "body": "…orts\n\nPublishes the exports loredex-desktop depends on (routeFile, undoRoute,\nlistReceipts, matchNeverRoute, RouteScopeError/RouteUndoError). Syncs the\nrelease-please manifest + plugin.json to 2.3.0 for a manual OIDC publish.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "chore(release): loredex 2.3.0 — route receipts, undo, never-route exp…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-12T10:19:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ea60d563f96b65ca467cb727c35e31c7f05f3e1",
          "body": "Consumers that install loredex from a git ref (e.g. loredex-desktop pins a\ncommit until the route-receipts exports are on npm) need dist/ built on\ninstall. Registry installs ship dist/ in the tarball and skip prepare.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "build: add prepare script so git/local installs build dist/",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-12T09:57:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5eb22e151aa0accfeb21ade8a470f86608671028",
          "body": "…(PR-3, epic4)\n\nEvery route persists a reversible receipt under <vault>/.loredex/receipts/;\nundoRoute restores byte-identical state (delete vault copies, restore sources)\nand rides its own git commit. executePlan refuses sources matching\nConfig.neverRoute globs at a single chokepoint so app and CLI \n[…]\n; routeFile/executePlan return\nreceiptId. 157 tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "feat(router): route receipts + undo + never-route filing-scope globs …",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-10T22:28:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "182f9feec2c4cf1b33fa283f5c40c1516cee3c79",
          "body": "This reverts commit eeb06e9a35fdeb024145124b90b2e334f146823a.",
          "is_bot": false,
          "headline": "Revert \"ci: path-ignore release-please files so bot PRs create no runs\"",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-10T17:37:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eeb06e9a35fdeb024145124b90b2e334f146823a",
          "body": "The approval gate ('Action required') fires before job-level if evaluates;\npath filtering is the only thing that prevents the run from existing at all.\nKept the head_ref guard as backstop for release PRs that grow extra files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015F6mqmauagcw1pzHPhu3St",
          "is_bot": false,
          "headline": "ci: path-ignore release-please files so bot PRs create no runs",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-10T17:34:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ce7f35209455f9230cd2bab1478b368ef5a06117",
          "body": "Bot PR only bumps version/changelog; its runs just sit as 'Action required' noise.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015F6mqmauagcw1pzHPhu3St",
          "is_bot": false,
          "headline": "ci: skip CI on release-please PRs",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-10T17:33:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "88517d8e89bbfe5ec250bd71e273ab6aa62bf475",
          "body": "…esh stale vault copies\n\nTwo staleness bugs from the same root (route trusts plan-time snapshots):\n\n- copy-mode source stamping rewrote the file from item.raw captured at scan\n  time, silently destroying edits made between planning and execution\n  (confirmed data loss in a 71-file Stop-hook route). \n[…]\ne note\n  body from the source — source wins over hand edits to the copy.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015F6mqmauagcw1pzHPhu3St",
          "is_bot": false,
          "headline": "fix(router): never serve stale content — reread source at stamp, refr…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-10T17:05:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06c72115bdbb88e56cee87bf07639fe8c8a8884d",
          "body": "Unbreaks CI lint on main (b5c3ffc pushed unsorted).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015F6mqmauagcw1pzHPhu3St",
          "is_bot": false,
          "headline": "style: sort imports/exports per biome organizeImports",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-10T17:05:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b5c3ffc0134c67537d7fecd6a6c3b819fb89a4ee",
          "body": "…c16.story1)\n\nWriters emitted the '## Reading order' heading even with zero notes\n(createHandoff replies) or after the known-name filter emptied the LLM\nlist (CLI) — every reader then showed a silent empty list (2026-07-10\nnimbus defect). Both writers now omit the section when the list is empty.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "fix(handoff): never write an empty Reading order section (desktop epi…",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-10T14:12:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "57039529608d5a59e2f48b1c60d37fd64804ddf8",
          "body": "createHandoff appends the author (`loredex: handoff a -> b (Name)`) and\nsetHandoffStatus writes `loredex: handoff <id> <from> -> <to>` — both fell\nthrough to generic sync. HANDOFF gains an optional author suffix; a new\ndisjoint STATUS rule types transitions with the handoff id as subject.\nSurfaced by the desktop E2E Nimbus suite (epic6.story3).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "fix(activity): grammar recognizes PR-11 write commits",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-10T13:20:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "10aed365ca201fd4c39d728fd83a1ce419c717e6",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release loredex 2.2.0 (#14)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-10T09:32:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d7b9a6f9bfb51aee5745e15a3839a6ad381604e",
          "body": "…tmatter)\n\nThe plan half of routeFile for hosts that confirm before writing (desktop\nroute-a-note card, epic7.story4). plannedMeta extracted from executePlan so\nthe preview stamps exactly what the executor writes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "feat: previewRoute — read-only route plan (destination + planned fron…",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-10T02:45:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d92146da2e4aaa6ca76aed1e7ea7b487532b8e8a",
          "body": "createHandoff / replyToHandoff / setHandoffStatus / annotateHandoff /\nrouteFile as lib exports; LOREDEX_SCHEMA 1 -> 2 with additive lifecycle\nfields (kind, replies_to, fulfills, accept/decline/snooze attribution);\nshared qualified-id finder (AMBIGUOUS_HANDOFF / UNKNOWN_HANDOFF) rewires\nconsumeHandof\n[…]\nnooze/--reopen/\n--annotate; expired-snooze derived flag in listHandoffs.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "feat: handoff write APIs + frontmatter schema v2 (PR-11, epic7.story1)",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-10T02:25:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "333b05b91088befc5120c05cac8bdeb38777ccda",
          "body": "…ow_dispatch re-publish\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "ci: pin npm 11.5.2 for publish (npm@latest missing sigstore) + workfl…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-10T00:19:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6f29f408d9d08e79b53031dae4a01c573d255e4b",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(main): release loredex 2.1.0 (#13)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-10T00:10:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a60fadc09670fb461c80b9b5c58a14c069f1cad3",
          "body": "…ention)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "test: explicit 30s timeout on consume round-trip (parallel-suite cont…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-10T00:00:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "95c04cc18a71dd787574f83dcdd11d3c2f9ff879",
          "body": "…story1 / PR-6)\n\nTypes the vault git log into identity-attributed route/consume/handoff/\nsync events; unknown commits become generic sync events, never dropped.\nACTIVITY_LOG_ARGS is exported so every caller invokes git identically;\nthe commit-message grammar the engine writes is documented lib-side.\nRebuilds dist so file: consumers see all new exports.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "feat: parseActivity + ActivityEvent — shared activity grammar (epic6.…",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-09T22:17:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0dbfb6e50b643ba542b77dd1e8c19e44f6b2a69",
          "body": "One authoritative sync-health source for app and CLI: ahead/behind vs\nthe last-fetched remote ref (no implicit fetch — documented), branch vs\nthe remote's canonical branch, remote reachability (ls-remote with\ntimeout), merge-driver + gitattributes validity as a first-class F8\nwarning, last pull/push\n[…]\n timestamps, and accumulated warnings.\nStrictly read-only; never throws.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "feat: read-only syncStatus() + SyncHealth (epic5.story1 / PR-4)",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-09T22:15:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "928f13b5b2ae99262f44060ee72072c891f71bcb",
          "body": "One consume writer for CLI, MCP, and embedding hosts: stamps\nconsumed_by/consumed_at + loredex_schema into frontmatter, commits,\nbest-effort syncs, emits a consume event, and returns a ConsumeReceipt\n(before/after diff + push outcome). Engine note writes (route/store/\nhandoff/consume) now stamp lore\n[…]\n schema than the\nengine supports. Read paths tolerate unversioned notes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "feat: consumeHandoff + loredex_schema versioning (epic3.story3 / PR-2)",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-09T22:08:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9e8601e590c00dbca02ce4f970ac5bdffcc49cf",
          "body": "…3.story1 / PR-1)\n\nGeneralizes collectProductHandoffs to inbox/outbox/all, per-project or\ncompany-wide. Cards carry id, lanes, objective, age, status, path, and\nreading-order refs. CLI handoffs listing and MCP handoffs_open rewired\nonto the same collector; output unchanged (snapshot parity test).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "feat: listHandoffs(scope) + HandoffCard — one handoff collector (epic…",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-09T22:03:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "99a134d81b5860f2146b015e1041b3e6f6d8e2d3",
          "body": "Engine emits route/store/consume-ready/sync events through an injectable\nemitter; default is a no-op so CLI behavior is unchanged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "feat: injectable typed event emitter (PR-8 subset for epic1.story5)",
          "author_name": "Loredex Dev Agent",
          "author_login": null,
          "committed_at": "2026-07-09T21:59:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c1fa833e1e1ac50dad0128add3118e0362694f1a",
          "body": "…tion-agnostic handoff footers\n\ngitattributes has no backslash-escape for spaces, so the merge driver\nsilently never applied to the product brief — the file most likely to\nconflict under team sync. Quoted pattern fixes it; existing vaults with\nthe broken line are healed in place on the next loredex \n[…]\n independent hits\non the gitattributes bug, systemic hit on the footer).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FkBiKt6XphwUPRgpkm4rjo",
          "is_bot": false,
          "headline": "fix: valid gitattributes pattern for Start Here - Product.md + invoca…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-09T20:18:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f39ffc963f79459204ba9e9220a50e31db6cd951",
          "body": null,
          "is_bot": false,
          "headline": "docs: add stable README anchors",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-09T06:41:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbe068ae7ae0595e103f85934bb07be819c34792",
          "body": null,
          "is_bot": false,
          "headline": "docs: refine hero brief",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-09T06:38:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d002c4c5efd2d1ed5c839d026ec27e8e5371fb96",
          "body": null,
          "is_bot": false,
          "headline": "docs: refresh framework positioning",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-09T06:29:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9451285b910e6bcf601437e08ea05a5dab8df9cb",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix README anchor links",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-09T06:25:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9c8e8b8ebfb7c15399c5960e114b667cebc833a",
          "body": null,
          "is_bot": false,
          "headline": "docs: sharpen public repo onboarding",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-09T06:20:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad16d3d78b47e762d5a3c1726483f459ba1d0482",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 2.0.0",
          "is_bot": false,
          "headline": "Merge pull request #12 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-09T06:12:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09313825bffde570389440d103b538922dabeb45",
          "body": null,
          "is_bot": false,
          "headline": "docs: add infographic gallery",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-09T06:07:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3983d5d0dddb8fffe39604b74c80833fc0cd68d5",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 2.0.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-09T04:24:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c93abf2a18620990905b431874acb5d5a274ba4",
          "body": "Native Bases dashboard, Obsidian plugin, recency indexes, library entry.\n\nRelease-As: 2.0.0\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "chore: cut 2.0.0 — the ecosystem release",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-09T04:19:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7122eb0e71b208ee0ca97cfe34dd4c519d0a89f4",
          "body": "…odel\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "docs: v2 README — TOC, ecosystem map, full feature matrix, security m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-09T04:19:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e66462ccb4f4c485aa4550a64a7711f71e86471c",
          "body": "…oard\n\nBases (Obsidian ≥1.9) renders it with the native table/card UI: latest\nnotes, open handoffs, by-project cards, stale list. Static content,\nlive queries — regenerating with the indexes keeps it conflict-free\nunder the generated-files merge driver. Linked from Home.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "feat: generate _index/Dashboard.base — native Obsidian database dashb…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-09T03:56:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "704778d9eacf7d6ced6c5ec75551f217bea4db98",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "docs: animated hero — files flowing through the loredex hub",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-09T03:34:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51103f05fb60f8ad47b1b62b004fc361b4392846",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "docs: animated cross-repo flow guide in README",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-09T03:14:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "64984ffca51f9e7c71418f8e08580f3d25770abf",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 1.1.0",
          "is_bot": false,
          "headline": "Merge pull request #11 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-07T07:10:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fed7b13d86c0405982eaf720b4c6f11179b2a8a",
          "body": "README (habit callout + FAQ entry), user guide mental model, vault spec\nlayout, and the base skill now all say the same thing: Obsidian sorts\nfolders alphabetically and always will; _index/<project>.md is the\nrecency-ordered front door.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "docs: teach the MOC-first habit — read _index, not the folder tree",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-07T06:56:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5bfee6a8dcc04854ede1d3a23e46cc2d43993fa5",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 1.1.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-07T06:44:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d00199e969e3511f5cca54e0526b9b78675fd52f",
          "body": "…ading\n\nObsidian's file tree is stuck alphabetical; the _index MOC is loredex's\nanswer to \"what's newest\", so it now sorts topics by their latest note\n(names are date-prefixed) and shows that date in each heading.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "feat: order MOC topics by recency — newest activity first, date in he…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-07T06:44:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84da0b512c64571fa544bb2123210717e387e89a",
          "body": "…outed\n\nDogfooding found the docs never said (1) project files route directly —\n_inbox is only for unregistered drops, (2) the routed stamp is the\nrouter's signature and a pre-stamped file is silently skipped, (3) Claude\nCode hooks fire in any IDE-hosted terminal vs native IDE agents needing\nwatch/r\n[…]\n AGENTS.md/cursor-rule templates, the loredex skill,\nand the user guide.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "fix: document routing lanes and forbid agent self-stamping loredex: r…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-07T05:47:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e54d66cddda29eeb9c74066ca5bd038dce951cf2",
          "body": "…ain--components--loredex\n\nchore(main): release loredex 1.0.0",
          "is_bot": false,
          "headline": "Merge pull request #10 from ahmedtawfeeq1/release-please--branches--m…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-05T03:59:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efd0d0d12aa1df4c5de08ce8ed52a4a77ef95761",
          "body": null,
          "is_bot": true,
          "headline": "chore(main): release loredex 1.0.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-05T03:45:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27e26062106e1bdeac054f0cec4a0c72b06bf3c2",
          "body": "…alid for TS 5.x\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "fix: scope ignoreDeprecations to tsup dts pass — IDE tsconfig stays v…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-05T03:45:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6d1b9d0034accb9e610b20d53d4061cde585df01",
          "body": "…, MCP server\n\nRelease-As: 1.0.0\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "chore: cut 1.0.0 — CLI, Claude Code plugin, team vaults, product view…",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-05T03:42:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c7dcc7df6fedff349e877088143e0fd6940c0e53",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "style: sort lib exports (biome)",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-05T03:01:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d39401e60c50e5cadad943ab1e9a8f17e9242dd4",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01HuP4VHnQkshEUE4nJfQVn3",
          "is_bot": false,
          "headline": "docs: roadmap update + cross-link loredex-obsidian plugin",
          "author_name": "Ahmed Tawfeeq",
          "author_login": null,
          "committed_at": "2026-07-04T19:36:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "db264c43261148d1999ff3859a7c3103f9c7907f",
          "body": "dist/lib.js + type declarations expose the core (search, store, product\ndashboard, handoffs, router/git, MCP server factory, frontmatter, config)\nso the upcoming Obsidian plugin can consume loredex as an npm dependency\nand re-host the same MCP tools over Streamable HTTP. The CLI bundle is\nunchanged and remains the primary interface.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ju68FoB41BNf72DVCuVcK8",
          "is_bot": false,
          "headline": "feat: library entry point — embed loredex core in other hosts",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-04T19:19:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "140d0b0362b0e2b17d6103380049504e9411b776",
          "body": "…nk escapes\n\nThe vault-boundary check was a literal string prefix test running BEFORE\npath normalization, so /vault/../../etc/x.md passed the prefix check and\nreadFileSync resolved the traversal; a symlink inside the vault pointing\noutside also slipped through. Both sides now go through realpathSync\n[…]\nnst ..-segments, a symlink escape,\nnon-md paths, and nonexistent files).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ju68FoB41BNf72DVCuVcK8",
          "is_bot": false,
          "headline": "fix: realpath containment for vault_note — blocks traversal and symli…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-04T19:01:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "24d41b47bcdb06369bfc4b8bd566fb6d7ac0c916",
          "body": "'loredex mcp' runs a stdio MCP server (six tools) as a fourth shell over\nthe same core the CLI uses:\n\n- vault_search: deterministic ranked search — briefs/handoffs above raw\n  notes, stale/superseded sunk; sanitized excerpts with paths\n- vault_note: full note read, vault-paths only (refuses anything\n[…]\neamable HTTP)\nre-hosts this core unchanged — documented in ARCHITECTURE.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ju68FoB41BNf72DVCuVcK8",
          "is_bot": false,
          "headline": "feat: MCP server — live vault access for any MCP agent",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-04T18:51:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d5df6e98ec2ab8e0fba9b7132e2b4022100732d1",
          "body": "Paste-in snippets for BMAD technical preferences and Spec Kit constitutions\nthat make framework-managed agents consult the vault at the two moments\nthat matter: read open handoffs before planning, write frontmattered\nmarkdown after. Plus the end-to-end multi-repo product loop diagram.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ju68FoB41BNf72DVCuVcK8",
          "is_bot": false,
          "headline": "docs: BMAD / Spec Kit integration guide",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-04T18:04:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0245f405ffd370d77b0ccd40fbbbe05a978c55ae",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ju68FoB41BNf72DVCuVcK8",
          "is_bot": false,
          "headline": "docs: product view — /loredex-product skill, user guide, vault spec",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-04T17:53:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d333569524c176f2b73a64a737473234cf946dcc",
          "body": "…ate's machine\n\nsource_path is the authoring machine's absolute path; on a teammate's clone\nof a shared vault it doesn't exist, so drift detection silently skipped\ntheir notes. Routed copies now also carry source_project (slug) +\nsource_rel (path relative to the project root), and drift resolution g\n[…]\nnnot escape the resolved project root (normalized prefix check, tested).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ju68FoB41BNf72DVCuVcK8",
          "is_bot": false,
          "headline": "feat: portable source provenance — drift detection works on any teamm…",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-04T17:49:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "03943b4ad93b0ab2e412c070447c3e24e446c085",
          "body": "Two teammates syncing concurrently used to be guaranteed rebase conflicts\non _index/* and the product brief — regenerated-wholesale files where\nline merging is meaningless. A keep-local merge driver (registered in\n.git/info/attributes, NOT a worktree .gitattributes: autostash would sweep\nan uncommit\n[…]\nTest: two clones divergently rewriting _index/Home.md both sync cleanly.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ju68FoB41BNf72DVCuVcK8",
          "is_bot": false,
          "headline": "feat: conflict-free generated files for team vaults",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-04T17:40:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f22bb71b01914435567ff16b479b495e853ca917",
          "body": "Projects whose Start Here brief is missing or older than their newest note\nget a per-project curate first; current briefs are reused untouched. Makes\nproduct curation incremental: unchanged projects cost zero LLM calls.\nVerified live — two brief-less projects were curated then reduced, and the\nreceiving project's derived objective correctly reflected its open handoff.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ju68FoB41BNf72DVCuVcK8",
          "is_bot": false,
          "headline": "feat: curate --product --refresh-stale — incremental map step",
          "author_name": "ahmedtawfeeq1",
          "author_login": "ahmedtawfeeq1",
          "committed_at": "2026-07-04T17:32:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 22,
      "commits_last_year": 150,
      "latest_release_at": "2026-07-18T22:53:39Z",
      "latest_release_tag": "loredex-v2.9.0",
      "releases_from_tags": false,
      "days_since_last_push": 3,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 85,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "loredex",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "obsidian",
            "markdown",
            "ai",
            "claude-code",
            "codex",
            "cursor",
            "knowledge-base",
            "vault",
            "second-brain",
            "agents"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/loredex",
          "is_deprecated": false,
          "latest_version": "2.9.0",
          "repository_url": "https://github.com/ahmedtawfeeq1/loredex",
          "versions_count": 24,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3829,
          "first_published_at": "2026-07-02T23:25:08.184000Z",
          "latest_published_at": "2026-07-18T22:54:21.085000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 23234,
      "source_files_sampled": 103,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "@hono/node-server",
            "direct": false,
            "version": "1.19.14",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.9,
            "advisory_ids": [
              "GHSA-frvp-7c67-39w9"
            ],
            "fixed_version": "2.0.5",
            "advisory_count": 1,
            "oldest_advisory_days": 2
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "moderate": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 109,
        "malicious_count": 0,
        "assessed_package": "npm:loredex@2.9.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.3"
        },
        {
          "name": "gray-matter",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.3"
        },
        {
          "name": "js-yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "picocolors",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.1"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.4.3"
        }
      ],
      "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": 28,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "ahmedtawfeeq1",
          "commits": 99,
          "avatar_url": "https://avatars.githubusercontent.com/u/63398623?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 3,
            "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": 4,
            "reason": "4 out of 10 merged PRs checked by a CI test -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/10 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 4,
            "reason": "dependency not pinned by hash detected -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 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": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "5925a0fd48cbb490ffded31c554938d6916cfa6c",
        "ran_at": "2026-07-24T10:21:43Z",
        "aggregate_score": 3.7,
        "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-20T03:15:20Z",
      "oldest_open_prs": [
        {
          "number": 29,
          "created_at": "2026-07-19T10:13:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 30,
          "created_at": "2026-07-19T14:42:51Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 31,
          "created_at": "2026-07-19T21:51:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-18T22:53:29Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ahmedtawfeeq1/loredex",
    "host": "github.com",
    "name": "loredex",
    "owner": "ahmedtawfeeq1"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 60,
      "inputs": {
        "security": 47,
        "vitality": 74,
        "community": 48,
        "governance": 51,
        "engineering": 77
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "commits_last_year": 150,
              "human_commit_share": 0.87,
              "days_since_last_push": 3,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "150 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 150
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": 22,
              "latest_release_tag": "loredex-v2.9.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "22 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 22
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1
                    }
                  }
                ],
                "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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 48,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "packages": [
                "loredex"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3829
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,829 downloads/month across npm",
                "points": 47.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3829,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 51,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 28,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "28/28 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 28,
                      "decided": 28
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/10 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ahmedtawfeeq1",
              "public_repos": 7,
              "account_age_days": 2297
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of ahmedtawfeeq1",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "ahmedtawfeeq1"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "7 public repos, account ~6 yr old",
                "points": 18.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 7
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "loredex"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "24 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 77,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "4 out of 10 merged PRs checked by a CI test -- score normalized to 4",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "ai-agents",
                "claude-code",
                "cli",
                "codex",
                "cursor",
                "knowledge-base",
                "markdown",
                "obsidian",
                "second-brain",
                "agent-memory",
                "developer-tools",
                "knowledge-management",
                "mcp",
                "mcp-server",
                "obsidian-vault"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "15 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 47,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.7
            },
            "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": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "4 out of 10 merged PRs checked by a CI test -- score normalized to 4",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/10 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file 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": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Matched the npm:loredex@2.9.0 runtime dependency closure — what installing the published package pulls in — 109 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:loredex@2.9.0",
                  "assessed": 109
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 109,
              "unassessed_packages": 0,
              "affected_by_severity": "moderate 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "1 affected: @hono/node-server 1.19.14 (moderate 5.9)",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@hono/node-server 1.19.14 (moderate 5.9)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 109,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.989,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "86 of 87 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 86,
                      "sampled": 87
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.64,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "64 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 64,
                      "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 4",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 23234,
              "source_files_sampled": 103,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/103 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 103,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "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": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T10:21:59.993549Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/ahmedtawfeeq1/loredex.svg",
  "full_name": "ahmedtawfeeq1/loredex",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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