Ana içeriğe geç

Release v0.0.92

· 15 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release makes it possible to answer "why did this instance fault?" Incidents move out of the Instances.Incidents jsonb column into their own table with unbounded history, a denormalized HasActiveIncident flag with a partial index, and two new read surfaces — GET .../instances/{id}/incidents/active and GET .../instances/{id}/incidents — reached through a link-only incident block that appears identically on the state body and on metadata.incident for both a single GET and every list item (response shape v9), all while taking incident reads on the three hottest paths to zero (#972). Instance status changes move to a Postgres compare-and-set, replacing distributed locks and redundant transactions around the status flip (#975). Discovery registry reads get a read-through L1/L2 cache under the default http provider, plus a hosted bulk-read window and a now-synchronous POST utilities/discovery/refresh — measured p50 0.182 ms on a hit against 100.7 ms on a registry miss (#976). And sub-state changes relay post-commit instead of waiting on the outbox → pub/sub → inbox path, which on preprod once took 6 min 30 s, with the receiver finally taking the same per-sub-item lock the three terminal paths take (#978). This release runs on component schema 0.0.53.

Release v0.0.91

· 8 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release gives cross-domain calls a second transport. ServiceDiscovery:Provider switches between http and dapr: under dapr, address resolution moves from the discovery registry's per-call HTTP lookup to Dapr Name Resolution, and the Remote* app services gain a Dapr service-invocation transport, with the registry kept for registration and health (#964). The default stays http and is byte-for-byte the previous behaviour, so enabling dapr is an environment setting rather than an upgrade step. Inline auto-chain hops reuse the context they already hold, and subflow starts and forwards execute synchronously for more predictable completion (#968). Post-commit settlement gets a named parent span so the fresh-parent settle stops rendering as loose siblings, and runtime-internal child start/forward calls skip a response enrichment whose result is thrown away — the reload, schema filter, script context and extensions were all being built for a caller that reads only IsSuccess and Status (#969). A further round of trace refinements tightens span naming, job-handler activity creation and event trace parenting (#963). This release runs on component schema 0.0.53.

Release v0.0.90

· 6 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release reorders the transition pipeline's epilogue so timers are never armed for a state the instance is already leaving. LifecycleOrder.Auto becomes 80 and LifecycleOrder.Schedule becomes 90 — auto-transition conditions are evaluated before scheduled transitions arm their timers — and a new guard skips arming entirely when the auto step has already selected a winner, logging ScheduledTransitionsSkippedForChainedNext (EventId 10156, Debug) instead of enqueuing a Dapr job and an InstanceJob row that the next hop would immediately tear down (#943). Beyond the wasted enqueue, the armed-then-cancelled window briefly exposed scheduled entries in the state function for states the instance was already leaving — clients could see a timer that would never fire. Alongside it, activation-episode tracing ties triggers, asynchronous jobs, subflows and event delivery into a single named episode, with synthetic activation spans and end-to-end activation duration metrics (#931). This release runs on component schema 0.0.53.

Release v0.0.88

· 14 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release adds two task types and moves authorization behind a provider seam. ExternalHttpTask (type 22) runs an HTTP call directly in the Orchestrator rather than routing it through the Execution service, sharing the existing HTTP configuration, scripting surface and reserved-header hardening with the remote HTTP task (#880). PythonTask (type 23) executes a main(input) contract across Python.NET, an isolated process, or a hardened Docker/Kubernetes container, with strict JSON in and out, centrally configurable limits and no silent fallback between modes (#921). Caller-role resolution becomes provider-baseddefault keeps today's in-process behaviour, morph-idm calls an external IDM once per request scope and fails closed — while the grant engine, transition.roles, availableIn[].roles, queryRoles, function.roles and schema x-roles all keep their semantics (#927). All distributed events now ride the transactional outbox: the EventHook infrastructure is removed, subflow terminal events additionally settle the parent immediately as a post-commit command with the Inbox handler as a durable deduplicated backup, and a loss-tolerant Dapr nudge wakes the poll loops after a commit — measured relay gap p99 65.9 ms (#927). Polling a parent with an active subflow gets a cache and a 304 for the first time, terminal settlement gains a durable SettledAt marker, and parent loads shrink to exactly the correlation they act on (#928). This release runs on component schema 0.0.53.

Release v0.0.87

· 8 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release spans the transition pipeline end to end, and then removes the redundancy that filling in the trace tree exposed. Every time-consuming mechanism is now a span — validation, context load, instance read, task input/invoke/output compilation, subflow mapping, locks, component reads, the write side and the stretch after the pipeline — all always on, not gated behind Verbose, with the rule that a step which did no work emits no span at all (#920). With the tree filled in, a single business request turned out to resolve the same workflow definition three or more times per hop, load the same instance twice, validate the same payload schema twice, and build a fully populated transition context only to throw it away. The second half of the release removes exactly that: one workflow resolution per hop, snapshot-based admission, a single owner for payload-schema validation, and the orphaned IWorkflowContext deleted outright (#920). The measured effect on one traced business request: time inside SyncTransitionStrategy that no child span accounted for drops from 976 ms to 14 ms. This release runs on component schema 0.0.53.

Release v0.0.86

· 11 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release is trace-driven performance work on the paths a busy instance actually spends its time in. updateData admission becomes lock-free: the kind is status-neutral, so the async accept no longer takes the status lock or runs the duplicate-active-job guard, and N parallel updateData requests are all admitted — measured as zero 409s under five-way parallel load where the baseline trace showed 84% dead air (#917). Script compilation moves to async single-flight, so waiters await one shared compile instead of blocking thread-pool threads while Roslyn emits, taking cold-window Dapr p99 from 177.7 ms to 81.1 ms; the same change adds compile-cost tags to the task span and Trigger.Local.* spans for in-process trigger invocations (#917). Hot-path allocation drops across the board — response bodies are no longer buffered to measure their size, the EF command interceptor stops copying the full SQL text about six times per command, and raw request bodies are no longer eagerly decoded to UTF-16 — alongside a partial GIN index on InstancesData.Data that finally serves the @> containment predicates every attributes.* filter already emitted, compiled poll-path fingerprint queries, Server GC on every host, and InstanceWriteGate at 256 stripes (#911). On the release side, prerelease publishing moves from manual dispatch to PR labels (#912, #915). This release runs on component schema 0.0.53.

Release v0.0.85

· 20 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release adds the first genuinely parallel task type and cuts the read path's cost in half. FanOutTask (type 21) resolves a collection at runtime and runs a referenced inner task once per item concurrently, joining the outcomes by policy and writing one output to instance data — replacing the $self auto loop that cost N full pipeline hops with a single transition (#905). Component definitions gain an in-process L1 cache in front of the distributed store, keyed by the existing Redis keys so a publish makes stale entries unreachable by construction, plus a five-second generation-token memo that removes the token read from the hot path entirely (#898); script secret bundles are cached in-process with a short TTL and single-flight stampede protection, taking a cold ~8.5 ms vault read down to ~1 µs warm (#899). Traces get flat lanes — one lane per instance instead of nesting equal to chain depth — and job arming moves outside the instance status lock, taking the worst observed lock hold from 30.1 s to 48 ms (#900). Payload envelope detection is resolved by field set rather than a single property, and a rejected payload can no longer come back naming no field at all (#906). Finally, the script compiler and ScriptContext get a measurement-first optimization pass with new metrics, an opt-in PreserveNumericPrecision flag and a LegacyAppendPipeline kill-switch (#907). This release runs on component schema 0.0.53.

Release v0.0.81–84

· 15 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This post consolidates four interim versions — v0.0.81, v0.0.82, v0.0.83 and v0.0.84 — shipped in quick succession between August 17 and August 20. The headline change is in v0.0.84: instance query handling moves from fail-open to fail-closed, so a malformed or unsupported filter, sort, groupBy or aggregation is rejected with HTTP 400 before execution instead of silently widening the query and returning wrong rows (#881); the same release gives scheduledTransitions entries the uniform link metadata every other transition entry carries, at response shape v7 (#894). The interim versions are corrective: v0.0.81 closes the three missing links that detached an Elastic APM trace subtree (#887), makes script compilation race-free under load (#888) and repairs the release pipeline so a partially-published release can be completed rather than abandoned (#886); v0.0.82 puts authoritative Busy reads and writes in isolated transactions (#890); and v0.0.83 lets error-boundary transitions re-enter a Busy instance (#892). This release runs on component schema 0.0.52.

Release v0.0.80

· 14 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release makes a client request observable from end to end and finishes the Busy-as-mutex work started in v0.0.79. Armed timers are now visible to clients — the state response carries a scheduledTransitions list built from active scheduled-transition jobs, each with a persisted UTC executeAtUtc taken from the new InstanceJob.ExecuteAt column, and the scheduled job set folds into the fingerprint ETag so a parked long-poller no longer misses a re-armed timer (response shape v6) (#876). Correlation becomes a four-carrier contract — W3C trace context, X-Request-Id, X-Correlation-Id and X-Workflow-Instance-Id each do exactly one job, propagate across the orchestration → execution → outbound-task boundary, and land in Elastic under stable label names, so one query returns a whole flow (#879, #882). Busy-as-mutex is refined in three places: a $self transition no longer re-runs the state's lifecycle, the accept path takes one lock instead of two, and an async accept on a parent holding an open SubFlow correlation now reserves the whole chain down to the leaf before answering 202 (#883, #884). This release runs on component schema 0.0.52.

Release v0.0.79

· 19 dakikalık okuma
vNext Team
Burgan Tech Engineering

Overview

This release turns functions into fully declared client contracts and closes long-standing gaps in transition authorization. Functions gain a declarative contractverbs, inputSchema, outputSchema, inputView, outputView — enforced at invocation (405 with Allow for undeclared verbs, 400 with field-level errors on schema violations) (#858); every contract slot also accepts rule-based entries (first match wins, trailing rule-less fallback) and is discoverable through new /info, /view, /schema endpoints plus a built-in catalog function linked from the state response (#868, #869). Views declare per-mode display with the new { sdi, mdi } object form alongside the legacy string (#858). Mapping scripts can read related instances — the parent that started this instance, or its own sub items — through context.Related instead of duplicating data across the boundary (#857). updateData and exit are now discoverable in availableTransitions and their roles actually filter (#859), availableIn entries can be role-scoped per state (#870), and all role grant evaluation funnels through one evaluator, fixing surfaces that disagreed about the same caller (#860). The state function returns completed child correlations with terminal outcomes (#856), and UrlTemplates collapses to a single BasePath (#871). Fixes cover component version-resolution caching (#867) and subflow terminal-event deduplication (#855). Transition execution moves to Busy-as-mutex — the Busy status itself is the execution mutex, updateData becomes a status-neutral reserve transition admitted unconditionally (the one safe way to update data and advance an instance under parallel requests), cancel/exit bypass the busy check, and every InstanceData row is persisted the moment it is produced (#877). Workflow tracing gains a business-focused span taxonomy (vnext.layer, vnext.span.category) on Aether 1.0.34, defaulting to the Business detail level (#874). This release runs on component schema 0.0.52.