Tirith 0.4.0 release notes
Released 2026-08-25. This release integrates the work merged after 0.3.3 and
publishes it through Tirith's protected, single-use release pipeline.
Why 0.4.0
This is a new minor release rather than a 0.3.4 patch. It adds major public
capabilities, commands, policy sections, document schemas, agent integrations,
and platform-specific enforcement boundaries. 0.4.0 communicates that scope
without skipping an unused 0.4 line. The project remains pre-1.0, so callers
should read the compatibility notes below before upgrading.
Release highlights
Python artifact inspection and package firewall
- Version intent preserves exact pins, ranges, compatible constraints,
exclusions, and unresolved requirements through package threat assessment
instead of flattening them to a package name. tirith package inspectanalyzes wheel files, sets of wheels, or installed
environments without downloading them.- A bounded streaming wheel reader rejects traversal, collisions, encrypted
entries, conflicting distribution metadata, CRC failures, decompression
abuse, and ambiguous identities. - Wheel RECORD and installed-environment RECORD verification detect missing,
modified, unowned, or multiply owned files. - Python startup execution through
.pth,.start,sitecustomize, and
usercustomizeis modelled as an execution chain rather than ordinary data. - ELF, Mach-O, and PE triage finds native extensions and correlates native
imports, runtime launches, loaders, and payloads. - Artifact-set inspection can detect a loader in one distribution that reaches
a payload shipped by another distribution. tirith pkg approveandtirith pkg installbind resolution, exact artifact
hashes, inspection results, approval state, contained execution, environment
verification, and a tamper-evident receipt.tirith pkg graph,diff,attest,attest-npm,verify-env, and
receiptexpose ownership, execution, release-delta, provenance, integrity,
and evidence workflows.
The enforcing installer supports pip on x86_64 Linux only. It refuses before
pip starts on other platforms and never falls back to an uncontained install.
npm and Cargo are evidence surfaces, not package-firewall enforcement.
Threat intelligence v2
- The signed v2 database adds artifact SHA-256, installed-file hash,
malicious-URL, campaign, and behavior-tag indices to package, domain, and IP
reputation. - The compiler, signed index, updater, and loader support v1 and v2 together so
older clients can keep using v1 during the staged cutover. - Monotonic sequence checks prevent rollback, publication is transactional,
and an invalid update cannot replace the signed last-known-good database. - OpenSSF malicious-package events retain their actual package and version
semantics. A bounded affected range is no longer promoted to a whole-package
block, and a resolution timeout is reported as incomplete verification, not
evidence that a package is malicious. - The DigitalSide source is implemented but intentionally inactive until its
freshness and operating contract are approved.
Byte-classified file and artifact analysis
- Files are classified by magic bytes read through the retained no-follow
handle, not merely by name or suffix. - Misnamed, extensionless, malformed, polyglot, archive, native, and unknown
binary content receives an explicit route and coverage outcome. - Typed outcomes distinguish a completed clean analysis from unsupported,
skipped, rejected, or budget-exhausted work. - Global finding and output budgets preserve Critical, High, and
analysis_incompleteevidence ahead of lower-value output.
Web3 and untrusted-task boundaries
- A bounded command grammar models state-changing Cast, Forge, Hardhat,
Solana, and Anchor operations without reading chain state or simulating a
transaction. web3_guardcan classify network and signer policy, and new findings cover
state changes, signer risk, and network-policy violations without echoing
secrets, private paths, or destinations.- Command-card schema 2 can bind ordered Web3 operations, network identity,
signer kind, artifact hashes, and policy identity while keeping schema-1
signing bytes compatible. - Untrusted task envelopes retain Tirith-assigned provenance through a bounded
effect decision.tirith task checkand the preview-gated
tirith_check_taskMCP tool are diagnostic and execute nothing. - The task gate is wired immediately before Tirith-owned irreversible
transitions. Defaults are inert; enforcement must be explicitly configured. tirith capsule run --preset untrusted-projectcopies a project into a held
ephemeral tree and executes exact argv under fail-closed containment on
x86_64 Linux with a usable Landlock ABI. Other platforms refuse before copy
or spawn.
AI-agent and MCP protection
tirith setupsupports 19 named hosts. The complete enforcement, scope, and
verification matrix is maintained in
Agent integrations.- New setup paths cover Grok Build, OMP, OpenCode, Vercel Labs fx, Prime Agent,
Cline, Roo Code, Continue, and OpenHands in addition to the previously
supported Claude Code, Codex, GitHub Copilot CLI, Cursor, Gemini CLI, Kiro,
OpenClaw, Pi CLI, VS Code, and Windsurf integrations. - Prime Agent, OMP, Cline, and OpenHands now receive blocking pre-execution
hooks where the host exposes one. Cline receives the platform-native
PreToolUsewrapper on POSIX andPreToolUse.ps1on Windows. - Prime Agent's IPython guard extracts shell escapes, shell magics, and common
Python process-spawn forms, combines the recovered commands, and delegates
the decision to the Tirith engine. Dynamic or unrecognised execution forms
fail closed by default. - Generated Python-backed hooks pin the validated interpreter and Tirith
executable selected during setup instead of resolving a repository-influenced
PATHat execution time. - MCP tool and resource output is sanitized by default with bounded structured
traversal, leaf preservation, cross-leaf detection, strict blob decoding,
MIME checks, URI rules, and explicit incomplete-analysis failures. - MCP configuration locking binds source path, server identity, transport,
descriptor set, declared tools, and code/config drift without persisting raw
environment values or URL credentials.
MCP registration alone is cooperative: it gives an agent Tirith tools but does
not force a check. Only a supported, enabled, effective host hook, shell gate,
or gateway boundary can automatically withhold execution. Grok Build, Cline,
and OpenHands can still fail open on their side when a hook process crashes or
times out; run each host's verification step after setup and upgrades.
CI, browser, and provenance evidence
- Directory scans correlate fork-reachable artifact producers with privileged
workflow_runconsumers and execution, PATH, publish, or deployment sinks. - Structural GitHub Actions rules also cover mutable action references,
privileged trigger hazards, and expression-to-shell injection. tirith browser auditprovides a one-shot, read-only integrity audit of
Chrome, Chromium, Brave, and Edge extension source trees with signed
baselines and typed drift. It does not read browsing history, cookies,
passwords, extension storage, wallet databases, orLocal State.tirith pkg attest-npmbinds npm's own supported signature/provenance report
to the exact lockfile and installed inventory. It does not bind or inspect
the tarball bytes npm installs.- Build and deployment attestations are signed, content-addressed,
point-in-time receipts. They are not reproducible-build claims or continuous
monitoring.
Detection expansion
- Reverse-shell and suspicious inline-interpreter command shapes.
- OpenAI, Hugging Face, PyPI, and PGP credential patterns.
- Hidden PDF instructions that account for rendering state, optional content,
transparency, transforms, and forms, plus preflight nesting and compressed
stream limits. - Terminal output controls, deceptive Unicode, prompt injection, and output
exfiltration across CLI and MCP rendering paths. - Wallet and sensitive-asset exfiltration through direct uploads, promoted
operands (xargs,find -exec,parallel), compressors, encoders, and
staged encryption output.
Reliability, privacy, and release hardening
- Supervised child execution, checked timeout arithmetic, Unix process-group
ownership, Windows job ownership, and explicit terminal states. - Transactional/no-follow setup, install, policy, checkpoint, registry,
receipt, audit, trust, canary, and ThreatDB publication paths. - Bounded DNS, redirects, response bodies, feed parsing, MCP work, artifact
traversal, and output rendering, with incomplete verification kept distinct
from a clean result or a threat finding. - Centralized redaction of secrets and reviewed private paths before audit,
SARIF, webhook, CLI, MCP, gateway, and manual rendering. - Strict webhook ordering and dead-letter behavior, observable dead-letter and
internal-server failures, atomic refresh-token handling, and fail-closed
timestamp parsing in the license service. - Immutable GitHub Action, container, runner, and release inputs; separated PR
validation and tag publication; signed checksums and provenance; and
byte-identical canonical executables in the tarball, Debian, and RPM paths. - Linux GNU artifacts target a verified GLIBC 2.28 ceiling and are runtime
smoke-tested on the documented enterprise distributions.
Upgrade and installation
Use the same package manager that owns the current installation:
brew upgrade tirith
npm install -g tirith@0.4.0
cargo install tirith --version 0.4.0 --lockedscoop update tirith
choco upgrade tirithChocolatey's community-repository moderation can lag the GitHub release. Run
choco info tirith to see the approved version; use Scoop or a signed GitHub
release artifact when the newest version is required before moderation
finishes.
After upgrading:
tirith version --provenance
tirith verify-self
tirith doctor
tirith setup <tool> --update-configsRestart protected shells and agent hosts so they load the new binary and
regenerated hook assets. Re-run the host-specific verification listed in the
agent matrix.
Compatibility and migrations
- Existing policy files continue to load.
web3_guardandtask_gateare
optional and inert unless configured. - The default MCP tool list remains frozen.
tirith_check_taskappears only
whenTIRITH_MCP_PREVIEW=1is set. - Command-card schema-1 signing bytes remain unchanged when schema-2 fields are
absent. - ThreatDB v1 stays available during the v2 cutover. An old client must not be
pointed directly at a v2 data file. - Existing MCP privacy lockfiles require an explicit re-lock when the documented
schema migration says so; review the diff before committing it. - Checkpoints created by older builds under
/tmp/tirith/checkpointsare not
migrated automatically. Inspect and remove that legacy directory manually;
0.4.0 uses private per-user state. - Re-run
tirith setup <tool> --update-configsafter upgrading so generated
wrappers contain the current validated absolute interpreter and Tirith paths.
Known limitations that remain
- Broad custom-DLP regexes can currently rewrite protocol-owned string values
in recursively redacted machine projections, including generated identifiers
or receipt metadata. Treat this as a release blocker for consumers that need
stable machine schemas/signatures. tirith install --yescounts as an unattended approval when task policy says
require_approval; it is not proof that a human used a TTY. Use a blocking
policy when unattended package-manager execution must be impossible.- Interpreted MCP exact binding walks and hashes the repository rather than a
discovered dependency closure, so caps or repository symlinks/special files
can refuse launch. Revalidation happens before spawn, but interpreter files
are not executed from sealed reviewed descriptors; concurrent same-user
mutation remains a verify-to-load gap. - A full or read-only
TMPDIRcan make zsh and fish fail closed before the
binary runs;TIRITH=0cannot recover that shell. See the troubleshooting
guide for recovery. - A sensitive read inside a nested shell body is not yet correlated with a
sink outside that body. forge createremains an unmodelled Web3 grammar path on engine surfaces.- Several declared
web3_guardfields and schema-2 command-card authoring are
not yet active enforcement controls; consult the changelog's known-issues
section before writing policy around them. - Task-effect inference is intentionally narrow, and most ordinary shell
commands are incomplete rather than proven safe. - Prime Agent IPython analysis is source-level extraction, not arbitrary Python
containment. Earlier-cell wrappers, reflection, and third-party code can
create process launches that a lexer cannot prove. - General containment and the Python enforcing installer are x86_64-Linux-only.
- Host hooks and MCP registrations require effective-host verification; config
presence alone does not prove that a host loaded or honored them.
Publication and verification
0.4.0 is published only from the protected v0.4.0 tag after the Linux,
macOS, Windows, package-assembly, compatibility, and provenance gates pass on
the exact tagged tree. The limitations above are the release's explicit
deferrals. Registry availability, public artifact checksums, signatures,
provenance, and package-manager state are verified using the
release checklist.