The binding is visible outside the server. Five fields in the 17-field proof record carry the version and the approval state, and they are kept in every export.
versionFingerprint is resolved by collectWorkspaceProofRecords in src/lib/exports/workspaceProofExport.ts as the first non-empty value in this order: the SCHEDULE_HANDOFF_COMPLETED event's reviewVersion, the latest REVIEW_APPROVED or EXTERNAL_REVIEW_APPROVED event's reviewVersion, or the current schedule row's reviewVersion. When none of those sources carry a value, the field is null.
approverIdentity stores the label of who decided, read from the latest approval event. For an internal decision that is the workspace user label, and for a decision on a shared review link it is the self-declared reviewer label captured on the link. For a saved client contact using a personal link it is the contact's name, and for an approval recorded for the client it is the team member who recorded it.
approverSource records how the decision was captured. It is internal for REVIEW_APPROVED events and external_self_declared for EXTERNAL_REVIEW_APPROVED events made on a shared review link. It is client_contact when a saved client contact approved through the personal link issued to them, and team_on_behalf_of_client when a workspace owner or admin recorded that the client approved, in which case the approver named is that team member. The row always shows where the decision came from.
approvalTimestamp records when the decision was committed, taken from the approval event's createdAt. Paired with versionFingerprint, it answers "which version was approved, and when" from a single row.
invalidationReason is derived from a REVIEW_LINK_EXPIRED or REVIEW_LINK_SUPERSEDED event for the same schedule. Expired links write expired; superseded links write the supersession reason recorded on the event. The field is null when no such event exists for the schedule. The signed PDF and the unsigned CSV file both carry these columns. See the proof record schema for all 17 fields.