Release Notes¶
v0.1.4 (2026-10-18)¶
Security hardening from a red-team run of ollama/qwen3.5:9b against v0.1.3 (hidden prompt injection in a README exfiltrated a file; docker.sock was reachable inside bwrap).
Security¶
- Sandbox: unix sockets under
/run(includingdocker.sock, a host escape for docker-group users) are masked;/home,/media,/mnt,/srvand/var/tmpare hidden behind tmpfs. Previously python could read them and connect to the socket despite the command-string guard. - Sandbox: secret-looking files are masked at any depth (
.env*,*.pem,*.key,id_rsa,id_ed25519,authorized_keys), not only.env*at the workspace root.sub/.e''nvandserver.pemwere readable throughbash. - Env:
bashnow gets an allowlisted environment instead of a denylist.DATABASE_URL,*_WEBHOOK,STRIPE_*and custom*_KEYvariables leaked before. Opt back in withTETHER_ENV_PASSTHROUGH=A,B. - Web:
web fetchblocks loopback, private, link-local and cloud-metadata addresses, checked on every redirect hop (TETHER_WEB_ALLOW_PRIVATE=1to opt out).
Features¶
- Sandbox: optional network isolation,
tether run|pipeline --no-network/SandboxPolicy(network=False)mapping tobwrap --unshare-net. Sub-agents and stages can only keep or narrow it; withoutbwrapit fails closed. (#23)
Fixes¶
- Sandbox: the fallback command guard no longer rejects awk/sed/grep/perl program or pattern arguments that start with
/. (#31) - Tools: unknown names in
--tools/Harness(tools=...)now raiseValueError(CLI printsError: ..., exit 1) instead of silently loading nothing. (#22)
v0.1.3 (2026-10-18)¶
Fixes¶
- Bash: the
bashtool now receives the original command text instead of ashlex.splitthen" ".joinrebuild, so quotes survive (sed -i 's/a b/c d/' f,grep -n "return list" f,python -c "print(1+1)") and pipelines,&∧keep working. (#37) - History replay: past actions are now replayed to Ollama, OpenAI-compatible and Anthropic providers as real
tool_callsplustoolresults (tool_use/tool_resultblocks on Anthropic) instead ofact('...')assistant text andObservation:user text, which small tool-calling models copied into real arguments and corrupted files. Replayedstdinis a real prefix (first 400 chars, then…) rather than a copyable<N chars>placeholder. Custom providers keep the textual form unless they setstructured_history = True. The system prompt and tools array are unchanged. (#38)
Docs¶
- New runnable example
examples/course/(a plan, research and write pipeline on small local models), used as the running example across the tutorial, and a new Troubleshooting page (symptom, cause, fix, known limitations). Documents@toolargument parsing, thetools.pyplustools:requirement, gate and pipeline practices, observation-folding workarounds, Ollama in Docker, and the awk/sed sandbox false positive.
v0.1.2 (2026-10-18)¶
Fixes¶
@toolargument parsing: extra unquoted words now join into the last positionalstrparameter even when later parameters are optional non-str(yt-search arquitetura em camadaswithdef yt_search(query: str, limit: int = 3)); later optionals are set via--flag.*args: strparameters now receive the words splatted instead of failing withunexpected keyword argument.- Multiplexer: small models that send
edit write/edit replacestdin or thedonedeliverable as one line with literal\n(and\t) escapes now get them unescaped deterministically (only when the stdin has no real newline).bashstdin and all other tools are never touched. (#26)
v0.1.1 (2026-10-18)¶
Fixes¶
- Bash: a command with no output now returns
[exit 0: no output] Command succeeded.instead of a bare[exit 0], which 9B models misread as failure and repeated until the loop breaker fired. - Docs: new tutorial page for gates,
done --ask, project memory, pipelines,statsandretro; added the documented-but-missingtether --version.
v0.1.0 (2026-10-17)¶
Milestone v0.1: Deterministic Control Plane¶
- Pre-
doneVerification Gates:Harness(verify=[...]),--verify, or Skillverify:run inside the sessionSandboxPolicybeforedonecan complete a session (0 static prompt tokens until a gate fails). - Interruptible
WAITING_INPUT&done --ask: sessions can pause for human/parent input and resume viatether send. - Hierarchical Project Memory:
mem pin --project/mem search --projectwith cross-session BM25 RAG. - Telemetry & Failure-Mode Inspector (
tether stats): per-model pass rate, token cost, step latency and ACI friction offenders. - Deterministic Multi-Stage Pipelines (
tether pipeline): isolated stage sessions, heterogeneous model routing, monotonic sandbox attenuation, ~50-token stage handoffs. - Post-Mortem Distillation (
tether retro):tether retro <session_id> [--apply]extracts a session's friction trace (inbox corrections, loop stalls, syntax/tool errors, gate failures) and distills at most 2 deduplicated rules (<= 30 tokens each) intoSKILL.mdunder## Learned Rules, or project memory when no skill was used. Runs offline, never mutating a live prompt.
Fixes found during release validation¶
- Sandbox:
bwrapnow really unshares PID/IPC namespaces (docs claimed it); underbwrap,.env*,.tether/,.git/configand.git/hooksare now masked at the kernel level. Previously only a command-string regex guarded them, socat .e*orcat $(echo .en)vread secrets andecho >> .git/con*modified git config.SSH_AUTH_SOCK/GPG_AGENT_INFOare scrubbed and/run/useris hidden. tether stats: pipeline root sessions are excluded; they invented a run for the default model and double-counted stage tokens.- Multiplexer: an unknown first token (e.g. a raw
echo hi > f) now hintsbash <cmd>when thebashtool is enabled; small models previously looped on the bare error. - CLI:
tether pipeline(missing file, invalid YAML, stage withoutgoal) andtether send <unknown id>printError: ...and exit 1 instead of a traceback.
v0.0.3 (2026-10-17)¶
Architectural & Performance Upgrades¶
- Head + Tail L1 Active Observation Elision (
tether/context.py): Oversized active observations (> 2,400 chars) are deterministically elided in L1 working memory to their first 900 chars (headers/command summary) + last 900 chars (stack trace/exit code) with a pointer tomem recall/mem search, preserving full outputs in SQLite FTS5. - Deterministic Loop-Stall Breaker (
tether/harness.py): Consecutive identical(cmd, stdin)calls from small 8B/9B models are intercepted before tool execution and answered with a deterministic[LOOP DETECTED]recovery nudge. - 100% KV-Cache Prefix Immutability Across Pins (
tether/context.py,tether/providers/anthropic.py):[PINNED MEMORY]is attached to the tail message after window trimming so earlier turn messages remain 100% byte-identical when pins change; added Anthropic ephemeralcache_controlbreakpoints. - Persistent Connection Pooling & Thread-Local SQLite WAL (
tether/providers/*,tether/store.py): Reuses persistenthttpx.AsyncClientinstances across turns and caches thread-local SQLite WAL connections withPRAGMA temp_store=MEMORY;and 128 MBmmap_size.
Packaging, Documentation & CI¶
- PyPI Trusted Publishing (
tether-sdk): Published on PyPI astether-sdk(pip install tether-sdk/uv add tether-sdk) with automated OIDC delivery (.github/workflows/delivery.yml). - Flattened Package Layout: Moved
tether/to the repository root (removingsrc/). - MkDocs Documentation Site: Added full documentation, tutorials, literature review, and
mkdocstringsAPI reference athttps://igormcsouza.github.io/tether/(.github/workflows/docs.yml). - Modular Test Suite & 100% Coverage CI Gate: Split unit tests into 20 per-module test files under
tests/and added.github/workflows/ci.ymlenforcingruff,mypy,mkdocs build --strict, andpytest --cov=tether --cov-fail-under=100.
v0.0.2 (2026-10-17)¶
SDK Provider Extensibility & Literature Grounding¶
- Custom SDK Provider Registry (
register_provider): Addedregister_provider(prefix, factory)intether.providersso SDK consumers can route<prefix>/<model>identifiers through custom gateways, local inference engines, or test transports. - Literature Grounding: Documented architectural alignment with Maia et al. (2026), Wang et al. (CodeAct, ICML 2024), Yang et al. (SWE-agent, NeurIPS 2024), and Packer et al. (MemGPT, 2023).
v0.0.1 (2026-10-16)¶
Initial Release¶
- Single
act(cmd, stdin)action multiplexer with< 150tokens of base framing overhead. @toolPython function introspection with JIT--helpdisclosure (<= 60tokens).- SQLite WAL session store + FTS5 BM25 RAG (
chunks_fts) and ephemeral \(K\)-turn observation folding. - Detached headless worker execution (
tether run --headless,wait,send,query,read,list). - Always-async multi-agent orchestration (
agent spawn,wait,query,read,send). - Deterministic
SandboxPolicywith workspace path confinement, secret environment scrubbing, and Linuxbwrapisolation.