# Publication records and recovery output This guide describes the supported private publication-record envelope and the versioned JSON documents emitted by the recovery CLI. The [publication consumer guide](../consumers/publish.md) owns storage placement, permissions, retention, and sensitive-data handling. The [CLI reference](../cli.md) owns command behavior, path selection, and exit statuses; the exported Go contract is documented in [GoDoc](../../recovery.go). ## Private attempt record Each saved attempt is one complete JSON document with this versioned envelope: ```json { "format_version": 1, "evidence": { "repository_dir": "/work/project", "module_dir": "/work/project", "module_path": "example.com/project", "version": "v1.2.3", "tag": "v1.2.3", "candidate_commit": "", "tag_object": "", "endpoint": "ssh://git.example/owner/project.git", "remote": "origin", "recorded_at": "2026-11-02T12:00:00Z" } } ``` The format version is an integer. Evidence fields may be absent when publication stopped before they were captured; loading preserves that partial evidence and does not fill fields from the current checkout. Additional fields in a supported version are ignored. A missing or unsupported version, malformed or multiple JSON documents, or fields with invalid structural types are reported as record-format errors. The codec supports version 1; no migration from an unsupported version is performed. The `endpoint` value is stored exactly as captured and may contain credentials. Private records are sensitive. Do not copy them into public logs or source control. For their location, permissions, and lifecycle, see the [publication consumer guide](../consumers/publish.md#retain-and-reconcile-publication-evidence). ## Recovery CLI JSON After valid command arguments, `--json` emits one JSON document to standard output for both successful and failed recovery operations. Each document has `schema_version: 1` and a `command` name. These are CLI presentation documents, not private attempt records or a Go serialization of public structs. `reconcile` includes `record_path`, safe `evidence`, and `state` when a record was read. Available `observed_tag_object` and `observed_commit` fields are included when present. A `diagnostic` is included for unresolved observation or record loading failure. Loading failure omits evidence, state, and observed IDs. `publication-attempts` includes `record_dir`, an `attempts` array with each `record_path` and safe `evidence`, and a `diagnostics` array. A top-level `diagnostic` describes enumeration or cancellation failure. Both arrays are present when empty so consumers can decode the same shape for empty stores. For example, an unresolved reconciliation can have this shape: ```json { "schema_version": 1, "command": "reconcile", "record_path": "/private/attempt-abc.json", "evidence": { "repository_dir": "/work/project", "module_path": "example.com/project", "version": "v1.2.3", "tag": "v1.2.3", "candidate_commit": "", "tag_object": "", "endpoint": "ssh://git.example/owner/project.git", "remote": "origin" }, "state": "unknown", "diagnostic": { "kind": "remote_observation", "message": "" } } ``` A discovery document always contains both arrays, including for an empty store: ```json { "schema_version": 1, "command": "publication-attempts", "record_dir": "/private/publication-attempts", "attempts": [], "diagnostics": [] } ``` CLI evidence uses the private record's snake-case field names. Endpoint strings in CLI output are credential-redacted; the private record and typed `PublicationEvidence` retain the exact endpoint. A diagnostic contains `kind` and safe `message`, with `record_path` and `missing_fields` when applicable. Raw Go errors and private record contents are not emitted as JSON fields. Consumers should select attempts by their returned record paths and evidence. The listing order is deterministic by path, not a recommendation to choose the first or newest attempt. Unknown fields may be added in later CLI schema versions; reject unsupported `schema_version` values rather than interpreting them as version 1. See the [CLI reference](../cli.md#recover-a-saved-publication-attempt-or-discover-local-attempts) for invocation and status behavior.