Releases: scootship/scoot
Release list
v0.9.2
Changed
- The repository moved from
jamiesun/scootto the
scootshiporganization
(scootship/scoot). All references
were updated accordingly ([#202]): the release workflow now publishes to
scootship/homebrew-tapandscootship/apt-tap,install.shdefaults to
scootship/scoot, and the install instructions across the README, release
footer, and bilingual docs usebrew install scootship/tap/...and the
scootship.github.io/apt-tapapt source.
Install
curl -fsSL https://raw.githubusercontent.com/scootship/scoot/main/install.sh | shAdd SCOOT_INSTALL_EDGE=1 to the same command to also install the optional
scoot-edge fleet companion (never installed unless requested).
macOS (Homebrew):
brew install scootship/tap/scoot # the agent
brew install scootship/tap/scoot-wasm # optional Wasm compute-unit host (pulls in scoot)
brew install scootship/tap/scoot-edge # optional fleet companion (pulls in scoot)Debian/Ubuntu (apt, amd64/arm64/armhf):
curl -fsSL https://scootship.github.io/apt-tap/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/scootship-apt-tap.gpg
echo "deb [signed-by=/usr/share/keyrings/scootship-apt-tap.gpg] https://scootship.github.io/apt-tap stable main" | sudo tee /etc/apt/sources.list.d/scootship-apt-tap.list
sudo apt update
sudo apt install scoot # the agent
sudo apt install scoot-wasm # optional Wasm compute-unit host (pulls in scoot)
sudo apt install scoot-edge # optional fleet companion (pulls in scoot)Build flavors
Prebuilt archives are ReleaseSafe only (runtime safety checks on). If you
need a smaller binary, compile from source:
zig build -Doptimize=ReleaseSmall # smallest, fewer safety checksEach target also ships a separate scoot-wasm-* archive (the optional
standalone Wasm host) and a separate scoot-edge-* archive (the optional
fleet companion). The zero-dependency core scoot binary never embeds either.
v0.9.1
Fixed
- The GitHub release notes footer (
.github/release-footer.md) still said
apt packaging wasscoot-edgeonly and only showed anapt install scoot-edgeexample. It now matches the Homebrew block above it and lists
all three packages (scoot,scoot-wasm,scoot-edge), reflecting the
apt coverage shipped inv0.9.0.
Install
curl -fsSL https://raw.githubusercontent.com/jamiesun/scoot/main/install.sh | shAdd SCOOT_INSTALL_EDGE=1 to the same command to also install the optional
scoot-edge fleet companion (never installed unless requested).
macOS (Homebrew):
brew install jamiesun/tap/scoot # the agent
brew install jamiesun/tap/scoot-wasm # optional Wasm compute-unit host (pulls in scoot)
brew install jamiesun/tap/scoot-edge # optional fleet companion (pulls in scoot)Debian/Ubuntu (apt, amd64/arm64/armhf):
curl -fsSL https://jamiesun.github.io/apt-tap/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/jamiesun-apt-tap.gpg
echo "deb [signed-by=/usr/share/keyrings/jamiesun-apt-tap.gpg] https://jamiesun.github.io/apt-tap stable main" | sudo tee /etc/apt/sources.list.d/jamiesun-apt-tap.list
sudo apt update
sudo apt install scoot # the agent
sudo apt install scoot-wasm # optional Wasm compute-unit host (pulls in scoot)
sudo apt install scoot-edge # optional fleet companion (pulls in scoot)Build flavors
Prebuilt archives are ReleaseSafe only (runtime safety checks on). If you
need a smaller binary, compile from source:
zig build -Doptimize=ReleaseSmall # smallest, fewer safety checksEach target also ships a separate scoot-wasm-* archive (the optional
standalone Wasm host) and a separate scoot-edge-* archive (the optional
fleet companion). The zero-dependency core scoot binary never embeds either.
v0.9.0
Added
- The
aptrelease job now packages the corescootbinary and the
optionalscoot-wasmhost as.debs alongside the existingscoot-edge
package, all pushed to the shared
jamiesun/apt-taprepository.
scoot-wasmandscoot-edgenow declare an aptDepends: scoot
(matching the dependency already expressed by their Homebrew formulae),
soapt install scoot-wasm/scoot-edgepulls in the core agent
automatically.
Install
curl -fsSL https://raw.githubusercontent.com/jamiesun/scoot/main/install.sh | shAdd SCOOT_INSTALL_EDGE=1 to the same command to also install the optional
scoot-edge fleet companion (never installed unless requested).
macOS (Homebrew):
brew install jamiesun/tap/scoot # the agent
brew install jamiesun/tap/scoot-wasm # optional Wasm compute-unit host (pulls in scoot)
brew install jamiesun/tap/scoot-edge # optional fleet companion (pulls in scoot)Debian/Ubuntu (apt, scoot-edge only, amd64/arm64/armhf):
curl -fsSL https://jamiesun.github.io/apt-tap/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/jamiesun-apt-tap.gpg
echo "deb [signed-by=/usr/share/keyrings/jamiesun-apt-tap.gpg] https://jamiesun.github.io/apt-tap stable main" | sudo tee /etc/apt/sources.list.d/jamiesun-apt-tap.list
sudo apt update && sudo apt install scoot-edgeBuild flavors
Prebuilt archives are ReleaseSafe only (runtime safety checks on). If you
need a smaller binary, compile from source:
zig build -Doptimize=ReleaseSmall # smallest, fewer safety checksEach target also ships a separate scoot-wasm-* archive (the optional
standalone Wasm host) and a separate scoot-edge-* archive (the optional
fleet companion). The zero-dependency core scoot binary never embeds either.
v0.8.0
Security
- Model-triggered
bashcalls now run with a scrubbed subprocess environment:
ambient variables whose name matchesKEY/TOKEN/SECRET/PASSWORD/
PASSWD/CREDENTIAL, plus the configuredbackend.api_key_env, are dropped
before the child process starts. Previously bash subprocesses inherited the
full parent environment, so a shell command could read out the backend API
token or other ambient credentials it was never granted (#190). guardedmode's local-read guard now also denies known secret-bearing paths
— the resolved token file, a distinct configuredbackend.api_key_file, and
common credential fragments such as.ssh,.env,id_rsa,token,
secret,credentials— the same checkreadonlyalready enforced.
Previously this path check only ran inreadonly, so the defaultguarded
mode couldfile_reada secret file straight through (#191).- Tool call input, tool observation, thought, final replies, and PostToolUse
audit-hook payloads are now scanned for known secret values (the resolved
backend token and the value of any ambient secret-named env var) and
redacted to[REDACTED]before they reach the audit log, trace output, or
structured event sink. Previously these channels recorded raw text
verbatim, so a secret surfaced by any tool call could be durably persisted
inlogs/audit.jsonl. The live conversation history sent back to the model
is unaffected — only recording/observability channels are redacted (#189).
Added
- The audit log (
logs/audit.jsonl) now rotates into a bounded, gap-tracked
chain of numbered generations (logs/audit.jsonl.<gen>) instead of a single
destructively-overwritten.1backup. A durablelogs/audit.jsonl.gen
sidecar tracks the current generation across process restarts; up to
[audit].max_retained_generations(default8, override
SCOOT_AUDIT_MAX_RETAINED_GENERATIONS) retired generations are kept, and any
eviction beyond that cap is durably recorded in
logs/audit.jsonl.gaps.jsonlrather than silently disappearing.scoot doctornow reportsaudit.retentionasWARNif any gap was ever
recorded. This removes the audit-history data-loss blocker that a future
scoot-edgeaudit shipper would otherwise hit (#187). scoot-edgeE2 job dispatch:scoot-edge dispatch(one-shot) and
scoot-edge run --enable-jobs(folded into the heartbeat loop) poll aGET
job lease, schema-validate each envelope, and execute accepted jobs as
scoot --unattended -e "<goal>" --session-id job-<job_id>with cwd confined
to a required--job-root(never$HOMEor/). Both require--job-root
and--lease-url; either missing, or--lease-urlnot HTTPS without
--allow-insecure-http, is a config error (exit2), matching the existing
--center-url/token gate. A bounded, persistent idempotency store
(edge/idem.jsonl, capped by--idem-cap, default500) re-acks a
redeliveredidem_key's prior outcome instead of re-running the job, and
every phase transition (accepted→done/failed/rejected) is both
POSTed as ajob_eventand appended to an edge-side provenance log
(logs/edge-audit.jsonl), correlated bysession_idto Scoot's own run
audit. A new core--session-id <id>flag onscoot -elets a caller pin
the session file name instead of the default UUID, which is what makes this
job_id↔session_idcorrelation possible (#186).scoot-edgeE3 packaging (complete): the release workflow builds,
archives (scoot-edge-<target>.tar.gz+.sha256), and publishes a
scoot-edgeHomebrew formula (brew install jamiesun/tap/scoot-edge,
depending onscoot) for every tagged release, mirroring the existing
scoot-wasmpackaging.install.shgained an opt-inSCOOT_INSTALL_EDGE
variable that additionally downloads and installsscoot-edgealongside
corescoot; it is never installed unless explicitly requested. A new
optionalaptjob (gated byAPT_TAP_TOKEN, mirroring the Homebrew job's
HOMEBREW_TAP_TOKEN) builds a.debper Linux architecture and pushes it
to the sharedjamiesun/apt-tap
repository, which owns the GPG signing key and publishes the signed apt
index to GitHub Pages on every push, closing out #171.
Documentation
- Fixed docs, README, and book examples that showed the unattended one-shot
clamp asscoot -e --unattended <goal>— a rejected argv order, since
-e/--evalgreedily consumes the very next token as the goal string.
Examples and prose now consistently show the accepted
scoot --unattended -e "<goal>"order (#192).
Install
curl -fsSL https://raw.githubusercontent.com/jamiesun/scoot/main/install.sh | shAdd SCOOT_INSTALL_EDGE=1 to the same command to also install the optional
scoot-edge fleet companion (never installed unless requested).
macOS (Homebrew):
brew install jamiesun/tap/scoot # the agent
brew install jamiesun/tap/scoot-wasm # optional Wasm compute-unit host (pulls in scoot)
brew install jamiesun/tap/scoot-edge # optional fleet companion (pulls in scoot)Debian/Ubuntu (apt, scoot-edge only, amd64/arm64/armhf):
curl -fsSL https://jamiesun.github.io/apt-tap/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/jamiesun-apt-tap.gpg
echo "deb [signed-by=/usr/share/keyrings/jamiesun-apt-tap.gpg] https://jamiesun.github.io/apt-tap stable main" | sudo tee /etc/apt/sources.list.d/jamiesun-apt-tap.list
sudo apt update && sudo apt install scoot-edgeBuild flavors
Prebuilt archives are ReleaseSafe only (runtime safety checks on). If you
need a smaller binary, compile from source:
zig build -Doptimize=ReleaseSmall # smallest, fewer safety checksEach target also ships a separate scoot-wasm-* archive (the optional
standalone Wasm host) and a separate scoot-edge-* archive (the optional
fleet companion). The zero-dependency core scoot binary never embeds either.
v0.7.0
Added
- Unattended one-shot policy clamp (
scoot -e --unattended): the E2 keystone
prerequisite forscoot-edgejob dispatch. An unattended-erun now computes
its effective policy in-child as
correctUnattended(privilegeMin(requested, edge.max_job_policy)), so argv (and a
future wire) can only ever lower policy below the local ceiling, never raise it.
A new local-only[edge].max_job_policyconfig knob (defaultreadonly, override
SCOOT_EDGE_MAX_JOB_POLICY) is the ceiling; an optional--policy <mode>may
only lower it. ThecorrectUnattended/privilegeMinlattice
(readonly ⊑ guarded ⊑ unrestricted, deliberately not theModeenum order)
is now the single source of truth shared with the scheduler'seffectiveMode. scoot-edge(E1) gains a continuousrunheartbeat loop: it dials out and
POSTs a status heartbeat on a--interval-mscadence until stopped, with a
bounded jittered exponential backoff on transient failure (the loop never
crashes and never opens a listener) and an optional--max-postsbound for
supervised/bounded runs. Each iteration uses a reset-per-post arena so an
unbounded run holds bounded memory. The heartbeat can also carry an opt-in,
advisorynodecapability descriptor (--report-capabilities, off by
default;--label/--skillplusSCOOT_EDGE_LABELS/SCOOT_EDGE_SKILLS
feed it) for capability-aware routing — advertising never grants authority, the
local policy ceiling still gates every job.scoot-edge runnow shuts down gracefully onSIGINT/SIGTERM: it finishes
the in-flight heartbeat, then exits0instead of being hard-killed, making it a
well-behaved systemd/launchd service. One-shot commands gained stable, documented
exit codes (0success,1dial-out POST failed,2config/usage error,3
local-status collection failed), so a failed/missingscoot daemon status --json
child now prints a clean message instead of a raw error trace.
Install
curl -fsSL https://raw.githubusercontent.com/jamiesun/scoot/main/install.sh | shmacOS (Homebrew):
brew install jamiesun/tap/scoot # the agent
brew install jamiesun/tap/scoot-wasm # optional Wasm compute-unit host (pulls in scoot)Build flavors
Prebuilt archives are ReleaseSafe only (runtime safety checks on). If you
need a smaller binary, compile from source:
zig build -Doptimize=ReleaseSmall # smallest, fewer safety checksEach target also ships a separate scoot-wasm-* archive: the optional
standalone Wasm host. The zero-dependency core scoot binary never embeds it.
v0.6.0
Added
-
Project-wide audit agent skill (
project-audit) that scores ten dimensions
of repository health (docs↔functionality, security, config consistency,
bilingual parity, build/test, memory discipline, public-API surface, …) into a
single reproducible report (#168). -
scoot-edgeE1 status heartbeat for the optional edge fleet agent, plus the
E0 boundary documentation for the optionalscoot-edgedeployment (#172, #173). -
WebAssembly spec conformance tests for the bundled
scoot-wasmengine. A
curated subset of the official WebAssembly/testsuite (pinned at revision
193e551f) is converted offline withwast2jsonand committed under
test/wasm-spec/, then replayed against the engine by an always-run
zig build testtarget. The core stays zero-dependency (fixtures are embedded
via@embedFile; no toolchain needed at test time). See
docs/WASM_TOOLS.mdfor the
included/excluded coverage and how to regenerate (#163). -
Opt-in PostToolUse-style audit/observability hook (
[audit.hook]). After a
tool action completes (executed or policy-denied), an external Wasm package
(manifest kindaudit, compute-only) receives a structured JSON event for an
external SIEM/analytics/org-audit pipeline. Purely observational — never gates
execution — and best-effort: any failure/timeout is counted and surfaced as a
flush warning, never fatal. Default off (#137). -
Structured ReACT event sink for protocol adapters: an optional in-process
observer receives typed lifecycle events (thinking, step, observation,
policy_deny, final, …) so embedders can build protocol adapters without parsing
trace text (#156). -
Opt-in PreToolUse-style policy hook at the unified
guard()chokepoint
([tools.policy_hook]). After built-in checks allow an action, an external
Wasm policy package (manifest kindpolicy, compute-only) may further restrict
it — allow→deny only, never relaxing a built-in deny. Fail-closed on any
failure/timeout/invalid output, audited, and reflected byscoot policy check.
Default off (#136).
Fixed
scoot-wasm:iNN.trunc_fMM_s/uno longer traps on fractional inputs whose
truncated (toward-zero) integral value is in range — e.g.
i32.trunc_f64_s(-2147483648.9). The range check now runs after truncation
instead of against the raw operand, matching the spec (surfaced by the new
conformance suite, #163).scoot-wasm: hardened the loader/interpreter against hostile bytecode by
replacing unreachable-by-constructionunreachablesites with explicit decode
errors and traps, and removed an OOM→panic path in the WASI test host (#174,
#181).
Security
- Tightened the agent boundary guardrails so untrusted tool output cannot widen
authority (#176).
Documentation
- Compute-unit build guidance, trigger/discovery notes for Wasm tools, and the
scoot-edgeE0 boundary doc (#170, #172).
Install
curl -fsSL https://raw.githubusercontent.com/jamiesun/scoot/main/install.sh | shmacOS (Homebrew):
brew install jamiesun/tap/scoot # the agent
brew install jamiesun/tap/scoot-wasm # optional Wasm compute-unit host (pulls in scoot)Build flavors
Prebuilt archives are ReleaseSafe only (runtime safety checks on). If you
need a smaller binary, compile from source:
zig build -Doptimize=ReleaseSmall # smallest, fewer safety checksEach target also ships a separate scoot-wasm-* archive: the optional
standalone Wasm host. The zero-dependency core scoot binary never embeds it.
v0.5.0
Added
- Added a committed
playground/test environment that exercises full action
coverage end-to-end against a real backend (#161). scoot-wasmnow executes floating-point Wasm (W4): f32/f64 arithmetic
(add/sub/mul/div), unary ops (abs/neg/ceil/floor/trunc/nearest/sqrt),
min/max/copysign, ordered comparisons, int/float conversions, and both
trapping (iNN.trunc_fMM_s/u) and saturating (iNN.trunc_sat_fMM_s/u)
truncation, alongside the already-supported bulkmemory.copy/memory.fill.
NaN results are canonicalized for deterministic output across hosts, while
abs/neg/copysign preserve exact bit patterns;nearestrounds ties to even
and the zero sign is preserved. The static type validator now type-checks the
float opcodes too, so float modules load and run end-to-end. A robustness
suite now feeds truncated, byte-corrupted, and random/hostile module bytes
through the loader and asserts every input yields a structured load error or
trap instead of crashing. Full spec-conformant validation beyond the
supported subset remains a later phase (#100).- Added a native
wasm_toolAgent action for compute-only local Wasm packages.
It validates the package boundary, requiresentry = "_start"plus
policy.tomlgranting onlycompute, and runs the configuredscoot-wasm
host argv directly instead of giving the model a broadbashcommand.
With the default host config, Scoot now prefers a siblingscoot-wasmnext to
the runningscootbinary before falling back to PATH. - Added a copyable Wasm compressor plugin template, a deterministic redactor
compressor example, andscripts/check-wasm-examples.shto build, validate,
and smoke-test the example packages. scoot-wasmnow performs a W3 static function-body type validation pass for
the current host subset before execution. It checks operand/control stack
shapes, block/loop/if signatures, branch labels, direct and indirect call
signatures, local/global access, memory/table presence, and immutable globals,
so malformed type/index errors fail module loading instead of reaching the
interpreter. Full spec-conformant validation beyond the supported subset is
still a later phase (#100).scoot-wasmnow runswasm32-wasicommand modules over a minimal WASI
preview1 subset (W2):scoot-wasm wasi <module.wasm> [args...]instantiates
the module, runs_start, pipes this process's stdin to fd 0, forwards the
module's stdout/stderr, and exits with itsproc_exitstatus. The exposed
surface is a pure data-transform sandbox: the only channels are stdin
(fd_read, fd 0), stdout/stderr (fd_write, fd 1/2), argv (args_*), and
proc_exit. No environment, clock, randomness, filesystem, or network is
exposed —environ_*,clock_time_get,random_get, and every other WASI
import trap by construction, so a plugin's output is a pure function of its
(stdin, argv). Out-of-bounds guest pointers return EFAULT and non-stdio fds
return EBADF. This is the intended subprocess host for external compression
plugins (#100).scoot-wasmnow executes integer Wasm functions (W1): a dependency-free Zig
stack machine with structured control flow (block/loop/if/else/br/br_if/
br_table/return/call/call_indirect), i32/i64 arithmetic, a bounds-checked
64 KiB-page linear memory (load/store, memory.size/grow), globals, a funcref
table, and active data/element segments. Every fault is a structured trap
(unreachable, divide-by-zero, integer overflow, out-of-bounds memory/table,
indirect-call type mismatch) bounded by fuel, call-depth, and memory-page
limits. Invoke withscoot-wasm run <module.wasm> <export> [int args...].
The engine is compiled only into the standalonescoot-wasmbinary
(-Dwasm-host=true); the zero-dependency core never links it. Full
spec-conformant validation beyond the supported subset remains a later
phase (#100).- Release workflow now publishes a separate
scoot-wasm-<target>.tar.gzarchive
(plus.sha256) for every target, built in the same job via
-Dwasm-host=true. The optional standalone Wasm compute-unit host is now a
downloadable artifact, not a build-from-source-only binary. - Added a Homebrew tap publish job (
brew install jamiesun/tap/scootand
brew install jamiesun/tap/scoot-wasm). Thescoot-wasmformula depends on
scoot, so installing the host also installs the agent; the default
wasm_hostthen resolvesscoot-wasmfromPATH. The job no-ops unless a
HOMEBREW_TAP_TOKENsecret is set, mirroring the optional Docker Hub publish.
Changed
- Release archives now ship a single
ReleaseSafeflavor per target instead of
bothReleaseSafeandReleaseSmall. Users who need a smaller binary compile
from source with-Doptimize=ReleaseSmall; the published release notes carry a
permanent footer documenting this and the optional Wasm host.
Removed
- Dropped the
-small(ReleaseSmall) release artifacts and the installer's
SCOOT_INSTALL_FLAVORvariable.install.shnow downloads the single
published flavor. - Narrowed the Wasm plugin sandbox to stdin/stdout/stderr/argv as a new hard
rule: no filesystem, network, clock, or randomness authority (#164).
Documentation
- Rewrote the README to be human-friendly and concept-first, and refreshed the
infographic with an isometric hero image (#160, #165). - Removed the redundant README language link and translated remaining Chinese
comments and strings to English (#146, #153).
Install
curl -fsSL https://raw.githubusercontent.com/jamiesun/scoot/main/install.sh | shmacOS (Homebrew):
brew install jamiesun/tap/scoot # the agent
brew install jamiesun/tap/scoot-wasm # optional Wasm compute-unit host (pulls in scoot)Build flavors
Prebuilt archives are ReleaseSafe only (runtime safety checks on). If you
need a smaller binary, compile from source:
zig build -Doptimize=ReleaseSmall # smallest, fewer safety checksEach target also ships a separate scoot-wasm-* archive: the optional
standalone Wasm host. The zero-dependency core scoot binary never embeds it.
v0.4.0
Added
- Embedded runs now emit session-correlated audit events and write per-session
JSONL state, making API-driven runs replayable and easier to inspect (#140). - Added read-only session and audit commands:
scoot sessions list,
scoot session show <id>, andscoot audit show <session-id>(#141). - Added the foreground
scoot servestdio NDJSON protocol withrun,
session.list,session.get, andaudit.querymethods for local app-server
integrations (#142).
Changed
- Hardened the serve and daemon lifecycle: stdio
runuses request-scoped
result allocation and default retry semantics, anddaemon stoponly signals
a process when the pid matches the recorded running daemon state (#143).
v0.3.0
Added
- Docker releases now publish multi-platform Linux images for
linux/amd64,
linux/arm64, andlinux/arm/v7to GHCR, with optional Docker Hub publishing
when Docker Hub credentials are configured. The default image uses a minimal
BusyBox/musl runtime and matching Alpine runtime tags use an-alpinesuffix. scoot setupinteractive command generates a config directory in a few
prompts (config dir with overwrite confirmation, backendbase_url/model,
token source via env/0600 file/command,max_turns, policy), creates the
runtime tree, and writesconfig.tomlwithout ever inlining the token —
the fast path for provisioning multiple isolated instances on one host.- Release workflow now publishes explicit
ReleaseSmallassets with-small
suffixes for every supported target. - Installer supports
SCOOT_INSTALL_FLAVOR=smallto select the small release
artifact instead of the defaultReleaseSafeartifact. - Native
recallaction can retrieve exact earlier messages from the current
session transcript archive after active context compaction (#99). - Stable embedding API surface now separates the public package root from the
CLI/internal module and includes a compiled minimal embed example (#106). backend.storeconfig key andSCOOT_BACKEND_STOREoverride to opt into
Responses API server-side response persistence; defaults to off so Scoot
stays stateless and local-first (#110).- Client-side MCP support through a guarded
mcp_callmeta-action and
[[mcp.servers]]config. The client now supports stdio, Streamable HTTP, and
legacy SSE transports behind the same config and policy seam, including
per-server header authentication via environment-backed values (#103). - External context compressor plugins can now be selected with
agent.compactor = "plugin:<name>"and configured under
[agent.compactor_plugin.<name>]. Packages reuse thewasm_tooldescriptor
boundary withkind = "compressor"and run as bounded subprocesses with
extractive/drop fallback (#98).
Changed
- Scoot now speaks only the OpenAI Responses API (
/v1/responses): leading
system messages map to the top-levelinstructionsfield, the rest become the
inputarray, and transport is stateless by default (fullinputresent each
turn) so local context compaction stays in control. Requires a Responses-capable
backend such as Ollama >= 0.13.3, vLLM, or OpenAI (#110). - Guarded mode now confines file writes to the project root by default, wraps
tool observations in an explicit untrusted-data boundary, and requires an
opt-in for repository-carried<cwd>/.agents/skills(#113). - Context compaction now goes through a
Compressorstrategy seam withdrop
retained as the smallest fallback strategy (#97). - Added the built-in
extractivecompactor andagent.compactor/
SCOOT_AGENT_COMPACTORselection (#97).
Removed
- OpenAI Chat Completions transport, the
backend.apiselector, and the
SCOOT_BACKEND_APIoverride; the Responses API is now the only transport.
Configs that still setapiare ignored with a one-line deprecation warning
(#110). - The
backend.prompt_cachehint andSCOOT_BACKEND_PROMPT_CACHEoverride
(with the Anthropic-stylecache_controlbreakpoint); theinstructions
field is natively prompt-cached, so the manual hint is obsolete. Stale keys are
ignored with a deprecation warning (#110).
Fixed
-eand REPL runs now get per-process session transcript ids instead of
appending every run to sharedcli.jsonlandrepl.jsonlfiles (#95).- Default agent configuration now enables a conservative context budget with
extractivecompaction, whilecontext_budget_bytes = 0still explicitly
disables the guard (#96). - Catastrophic shell-command detection now also catches whitespace-obfuscated
fork-bomb patterns (#113). - GitHub workflows now pin action references to commit SHAs and verify the
downloaded Zig toolchain tarball checksum before extraction (#113). - MCP stdio tests now use per-process temp directories, so the parallel
zig build testartifacts no longer race on shared/tmppaths (#122). - MCP SSE transport now enforces a single cumulative timeout across the entire
session (connection setup,receiveHead, every POST, and every event read) so
a server that accepts the connection but never sends headers, or that dribbles
one event just before each per-event deadline, can no longer hang the agent
indefinitely (#123). - MCP remote header values sourced from environment variables (
value_env) are
now checked for CR/LF, closing a header-injection gap where the literal
valueandprefixwere validated but the resolved env value was not (#124). - MCP stdio transport now bounds the child-process stdin write with the
configured timeout. Previously a server that never drained its stdin blocked
the write forever once the OS pipe buffer filled with the model-controlled
request, and thedefer child.killcleanup could never run (#125). zig build testnow runs its three test artifacts sequentially instead of
in parallel, so tests that share hardcoded/tmp/scoot_*paths across
binaries no longer race (one binary'sdeleteTreeremoving a file another is
mid-execon); compilation still parallelizes (#127).
v0.2.0
Added
SCOOT_*environment overrides for zero-config and CI runs (#67)- Windowed
file_readsupport with offset/limit line ranges (#78) - Context compaction at the configured context budget instead of aborting the run (#81)
- Optional grep context lines around matches (#82)
- Config-gated prompt-cache breakpoint for stable model prompts (#84)
- Zero-dependency
outlineaction for low-token file skeletons (#85) - POSIX release installer that downloads, verifies, and installs the matching binary (#90)
- Run summaries on stderr after CLI/REPL runs, including event counts, tool calls, policy denies, backend status, and transcript path (#59)
- Minute-level 5-field UTC cron scheduling for
schedule.jobs(#65)
Changed
~/.agents/skillsdiscovery is now opt-in while project-local and Scoot-local skills remain enabled (#87)- Repeated read-only observations are deduplicated within a run (#83)
- Agent observations are token-optimized by stripping ANSI, using head/tail windows, and enforcing token caps (#80)
- Per-turn thoughts are no longer persisted in run history (#79)
- Runtime directories and JSONL audit/session files now use owner-only permissions, and JSONL files rotate to
.1at a bounded size (#60, #61) - GitHub workflows now use Node 24-compatible actions and shell-based Zig setup (#63)
build_optionsis imported by the executable root module as well as the library module (#64)parseStepnow tolerates compatibility backends that wrap the step JSON in a Markdown code fence or emit multiple concatenated JSON objects, executing only the first step while keeping single-step ReACT semantics
Fixed
- Language switching now lives in the mdBook navigation icon bar (#86)
- Invalid enum-like
SCOOT_*overrides now warn and keep the previous value instead of silently changing policy/mode/level (#68) confine_writesnow rejects a pre-existing symlink at the final write path component (#69)
Documentation
- Added maintained changelogs and made release notes derive from them (#66)
- Improved README and user-guide structure, including installer docs, design philosophy, best-practice cases, and daemon/run-mode guidance (#90)
- Added Scoot logo and favicon assets, plus an animated documentation landing mark (#91)
- Folded the logo into the README/mdBook infographic and removed duplicate standalone logo blocks (#92)