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

SmooAI / smooth-operator-core

Polyglot AI agent orchestration core (Rust reference + TS/Go/.NET/Python bindings) — agents, workflows, tools, checkpointing, memory, HITL, cost. A security-first LangGraph; the engine behind smooth-operator and lom.smoo.ai.

Rust · Go · C#MIT★ 3 estrellas⑂ 0 forksdesde may 2026Ver en GitHub ↗

SmooAI/smooth-operator-core tiene un índice de salud de 55 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (81/100) y la más baja, Community & Adoption (26/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

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

55
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

Smoo AIOrganización
6 seguidores21 repositorios públicosdesde jul 2023

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/SmooAI/smooth-operator-core/gov1.7.1-2hace 0 días

Métricas por categoría

Vitalidad

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

76Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
5.5/36Cadencia de commits — 8/52 semanas con commits
18/18Volumen de commits — 116 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year116
human_commit_share1
days_since_last_push0
active_weeks_last_year8
Cómo se puntúa
27/27Publica versiones — 20 versiones publicadas
36/36Recencia de las versiones — última versión hace 6 días
27/27Cadencia de publicación — una versión cada ~1,4 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count20
latest_release_tag@smooai/smooth-operator-core@0.23.0
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases1,4
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?

26Crítico · 18% del índice global
Cómo se puntúa
4.9/60Estrellas — 3 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars3
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (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?

53Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
37.5/38.3Aceptación de PR — 96/98 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs96
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs2
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
6.1/25Alcance del propietario — 6 seguidores de SmooAI
15.8/25Trayectoria — 21 repos públicos, cuenta de ~3 años
Datos de entrada utilizados
followers6
owner_typeOrganization
is_verified
owner_loginSmooAI
public_repos21
account_age_days1108
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 0 días
12/20Historial de versiones — 2 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/SmooAI/smooth-operator-core/go
ecosystemsgo
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 — 10 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://lom.smoo.ai
10/10Descripción del repositorio
10/10Topics — 9 topics
10/10Wiki
Datos de entrada utilizados
topicsagent-orchestration, ai-agent, checkpointing, langgraph-alternative, llm, multi-language, polyglot, rust, workflows
has_wiki
homepagehttps://lom.smoo.ai
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?

31En 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
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
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
1.5/7.5Vulnerabilities — 8 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,1
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.

63Moderado · 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 — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — dotnet/core/src/SmooAI.SmoothOperator.Core.csproj, dotnet/core/tests/SmooAI.SmoothOperator.Core.Tests.csproj, go/go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — typescript/core/tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 65 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
lockfilesgo.sum, pnpm-lock.yaml, uv.lock
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstypescript/core/tsconfig.json
agent_commit_share0,65
toolchain_manifestsdotnet/core/src/SmooAI.SmoothOperator.Core.csproj, dotnet/core/tests/SmooAI.SmoothOperator.Core.Tests.csproj, go/go.mod, rust/Cargo.toml, rust/smooth-operator-core/Cargo.toml, rust/smooth-operator-temporal/Cargo.toml
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Rust (tipado estático)
54.2/55Tamaños de archivo manejables — 4/291 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageRust
largest_source_bytes185.385
source_files_sampled291
oversized_source_files4

Datos clave

3estrellas de GitHub
1contribuidores
116commits en los últimos 12 meses
0días desde el último push
20versiones publicadas
1factor bus
0issues abiertas
crates.io, Go, npmecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.1 / 10
3.1agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-23 22:49 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
0Maintainedproject was created within the last 90 days. Please review its contents carefully
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
2Vulnerabilities8 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/BurntSushi/tomlv1.4.0go/go.mod
Gogithub.com/coder/websocketv1.8.14go/go.mod
Gogithub.com/google/uuidv1.6.0go/go.mod
Gogithub.com/santhosh-tekuri/jsonschema/v6v6.0.2go/go.mod
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": [
        "agent-orchestration",
        "ai-agent",
        "checkpointing",
        "langgraph-alternative",
        "llm",
        "multi-language",
        "polyglot",
        "rust",
        "workflows"
      ],
      "is_fork": false,
      "size_kb": 2362,
      "has_wiki": true,
      "homepage": "https://lom.smoo.ai",
      "languages": {
        "C#": 395712,
        "Go": 443744,
        "Rust": 1153768,
        "Python": 362352,
        "JavaScript": 25714,
        "TypeScript": 341991
      },
      "pushed_at": "2026-07-22T23:57:27Z",
      "created_at": "2026-05-25T02:32:40Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T23:47:25Z",
      "description": "Polyglot AI agent orchestration core (Rust reference + TS/Go/.NET/Python bindings) — agents, workflows, tools, checkpointing, memory, HITL, cost. A security-first LangGraph; the engine behind smooth-operator and lom.smoo.ai.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust",
        "Go",
        "C#",
        "Python",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://smoo.ai",
      "name": "Smoo AI",
      "type": "Organization",
      "login": "SmooAI",
      "company": null,
      "location": "United States of America",
      "followers": 6,
      "avatar_url": "https://avatars.githubusercontent.com/u/139191716?v=4",
      "created_at": "2023-07-11T02:18:25Z",
      "is_verified": null,
      "public_repos": 21,
      "account_age_days": 1108
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "@smooai/smooth-operator-core@0.23.0",
          "kind": "other",
          "published_at": "2026-07-17T16:31:30Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.22.0",
          "kind": "other",
          "published_at": "2026-07-17T16:23:21Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.21.0",
          "kind": "other",
          "published_at": "2026-07-17T16:07:14Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.20.4",
          "kind": "other",
          "published_at": "2026-07-08T20:28:24Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.20.2",
          "kind": "other",
          "published_at": "2026-07-08T20:27:06Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.20.1",
          "kind": "other",
          "published_at": "2026-07-08T15:15:34Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.20.0",
          "kind": "other",
          "published_at": "2026-07-05T03:49:56Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.19.1",
          "kind": "other",
          "published_at": "2026-07-05T00:19:01Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.19.0",
          "kind": "other",
          "published_at": "2026-07-04T21:18:41Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.18.0",
          "kind": "other",
          "published_at": "2026-07-04T21:04:21Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.16.0",
          "kind": "other",
          "published_at": "2026-07-04T21:02:12Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.15.0",
          "kind": "other",
          "published_at": "2026-07-04T20:57:53Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.14.0",
          "kind": "other",
          "published_at": "2026-07-04T20:35:12Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.13.0",
          "kind": "other",
          "published_at": "2026-07-04T14:35:41Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.12.0",
          "kind": "other",
          "published_at": "2026-07-04T13:10:54Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.11.1",
          "kind": "other",
          "published_at": "2026-07-04T13:06:35Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.11.0",
          "kind": "other",
          "published_at": "2026-07-03T12:50:13Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.10.1",
          "kind": "other",
          "published_at": "2026-07-03T12:20:25Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.10.0",
          "kind": "other",
          "published_at": "2026-07-03T12:13:52Z"
        },
        {
          "tag": "@smooai/smooth-operator-core@0.9.0",
          "kind": "other",
          "published_at": "2026-07-03T12:12:53Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6bc028679bd7fc63dcb32a8d098b60abac95e5b5",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#99)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-22T23:33:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a560e6b36853acfb67bef55b3120c25d01b8135",
          "body": "…ity) (#96)\n\nMirror the Rust engine's ToolHook seam (smooth-operator-core/src/tool.rs) in the\nTypeScript core. Add exported `ToolCall`, `ToolResult`, and `ToolHook` (async\n`preCall` — throw to block — and `postCall` with a mutable result for redaction).\n`SmoothAgent` runs the lifecycle around every \n[…]\nedaction) plugs in\nidentically across TS/C#/Python/Rust.\n\n\nClaude-Session: https://claude.ai/code/session_01USBgWKcgpkWAugmHPE7Bc9\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-c5c115: ToolHook lifecycle for the TypeScript engine (polyglot par…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-22T23:33:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "444dee7ca475da3b0459b3d637222e131de7468b",
          "body": "Mirror the Rust engine's ToolHook (pre_call/post_call redaction seam) in the\nGo core. New ToolHook interface (PreCall gates, PostCall redacts a mutable\n*ToolResult) + ToolResult type; AgentOptions.Hooks holds the chain and\ndispatchTool runs every PreCall before a tool (error blocks) and every\nPostCa\n[…]\n it reaches the model). Nil hooks =\nunchanged behaviour.\n\n\nClaude-Session: https://claude.ai/code/session_01USBgWKcgpkWAugmHPE7Bc9\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-bcb615: add ToolHook lifecycle to the Go engine (#98)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-22T23:21:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f77a62bf1115b45b999964f06d890fd2a8de7773",
          "body": "…y) (#97)\n\nPorts the Rust reference's ToolHook trait (rust/smooth-operator-core/src/\ntool.rs) to the .NET engine so every smooth-operator language mirrors the\nsame tool-surveillance / redaction seam.\n\n- IToolHook (ToolHook.cs): PreCallAsync + PostCallAsync over MEAI's\n  FunctionCallContent / Functio\n[…]\n throw is swallowed, hooks\n  fire in registration order.\n\n\nClaude-Session: https://claude.ai/code/session_01USBgWKcgpkWAugmHPE7Bc9\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-56aa52: add IToolHook lifecycle to the .NET engine (polyglot parit…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-22T23:02:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "14ea215738f9aed29d95240ca348da3d576a78aa",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#95)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T18:51:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe882c388bbcb10c1f71ec2a122bd263029656ca",
          "body": "* th-changesets-polyglot: drive lockstep polyglot publishing via Changesets\n\nWire the Changesets release to publish ALL smooth-operator-core artifacts\n(npm + crates.io + NuGet + PyPI + Go tag) at one lockstep version, instead\nof npm-only + separate manual publish-*.yml workflows.\n\n- scripts/sync-ver\n[…]\nFile+packed README; npm ships\nREADME by default).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drive lockstep polyglot publishing via Changesets (#93)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T18:51:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67d64db5a13784410287692c5aa673fd5845b3b1",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#92)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:31:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbec3423c2c416241eedb15b300ff327319384d6",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#91)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:30:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66c8ffcb6ab2089889f477bfc6415e18101b3b05",
          "body": "…e (#89)\n\nBring the .NET/C# smooth-operator engine to parity with the Rust engine's\npermission system so C# consumers (topstep) can use auto-mode + declare deny\npolicies (\"no prod AWS\", \"DB writer vs read replica\").\n\nPorted (none of this existed in the .NET engine before — it had only an\ninline IHum\n[…]\n1.5.0 -> 1.6.0; publishing (manual publish-nuget workflow) + the server's\nPackageReference bump are separate steps, NOT done here.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-f1f61f: port the permission system + deny-policy to the .NET engin…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:30:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4ba06475b8447a3090723055274f9702e7c4985",
          "body": "…arget main] (#90)\n\n* th-72288b: add ToolHook lifecycle to the Python engine (polyglot parity)\n\nThe Rust reference engine (smooth-operator-core/src/tool.rs) has a ToolHook\ntrait with a pre_call (raise/Err to block) and a post_call(&mut ToolResult)\nredaction seam. The Python engine had no hook concep\n[…]\nes green: ruff check + format,\n245 pytest passed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-ab0437: Python permission engine + deny-policy (Rust parity) [re-t…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:30:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5f43c6754925d4c32e9e54e69e68afc43b14581",
          "body": "…ty) (#88)\n\nThe Rust reference engine (smooth-operator-core/src/tool.rs) has a ToolHook\ntrait with a pre_call (raise/Err to block) and a post_call(&mut ToolResult)\nredaction seam. The Python engine had no hook concept — this adds it.\n\n- hooks.py: ToolCall + ToolResult dataclasses and a ToolHook base\n[…]\n\n  swallowed, registration order, empty-hooks unchanged.\n\n\nClaude-Session: https://claude.ai/code/session_01USBgWKcgpkWAugmHPE7Bc9\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-72288b: add ToolHook lifecycle to the Python engine (polyglot pari…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:26:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9c87ce03a801509f48e9bb59cfb776f35f4209cb",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#86)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:22:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5498d757aebae0b786018da567b92d3c5bc78028",
          "body": "Ports the Rust reference (smooth-operator-core::permission /\npermission_grants / deny_policy) to the Go engine at parity:\n\n- AutoMode (Ask/AcceptEdits/DenyUnmatched/Bypass) + SMOOTH_AUTO_MODE parsing.\n- Verdict (Allow/Deny/Ask) + the pure Decide classifier with ALL\n  circuit-breakers faithfully repr\n[…]\ner bash; network suffix+glob; path R/W;\npredicate; config round-trip. 79 new tests; go build / test -race / vet / gofmt\nall green.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-ab0437: port permission system + deny-policy to the Go engine (#85)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:22:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d85a958c1bcac58139a6dbad34d0df73c1040edc",
          "body": "…ine (#84)\n\nBring typescript/core to parity with the Rust reference engine's permission\nmodel. The TS core had a flat Tool[] with clearance + humanGate seams but no\nAutoMode/Verdict/decide classifier, no allow-list grants, no deny policy, and no\nToolHook interface. Port all of it, faithfully reprodu\n[…]\n/W, predicate, deny-beats-grant, survives-Bypass,\nconfig round-trip) + an integration test proving the gate blocks before execute.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-ab0437: port permission system + deny-policy to the TypeScript eng…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:22:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4b3af00be1df6b6a3a38a21874da832ab0ea812",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#83)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:06:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20514132844db0927468063cbc9cd240e5c64970",
          "body": "…ne (#82)\n\nAdds a deny tier the hardcoded circuit-breakers + allow-only grants can't\nexpress (never prod AWS, deny the DB writer endpoint, no writes under /prod).\n\n- Declarative DenyRules (TOML): tools/bash/network/paths deny lists, reusing\n  the engine's compound/sudo-aware bash splitting + domain \n[…]\nhavior (tested).\nReference impl for the C#/TS/Py/Go ports. Exhaustive tests incl. adversarial\nsudo/compound/extra-flag bash cases.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-deny-policy: consumer-supplied deny policy for the permission engi…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-17T16:06:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6246404b221824b5b524f954ed2807c1c15bd5ce",
          "body": "Adds the SmooAI 'smooth' plugin marketplace and enables smooth-agent@smooth so\nevery Claude Code session in this repo joins the th-mail agent bus (active +\nmailable), gets the /smooth command + agent-comms/pearls-flow skills, and picks up\nthe shared SmooAI repo guardrail hooks. Additive, dev-tooling only.\n\n\nClaude-Session: https://claude.ai/code/session_01Vg7frHqHSAUXhQiRNdr3NW\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Enable smooth-agent@smooth Claude Code plugin (#80)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-14T02:17:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3342487730583ce2e1ad3cf378f251070cd78c69",
          "body": "…ng (bump 0.16.2) (#79)\n\nThe streaming path (chat_stream — every chat turn) retried only transient\ntransport errors on `.send()`, then bailed immediately on any non-success HTTP\nstatus. A transient gateway 5xx (groq/LiteLLM 502/503 during an incident or\nload blip) therefore propagated as an AGENT_ER\n[…]\n\nretry, keep the request dump on final failure. Regression test serves 503→200+SSE\nfrom a throwaway local server and asserts the turn recovers.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-stream-5xx-retry: chat_stream retries retryable 5xx before streami…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-10T20:26:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b52384434a727b526a72027180bd40995adb1c1a",
          "body": "…ceiling clamp) (#78)\n\nPublished core tops out at 0.16.0, which predates LlmClient::with_model_ceiling\n+ AgentConfig::with_model_ceiling (added in d03fa10, EPIC th-1cc9fa). Server\n1.22.10 calls with_model_ceiling and requires core \"^0.16\", so external\ncargo builds resolve 0.16.0 and fail to compile. Cut 0.16.1 (additive, the new\nmethods are backward-compatible) so the API is available on crates.io.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-core-0161: publish core 0.16.1 (with_model_ceiling / model-output …",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-09T21:00:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0725020a4f57005e7f6aae5817395e6418057339",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#77)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T20:28:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7f07f52c5f4d58c41827bdacd91f8a67b7496c7",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#76)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T20:27:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4755fcc85b8adc528d369f757a54d144da6e5b0c",
          "body": "…ET parity) (#74)\n\nAgentOptions gains MaxOutputTokens (budget), ModelMaxOutputTokens (the model's\nhard output ceiling), and EffectiveMaxTokens = min(budget, ceiling) (never 0;\nnull budget leaves max_tokens unset; null/<=0 ceiling = graceful passthrough).\nSmoothAgent sends the clamped value as ChatOp\n[…]\n by the consumer, kept out of the published engine.\n\nBumps the NuGet package 1.4.0 -> 1.5.0 so the server can consume the new API.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-1cc9fa: model-output ceiling clamp + raise starvation defaults (.N…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T20:27:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab249047080ada7f7a3ad8383a1afe5a13feb674",
          "body": "…ty) (#73)\n\nPython parity for the Rust LlmClient output-ceiling clamp (th-562b6d/th-1cc9fa).\n\n- AgentOptions gains `model_max_output: int | None` (None = unknown = no clamp).\n- New `effective_max_tokens(max_tokens, ceiling)` helper: min(max_tokens, ceiling),\n  passthrough on None/<=0, never returns \n[…]\nable (clamp-down / passthrough / equal / zero-ceiling /\nnever-zero) + both agent request paths send the clamped value. 155 passed.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-1cc9fa: clamp max_tokens to model output ceiling (Python core pari…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T20:27:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4c580c58d45b21c5b4947a04a04825e042d0ca5",
          "body": "… engine) (#72)\n\nAdds AgentOptions.ModelMaxOutput (*int, nil = unclamped): every request's\nMaxTokens is clamped to min(MaxTokens, ceiling) so a budget/policy MaxTokens\ncan never exceed what the model can physically emit — otherwise a reasoning\nmodel burns its budget on reasoning_content and returns \n[…]\ne now that the ceiling caps runaway output. Go parity with the\nRust engine's LlmClient::with_model_ceiling / effective_max_tokens.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-1cc9fa: model-output ceiling clamp + raise starvation defaults (Go…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T20:27:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee1a601e15f5b7526f5c59d44ffdaf5d07d94c11",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#75)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T20:26:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c9110140073c9a09e8eff2f1d8500591cb6423e",
          "body": "…(#71)\n\nMirror the Rust engine's model-output ceiling clamp in the TypeScript core.\nAgentOptions gains `modelMaxOutput?: number`; a new exported\n`effectiveMaxTokens(configured, ceiling?)` computes min(maxTokens, ceiling)\n(floored at 1; undefined/0 => passthrough). Both the non-streaming `run` and\nst\n[…]\nent and return\nempty; groq-compound 400s at an 8192 output cap). No behaviour change when\nmodelMaxOutput is unset. EPIC th-1cc9fa.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-1cc9fa: clamp max_tokens to model output ceiling (TS core parity) …",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T20:26:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6739ae914ed1a624a6866fbc7972b79903aa8a53",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#70)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T15:15:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d03fa1087d8b81689322409b885b0467fdbc8c7c",
          "body": "* th-562b6d: clamp max_tokens to model output ceiling in LlmClient\n\nwith_model_ceiling(Option<u32>) + effective_max_tokens() = min(config.max_tokens,\nceiling). 4 request-build sites use it. None => passthrough (no behaviour change).\nCeiling sourced from gateway /model/info by the consumer (engine st\n[…]\nbuilds the client internally). None => unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-562b6d: clamp max_tokens to model output ceiling (LlmClient) (#69)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-08T15:14:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5145230548b16e46a5c65ec7b903e64c02009c02",
          "body": "…ening (#68)\n\nHand-bump the Rust engine crate 0.15.0 → 0.16.0 to publish the accumulated\nunreleased API changes to crates.io (crates.io 0.15.0 is immutable + predates\nthese). Minor bump — new public surface, backward-compatible.\n\nSince 0.15.0:\n- Multimodal message content: `Message.images` (OpenAI `\n[…]\n the separate\nTS `@smooai/smooth-operator-core` package). publish-crate.yml (workflow_dispatch)\nis triggered separately to upload.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "smooai-smooth-operator-core 0.16.0: multimodal images + SEP/Narc hard…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-06T02:46:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c7b21dbde4f31519b2eab3d5343f154119fe655",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#67)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-05T03:49:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c43816b225e6712193a046d0d4eda3726c1e93d7",
          "body": "* th-a62075: OS-level extension sandboxing design doc\n\nDesign pass for the platform-specific follow-up to th-210910. Documents the\nthreat model (a compromised extension binary can issue arbitrary syscalls the\nSEP/tool layer structurally cannot see — process tampering, mount/bpf/kernel\nmanipulation, \n[…]\ne in the\nimage (no writable host mount); the image is the integrity anchor.\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": "th-a62075: microVM isolation for SEP extensions (microsandbox) (#66)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-05T03:49:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fabb39652b04ddf2f3653050d9dfa6569d677c60",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#65)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-05T00:18:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fcb1bce5a8428797ae345eb37b111246b81235b",
          "body": "…romotion (#64)\n\ntool_search lets the LLM promote deferred tools on demand via substring\nmatch. The security concern: an injection payload (in a README/comment/test\nfixture) could make a read-only/oracle agent promote a deliberately-deferred\nexec/write tool (e.g. bash). This audit verifies the defen\n[…]\nermissionHook\ninvocation gate are sufficient, so no per-tool promote allowlist was added\n(documented in a ponytail: comment at the match site).\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-64b1ee: audit + harden tool_search against prompt-injection tool p…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-05T00:18:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "103eaa059cd63db4c1c753f092e9de7d30ee8e41",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#63)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T21:18:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c1c39a04ad6b478093ac742e8ae5656c2987d51",
          "body": "…t turn (#62)\n\n* th-25ce5c: AgentConfig.next_user_images — stage images for the current turn\n\nHost with a multimodal chat turn calls .with_user_images(imgs); run/\nrun_with_channel attach them to the turn's user message via\nMessage::user_with_images. Empty by default — text-only turns unchanged.\n\nCo-\n[…]\nhored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n* th-25ce5c: changeset for AgentConfig.with_user_images\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-25ce5c: AgentConfig.with_user_images — stage images for the curren…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T21:18:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b847592e31eb3bbf336d455d37478bf40167c79e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#61)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T21:03:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81791b7a41e4ca5ff624ca452290f94f5c2cebe4",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#60)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T21:03:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d23573757dff1460c39b37404e0dfa45238951a",
          "body": "…onger approve-once (#56)\n\nBefore this change every `Ask` verdict from the permission gate was a one-shot\nprompt: the same command re-asked on every run, and \"approve always\" had nowhere\nto go. That's friction that pushes operators toward AutoMode::Bypass, defeating\nthe gate.\n\nPort smooth's `wonk-al\n[…]\nrade an `Ask` — never waive a\n`Deny` circuit-breaker (tested). Load is robust: missing file → empty, malformed\n→ surfaced error, atomic writes.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-22bfc1: persist human approvals so the SEP permission gate is no l…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T21:03:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b222cbe578b25e1eab5f3d2e2d1cc3aedc1c1357",
          "body": "… (#55)\n\nSEP extensions run as JSON-RPC subprocesses. They were spawned with the host's\nfull environment and ambient authority, so any secret in the host process\n(cloud creds, API tokens) inherited straight into an extension — the\nlethal-trifecta exfiltration path — and an allow-listed extension bin\n[…]\nntegration test drives the real spawn path and proves a host-side\n`AWS_SECRET_ACCESS_KEY` is scrubbed while PATH and manifest env pass through.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-210910: harden SEP extension spawning — integrity gate + env scrub…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T21:03:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06ce2217e47afd45e12f1e2055379346e83a5868",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#59)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T21:01:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "399ba126539e1488ca2b9d66109c91e9c78ce89f",
          "body": "…re (#58)\n\nAdd Message.images (Vec<ImageContent>) + Message::user_with_images; the\nOpenAI-compat client emits a standard content-parts array (text +\nimage_url) when a user message carries images. Text-only turns are\nbyte-identical (skip_serializing_if). Guard the prompt-cache wrap path so\nit never f\n[…]\nattens image parts into a text block (would drop the images).\n\nFoundation for Big Smooth vision/document support (epic th-3be564).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-25ce5c: multimodal message content — image_url parts in the LLM wi…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T21:01:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9a50b3172f81e0d7e66f84bfa4537d9d8c782a7",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#57)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T20:57:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "666611f5c37d7d5ef657d6f207eacdfe1d1ea308",
          "body": "…s leaked secrets (#54)\n\nA tool result that leaks a secret used to reach the LLM/conversation verbatim:\n`post_call` took an immutable `&ToolResult`, so NarcHook could only detect and\nalert on a leaked credential, never remove it from what the model saw. Detection\nwithout redaction leaves the secret \n[…]\ns with `[REDACTED:<pattern>]`\nbefore the content propagates, while keeping the Block alert. Clean results and\ninjection findings are unchanged.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-10eb50: make ToolHook::post_call a redaction seam; NarcHook redact…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T20:57:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee648d18704f2630fea91e5fb14a7f37e18cf5ed",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#53)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T20:34:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84c2fac317a6685a65d22f366ff734359ec1b2a0",
          "body": "…g closed (#52)\n\nThe permission gate (th-d32ce6) blocked every Ask because the crate had no\ninteractive approver. PermissionHook now takes an optional approver over the\nsame HumanRequest/HumanResponse bridge ConfirmationHook uses (human_channel):\non Ask it sends a Confirm and blocks on the response \n[…]\nfault window; no\nchannel → fail closed as before. Deny is never routed to the human, so\ncircuit-breakers stay non-waivable (regression-tested).\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-6b3ab4: route Ask permission verdicts to a human instead of failin…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T20:34:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "56e9bf969aa4922f5d997de6b042c51fd97a8f43",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#51)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T14:35:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c04808a6a01e253ca6e4ab74eb3a1b37abc0a65e",
          "body": "…mpt injection (#50)\n\nThe SEP ExtensionHost sent extension tool arguments to the subprocess unscanned\nand returned tool-result content to the model verbatim — no secret-detection or\nprompt-injection scanning at the extension boundary. The just-merged\nPermissionHook (th-d32ce6) gates allow/ask/deny b\n[…]\nte gating. 30 exhaustive tests incl. per-pattern\npositive/near-miss, pre_call block, post_call detect, and a live-on-registry\nintegration test.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-5f7227: scan SEP extension tool args + results for secrets and pro…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T14:34:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a0e8fbe3bb13038461be85cc138dd24f8658cc22",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#49)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T13:10:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72c646bb3103bd343fd4e5b05c928adb64aae515",
          "body": "…er (#47)\n\nThe SEP ExtensionHost executed extension-contributed tools with no\npermission gate — once an extension cleared the load allowlist it ran any\ntool freely: no allow/ask/deny model, no dangerous-command classifier, no\ncircuit-breakers (tool_proxy.rs forwarded tool/execute straight through).\n\n[…]\nOTH_AUTO_MODE env var; SEP integration tests opt into Bypass (hard\ncircuit-breakers still fire). Interactive Ask routing deferred to th-6b3ab4.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-d32ce6: gate SEP extension tool calls behind a permission classifi…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T13:10:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "476231b6c6a3641920ae567b9933bc02c154704f",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#48)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T13:06:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aef7a892c0ab767d394315213c41d2da9a3e0650",
          "body": "…(#46)\n\nAn SEP extension's `tool_call` hook fires over every pending call the model\nmade — native tools (bash, file-write) included — and a `Modify` verdict was\napplied verbatim as a full `{tool, arguments}` replacement with no validation.\nEnabling ANY extension therefore let its hook silently rewri\n[…]\nify\nare unchanged. Adversarial unit tests cover tool-rename, native-tool rewrite,\nforeign-extension rewrite, and the legitimate own-tool cases.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-f0e020: SEP — scope extension tool_call Modify to owned-tool args …",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-04T13:05:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c01c23c173de42d7b744221bf2e3a838a1ee1102",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#45)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:49:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef39b438fbafb85e17a017d76b0ce98750417ed4",
          "body": "…art hooks, widget/key, message renderers (#44)\n\n- Inter-extension bus: bus/publish -> bus/event fanout (BusRegistry, Weak process\n  refs to avoid a cycle, reload-safe shared subscription handles)\n- Wire the `context` (messages-replace, pi-friendly {role,content}) and\n  `before_agent_start` (system-\n[…]\nts for bus fanout, widget/key\n  routing, message renderers, context + before_agent_start rewrites\n\nCloses th-c1187e (before_agent_start wiring).\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-7bd3d5: SEP Phase 8 (engine) — bus fanout, context/before_agent_st…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:49:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aa2fe7bca0f6b16ad806c820908ede085dc65461",
          "body": "… (#43)\n\nShips the Extensions module (th-0215f2) + phase 7/8 engine work merged on\nmain. Unblocks smooth-operator#169 (C# server SEP wiring).\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "dotnet: bump SmooAI.SmoothOperator.Core to 1.4.0 (SEP extension host)…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:31:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "40857e3daff4de9b957a27533ff4833c326e5d87",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#42)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:20:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50919e12f2f6d9d337cc68c167885aeccff57e7c",
          "body": "…s (#41)\n\n* th-0c913f: build @smooai/smooth-operator-core before packing (prepack)\n\nThe Release workflow runs `changeset publish` with no build step and the package\nhad no prepack/prepare hook, so recent tarballs (0.9.0, 0.10.0) shipped with no\n`dist/` — every import of the package 404s. Add `prepac\n[…]\n also build core in root ci:publish (defense-in-depth, mirrors operator repo)\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": "th-0c913f: build core before packing (prepack) — fix distless tarball…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:19:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "750a0f733bd3c220ca979cb894366330a0921889",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#40)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:13:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd80532ae2391cbf05aafd42d7d1fd56ec3c33e1",
          "body": "The Smooth Extension Protocol host existed only in Rust. Port it to C#\nunder SmooAI.SmoothOperator.Core.Extensions, mirroring the Rust\nextension module's semantics in idiomatic Microsoft.Extensions.AI:\n\n- ExtensionManifest/ExtensionDiscovery: extension.toml discovery (Tomlyn),\n  global+project merge\n[…]\nons.Tools.\n\nAdditive: nothing runs unless a caller builds an ExtensionHost. Exhaustive\nunit tests + live subprocess tests over a Node echo peer.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-0215f2: SEP — port the ExtensionHost to the .NET engine core (#35)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:12:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d865e2732695d6658d0cf03ea87edbde86fd5a1e",
          "body": "…NPM_TOKEN (#39)\n\nchangeset publish ran with no npm credentials (ENEEDAUTH; latest stuck at\n0.1.1 while main is 0.8.0). Mirror publish-npm.yml's working setup: set\nregistry-url on setup-node and pass NODE_AUTH_TOKEN from the org secret.\nPearls th-7f08f2 / th-422002.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(release): npm auth for changeset publish — registry-url + SMOOAI_…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:12:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "914a3ab637415407411df4493c6c27ec5bda9ae6",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#38)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:09:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c922f7b69a2cfc6c93103a0ef5d94e5b5463a0e9",
          "body": "Add go/core/extension — the Go engine's SEP (Smooth Extension Protocol)\nhost, mirroring the Rust reference (rust/smooth-operator-core/src/extension)\nidiomatically: extension.toml discovery + project-wins merge, a\ngoroutine/channel JSON-RPC ndjson subprocess spawner (pending map,\ngeneration-guarded r\n[…]\nve fold + context-guard adversarial cases),\nvendored SEP conformance-fixture replay, and live subprocess tests against a\nself-re-exec echo peer.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-829d9f: port SEP ExtensionHost to the Go engine core (#36)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:09:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4a4924ca32a69619b5aa0348189cf781b734b0c",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#37)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:03:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75b91dcf61724424f62da2753ca5a77352fb13c2",
          "body": "The SEP host existed only in Rust. Port the ~110KB extension module to the\nTypeScript engine as a new `@smooai/smooth-operator-core/extension` subpath,\nmirroring the Rust reference's semantics (not its structure):\n\n- protocol.ts — JSON-RPC/ndjson frame types + method/error constants, host view\n  of \n[…]\nsult patch; enabled_tools array-filter parity; untrusted-workspace skip).\nPurely additive — nothing runs until a caller builds an ExtensionHost.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-0c913f: port SEP ExtensionHost to the TypeScript engine core (#34)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:02:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68ad81510678e82e3cb4fb423960a69aa0e87309",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#32)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:02:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5d1068578cd90bec975f367935bedf757f0da82",
          "body": "The Smooth Extension Protocol host existed only in Rust. Add a faithful asyncio\nsibling under smooth_operator_core.extension (protocol, manifest, process, host,\ntool_proxy) so a Python host can spawn extension.toml extensions, register their\ntools, chain their hooks, and bridge ext->host requests th\n[…]\nxtensionHost. Exhaustive unit tests + shared conformance-fixture replay + a\nlive echo-peer integration test (tool proxy + enabled_tools parity).\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-66251a: Port SEP ExtensionHost to the Python engine core (#33)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T12:01:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46fbbeab111d382ed4dd65a45ed45ab8eba05be7",
          "body": "…streaming + set_model (#31)\n\nExtensions can now contribute LLM providers to the host. Additive: nothing runs\nunless a host attaches an ExtensionHost.\n\n- Declarative ProviderRegistration on the initialize/registry-update\n  registrations; ExtensionHost::providers() surfaces the merged set.\n- Extensio\n[…]\nP event name.\n- sep-echo-peer gains SEP_ECHO_PROVIDER mode; sep_provider_path.rs exercises the\n  whole path live through the real ExtensionHost.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "th-287d54: SEP Phase 7 (engine) — registerProvider + OAuth + proxied …",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T11:22:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f477a1b09dab508a19e7b4529a7b43aeb5c0adef",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#30)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T08:33:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26b4489cad74657ae54b0949c1f0965d6d76e27c",
          "body": "ExtensionHost gains command dispatch (command/execute + command/complete),\nthe session-action delegate seam (send_message/send_user_message/append_entry)\nguarded by the command-tier + epoch context check (-32003 ContextViolation),\nand hot reload (session_shutdown → epoch fence → respawn → re-init →\n\n[…]\non_start). New protocol types for commands/shortcuts/flags/session +\nsep-echo-peer command support. Additive: no host attached = unchanged loop.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SEP Phase 4 (engine): commands, session actions, hot reload (#29)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T08:33:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "44666ad18dd1bf81fa83a0030a1630212a6fbbd9",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#28)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T07:16:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c3008beb76e06cf4708608317bdc4e750749def",
          "body": "ExtensionHost::load now forwards a ui_capabilities list into each extension's\ninitialize params so a host declares which ui/request kinds its frontend can\nrender. The ext→host ui/request seam and headless -32001 NoUI default landed in\nPhase 2; this closes the loop so extensions can gate their UI (hasUI). Adds a\nSEP_ECHO_UI round-trip mode to the reference peer + sep_ui_path integration test.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SEP Phase 3 (engine): thread ui_capabilities through the handshake (#27)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T07:16:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "02b1f63555031128963627e130794ddba7c9d73e",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#26)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T06:50:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2466187191d598cb2e010c5e1761964ab667fc35",
          "body": "…lt) (#25)\n\nObserve events fan out end-to-end with per-connection seq numbers and a\nbounded, oldest-shedding observe lane (never sheds requests) that delivers an\nevents_lost marker on recovery. Subscriptions clamp to manifest capabilities.\nWire event names mirror pi (tool_execution_*, message_*, tur\n[…]\nlling\nthe turn. Zero behavior change with no ExtensionHost attached.\n\nbefore_agent_start run-loop wiring deferred (host method exists + tested).\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SEP Phase 2: event bus + intercept tier (tool_call Modify + tool_resu…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T06:50:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a90e22a40d2c0f752cfa3cc57802ec36cfeb05b",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#24)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T00:43:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecb64876a9c26ec8b0742ece7d1ef65bfbe3668c",
          "body": "with_extension_host registers extension tools into the agent's ToolRegistry\nunder dotted <ext>.<tool> names (eager via register_arc, deferred via the new\nregister_deferred_arc), so they are ordinary registry tools: LLM-visible via\nschemas(), dispatched via execute(), and filtered by the same retain(\n[…]\nsers/brentrager/.claude/plans/greedy-yawning-petal.md. Epic th-2def2a.\n\n\nClaude-Session: https://claude.ai/code/session_01SqrZj2fVMqiHbSJSte3XbA\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SEP Phase 1: complete engine tool path (th-b0cc5e) (#23)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-03T00:43:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a2ddc8b9ea239f4de75cc7fdc52a91a73099ccfd",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "🦋 New version release (#22)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-02T19:07:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d5b4f6f98e529adda12d2351dfc5f9d6c1a64f8",
          "body": "Add the SEP (Smooth Extension Protocol) engine host — the additive\n`extension` module in smooth-operator-core: JSON-RPC wire types, extension.toml\ndiscovery/merge, a generation-guarded subprocess, ExtensionHost hook chaining\nwith fail-open/closed policy + headless HostDelegate, and ExtensionTool.\n\nA\n[…]\nWire spec + conformance fixtures live in smooth-operator (branch sep-phase0-spec).\nPlan: /Users/brentrager/.claude/plans/greedy-yawning-petal.md\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SEP Phase 0: engine reference host (th-6d1794) (#21)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-02T19:06:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b898c80ccfab9e3fa3b8188a6489fe17a9839078",
          "body": "Companion to assets/smooth-logo.svg (wide wordmark). Square icon\n(viewBox 0 0 150 150).\n\n\nClaude-Session: https://claude.ai/code/session_014pdFZByoK3RHMLDxprkdpx\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add smooth-icon.svg — canonical square smooth (th) brand icon (#20)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-02T01:30:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "21da9c636c62d43f2d369883fa8b1115bfe18873",
          "body": "…ningDelta\n\nMinor bump (0.x breaking slot): AgentEvent gains a ReasoningDelta variant so\nreasoning streams as a distinct channel, not TokenDelta. Published for the\nsmooth-daemon epic (th-c89c2a) to consume via a versioned crates.io dep.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01RuPU8KGE7exadVU6Gi9hBs",
          "is_bot": false,
          "headline": "smooai-smooth-operator-core 0.15.0: reasoning rides AgentEvent::Reaso…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-07-01T00:03:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "310fdc716de8d5826113ce1625f1dc1527fb434f",
          "body": "…enDelta\n\nA reasoning model's separate thinking channel (StreamEvent::Reasoning) was\nre-emitted as TokenDelta, bleeding chain-of-thought into the visible answer.\nEmit it as a new ReasoningDelta variant instead, so consumers can surface it as\nlive 'thinking' without it folding into the answer. The ac\n[…]\nriant (they just stop showing reasoning).\nPearl th-4d8682.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01RuPU8KGE7exadVU6Gi9hBs",
          "is_bot": false,
          "headline": "agent: reasoning rides a distinct AgentEvent::ReasoningDelta, not Tok…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-29T23:02:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22905baca6a17c45634d92b8c993cecc9bc39010",
          "body": "npm 0.1.0→0.1.1, PyPI 1.3.0→1.3.1, NuGet 1.3.0→1.3.1, crate 0.14.0→0.14.1.\nRegistries only surface the latest version's README, so a republish is needed for\nthe new on-brand package READMEs (#18) to appear on the storefronts.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv",
          "is_bot": false,
          "headline": "release: patch-bump all engine packages to ship the branded READMEs",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T14:10:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c1f0ea48e420aaf5e6711db09cc9b233060906ae",
          "body": "…I/NuGet/crate/Go) (#18)\n\nThe registry pages (npm, PyPI, NuGet, crates.io, pkg.go.dev) showed empty or\nplain, un-branded READMEs. This gives each published package a README that\nmatches the repo's glowed-up branding — banner-on-top layout, shields.io badge\nrow (incl. a per-ecosystem registry badge),\n[…]\nexisting banner.svg with the language-specific subtitle.\n\n\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: branded, on-brand READMEs for all 5 published packages (npm/PyP…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T14:08:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1562d9cb811024eabc6a644f35e2a2526a2f8624",
          "body": "Renders of .github/banner.svg with the language subtitle swapped (TypeScript/\nPython/Go/C#.NET), so each published package's README shows an on-brand banner\nmatching its language. Referenced by absolute raw.githubusercontent URL since\nnpm/PyPI/NuGet/crates.io don't resolve relative paths.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv",
          "is_bot": false,
          "headline": "assets: per-language banner art for the polyglot package READMEs",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T13:59:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84d5c86cec79c5d6127158ea43290ca4c6381a57",
          "body": "Add docs/Polyglot-Engines.md: a single reference for the published\npolyglot engine library across Rust, TypeScript, Python, Go, and C#.\nCovers what it is + the engine/service topology, the at-parity feature\nsurface, and a verified minimal \"hello agent\" (mock provider, one turn)\nper language with the\n[…]\nts to the doc from the README repository\nlayout section.\n\n\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: polyglot engines — install + usage for all 5 languages (#17)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T04:10:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4bb138f6d8be6a8e08ac493af126e40d77bb452a",
          "body": "NPM_CONFIG_PROVENANCE requires repository.url to match the GitHub source; it was\nempty, so the publish uploaded the provenance bundle then npm rejected with E422.",
          "is_bot": false,
          "headline": "fix(ts): add repository.url to package.json (npm provenance E422 fix)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T03:56:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b03208b412a10930ba7d9e007dd83c576312d9e9",
          "body": "…ld to dist, drop private)\n\nIt was `private: true` with `exports: ./src/index.ts` — so pnpm silently skipped\npublishing it (the workflow 'succeeded' but uploaded nothing; npm 404) and a consumer\ncouldn't import raw TS. Now: tsc build → dist (.js + .d.ts), proper exports/main/types/\nfiles, and the pu\n[…]\nacking. Caught by a post-publish\n`npm install` smoke test.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv",
          "is_bot": false,
          "headline": "fix(ts): make @smooai/smooth-operator-core a publishable package (bui…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T03:54:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "49077b6608025f2b6da4f4877394ba0deb4668dc",
          "body": "…o root\n\nThese changesets (already-merged Rust features SMOODEV-1472/1973-1976) targeted\n@smooai/smooth-operator-core-monorepo (private, never published) and drove no real\nversion/publish — the Rust crate versions manually via publish-crate.yml, and the\npolyglot engines publish via the per-language \n[…]\nhe\nper-language publish workflows remain the publish path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv",
          "is_bot": false,
          "headline": "chore(release): remove inert changesets targeting the private monorep…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T03:16:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "485f44da25ddf2da01cb31ab51f35838953d39d5",
          "body": null,
          "is_bot": false,
          "headline": "release(python): update uv.lock for 1.3.0 (uv sync --locked in publish)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T03:02:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "899d283ff9b5a1ba99663db8e31add280333abaa",
          "body": "…ish from core; PyPI had 1.2.0)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv",
          "is_bot": false,
          "headline": "release(python): bump smooai-smooth-operator-core 1.1.0 → 1.3.0 (publ…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T03:01:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fe635108da329164467615204f3d2ff7381e24fe",
          "body": "…sh from core; backfill #41 Vector/Workflow/ToolSearch/LlmProvider)\n\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv",
          "is_bot": false,
          "headline": "release(dotnet): bump SmooAI.SmoothOperator.Core 1.1.0 → 1.3.0 (publi…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T02:47:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ae32d0d46cbf01a10f18aeaac7e5c38337b663f",
          "body": "…m here) (#16)\n\nMove the native C# agent engine (SmooAI.SmoothOperator.Core) out of the\nsmooth-operator SYSTEM repo and into smooth-operator-core, the polyglot ENGINE\nlibrary, so the C# engine is published from the same repo as the Rust/Python/\nTS/Go engines.\n\nEngine copied verbatim from smooth-oper\n[…]\ntive only — smooth-operator is not touched in this phase.\n\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "migrate: C# engine into smooth-operator-core (additive; published fro…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T02:26:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e70920e87b866b220bbeb581eea7f12b1ef182b5",
          "body": "* migrate: TypeScript engine into smooth-operator-core (additive; published from here)\n\nCopy the self-contained TypeScript agent engine (@smooai/smooth-operator-core,\nv0.1.0) from smooth-operator/typescript/core into this repo's typescript/core,\nwhere it now lives alongside the Rust reference, the C\n[…]\n4.8 (1M context) <noreply@anthropic.com>\n\n* fix(ci): declare injectWorkspacePackages to match lockfile (frozen-install)\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "migrate: TypeScript engine into smooth-operator-core (additive) (#13)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T02:24:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a677434e05dc784fd331c63d179121fd5d9486ee",
          "body": "… from here) (#15)\n\nThe native Python engine (`smooai-smooth-operator-core`, v1.1.0) was living in\n`smooth-operator/python/core` but belongs in `smooth-operator-core` — the\npolyglot ENGINE library. This copies it in verbatim (src/tests/pyproject/README,\nplus uv.lock) so the package is built and publ\n[…]\nre`/1.1.0); the third-party dependency set is\nunchanged.\n\n\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "migrate: Python engine into smooth-operator-core (additive; published…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T02:24:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39792a76757886a8d9e9734561f0f4732588364c",
          "body": "…th) (#14)\n\nMove the Go smooth-operator engine from smooth-operator/go into this repo's\ngo/ directory (previously a planned-only placeholder). This is the additive\nphase of the polyglot-engine consolidation: smooth-operator-core is the engine\nlibrary, smooth-operator is the system that consumes it.\n\n[…]\n, protocol 30, e2e build-only). go.mod/go.sum tidy-clean.\n\nClaude-Session: https://claude.ai/code/session_01U7Mn93HpqhSgEmX6tRdPAv\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "migrate: Go engine into smooth-operator-core (additive; new module pa…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-24T02:24:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d894dc6b7bd99f65a7ba89ed7ee17b04c2744c4",
          "body": "AgentTurnInput gains wait_tool: a built-in durable wait. When the model calls it\nwith an integer `seconds` arg, AgentTurnWorkflow sleeps on a Temporal timer\n(ctx.timer) instead of dispatching an activity. The pause is in workflow history,\nso it survives restarts and can span days — an agent can paus\n[…]\ne.\n\n363 default tests pass; clippy --all-targets -D warnings clean (default +\ntemporal); durable-timer e2e passes locally (~1.5s).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SMOODEV-1976: Durable timers / self-scheduling agents (#12)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-21T01:50:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2893eb9560207e18c398fc03fbabcd1320102479",
          "body": "A turn whose model calls an approval-gated tool blocks AgentTurnWorkflow until an\napprove_tool/deny_tool signal names that tool call. The block is recorded in\nworkflow history, so it survives restarts and can resolve hours later — the\nHITL-over-protocol shape that was previously deferred, with no mi\n[…]\nkips\noffline. 363 default tests pass; clippy --all-targets -D warnings clean (default\n+ temporal); hitl e2e passes locally (~11s).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SMOODEV-1975: Durable human-in-the-loop via Temporal signals (#11)",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-20T19:52:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4aecb8f9626d7d54d7b29ab3778e7cef590e3181",
          "body": "…turn on Temporal (#10)\n\nProves the per-step durability design end to end: an agent turn runs as a\nTemporal workflow whose model/tool calls are durable activities, driving the\nengine's deterministic drive_turn UNCHANGED. One loop, two backends.\n\nCore: relax AgentActivities to ?Send. A workflow-backe\n[…]\nfline.\n\n363 default tests pass, clippy --all-targets -D warnings clean (default + temporal);\nagent-turn e2e passes locally (~10s).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SMOODEV-1974: Wire AgentTurnWorkflow driving drive_turn — real agent …",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-20T19:12:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dfb1864eb4ede7d9088eaf253b70cf4206fd5d08",
          "body": "…er integration harness (#9)\n\nNew crate for optional Temporal-backed durable execution (ADR-030). The preview\nTemporal SDK + workflow/executor wiring sit behind the `temporal` cargo feature\n(off by default), so the engine's default build stays zero-infra.\n\n- Always-compiled serde DTO boundary (Model\n[…]\n tests, clippy --all-targets -D warnings clean); the\nephemeral-server e2e passes locally in ~17s (downloads the CLI on first run).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SMOODEV-1974: Add smooth-operator-temporal crate + ephemeral-dev-serv…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-20T19:00:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10c6150136ad8046e10418e3dc3e4a3761f967d2",
          "body": "…tivities surface (#8)\n\nThe keystone of the fine-grained durable executor (ADR-030). Factors a turn into\nthe side-effecting boundary (AgentActivities: model_call + tool_invoke — the\nTemporal-activity steps) and the deterministic orchestration (drive_turn — the\nloop, no I/O/clock/RNG). The same drive\n[…]\n produces the same message\nsequence as Agent::run for an identical script. 360 tests pass, clippy\n--all-targets -D warnings clean.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SMOODEV-1974: Add deterministic drive_turn orchestration over AgentAc…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-20T18:36:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d0b2dfd2ab914b044645b1e734e65474d6baf94a",
          "body": "… seam) (#7)\n\n* SMOODEV-1973: Add AgentExecutor trait + InProcessExecutor (turn-execution seam)\n\nIntroduce an AgentExecutor abstraction that decides where/how an agent turn\nruns, while Agent stays the orchestration unit. InProcessExecutor is the\ndefault zero-infra backend — a verbatim delegation to \n[…]\n973: Add changeset for AgentExecutor seam (minor)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SMOODEV-1973: AgentExecutor trait + InProcessExecutor (turn-execution…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-20T16:15:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0d46117121e5f517c141909127af017fee280c78",
          "body": "…s) to LLM client (#6)\n\nThe general-agent brain must emit a typed JSON object every turn; this lands\nthe keystone capability on the Rust engine's LLM client.\n\nAPI:\n- ResponseFormat::JsonSchema { name, schema, strict } + json_schema() ctor\n- LlmClient::chat_structured / chat_with_format; chat delegat\n[…]\nl_choice; tool input surfaced back as the JSON content\n\nStreaming structured output and agent-level wiring deferred as follow-ups.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "SMOODEV-1472: Add structured output (JSON-schema constrained response…",
          "author_name": "Brent Rager",
          "author_login": "brentrager",
          "committed_at": "2026-06-14T18:30:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 20,
      "commits_last_year": 116,
      "latest_release_at": "2026-07-17T16:31:30Z",
      "latest_release_tag": "@smooai/smooth-operator-core@0.23.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 1.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/SmooAI/smooth-operator-core/go",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/SmooAI/smooth-operator-core/go",
          "is_deprecated": false,
          "latest_version": "v1.7.1",
          "repository_url": "https://github.com/SmooAI/smooth-operator-core",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-22T23:33:57Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 3,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "typescript/core/tsconfig.json"
      ],
      "toolchain_manifests": [
        "dotnet/core/src/SmooAI.SmoothOperator.Core.csproj",
        "dotnet/core/tests/SmooAI.SmoothOperator.Core.Tests.csproj",
        "go/go.mod",
        "rust/Cargo.toml",
        "rust/smooth-operator-core/Cargo.toml",
        "rust/smooth-operator-temporal/Cargo.toml"
      ],
      "largest_source_bytes": 185385,
      "source_files_sampled": 291,
      "oversized_source_files": 4,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go/go.mod",
        "package.json",
        "rust/Cargo.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": [
        "crates",
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "github.com/BurntSushi/toml",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.0"
        },
        {
          "name": "github.com/coder/websocket",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.14"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/santhosh-tekuri/jsonschema/v6",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v6.0.2"
        }
      ],
      "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": 2,
        "merged_prs": 96,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "brentrager",
          "commits": 116,
          "avatar_url": "https://avatars.githubusercontent.com/u/683871?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "dotnet-checks.yml",
        "go-checks.yml",
        "pr-checks.yml",
        "publish-crate.yml",
        "publish-npm.yml",
        "publish-nuget.yml",
        "publish-pypi.yml",
        "py-checks.yml",
        "release.yml",
        "ts-checks.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "pnpm-lock.yaml",
        "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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 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": 2,
            "reason": "8 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6bc028679bd7fc63dcb32a8d098b60abac95e5b5",
        "ran_at": "2026-07-23T22:49:08Z",
        "aggregate_score": 3.1,
        "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-22T23:34:21Z",
      "oldest_open_prs": [
        {
          "number": 81,
          "created_at": "2026-07-15T16:56:34Z",
          "last_comment_at": "2026-07-15T16:56:39Z",
          "last_comment_author": "changeset-bot"
        },
        {
          "number": 100,
          "created_at": "2026-07-22T23:52:01Z",
          "last_comment_at": "2026-07-22T23:52:04Z",
          "last_comment_author": "changeset-bot"
        }
      ],
      "last_merged_pr_at": "2026-07-22T23:33:58Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/SmooAI/smooth-operator-core",
    "host": "github.com",
    "name": "smooth-operator-core",
    "owner": "SmooAI"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 31,
        "vitality": 76,
        "community": 26,
        "governance": 53,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 76,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "commits_last_year": 116,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 8
            },
            "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": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "116 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 116
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 20,
              "latest_release_tag": "@smooai/smooth-operator-core@0.23.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 1.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "20 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.4
                    }
                  }
                ],
                "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": 26,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 5,
            "inputs": {
              "forks": 0,
              "stars": 3,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3 stars",
                "points": 4.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "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": 53,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "merged_prs": 96,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "96/98 decided PRs merged",
                "points": 37.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 96,
                      "decided": 98
                    }
                  }
                ],
                "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": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "followers": 6,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "SmooAI",
              "public_repos": 21,
              "account_age_days": 1108
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "6 followers of SmooAI",
                "points": 6.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 6,
                      "login": "SmooAI"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "21 public repos, account ~3 yr old",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 21
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/SmooAI/smooth-operator-core/go"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "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": "2 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "10 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": [
                "agent-orchestration",
                "ai-agent",
                "checkpointing",
                "langgraph-alternative",
                "llm",
                "multi-language",
                "polyglot",
                "rust",
                "workflows"
              ],
              "has_wiki": true,
              "homepage": "https://lom.smoo.ai",
              "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://lom.smoo.ai",
                "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": "9 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "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": 31,
        "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": 31,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.1
            },
            "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 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": "8 existing vulnerabilities detected",
                "points": 1.5,
                "status": "partial",
                "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": "moderate",
        "name": "AI Readiness",
        "value": 63,
        "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": 1,
              "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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "pnpm-lock.yaml",
                "uv.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "typescript/core/tsconfig.json"
              ],
              "agent_commit_share": 0.65,
              "toolchain_manifests": [
                "dotnet/core/src/SmooAI.SmoothOperator.Core.csproj",
                "dotnet/core/tests/SmooAI.SmoothOperator.Core.Tests.csproj",
                "go/go.mod",
                "rust/Cargo.toml",
                "rust/smooth-operator-core/Cargo.toml",
                "rust/smooth-operator-temporal/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "dotnet/core/src/SmooAI.SmoothOperator.Core.csproj, dotnet/core/tests/SmooAI.SmoothOperator.Core.Tests.csproj, go/go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "dotnet/core/src/SmooAI.SmoothOperator.Core.csproj, dotnet/core/tests/SmooAI.SmoothOperator.Core.Tests.csproj, go/go.mod"
                    }
                  }
                ],
                "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": "typescript/core/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "typescript/core/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "65 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 65,
                      "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 185385,
              "source_files_sampled": 291,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/291 source files over 60KB",
                "points": 54.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 291,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T22:49:24.686773Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/SmooAI/smooth-operator-core.svg",
  "full_name": "SmooAI/smooth-operator-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 agregadasGo.