Skip to main content

Formats

The wire and on-disk JSON shapes Kindling uses. All timestamps are epoch milliseconds unless noted. JSON keys are camelCase.

Observation

{
"id": "9c20f3a1-2b4d-4f8e-9a1c-7e0d5b6f2a33",
"kind": "error",
"content": "JWT validation failed: token expired",
"provenance": {
"stack": "Error: Token expired\n at validateToken.ts:42"
},
"ts": 1750416064123,
"scopeIds": { "sessionId": "session-1", "repoId": "my-project" },
"redacted": false
}
FieldTypeNotes
idstringUnique identifier (UUID).
kindenumSee kinds.
contentstringThe captured text.
provenanceobjectFree-form, source-specific metadata.
tsnumberEpoch milliseconds.
scopeIdsobjectAny of sessionId, repoId, agentId, userId, taskId.
redactedbooleanWhether the content has been forgotten.

Observation kinds

tool_call | command | file_diff | error | message
node_start | node_end | node_output | node_error

See Observations for what each means.

Capsule

{
"id": "cap_8a3f...",
"type": "session",
"intent": "investigating the memory leak",
"status": "closed",
"openedAt": 1750416000000,
"closedAt": 1750416600000,
"scopeIds": { "repoId": "my-project" },
"observationIds": ["9c20f3a1-...", "5f1c..."],
"summaryId": "sum_1b2c..."
}
FieldTypeNotes
typeenumsession or pocketflow_node.
statusenumopen or closed.
closedAtnumber?Present only once closed.
observationIdsstring[]Member observation IDs, in order.
summaryIdstring?Set when a summary is produced on close.

Summary

{
"id": "sum_1b2c...",
"content": "Fixed JWT expiration check in middleware",
"confidence": 0.85,
"evidenceRefs": ["9c20f3a1-..."],
"capsuleId": "cap_8a3f...",
"ts": 1750416600000,
"scopeIds": { "repoId": "my-project" }
}

Pin

{
"id": "pin_4d5e...",
"targetType": "observation",
"targetId": "9c20f3a1-...",
"reason": "root cause — keep handy",
"createdAt": 1750416100000,
"expiresAt": null,
"scopeIds": { "sessionId": "session-1" }
}

The CLI --note flag on kindling pin maps to reason in JSON.

Redacted content

Forgotten observations keep their record but replace content with [redacted] and set redacted: true. They are excluded from exports and from retrieval unless includeRedacted is set on programmatic retrieve calls.

Export bundle

kindling export writes a bundle that round-trips through kindling import:

{
"bundleVersion": "1.0",
"exportedAt": 1750416700000,
"dataset": {
"version": "1.0",
"exportedAt": 1750416700000,
"scope": { "repoId": "my-project" },
"observations": [
/* Observation[] */
],
"capsules": [
/* Capsule[] */
],
"summaries": [
/* Summary[] */
],
"pins": [
/* Pin[] */
]
},
"metadata": {
"description": "Kindling memory export",
"exportedAt": "2025-06-20T11:05:00.000Z"
}
}
FieldNotes
bundleVersionBundle format version ("1.0").
exportedAtEpoch milliseconds.
datasetThe entity payload. Entities are ordered deterministically (observations by ts, capsules by openedAt, etc.).
dataset.scopeThe scope filter applied, when --session/--repo was given. Omitted otherwise.
metadataOptional. Carries a human description and an ISO-8601 exportedAt.

Redacted observations are excluded from exports.

Next