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:
- SDK: https://github.com/decimal-labs/decimalai-python/releases
- Action: https://github.com/decimal-labs/regression-check/releases
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.tracearound the call and the LangChain adapter installed byinstrument(), one logical run shipped as two root traces and the generic envelope arrived with zerollm_callsβ 31.9% of the fleetβs langchain path, each gradedkeepat 1.0 for having used nothing. The adapter now sends the enclosing traceβs id asparent_trace_id, captured when the root run opens; an explicit sub-agent parent still wins. Known limit: the generic context is aContextVar, so a run started through.batch(),RunnableParallelor an executor thread stays unlinked, exactly as before β never a wrong parent. - π
decimalai traces import <file>.jsonlanswered 422 on every call. It now posts multipart to/api/v1/traces/import, gains--agent-name(required for JSONL unless every row carriesagent_name), and prints the serverβsdetailon an error instead of a bare status code. - π
decimalai skills synccould overwrite uncommitted edits with the remote copy. The git commit time is now used only whileSKILL.mdis clean; a dirty file reports its mtime, sonewer_winssees the edit as newest. - π
decimalai skills synccounts a frontmatter-only edit asmetadata(~ <name> (metadata only β no new version)) instead of filing it under a key nothing printed. - π
decimalai skills benchmarkno longer crashes on a run with no measured lift β nullpass_ratemembers render asβ, and anerrorverdict 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 adkwrites a runnable Google ADK agent β the fourth scaffoldable framework. Gemini by default (gemini-3.5-flash); a non-Gemini--modelis refused up front, becausedecimalai[adk]installs no other provider. - β¨ Every generated file refuses to run without the provider key its
MODELneeds, naming the variable and theSet:blockdecimalai initprinted β instead of a traceback from inside the provider client afterinit()andinstrument()have already made their calls. - β¨
smart_route()names WHY it returned an empty menu.degraded_reasonishttp_<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 initgave up on the first admission abort. Its/auth/verify,GET /agentsandGET /agents/{name}/skillscalls now retry a 429/502/503/504 twice (0.5 s, then 1.5 s; a shortRetry-Afterwins). A 401/403 is a real answer and is never retried. - π The
openai-agentsscaffold died with a traceback when the model called a tool the file does not define βrun()now catchesModelBehaviorErrorand 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 ownCallbackHandlernever 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_inputcame fromllm_request.contents; the instruction β and every injected skill body β lives inconfig.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 /manifestswas cached as registered; it is retried on the short ladder and re-attempted on the next trace. - β¨
decimalai.adk.instrument()/DecimalaiPluginacceptenable_load_skill_toolβ accepted and dormant (ADK has no tool loop;Truewarns and stays on prompt injection).
0.13.0)- π The hot-path routing budget was below what the platform serves. 0.12.0 capped
/skills/routeat 2 s against a healthy p95 of 1.39 s, so agents silently ran without skills. The budget is now 5 s, overridable withDECIMALAI_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.
- π
ManifestTrackerremembers every registered hash (bounded LRU) instead of re-registering an oscillating snapshot. - β¨
decimalai.routing_status()β companion toexport_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 initproduced an agent that could not read any of its skills. Onlangchainβ the default βinject_skill_bodydefaulted toFalseand the adapter registers noload_skilltool, so both body channels were off.inject_skill_bodyis 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 explicitinit(inject_skill_body=β¦)/DECIMALAI_INJECT_SKILL_BODYalways wins. - β¨ Google ADK has a skills rail.
decimalai.adk.instrument(enable_skill_loader=True)appends the routed menu and body tollm_request.config.system_instruction. The 0.11.0 note that ADK βhas no prompt seamβ was wrong. - β¨
decimalai init --framework pydantic-aiwrites a runnable agent β the third scaffoldable framework; Pydantic AI owns a real tool loop, so bodies arrive throughload_skill. - π The generated
langchainfile is now an agent (create_agent(...)with a real tool loop, not a bareinit_chat_model); theopenai-agentsfile passes an explicitmax_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_promptisNoneonly 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_anthropicraisesReceived multiple non-consecutive system messagesfor 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 runnableagent.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.langchainandopenai-agentsonly: 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-anthropicbelow 2.0.0. Its 2.0 major requiresanthropic>=1.0.0and, uncapped, draggedanthropicpast the<1.0.0cap that exists because the Anthropic instrumentor stops capturing the model turn against 1.x. Test extras only βanthropicis 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
modeenum (single_shot/agentic/explore/conversation),user_goal,environment,simulator, andpolicy_checkare removed fromeval.yaml. Every case is invoked once in a prepared workspace, may take multiple tool steps (max_turnscaps them), and is graded on the whole trajectory byexpectations(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 Nreplaces per-casetrials/ 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_triggerboolean, its trigger-only grader exemption, and thecases_skipped_trigger_onlydisclosure stay; trigger accuracy scoring (menu-selection simulation) is now a hosted-runner feature.
- β¨
POST /skills/{skill}/benchmark/rungained arunsquery 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.
decimalai-python 0.9.0 β released 2026-07-23)- β»οΈ
skills benchmark --trialsβ--runs Nβ a run-level parameter (does not modify your eval.yaml).--trialsnow 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/menuresponses gaineddesc_tokens,rows_total,truncated.POST /skills/routereturns 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}/bodyacceptsmax_chars(server-side trim with an explicit marker; response gainstruncated+total_chars) andagent_name(resolves the exact version that agent was offered, honoring pinned subscriptions). Theversionfield 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:
personalskills to their creator,workspaceskills 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_rategrades on-distribution.
decimalai-python 0.9.0 β released 2026-07-23)- β¨ Native
load_skill(name)tool β onopenai_agentsandpydantic_ai,install(enable_skill_loader=True)(renamedinstrument(...)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)orDECIMALAI_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 offlineEval()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.
decimalai-python)- β¨
atexitflush 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 initnow surfaces the demo commands in its next-steps output.
- β¨ 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.
decimal-labs/regression-check)- β¨ Honest behavioral nudge β when a PRβs diff contains a model change and
behavioral-checkis off, the impact comment now shows how many recorded calls can be verified and how (behavioral-check: realor post-deploy bisect). No fabricated counts. - π§
behavioral-check: mockno longer renders a meaningless equivalent/changed split (the mock stub always read ~100% changed); it now reports the eligible-call count and points atreal.
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=popularfor 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.
- β¨ The
SkillRouteris 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.
- β¨
/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=.
- β¨
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.
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}/lineagealready 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 /manifestsreturns existing IDs.
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.
decimal-labs/regression-check)- β¨ Initial release. Computes structural diff between PR manifest and production manifest; posts impact report as a PR comment.
- β¨
manifest_onlySDK 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.
- β¨ First public version. Manifest capture, trace ingest, framework adapters.