Composable Ephemeral Harness
Compose.Work.Destroy.
A harness that gathers the context you need for your use case. Open it, do the work, and it tears itself down. The record stays.
apiVersion: quiv.dev/v1alpha1kind: HarnessFramemetadata:name: soc-triagespec:runtime: pimodel:provider: anthropicid: claude-sonnet-4-5ttl: 2hrepositories:- repository: github.com/acme/detectionsrevision: mainmcpRequirements:- splunkactivityLog: truesummarize: true
active → archived → sealed
Compose from what you already run
The idea
Composable. Ephemeral. Auditable.
Composable
Name the repositories, MCP servers and integrations it needs. They resolve from your catalog and sign in when it launches.
Ephemeral
It exists while the work does. Park it to keep context without compute. Archive it and nothing is left running.
Auditable
Archiving is not deletion. The composition, the activity log and the session summary all outlive the container.
Use cases
When something happens, your workspace already knows.
Gathering context is cheap, tedious and unbounded. Deciding is not. A harness does the first part before you open it and leaves the second to you.
Trigger
Splunk · detection 4471
Impossible travel · svc-payments
Two successful logins, 4,100km apart, 18 minutes.
Gathered first
- Asset owner and on-call rota from the CMDB
- 24 hours of authentication events for the principal
- Related detections on the same asset this week
- The runbook for this detection ID
- The last six tickets that closed as false positive
Composed of
soc-triage
- mcp
- splunk, crowdstrike (read-only)
- tools
- github
- ttl
- 2h
An analyst opens a workspace that has already done the legwork, and spends their time on the decision instead of the gathering.
Every alert arrives with its homework done.
Read the full caseComposable
Plug in what you need. Nothing more.
Define it in code or in the UI. Parts resolve from your workspace catalog, authenticated to whoever launched it.
Repositories
MCP servers
Integrations
Context
apiVersion: quiv.dev/v1alpha1kind: HarnessFramemetadata:name: backend-reviewspec:runtime: pimodel:provider: anthropicid: claude-sonnet-4-5credential: session-setupttl: 4hsize: smallrepositories:- repository: github.com/acme/backendrevision: maindestination: backend- repository: github.com/acme/legacy-toolingdestination: legacy-toolingmcpRequirements:- slack- google-docstoolRequirements:- githubslackChannels:- channel: C0123ABCDlabel: eng-oncalllookback: 7dsync: 5mactivityLog: truesummarize: true
Named, not wired.mcpRequirements: [slack] means "slack, as this workspace defines it". Not a URL, and never a credential.
Resolved at launch. The catalog supplies the endpoint; the person who pressed the button supplies the credential.
Frozen once launched. Editing a template mints a new version. Anything already running is untouched.
The workspace
In the browser, or in your own shell.
Open a harness and the agent is already running with your context loaded. One command opens the same session in your own terminal.
› serverless connect soc-triageattached · soc-triage · ttl 1h47m remaining › ls context/auth-events-24h.jsonl detections.json runbook-4471.mdasset-owner.json prior-tickets.md › pi "is 4471 consistent with the VPN egress change?"Both logins authenticated from the same device ID and thesame refresh token. The second egressed via the new Frankfurtpool, added in change CHG-2209 four hours before the alert.Nine prior tickets on this detection closed the same way. Recommend: false positive. Your call.
$ brew install quivdev/tap/serverless$ serverless login --api-url https://acme.getserverless.ai$ serverless harness listNAME TEMPLATE STATUS TTLsoc-triage security-triage active 1h47mmon-88 latency-triage active 3h02m$ serverless connect soc-triageattached · soc-triage · Ctrl-\ to detach
Delegated, not a service account
A credential acts as the person who created it and reaches exactly what they can reach, resolved fresh on every request. Lose access in the app and the credential loses it at the same moment.
Compose from here
List, create and destroy harnesses without opening a browser. Create one and wait for it to be ready, with --json on the read commands.
Auditable
An archived harness is not a deleted one.
Four records survive the container, and each one is honest about its limits.
# Session · 2026-08-14T12:34:56Z- Started: 2026-08-14T10:02:11Z- Ended: 2026-08-14T12:34:56Z (ttl expired)- Duration: about 2 hours- Agent: pi- Launched by: dana@acme.com- Also seen acting: sam@acme.com (probably)---## What was done## What was decided## Left unfinished## Start here next time
The four headings are the ones the agent is asked for. The filename is an ISO instant with : and . replaced by -, so a session log sorts chronologically as plain strings with no index behind it.
The frame digest
sha256:9f2c41d8e7b0…a3The exact composition it ran. A frame version is deduped on the SHA-256 of the document itself, so the digest is the composition. Reproduce the harness from it months later.
The activity log
retention: your workspace’s windowPrompts as they were typed, the tool calls they caused, shell commands run outside the agent, and file operations. Not the agent’s replies, not tool results, not the contents of any file.
The notes
no expiryThe shared note and each member’s own. Deliberately not gated on the harness being alive. A torn-down harness still opens its notes, which is when somebody is most likely to want them.
The workspace audit log
no write API, no delete buttonWho did what to the workspace: launches, teardowns, attaches, template edits, credential revocations. Refusals too, recorded as the action that was attempted with an outcome of denied.
Written once, by nobody
A session note is immutable by construction rather than by permission. The code asks "may anyone ever change this" as a separate question from "may this person write here", so there is no grant, no role and no administrator that makes a summary editable, including one who revives the archived harness.
The summary outlives the log
Activity records are kept for the window your workspace sets, thirty days by default, and are deleted nightly after that. The summary is a document rather than a row: it stays readable once the records behind it are gone, which is why the names, and their hedges, are written into it as it is stored.
How it works
The lifecycle of a serverless harness.
Compose
Name the repositories, MCP servers, integrations and context the work needs, plus the model and how long it may live. It is a file, so review it in a pull request like anything else you ship.
Work
Start one from the dashboard, from your terminal, or let a trigger do it. Context is gathered before the agent takes its first turn, so you open the harness to a prompt already inside the work.
Destroy
Delete it, park it, or let the deadline do it. A time to live is not optional. Nothing is left running, and nothing is left to pay for.
Audit
On the way out the harness writes down what the session did. One document, created once, that no permission and no administrator can edit afterwards.
FAQ
