v1.28.0 — LLM Service Redesign
Released 2026-05-04. GitHub release.
v1.28.0 contains breaking changes to the LLM service API and to the env package’s loading semantics, alongside a number of resilience and observability improvements. An upgrade-v1-28-0 skill is available under .claude/skills/upgrade/ to mechanize most of the migration.
Highlights
- LLM service redesign. Caller now picks
providerandmodelper call;ProviderHostnameand per-providerModelconfigs are removed.Chat,Turn, andChatLoopreturn token usage. Anthropic prompt caching is enabled on theclaudellmprovider. envpackage adopts dotenv semantics.env.yaml/env.local.yamlvalues are written through to the real OS environment at package init. Real OS env wins over yaml.env.Push/env.Popsave and restore the OS env so test overrides reach third-party libraries.- Single-source agent guidance.
AGENTS.mdis removed; all per-microservice and per-package design rationale lives inCLAUDE.mdfiles. Framework packages now ship per-packageCLAUDE.mdnotes. - Distributed cache stampede protection. New
LoadOrCompute/GetOrComputeoperations coalesce concurrent makers per process via singleflight. - OTLP exporter resilience. Lazy connect, retries disabled, per-export timeout via the spec-standard
OTEL_EXPORTER_OTLP_TIMEOUT. - Subscription method validation. Only the standard HTTP verbs and
ANYare accepted at registration time; unknown methods now fail fast.
Breaking Changes
LLM service (coreservices/llm and providers):
Chatsignature changed. Old:Chat(ctx, messages, tools) (messagesOut, err). New:Chat(ctx, provider, model, messages, toolURLs, options) (messagesOut, usage, err). Bothproviderandmodelare required and rejected with400 Bad Requestif empty.Turnsignature changed. Old:Turn(ctx, messages, tools) (*TurnCompletion, err). New:Turn(ctx, model, messages, tools, options) (content, toolCalls, usage, err).Executor.ChatLoopsignature changed. Old:ChatLoop(ctx, messages, tools) (messagesOut, status, err). New:ChatLoop(ctx, provider, model, messages, tools, options) (messagesOut, usage, status, err).ChatLoopworkflow’s declared inputs grew from(messages, tools)to(provider, model, messages, tools, options). Initial-state maps passed viaforemanapi.Run/Createmust includeproviderandmodel.MockChat,MockTurn, andMockChatLoophandler signatures changed to match.- Removed configs:
llm.core→ProviderHostname;claude.llm.core,chatgpt.llm.core,gemini.llm.core→Model. - Removed methods:
SetProviderHostname,SetModel(use the per-call arguments instead). - Removed type:
llmapi.TurnCompletion(replaced by flat(content, toolCalls, usage)returns).
env package:
env.yamlandenv.local.yamlvalues are written to the real OS environment at package init. Code that readsos.Getenvdirectly (third-party SDKs included) now sees yaml values.- OS env wins over yaml. Pre-1.28 yaml entries overrode OS values via the in-memory shadow store; in 1.28 yaml only fills keys that are not already present in the OS env. Operators who set values via shell, systemd, k8s, docker, or CI now win.
env.Pushandenv.Popmutate the real OS env. Tests usingenv.Pushmust not run witht.Parallel().
Subscription method validation:
- HTTP method strings on subscriptions are validated at registration time. Only
GET,HEAD,POST,PUT,DELETE,CONNECT,OPTIONS,TRACE,PATCH, andANYare accepted (case-insensitive). Unknown methods fail at startup rather than producing silently unreachable endpoints.
HTTP ingress proxy:
- In
PRODdeployments, inbound requests to ports:1–:1023are blocked, except:80and:443. Port:888remains blocked in all environments. Other deployments are unaffected.
Time-budget header format:
Microbus-Time-Budgetis now serialized as a Go duration string (5ms,1h30m). The legacy bare-integer format is still accepted on read, so consumers using the framework are unaffected. Hand-emitted headers should switch to the new format.
Agent guidance files:
AGENTS.mdfiles are removed across the project. All per-microservice design rationale now lives inCLAUDE.md. Existing redirect-onlyCLAUDE.mdfiles are replaced by the merged content. References toAGENTS.mdin documentation, prompts, and skills have been replaced withCLAUDE.md.
New Features
LLM service:
- Token usage tracking via
llmapi.Usage(InputTokens,OutputTokens,CacheReadTokens,CacheWriteTokens,Model,Turns). Aggregated across turns byChatandChatLoop. - New
ChatOptions(caller-facing) andTurnOptions(provider-facing) structs forMaxToolRounds,MaxTokens,Temperature. microbus_llm_tokens_totalcounter metric, labeled byprovider,model,direction(input,output,cacheRead,cacheWrite).- New LLM Grafana dashboard charting tokens by direction/provider/model and cache hit ratio.
- Anthropic prompt caching: the
claudellmprovider sets twocache_controlbreakpoints to enable prompt cache reuse across turns. - Typed model constants exported from each provider’s
*apipackage (claudellmapi.ModelHaiku45,chatgptllmapi.ModelGPT4o,geminillmapi.ModelGemini20Flash, etc.). chatbox.exampleextended with a provider dropdown supporting the simulated chatbox plus real Claude, ChatGPT, and Gemini providers.
Distributed cache:
LoadOrComputeandGetOrComputecoalesce concurrent makers per process via singleflight. Bounds the load on the underlying data source to roughly one regeneration per key per replica under bursty traffic. Maker errors are not cached.
Foreman:
- New
created_atindex onmicrobus_flowsandmicrobus_stepsfor efficient time-window queries (recent flows, retention purges, dashboards). - Fixed bug in fan-out + subgraph execution.
Observability:
- OTLP exporter uses lazy connect (no eager dial at startup), retries are disabled, and the per-export timeout is read from the spec-standard
OTEL_EXPORTER_OTLP_TIMEOUTenv var. A misconfigured or unreachable collector no longer stalls startup or blocks exports indefinitely. - Internal control-plane traffic no longer emits noisy OTel spans.
- Revamped Grafana dashboards.
Coding agents:
- New
review-microserviceskill for end-to-end design audits of a single microservice. housekeepingskill enforcement after every microservice change.PROMPTS.mdrewritten as prose rather than a chronological log.- Per-package
CLAUDE.mddesign-rationale notes for framework packages (env,frame,connector,sub,openapi,application,workflow, etc.). - Tool fetcher in
llm.corenow handles unnamed and greedy path arguments correctly.
Migration
An automated migration skill is provided. From inside a Microbus project, ask Claude Code to “upgrade Microbus” — it will run upgrade-microbus, which calls upgrade-v1-28-0 automatically when going through this version.
The skill performs:
- Merges
AGENTS.mdintoCLAUDE.mdper directory. - Strips redirect boilerplate and seeds empty files with the microservice hostname.
- Replaces
AGENTS.mdreferences withCLAUDE.mdacross the project (excluding skill templates). - Bumps
frameworkVersion: 1.28.0and refreshesmodifiedAton everymanifest.yaml. - Migrates
Chat/Turn/ChatLoopcall sites and their mocks. Inserts// TODO:comments at every site that needs aprovider/modelvalue, and emits a list of touched call sites at the end. - Removes
ProviderHostnameandModelconfig entries fromconfig.yaml/config.local.yaml. - Reports
env.yamlkeys that may collide with operator-set OS env, and flags*_test.gofiles that combineenv.Pushwitht.Parallel(). - Validates subscription
method:fields in manifests andsub.At(/sub.Method(calls. - Heads-up audits for hand-emitted
Microbus-Time-Budgetheaders andPortMappingstargeting blocked PROD ports.
After running the skill, run go vet ./... and go test ./... -count=1, then grep for any remaining // TODO: comments inserted at LLM call sites and fill in provider / model values.