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"
}