What does NoeticOS actually do?
It tunes the runtime parameters of your agents while they run. Before each task,
recommend() returns the full parameter set (model, temperature, topP, maxTurns,
retryBudget, contextShare) learned for that agent and task class. After the task,
report() feeds back what happened. The engine scores each outcome into a reward, updates
per-class bandits, and converges on the values that maximize your objective.
Why call it the JIT compiler for agents?
A JIT compiler observes a running program and recompiles its hot paths with better optimizations,
without stopping it. NoeticOS does the same for agent runtime parameters: it observes executions,
identifies the hot task classes, and recompiles their parameter sets through canary experiments, while
production traffic keeps flowing.
Is it safe to let a library tune production parameters?
That constraint shaped the whole design. NoeticOS never explores on baseline traffic: exploration is
confined to a deterministic canary cohort, 10% of executions by default, and a canary differs from the
baseline in exactly one parameter at a time. Promotion requires statistical confidence, rollback fires
on much weaker evidence by design, and a hard quality floor rolls back any violating canary regardless
of reward. Every change lands in an append-only audit log with the numbers that justified it.
Which statistics gate promotion and rollback?
Promotion uses Welch's t test on mean reward, with the alpha spread across a Bonferroni look budget,
plus confidence-bound separation: the candidate's lower bound must clear the baseline's upper bound.
Rollback uses an exact binomial test on failure counts, a Wilson score upper bound checked against the
quality floor, and a futility bound that abandons a canary after four times the minimum sample budget
without a verdict.
Does NoeticOS read or store my prompts?
No. The prompt is an optional classifier input and is never stored: snapshots, decisions, and
telemetry carry aggregate statistics only. The OTel ingestion deliberately ignores span events, which
can carry message bodies, and tool-call arguments enter only as caller-computed hashes.
How many runtime dependencies does it add?
Zero. The core is 11.15 kB brotli and uses nothing beyond the JavaScript standard library; the
statistics (Welch, Wilson, exact binomial, P2 quantile estimators) are implemented inside the package.
The family bridges are structural, so even the optional peer packages are never imported by the engine
itself.
Does it run in browsers and edge runtimes?
Yes. The web and edge entry points (10.54 kB brotli each) expose the full engine minus the Node file
backend, so bundles never reference node:fs. Cohort assignment uses a seeded deterministic
PRNG, not platform randomness, so the same configuration behaves identically in Node, Cloudflare
Workers, Vercel Edge, Deno, Bun, and the browser.
How does it integrate with the Vercel AI SDK and OpenTelemetry?
@takk/noeticos/vercel ships a packaged middleware for wrapLanguageModel: it
applies the recommended temperature and topP per call and reports token usage, latency, and finish
reason automatically, for generateText and streamText alike.
@takk/noeticos/otel converts OTel GenAI semantic-convention spans into task descriptors
and outcomes structurally, without importing any OpenTelemetry package; ingestion is live by design,
and replaying exported traces warms the cost and latency quantile bands rather than performing
historical credit assignment.
What evidence backs version 1.0.0?
159 tests across 12 files run on Node 22 and Node 24, with 92.15% line coverage. A 9-scenario tuning
benchmark runs in CI, so a change that stops the engine from beating a static baseline fails the build.
Bundle size budgets are enforced per entry point, and every release is published with SLSA provenance
through GitHub Actions OIDC.
What is the policy on breaking changes?
Strict SemVer 2.0.0 from 1.0.0. Everything exported from the six entry points is the public API, the
state snapshot schema is versioned (version 1 across the 1.x line), and new task kinds may be added in
minor releases, so exhaustive switches over TaskKind should keep a default branch.
Breaking changes require a major bump and a deprecation cycle.