The coding profile is the domain profile for agents that work in a workspace. It covers what an agent did to the workspace: which files changed and how precisely those changes were recorded, which version-control actions happened, the state of each workspace root, and checkpoints. A session that changed nothing can still claim coding: a profile is a promise about what the producer records when things happen, not a statement that they happened (see Extensibility).

file_change

A file_change records changes to one or more files, as the source recorded them. Its changes[] array is authoritative and follows the diff structure of Agent Client Protocol (ACP) v2.
Capture state key: patch. ASR-450 A file_change MUST contain status, precision and a non-empty changes array. Status meanings: ASR-451 status MUST reflect the source’s evidence. A producer MUST NOT write applied when the source shows only a request or a proposal.

Cause

ASR-452 cause MUST contain exactly one of callId, actor or restore. When it contains actor, it MUST contain observed: true; a producer MUST NOT attribute a change to a person without the source’s observation, and uses external when the source observed a change without saying who made it. ASR-453 cause.callId SHOULD match the callId of a tool_call in the stream. cause.restore MUST resolve to a rewind or checkpoint record.

Changes

ASR-454 Each change MUST contain op, root and path. A move or copy MUST contain oldPath. unknown requires evidence that a change occurred without a known operation. A first observed file version is a checkpoint, not evidence of a change.

Precision

precision says how completely the record determines the change, independently of which hashes or blobs are present. ASR-455 precision MUST be the least precise level among the record’s changes, in the order exact, hunks, snippet, unknown. A producer MUST NOT claim more precision than the source supports; an edit recorded only as replaced and replacement strings is snippet.

Patch

ASR-456 patch MUST contain format and exactly one of text or blob. unified MUST be used only when changes has exactly one entry. changes is authoritative: a patch MUST be consistent with it, and where they disagree readers MUST follow changes. Paths inside patch text are kept as the source wrote them (ACP v2 patches use absolute paths). Root substitution (writing a root ID and a relative path in place of an absolute path) does not apply to them.

File states and object IDs

ASR-457 A file state with objectId MUST have objectIdType, and the object ID MUST be 40 lowercase hex digits for git-blob-sha1 and 64 for the others. A file state MUST NOT contain both text and content. ASR-458 Object IDs MUST be computed as follows: git-blob-sha1 is the SHA-1 of the Git blob framing (blob, a space, the size in decimal, a NUL byte, then the bytes); git-blob-sha256 is the same framing hashed with SHA-256; sha256 is the SHA-256 of the bytes alone. ASR-459 An object ID read from a repository (an index entry, a tree, a commit) MUST be labeled git_object. A producer MUST NOT relabel it as worktree, because clean filters can make the two differ. representation SHOULD be present whenever objectId is. ASR-460 A producer MUST NOT hash a file’s current content and record it as a historical before or after state unless it observed that content at the edit boundary (for example a native writer hashing the file immediately after its own edit). ASR-461 Object IDs are optional (SHOULD, where the producer has them). Consumers MUST NOT require them. Precision and artifact availability are independent: a hunks change needs no object ID, and exact content needs no hash. ASR-462 A matching object ID between a recorded after state and a committed file is strong evidence for attribution, not proof that the session caused the commit. Consumers MUST NOT present it as proof of causation.

Net changes and incomplete lists

T3 Code records the files a turn changed as the difference between the checkpoints before and after the turn. Such a record overlaps the records of the individual edits in that turn.
ASR-474 Consumers MUST NOT add a file_change with basis: "net" to the changes of the operations it spans, and MUST NOT count the files it lists again. endpoints refs, when present, MUST resolve to records with a lower seq. ASR-475 moreFiles and modifiedByUser MUST come from the source. When moreFiles is true, consumers MUST NOT treat changes as the complete list of changed files.

vcs

A vcs record describes a version-control action performed in the session, such as a commit, a push, a checkout or opening a pull request.
The first record was parsed from the output of git commit, which prints an abbreviated commit ID, so only commitPrefix is known. pr_ready marks a draft pull request ready for review; pr_draft turns it back into a draft. pr_link is not an action: it records that the source linked the session to a pull request (Claude Code’s pr-link, T3 Code’s pull request links), without saying that the session opened it.
ASR-463 A vcs record MUST contain action and evidence. commit and every element of parents MUST be 40 or 64 lowercase hex digits; commitPrefix MUST be 4 to 39 lowercase hex digits; a record MUST NOT contain both commit and commitPrefix. ASR-464 A producer MUST write vcs records only for actions performed in the session (by its tool calls, its harness, or observed in its workspace while it ran), and for links to pull requests that the source records (pr_link). A commit or pull request merely mentioned in content is not a vcs record, and consumers MUST NOT treat a mention as evidence that the session produced it. ASR-465 evidence MUST say how the producer knows: a value parsed from command output MUST be parsed_output, not observed, whether the producer or the source parsed it. ASR-476 A pr_link record MUST have evidence: "reported". Consumers MUST NOT treat a pr_link as evidence that the session opened, changed or merged the pull request.

workspace_state

A workspace_state records the state of a root when the source records a change to that state: a new HEAD, a branch switch, the working tree becoming dirty or clean, or a new working directory.
ASR-466 A workspace_state MUST contain root or cwd, and its members MUST come from the source (ASR-159 applies). head follows the format of vcs.commit.

checkpoint

A checkpoint records a snapshot the source took of workspace files, typically so that a rewind can restore them: a commit in a shadow repository (a separate repository used for snapshots), a commit under a hidden ref in the workspace’s own repository, a snapshot ID, a stash.
The second record comes from a T3 Code thread. T3 Code keeps checkpoints as commits under hidden refs; this one was no longer present when the source last checked. ASR-467 A checkpoint MUST contain kind and ref. Each element of files MUST be a root-relative string or a PathRef object with root and path; version, when present, MUST be a string or nonnegative safe integer (ASR-042), and blob MUST be a BlobRef.

Path encoding

ASR uses one structured path encoding everywhere a path is a field: file_change changes, exec.cwd, tool_call.locations, instructions.source, terminal.cwd, workspace_state.cwd, plan.source, memory_change.target.path, config_change.sandbox.writableRoots and checkpoint file objects.
ASR-468 root, when not null, MUST name a root declared earlier in the stream (ASR-166). ASR-469 When root is not null, path MUST be a relative path with / separators: it MUST NOT begin with /, MUST NOT contain empty, . or .. segments, and is exactly . for the root itself. ASR-470 When root is null, path MUST be absolute, with / separators: /srv/data/x, a drive form such as C:/Users/x, or a UNC form such as //server/share/x. ASR-471 When the native spelling differs from path (backslashes, a different absolute form, characters that do not survive conversion), the producer SHOULD record it in nativePath. Producers MUST NOT resolve symbolic links, change case or apply Unicode normalization to path. ASR-477 A producer SHOULD decode a native file: URI to a path using the source’s own rules for URIs, including authorities and Windows conventions, and keep the original URI in nativePath. It MUST NOT guess using the path rules of the machine the export runs on. When decoding is uncertain, it MUST keep the native evidence rather than invent a normalized path. A producer SHOULD express a path relative to a root whenever the native absolute path lies inside a declared root. ASR-472 Root substitution applies only to path fields. Paths inside tool inputs, commands, output text, patches and content MUST be kept exactly as the source wrote them. Consumers and redaction tools MUST NOT assume that a stream with redacted roots contains no absolute paths. ASR-473 A native path that is not valid UTF-8 cannot be represented exactly. The producer MUST replace invalid byte sequences with U+FFFD and MUST declare the loss path.encoding.