Releases: syrin-labs/syrin-harness
Releases · syrin-labs/syrin-harness
Release list
v0.12.0 - Looping Sandbox
[0.12.0] - 2026-05-04
Added
syrin.Resource— per-agent resource limits:Resource(timeout, warn_at, max_steps, max_tools, max_context, on_exceed, thresholds).ResourceThresholdcallbacks fire after every LLM iteration.DegradePolicy(tool_to_disable)removes the named tool whenmax_toolsis hit in DEGRADE mode. New enums:OnExceed,ResourceDimension,DegradeReason,RestoreWhen. New hooks:RESOURCE_THRESHOLD,RESOURCE_EXCEEDED,RESOURCE_DEGRADED,RESOURCE_RESTORED. New exceptions:ResourceExceededError,ResourceTimeoutError,ResourceStepError,ResourceToolError,ResourceContextError.syrin.ResourcePool— swarm-level rate and concurrency pool alongsideBudgetPool.OverflowStrEnum:QUEUE,REJECT,BACKPRESSURE(AIMD).pool=onSwarm. New hooks:POOL_RATE_LOW,POOL_REBALANCED,POOL_REJECTED.syrin.Sandbox— isolated code execution.ProcessSandboxdefault (zero deps, 5–50 ms overhead).SandboxBackendType:PROCESS,DOCKER,E2B,NSJAIL.sandbox=onCodeActionLoop. New hooks:SANDBOX_EXEC_*. New exceptions:SandboxError,SandboxTimeoutError,SandboxMemoryError.Sandbox.exec_bash()— run shell scripts viabash(orshfallback) in a fresh isolated subprocess. Enable withbash=True.SANDBOX_WORKSPACEenv var injected so scripts can locate the workspace directory.Sandbox.packages=— packages listed at construction are auto-installed before the firstexec_pythoncall. Thread-safe double-checked locking ensures exactly-once installation.Sandbox.cleanup()— explicit workspace teardown. Safe to call multiple times; only removes auto-created workspaces.Sandboxasync context manager —async with Sandbox(...) as sb:callscleanup()on exit.Sandbox._emit_fn— lifecycle hooks (SANDBOX_EXEC_START/END,SANDBOX_TIMEOUT,SANDBOX_SESSION_CREATED/DESTROYED) fire automatically when the sandbox is wired into an agent loop.
syrin.RLMLoop— recursive multi-agent decomposition with depth tracking,allowed_agentswhitelist, and budget propagation. Hard ceiling of 6. New exception:RLMDepthError.Hook.RLM_BUDGET_SPLIT— emitted aftercompute_child_budget(). Fields:split,parent_budget,child_budget,agent.- Sandbox propagation —
sandbox=on the orchestrator is deep-copied into every child's loop viacopy.copy(child_loop), so children get an isolated loop reference without mutating the class-level loop.
- HITL session persistence —
SQLiteApprovalSession,ApprovalSessionProtocol,ApprovalState,HITLTimeout.HumanInTheLoopgainssession=andon_timeout=. New hooks:HITL_REQUESTED,HITL_TIMEOUT. CircuitBreaker.check_and_record()— atomic check-and-record eliminating TOCTOU race.tests/contract/— new contract test suite verifying config → behavior for injection strategy, compaction budget, consolidation budget, guardrail mode, and age-based compression.
Fixed
Memory(injection_strategy=...)now controls injection order; previously all strategies were silently ignoredSummarizer.summarize()now goes through budget preflight and cost-recording; previously invisible to the budget systemMemory(consolidation_budget=...)now enforced; raisesBudgetExceededErrorwhen ceiling reachedconsolidation_compress_after="Nd"now implemented; entries older than threshold are compressedGuardrailMode.SYSTEM_PROMPTnow enforced; previously fell through to PRE_CALL behaviorSummarizer(compaction_model=None)falls back to the agent's own modelHook.MEMORY_CONSOLIDATEnow emitted at start and end ofMemoryStore.consolidate()- TOCTOU temp-file races in PDF extraction, Deepgram TTS, and Google Drive loader
- Silent exception swallowing in
FilesystemCheckpointBackend.list()and hook emission paths print()in library startup code replaced with structured logging- Unimplemented config fields now emit
UserWarninginstead of silently doing nothing:auto_sync,map_update_every_turns,auto_extract,consolidation_resolve_contradictions
Changed
HumanInTheLoopgainssessionandon_timeoutparametersSwarmgainspool: ResourcePool | NoneparameterCodeActionLoopgainssandbox: Sandbox | NoneparameterDegradePolicyfields:tool_to_disable,restore_when,include_resource_statusonly —fallback_modelandcompaction_methodremoved (were never enforced)Memory.recall()acceptslimit=only —count=andtop_k=aliases removedCostStats.avg_costremoved — usemeanSandboxBackendalias removed — useSandboxBackendType@tool(depends_on=[...])requiresToolSpecobjects — string names no longer accepted
v0.11.0 - Multi-Agent Swarms
[0.11.0] - 2026-04-06
First-class multi-agent orchestration with shared budget control, cross-agent memory, agent-to-agent communication, and enterprise security hardening.
Added
Multi-Agent Swarm System
Swarmwith 5 topologies:ORCHESTRATOR,PARALLEL,CONSENSUS,REFLECTION,WORKFLOW- Shared
BudgetPool— hard per-agent caps enforced; no agent can exceed its allocation even if pool has funds MemoryBus— selective cross-agent memory sharing with type filters and custom backendsA2ARouter— typed agent-to-agent messaging (direct, broadcast, topic pub/sub) with ack support and audit logSwarmController.topup_budget()/reallocate_budget()— runtime budget reallocation without restarting agents; backed byasyncio.LockBroadcastBus— pub/sub with wildcard topic patterns ("research.*")MonitorLoop— async supervisor loop: heartbeat polling, quality assessment, bounded interventions withMaxInterventionsExceededescalationSwarmAuthorityGuard— role-based permission model (ORCHESTRATOR > SUPERVISOR > WORKER); every control action permission-checked and audit-loggedAgentRouter— LLM-driven agent selection from a pool (replaces removedDynamicPipeline)Workflow— sequential, parallel, branch, and dynamic fan-out steps withHandoffContext; fullplay()/pause()/resume()/cancel()lifecycleSwarmResult— unified result:content,cost_breakdown,agent_results,partial_results,budget_report
Budget Intelligence
- Pre-flight estimation:
Budget.estimate()withEstimationPolicy - Budget forecasting from run history with
Hook.BUDGET_FORECAST - Anomaly detection:
Budget(anomaly_detection=True)triggersHook.BUDGET_ANOMALYon p95 breach - Cross-run daily/weekly limits with
Hook.DAILY_LIMIT_APPROACHING FileBudgetStorefor persistent cross-run history
Workflow & Swarm Visualization
Workflow.visualize()— Rich ASCII treeWorkflow.to_mermaid()— Mermaidgraph TDfor GitHub/docsWorkflow.run(show_graph=True)— live Rich overlay with per-step status and costGET /graphHTTP endpoint onSwarm.serve()andWorkflow.serve()
AgentRegistry
AgentRegistrywith@registry.register(tags=[...])— discover and control agents by name or capability tag
Security Hardening
PIIGuardrail— detect and redact PII (email, phone, SSN, credit card) in inputs, outputs, and memory writesToolOutputValidator— schema validation on tool results before the LLM sees themAgentIdentity— Ed25519 cryptographic identity; every A2A message signed and verified- Decision provenance:
DECISION_MADEhook withDecisionRecord(model, timestamp, hash) for audit trails
Remote Config Control Plane
RemoteConfig— live push of any agent field without restart; schema export for dashboard rendering- Config versioning and
rollback(), per-fieldallow/denylists,RemoteConfigValidator - Remote lifecycle commands:
PAUSE,RESUME,KILLover the wire
Multi-Agent Pry Debugger (TUI)
SwarmPryTUI— Rich Live compositor:GraphPanel(per-agent status + cost),BudgetPanel(pool tree),MessagePanel(A2A/MemoryBus timeline),SwarmNav(keyboard navigation)
Changed
rich>=13.0promoted to core dependencyrequests>=2.33.0minimum enforced (CVE-2026-25645)ExceedPolicyis now the canonical budget policy enum;on_exceeded=callback pattern deprecatedMockResponseModeenum replaces raw strings"lorem"/"custom"inModel.mock()- Class-based agent definition is now the canonical pattern in all docs and examples
Fixed
@structureddecorator now applies@dataclassinternally — no manual decoration needed_has_default()helper: fixed brokenis not type(None)comparison- Swarm context injection:
_AgentMetametaclass compatibility fixed via plainsetattrfallback @toolwithout a description now emitsUserWarningat decoration time
Removed
DynamicPipeline— removed; useAgentRouter. Importing raisesImportErrorwith migration message.AgentTeam— removed; useSwarm(topology=SwarmTopology.ORCHESTRATOR). Importing raisesImportError.
v0.10.0 - Debug Watch Triggers
[0.10.0] - 2026-03-31
Added
Syrin Debug — Live Terminal Debugging
- Rich-based live terminal UI activated via
debug=True - Color-coded events: LLM (blue), tools (yellow), errors (red), memory (purple), guardrails (red)
- Multi-agent aware — nested panels for spawned agents
- Keyboard filtering:
eerrors,ttools,mmemory,ffull trace,qquit,ppause
Event-Driven Triggers (agent.watch())
Watchablemixin with swappable protocolsCronProtocol— cron-scheduled triggers using croniterWebhookProtocol— HTTP webhook trigger with HMAC signature validationQueueProtocol— message queue trigger with pluggable backend (Redis, in-memory)- Agents that react to the world, not just API calls
Production Knowledge Pool
GitHubSource— ingest entire GitHub repos (public and private)DocsSource— crawl documentation sites with depth limits and pattern matching- Multi-language code chunking (Python, Go, Rust, TypeScript, Java, etc.)
- Progress events:
KNOWLEDGE_CHUNK_START,KNOWLEDGE_CHUNK_PROGRESS,KNOWLEDGE_EMBED_PROGRESS,KNOWLEDGE_CHUNK_END - Semantic chunking strategy for better retrieval
- Rate limiting for embedding APIs
Prompt Injection Defense
InputNormalization— normalize inputs through defense pipelineSpotlightDefense— clearly label untrusted contentCanaryTokens— hidden tokens that trigger alerts- Secure memory writes — scan before storing
Structured Output Enforcement
result.outputalways returns the typed object (never dict/str)- Automatic retry on validation failure (configurable
validation_retries) - Validation hooks:
Hook.OUTPUT_VALIDATION_RETRY,Hook.OUTPUT_VALIDATION_ERROR - Clear error messages with raw response and validation details
Runtime Model Switching
agent.switch_model()— switch model at runtime without recreating agent- Context, memory, and hooks remain intact
Syrin v0.9.0 - Smart Budget
[0.9.0] - 2026-03-25
Breaking
Budget(run=)renamed toBudget(max_cost=)agent.response()renamed toagent.run()— old method removedper=in rate limits replaced byRateLimit(hour=, day=, month=)
Added
ExceedPolicyenum —STOP | WARN | IGNORE | SWITCHreplaces string policiesresult.cost_estimated— pre-call budget estimate alongsideresult.costresult.cache_savings— cache discount reported per callagent.budget_summary()— dashboard dict: run cost, tokens, hourly/daily totals, percent usedagent.export_costs(format="json")— structured cost history per callBudgetStoreABC — plug in any persistence backend (PostgreSQL, Redis, DynamoDB)Budget(shared=True)— thread-safe shared pool across parallel agents (SQLite WAL)ModelPricingoverride — passpricing=ModelPricing(...)to anyModel()to override built-in rates- Docs — full rewrite with correct APIs, custom observability guide, 375+ fixed internal links
Fixed
- SQLite budget store thread safety under parallel spawns
- Threshold callbacks no longer re-fire on the same percentage within a run
PIIScannerredaction applied before content reaches the LLMMemory.import_from()logging noise removed
v0.8.1 - Grounded Intelligence
[0.8.1] - 2026-03-13
Added
- Batch fact verification — Ground facts in batches of 10 for efficiency
- GroundingConfig.model — Dedicated model for grounding/verification
- YAML frontmatter —
Template.from_file()parses YAML frontmatter
Changed
- PDF extraction — Consolidated to single
doclingdependency - Grounding — Improved claim-to-fact matching with index-based pairing
Fixed
- IPO DRHP example — Working example with Budget, FactVerificationGuardrail
- Test mocks — Fixed output validation failure tests
v0.8.0 - Knowledge Pool
[0.8.0] - 2026-03-11
Added
- Intelligent model routing: Automatic LLM selection based on cost, performance, and context requirements.
- Multi-modality support: Native support for images, video, and audio generation/processing.
- Knowledge integration: RAG (Retrieval-Augmented Generation) with vector stores, document loaders, and semantic search.
Changed
- Simplified installation:
pip install syrinnow includes OpenAI and serving dependencies by default. - Removed CLI:
syrin trace,syrin run, andsyrin doctorcommands removed; usepython my_agent.py --tracefor observability.
Breaking
- CLI removal: Command-line interface deprecated; use direct Python execution with
--traceflag.
v0.7.0 - Context Management
[0.7.0] - 2026-03-07
Breaking
- Context:
Context.budgetremoved. UseContext.token_limits(TokenLimits).ContextWindowBudget→ContextWindowCapacity.Context.get_budget(model)→Context.get_capacity(model). ContextManager.prepare() takescapacityinstead ofbudget.
Added
- Context management — Snapshot (provenance, why_included, context_rot_risk), breakdown, custom compaction prompt,
auto_compact_at, runtime injection,context_mode(full/focused), formation_mode (push/pull), stored output chunks, persistent context map, pluggable RelevanceScorer. - Memory–context — Memory on by default;
memory=Noneturns off. No extra field. - Handoff/spawn — Context visibility in events (
handoff_context,context_inherited,initial_context_tokens).
Fixed
- Examples:
Output(type=...)→Output(MyModel);Agent(dependencies=...)→Agent(config=AgentConfig(dependencies=...)).
v0.6.0 — CC
[0.6.0] - 2026-03-05
Added
- Remote config —
syrin.init(api_key=...)orSYRIN_API_KEYenables real-time config overrides from Syrin Cloud or self-hosted backend. Overrides (budget, memory, temperature, etc.) via SSE; zero overhead when not enabled. - Config routes —
GET /config,PATCH /config,GET /config/streamadded toagent.serve(). Baseline + overrides + revert; works with or withoutsyrin.init(). syrin.remote— Types:AgentSchema,ConfigOverride,OverridePayload,SyncRequest/SyncResponse.ConfigRegistry,ConfigResolver,extract_schema(). Transports:SSETransport,ServeTransport,PollingTransport.- Hooks —
Hook.REMOTE_CONFIG_UPDATE,Hook.REMOTE_CONFIG_ERROR.
Changed
- Agent registers with remote config on init when
syrin.init()was called.
v0.5.0 - Remember Smarter
[0.5.0] - 2026-03-04
Added
- C5 fix — Memory.remember/recall/forget use configured backend (SQLite, Qdrant, Chroma) instead of in-memory dict when backend != MEMORY.
- QdrantConfig —
Memory(qdrant=QdrantConfig(url=..., api_key=..., collection=..., namespace=...))for Qdrant Cloud or local. - ChromaConfig —
Memory(chroma=ChromaConfig(path=..., collection=...))for Chroma vector backend. - Namespace isolation —
QdrantConfig.namespacescopes all operations; payload filter on search/list. - WriteMode —
WriteMode.SYNC(block until complete) vsWriteMode.ASYNC(fire-and-forget, default). - Memory export/import —
Memory.export()returnsMemorySnapshot;Memory.import_from(snapshot)appends memories. JSON-serializable for GDPR export. - Examples —
examples/04_memory/qdrant_memory.py,chroma_memory.py,async_memory.py,export_import_memory.py.
Changed
- Agent and Memory handoff now use
memory._backend_kwargs()for backend config. syrin[qdrant]andsyrin[chroma]optional dependencies added to pyproject.toml.
v0.4.1
[0.4.1] - 2026-03-01
Added
- API additions:
Response.raw_response,GuardrailCheckResult.guardrail_name,CircuitBreaker.state,EventBus.on,GlobalConfig.debug,TokenLimits.per_hour,RateLimit.window,agent.checkpointer.
Fixed
- Model fallback and response transformer now use
model.acomplete()when model has fallbacks/transformers. Model.with_middleware()preservesprovider.- Provider availability checks use
importlib.util.find_spec()instead of import.
Changed
- Strict typing:
TypedDict+Unpackfor memory kwargs,ServeConfig, agent specs. Pyright config added. - Replaced
Anywithobject/TypedDictacross core modules. - Docs:
docs/TYPING.mdfor typing standards; updated API references.