Highlights
-
Replace the pre-release Quality authoring, execution, CLI, storage, and
Devtools model with Crux Evals V1. Applications now bind ordinary callable
production tasks withgenerate.task()orstream.task(), define inert typed
Cases and Variants through@use-crux/core/eval, run them withcrux eval,
reuse exact safe evidence automatically, and explicitly accept complete Eval
run arms as Baselines. The old@use-crux/core/qualityexports and
crux qualitycommands are removed without compatibility aliases.Add
stableModel()to attest a standard or custom AI SDK model's secret-free
versioned identity for safe automatic Eval reuse. Unattested model objects keep
working fresh and receive one actionable CLI and Devtools remedy.Reuse function-form prompt, system, and message renderers through their tracked
literal-ESM source closure and an exact one-way fingerprint captured from the
real normalized generate/stream request. The comparison projects only fields
that can affect the provider request, excluding per-resolution observability
IDs while retaining Context text and cache boundaries. Evidence candidates are locally
re-rendered before reuse; mismatches execute fresh with actionable
nondeterministic_rendererCLI and Devtools guidance, and raw prompt material
never crosses the evidence boundary. Unresolved source dependencies remain
fresh.Fingerprint callback-free Crux router, split, retry, fallback, and cascade
trees by recursively projecting attested model leaves and structural options,
then include the resolved model target in observed identity.stableModel()
rejects whole route trees. Static contexts, inline skills, and schema-only
tools can reuse exact evidence; dynamic context renderers/selectors, executable tools,
function-produced tools, memoized or effectful context families execute fresh.
Route-tree evidence remains fresh when its resolved target was not covered at
planning.Fail closed for inline managed-task bindings and callback-bearing Variant
prompt overrides, report the distincttask_binding_untrackedremedy, and
derive deployed Variant fingerprints from adapter semantic projections so
schema-backed prompt changes cannot collide. Fingerprint Current and imported
replacement task bindings independently so an unrelated candidate edit does
not invalidate Current evidence.Add Runtime-hosted Eval execution with generated identity-only registries,
strict offline and pre-spend planning, Node/serverless/Convex conformance, and
the first-party@use-crux/cloudflareDurable Object host. Explicit fresh
executions use a new durable admission identity while retries reconnect to the
same admitted action. Strict offline runs load the generated data-only privacy
policy without importing Runtime code or touching the network, and fail closed
when that projection is missing or stale. Add awaited
run-linked feedback through@use-crux/core/feedbackand AI message metadata
through@use-crux/ai/feedback, plus durable Review and explicit Add-to-eval
workflows in Crux Local and Devtools.Add first-class Eval catalog and run views to Devtools, including same-origin
run triggering, exact run comparisons, Baseline promotion, Eval search, reuse
and invalidation reasons, cost and score evidence, feedback, and Review links.
Keep the CLI coordinator protocol bounded by sending diagnostic run summaries
instead of duplicating stored inputs and outputs over NDJSON.Keep durable result writes type-safe and bounded: reject non-JSON media before
redaction, preserve supported structured values exactly, and omit oversized
provider response envelopes from the stored run while retaining their linked
trace references. Align privacy-policy fingerprints across TypeScript and Go,
including HTML-sensitive keys and JavaScript UTF-16 key ordering.Make
--max-costfail closed on conservative per-call USD ceilings. Managed AI
tasks, routing trees, bounded tool loops, and judges estimate from
experimental.eval.pricing; unknown paths report missing model keys and an
actionable remedy before any billable work. -
Add portable MCP tool sources over Streamable HTTP and stdio. MCP tools now
materialize lazily across every first-party generation adapter and retain the
ordinary Crux middleware, Safety, approval, Eval, observability, and
cleanup contracts.Project Index and Devtools now connect authored MCP servers with
runtime-discovered tools, safe schemas and fingerprints, health and lifecycle state,
Run Detail preparation evidence, and exact Catalog activity. The new
@use-crux/mcppackage owns both supported client paths and keeps MCP optional
for Core and adapter installations.The release also validates widened runtime transport and selection values at
the public boundary, keeps opaque dependency failures out of errors and
evidence, preserves every accepted portable tool name, closes materialized
sessions when lifecycle preparation fails, and bounds Project Index runtime
delivery and ingestion. -
Make portable application entrypoints verifiable in both source and staged npm
packages, remove package-wide Node engine restrictions where the primary graph
is portable, and include the Next integration in TypeScript release staging.The
@use-crux/airoot no longer downloads HTTPS transcription input
implicitly. Portable callers must provide materialized audio; Node callers can
importtranscribeorcreateAiSdkTranscribefrom the new
@use-crux/ai/transcription/nodesubpath to retain the bounded, DNS-pinned
download behavior. Portable data-URL transcription no longer relies on the
NodeBufferglobal.Unify observability and host-lifecycle async scoping on Core's canonical
carrier so no-AsyncLocalStorage runtimes retain synchronous fallback behavior
while unsafe asynchronous ambient host scopes fail closed.Add portable deployment identity and privacy-safe Project Index manifest
contracts to Core. The build-time Indexer now projects and verifies the same
deterministic artifact internally.Carry immutable deployment identity through observability graph records,
suspend/resume propagation, and local run detail.@use-crux/otelnow exports a portable
Resource-attribute mapper, maps lightweight identity per span, and projects
DefinitionRefs through bounded attributes and events.Advance observability to schema v4 with explicit operation-family identity.
Root runs now own anoperationId; independently durable nested Flow, named
defer, and Convex swarm work opens causally linked child runs while ordinary
pipeline, parallel, consensus, delegate, generation, and host continuations
remain spans or fresh segments. Local Runs projects one row per operation with
aggregate child/topology health, child-before-root shells, family-atomic
retention, and deletion tombstones. Older observability storage resets in
place because family membership cannot be reconstructed from trace IDs. Run
lookup and deletion now require an operation or member-run ID; W3C trace IDs
remain correlation data and never select an operation implicitly.Add daemon-free
crux checkwith deterministic JSON and explicit CI exit
codes.crux lintnow uses the same one-shot Project Index service and embedded
worker pipeline by default while retaining its no-gate compatibility behavior
and an explicit--serverpath.Add daemon-free
crux manifestartifact generation and verified, idempotent
crux catalog import. Local observability now resolves runtime definition
references only against the exact immutable deployment manifest named by a run
and labels current-checkout comparisons separately.
Definition fingerprints now use normalized project-relative source identity so
identical checkouts produce the same manifest ID; static, semantic, and Go
snapshot cache epochs invalidate root-dependent historical fingerprints.Add deterministic
crux cataloglist, show, status, and explain projections
with compiler provenance, safe source paths, Health/Eval/runtime joins, and
truthful partial or unknown state. The betacrux indexlist/show paths now
delegate to Catalog while category keywords and explicit reindex remain.
Durable definition evidence now retains canonical extractor and resolved
extension provenance, and Catalog explanations name every actual contributor
without changing the public evidence shape or phase producer identity.
Durable relation, source-reference, and diagnostic evidence now retains the
same exact extractor contributors across worker, cache, and restart boundaries.Add opinionated
withCruxlifecycle boundaries for Cloudflare Workers and
Next.js while retaining their low-level adapters. Workers and Next now compose
deferred work with contained, bounded post-response observability drains;
createCruxConvex().run()owns the corresponding bounded terminal drain and
preserves deployment identity across durable continuation boundaries.
Rejected promises returned by advisory drain reporters are contained without
delaying or replacing handler results or host-owned drain work.
Rename the Next Runtime artifact build plugin towithCruxBuild, reserving
withCruxfor framework lifecycle boundaries without a compatibility alias.
Add explicitconfig({ host })retention bindings for Node, Next.js,
Cloudflare Workers, and Vercel. Config-only ambient defer uses an ephemeral
invocation per call; failed or cancelled scopes now record and skip inline
callbacks instead of running them.
Remove defer completion classes and lifetime factories in favor of the scope
kernel's host bindings. Serverless and Node wrappers now enqueue retained work
through the root gate. Move the WorkerswithCruxlifecycle boundary from
Core's deleted/observability/workerssubpath to@use-crux/cloudflare,
where its structured drain runs before the kernel flush.
Open lazy execution scopes at Crux agent, adapter, tool, Safety, flow-step, and
Convex bridge boundaries. Inlinedefer()now works with zero host setup inside
defer-capable primitives on long-lived processes; nested work drains at its
nearest boundary and streaming adapters restore one scope across Core-owned
iteration and completion segments.
Configured host retention now applies uniformly when any Crux primitive is the
execution root. Primitive drains still start immediately, while retention-port
failures propagate after deterministic sealing instead of silently accepting
work the host cannot keep alive.
Run Evals and their cells as execution scopes. Deferred work registered by an
Eval task is captured as cell evidence instead of invoking inline callbacks or
staging named Runtime work, and expired remote cells drop late observability
writes through the shared scope-sealing policy.
Teach setup diagnostics, the built-in defer lint, and public documentation the
same primitive-first host-retention ladder, including exact Next, Vercel, and
Workers remediations and the generic serverless adapter contract.
Remove the config-dependentdefer.missing_scopebundled lint;crux setup
now owns host-retention diagnostics using selected config and platform evidence.
Portable MCP entrypoints now fail closed when stdio is selected, while Node
runtimes resolve their lazy stdio adapters through private conditional imports.Align public documentation around Catalog, Runs, Evals, and Health. Narrow
the published Indexer root to Crux-owned compiler contracts; third-party
authoring stays on the experimental/extensionssubpath and is declarative,
limited to extractors plus relation declarations.Correlate successful managed operation results with the exact Core-owned W3C
trace and producing span. Generation hooks and middleware receive finalized
results; stream handles expose identity immediately and repeat it on
completion; completed media, agent/composition, flow, scoring, compaction,
citation, and content-indexing summary envelopes follow the same exact-owner
contract while provider payloads and raw values remain ID-free.
Completed-operation bindings now use the documented exact media-operation
vocabulary; formerly normalized spellings such asgenerate-imageor
generateimageno longer imply a Core-owned media span.Managed AI Eval tasks retain correlated response metadata after removing raw
provider values. Eval cells continue to store logical taskrunIds, while
assertion outcomes store exact related span IDs; neither is relabelled as a W3C
trace ID. Semantic-cache and flow persistence boundaries prevent
invocation-local IDs from leaking across replay or durable execution. The
private deployed-Eval result wire advances to schema version 2 so retained task
responses require the same correlation contract across hosts.Postgres Runtime snapshot decoding now revives nested suspend deadlines, and
terminal retention recognizes expired flow snapshots. -
Safety input guardrail rewrites now fail closed on multimodal messages: a rewrite that cannot be
faithfully re-applied to the message's text parts (mutated or spoofed media placeholders,
media-only messages) throwsSafetyResultErrorinstead of being silently dropped or duplicating
placeholder text into the prompt.boundary.output.both()guards now receive the parsed object
alongside the output text.Add
boundary.input.media()for inspecting canonical non-text input parts before provider
normalization with fully inferred callback types and stable original indexes. Enforcedstrip
decisions remove only the current part, while report-mode strips record intent without changing
provider input; Project Index now records the exact media boundary on authored guardrails. Input
media remains guardrail-only: constraints rejectboundary.input.media()in TypeScript and fail
closed on bypassed configurations.Add
guardrail.media()as a declarative, provider-neutral attachment policy for MIME allowlists,
byte limits, exact remote hosts, inline/provider-file categories, and URL userinfo/query posture.
It inspects only caller-supplied metadata and local bytes, supports block or strip enforcement, and
keeps locator and payload details out of decisions. Project Index now records complete literal
guardrail helper strategy config through the bundled native Safety extractor and retains kind-only
facts for dynamic config.Add
boundary.output.media()and completed image Safety. Generated images now run output policies
once after routing selects a result; enforce-mode strips preserve image order, reset theimage
alias, and block on the final image, while report mode preserves the result. Direct image-edit
references and masks run input media policies before provider normalization with immutable
write-back and a fail-closed retained-mask dependency. Canonical write-back preserves provider
rawand metadata identities.Add completed speech Safety options and runtime coverage. Speech
textand optional
instructionsnow run through their exact input boundaries before provider normalization, and
generated audio runs output-media policies before reporting or return. Enforced audio strip blocks
because audio is required; report mode preserves it. Canonical audit write-back retains provider
facts and works identically through direct bindings and provider runtimes.Add completed transcription Safety options and runtime enforcement. Prompt hints and required
audio are guarded before normalization or materialization, while validated transcript text is
guarded once before reporting or return. Enforced transcript rewrites clear timed segments and
words without changing provider-native facts. Transcript constraints run exactly once with no
provider retry: assert failures throw and suggest/report failures remain in canonical audit.Completed operations now validate every exact Safety binding against their primitive before
provider work. Inapplicable call and prompt bindings fail closed, while global tuple members remain
auditable as dormant without suppressing applicable members; duplicate IDs and invalid media tuning
still fail before dormancy classification. Guarded completed-operation results expose canonical
decisions through the new optionalresult.safetyfield and exportedSafetyAudittype.Typed image prompts now merge prompt guardrails with global and call policies, guard resolved user
and system text at their exact boundaries, and hand providers a direct prepared prompt without a
second resolution. Routed prompts require one candidate-stable ordered policy set, lazily guard only
attempted candidates, and treat candidate input Safety failures as terminal rather than eligible for
fallback.Language generation now guards every provider-produced step before client tools, history append,
observation, continuation, or public accumulation. The loop-runtime contract exposes an optional
pre-client-tool transform capability with Core-owned indexed text/media edits; incapable runtimes
fail before provider I/O when step policies apply. Core and AI SDK dialects preserve tool calls,
raw/provider identities, and guarded step/envelope consistency across reasoning, media, structured
validation, and constraint regeneration. Text-only language prompts reject local structured-output
bindings before provider I/O while keeping equivalent global bindings auditable as dormant.Stream completion now guards buffered reasoning and media through one shared Core gate before
completion resolves in both adapter dialects. Live text retains its existing staged stream Safety
and is not re-guarded at completion; completion-only text is guarded once, stripped media is
removed consistently from content and assistant messages, and buffered blocks may reject after
already emitted safe text. Raw provider and SDK stream handles remain unchanged and explicitly
unguarded.Project Index now recognizes output-media boundaries, ordered input/output media tuples, media
strategy metadata, and completed-operation Safety policy/options references in both static lanes.
The static cache namespace advances so existing checkouts cannot reuse facts produced before the
expanded boundary vocabulary. Devtools Catalog renders those authored boundaries, strategy/action
configuration, and operation attachments, while Runs explains privacy-safe model, origin, and
required-media escalation evidence. -
Cache validated dense and sparse embedding bundles per source when an indexer
usescache: true, including dry-run reuse and cache modes forindexChunks().
Embedding instances now expose vector-semantic fingerprints, and provider
helpers derive model/request identity while accepting an additionalversion
for explicit invalidation.The first sync after an embedding identity change intentionally classifies
unchanged source content asindexChanged; cached vectors are reused when the
ordered chunk content remains compatible. InappendOnlymode that source is
skipped without updating its index identity, so later append-only syncs keep
reporting the same skip until a replace-mode sync accepts the change.Index results and source ledgers now include
embeddingstage records with
embeddingKindand cache outcomes. Consumers that match stage objects by exact
shape should accept these new records and field.Add native multimodal dense embeddings with declared, const-inferred
modalities, typed text/image/audio/video/document inputs, and query/document
roles. Googlegemini-embedding-2maps those inputs natively and has a
zero-config model-aware path; OpenAI and the installed AI SDK embedding surface
remain explicitly text-only and reject media before provider I/O.Indexers can store media documents through
AssetStore, stamp vectors with a
SHA-256 embedding-space digest, and retrieve the same namespace with text or
media while retainingRetrieverHit.source.assetRefattribution. Namespace
guards reject incompatible model, dimension, normalization, modality, or task
spaces before writes or search and require a full reindex or new namespace.
Media bytes and provider locators never enter record/vector metadata, pipeline
caches, observability artifacts, or retrieval traces.Breaking (pre-1.0 minor): custom dense provider batch functions now receive
validatedNormalizedEmbeddingInput[]plus{ role }instead ofstring[].
Embedding fingerprints now include modality/space semantics, invalidating old
embedding and indexing cache entries once so they are safely re-embedded.Project Index now emits module-scoped embedding definitions, embedding-call
facts, vector-indexer facts, and consumer-to-embedding relations. Semantic
lints reject proven unsupported media modalities, sparse/media combinations,
and exact embedding-identity mismatches within a shared vector namespace.The embedded Devtools catalog now shows each retriever and knowledge base's
resolved embedding modalities and dense vector-space identity, with the new
embedding lints presented through the standard Health view. Run Detail now
presents embedding roles, modality counts, and space digests, plus byte-safe
asset, media-type, and page/time attribution on media retrieval hits. -
Memory capture modes are now honored end to end, and Convex memory storage is records-only.
Adapters previously awaited memory flush unconditionally, so
capture.mode: 'afterResponse'and'detached'behaved like'inline'for prompt-bound memory. Adapters now only await capture when the mode is'inline', or when it is'afterResponse'without a configuredcapture.waitUntilhook (the serverless-safe fallback). Adapters also forward each tool call to memory blocks'captureToolEventhooks, soepisodes()records tool activity, and the Convex agent lifecycle retains tool results and errors. Extractive blocks withwrite: { mode: 'manual' }no longer run their extract callback during capture.Breaking for
@use-crux/convex(pre-1.0 minor): the bundled Convex vector path was unusable (no schema vector index, wrong search result hydration) and its same-key vector upsert corrupted memory records, so it has been removed, including thevectorIndexNameandsemanticCacheprofile-storage options, theConvexSemanticCacheOptionstype, and the store-doc dense-search contract types.convexStorage()and the ambient Convex runtime storage now provide records only; embeddings remain mirrored on records. Semantic memory blocks fall back to recency listing on Convex unless an explicitVectorStore(for exampleupstashVectorStore()from@use-crux/upstash) is configured, andconvexVectorStore()now throwsunsupported_capabilitywith migration guidance.memory({ records })from@use-crux/convexno longer injects ambient runtime storage when explicit stores are passed. -
Make TUI input routing deterministic so focused filters consume text before
workspace shortcuts, each key dispatches at most one action, and help plus pane
footers show only executable actions. Derive optional Dataset support from the
injected production client and keep unsupported screens out of navigation.
Preserve exact record identities across Overview drills and restore logical
route, pane focus, and stable selections when navigating Back.
Cancel in-flight Overview and Runs fetches and actions when the owning dev
command ends instead of leaving workflow work detached from shutdown.
Keep Runs list and detail reads revision-aware and selection-owned, preserve
complete observability detail when exporting, and reject late detail responses
from a previously selected run.
Keep the Runs list selection visible across paging, filtering, refresh, and
terminal resize, with keyboard and mouse-wheel navigation gated by pane focus.
Wrap and scroll long Runs span details with stable resize anchors, focused
line/page navigation, and a visible document position indicator.
Keep the selected Runs span visible while navigating or refreshing its
hierarchy, with focused line/page movement independent from detail scrolling.
Render a direct, diagnosis-oriented Runs detail with failure evidence,
diagnostics, activity, artifacts, events, and exact definition references;
keep complete raw observability records behind explicit inspect and export
actions.
Keep Runs readable across narrow, medium, and wide terminals using its actual
Workbench body bounds, prioritize diagnosis at medium widths, and show an
actionable resize message below the supported 60x20 terminal minimum.
Keep Overview insight and run selections visible across paging, refresh, and
resize; expose focused-pane actions and readable narrow navigation; and retain
pane-scoped last-good data when independent summary, insight, run, or activity
refreshes fail.
Make Project Index definitions and structured source details independently
scrollable, preserve exact selection and detail anchors across refreshes, and
retain last-good index data with an explicit degraded state when refresh fails.
Support tab-based pane traversal and control-key paging, sanitize indexed text
before terminal rendering, and report definition exports with portable names
without replacing usable Index data on export failure.
Open exact runtime definition references from Runs withd: navigate directly
for one destination or choose among multiple exact IDs in a bounded scrollable
modal. Show missing references explicitly in Project Index, never substitute a
same-named definition, and restore run, span, definition, pane, and viewport
location when navigating Back.
Select the interactive workbench only when stdin and stdout are capable
terminals outside CI andTERM=dumb, while keeping plain output free of
terminal control sequences. Browser launch is now explicit: use--openat
startup oroinside the workbench; the legacy--no-openflag is removed,
while--tuiand--no-tuiexplicitly select a mode and reject conflicts.
Route command input, JSON output, diagnostics, worker logs, and subprocess
stderr through scoped injectable boundaries, propagating JSON write failures
without mutating the process-wide logger.
Unify dev-command, TUI, event-bridge, server, WebSocket, tunnel, watcher, and
worker shutdown under one cancelable session with idempotent bounded cleanup.
Cleanqand raw TUI Ctrl+C exit0, process SIGINT exits130, and SIGTERM
exits143; signal status wins
over reported cleanup failures, expected cancellation stays silent, and a
second signal terminates immediately.
Render the TUI immediately after listener binding while runtime preflight,
Project Index, and runtime-artifact warmup continue under owned cancellation.
Replay typed startup diagnostics such asRUNTIME_HOST_ONLYin the workbench,
buffer edits made during the initial index, retry a failed baseline on the next
edit, and prevent delayed terminal capability replies from leaking into the
shell. Preserve graceful cleanup and exit status through the npm launcher.
Allow ordinary callable Evals and adapter-managed Evals to coexist without
placement flags: Crux derives execution per Current/Variant arm, keeps
coordinator-only Evals out of deployed host artifacts, and validates exact
host requirements before paid work. Generate Runtime files through one
preflighted, atomic, manifest-last pipeline with complete structured findings.
Makecrux setupdry-run generated-file freshness and make
crux setup --applyre-inspect before safely refreshing files;crux dev
continues serving while background generation reports and retries failures.
Preserve existing Convex routers that already callcrux.bridge(...), with the
bridge registering authenticated Eval routes automatically. The local Runtime
artifact manifest moves to v2 while the authenticated host wire remains v1.
Register those Eval routes as real default-runtime Convex HTTP actions and
forward them across Convex's supported action boundary, so generated and
existing routers deploy without invalid-module errors.
Index Eval placement in a bounded runtime-rich pass for setup, one-shot
generation, and watcher refreshes, and treat host-bound preflight as
metadata-only instead of executing host-only functions from the local CLI. -
Add object-bound
FlowHandle.cancel(flowId)with consistent idempotent behavior
with and without a Runtime Engine. Runtime cancellation now atomically marks
both durable work and its flow snapshot cancelled, including through
crux.flows.cancel(), while leaving independently deferred or scheduled child
work running.Correct missing-runtime guidance to use
handle.resume(flowId)and document
the positional, barrier-buffered durability contract forflow.defer()and
flow.after(). -
serverless()now infers distinct Vercel production and preview Runtime Engine namespaces and records their provenance. Production serverless configurations without an explicit namespace,CRUX_RUNTIME_NAMESPACE, or supported Vercel signal now throwNAMESPACE_AMBIGUOUSat composition instead of silently usinglocal; setCRUX_RUNTIME_NAMESPACE=productionor passserverless({ namespace: "..." }).Runtime setup and preflight now warn when a serverless definition legitimately falls back to
localin development, and thecruxCLI renders passing-setup warnings incrux runtime generateandcrux devpreflight output. -
Export
detectSuspiciousPatternsfrom@use-crux/core(alongside the existing
safe,escapeXml, and other prompt-injection defense helpers) and export the
TaskCompleteArgstype from@use-crux/core/tasks. Both were already documented
in the reference but were not part of the public export surface.Also corrects the documentation URLs emitted in a few packages after the docs
site reorganized its guide routes (defer→background-work,runtime→
durable-execution).
Fixes
-
Restore observability configuration across bundled server module copies and
reconcile abandoned activity without treating it as currently running.Also preserve provider model metadata and grounded prompt types, and make
omitted Static Index configuration use the documented default. Reject malformed
shared runtime registry ancestry and hook layers before duplicate module copies
adopt them. -
Replace the pre-release Quality authoring, execution, CLI, storage, and
Devtools model with Crux Evals V1. Applications now bind ordinary callable
production tasks withgenerate.task()orstream.task(), define inert typed
Cases and Variants through@use-crux/core/eval, run them withcrux eval,
reuse exact safe evidence automatically, and explicitly accept complete Eval
run arms as Baselines. The old@use-crux/core/qualityexports and
crux qualitycommands are removed without compatibility aliases.Add
stableModel()to attest a standard or custom AI SDK model's secret-free
versioned identity for safe automatic Eval reuse. Unattested model objects keep
working fresh and receive one actionable CLI and Devtools remedy.Reuse function-form prompt, system, and message renderers through their tracked
literal-ESM source closure and an exact one-way fingerprint captured from the
real normalized generate/stream request. The comparison projects only fields
that can affect the provider request, excluding per-resolution observability
IDs while retaining Context text and cache boundaries. Evidence candidates are locally
re-rendered before reuse; mismatches execute fresh with actionable
nondeterministic_rendererCLI and Devtools guidance, and raw prompt material
never crosses the evidence boundary. Unresolved source dependencies remain
fresh.Fingerprint callback-free Crux router, split, retry, fallback, and cascade
trees by recursively projecting attested model leaves and structural options,
then include the resolved model target in observed identity.stableModel()
rejects whole route trees. Static contexts, inline skills, and schema-only
tools can reuse exact evidence; dynamic context renderers/selectors, executable tools,
function-produced tools, memoized or effectful context families execute fresh.
Route-tree evidence remains fresh when its resolved target was not covered at
planning.Fail closed for inline managed-task bindings and callback-bearing Variant
prompt overrides, report the distincttask_binding_untrackedremedy, and
derive deployed Variant fingerprints from adapter semantic projections so
schema-backed prompt changes cannot collide. Fingerprint Current and imported
replacement task bindings independently so an unrelated candidate edit does
not invalidate Current evidence.Add Runtime-hosted Eval execution with generated identity-only registries,
strict offline and pre-spend planning, Node/serverless/Convex conformance, and
the first-party@use-crux/cloudflareDurable Object host. Explicit fresh
executions use a new durable admission identity while retries reconnect to the
same admitted action. Strict offline runs load the generated data-only privacy
policy without importing Runtime code or touching the network, and fail closed
when that projection is missing or stale. Add awaited
run-linked feedback through@use-crux/core/feedbackand AI message metadata
through@use-crux/ai/feedback, plus durable Review and explicit Add-to-eval
workflows in Crux Local and Devtools.Add first-class Eval catalog and run views to Devtools, including same-origin
run triggering, exact run comparisons, Baseline promotion, Eval search, reuse
and invalidation reasons, cost and score evidence, feedback, and Review links.
Keep the CLI coordinator protocol bounded by sending diagnostic run summaries
instead of duplicating stored inputs and outputs over NDJSON.Keep durable result writes type-safe and bounded: reject non-JSON media before
redaction, preserve supported structured values exactly, and omit oversized
provider response envelopes from the stored run while retaining their linked
trace references. Align privacy-policy fingerprints across TypeScript and Go,
including HTML-sensitive keys and JavaScript UTF-16 key ordering.Make
--max-costfail closed on conservative per-call USD ceilings. Managed AI
tasks, routing trees, bounded tool loops, and judges estimate from
experimental.eval.pricing; unknown paths report missing model keys and an
actionable remedy before any billable work. -
Reshape the
@use-crux/coreREADME (npm page) to orient rather than document:
keep the intro, install, examples, subpaths table, and links, and route deep
reference topics to the docs site. Also fix stale example APIs (guardrails and
constraints now use the boundary-based{ id, on, run }shape; the retriever
example uses the realrecordsfield). -
Safety input guardrail rewrites now fail closed on multimodal messages: a rewrite that cannot be
faithfully re-applied to the message's text parts (mutated or spoofed media placeholders,
media-only messages) throwsSafetyResultErrorinstead of being silently dropped or duplicating
placeholder text into the prompt.boundary.output.both()guards now receive the parsed object
alongside the output text.Add
boundary.input.media()for inspecting canonical non-text input parts before provider
normalization with fully inferred callback types and stable original indexes. Enforcedstrip
decisions remove only the current part, while report-mode strips record intent without changing
provider input; Project Index now records the exact media boundary on authored guardrails. Input
media remains guardrail-only: constraints rejectboundary.input.media()in TypeScript and fail
closed on bypassed configurations.Add
guardrail.media()as a declarative, provider-neutral attachment policy for MIME allowlists,
byte limits, exact remote hosts, inline/provider-file categories, and URL userinfo/query posture.
It inspects only caller-supplied metadata and local bytes, supports block or strip enforcement, and
keeps locator and payload details out of decisions. Project Index now records complete literal
guardrail helper strategy config through the bundled native Safety extractor and retains kind-only
facts for dynamic config.Add
boundary.output.media()and completed image Safety. Generated images now run output policies
once after routing selects a result; enforce-mode strips preserve image order, reset theimage
alias, and block on the final image, while report mode preserves the result. Direct image-edit
references and masks run input media policies before provider normalization with immutable
write-back and a fail-closed retained-mask dependency. Canonical write-back preserves provider
rawand metadata identities.Add completed speech Safety options and runtime coverage. Speech
textand optional
instructionsnow run through their exact input boundaries before provider normalization, and
generated audio runs output-media policies before reporting or return. Enforced audio strip blocks
because audio is required; report mode preserves it. Canonical audit write-back retains provider
facts and works identically through direct bindings and provider runtimes.Add completed transcription Safety options and runtime enforcement. Prompt hints and required
audio are guarded before normalization or materialization, while validated transcript text is
guarded once before reporting or return. Enforced transcript rewrites clear timed segments and
words without changing provider-native facts. Transcript constraints run exactly once with no
provider retry: assert failures throw and suggest/report failures remain in canonical audit.Completed operations now validate every exact Safety binding against their primitive before
provider work. Inapplicable call and prompt bindings fail closed, while global tuple members remain
auditable as dormant without suppressing applicable members; duplicate IDs and invalid media tuning
still fail before dormancy classification. Guarded completed-operation results expose canonical
decisions through the new optionalresult.safetyfield and exportedSafetyAudittype.Typed image prompts now merge prompt guardrails with global and call policies, guard resolved user
and system text at their exact boundaries, and hand providers a direct prepared prompt without a
second resolution. Routed prompts require one candidate-stable ordered policy set, lazily guard only
attempted candidates, and treat candidate input Safety failures as terminal rather than eligible for
fallback.Language generation now guards every provider-produced step before client tools, history append,
observation, continuation, or public accumulation. The loop-runtime contract exposes an optional
pre-client-tool transform capability with Core-owned indexed text/media edits; incapable runtimes
fail before provider I/O when step policies apply. Core and AI SDK dialects preserve tool calls,
raw/provider identities, and guarded step/envelope consistency across reasoning, media, structured
validation, and constraint regeneration. Text-only language prompts reject local structured-output
bindings before provider I/O while keeping equivalent global bindings auditable as dormant.Stream completion now guards buffered reasoning and media through one shared Core gate before
completion resolves in both adapter dialects. Live text retains its existing staged stream Safety
and is not re-guarded at completion; completion-only text is guarded once, stripped media is
removed consistently from content and assistant messages, and buffered blocks may reject after
already emitted safe text. Raw provider and SDK stream handles remain unchanged and explicitly
unguarded.Project Index now recognizes output-media boundaries, ordered input/output media tuples, media
strategy metadata, and completed-operation Safety policy/options references in both static lanes.
The static cache namespace advances so existing checkouts cannot reuse facts produced before the
expanded boundary vocabulary. Devtools Catalog renders those authored boundaries, strategy/action
configuration, and operation attachments, while Runs explains privacy-safe model, origin, and
required-media escalation evidence. -
Make portable application entrypoints verifiable in both source and staged npm
packages, remove package-wide Node engine restrictions where the primary graph
is portable, and include the Next integration in TypeScript release staging.The
@use-crux/airoot no longer downloads HTTPS transcription input
implicitly. Portable callers must provide materialized audio; Node callers can
importtranscribeorcreateAiSdkTranscribefrom the new
@use-crux/ai/transcription/nodesubpath to retain the bounded, DNS-pinned
download behavior. Portable data-URL transcription no longer relies on the
NodeBufferglobal.Unify observability and host-lifecycle async scoping on Core's canonical
carrier so no-AsyncLocalStorage runtimes retain synchronous fallback behavior
while unsafe asynchronous ambient host scopes fail closed.Add portable deployment identity and privacy-safe Project Index manifest
contracts to Core. The build-time Indexer now projects and verifies the same
deterministic artifact internally.Carry immutable deployment identity through observability graph records,
suspend/resume propagation, and local run detail.@use-crux/otelnow exports a portable
Resource-attribute mapper, maps lightweight identity per span, and projects
DefinitionRefs through bounded attributes and events.Advance observability to schema v4 with explicit operation-family identity.
Root runs now own anoperationId; independently durable nested Flow, named
defer, and Convex swarm work opens causally linked child runs while ordinary
pipeline, parallel, consensus, delegate, generation, and host continuations
remain spans or fresh segments. Local Runs projects one row per operation with
aggregate child/topology health, child-before-root shells, family-atomic
retention, and deletion tombstones. Older observability storage resets in
place because family membership cannot be reconstructed from trace IDs. Run
lookup and deletion now require an operation or member-run ID; W3C trace IDs
remain correlation data and never select an operation implicitly.Add daemon-free
crux checkwith deterministic JSON and explicit CI exit
codes.crux lintnow uses the same one-shot Project Index service and embedded
worker pipeline by default while retaining its no-gate compatibility behavior
and an explicit--serverpath.Add daemon-free
crux manifestartifact generation and verified, idempotent
crux catalog import. Local observability now resolves runtime definition
references only against the exact immutable deployment manifest named by a run
and labels current-checkout comparisons separately.
Definition fingerprints now use normalized project-relative source identity so
identical checkouts produce the same manifest ID; static, semantic, and Go
snapshot cache epochs invalidate root-dependent historical fingerprints.Add deterministic
crux cataloglist, show, status, and explain projections
with compiler provenance, safe source paths, Health/Eval/runtime joins, and
truthful partial or unknown state. The betacrux indexlist/show paths now
delegate to Catalog while category keywords and explicit reindex remain.
Durable definition evidence now retains canonical extractor and resolved
extension provenance, and Catalog explanations name every actual contributor
without changing the public evidence shape or phase producer identity.
Durable relation, source-reference, and diagnostic evidence now retains the
same exact extractor contributors across worker, cache, and restart boundaries.Add opinionated
withCruxlifecycle boundaries for Cloudflare Workers and
Next.js while retaining their low-level adapters. Workers and Next now compose
deferred work with contained, bounded post-response observability drains;
createCruxConvex().run()owns the corresponding bounded terminal drain and
preserves deployment identity across durable continuation boundaries.
Rejected promises returned by advisory drain reporters are contained without
delaying or replacing handler results or host-owned drain work.
Rename the Next Runtime artifact build plugin towithCruxBuild, reserving
withCruxfor framework lifecycle boundaries without a compatibility alias.
Add explicitconfig({ host })retention bindings for Node, Next.js,
Cloudflare Workers, and Vercel. Config-only ambient defer uses an ephemeral
invocation per call; failed or cancelled scopes now record and skip inline
callbacks instead of running them.
Remove defer completion classes and lifetime factories in favor of the scope
kernel's host bindings. Serverless and Node wrappers now enqueue retained work
through the root gate. Move the WorkerswithCruxlifecycle boundary from
Core's deleted/observability/workerssubpath to@use-crux/cloudflare,
where its structured drain runs before the kernel flush.
Open lazy execution scopes at Crux agent, adapter, tool, Safety, flow-step, and
Convex bridge boundaries. Inlinedefer()now works with zero host setup inside
defer-capable primitives on long-lived processes; nested work drains at its
nearest boundary and streaming adapters restore one scope across Core-owned
iteration and completion segments.
Configured host retention now applies uniformly when any Crux primitive is the
execution root. Primitive drains still start immediately, while retention-port
failures propagate after deterministic sealing instead of silently accepting
work the host cannot keep alive.
Run Evals and their cells as execution scopes. Deferred work registered by an
Eval task is captured as cell evidence instead of invoking inline callbacks or
staging named Runtime work, and expired remote cells drop late observability
writes through the shared scope-sealing policy.
Teach setup diagnostics, the built-in defer lint, and public documentation the
same primitive-first host-retention ladder, including exact Next, Vercel, and
Workers remediations and the generic serverless adapter contract.
Remove the config-dependentdefer.missing_scopebundled lint;crux setup
now owns host-retention diagnostics using selected config and platform evidence.
Portable MCP entrypoints now fail closed when stdio is selected, while Node
runtimes resolve their lazy stdio adapters through private conditional imports.Align public documentation around Catalog, Runs, Evals, and Health. Narrow
the published Indexer root to Crux-owned compiler contracts; third-party
authoring stays on the experimental/extensionssubpath and is declarative,
limited to extractors plus relation declarations.Correlate successful managed operation results with the exact Core-owned W3C
trace and producing span. Generation hooks and middleware receive finalized
results; stream handles expose identity immediately and repeat it on
completion; completed media, agent/composition, flow, scoring, compaction,
citation, and content-indexing summary envelopes follow the same exact-owner
contract while provider payloads and raw values remain ID-free.
Completed-operation bindings now use the documented exact media-operation
vocabulary; formerly normalized spellings such asgenerate-imageor
generateimageno longer imply a Core-owned media span.Managed AI Eval tasks retain correlated response metadata after removing raw
provider values. Eval cells continue to store logical taskrunIds, while
assertion outcomes store exact related span IDs; neither is relabelled as a W3C
trace ID. Semantic-cache and flow persistence boundaries prevent
invocation-local IDs from leaking across replay or durable execution. The
private deployed-Eval result wire advances to schema version 2 so retained task
responses require the same correlation contract across hosts.Postgres Runtime snapshot decoding now revives nested suspend deadlines, and
terminal retention recognizes expired flow snapshots. -
Publish Linux and macOS
cruxand static-index worker binaries with executable
permissions, and verify an installed platform tarball by runningcrux --help
before stable or nightly publication. Keep the workspace/npmcrux.cjs
launcher executable as well, so pnpm workspace bins can invoke it directly.
Successful automated nightlies are also listed as GitHub pre-releases.