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

dkedar7 / langstage-core

Host + AG-UI bridge for LangGraph agents — agent-spec loading, layered config, and typed in-process streaming

PythonMIT★ 0 estrellas⑂ 1 forkdesde feb 2026Ver en GitHub ↗

dkedar7/langstage-core tiene un índice de salud de 59 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (84/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

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

59
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

Kedar DabhadkarCuenta personal
50 seguidores76 repositorios públicosdesde abr 2016Lam Research

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
PyPIlangstage-core1.0.23-23hace 0 díasagentsailangchainlanggraphparserstreaming

Métricas por categoría

Vitalidad

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

84Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
9.7/36Cadencia de commits — 14/52 semanas con commits
18/18Volumen de commits — 147 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year147
human_commit_share1
days_since_last_push0
active_weeks_last_year14
Cómo se puntúa
27/27Publica versiones — 53 versiones publicadas
36/36Recencia de las versiones — última versión hace 12 días
27/27Cadencia de publicación — una versión cada ~0,7 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count53
latest_release_tagv1.0.16
releases_from_tagsno
days_since_latest_release12
mean_days_between_releases0,7
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 1 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks1
stars0
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)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

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

59Moderado · 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
41.7/46.8Resolución de issues — 89% de issues cerradas
38.2/38.3Aceptación de PR — 78/78 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs78
open_issues3
closed_issues25
issue_closed_ratio0,893
closed_unmerged_prs0
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
12.3/25Alcance del propietario — 50 seguidores de dkedar7
25/25Trayectoria — 76 repos públicos, cuenta de ~10 años
Datos de entrada utilizados
followers50
owner_typeUser
is_verified
owner_logindkedar7
public_repos76
account_age_days3761
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 23 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageslangstage-core
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

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

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://dkedar7.github.io/langstage-docs/
10/10Descripción del repositorio
10/10Topics — 10 topics
10/10Wiki
Datos de entrada utilizados
topicsag-ui, agents, ai-agents, deepagents, human-in-the-loop, langchain, langgraph, llm, python, streaming
has_wiki
homepagehttps://dkedar7.github.io/langstage-docs/
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?

37En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 16 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.

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.

43En riesgo · 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 — 80 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,8
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 73 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesuv.lock
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,73
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
55/55Tamaños de archivo manejables — 0/45 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes35.902
source_files_sampled45
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples, notebooks
Datos de entrada utilizados
example_dirsexamples, notebooks
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:langstage-core@1.0.23; advisories assessed against the repository dependency graph instead

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-23 06:11 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 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
10Maintained30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities16 existing vulnerabilities detected
Dependencias directas 1
RegistroPaqueteRestricción de versiónManifiesto
PyPIlangchain-core>=1.4pyproject.toml
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "ag-ui",
        "agents",
        "ai-agents",
        "deepagents",
        "human-in-the-loop",
        "langchain",
        "langgraph",
        "llm",
        "python",
        "streaming"
      ],
      "is_fork": false,
      "size_kb": 1036,
      "has_wiki": true,
      "homepage": "https://dkedar7.github.io/langstage-docs/",
      "languages": {
        "Python": 295889
      },
      "pushed_at": "2026-07-23T06:09:49Z",
      "created_at": "2026-02-01T20:04:26Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T06:10:19Z",
      "description": "Host + AG-UI bridge for LangGraph agents — agent-spec loading, layered config, and typed in-process streaming",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "dkedar.com",
      "name": "Kedar Dabhadkar",
      "type": "User",
      "login": "dkedar7",
      "company": "Lam Research",
      "location": "Portland, OR",
      "followers": 50,
      "avatar_url": "https://avatars.githubusercontent.com/u/18269900?v=4",
      "created_at": "2016-04-04T18:46:35Z",
      "is_verified": null,
      "public_repos": 76,
      "account_age_days": 3761
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.0.16",
          "kind": "patch",
          "published_at": "2026-07-10T11:57:20Z"
        },
        {
          "tag": "v1.0.15",
          "kind": "patch",
          "published_at": "2026-07-10T02:37:59Z"
        },
        {
          "tag": "v1.0.14",
          "kind": "patch",
          "published_at": "2026-07-08T14:40:47Z"
        },
        {
          "tag": "v1.0.13",
          "kind": "patch",
          "published_at": "2026-07-08T12:43:42Z"
        },
        {
          "tag": "v1.0.12",
          "kind": "patch",
          "published_at": "2026-07-08T01:37:40Z"
        },
        {
          "tag": "v1.0.11",
          "kind": "patch",
          "published_at": "2026-07-06T11:53:00Z"
        },
        {
          "tag": "v1.0.10",
          "kind": "patch",
          "published_at": "2026-07-06T11:18:41Z"
        },
        {
          "tag": "v1.0.9",
          "kind": "patch",
          "published_at": "2026-07-05T14:27:19Z"
        },
        {
          "tag": "v1.0.8",
          "kind": "patch",
          "published_at": "2026-07-04T15:14:04Z"
        },
        {
          "tag": "v1.0.7",
          "kind": "patch",
          "published_at": "2026-07-03T21:38:16Z"
        },
        {
          "tag": "v1.0.6",
          "kind": "patch",
          "published_at": "2026-07-03T16:53:20Z"
        },
        {
          "tag": "v1.0.5",
          "kind": "patch",
          "published_at": "2026-07-03T13:33:49Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-07-03T01:33:08Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-07-03T01:12:36Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-07-03T00:56:53Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-07-02T16:38:20Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-07-02T13:42:11Z"
        },
        {
          "tag": "v0.6.19",
          "kind": "patch",
          "published_at": "2026-07-02T03:05:59Z"
        },
        {
          "tag": "v0.6.18",
          "kind": "patch",
          "published_at": "2026-07-02T03:00:57Z"
        },
        {
          "tag": "v0.6.17",
          "kind": "patch",
          "published_at": "2026-07-01T19:11:53Z"
        },
        {
          "tag": "v0.6.16",
          "kind": "patch",
          "published_at": "2026-07-01T17:24:45Z"
        },
        {
          "tag": "v0.6.15",
          "kind": "patch",
          "published_at": "2026-06-29T10:40:13Z"
        },
        {
          "tag": "v0.6.14",
          "kind": "patch",
          "published_at": "2026-06-28T18:14:08Z"
        },
        {
          "tag": "v0.6.13",
          "kind": "patch",
          "published_at": "2026-06-27T15:48:08Z"
        },
        {
          "tag": "v0.6.12",
          "kind": "patch",
          "published_at": "2026-06-26T14:16:40Z"
        },
        {
          "tag": "v0.6.11",
          "kind": "patch",
          "published_at": "2026-06-25T12:55:04Z"
        },
        {
          "tag": "v0.6.10",
          "kind": "patch",
          "published_at": "2026-06-23T11:16:34Z"
        },
        {
          "tag": "v0.6.9",
          "kind": "patch",
          "published_at": "2026-06-22T15:48:54Z"
        },
        {
          "tag": "v0.6.8",
          "kind": "patch",
          "published_at": "2026-06-22T14:47:04Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-06-21T21:11:11Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-06-21T19:52:45Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-06-20T19:09:53Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-06-20T18:16:41Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-06-18T13:35:37Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-06-16T03:58:16Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-06-15T13:17:51Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-14T23:39:28Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-14T22:03:16Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-06-14T14:31:01Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-06-14T14:34:49Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-14T14:34:48Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-14T14:34:47Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-14T14:34:46Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-14T14:34:45Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-04-19T03:40:04Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-04-18T19:51:09Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-03-30T01:18:10Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-02-24T03:33:54Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-02-20T02:54:37Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-02-10T03:53:29Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-02-09T01:25:08Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-08T03:02:06Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-02T04:54:22Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "32fb3e0d5936857fdda98264d175e2823abe7f3e",
          "body": "…(gh #104) (#107)\n\nHostConfig.resolve() cast env values with no error handling, so a single bad\nchar in LANGSTAGE_PORT (abc, an unexpanded \"$PORT\", a stray \"8050 x\") raised an\nuncaught ValueError straight out of resolve() and crashed every entrypoint that\nresolves config -- --show-config, --demo, --\n[…]\nose hosts inherit it and can drop their local env shims.\n\n\nClaude-Session: https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(config): degrade a malformed numeric env var instead of crashing …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-23T06:09:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "828d2bb71c4d0550ce105ede0629378973082c4b",
          "body": "…er wire caps tool results (gh #102) (#103)\n\niter_event_frames capped each tool result at max_result_len (default 500) with a\n`…(truncated)` marker; iter_chunk_frames emitted the full content and had no\nmax_result_len parameter at all. The asymmetry pointed the wrong way — the chunk\nwire is the one \n[…]\na non-str result passes through instead\nof being sliced.\n\n\nClaude-Session: https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agui): honor max_result_len on iter_chunk_frames so the CLI/Jupyt…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-19T14:48:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ddcab54056fe8a910ebec2ff5977654dd63ef3f3",
          "body": "…00) + coerce wrong-typed TOML values (langstage-jupyter #78) (#101)\n\n* fix(agui): load the agent spec before the \"Serving ...\" banner (gh #100) + coerce wrong-typed TOML values (langstage-jupyter #78)\n\nTwo error-path holes where a user mistake surfaced as a raw traceback or a\nsilently wrong value i\n[…]\ne Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_011HWCfJii6gXd3XL3Gq3W8B\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agui): load the agent spec before the 'Serving ...' banner (gh #1…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-19T03:21:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "188f52a176b1c494dc988ff283b37bd6c16c288c",
          "body": "…surface emits `extraction` frames (gh #96) (#98)\n\n`SessionAdapter` — the streaming engine behind the web app + task board — accepted\nonly `graph` / `max_result_len` and swallowed everything else via `**_legacy`, so\n`SessionAdapter(graph=g, extractors=[...])` was accepted without error but the\nextra\n[…]\n(fail-before/pass-after). Full suite green (164 passed).\n\n\nClaude-Session: https://claude.ai/code/session_01WeFhpZ6DJkyCM6sQB99uNY\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(session): forward `extractors` through SessionAdapter so the web …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-16T14:02:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2fc48916914bfe8fba2f72a90212f5c6a48d8a5b",
          "body": "…ors` on iter_chunk_frames (#92) (#94)\n\n* fix(agui): surface node exceptions as the terminal `error` frame in iter_* (gh #93, 1.0.18)\n\n`iter_event_frames` / `iter_chunk_frames` document — and the README Quick start\nplus the shipped `examples/fastapi_websocket.py` rely on — an `error` frame among\nthe\n[…]\ne Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01WeFhpZ6DJkyCM6sQB99uNY\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agui): terminal `error` frame on node exceptions (#93) + `extract…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-15T02:50:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7e9d06b1883e321a3702bce0d0bd7e91a94a141",
          "body": "…olExtractor's \"*\" fallback reachable (#90) (#91)\n\n* fix(agui): render a later node's finished message in a mixed-mode turn (gh #89)\n\n`iter_event_frames` / `iter_chunk_frames` rendered non-streamed assistant\ncontent only via the final `MessagesSnapshotEvent`, guarded by\n`and not streamed_text`. So a\n[…]\ne Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01WeFhpZ6DJkyCM6sQB99uNY\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agui): render mixed-mode finished messages (#89) + make GenericTo…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-12T21:08:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0da49ee69f8a264d948e8e2b10a351d828da85d5",
          "body": "examples/fastapi_websocket.py forwarded the client's bare `decisions`\nlist straight into `resume=[...]`, but the HITL middleware reads the\nresumed value back as `interrupt(...)[\"decisions\"]` — so a real\ndeepagents/HITL agent (the swap-in the example invites) crashed with\n`TypeError: list indices mus\n[…]\nfile\ntoo — not just the notebook + README — so the class can't recur.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix bare-list HITL resume in the FastAPI example (gh #87) (#88)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-10T11:56:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d9214b593c6e8a5bd6e022323843df5d0fb23d2c",
          "body": "The example notebook showed `resume=[{\"type\": \"approve\"}]`, but\nHumanInTheLoopMiddleware reads the resumed value back as\n`interrupt(...)[\"decisions\"]` — a bare list has no `[\"decisions\"]`, so\ncopy-pasting the snippet crashed the resume. Corrected to the decision\nenvelope `resume={\"decisions\": [{\"typ\n[…]\nd literal to\n`create_resume_input(...)`'s output so they can't drift.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix HITL resume snippet in Jupyter example (gh #85) (#86)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-10T02:37:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20b1918086be73d437ba03ff8ad0cde7ac4dc50e",
          "body": "…configurable] too (#84)\n\nA run of nightly issues (#55/#57/#61/#64/#66) were all config-diagnostic drift: each surface\nassembled its own --show-config / /config output (base dump + a separately-rendered\n[configurable] table + footer tweaks) and the pieces drifted. Fold the [configurable] table\ninto \n[…]\nle=...) so the whole diagnostic comes from one method and\nevery surface's two config views render identically by construction. Purely additive.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: describe() is the single complete config diagnostic — renders […",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-08T14:40:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4be88c361a692f0c82df89500da049d2831e53b7",
          "body": "…arn malformed TOML (hermes #61) (#83)\n\n#82: iter_event_frames/iter_chunk_frames(resume=) wrap the value into\nforwarded_props.command.resume (-> Command(resume=...)), but create_resume_input()\nalready returns a Command — so passing it double-wrapped and the graph's interrupt()\nreturned a Command, cr\n[…]\n(so --show-config printed\n\"TOML read from: <ignored file>\"). Track malformed paths + dedupe the warning; loaders\nskip listing a malformed file.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: unwrap create_resume_input's Command (#82) + don't list/double-w…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-08T12:43:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a6257ccf4c60496fe27f8cde8bbca8d7a3ac1d42",
          "body": "…docs (#80) (#81)\n\nThe README's \"What's in the box\" promises everything is re-exported top-level (except the\nagui helpers) and lists SessionAdapter/Session, but they were only importable from\nlangstage_core.adapters — so `from langstage_core import SessionAdapter` raised ImportError.\nRe-export them at the top level (still under .adapters too) and fix the package docstring,\nwhich had miscategorized SessionAdapter under the agui bullet.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: re-export SessionAdapter/Session at the top level, matching the …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-08T01:37:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e3066df1d31db84ca08f32f3e3712fc8449e0520",
          "body": "…7) (#79)\n\nThe README banner + migration guide said the old import \"still works via a compat shim,\"\nreading as \"install langstage-core and import langgraph_stream_parser keeps working.\" But\nthe shim is a SEPARATE distribution (langgraph-stream-parser 1.0, re-exporting\nlangstage_core) that langstage-\n[…]\n a fresh `pip install langstage-core` hit ModuleNotFoundError. Clarify that\nthe old name works only while the separate package stays installed.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: stop over-promising the langgraph_stream_parser compat shim (#7…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-06T11:52:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "34e56bf67fb84c25c06ce05e4d0d2b9728445360",
          "body": "…crash (langstage-vscode #40) (#78)\n\nThe on_interrupt handler did payload.get(\"action_requests\", ...), assuming a dict with\nthose keys — so the standard HumanInterrupt LIST that deepagents/langchain HITL emit\ncrashed the turn ('list' object has no attribute 'get'), and any other plain dict\nreturned \n[…]\nict. Applied to both iter_event_frames (event wire: vscode/web) and\niter_chunk_frames (chunk wire: cli/jupyter, which read frame[\"interrupt\"]).\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: normalize the HumanInterrupt shape so an interrupt turn doesn't …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-06T11:18:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "841a75c7ea3abba00d4bf803025cbb542aeafb66",
          "body": "…he 1.0 API (#75) (#76)\n\n* fix: resolve workspace root to absolute once so a later chdir can't double it (#66)\n\napply_workspace() stored the root as given (e.g. ./ws) and workspace_root()\nre-.resolve()d it against the current cwd on every call, so a surface that then\nchdir'd into the workspace (cli \n[…]\nAlso drop the stale FastAPIAdapter cross-ref in SessionAdapter's docstring.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: relative-workspace doubling (#66) + rewrite broken examples on t…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-05T14:26:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6821fb7cb7ac4b0b36ab421ed4a74bde9b2a61c3",
          "body": "core header now reads langstage-core (was langgraph-stream-parser), v1.0, and the diagram shows the current build_agent/iter_frames API instead of the removed StreamParser.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: refresh README header image to the LangStage name (dogfood) (#74)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-05T03:26:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3bb2cfbb0a6c28a70451695d6db9b8b3a2718a4a",
          "body": "…kspace surfaces) (#73)\n\nA BYO agent's raw relative file writes can only land in the workspace if the process\ncwd is the workspace (core can't re-root arbitrary tools — the ADR-0005 boundary). So\nevery single-workspace surface runs the agent with the workspace as cwd: cli (already),\nvscode + web (ne\n[…]\nexception (JupyterLab owns the cwd).\nRecords the F7 dogfood decision.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: ADR 0006 — operate the agent from the workspace cwd (single-wor…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-05T02:47:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "432a0b1faddfdb30a594153665fa9527be354940",
          "body": "…ing* events (gh #71, 1.0.8) (#72)\n\niter_event_frames/iter_chunk_frames had no branch for the Reasoning*/Thinking* AG-UI\nevents ag-ui-langgraph emits for reasoning models (Anthropic extended thinking,\no-series, DeepSeek R1, ...), so chain-of-thought was silently dropped and the\nadvertised `reasoning\n[…]\nrom the\n`content` answer so renderers can show/collapse the thinking.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agui): emit the advertised `reasoning` frame for Reasoning*/Think…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-04T15:13:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "79729a3d343313e4421b65ae65fc158f9ea785f6",
          "body": "…of truth + ADR 0005 (1.0.7) (#70)\n\nCore resolved workspace_root (the value) but never applied it, so each surface\ninvented its own mechanism (cli chdir / vscode env-push / hermes backend-arg /\njupyter global-mutate / web hand-sync) and three drifted into a workspace bug\n(#19, #45/#36, #44). apply_w\n[…]\n ADR 0005 accepted. Surfaces migrate incrementally; BYO tools opt in.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(host): apply_workspace/workspace_root — single workspace source …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-03T21:37:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c243f6acc0bd6cea94c9b84d8dd13e85112bec4",
          "body": "…0004 (1.0.6) (#69)\n\nRuns ONE real turn through iter_event_frames and returns a structured VerifyResult\n(ok / saw_complete / saw_error / error_message / content_chars). ok is True only if\nthe turn completed with no error — a missing key / broken tool / bad schema fails\nhere, where a static \"imports \n[…]\n; workspace application staged) with\nthe six-surface evidence matrix.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agui): shared live-preflight primitive verify()/averify() + ADR …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-03T16:52:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d69cffa22912334d6816554e044983ad6cdd46a3",
          "body": "…atus (gh #67, #55, 1.0.5) (#68)\n\ngh #67 (regression from 1.0.4): iter_event_frames/iter_chunk_frames emit content from\nthe final MessagesSnapshotEvent for non-token agents, but that snapshot is the FULL\nthread — so every turn re-emitted turns 1..n. Slice the snapshot to the messages after\nthe last \n[…]\nI event upstream (ag-ui-langgraph); documented as a known limitation.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Stop replaying history for snapshot agents; best-effort tool-error st…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-03T13:33:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b487f004ef973083d2333736711f4535317bde54",
          "body": "…43, 1.0.4) (#66)\n\niter_event_frames/iter_chunk_frames hardcoded node=\"agent\" on every content/tool\nframe, so a multi-node graph's output was indistinguishable — the CLI, which\nstarts a fresh marker on a node change, rendered two nodes' messages as one\nrun-on. Track the current node from StepStarted\n[…]\nangstage-cli renders each on its own line). 2 regression tests added.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "AG-UI frames carry the real langgraph node, not a fixed \"agent\" (gh #…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-03T01:32:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a2316b6fe01eab8571777fc53369df1c12f66dd2",
          "body": "…deepagents.toml (gh #42, #25, 1.0.3) (#65)\n\nTwo cross-family config fixes in the shared host layer:\n\n- gh #42: a malformed langstage.toml raised a raw TOMLDecodeError from _read_toml.\n  Because config resolves at import time on several surfaces, that bricked\n  --version/--help/--demo, the deepagent\n[…]\ntoml_config.\n\n4 regression tests added; full host-config suite green.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Harden config loading: don't crash on malformed TOML; warn on legacy …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-03T01:12:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9106f4251e01a21f64ffd4df29c4ccf32e42d894",
          "body": "…#64)\n\nThe --show-config branch resolved HostConfig with only the host/port overrides;\n--agent was applied to the overrides later, after the branch's early return. So\n`langstage-agui --show-config --agent X` reported agent_spec = None while serve()\nhonored the flag — the shown config disagreed with \n[…]\nnotes the demo\nspec. Regression test added to tests/test_agui_cli.py.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix `langstage-agui --show-config` ignoring --agent (gh #60, 1.0.2) (…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-03T00:56:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b34f03dd828ad75c08607fa2db757df932001c64",
          "body": "Dogfooding the published docs against the 1.0.0 wheel found the README was only\nname-renamed during the rename: its body (Quick Start through Display Adapters)\nstill documented the REMOVED event layer — StreamParser, langstage_core.events,\nevent_to_dict, stream_graph_updates, and the CLI/Print/FastA\n[…]\nangstage-core[agui]>=1.0, so 1.0.1 satisfies them with no re-release.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: rewrite README for the 1.0 API; bump 1.0.0 -> 1.0.1 (#63)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-02T16:37:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4fcea3d0186ec7a6c7f73e413126090528922986",
          "body": "…(#62)\n\nThe event layer is retired and AG-UI is the sole streaming path on every surface.\nCore renamed to langstage-core 1.0.0 (event layer removed; compat shim published);\nall five surfaces repointed to langstage-core[agui] in one release each:\ncli 0.6.1, hermes 0.4.1, vscode 0.5.0, jupyter 0.6.0, \n[…]\none regression caught during rollout (Jupyter token-delta rendering).\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): mark ADR 0002/0003 Implemented — AG-UI migration complete …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-02T15:51:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "be39f6137d6b67dbd2cd52bbc41ec131230e3abc",
          "body": "…) (#61)\n\n* wip(core-1.0): remove event layer (StreamParser/events/handlers/adapters); SessionAdapter AG-UI-only\n\nSource surgery for langstage-core 1.0 (ADR 0003). Removed StreamParser, events.py,\nhandlers/, compat.py, the non-agui render adapters, and event-layer tests. Kept host,\ntasks, agui, demo\n[…]\nrenced the removed StreamParser + old module name; point it at\nlangstage_core (load_agent_spec/tasks/agui) and --cov=langstage_core.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat!: langstage-core 1.0 — remove the event layer + rename (ADR 0003…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-02T13:41:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0c4947dea4e1a1853ce3f3cb69468ee2f296fe4",
          "body": "…r graph input) (#59)\n\nThe ag-ui-langgraph adapter forwards RunAgentInput.state into the graph input, so\na state= param lets surfaces whose agent contract carries more than messages pass\ntheir extra keys (e.g. hermes' iteration_budget_remaining / model_override /\nsession_id). Needed for the hermes AG-UI migration. Test added; suite green.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agui): state= on iter_event_frames/iter_chunk_frames (seed riche…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-02T03:05:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0467ed96b1186ebe1f6c8c93170e9015a4e1e8d8",
          "body": "…tionized) (#58)\n\nRuns tool-result extractors over the in-process AG-UI stream: after each tool\nresult, the matching extractor (by tool_name) runs and a non-None return emits an\n frame identical to event_to_dict(ToolExtractedEvent). This is the\nAG-UI home for domain callouts (hermes' skill/memory/co\n[…]\npiece that unblocks hermes' migration and the event-layer retirement.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agui): extractors= on iter_event_frames (ADR 0003 Stage 1 produc…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-02T03:00:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1ad90cbf4d6ab936f685e5fe5adce08f62f604b5",
          "body": "* docs(adr): 0003 — deprecate & retire the event layer (Proposed)\n\nTurns ADR 0002's glib \"deprecate events.py -> remove -> rename\" endgame into a\nreal staged plan, after two facts surfaced that change it:\n\n1. The AG-UI paths are opt-in; the event layer is still every surface's DEFAULT.\n   You can't \n[…]\now.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ADR 0003 (Proposed): deprecate & retire the event layer (#57)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-02T02:57:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e3185cb2df5fd42eefcb2a70974a25efb5a6570",
          "body": "iter_event_frames (vscode+web) + iter_chunk_frames (cli+jupyter, 0.6.17) are the\nsingle source of truth; all four surfaces delegate. Shipped cli 0.5.18, jupyter\n0.5.14, vscode 0.4.10. Next remaining item: deprecate the event layer (Decision 3).\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): dedupe done — both AG-UI mappings live in the core (#56)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-01T19:26:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "859f1d3612d4666c4984f90461e029350318a2cb",
          "body": "…pe (#55)\n\n* docs(adr): migration complete — all four surfaces on AG-UI\n\ncli (0.5.17), jupyter (0.5.13), vscode (0.4.9), web (langstage 0.12.3 / core 0.6.16)\nall ship opt-in [agui] paths at full parity. Records the two format-families\n(chunk-dict: cli+jupyter; event_to_dict: vscode+web) and the rema\n[…]\nub.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agui): add iter_chunk_frames (chunk-dict family) — ADR 0002 dedu…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-01T19:11:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "523c56970d82233e2b70fd321426872aa109436a",
          "body": "cli (0.5.17), jupyter (0.5.13), vscode (0.4.9), web (langstage 0.12.3 / core 0.6.16)\nall ship opt-in [agui] paths at full parity. Records the two format-families\n(chunk-dict: cli+jupyter; event_to_dict: vscode+web) and the remaining post-migration\nwork: dedupe, deprecate the event layer (keeping extractors), rename, flip defaults.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): migration complete — all four surfaces on AG-UI (#54)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-01T17:35:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da4e31b746e6c0acd1e0e33cf49ee558cef2f1da",
          "body": "…web enabler) (#53)\n\n* docs(adr): migration progress — vscode done (0.4.9); web is last\n\ncli (0.5.17), jupyter (0.5.13), vscode (0.4.9) all shipped opt-in AG-UI paths with\nfull text+tools+interrupts parity. Added the shared-mapping note: cli+jupyter share\nthe chunk-dict mapping (byte-identical, dedu\n[…]\ned.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agui): iter_event_frames + SessionAdapter AG-UI mode (ADR 0002, …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-01T17:24:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ac13a5f2bbcb08cfbc44ac477d7733ea8754e2d",
          "body": "cli (0.5.17), jupyter (0.5.13), vscode (0.4.9) all shipped opt-in AG-UI paths with\nfull text+tools+interrupts parity. Added the shared-mapping note: cli+jupyter share\nthe chunk-dict mapping (byte-identical, dedupe target); vscode uses event_to_dict\n(distinct); web (SessionAdapter) will differ again — consolidate per format-family.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): migration progress — vscode done (0.4.9); web is last (#52)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-01T15:23:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bff4205de864b3982b6018f288c7b7d1ad853bf6",
          "body": "… in cli 0.5.17 (#51)\n\nResume works via forwarded_props.command.resume (-> Command(resume=...)), not the\ntop-level RunAgentInput.resume ResumeEntry field. Shipped in langstage-cli 0.5.17\n(--agui full display->decide->resume loop). The mechanism is generic and unblocks\nthe web + vscode HITL surfaces. Migration progress: cli done; jupyter next.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(adr): mark ADR 0002 gate (2) resolved — interrupt resume shipped…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-01T13:58:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8a782545bb4ce45174cc490950ceec66633cfee",
          "body": "…o host layer (#49)\n\n* docs(adr): 0002 — execute the event-layer retirement; scope core to host layer (Proposed)\n\nFollow-on to ADR 0001, which adopted AG-UI for the wire and staged the\nevent-layer retirement \"for later.\" The preconditions 0001 named are now met\n(AG-UI bridge shipped, all six surface\n[…]\ned.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ADR 0002 (Proposed): execute the event-layer retirement; scope core t…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-07-01T06:57:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b174b42e7ab0b2cc77fc893ef5ca1f16772f3055",
          "body": "The README's FastAPI WebSocket section says to install\n`pip install 'langgraph-stream-parser[fastapi]' uvicorn` and run\n`uvicorn examples.fastapi_websocket:app`. Run verbatim on a clean install it\ncrashed immediately with ModuleNotFoundError — first on `dotenv`\n(fastapi_websocket.py), then on `deepa\n[…]\ns only — no package src change, so no new release needed.\n\nFixes #47.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make the FastAPI example run on the documented install (#47) (#48)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-30T18:36:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8444fc4da35ae3eb5b9804797705f7e18bd087f6",
          "body": "`stream_mode=\"auto\"` is advertised, but it's a parser-side concept: LangGraph's\ngraph.stream()/astream() don't understand it and yield zero chunks. BaseAdapter\nand FastAPIAdapter forwarded stream_mode verbatim to the graph, so calling an\nadapter with the advertised stream_mode=\"auto\" rendered a sile\n[…]\nnc (BaseAdapter)\nand async (FastAPIAdapter) stream calls.\n\nFixes #45.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Don't forward parser-only stream modes to graph.stream() (#45) (#46)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-29T10:39:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2658f7cf906c55d9c21271e57ccc2d1367cf2c8",
          "body": "A real graph.stream(stream_mode=\"values\") was silently dropped: the parser\nrejected the constructor arg, and feeding a values stream (full-state dicts)\nfell through to the updates handler, which saw no node-keyed update and yielded\na lone CompleteEvent — an empty turn. ValuesEvent was also unreachab\n[…]\nng tests that used \"values\" as their invalid-mode example\n\nFixes #43.\n\n\nClaude-Session: https://claude.ai/code/session_012Rojryf2SHxCM87NgsDSi2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Support stream_mode=\"values\" (emit ValuesEvent + content) (#43) (#44)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-28T18:13:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "89e04d04268117e367c0b5a94170f0cab9fb14b5",
          "body": "Auto-detect only recognized multi-mode (mode, data) tuples and v2 parts; a\nmessages-mode stream's first chunk is (message, metadata), which fell through to\n\"updates\" and matched none of its chunks -- rendering an empty turn with no\nerror, while explicit stream_mode=\"messages\" rendered fine. _peek_an\n[…]\n explicit messages mode on the stub; detector\nunit-tested against messages / multi-mode / subgraph / plain-dict chunks.\n\nFixes #41\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: stream_mode=auto detects a pure messages-mode stream (0.6.13) (#42)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-27T15:47:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f2320fac7584a7f78d8de8f376da42c7803b1570",
          "body": "…12) (#40)\n\nThe AG-UI server consumes only agent_spec/host/port, but --show-config printed\nall six inherited HostConfig rows (workspace_root/debug/title too) with\nconfident env-var sources -- the same advertised-vs-honored inconsistency\n0.6.11's describe(omit_keys=...) fixed for the stdio sidecar an\n[…]\nit_keys=[workspace_root, debug, title].\n\nTest: agui --show-config shows agent_spec/host/port, not the three inert rows.\n\nFixes #39\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: langstage-agui --show-config omits keys the server ignores (0.6.…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-26T14:15:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3e8395867c35fec4d7f4775c8f168c3958bc80fb",
          "body": "…ges (0.6.11) (#38)\n\n- CLIAdapter crashed with UnicodeEncodeError on a default Windows (cp1252)\n  console: it prints the message bullet, braille spinner, box-drawing, and\n  check/cross/warn glyphs without reconfiguring stdio, so the first styled line\n  raised before any output. run() now reconfigure\n[…]\n, and renders the echoed reply; describe(omit_keys) hides the\nnamed rows and their env vars while keeping honored keys.\n\nFixes #37\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: CLIAdapter cp1252-safe (#37) + describe(omit_keys) for stdio sta…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-25T12:54:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "096558bfb2333856eed252ef27c5c28a74e5fd83",
          "body": "… (0.6.10) (#36)\n\nTwo LOW dogfood-routine findings, both in the shared core:\n\n1. create_stub_agent()'s ImportError over-claimed \"every deep-agent surface\n   already installs them\" -- false for a base langstage-vscode install -- and\n   never named the fix. It now points at the lightweight\n   `pip ins\n[…]\n every legacy-env deprecation signal.\n\nTest: SUPPRESS=1 now asserted to silence both the stderr notice and the\nDeprecationWarning.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: honest stub missing-deps error + full SUPPRESS for legacy notice…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-23T11:15:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d45a9f351c8bc887899d4820d0e652343339459",
          "body": "…) (#35)\n\nThe resolver emits a DeprecationWarning when a legacy DEEPAGENT_* env var is\nused, but Python's default warning filter swallows it -- so a real person\nrunning any LangStage CLI never saw the nudge (an \"advertised != honored\" gap\nthe dogfood routine flagged). _warn_legacy_env now also print\n[…]\nUPPRESS_LEGACY_NOTICE=1.\n\nTests: notice prints to stderr (and is cp1252-encodable); silent under pytest;\nsilenced by the env flag.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: make legacy DEEPAGENT_* deprecation visible to CLI users (0.6.9…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-22T15:48:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cec6771abefed05604bae5f3d341e8f6edc4e2b5",
          "body": "…6.8) (#34)\n\nTwo dogfood-routine findings, both highest-leverage because they ship from\nthe shared core and fix every surface at once:\n\n1. create_stub_agent() compiled the echo demo with a default MemorySaver, so\n   streaming it the documented config-free way (no thread_id) raised a\n   checkpointer \n[…]\n; multi-turn\npersistence test now passes an explicit checkpointer; BOM'd langstage.toml\nresolves; host --help is cp1252-encodable.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: keyless Quick Start no longer silently blank + BOM-safe TOML (0.…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-22T14:46:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b32342a985756d6cda363e3f9dda1ee4a9b0c9dc",
          "body": "…(0.6.7) (#33)\n\nMinor/nit/enhancement fixes from the dogfood re-run:\n\n- tool_end reported name=\"unknown\" when a ToolMessage lacked a name; backfill it\n  from the correlated start event (found via langstage-vscode).\n- `langstage-agui --demo` without [agui] printed a \"Serving ... at <url>\" banner\n  TH\n[…]\nt no longer pulls the full [demo]/deepagents stack (~50 pkgs); README + docstring\n  point the keyless path at [stub].\n\n624 passed.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: tool_end name, agui --demo preflight, host --help, [stub] extra …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-21T21:10:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ebdad6f494accd479c3d66c9807d7d58ccc7684c",
          "body": "LangGraph's add_messages reducer officially accepts dict messages\n({\"role\":\"assistant\",\"content\":...} or {\"type\":\"ai\",...}), but the updates handler\ndispatched on the message's class name (\"dict\"), which matched no branch — so a\nCompiledGraph whose node returns a dict message produced NO ContentEven\n[…]\nagents in cli / web / vscode. Tests added (role + type\nforms, single + dual mode, tool-call dict, object passthrough). 619 passed.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: render dict-form messages in the updates handler (0.6.6) (#32)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-21T19:52:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d93c4a68f918eefe78321df11b5724e95650b56",
          "body": "…accuracy (0.6.5) (#31)\n\nCluster 3 (agui) + core README doc-gaps from the dogfood run:\n\n- langstage-agui --show-config printed HostConfig's localhost:8050 while the\n  server actually bound argparse's 127.0.0.1:8000 — advertised config disagreed\n  with the bind. host/port now come from the resolved H\n[…]\ngent() for a keyless graph).\n\nTests: agui CLI --version + --show-config override consistency (no [agui] extra\nneeded). 614 passed.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: agui --show-config matches the real bind; add --version; README …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-20T19:09:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d02c0aae2fded8f813bfcec001a7ad639337c30e",
          "body": "In stream_mode=[\"updates\",\"messages\"], the updates handler hard-suppressed all\ncontent, so a CompiledGraph whose node returns a finished AIMessage (rule-based /\nrouter / retrieval agents, or any LLM call outside a token-streaming node)\nproduced NO ContentEvent — chat surfaces showed a blank reply, c\n[…]\ngents. Found by the comprehensive dogfood workflow.\n\nShips alongside the already-merged __version__-from-metadata change as 0.6.4.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: dual-mode content fallback for non-streaming nodes (0.6.4) (#30)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-20T18:15:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "99ba443671ac69281b09d6d408c1f697817a8cdf",
          "body": "Replace the hard-coded `__version__ = \"0.6.3\"` with a lookup of the installed\ndistribution metadata (importlib.metadata.version), matching the pattern already\nused by langstage (web) and langstage-hermes. Value is unchanged; this just\nmakes it impossible for the constant to drift out of sync with py\n[…]\neventive — surfaced by the daily dogfooding routine (langstage-vscode#9),\nwhich found stale-__version__ drift in sibling packages.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: derive __version__ from installed metadata (no drift) (#29)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-19T13:18:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fbb7fe840c56734b880b2a7c4a5cb3c9773549e0",
          "body": "OpenAI-compatible providers (incl. OpenRouter) require the message `name` field\nto match ^[^\\s<|\\/>]+$. The agent's display name flows into that field, so a\nname with a space 400s on the second turn (cryptic \"messages[N].name: string\ndoes not match pattern\"). create_default_agent now slugifies unsaf\n[…]\n23 (its shipped\ndefault \"Default Agent\" tripped this against OpenRouter).\n\nTests: tests/test_agent_name.py. Full suite 606 passed.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: slugify agent name for the LLM message `name` field (0.6.3) (#28)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-18T13:34:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9b2da6acf51e2ce950566aaca3df36de682224f2",
          "body": "…6.2) (#27)\n\ntasks/tools.py imports langchain_core.tools at module top level (reached by\n`import langgraph_stream_parser`), but dependencies were []. A bare\n`pip install langgraph-stream-parser` failed with ModuleNotFoundError:\nlangchain_core. Now declared. langgraph stays optional (its imports are \n[…]\nd: minimal-install CI job (pip install ., no extras, import smoke).\nFound by rolling the langstage 0.11.1 guard across the family.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: declare langchain-core dependency + minimal-install CI guard (0.…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-16T03:57:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ca44da12ebcc273bf27fe5d7cf9cc8a1cd7c301",
          "body": "…n (0.6.1) (#26)\n\nDocstring-only: nudges models to prefer async delegation for long/parallel/\nbackground work over inline execution or a blocking sub-agent. No behavior change.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(tasks): sharpen start_async_task description to favor delegatio…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-15T13:15:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7912434dec24ad5245192c9e4c0950bde6328cea",
          "body": "…followup (0.6.0) (#25)\n\n- TaskRunner streams each run's events to the store as they arrive (new\n  TaskStore.append_events / get_events; InMemoryTaskStore implements both).\n  Enables a per-task detail/replay view + live-tailing.\n- TASK_TOOLS: five agent-facing delegation tools (start/check/list/upda\n[…]\ncancel/shutdown semantics (regression-tested).\nTests: +7 (transcript, followup, the five tools, parent linkage). Suite 597 passed.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(tasks): interactive tasks — event transcript, delegation tools, …",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-14T23:37:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba61c089b32ab9b06d11758821fec15cfae7732a",
          "body": "…#24)\n\nAdd langgraph_stream_parser.tasks — the reusable, single-process core\nbehind a \"delegate a task, run it in the background, track it on a board\"\nsurface:\n\n- TaskRunner: asyncio worker pool (generalized from CronScheduler) that\n  drives the shared SessionAdapter; non-blocking enqueue, cancel, r\n[…]\ner no-double-execution, worker resilience, dual-mode result).\nFull suite 590 passed.\n\nAlso fix stale __version__ (0.2.1 -> 0.5.0).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(tasks): async task-delegation engine + Session.outcome (0.5.0) (…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-14T22:01:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e4f2a1081ea5adf04f0d6bb7b2f8f4a51eb8adc",
          "body": "Co-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Python 3.14 to CI matrix + classifiers (#23)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-14T14:16:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5bed2d47dd40f6d618db8dc76ab18e37ded6aa63",
          "body": "…e-case matrix (#22)\n\nAn edge-case audit against purpose-built tool-calling/interrupting/erroring/\ncheckpointer-less agents found three real issues, now fixed + tested:\n- graphs without a checkpointer no longer hard-crash (auto-attach InMemorySaver;\n  AG-UI's aget_state requires one)\n- agent excepti\n[…]\nom __future__ import annotations` in the agui module so FastAPI\nresolves RunAgentInput as the request body. 6 new matrix tests; suite 568 green.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "AG-UI bridge robustness (v0.4.1): auto-checkpointer + RUN_ERROR + edg…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-14T03:09:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "03fd628a02d4ff3aeafb96b3fccf6a82144cf6d5",
          "body": "* feat: AG-UI bridge — serve any LangGraph agent over the AG-UI protocol (v0.4.0)\n\nAdopt the official MIT ag-ui-langgraph adapter for the wire (ADR 0001). New\nlanggraph_stream_parser.agui module (build_agent/add_agui_endpoint/build_app/\nserve) + langstage-agui console script serve any agent spec ove\n[…]\nalign the core. Drop 3.10 from CI matrix +\nclassifiers, bump requires-python.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "AG-UI bridge: serve any LangGraph agent over AG-UI (v0.4.0) (#21)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-14T02:32:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9cf0fc76e437f07ed6595a2960af806abd06b2d3",
          "body": "Co-authored-by: Kedar Dabhadkar <kdabhadk@gmail.com>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: link the LangStage documentation site in the README (#20)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-13T21:42:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "119ca383e8f3e2e4b3f23be6f81a5ebe2652cd5d",
          "body": "…iased (v0.3.0) (#19)\n\n* LangStage vocabulary: LANGSTAGE_* / langstage.toml canonical, legacy aliased\n\nThe host family is renamed to LangStage; this package keeps its name as the\nshared core. HostConfig resolves LANGSTAGE_* env vars, project langstage.toml,\nand ~/.langstage/config.toml as canonical,\n[…]\nmes. v0.3.0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n* Untrack REVAMP_PLAN.md (local scratch, swept in accidentally)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "LangStage vocabulary: LANGSTAGE_*/langstage.toml canonical, legacy al…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-12T05:17:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88e04c74b8f06005ee7711e5d52c0c8419349905",
          "body": "Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update changelog for v0.2.0 (#13)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-10T14:33:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ffa264358000a0653022dfc20145f162d97108a",
          "body": "A deterministic echo agent (real compiled LangGraph graph + MemorySaver,\ntoken-by-token streaming through the parser) that needs no API key. Loadable\nvia the standard spec string langgraph_stream_parser.demo.stub:graph or\ncreate_stub_agent(). langgraph/langchain-core import lazily so the base\ninstal\n[…]\ntays dependency-free.\n\nAlso adds the one-agent-every-surface family section to the README and\nbumps to 0.2.2 so surfaces can depend on the stub.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add keyless stub agent: the shared engine behind every --demo mode (#18)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-10T13:42:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5fd92d85e59007904e2cd03aaa4cf6dca169a38e",
          "body": "v0.2.1 packages the GenericToolExtractor + default_extractor work\nfrom PR #16 (4 unmerged-to-release commits behind main since v0.2.0).\nAlso adds .github/workflows/release.yml so future releases are\ntag-driven (mirror of deepagent-hermes's release.yml — push a `v*`\ntag and the workflow builds + publ\n[…]\n_TOKEN secret is set on the repo (carried over from the\ndeepagent-hermes account) so the Release workflow can publish on tag\npush.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Release workflow + bump to v0.2.1 (#17)",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-08T15:06:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2d3c6a8baee2eb06c94ecb32747c4bccd0c31b87",
          "body": "…#16)\n\nPer-tool extractors handle the tools the parser ships built-ins for\n(think_tool, write_todos, skill_manage, ...) and any tool the host\nregisters explicitly. Everything else only emits ToolCallStart/End\nlifecycle events, never a ToolExtractedEvent — so a host that\nswitches on ToolExtractedEven\n[…]\n be registered\n    alongside the default, specific extractor wins over default.\n\nFull suite: 544 passed, 1 skipped, 0 regressions.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "GenericToolExtractor + default_extractor fallback for unknown tools (…",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-08T12:32:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8477d5882e41c1357b7ad37d4f66c924fcce4f07",
          "body": "Add opt-in real-model test through the parser",
          "is_bot": false,
          "headline": "Merge pull request #15 from dkedar7/test/real-model",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-03T15:38:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf5159f9838578a08a4bad60f7972c913a2ebf9c",
          "body": "Every other test feeds the parser synthetic events; this runs a live\nmodel (OpenRouter / gpt-4o-mini) through a real LangGraph agent and\nasserts the parser emits streamed content, a real tool call, and\ncompletion — the wire events downstreams render.\n\nOpt-in: skips unless OPENROUTER_API_KEY is set and langchain-openai (the\nnew `real` extra) is installed, so default CI stays free/deterministic.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add opt-in real-model test through the parser",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-03T15:37:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c0762ead4bb8efdad016251bc275424a570d662a",
          "body": "Add CI (test suite on push/PR)",
          "is_bot": false,
          "headline": "Merge pull request #14 from dkedar7/ci/add-workflow",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-03T12:56:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93d7114b083c126854467f00ce206b70c80a8f60",
          "body": "The shared runtime had 530 passing tests but no CI — a break here\ncascades to every downstream (cowork-dash, deepagent-lab,\ndeepagent-hermes). Run the suite on a Python 3.10–3.13 matrix (plus one\nWindows job). The existing test_wire_contract.py + adapter/host tests\nact as the contract net for downst\n[…]\nkage re-exports its public API in\n__init__, which ruff flags as F401 — that needs a careful pass, not a\nblind --fix, so it's out of scope here.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add CI: run the test suite on push/PR to main",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-03T12:52:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6b2f61edc4a64882564bb44b4accb18cc6e79fc",
          "body": "Add four built-in extractors for agentskills.io / Hermes pattern",
          "is_bot": false,
          "headline": "Merge pull request #12 from dkedar7/feat/hermes-extractors",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-02T11:39:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79618631a7609e2deb3fc32dc49c67df002a7c0a",
          "body": "Config: layered HostConfig resolution (TOML + env + overrides) + introspection",
          "is_bot": false,
          "headline": "Merge pull request #11 from dkedar7/feat/config-resolution",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-02T11:39:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f4bee5f3237fdfb2ec7dbdfec629028b774836f",
          "body": "Shared runtime: host conventions, SessionAdapter, demo agent (v0.2.0)",
          "is_bot": false,
          "headline": "Merge pull request #10 from dkedar7/feat/runtime-host-layer",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-02T11:39:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc15a6669b2f4066025336aa5eeab3fb7729141b",
          "body": "Surfaces inline events for the agent-skills standard and the common\nfrozen-snapshot memory / compression patterns that the deepagent-*\nhost family is converging on. With these wired into the parser's\nbuilt-in set, every host gets the events for free through\n`compat.stream_graph_updates` without per-\n[…]\nntent\nrather than raising.\n\n25 new tests; 416 pass total (existing 391 + 25 new).\nNo changes to existing extractors or public API.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add four built-in extractors for the agentskills.io / Hermes pattern",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-06-02T11:09:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "080c8b9cab4124462c8bddf3f187d3a4d990cabb",
          "body": "HostConfig now resolves through one shared chain — defaults < deepagents.toml\n< DEEPAGENT_* env vars < explicit overrides — with per-field source tracking.\n\n- load_toml_config(): global ~/.deepagents/config.toml (+ DEEPAGENTS_CONFIG_HOME\n  override) and the nearest project deepagents.toml, deep-merg\n[…]\nEPAGENT_AGENT_SPEC\n  (canonical: DEEPAGENT_AGENT_SPEC).\n- from_env() retained (delegates to resolve(use_toml=False)).\n\n10 new tests; 504 total.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add layered config resolution + introspection to HostConfig",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-05-30T22:12:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68a24f8ae3415bea85b66b422f7b5e99ed9f0158",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add SVG header banner to README",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-05-30T21:20:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f91c27113279e466a88824ebdfda1e53d78dba6a",
          "body": "Extract the agent-hosting plumbing the deep-agent surfaces all duplicated\ninto a shared runtime layer:\n- host/: load_agent_spec, HostConfig, Workspace\n- adapters/session.py: SessionAdapter (session-scoped queue, cancel,\n  side-channel push_event, persistent SSE) for web hosts\n- demo/: create_default\n[…]\ntodo_list/reflection content.\n\n54 new tests (host, session adapter, demo, wire-contract golden file) plus\n2 compat regression tests; 494 total.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add host conventions, SessionAdapter, and demo agent factory (v0.2.0)",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-05-30T18:19:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4604a42302f62981eb1eeb3e46793a23c2e152b",
          "body": "Compatibility refresh for langgraph 1.2, langchain-core 1.4, and\ndeepagents 0.6. CHANGELOG covers new UsageEvent cache fields,\nis_subagent flag, edited_action / respond decision shapes, and the\nexpanded non-text block filter. README documents the new decision\nverbs and the is_subagent matching pattern. Dev deps bumped to\nlanggraph>=1.1.0 and langchain-core>=1.4.0.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Release v0.1.9",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-05-20T13:58:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0d5971023927565674abebd8f669f40e7ddc921c",
          "body": "Covers the new langchain-core 1.4 / deepagents 0.6 surfaces wired in\nthe previous commit:\n- UsageEvent extracts cache_read / cache_creation from\n  usage_metadata.input_token_details.\n- server_tool_call / server_tool_result blocks are dropped from\n  ContentEvent text.\n- ls_agent_type=\"subagent\" metadata surfaces as is_subagent on both\n  ContentEvent and ReasoningEvent.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add compat tests for cache tokens, server-tool blocks, is_subagent",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-05-20T13:57:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e9ef5e96ca2b54263d2d3b6e31e3ce257135555f",
          "body": "- Add UsageEvent.cache_read_tokens and cache_creation_tokens, populated\n  from usage_metadata.input_token_details.\n- Add ContentEvent.is_subagent and ReasoningEvent.is_subagent, set when\n  stream metadata carries ls_agent_type=\"subagent\" (deepagents >= 0.6).\n- InterruptEvent.build_decisions now emit\n[…]\nudio,\n  video, file), in addition to reasoning/thinking. Prevents stringified\n  tool dicts from leaking into ContentEvent.content.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Refresh event types for langchain-core 1.4 and deepagents 0.6",
          "author_name": "Kedar",
          "author_login": "dkedar7",
          "committed_at": "2026-05-20T13:57:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09e215fc86f7917ded22033bc9e80100bd06eda3",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.1.8",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:39:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c7746d2594a29fd154a06e654ce00b2a175b531",
          "body": "Add ReasoningEvent and DisplayEvent",
          "is_bot": false,
          "headline": "Merge pull request #9 from dkedar7/dev",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e900c398e2e1a15acc9b65eb4fa03c7d9928d95e",
          "body": null,
          "is_bot": false,
          "headline": "Document ReasoningEvent, DisplayEvent, and rich display pattern",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:34:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2bbb34e575723b0da77209e3fa286e3bb5024896",
          "body": null,
          "is_bot": false,
          "headline": "Add reasoning/display tests and fixtures",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:34:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ad1f5d5483f60f70e950021cb72fdce2ca05792",
          "body": null,
          "is_bot": false,
          "headline": "Remove unused has_messages variable in v2 parser",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:34:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb5fcc3137b7eaf911ea849f30657739e8d0b08b",
          "body": null,
          "is_bot": false,
          "headline": "Export ReasoningEvent and DisplayEvent; route through adapter and compat",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:34:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68335052b3ee8e39ad1ec7e31fdc9b02e6f0c4e7",
          "body": null,
          "is_bot": false,
          "headline": "Route think_tool and display_inline extractors to typed events",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:34:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e771fefc0e7d93538ce64d0daa930e32db70a08",
          "body": null,
          "is_bot": false,
          "headline": "Emit ReasoningEvent for reasoning and thinking content blocks",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:34:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a8c2439af7743cef7ef957f6def48525601b56f",
          "body": null,
          "is_bot": false,
          "headline": "Add ReasoningEvent and DisplayEvent dataclasses",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-19T03:34:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "100081677988741eb4b7a01354da95a96921a2c0",
          "body": null,
          "is_bot": false,
          "headline": "Update README event types, extractors, and example install",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-18T19:55:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dc8587acb6bd83bab47d92a950f83cfea3b75c6",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.1.7",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-18T19:50:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2710e619c328a08b14fbb53ed39f72090ef0456",
          "body": "Add FastAPIAdapter for WebSocket and SSE streaming",
          "is_bot": false,
          "headline": "Merge pull request #8 from dkedar7/dev",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-18T19:49:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9faf0ce61e3cc7f68bb6fe001831e5b8da0a642a",
          "body": null,
          "is_bot": false,
          "headline": "Document FastAPIAdapter in README",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-18T19:49:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8e0d5b32dde00d2941a795772fcec961dc9a6b2",
          "body": null,
          "is_bot": false,
          "headline": "Slim example to use FastAPIAdapter",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-18T19:49:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16e9baf269cc5660dcef492563caa873aea50e43",
          "body": null,
          "is_bot": false,
          "headline": "Hoist shared adapter helpers to BaseAdapter",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-18T19:49:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85d73951c84e1374224292473d54c70463afead3",
          "body": null,
          "is_bot": false,
          "headline": "Add FastAPIAdapter tests",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-18T19:49:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8abd9415103199a74bc980db9d6b7daa333441c",
          "body": null,
          "is_bot": false,
          "headline": "Add FastAPIAdapter for WebSocket and SSE streaming",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-04-18T19:49:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c883dae2fc3d77ba1d24ee5d23bea2e0bedbd0a1",
          "body": null,
          "is_bot": false,
          "headline": "Release v0.1.6",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-03-30T01:17:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22557044b3cff6a88e7668f93916809f6743e6ec",
          "body": "Add v2 StreamPart support",
          "is_bot": false,
          "headline": "Merge pull request #7 from dkedar7/dev",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-03-30T01:16:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53c04791c574149161f73d3a7bf4c6d37d739d2f",
          "body": null,
          "is_bot": false,
          "headline": "Add v2 StreamPart test fixtures and tests",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-03-30T01:16:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9143ad74d06505d86736d5ed33a869a293b5a902",
          "body": null,
          "is_bot": false,
          "headline": "Export ValuesEvent, DebugEvent and handle in adapter",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-03-30T01:15:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6ebb5e119a8e69653557c96946a87f04e3dd56c",
          "body": null,
          "is_bot": false,
          "headline": "Add v2 StreamPart parsing with auto-detection",
          "author_name": "Kedar Dabhadkar",
          "author_login": "dkedar7",
          "committed_at": "2026-03-30T01:15:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 53,
      "commits_last_year": 147,
      "latest_release_at": "2026-07-10T11:57:20Z",
      "latest_release_tag": "v1.0.16",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 12,
      "mean_days_between_releases": 0.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "langstage-core",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "agents",
            "ai",
            "langchain",
            "langgraph",
            "parser",
            "streaming",
            "Development Status :: 3 - Alpha",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: MIT License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.14",
            "Topic :: Scientific/Engineering :: Artificial Intelligence",
            "Topic :: Software Development :: Libraries :: Python Modules"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/langstage-core/",
          "is_deprecated": false,
          "latest_version": "1.0.23",
          "repository_url": "https://github.com/dkedar7/langstage-core",
          "versions_count": 23,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-07-02T13:41:48.866981Z",
          "latest_published_at": "2026-07-23T06:10:26.268340Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-16",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 4
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples",
        "notebooks"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 35902,
      "source_files_sampled": 45,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "langchain-core",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.4"
        }
      ],
      "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": 1,
        "merged_prs": 78,
        "open_issues": 3,
        "closed_ratio": 0.893,
        "closed_issues": 25,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "dkedar7",
          "commits": 148,
          "avatar_url": "https://avatars.githubusercontent.com/u/18269900?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": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "uv.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "16 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "32fb3e0d5936857fdda98264d175e2823abe7f3e",
        "ran_at": "2026-07-23T06:11:23Z",
        "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-23T06:10:53Z",
      "oldest_open_prs": [
        {
          "number": 97,
          "created_at": "2026-07-16T10:44:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-23T06:09:48Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 99,
          "created_at": "2026-07-17T07:16:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 105,
          "created_at": "2026-07-21T07:19:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 106,
          "created_at": "2026-07-22T07:16:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dkedar7/langstage-core",
    "host": "github.com",
    "name": "langstage-core",
    "owner": "dkedar7"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 37,
        "vitality": 84,
        "community": 24,
        "governance": 59,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 84,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "commits_last_year": 147,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 14
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "147 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 147
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 53,
              "latest_release_tag": "v1.0.16",
              "releases_from_tags": false,
              "days_since_latest_release": 12,
              "mean_days_between_releases": 0.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "53 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 53
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 12 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "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": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 1,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (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": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 59,
        "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": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "merged_prs": 78,
              "open_issues": 3,
              "closed_issues": 25,
              "issue_closed_ratio": 0.893,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "89% of issues closed",
                "points": 41.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 89
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "78/78 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 78,
                      "decided": 78
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "followers": 50,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "dkedar7",
              "public_repos": 76,
              "account_age_days": 3761
            },
            "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": "50 followers of dkedar7",
                "points": 12.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 50,
                      "login": "dkedar7"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "76 public repos, account ~10 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 76
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 10
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "langstage-core"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "23 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 23
                    }
                  }
                ],
                "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": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ag-ui",
                "agents",
                "ai-agents",
                "deepagents",
                "human-in-the-loop",
                "langchain",
                "langgraph",
                "llm",
                "python",
                "streaming"
              ],
              "has_wiki": true,
              "homepage": "https://dkedar7.github.io/langstage-docs/",
              "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": "https://dkedar7.github.io/langstage-docs/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": 37,
        "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 not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 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": "30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "16 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 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": "at_risk",
        "name": "AI Readiness",
        "value": 43,
        "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.8,
              "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": "80 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 80,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "uv.lock"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.73,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "73 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 73,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 35902,
              "source_files_sampled": 45,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/45 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 45,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples",
                "notebooks"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples, notebooks",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples, notebooks"
                    }
                  }
                ],
                "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:langstage-core@1.0.23; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T06:11:38.895082Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dkedar7/langstage-core.svg",
  "full_name": "dkedar7/langstage-core",
  "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 agregadasPyPI.