The whole task, attributed. Every field and description line with recorded history points at the edit that set it, and the edit names the person or program behind it.
MDR-2 (01a1bb09-797e-73d6-aead-295f8f563adb) Fields:Title: Draft the release summary card [01a1bb09-797]Column: Doing [01a1bb09-797]Priority: High [01a1bb09-797]Due: none [01a1bb09-797]Labels: review [01a1bb09-797]Parent: none [01a1bb09-797] Description:1 | [01a1bb09-797] | Summaries reach the board in one pass.2 | [01a1bb09-79a] | Add the changelog link at the end.3 | [01a1bb09-797] | Keep the byte count under 300. Attribution:01a1bb09-7972026-11-07 09:22:10.750 +01:00Helly R.Kind: humanEmail: helly.r@lumon.industriesSource: git-configSession: nullThread: nullAgent: nullModel: nullEffort: nullClient: zinn-cli/0.44.0 01a1bb09-79a2026-11-07 09:31:48.882 +01:00claude-codeKind: agentEmail: nullSource: env:CLAUDECODESession: ses_01a1bb09-7c4f2eThread: nullAgent: claude-codeModel: opus-4.5Effort: nullClient: zinn-cli/0.44.0 zinn-claude-code/0.2.0
How it decides
Whole lines, matched exactly
Description attribution compares complete lines, whitespace included. Blank lines are preserved.
Shared lines keep their event
Lines the edit leaves alone keep their attribution. Lines it introduces belong to the edit.
Missing history reads as unrecorded
A field or line without a recorded origin prints as unrecorded rather than guessing.
Archived tasks still answer
Blame reads active and archived tasks, and records no activity of its own.
Gaps and mismatched history can leave lines unrecorded. The full rules, including comparison edge cases, are in the CLI reference.
JSON
With --json, the command returns the TaskBlame result. Each reference opens with zinn activity view <activity-id>.