@@ -51,17 +51,24 @@ unavailable native workflow scheduler is never the owner. When task-board
5151remote publication is authorized, append every transition to the active Tiber
5252task with ` tiber.note.add ` (CLI: ` tiber note add ` ). When remote mutation is not
5353authorized, store the latest record at
54- ` $(git rev-parse --git-common-dir)/development-system/checkpoints/<task-id>.latest `
55- instead. Create its parent with owner-only permissions and serialize transitions
56- with an exclusive task-scoped lock in that directory. While holding the lock,
57- read the current complete record and require the proposed record's
54+ ` $(git rev-parse --git-common-dir)/development-system/checkpoints/<checkpoint-id>.latest `
55+ instead. Use the active task ID as ` checkpoint-id ` when one exists. Otherwise
56+ derive it as lowercase hexadecimal SHA-256 of the exact byte sequence
57+ ` baseline_oid ` , one NUL byte, and the normalized original user request, and
58+ record that ID in every handoff. Invoke the bundled
59+ ` <plugin-root>/scripts/write-local-checkpoint.sh ` with that ID, the expected
60+ generation, the expected predecessor digest (or literal ` null ` ), and a file
61+ containing the proposed newline-terminated record. The helper creates the
62+ owner-only parent and serializes transitions with an exclusive task-scoped
63+ lock. While holding the lock, it reads the current complete record and requires
64+ the proposed record's
5865` generation ` to equal the current generation plus one and its
5966` predecessor_sha256 ` to equal SHA-256 of the exact current ` checkpoint-v1 ` line;
6067the bootstrap record uses generation zero and a null predecessor. Reject a
61- missing or stale predecessor without replacing the current record. Then write
62- one complete line to a same-directory temporary file, flush it, atomically
63- rename it over the target, flush the directory, and release the lock; never
64- append in place. Keep this local file
68+ missing or stale predecessor without replacing the current record. The helper
69+ writes one complete line to a same-directory temporary file, flushes it,
70+ atomically renames it over the target, flushes the directory, and releases the
71+ lock; never synthesize a second writer or append in place. Keep this local file
6572untracked and out of the content snapshot. Select one owner for the current
6673delivery mode and never treat an unpublished Tiber transaction as the local
6774fallback. After every transition, persist exactly one record before the next
@@ -106,8 +113,9 @@ gate receipts are `null`, and CI may be empty, only when `baseline_oid` equals
106113and ` delivery ` identifies that same pre-existing baseline. A dirty,
107114non-baseline, or unreconciled starting worktree is a recovery hold, not a
108115bootstrap shortcut. Store bounded references rather than raw logs or secrets.
109- At session start, restart, or handoff, read the selected owner: ` tiber.show ` for
110- authorized task publication or the exact local ` .latest ` file for local-only.
116+ At session start, restart, or handoff, read the selected owner: ` tiber.show ` when
117+ task publication was authorized for this checkpoint, otherwise the exact local
118+ ` .latest ` file regardless of repository delivery mode.
111119Select its latest ` checkpoint-v1 `
112120record, verify its generation/predecessor chain when history is available, and
113121reconcile every identity with current Git and forge state before acting. A
0 commit comments