Public record
Software health reportschema 0.27.0 · metrics 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 stars⑂ 0 forkssince May 2026View on GitHub ↗

SmooAI/smooth-operator-core holds a health index of 55 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (81/100) and lowest on Community & Adoption (26/100). It was last updated today. A single contributor accounts for most of its recent work.

55
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

55
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Smoo AIOrganization
6 followers21 public repossince Jul 2023

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/SmooAI/smooth-operator-core/gov1.7.1-20 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

76Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
5.5/36Commit cadence — 8/52 weeks with commits
18/18Commit volume — 116 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year116
human_commit_share1
days_since_last_push0
active_weeks_last_year8

Release discipline

100Excellent
How it's scored
27/27Ships releases — 20 releases published
36/36Release recency — latest release 6 days ago
27/27Release cadence — a release every ~1.4 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count20
latest_release_tag@smooai/smooth-operator-core@0.23.0
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases1.4
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

26Critical · 18% of overall
How it's scored
4.9/60Stars — 3 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars3
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

53Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
0/46.8Issue resolution — no issues or no data
37.5/38.3PR acceptance — 96/98 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs96
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs2
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
6.1/25Owner reach — 6 followers of SmooAI
15.8/25Track record — 21 public repos, account ~3 yr old
Inputs used
followers6
owner_typeOrganization
is_verified
owner_loginSmooAI
public_repos21
account_age_days1,108
How it's scored
25/25Published & resolvable — 1 package(s) on go
35/35Publish recency — latest publish 0 days ago
12/20Version history — 2 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/SmooAI/smooth-operator-core/go
ecosystemsgo
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

81Good · 20% of overall
How it's scored
24/24CI workflows — 10 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://lom.smoo.ai
10/10Repository description
10/10Topics — 9 topics
10/10Wiki
Inputs used
topicsagent-orchestration, ai-agent, checkpointing, langgraph-alternative, llm, multi-language, polyglot, rust, workflows
has_wikiyes
homepagehttps://lom.smoo.ai
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

31At risk · 16% of overall
How it's scored
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.5License — 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 — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
1.5/7.5Vulnerabilities — 8 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3.1
Excluded from scoring (no data or not applicable): signed_releases. Remaining weights renormalized.

AI Readiness

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.

63Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
How it's scored
12.6/18One-command bootstrap — dotnet/core/src/SmooAI.SmoothOperator.Core.csproj, dotnet/core/tests/SmooAI.SmoothOperator.Core.Tests.csproj, go/go.mod (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
11/11Static type checking — typescript/core/tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 65 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum, pnpm-lock.yaml, uv.lock
has_dockerfileno
typed_languageyes
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
How it's scored
45/45Type-checkable code — Rust (statically typed)
54.2/55Manageable file sizes — 4/291 source files over 60KB
Inputs used
primary_languageRust
largest_source_bytes185,385
source_files_sampled291
oversized_source_files4

Key facts

3GitHub stars
1contributors
116commits, last 12 months
0days since last push
20releases
1bus factor
0open issues
crates.io, Go, npmpackage ecosystems

Data collection 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

More detail

OpenSSF Scorecard 3.1 / 10
3.1aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
2Vulnerabilities8 existing vulnerabilities detected
Direct dependencies 4
RegistryPackageVersion constraintManifest
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
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsGo.