Appearance
Changelog
All notable changes to Uranus are documented here.
[1.7.0] - 2026-10-03
Merged to main as PR #2 (2026-10-02), PR #3 and PR #4 (2026-10-03). Everything below is deployed.
Added
Reliability
- Claim check (
claim-check.ts) — when a turn had tools but no successful write-style tool call, the reply is asked whether it claims an action; a claim is pushed back once with a correction and replaced on a repeat. When writes did happen, the decision model compares the reply with the tools that succeeded (over-claim). Logged asjev_decisionskindclaim_check. - Model policy (
model-policy.ts) — every model call names a role; resolution runs override →settings.llm.roles→ tenantpolicy.models→ defaults, with chains, capability and gateway filtering, a 20-call health window with automatic skip, sticky canary shares and a daily budget tier.GET /models/policy,POST /models/eval(dry-run executor, stored inmodel_evals, migration 080). See Model Policy. - Cloudflare Clef as the default decision model (
@cf/cloudflare/clef→clef-flash), Jev-API compatible and first-party, so typed decisions run on every conversation without the partner-AI consent step.typesafe/jevremains available through thedecisionrole.
Learning loop
turn_traces(migration 079) record every turn's tool calls, including gateway turns which previously stored none.- Closed tasks are scored for the learned skills they used and queued; the alarm sweep distils them into
skillsrows (categorylearned) with triggers, tool-exact steps and pitfalls. Matched procedures are injected into the prompt's volatile tail. Skills → Learned tab;POST /skills/learned/distill-conversation/:idand a Learn from this conversation button in chat.
Platform
cron.ts— schedules match in the agent's calendar timezone with standard day-of-month / day-of-week semantics, names, steps and7as Sunday.- Tool-turn and Escalation model selectors, and a Model policy card (resolution, health, evals), on the LLM Models page.
Fixed
- Security —
/a2aand/a2a/streamrequire a bearer token (platform secret, an API key minted for the agent, or the connection's shared secret). Approval-required tools on customer gateway turns are queued to the owner's inbox instead of running.requireApprovalAboveapplies again (per-call approval context). Contact access profiles are enforced when a tool executes.execute_sqlis tenant-scoped (allowlisted tables shadowed byagent_idCTEs). The alarm sweep processes only the agent's own calendar tasks. Code Mode tools pass the same gates. - The app-intent classifier no longer turns "create a contact / reminder" into an app build.
- Task tools are loaded whenever the conversation has an open task;
clear_ongoing_taskreports when nothing is open.
Changed
- One agentic loop — the streaming loop is a wrapper that passes an SSE sink; the drifted copy is gone.
- Conversation mutex — turns on one conversation queue in order on every chat path (dashboard, gateway, internal); nothing steals the lock after 30 s.
- The failure cap ends the turn with a tool-less final call instead of logging "Breaking loop" and continuing.
- Decision-model usage is charged to whichever model answered; distillation usage is metered.
[1.6.0] - 2026-09-25
Merged to main as PR #1 (2026-09-23) plus the dashboard coverage branch (2026-09-25).
Added
Typed decisions (Jev)
typesafe/jevpartner model via the authenticated AI Gateway —jev.ts(jevRun,resolveDecision), typednoul/choice/scorequestions with calibrated probabilities. Every call site has a non-partner fallback- Tool-category routing (
jev-tools.ts) — one decision per message replaces the regex trigger table; regex kept as fallback. Prompt Studio → Tool Categories gains a routing on/off switch and load threshold (settings.toolRouting). Code Mode's selective prompt path goes through the same router; MCP-connected agents always get thecustomcategory - Knowledge-lookup gate —
shouldTriggerRAGJevasks one yes/no question before auto-RAG browser_task(jev-browser.ts) — Jev-driven multi-step browser loop in one tool call:done/needs_input/needs_confirmation(stops before consequential steps;confirm=truespends one approval) /blocked/uncertain/stuck/max_steps/driver_unavailable. Candidates beyond 200 refs reachable via described elements + region pick; failed steps re-read the page;press_enterclicks the last typed field; secret-looking inputs masked- Workflow Decision node — model-judged branching with threshold and top-two margin (default 0.15), explicit
defaultoutput (panel warns which output is the silent fallback), 10 s timeout andstep.doretries in deployed Workflows; codegen emitsresolveDecisionverbatim - Decision log —
jev_decisionstable (073), Diagnostics → Decision log card with kind filter,GET /jev-decisions
Task memory
agent_taskstable (074) — per-conversation (and contact / business) tasks with status incl.waiting_user/waiting_external, JSON step list, next step, context,wake_at,superseded_by. Replacesagent_state.ongoing_task(migrated once)set_ongoing_task/get_ongoing_task/clear_ongoing_taskre-pointed at the table and scoped to the conversation; prompt injects only this conversation's open tasks- Jev auto-close each turn (completed? / abandoned? at ≥ 0.75, logged as
task_close); wake sweep inalarm()re-activates due tasks and leaves a system note - Chat page open-tasks panel;
GET /tasks,PATCH /tasks/:id
Durable turns and compaction
- Turn checkpoints (
turn-checkpoint.ts) — both loops write a trimmed checkpoint (tool calls/results, browser session ids) to DO storage after every tool round; a stalled turn (> 45 s) is resumed on the next request with its completed results instead of re-running tools - Non-destructive compaction (
compaction.ts,conversation_overlays075) — 70 % verbatim tail / 10 % protected head / 20 % overlays bound to message ranges; the oldest uncovered stretch is compacted in the background.summarizeOlderMessagesremoved; legacy single-blob summary kept as fallback - Context blocks —
set_contextworking-notes tool (replace / append / clear) shown back each turn; Context Budget line; clock moved to the prompt tail so the prefix is byte-stable across turns for provider prefix caching
Memory
- Kinds
fact/event/instruction/taskviakindOf(); task memories indexed for keyword search only, never vectorised memory_fts(FTS5,076, backfilled) and fused recall — vector + BM25 + exact fact-key (×1.5) by reciprocal rank fusion, superseded dropped- Jev write-time verifier (
verifyAndSupersede) — replaces? / contradicts? against the 3 nearest memories; replacements (≥ 0.75) mark the old memory superseded (settings.memory.verify) MemoryProviderinterface —LocalMemoryProvider(current stack) andCloudflareMemoryProvider(Agent Memory binding, profile per agent), selected bysettings.memory.provider; falls back to local without the binding- Settings → Runtime tab: memory backend, verification, browser recording
Knowledge
- Tenancy by profile (
077) —data_sources.business_id/visibility(business|agent|contact) /contact_id; chunk vectors and FTS rows stamped with the scope; Vectorize metadata indexes onbusiness_id+visibility.searchKnowledgeScopedis the single choke point (own docs + business-shared only); thefilterByAgent=falsedefault that read across tenants is gone - Fused retrieval —
kb_chunks_fts(FTS5/BM25, backfilled) fused with the vector channel by RRF, then@cf/baai/bge-reranker-basewhen more than one candidate - AI Search channel —
settings.knowledge.aiSearchInstanceadds a Cloudflare AI Search instance (indexing the agents' R2 bucket) behind the samesearch_knowledgetool, folder-scoped to the agent's and business's prefixes. Database and API sources stay on the custom pipeline - Knowledge page: per-source visibility select (
PATCH /sources/:id, re-indexes on change) and a Retrieval card for the AI Search instance
Workflows
- Await Event rewritten on
step.waitForEvent(type, timeout)with a D1 pre-check and a final check on timeout; generated workers exposePOST /events/:instanceId→sendEvent; the agent's event endpoint andadd_workflow_eventforward there and still write the D1 row for older deployments - AI Agent node takes an output schema; the agent returns
data.structured(required keys checked); the step fails/retries on a mismatch. Interpreterai-agentnow really runs (self via the agent-mode LLM node, other agents over the DO binding) instead of returning "delegated" - Approval Gate logic node —
POST /workflows/approvals/requestsends approve/reject links over a gateway (publicworkflow.uranus.imevent links); generated step waits durably and routesapproved/rejected(timeout policy configurable); interpreter polls up to 45 s - Deployed workflows receive
AGENT_BASE_URL+AGENT_API_KEYsoai-agent/ approval callbacks work; workflow-deployer injects them (readsAGENT_API_KEYorINTERNAL_API_SECRET)
Browser
- Cloudflare Browser Run is the default provider (
BROWSER_PROVIDER=cf); Steel kept for HITL viasettings.browser.hitlProvider - AX-tree snapshots —
axSnapshot()reads Chrome's accessibility tree over CDP in the same[N] role "name"format;browser_action(action="snapshot", source="ax"), automatic when the DOM walk finds < 3 controls; capped at 150 refs - Session recordings —
settings.browser.recording=truelaunches sessions withrecording: true(30-day retention in the Cloudflare dashboard) - Hosted Live View + handoff — sessions return the
live.browser.runURL (Cloudflare.getLiveView);browser_actionhandoff/handoff_statususeCloudflare.handoff/getHandoffStateand mark the sessionawaiting_human. The custom/cf-livescreencast bridge remains only as a fallback; the Browser page shows an Open Live View button for hosted URLs browser_execute(sessionId, script)— approval-gated arrow-functionpage.evaluate, result truncated to 8 KB and loggedbrowser_action(action="upload")— inject R2 media into a file input through an in-pageDataTransfer- Checkpoints track browser session ids so a resumed turn reuses them; CF client selects-all before typing; stuck-detector keyed on url + snapshot head; action logger writes real success/error status
Gateways
GatewayConfig.autoReplyis now honoured —falsestores the inbound message and runs workflow triggers but never replies (no/startgreeting); MQTT gainsreplyMaxChars. Add/Edit MQTT gateway dialogs expose both
Platform boundary
tenantstable +agents.tenant_id(078, OAC tenants backfilled in078b);agent/tenancy.tsis the only reader. Knowledge scope, task memory and the policy gate key on it- Product-neutral internal API
/api/internal/v1/*(docs/PLATFORM_API.md) — tenants upsert/read/consent,agents/:id/tenant, plus aliases for every legacy/api/internal/oac/*handler. The OAC_DB binding is removed from the manage worker; the control panel composes OAC over OAC's own API - Data-flow policy (
docs/DATA_FLOW_POLICY.md) —partnerAiAllowed()gates every Jev call site and the memory-provider choice: owner/internal use allowed (per-agent switch), customer conversations on a tenant-owned agent only aftertenants.partner_ai_consent_atis set
Migrations
073_jev_decisions.sql,074_agent_tasks.sql,075_conversation_overlays.sql,076_memory_fts.sql,077_knowledge_tenancy.sql,078_tenants.sql,078b_tenants_backfill_oac.sql
Fixed
- Vector memory recall filtered on unindexed metadata and returned nothing in production; memory vectors now carry
agent_id(existing ones re-upserted) - Stuck-detector false positive on consecutive
browser_taskresults browser_taskstale-ref retry after a failed action
Changed
- System prompt assembled as stable blocks + volatile tail (see Context blocks above)
search_knowledgeand auto-RAG both go throughsearchKnowledgeFused; the Code ModesearchKnowledge(query, topK, filterByAgent)helper ignoresfilterByAgent— there is no cross-tenant mode any more
[1.5.0] - 2026-05-15
Added
Goals & Reflection loop
agent_goalstable — durable objectives with hierarchy, priority, target dates, progress notes, and source attribution (user|reflection|workflow|system)agent_reflectionstable — periodic self-review with observations, learnings, plan, goal updates, and a metrics snapshot- Daily reflection cron at 03:00 UTC, auto-seeded per agent — uses
@cf/zai-org/glm-4.7-flash error_spiketrigger — fires an ad-hoc reflection when more than 5 workflow failures land in 10 minutes- LLM tools —
set_goal,update_goal,list_goals,reflect_now,get_reflections,list_draft_workflows,activate_draft_workflow - System prompt integration — active goals and the latest reflection's plan/learnings injected every turn
Agent memory architecture
- Four-tier memory model — working (RAM), episodic (chat_messages + summaries), semantic (Vectorize-backed
memory:*), reflective (reflection-sourced memories at higher confidence) - Semantic recall via Vectorize —
embedAndUpsertMemorywrites a bge-base-en-v1.5 embedding on every memory write;semanticRecallMemoriesqueries with the current user message - Daily consolidation cron at 04:00 UTC — clusters near-duplicate memories (cosine ≥ 0.85), LLM-merges into one canonical fact, marks members
superseded_by, decays stale confidence - Versioned conversation summaries — prior summary archived to
conversation_summary_history:{id}:{ts}before each rewrite instead of being overwritten - Paginated token-aware history fetch — replaces a fixed
LIMIT 50with paged scan that stops on token budget - Content-aware token estimator — 1.5 chars/token for CJK, 3.0 for JSON-dense, 3.5 for English prose
Workflow integration (W1–W7)
- Goal ↔ workflow linkage —
goal_workflowstable;execute_workflow(goal_id=...)auto-creates the link and updatesagent_goals.progress_noteson completion - Outcomes → memory — every workflow completion summarized via glm-4.7-flash, written to
memory:workflow:{date}:{slug}:{outcome}and embedded; failures stored at higher confidence - Reflection-proposed workflows — reflection output includes
proposed_workflows[]which insert as drafts (status='draft' source='reflection'); never auto-activated, surface in existing Workflows UI tab - Semantic workflow discovery —
workflow_embeddingstable +workflow-search.tsmodule;find_workflow_for_goalis now Vectorize-backed with the prior LLM matcher as fallback - Goal context in workflow execution — when a run is attributed to a goal, the trigger payload includes a
goalobject (id, description, progress_notes) resolvable via thetrigger.goal.descriptioninterpolation path - Run stats rollup —
list_workflowsand reflection both see 30-day runs_total/runs_failed/avg_duration/last_run per workflow - Workflow → agent callbacks — HMAC-authenticated POST
/{agentId}/workflow-rpclets deployed workflows callrecall,remember,send_message,get_contact,list_transactions,add_workflow_event. 60 req/min/workflow rate limit.
Migrations
058_agent_goals.sql,059_agent_reflections.sql,060_memory_embeddings.sql061_goal_workflows.sql,062_workflow_source.sql,063_workflow_embeddings.sql,064_workflow_callback_secret.sql
Changed
findWorkflowForGoalis now semantic-first (Vectorize) with LLM matcher as fallback when no vector hits above 0.55 cosinecreateWorkflow,activateDraftWorkflow, and the editorPUT /workflows/{id}path all embed viactx.waitUntilso new/edited workflows are searchable within seconds- Memory
access_countupdates and pre-compaction summarization now usectx.waitUntilto survive DO eviction - CF Workers AI pricing rates updated to match published per-token rates (verified 2026-05-15)
- Browser snapshot script clears stale
[data-ref]attributes at the start of each walk to prevent ref ambiguity browser-cf.tscache is now bounded LRU (max 16 sessions) to prevent unbounded growth- 224 lines of dead snapshot code removed from
browser.ts navigate()simplified from a 3-endpoint cascade to a singlegotocall; returns the real error instead of "All navigation methods failed"
[1.4.0] - 2026-03-11
Added
Website Crawling (BFS)
- Full-Site Crawl - Crawl entire websites using CF Browser Rendering
/markdown+/linksendpoints - BFS Traversal - Configurable
maxPages,maxDepth,include/excludeURL patterns - Background Processing - Non-blocking crawl execution via
ctx.waitUntil - Delta Detection - SHA-256 page hashes allow re-crawl to skip unchanged pages
- Web Crawl LLM Tool (
web_crawl) - Agent can crawl websites during conversation with auto-import to knowledge base - Crawl Status Tracking (
get_crawl_status) - Monitor crawl progress in real time
Access Control Profiles
- Tag-Based Access Control - Configure per-contact access to tool categories, clusters, and data
- Data Scoping - Control access to conversation history, contacts, and memories per profile
- Default Profile - Wildcard
*profile applies to unconfigured contacts - Priority Merging - Multiple matching profiles merge by priority
Payments System
- Transaction Tracking - Log and query payment transactions with full history
- Bank Notification Detection - Auto-detect payments from SMS/email via regex keyword matching + LLM parsing
- x402 Micropayments - HTTP 402 payment-gated endpoints with Coinbase facilitator (Base, Avalanche, Solana/USDC)
- Stripe Integration - Checkout sessions, virtual issuing cards, webhook processing,
requireApprovalAbovethreshold - LLM Tools -
check_balance,list_transactions,log_payment,send_payment,create_checkout,charge_card
Accessibility Tree Snapshots
- Text-Based Page Representation - Browser uses accessibility tree snapshots instead of screenshots as primary output
- Ref-Based Targeting -
[N] role "label"format withdata-refattributes for element interaction - Token Efficiency - ~5-50KB text vs ~5MB screenshot (~100x reduction)
- Snapshot Action -
browser_action(action='snapshot')to get/refresh the accessibility tree
Vision Model System
- Configurable Vision Model -
settings.llm.visionModelwith auto-fallback chain - Fallback Chain - Configured vision model -> main LLM (if vision-capable) -> Llama 4 Scout
- Multi-Provider Support - Llama 4 Scout, GPT-4o, Claude Sonnet 4.5, Claude Opus 4, Gemini 2.5 Pro
- UI Selector - Vision model picker on LLM Models page with "Auto" default option
MCP Server
- JSON-RPC 2.0 Protocol - Agent exposes tools via MCP with
tools/list,tools/call,resources/list,resources/read,elicitation - Bearer Token Auth - API key management via
mcp_api_keystable - RPC Transport - Co-located Durable Objects communicate via
"rpc"transport
Callable RPC
- CallableRegistry - Type-safe RPC handler registration
- Dual Transport - HTTP POST
/api/rpcand WebSockettype:"rpc"support
Diagnostics System
- 7 Diagnostic Channels -
agent.state,rpc,message,schedule,lifecycle,workflow,mcp - Dual Subscribers - DB persistence and real-time WebSocket delivery
Retry System
- Exponential Backoff with Jitter - Configurable retry logic for all async operations
- Presets -
AI_RETRY,TOOL_RETRY,GATEWAY_RETRY,MCP_RETRY
Stream Buffer
- Circular Buffer - 1000-event buffer for resumable SSE streams
- Last-Event-ID Resume - SSE events include
id:field for reconnection support
Gateway Improvements
- Email Thread Continuity - HMAC-SHA256 signed Reply-To addresses
- Telegram File Handling - Proper
file_idsupport - WhatsApp Verification - HMAC signature verification on incoming messages
- Unique Indexes - Gateway config uniqueness enforced at database level
Skills Marketplace
- Browse & Install - Discover and install pre-built agent skills from the marketplace
- Skill Key-Value Storage - Per-skill persistent storage via
skill_kvtable
Changed
- Connection Metadata -
connectionsmap now storesConnectionMetadata(subscriptions, readonly, clientType) instead of raw WebSocket - Approval Responses -
pendingApprovalsresolves{ approved, denialMessage? }instead of plain boolean - Schedule Overlap Prevention -
running/running_sincecolumns prevent concurrent schedule execution with 5-minute stale-run recovery
Technical
- 10 new database migrations (037-046)
- New files:
callable.ts,diagnostics.ts,mcp-server.ts,retry.ts,stream-buffer.ts - New UI pages: diagnostics, MCP keys, payments, skills
[1.3.0] - 2025-02-06
Added
Theme Support
- Light/Dark Mode Toggle - Switch between light and dark themes via sun/moon button in dashboard header
- System Theme Detection - Supports "system" preference that follows OS setting
- Flash Prevention - Inline script prevents theme flash on page load
- Theme Persistence - User preference saved to localStorage
Social Media Workflows
- LinkedIn Integration - New
post-linkedinworkflow node for posting to LinkedIn via UGC Posts API - LinkedIn Settings - Configure access token and person URN in Settings > Integrations
Admin Panel
- Waitlist Search - Filter waitlist entries by email
- Waitlist Delete - Remove individual entries from the waitlist
Changed
- Integration Settings UI - Social platform credentials now displayed as compact cards with modal dialogs instead of expanded forms
- Social Platform Icons - Updated to use proper platform icons (Instagram, YouTube, TikTok, X logo)
- Monaco Editor Theme - SQL page editor now follows light/dark theme
Fixed
- Workflow Status Overflow - Long workflow names and status badges now wrap instead of overflowing
- Output Card Overflow - Collapsible workflow output cards no longer spill outside container
- Sonner Toast Colors - Toast notifications now theme-aware in both light and dark modes
[1.2.0] - 2025-01-29
Added
Tool Clusters & OpenAPI Import
- OpenAPI Auto-Import - Import all endpoints from an OpenAPI 3.x JSON spec as HTTP tools, grouped under a cluster name
- Tool Clusters - Group tools by cluster with collapsible UI sections and bulk delete
- Agent Self-Provisioning - New built-in
import_openapi_toolsanddelete_tool_clustertools let the agent import APIs during conversation - Enhanced HTTP Execution - Path parameter substitution, query param appending for GET, body exclusion for GET/HEAD
[1.1.0] - 2025-01-26
Added
AI & Tool Calling
- Code Mode - LLM writes executable JavaScript instead of structured tool calls for complex multi-step tasks
- Selective Tool Loading - Context-aware tool filtering reduces prompt tokens by ~77%
- Token Usage Tracking - Monitor AI usage with detailed per-agent token counts and cost attribution
Communication
- X.com (Twitter) Integration - Post tweets, reply to mentions, send DMs via new gateway type
- Cross-Gateway Memory - Same contact shares memory, preferences, and context across all communication channels
- A2A Protocol - Agent-to-agent communication with JSON-RPC 2.0 messaging, agent discovery via
/.well-known/agent.json
Browser
- Steel Browser Integration - Open-source browser automation with full CDP control
- Two-Tier Browser Strategy -
browser_renderfor stateless scraping,browser_contextfor persistent sessions - Session Context Persistence - Cookies, localStorage, sessionStorage, and IndexedDB preserved across sessions
Data & Storage
- Unified Media Table - Centralized storage for screenshots, chat uploads, generated images, and audio
- Per-Agent Settings - Settings now stored per-agent in JSON column (migration 026)
Workflows
- Async Workflow Deployment - Prevents Cloudflare proxy timeouts with polling-based deployment status
- Workflow Output UI - Formatted step-by-step display of workflow execution results
Changed
- Refactored settings from global KV table to per-agent storage
- Browser documentation updated to reference Steel Browser
- Improved GPT-OSS adapter validation and error handling
Fixed
- Workflow deployer 502 timeout errors
- Browser render "Invalid URL" errors with Steel fallback
- Telegram gateway token configuration in deployed workflows
[1.0.0] - 2024-12-15
Added
Core Features
- Multi-agent architecture with isolated Durable Objects
- Visual workflow editor with 30+ node types
- Real-time WebSocket communication
- Agent state management and synchronization
AI & Chat
- Chat interface with conversation history
- Multiple LLM provider support (Workers AI, OpenAI, Anthropic)
- Tool calling with result tracking
- System prompt configuration
Automation
- Cron scheduling with visual builder
- One-time and delayed task execution
- Calendar integration with recurring events
- Workflow execution tracking
Browser Control
- Headless and headed browser sessions
- Human-in-the-loop takeover capability
- Browser action API (click, type, navigate, extract)
- Live view monitoring
- Screenshot capture
Data & RAG
- File upload and processing
- URL crawling
- Vector search with Cloudflare Vectorize
- Semantic similarity matching
Communication
- Multi-channel gateways (Email, Telegram, Slack, Discord, WhatsApp, SMS)
- Contact management with identity resolution
- Conversation threading
- Message history
Integrations
- MCP (Model Context Protocol) server support
- Agent-to-agent connections
- Custom tool configuration
- Service integrations
Database
- D1 SQLite database
- SQL query editor with Monaco
- Schema introspection
- Migration system
Security
- Cloudflare Access integration
- Role-based access control
- Per-agent isolation
- Secure credential storage
Technical
- React 18 frontend with TypeScript
- Vite build system
- Tailwind CSS styling
- Radix UI components
- Cloudflare Workers backend
- Durable Objects for state
- R2 for file storage
- Queues for async processing
Version History
| Version | Date | Highlights |
|---|---|---|
| 1.4.0 | 2026-03-11 | Website Crawling, Access Control, Payments, Vision Models, MCP Server, Diagnostics, Skills Marketplace |
| 1.3.0 | 2025-02-06 | Light/Dark Theme, LinkedIn Integration, Admin Waitlist Search |
| 1.2.0 | 2025-01-29 | OpenAPI Auto-Import, Tool Clusters, Agent Self-Provisioning |
| 1.1.0 | 2025-01-26 | Code Mode, Selective Tool Loading, X.com, A2A Protocol, Steel Browser |
| 1.0.0 | 2024-12-15 | Initial release |
Upgrade Guide
From Pre-release to 1.0.0
Backup Database
bashnpx wrangler d1 export agents-dashboard > backup.sqlApply Migrations
bashnpx wrangler d1 execute agents-dashboard --file=./migrations/007_puppeteer_action_types.sqlDeploy
bashnpm run deployVerify
- Check agent functionality
- Test workflows
- Verify integrations
