Skip to main content
This page tracks notable changes to the platform API, Python SDK, and decimal-labs/regression-check GitHub Action. Dates use ISO 8601. The platform follows a rolling release model β€” changes ship to api.decimal.ai continuously. The SDK and Action follow Semantic Versioning and are tagged on GitHub. For breaking-change notices, subscribe to the GitHub release feeds: For what’s coming next, see the Roadmap.
SDK 0.13.3 β€” a LangChain run inside a generic trace is its child, and traces import works again
decimalai (0.13.3)
  • πŸ› A LangChain run inside a generic trace is now its child, not an unrelated root. With @decimalai.trace around the call and the LangChain adapter installed by instrument(), one logical run shipped as two root traces and the generic envelope arrived with zero llm_calls β€” 31.9% of the fleet’s langchain path, each graded keep at 1.0 for having used nothing. The adapter now sends the enclosing trace’s id as parent_trace_id, captured when the root run opens; an explicit sub-agent parent still wins. Known limit: the generic context is a ContextVar, so a run started through .batch(), RunnableParallel or an executor thread stays unlinked, exactly as before β€” never a wrong parent.
  • πŸ› decimalai traces import <file>.jsonl answered 422 on every call. It now posts multipart to /api/v1/traces/import, gains --agent-name (required for JSONL unless every row carries agent_name), and prints the server’s detail on an error instead of a bare status code.
  • πŸ› decimalai skills sync could overwrite uncommitted edits with the remote copy. The git commit time is now used only while SKILL.md is clean; a dirty file reports its mtime, so newer_wins sees the edit as newest.
  • πŸ› decimalai skills sync counts a frontmatter-only edit as metadata (~ <name> (metadata only β€” no new version)) instead of filing it under a key nothing printed.
  • πŸ› decimalai skills benchmark no longer crashes on a run with no measured lift β€” null pass_rate members render as β€”, and an error verdict wears βœ—.
  • ✨ update_skill(offer_scope=...) β€” "workspace" (default) offers the skill to every agent in the org; "restricted" only to the agents it has been assigned to. Metadata only; no new version.
SDK 0.13.2 β€” an ADK scaffold, provider-key guards, and a refused manifest no longer costing the trace
decimalai (0.13.2)
  • ✨ decimalai init --framework adk writes a runnable Google ADK agent β€” the fourth scaffoldable framework. Gemini by default (gemini-3.5-flash); a non-Gemini --model is refused up front, because decimalai[adk] installs no other provider.
  • ✨ Every generated file refuses to run without the provider key its MODEL needs, naming the variable and the Set: block decimalai init printed β€” instead of a traceback from inside the provider client after init() and instrument() have already made their calls.
  • ✨ smart_route() names WHY it returned an empty menu. degraded_reason is http_<status> / timeout / circuit_open / transport, so a Cloud Run edge abort is distinguishable from a slow read or an open breaker.
  • πŸ› A refused manifest registration no longer costs the trace. Re-registration moved off the caller thread onto the background sender (five jittered attempts, bounded), and the trace is held until an id exists rather than sent under one the platform never stored. Applies to every adapter that registers a manifest.
  • πŸ› decimalai init gave up on the first admission abort. Its /auth/verify, GET /agents and GET /agents/{name}/skills calls now retry a 429/502/503/504 twice (0.5 s, then 1.5 s; a short Retry-After wins). A 401/403 is a real answer and is never retried.
  • πŸ› The openai-agents scaffold died with a traceback when the model called a tool the file does not define β€” run() now catches ModelBehaviorError and returns a message naming the mismatch between the prompt’s Tools line and the tools attached to the Agent.
SDK 0.13.0 + 0.13.1 β€” routing budget, routing_status(), sub-agent traces, and the prompt ADK never recorded
decimalai (0.13.1)
  • πŸ› Every sub-agent trace was built and never sent. The LangChain adapter closed a run only when parent_run_id is None, which a nested .invoke() with its own CallbackHandler never sees. Runs now close on an open-chain balance, so multi-agent traces ship.
  • πŸ› The ADK adapter left the whole system prompt out of its traces. rendered_input came from llm_request.contents; the instruction β€” and every injected skill body β€” lives in config.system_instruction. It is recorded now, so a delivered skill is visible on the trace and to activation detection.
  • πŸ› One refused manifest registration no longer silences a LangChain agent for the life of the process β€” a failed POST /manifests was cached as registered; it is retried on the short ladder and re-attempted on the next trace.
  • ✨ decimalai.adk.instrument() / DecimalaiPlugin accept enable_load_skill_tool β€” accepted and dormant (ADK has no tool loop; True warns and stays on prompt injection).
decimalai (0.13.0)
  • πŸ› The hot-path routing budget was below what the platform serves. 0.12.0 capped /skills/route at 2 s against a healthy p95 of 1.39 s, so agents silently ran without skills. The budget is now 5 s, overridable with DECIMALAI_SKILL_ROUTE_TIMEOUT_S (clamped 0.5–30).
  • πŸ› Circuit-breaker cooldown starts at 5 s and doubles to a 30 s ceiling instead of a flat 30 s; opening logs at ERROR.
  • πŸ› ManifestTracker remembers every registered hash (bounded LRU) instead of re-registering an oscillating snapshot.
  • ✨ decimalai.routing_status() β€” companion to export_status(): healthy, breaker_open, consecutive_failures, timeouts, opens, read_budget_s, last_error, last_success_at.
SDK 0.12.0 β€” the scaffold delivers skill bodies, pydantic-ai, and an ADK skills rail
decimalai (0.12.0)
  • πŸ› decimalai init produced an agent that could not read any of its skills. On langchain β€” the default β€” inject_skill_body defaulted to False and the adapter registers no load_skill tool, so both body channels were off. inject_skill_body is now tri-state, resolved per adapter: no tool loop (langchain, anthropic, adk) β‡’ inject, because it is the only channel; a tool loop (openai_agents, pydantic_ai) β‡’ don’t double-deliver; an explicit init(inject_skill_body=…) / DECIMALAI_INJECT_SKILL_BODY always wins.
  • ✨ Google ADK has a skills rail. decimalai.adk.instrument(enable_skill_loader=True) appends the routed menu and body to llm_request.config.system_instruction. The 0.11.0 note that ADK β€œhas no prompt seam” was wrong.
  • ✨ decimalai init --framework pydantic-ai writes a runnable agent β€” the third scaffoldable framework; Pydantic AI owns a real tool loop, so bodies arrive through load_skill.
  • πŸ› The generated langchain file is now an agent (create_agent(...) with a real tool loop, not a bare init_chat_model); the openai-agents file passes an explicit max_turns.
  • πŸ› A single 5xx could destroy 50 buffered traces. 502/503/504 are retried and the buffer survives 5xx and httpx.RequestError; it is cleared only on 4xx and serialization failures.
SDK 0.11.1 β€” load_agent() reads the prompt you configured in the dashboard
decimalai (0.11.1)
  • ✨ decimalai.load_agent(name) reads the system prompt you configured in the dashboard, so an edit there reaches production on the agent’s next run with no redeploy. Explicit, never injected; config.system_prompt is None only when the agent genuinely has none β€” every failure raises.
  • ✨ decimalai init <agent-name> now wires that prompt into the file it writes. Previously the LangChain file sent no system message and the openai-agents one hardcoded a placeholder, discarding what you typed in the dashboard.
  • ⚠️ A one-time warning when the agent name you passed was renamed β€” prompt and skills follow the rename, trace ingest does not, until you update instrument(agent_name=...).
SDK 0.11.0 β€” cacheable skill prefix, and a scaffold that writes your agent
decimalai (0.11.0)
  • ⚑ Skills now arrive as a cacheable prefix plus a one-line hint. The routed menu used to be one block that was rebuilt on every request. It is now split in two: a prefix listing every skill available to the agent, byte-identical from turn to turn, and a tail naming the one or two relevant to this request. The old block sat in front of your own prompt and invalidated the provider’s cache for everything behind it β€” a 2,000-token system prompt that should have been a cache hit became a full miss every time. The cost was never our tokens; it was yours. Automatic on LangChain, no code change; SkillRouter.build_prompt_parts() exposes it for hand-assembled prompts. Against an older platform it degrades to exactly the previous behaviour.
  • ⚠️ On LangChain, skills are now two system messages rather than one (stable first, hint second), both placed immediately after your own system message. They are kept adjacent to yours deliberately: langchain_anthropic raises Received multiple non-consecutive system messages for a system message placed after any human or AI turn, so the intuitive β€œput the hint next to the question” placement breaks every ChatAnthropic caller.
  • ✨ decimalai init <agent-name> writes a runnable agent.py. Point it at an agent you created in the dashboard and it generates a file wired to it β€” name bound, skills loaded at run time, one editable model line. See CLI reference. langchain and openai-agents only: frameworks whose adapter has no prompt seam are refused with the reason, because a file that traces perfectly while delivering none of your skills is worse than no file.
  • πŸ› Capped openinference-instrumentation-anthropic below 2.0.0. Its 2.0 major requires anthropic>=1.0.0 and, uncapped, dragged anthropic past the <1.0.0 cap that exists because the Anthropic instrumentor stops capturing the model turn against 1.x. Test extras only β€” anthropic is in no runtime extra.
Eval simplification β€” one execution contract, --runs replaces pass^k
skillevaluation (0.6.0, schema rev 2 β€” ADR-0007)
  • πŸ—‘οΈ One execution contract. The per-case mode enum (single_shot/agentic/explore/conversation), user_goal, environment, simulator, and policy_check are removed from eval.yaml. Every case is invoked once in a prepared workspace, may take multiple tool steps (max_turns caps them), and is graded on the whole trajectory by expectations (LLM judge) + validators (code). Policy-under-pressure skills are authored as seeded-transcript cases (the conversation-so-far is data in the prompt) instead of a scripted dialogue mode.
  • ♻️ --runs N replaces per-case trials / pass^k. Repetition is now a runner-level flag: the whole suite runs N times, uniformly, and results are averaged by mean β€” the headline’s expected value no longer depends on the repeat count. The old pass^k AND-fold (a case passed only if all k rollouts passed) is retired.
  • The should_trigger boolean, its trigger-only grader exemption, and the cases_skipped_trigger_only disclosure stay; trigger accuracy scoring (menu-selection simulation) is now a hosted-runner feature.
Platform
  • ✨ POST /skills/{skill}/benchmark/run gained a runs query parameter (1–10, default 1) β€” re-run the suite uniformly and average by mean.
  • The six removed per-case fields are ignored, not rejected, if an older client still sends them (no 422); existing suites keep working.
SDK (decimalai-python 0.9.0 β€” released 2026-07-23)
  • ♻️ skills benchmark --trials β†’ --runs N β€” a run-level parameter (does not modify your eval.yaml). --trials now exits with a clear redirect rather than silently changing behavior.
Progressive disclosure β€” the load_skill tool
Platform
  • ✨ Token-budgeted skill menus β€” the routing menu is now budgeted (~1,500 estimated tokens, max 30 rows) instead of a flat 100-row cap. GET /skills/menu responses gained desc_tokens, rows_total, truncated. POST /skills/route returns the full menu (strategy: "full_menu") when your whole eligible menu fits the budget β€” and skips the embedding round-trip.
  • ✨ Body endpoint guardrail β€” GET /skills/{skill_name}/body accepts max_chars (server-side trim with an explicit marker; response gains truncated + total_chars) and agent_name (resolves the exact version that agent was offered, honoring pinned subscriptions). The version field is now the concrete version number (previously the literal string "latest").
  • πŸ› Subscribed skills are now loadable β€” a skill subscribed from the public registry could appear in your menu while its body fetch returned 404. Body fetches now resolve through the same offer logic as the menu.
  • πŸ› Visibility scoping in routing β€” the menu only offers skills the calling user may see: personal skills to their creator, workspace skills to owning-workspace members (plus explicit shares). API-key calls keep org-wide behavior.
  • πŸ› Trigger-eval fidelity β€” Stage-M menu simulations no longer sample user-invoked skills as distractors (production menus never contain them), so menu_selection_rate grades on-distribution.
SDK (decimalai-python 0.9.0 β€” released 2026-07-23)
  • ✨ Native load_skill(name) tool β€” on openai_agents and pydantic_ai, install(enable_skill_loader=True) (renamed instrument(...) in 0.10.2) auto-registers a tool the model calls to pull a surfaced skill’s full body mid-turn. Budgeted: 3 bodies / ~6,000 estimated tokens per turn, 8 KB per body, 20s deadline; loads are recorded on the trace (skills_loaded_by_agent). Kill switch: init(load_skill_tool=False) or DECIMALAI_LOAD_SKILL_TOOL=0.
  • ✨ Body guardrail on prompt injection β€” inject_skill_body=True (all adapters) now trims and budgets injected bodies instead of injecting them un-trimmed.
SDK 0.6.0 β€” experiments API removed
SDK (decimalai-python 0.6.0)
  • πŸ—‘οΈ Removed the experiments API. The agent/dataset experiment runner (experiment(), run_experiment(), compare_experiments(), the offline Eval() helper) and the matching client methods backed /api/v1/experiments, which was never shipped and always returned 404. The endpoint has been formally retired. Use regression-check for pre-deploy A/B (POST /api/v1/regression-check), the regression timeline for post-deploy comparison, and skill version compare (/api/v1/skills/analytics/compare) for skill diffs.
Billing, playground, and reliability
Platform
  • ✨ Stripe billing end-to-end β€” checkout + customer portal wired through for self-serve plan upgrades.
  • ✨ Anthropic in Playground β€” the Claude provider now sits alongside OpenAI and Gemini in the prompt-testing playground.
SDK (decimalai-python)
  • ✨ atexit flush handler β€” buffered traces flush on script exit, so short-lived scripts no longer lose traces silently.
Demo sandbox + SkillScore v2
SDK 0.4.0 (pip install decimalai, requires Python 3.10+)
  • ✨ One-command demo sandbox β€” see both demos on seeded data in ~2 minutes, before instrumenting anything:
    • decimalai demo regression β€” seeds a v1β†’v2 agent change + trace corpus, runs the regression check, links straight to the impact report.
    • decimalai demo skills β€” seeds three skills with varied effectiveness, links to the ranked registry.
    • decimalai demo reset β€” removes all [Demo] -prefixed data; your own agents and skills are never touched.
  • ✨ decimalai init now surfaces the demo commands in its next-steps output.
Platform
  • ✨ SkillScore v2 β€” the registry score is now a quality-only composite (0–100): live eval pass rate + AI-judge quality, gated on sample size. Popularity and maintenance no longer affect the score. Skills under 10 activations/30d are relegated below scored skills in the default sort instead of hidden.
  • ✨ Leaderboard axes: Highest SkillScore (default) Β· Biggest lift (measured lift vs no-skill baseline) Β· Most Efficient (token savings) Β· Top live rating.
GitHub Action (decimal-labs/regression-check)
  • ✨ Honest behavioral nudge β€” when a PR’s diff contains a model change and behavioral-check is off, the impact comment now shows how many recorded calls can be verified and how (behavioral-check: real or post-deploy bisect). No fabricated counts.
  • πŸ”§ behavioral-check: mock no longer renders a meaningless equivalent/changed split (the mock stub always read ~100% changed); it now reports the eligible-call count and points at real.
Skills wedge release
The skill registry layer that knows what works β€” registry, router, and public skill pages shipped as one product.Registry
  • ✨ Per-model effectiveness on every registry skill β€” see the pass rate a skill gets on GPT-5 vs Claude Opus vs Gemini Flash, computed from production traces. β€œBest with” badge marks the highest-passing model.
  • ✨ Real β€œMost Effective” sort ranks by SkillScore (with a minimum-activations gate so cold-start skills don’t dominate). New separate sort=popular for raw activation count.
  • ✨ Activation sparkline on every public skill page β€” 30-day daily trend, server-rendered SVG, zero JS.
  • ✨ Version diff viewer lets unauthenticated visitors compare any two published versions side-by-side.
  • ✨ Popular forks surfaced on detail pages so consumers can find community-iterated variants.
  • ✨ Integration snippets (Python SDK Β· pull Β· curl Β· agent-runtime paths) on every detail page with copy-to-clipboard.
  • ✨ 25 new flagship official skills authored β€” code review, API design, data/SQL, prompt engineering, agent design, ops, docs, security. All Apache-2.0.
  • πŸ”§ Default browse ranks by measured effectiveness and relegates bulk-imported skills with under 10 activations. Use the Imported tab or search to see all 3,000+ imports.
Router (new docs)
  • ✨ The SkillRouter is now a first-class product surface with its own page in the API reference. Documents the three strategies (full menu / smart route / on-demand body), response shape, telemetry, policy controls, and smart-routing internals.
Share & embed
  • ✨ /skills/<slug> is the new canonical public URL for a registry skill, with a dynamic OG image. Updated: the legacy /public-catalog/<slug> path shipped alongside it but has since been retired β€” it no longer resolves publicly. Use /skills/<slug>.
  • ✨ OpenGraph cards dynamically rendered per skill β€” name, SkillScore, per-model row, activation count. Twitter, LinkedIn, and Slack unfurls show the effectiveness data on every share.
  • ✨ Embed widget at /embed/skills/<slug> β€” drop a 380Γ—180px iframe into a README or blog post showing live effectiveness. Light + dark theme via ?theme=.
CLI
  • ✨ decimalai skills pull <slug> β€” pull any public registry skill to disk with no signup. Writes ./<slug>/SKILL.md. Read-only (no fork, no telemetry); signup is only required to install + activate tracking.
New public registry endpoints
  • GET /api/v1/registry/skills/{id}/activations β€” daily activation series for the sparkline.
  • GET /api/v1/registry/skills/{id}/versions/{version_number} β€” body markdown for any published version (powers the public diff viewer).
  • GET /api/v1/registry/skills/{id}/lineage already existed; now surfaced on the public detail page as β€œPopular community forks”.
Phase 2 release
Platform
  • ✨ Skills lifecycle is generally available: create, version, fork, subscribe, publish to registry, analytics.
  • ✨ Public skills registry (/skills) with SkillScore effectiveness ranking (Quality / Popularity / Maintenance).
  • ✨ Prompt Testing playground promoted from internal tool to first-class feature (/playground), with BYOK support for OpenAI and Gemini.
  • ✨ Multi-agent topology graph + per-sub-agent compatibility dashboard.
  • ✨ Workspace CRUD + RBAC role model (Admin / Editor / Viewer), enforced server-side on every mutating endpoint. See Teams & Workspaces for the capability matrix.
  • πŸ”§ Manifest registration is idempotent by hash β€” repeated POST /manifests returns existing IDs.
SDK (decimalai-python)
  • ✨ decimalai.init(langchain=True | openai_agents=True | llamaindex=True | crewai=True | autogen=True | otel=True) covers 6+ frameworks.
  • ✨ Skill auto-discovery from .claude/skills/, .agents/skills/.
  • ✨ Bidirectional skill sync (POST /skills/sync + SkillRouter.pull_missing()).
  • ✨ @decimalai.trace() decorator for any Python function.
GitHub Action (decimal-labs/regression-check)
  • ✨ Initial release. Computes structural diff between PR manifest and production manifest; posts impact report as a PR comment.
  • ✨ manifest_only SDK mode for CI: runs manifest extraction without invoking the agent.
Phase 1 release
Platform
  • ✨ Hero workflow: manifest change β†’ batch compatibility re-score β†’ Impact Report banner β†’ Auto-Repair + Build Dataset stepper β†’ JSONL export.
  • ✨ Training Data Health dashboard at / (health ring, category bars).
  • ✨ Drift detection toast + sidebar compat badges.
SDK
  • ✨ First public version. Manifest capture, trace ingest, framework adapters.