Long-running agents that leave a trail.
Most platforms hand you an answer. Spooky Labs hands you the work: every tool call, every file touched, every subagent delegated to — recorded as it happened and replayable afterwards.
Runs on your Kubernetes. Bring your own Vertex AI project.
release-bot
run/8f2a · tenant-9f2a
8
A2A task states, all handled
including rejected and auth-required
3
levels of subagent nesting
read from the real span tree
2
commits per mutating tool call
pre and post, so every change has a diff
The run
Open the run, not the transcript
This is the platform's run view, built from the same components the dashboard uses — an OpenTelemetry span tree on the left, the workspace commit and the artifact the agent wrote on the right.
Trace · invoke_agent
Nesting caps at three; the last call is depth 4 in the data and says so.
Workspace commit a91f3ce
Artifact
1{2 "task": "task/38f1c2",3 "agent": "release-bot",4 "state": "completed",5 "usage": {6 "promptTokenCount": 26234,7 "candidatesTokenCount": 3376,8 "totalTokenCount": 296109 },10 "workspace": {11 "commit": "a91f3ce",12 "signature": "verified"13 }14}Live markup, not an image — the spans, the diff and the artifact above are the production components rendering real telemetry shapes.
Observability
Every token has a name on it
Usage comes from kagent_usage_metadata on the spans themselves, so a bill is always traceable back to the invocation, the model and the subagent that spent it.
Across three models in one tenant
Wall time from submitted to a terminal state
Last 14 days
Platform
Built for agents that run for hours
The hard parts of a long-running agent are not the prompts. They are the stream that has to survive a dropped connection, the workspace that has to be inspectable afterwards, and the delegation tree that has to be real.
Agents that stay up
A long-running deployment, not a job per turn. The workspace, the memory and the place in the conversation all survive across hours and days.
Streams that survive the network
Close the laptop mid-run and reopen it. The stream backfills the gap from persisted events, then re-attaches live — no duplicates, no holes.
Scrub through the work
Every mutating tool call commits the workspace. Drag the timeline and read the exact files the agent had open at the moment it decided something.
Delegation you can see
Subagents render as a real graph, built from the trace tree rather than guessed from logs. Follow one decision down three levels.
Declared, not clicked
Your agents are Kubernetes resources. Export the lot to YAML, review it in a pull request, import it into another tenant.
Signed provenance
The recorder holds the signing key; the agent never does. Each workspace commit carries a detached signature you can verify offline.
Declarative
An agent is a resource, not a wizard
Every agent is a Kubernetes custom resource. That means the tools you already trust — kubectl, GitOps, a pull request, an audit log — work on your agents without anyone building an export button.
kubectl apply -f agents/release-bot.yaml
The same command in CI, in a pull request, or on your laptop. There is no other way to create an agent — the dashboard writes this resource too.
1apiVersion: spookylabs.ai/v1alpha12kind: Agent3metadata:4 name: release-bot5 namespace: tenant-9f2a6spec:7 model: gemini-2.5-pro8 schedule: "@daily"9 workspace:10 repo: github.com/acme/platform11 path: /workspace12 tools: [fs, shell, git, http]13 delegation:14 maxDepth: 315 subagents: [docs-writer]Stop guessing what your agent did.
Point it at a repository, give it a schedule, and read the trail afterwards.