Purpose: define what Dizzy can export, what must stay bounded, and how exit claims map to current implementation.
Portability is an agency boundary, not a bulk data dump. Exports must help a client or operator leave with useful records without leaking private memory, credentials, third-party context, or another trust zone.
Client continuity can be exported as JSON through:
GET /agent/continuity/export?client_id=...&service_id=...
GET /agent/continuity/export?conversation_key=...
The route returns dizzy.client_continuity.export.v1.
The route relies on the same server boundary as other /agent/* routes: global bearer authentication when DIZZY_AUTH_TOKEN is configured, and loopback-only startup rules in unauthenticated direct_local mode. Do not expose continuity export over non-loopback, proxied, hosted, or client-facing surfaces without strong DIZZY_AUTH_TOKEN protection and an explicit scoped export design.
Local operator inspection does not require launching the HTTP server:
node scripts/operator_continuity.mjs list
node scripts/operator_continuity.mjs export <conversation_key>
node scripts/operator_continuity.mjs delete <conversation_key>
The CLI is an operator/admin tool. It reads the active execution history and conversation directory, uses the same scrubbed export helper as the HTTP route, and uses the same deletion helper as /agent/continuity.
The JSON export may include:
conversation_key- export timestamp
- schema version
- client-continuity execution history rows for that exact conversation key
- conversation JSONL rows for that exact conversation key
- counts for exported history and conversation rows
Exports must not include:
private_selfmemory- repository retrieval snippets
- credentials, tokens, cookies, or authorization headers
- dashboard session cookies
- unrelated client or service records
- deleted continuity records
- third-party private context outside the requested conversation
The JSON export returns the scoped conversation record as stored. Upstream capture rules, trust-zone gating, and deletion/pruning must prevent excluded data from entering that record; the export route is not a general-purpose redaction pass.
An export request must identify one continuity scope by either:
client_idandservice_id, orconversation_key
The server normalizes client_id and service_id into the same deterministic conversation key used by /agent/execute. Caller-supplied arbitrary conversation keys are normalized before file lookup.
The conversation_key form is an operator/admin recovery surface, not client self-service authorization. Client-visible export would need scoped client authentication or a non-guessable export capability before deterministic conversation keys could be safely exposed.
Deletion remains separate from export:
DELETE /agent/continuity
POST /agent/continuity/prune
After deletion or expiry pruning removes a continuity file and its history rows, the export route (or the CLI/dashboard equivalents) returns an empty export for that conversation key rather than resurrecting deleted records.
Deletion events are logged through the client-continuity deletion log (runtime/client_continuity_deletions.jsonl). That log is a local operator audit surface, not part of the client continuity export.
For a full revocation audit in practice, the operator can:
- List current records via the CLI (
node scripts/operator_continuity.mjs list) or the loopback dashboard (/dashboardConsole tab). - Export the target record for inspection before deletion.
- Delete the record (
node scripts/operator_continuity.mjs delete <key>or click Revoke on the dashboard). - Verify the conversation file is deleted, history rows are purged, and the deletion is logged.
Implemented:
- JSON
Not implemented yet:
- CSV
- dashboard download controls
- signed export bundles
- export manifests with checksums
CSV export is not implemented. If added later, it must use separate files to avoid flattening unlike records. The current database/export shapes suggest the following candidate column layouts; fields not present in stored rows must be omitted or emitted blank.
Tracks execution parameters. Nested structures (like the capability receipt) are flattened.
| CSV Header | Description | Data Type | Source Field / Receipt Mapping |
|---|---|---|---|
timestamp |
ISO 8601 creation timestamp | String | t |
route |
HTTP request path | String | route |
trust_zone |
Scoped trust zone for execution | String | trust_zone |
service_id |
Scoped service identifier | String | service_id |
client_id |
Scoped client identifier | String | client_id |
continuity_mode |
Continuity mode | String | continuity_mode |
retention_scope |
Scoped data retention policy | String | retention_scope |
repo_retrieval_allowed |
Whether repository retrieval was allowed | Boolean | repo_retrieval_allowed |
durable_memory_allowed |
Whether memory writing was allowed | Boolean | durable_memory_allowed |
result_kind |
Execution result category | String | result_kind |
receipt_format |
Format of capability receipt | String | capability_receipt.format |
receipt_zone |
Capability receipt trust zone | String | capability_receipt.trust_zone |
receipt_timestamp |
Timestamp on receipt | String | capability_receipt.timestamp |
conversation_key |
Normalized conversation identifier | String | conversation_key |
Tracks messages within a given conversation.
| CSV Header | Description | Data Type | Source Field |
|---|---|---|---|
timestamp |
ISO 8601 message timestamp | String | t |
role |
Message author role (user or assistant) |
String | role |
text |
Raw message text | String | text |
backend |
API backend used, if present (assistant only) | Optional String | backend |
model_route |
Selected model route, if present (assistant only) | Optional String | model_route |
CSV exports must follow the same exclusions as JSON exports. They must not include private memory, repository retrieval snippets, credentials, cookies, authorization headers, deleted records, or unrelated client context.
Any new export surface must answer:
- What exact records are included?
- Which trust zone owns those records?
- What is excluded by default?
- How are credentials and third-party data prevented from leaking?
- How does deletion affect future export?
To protect the integrity of exported data and prevent downstream systems from being compromised by malicious payloads, client-continuity exports pass string values through secret scrubbing and prompt-injection redaction. Retained paid/client continuity text is redacted before storage when it matches known prompt-injection patterns. Private/operator local conversation history remains a local working transcript, not a client export guarantee. This process is handled by lib/janitor.mjs; flagged payloads are redacted or blocked rather than echoed back inside the neutralization marker, so hostile text is not replayed into client-continuity exports or retained paid/client prompt history. (Verification command: node scripts/fuzzing_and_injection_tests.mjs)