[on hold] feat(tasks): add guarded status actions #801

Closed
kayg wants to merge 1 commit from feat/tasks-set-status into dev
Owner

ON HOLD by owner decision. Pending docs/plans/0066-tasks-writes-v2.md: a pure planner of exact splices plus ONE journaled executor for apply, recovery and undo across all task actions. Current implementation and regression tests are preserved; do not merge.

Plan

This plan is the first change in the PR. The implementation follows the
accepted task model and the additional B1 constraints from the task brief.

Scope and size

Size: M. One and many status actions, a guarded notes job API, generated
action types, and focused tests; target under 800 production lines, excluding
tests and the plan.

  • tasks.set-status changes one task.
  • tasks.set-status-many applies one status selection as one undoable job.
  • The shared status names are todo, doing, done, cancelled, and
    someday.
  • Ordinary status changes edit the task's status key and every owning
    checkbox. done stamps completed; cancelled stamps cancelled; other
    statuses clear both outcome timestamps. A checkbox edit replaces only its
    parsed mark character.
  • A recurring tick or untick requires the exact session-line link. The task
    master stays open and its checkbox lines remain open; its log list records
    the completed occurrence by that link. Repeating the same link is a no-op.
    The event/session writer remains the source of the link; this action does
    not invent a session line.
  • The caller supplies the task note version. tasks.get returns that version
    for the next status edit.
  • Both actions use one history-backed notes job. Its returned job id supports
    exact notes.undo; the idempotency key identifies both the request and job.

Safety and file format

Frontmatter changes go through crates/notes/src/props.rs. Before the writer
runs, status edits refuse malformed or non-simple frontmatter, including
comments, flow collections, anchors/aliases, multiline scalars, and quotes
embedded in plain scalars, CRLF, and BOM. No fallback YAML writer is added. Accepted status
and log edits must preserve every byte outside their target property lines.

Checkbox candidates come from the existing CommonMark parser in
crates/tasks/src/found.rs. No checkbox-looking text inside fenced code,
inline or multiline code spans, or HTML comments is actionable. The resulting
edit changes only the mark returned by that parser. The guarded step checks
the room version and re-reads the raw file before applying the patch. It
refuses a mismatch, preserves existing note metadata, and records its
receipt before file placement. Undo uses the existing guarded splice.
A failed job remains a refusal when its request key is retried.

Complexity

Let K be selected tasks, L their indexed owning checkbox lines, N the
distinct notes containing those lines, and B the total bytes in those notes.
Single status lookup is O(log T + L + B); many is O(K log T + L + B).
The durable plan is O(B + K + L): it stores the expected text of each
note once for exact byte checks, plus the forward and inverse edits. There is no Home-wide scan.

Failure table

Failure Effect Detection Recovery Test
Stale task version No task or line changes Expected version check in the note room Fetch current task and retry Stale-version action test
Unsupported or malformed YAML No frontmatter or line changes props validation and safe-format guard Fix source mode, then retry Rejection corpus
Checkbox text is code/comment It is not indexed or edited Existing Markdown parser None needed Markdown corpus
Source bytes change after preflight The guarded step refuses; earlier durable steps remain undoable Re-read raw file and compare room version/text inside the step Inspect the failed job and undo its completed steps Planned-step outside-write test
Retry after lost reply Same job/result; no duplicate log link or mark edit Idempotency receipt and step keys Retry with the same key Replay/idempotency test
Crash between job steps Job resumes without a second edit Durable job progress and per-step keys Startup replay Kill/reopen boundary test
Undo after success Only this job's status, log and mark edits are reverted Job history and guarded inverse Run notes.undo with returned job Byte-exact undo test
One stale item in many No partial selection is acknowledged Validate all selected versions before job start Refresh the selection Many-action stale test

Tests and gates

  • Corpus tests accept only simple frontmatter and prove that accepted edits
    change only the target property lines; reject each unusual YAML form above.
  • Markdown corpus covers normal checkboxes, inline/multiline code, fences,
    and single/multiline HTML comments.
  • Task tests cover every status, multiple linked lines, exact-byte preservation,
    stale versions, one-job many updates, recurring log-link dedupe/untick,
    idempotent replay, crash replay, and exact undo.
  • Gates: cargo fmt --all --check; cargo clippy --workspace --all-targets -- -D warnings; tests for calternal-tasks, calternal-notes, and
    calternal; the action contract test and generated web action types; web
    typecheck.

Decisions and costs if wrong

  • The recurring occurrence key is the caller-supplied session-line link, as
    requested in the integrated task/event model. It is stored as a list item in
    log; this differs from the older outcome-map example in ADR 0068. If that
    example remains normative, the log representation will need an ADR update.
  • Strict frontmatter refusal may block status changes to otherwise readable
    task notes. This is intentional for B1: unsafe formatting is never guessed
    through or normalized.

Resume findings

  • The original fixtures linked into Tasks/ while creating notes at the Home
    root. They now link to the actual fixture paths.
  • A multiline code-span fixture must remain one CommonMark paragraph. The
    corpus now asserts the parser emits a code event containing its fake box.
  • Crash hooks use the engine-scoped idempotency key so the test actually
    reaches the durable batch boundary before reopening the Home.
  • Property insertion can move checkbox offsets in a task note. Marker spans
    are now parsed from the planned text after its property edits.

Validation

Run on dev-01 inside nix develop -c bash -c, with heavy commands through
~/bin/slot (the final gate sequence held one slot throughout):

  • cargo fmt --all --check: passed.
  • cargo clippy --workspace --all-targets -j4 -- -D warnings: passed.
  • cargo test -j4 -p calternal-tasks -p calternal-notes: the notes suite
    passed 445 tests, with 6 ignored. The task fixture failures in this first
    invocation were corrected and verified by the final run below.
  • cargo test -j4 -p calternal-tasks -p calternal: 55 task tests and 61
    server tests passed; 4 server tests ignored.
  • UPDATE_CONTRACTS=1 cargo test -j4 -p calternal contract, then
    cargo test -j4 -p calternal contract: passed.
  • node apps/web/scripts/action-types.mjs --check: passed.
  • bun install --frozen-lockfile, then cd apps/web && bun run check:
    passed, 0 errors and 14 warnings in unchanged Svelte files.

The recurring crash test cancels/reopens at the durable batch boundary. The
notes suite separately exercises real kill-9 recovery; this PR does not add
a task-specific process-kill matrix. The journal's existing partial-failure
semantics remain: a late source conflict refuses its step, and completed
steps can be undone. Recurrence advancement and watcher reconciliation remain
separate work; B1 records caller-supplied session links.

Head: b91d8ab0ac701bb8f4e63d71e46ce0e2ea86b833. Ready for review; do not merge.

**ON HOLD by owner decision.** Pending `docs/plans/0066-tasks-writes-v2.md`: a pure planner of exact splices plus ONE journaled executor for apply, recovery and undo across all task actions. Current implementation and regression tests are preserved; do not merge. ## Plan This plan is the first change in the PR. The implementation follows the accepted task model and the additional B1 constraints from the task brief. ## Scope and size **Size: M.** One and many status actions, a guarded notes job API, generated action types, and focused tests; target under 800 production lines, excluding tests and the plan. - `tasks.set-status` changes one task. - `tasks.set-status-many` applies one status selection as one undoable job. - The shared status names are `todo`, `doing`, `done`, `cancelled`, and `someday`. - Ordinary status changes edit the task's `status` key and every owning checkbox. `done` stamps `completed`; `cancelled` stamps `cancelled`; other statuses clear both outcome timestamps. A checkbox edit replaces only its parsed mark character. - A recurring tick or untick requires the exact session-line link. The task master stays open and its checkbox lines remain open; its `log` list records the completed occurrence by that link. Repeating the same link is a no-op. The event/session writer remains the source of the link; this action does not invent a session line. - The caller supplies the task note version. `tasks.get` returns that version for the next status edit. - Both actions use one history-backed notes job. Its returned job id supports exact `notes.undo`; the idempotency key identifies both the request and job. ## Safety and file format Frontmatter changes go through `crates/notes/src/props.rs`. Before the writer runs, status edits refuse malformed or non-simple frontmatter, including comments, flow collections, anchors/aliases, multiline scalars, and quotes embedded in plain scalars, CRLF, and BOM. No fallback YAML writer is added. Accepted status and `log` edits must preserve every byte outside their target property lines. Checkbox candidates come from the existing CommonMark parser in `crates/tasks/src/found.rs`. No checkbox-looking text inside fenced code, inline or multiline code spans, or HTML comments is actionable. The resulting edit changes only the mark returned by that parser. The guarded step checks the room version and re-reads the raw file before applying the patch. It refuses a mismatch, preserves existing note metadata, and records its receipt before file placement. Undo uses the existing guarded splice. A failed job remains a refusal when its request key is retried. ## Complexity Let `K` be selected tasks, `L` their indexed owning checkbox lines, `N` the distinct notes containing those lines, and `B` the total bytes in those notes. Single status lookup is `O(log T + L + B)`; many is `O(K log T + L + B)`. The durable plan is `O(B + K + L)`: it stores the expected text of each note once for exact byte checks, plus the forward and inverse edits. There is no Home-wide scan. ## Failure table | Failure | Effect | Detection | Recovery | Test | |---|---|---|---|---| | Stale task version | No task or line changes | Expected version check in the note room | Fetch current task and retry | Stale-version action test | | Unsupported or malformed YAML | No frontmatter or line changes | `props` validation and safe-format guard | Fix source mode, then retry | Rejection corpus | | Checkbox text is code/comment | It is not indexed or edited | Existing Markdown parser | None needed | Markdown corpus | | Source bytes change after preflight | The guarded step refuses; earlier durable steps remain undoable | Re-read raw file and compare room version/text inside the step | Inspect the failed job and undo its completed steps | Planned-step outside-write test | | Retry after lost reply | Same job/result; no duplicate log link or mark edit | Idempotency receipt and step keys | Retry with the same key | Replay/idempotency test | | Crash between job steps | Job resumes without a second edit | Durable job progress and per-step keys | Startup replay | Kill/reopen boundary test | | Undo after success | Only this job's status, log and mark edits are reverted | Job history and guarded inverse | Run `notes.undo` with returned job | Byte-exact undo test | | One stale item in many | No partial selection is acknowledged | Validate all selected versions before job start | Refresh the selection | Many-action stale test | ## Tests and gates - Corpus tests accept only simple frontmatter and prove that accepted edits change only the target property lines; reject each unusual YAML form above. - Markdown corpus covers normal checkboxes, inline/multiline code, fences, and single/multiline HTML comments. - Task tests cover every status, multiple linked lines, exact-byte preservation, stale versions, one-job many updates, recurring log-link dedupe/untick, idempotent replay, crash replay, and exact undo. - Gates: `cargo fmt --all --check`; `cargo clippy --workspace --all-targets -- -D warnings`; tests for `calternal-tasks`, `calternal-notes`, and `calternal`; the action contract test and generated web action types; web typecheck. ## Decisions and costs if wrong - The recurring occurrence key is the caller-supplied session-line link, as requested in the integrated task/event model. It is stored as a list item in `log`; this differs from the older outcome-map example in ADR 0068. If that example remains normative, the log representation will need an ADR update. - Strict frontmatter refusal may block status changes to otherwise readable task notes. This is intentional for B1: unsafe formatting is never guessed through or normalized. ## Resume findings - The original fixtures linked into `Tasks/` while creating notes at the Home root. They now link to the actual fixture paths. - A multiline code-span fixture must remain one CommonMark paragraph. The corpus now asserts the parser emits a code event containing its fake box. - Crash hooks use the engine-scoped idempotency key so the test actually reaches the durable batch boundary before reopening the Home. - Property insertion can move checkbox offsets in a task note. Marker spans are now parsed from the planned text after its property edits. ## Validation Run on dev-01 inside `nix develop -c bash -c`, with heavy commands through `~/bin/slot` (the final gate sequence held one slot throughout): - `cargo fmt --all --check`: passed. - `cargo clippy --workspace --all-targets -j4 -- -D warnings`: passed. - `cargo test -j4 -p calternal-tasks -p calternal-notes`: the notes suite passed 445 tests, with 6 ignored. The task fixture failures in this first invocation were corrected and verified by the final run below. - `cargo test -j4 -p calternal-tasks -p calternal`: 55 task tests and 61 server tests passed; 4 server tests ignored. - `UPDATE_CONTRACTS=1 cargo test -j4 -p calternal contract`, then `cargo test -j4 -p calternal contract`: passed. - `node apps/web/scripts/action-types.mjs --check`: passed. - `bun install --frozen-lockfile`, then `cd apps/web && bun run check`: passed, 0 errors and 14 warnings in unchanged Svelte files. The recurring crash test cancels/reopens at the durable batch boundary. The notes suite separately exercises real kill-9 recovery; this PR does not add a task-specific process-kill matrix. The journal's existing partial-failure semantics remain: a late source conflict refuses its step, and completed steps can be undone. Recurrence advancement and watcher reconciliation remain separate work; B1 records caller-supplied session links. Head: `b91d8ab0ac701bb8f4e63d71e46ce0e2ea86b833`. Ready for review; do not merge.
docs: plan tasks status action
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
5780a01dd8
kayg changed title from tasks: add status actions to feat(tasks): add guarded status actions 2026-10-31 19:01:23 +00:00
Author
Owner

Independent review, round 1

Verdict: fix first. Reviewed b91d8ab0ac701bb8f4e63d71e46ce0e2ea86b833. P0: none identified.

P1: the exact-byte guard ends before file placement

crates/notes/src/room/edit.rs:137–173 checks the raw file before recording the edit, but bulk/steps.rs:69–95 subsequently flushes through the ordinary save path. On a placement conflict, room/save.rs:232–237 ingests the outside bytes and retries without repeating validate_patchable or comparing against the status step's expected bytes. Recovery similarly replays history and merges outside bytes in room/load.rs, and an existing edit receipt returns before the ExactPatch guard.

Concrete boundary: pause a CheckedEdit before file placement, externally change status: todo to status: cancelled and/or change the file to CRLF, then resume. The flush can merge and publish against bytes the action never validated instead of refusing. If that note also contains an owning checkbox, whole-key frontmatter resolution can retain the outside status while the pending checkbox becomes [x]. This is beyond the documented refusal with undoable earlier steps.

Carry the checked step's expected raw bytes/hash through actual atomic placement and recovery. For checked writes, refuse a mismatch rather than ingesting and retrying it as an ordinary edit. Keep the receipt/recovery state sufficient to distinguish an already placed result from an unapplied/conflicted one.

P1: undo discards the checked-write contract and can duplicate frontmatter keys

crates/notes/src/bulk/undo.rs:104–122 turns CheckedEdit into an ordinary Splice. Its path through room/delete.rs:97–125 ingests/saves before the splice guard and never calls validate_patchable. The guard in bulk/guard.rs checks only characters an inverse deletes; it does not protect properties an inverse reinserts.

Example: start with status: done and completed: <old timestamp>, set todo (removing completed), then let an outside editor add completed: <new timestamp> while retaining todo. Undo's inverse can restore the old completed line beside the new one: the status text being replaced is still unchanged, so its span guard passes. The result has duplicate completed keys. CRLF/BOM/unsupported YAML introduced after the action also bypasses the new refusal contract on this path.

Use a checked inverse for status jobs, validating raw bytes and YAML before any write, and protect the absence of any property being restored. The simplest conservative implementation refuses undo after the expected post-action note changes; any more permissive inverse needs whole-key preconditions as well as character-span checks.

P2: status sync overwrites unsupported checkbox symbols

crates/tasks/src/status.rs:297–313 rewrites every linked parsed mark, including [?] and other custom symbols, because found deliberately retains them. ADR 0066 says unknown custom symbols must be retained and are unsupported in v1. Refuse the affected action during preflight rather than silently replacing a custom symbol with a standard status mark.

Atomicity and parser assessment

The proposed simplest same-note fix is already present: status.rs:344–356 emits one CheckedEdit per distinct note after combining its properties and checkbox changes, and save places one complete note image atomically. Recurring ticks change only singular log, leaving the master boxes alone. I found no separate same-note checkbox/log write boundary that a crash alone could split. Cross-note partial jobs remain the documented limitation. Keep this grouping while fixing the guard paths above.

The new YAML guard explicitly covers the requested plain-value interior quotes, list comments, flow collections, multiline values, CRLF and BOM. CommonMark item events exclude checkbox-looking content in code spans, fences and comments; the multiline span fixture explicitly verifies that it is a real code span. No additional blocker identified in those parsing paths by inspection.

Validation limits

This is a code-inspection review, not a claim of passing new runtime tests. Three uncommitted probes are in dev-01's ~/Developer/Worktrees/review-801-r1/crates/notes/src/room/save/tests.rs: review801_exact_patch_late_outside_write, review801_undo_encoding_guard, and review801_undo_duplicate_property. All five dev-01 slots and both dev-02 slots were occupied; I cancelled only my queued unit before Cargo started. To run on dev-01 in that worktree: nix develop -c bash -c 'CARGO_TARGET_DIR=/home/claude/Developer/Worktrees/tasks-set-status/target ~/bin/slot cargo test -j4 -p calternal-notes review801 -- --nocapture'. The Nix overlay and probes remain uncommitted. No code pushed.

## Independent review, round 1 **Verdict: fix first.** Reviewed `b91d8ab0ac701bb8f4e63d71e46ce0e2ea86b833`. P0: none identified. ### P1: the exact-byte guard ends before file placement `crates/notes/src/room/edit.rs:137–173` checks the raw file before recording the edit, but `bulk/steps.rs:69–95` subsequently flushes through the ordinary save path. On a placement conflict, `room/save.rs:232–237` ingests the outside bytes and retries without repeating `validate_patchable` or comparing against the status step's expected bytes. Recovery similarly replays history and merges outside bytes in `room/load.rs`, and an existing edit receipt returns before the ExactPatch guard. Concrete boundary: pause a CheckedEdit before file placement, externally change `status: todo` to `status: cancelled` and/or change the file to CRLF, then resume. The flush can merge and publish against bytes the action never validated instead of refusing. If that note also contains an owning checkbox, whole-key frontmatter resolution can retain the outside status while the pending checkbox becomes `[x]`. This is beyond the documented refusal with undoable earlier steps. Carry the checked step's expected raw bytes/hash through actual atomic placement and recovery. For checked writes, refuse a mismatch rather than ingesting and retrying it as an ordinary edit. Keep the receipt/recovery state sufficient to distinguish an already placed result from an unapplied/conflicted one. ### P1: undo discards the checked-write contract and can duplicate frontmatter keys `crates/notes/src/bulk/undo.rs:104–122` turns CheckedEdit into an ordinary Splice. Its path through `room/delete.rs:97–125` ingests/saves before the splice guard and never calls `validate_patchable`. The guard in `bulk/guard.rs` checks only characters an inverse deletes; it does not protect properties an inverse reinserts. Example: start with `status: done` and `completed: <old timestamp>`, set todo (removing completed), then let an outside editor add `completed: <new timestamp>` while retaining todo. Undo's inverse can restore the old completed line beside the new one: the status text being replaced is still unchanged, so its span guard passes. The result has duplicate completed keys. CRLF/BOM/unsupported YAML introduced after the action also bypasses the new refusal contract on this path. Use a checked inverse for status jobs, validating raw bytes and YAML before any write, and protect the absence of any property being restored. The simplest conservative implementation refuses undo after the expected post-action note changes; any more permissive inverse needs whole-key preconditions as well as character-span checks. ### P2: status sync overwrites unsupported checkbox symbols `crates/tasks/src/status.rs:297–313` rewrites every linked parsed mark, including `[?]` and other custom symbols, because `found` deliberately retains them. ADR 0066 says unknown custom symbols must be retained and are unsupported in v1. Refuse the affected action during preflight rather than silently replacing a custom symbol with a standard status mark. ### Atomicity and parser assessment The proposed simplest same-note fix is already present: `status.rs:344–356` emits one CheckedEdit per distinct note after combining its properties and checkbox changes, and save places one complete note image atomically. Recurring ticks change only singular `log`, leaving the master boxes alone. I found no separate same-note checkbox/log write boundary that a crash alone could split. Cross-note partial jobs remain the documented limitation. Keep this grouping while fixing the guard paths above. The new YAML guard explicitly covers the requested plain-value interior quotes, list comments, flow collections, multiline values, CRLF and BOM. CommonMark item events exclude checkbox-looking content in code spans, fences and comments; the multiline span fixture explicitly verifies that it is a real code span. No additional blocker identified in those parsing paths by inspection. ### Validation limits This is a code-inspection review, not a claim of passing new runtime tests. Three uncommitted probes are in dev-01's `~/Developer/Worktrees/review-801-r1/crates/notes/src/room/save/tests.rs`: `review801_exact_patch_late_outside_write`, `review801_undo_encoding_guard`, and `review801_undo_duplicate_property`. All five dev-01 slots and both dev-02 slots were occupied; I cancelled only my queued unit before Cargo started. To run on dev-01 in that worktree: `nix develop -c bash -c 'CARGO_TARGET_DIR=/home/claude/Developer/Worktrees/tasks-set-status/target ~/bin/slot cargo test -j4 -p calternal-notes review801 -- --nocapture'`. The Nix overlay and probes remain uncommitted. No code pushed.
Author
Owner

round 1 implementation plan (size m): retain one complete note image per CheckedEdit. add one shared raw-byte/format guard for initial apply, receipt replay, atomic placement, recovery and checked undo. persist before/after images beside the keyed receipt; only receipts with committed edits activate recovery. undo swaps the captured images and refuses any changed post-image. preserve one write per distinct note; refuse custom checkbox marks during preflight.

cost: O(B) time and retained bytes per changed note, O(log R) receipt lookup.

failure effect detection recovery regression
late outside write no placement shared guard inside atomic placement retain refused journal; inspect outside bytes reviewer late-write probe
crash before/after placement whole old/new note only durable checked images and receipt replay only exact pre/post image save boundary matrix
changed bytes before undo no undo placement exact post-image guard preserve outside file encoding and duplicate-key probes
custom checkbox no job mutation preflight mark check preserve symbol task regression

will run fmt, workspace clippy -D warnings, tasks/notes/calternal tests, contract and action-types check on dev-01 through slot. no merge.

round 1 implementation plan (size m): retain one complete note image per CheckedEdit. add one shared raw-byte/format guard for initial apply, receipt replay, atomic placement, recovery and checked undo. persist before/after images beside the keyed receipt; only receipts with committed edits activate recovery. undo swaps the captured images and refuses any changed post-image. preserve one write per distinct note; refuse custom checkbox marks during preflight. cost: O(B) time and retained bytes per changed note, O(log R) receipt lookup. | failure | effect | detection | recovery | regression | |---|---|---|---|---| | late outside write | no placement | shared guard inside atomic placement | retain refused journal; inspect outside bytes | reviewer late-write probe | | crash before/after placement | whole old/new note only | durable checked images and receipt | replay only exact pre/post image | save boundary matrix | | changed bytes before undo | no undo placement | exact post-image guard | preserve outside file | encoding and duplicate-key probes | | custom checkbox | no job mutation | preflight mark check | preserve symbol | task regression | will run fmt, workspace clippy -D warnings, tasks/notes/calternal tests, contract and action-types check on dev-01 through slot. no merge.
Author
Owner

coordination update: merged origin/feat/tasks-delete-promote-duplicate at f1600ed0. B1 now reuses crates/notes/src/task_ops.rs::verify_target(note, expected_source_bytes, expected_kind). its checked-image adapter adds UTF-8/simple-format validation and carries the images through flush, crash recovery, receipt replay and undo; no competing byte/kind implementation.

same-note checkbox/log edits remain one complete atomic image. added a 16-case runtime-loss matrix (prepare, before placement, placement, after placement × forward/undo × unchanged/outside CRLF), receipt replay and custom-mark regressions. the three original reviewer probes reproduced failures on b91d8ab0. gate run is queued on dev-01 behind occupied slots. no merge into dev.

coordination update: merged `origin/feat/tasks-delete-promote-duplicate` at `f1600ed0`. B1 now reuses **`crates/notes/src/task_ops.rs::verify_target(note, expected_source_bytes, expected_kind)`**. its checked-image adapter adds UTF-8/simple-format validation and carries the images through flush, crash recovery, receipt replay and undo; no competing byte/kind implementation. same-note checkbox/log edits remain one complete atomic image. added a 16-case runtime-loss matrix (prepare, before placement, placement, after placement × forward/undo × unchanged/outside CRLF), receipt replay and custom-mark regressions. the three original reviewer probes reproduced failures on `b91d8ab0`. gate run is queued on dev-01 behind occupied slots. no merge into dev.
kayg changed title from feat(tasks): add guarded status actions to [on hold] feat(tasks): add guarded status actions 2026-10-31 19:32:00 +00:00
Author
Owner

on hold pending the shared Tasks writes v2 plan, per owner direction. stopped further fixes and gate runs. expected plan: docs/plans/0066-tasks-writes-v2.md, pure exact-splice planner + ONE journaled executor covering apply, recovery and undo for every action.

preserved and pushed head ac9bceb1. the three reviewer probe tests are committed as regressions, together with crash-boundary, receipt and custom-checkbox coverage. B3 was merged at f1600ed0 before the hold and B1 reuses its task_ops::verify_target.

status result
reviewer probes on original b91d8ab0 all three reproduced failures
combined implementation at bec85e00 473 notes + 63 tasks + 42 fsio tests passed; 6 ignored; all three probes and 16-case crash matrix passed
cargo fmt --all --check at 981f6c25 passed
cargo clippy --workspace --all-targets -j4 -- -D warnings at 981f6c25 passed
final tasks/notes/calternal test sequence stopped at calternal's stale generated contract: 30 passed, 1 failed, 1 ignored; subsequent package suites not reached
contract refresh UPDATE_CONTRACTS=1 cargo test -j4 -p calternal contract passed; generated snapshot preserved (two Unicode formatting lines)
action types regenerated; no diff; final --check not run before hold
merge never merged into dev; no further review round started

final full gates remain incomplete. conservative pending-conflict recovery in this preserved implementation refuses the room until its exact pre/post image is restored. this is work in progress for the shared redesign, not a ready-to-merge implementation.

**on hold pending the shared Tasks writes v2 plan**, per owner direction. stopped further fixes and gate runs. expected plan: `docs/plans/0066-tasks-writes-v2.md`, pure exact-splice planner + ONE journaled executor covering apply, recovery and undo for every action. preserved and pushed head `ac9bceb1`. the three reviewer probe tests are committed as regressions, together with crash-boundary, receipt and custom-checkbox coverage. B3 was merged at `f1600ed0` before the hold and B1 reuses its `task_ops::verify_target`. | status | result | |---|---| | reviewer probes on original `b91d8ab0` | all three reproduced failures | | combined implementation at `bec85e00` | 473 notes + 63 tasks + 42 fsio tests passed; 6 ignored; all three probes and 16-case crash matrix passed | | `cargo fmt --all --check` at `981f6c25` | passed | | `cargo clippy --workspace --all-targets -j4 -- -D warnings` at `981f6c25` | passed | | final tasks/notes/calternal test sequence | stopped at calternal's stale generated contract: 30 passed, 1 failed, 1 ignored; subsequent package suites not reached | | contract refresh | `UPDATE_CONTRACTS=1 cargo test -j4 -p calternal contract` passed; generated snapshot preserved (two Unicode formatting lines) | | action types | regenerated; no diff; final `--check` not run before hold | | merge | never merged into dev; no further review round started | final full gates remain incomplete. conservative pending-conflict recovery in this preserved implementation refuses the room until its exact pre/post image is restored. this is work in progress for the shared redesign, not a ready-to-merge implementation.
Author
Owner

on hold pending the shared Tasks writes v2 plan, PR #808, branch docs/tasks-writes-v2-plan, head 8d32f656049061a195653e950c9db097d10285c7.

docs/plans/0066-tasks-writes-v2.md covers all task writes: pure exact-byte splice planners plus ONE journaled executor for apply, recovery and recorded inverse undo, reusing calendar v2’s parsed view and frontmatter writer. Undo requires a committed change and the exact recorded post-image; refused removals cannot be restored. Executor first, then B1, B2, B3. Keep existing work/probes preserved; no further patch/review loop or merge of this held implementation pending the plan. Docs only; no implementation started.

on hold pending the shared [Tasks writes v2 plan, PR #808](https://git.kayg.org/kayg/calternal/pulls/808), branch `docs/tasks-writes-v2-plan`, head `8d32f656049061a195653e950c9db097d10285c7`. `docs/plans/0066-tasks-writes-v2.md` covers all task writes: pure exact-byte splice planners plus ONE journaled executor for apply, recovery and recorded inverse undo, reusing calendar v2’s parsed view and frontmatter writer. Undo requires a committed change and the exact recorded post-image; refused removals cannot be restored. Executor first, then B1, B2, B3. Keep existing work/probes preserved; no further patch/review loop or merge of this held implementation pending the plan. Docs only; no implementation started.
Author
Owner

Closing: superseded by #812 (merged into dev) (named in the PR body or comments). Branch kept.

Closing: superseded by #812 (merged into dev) (named in the PR body or comments). Branch kept.
kayg closed this pull request 2026-11-04 13:04:43 +00:00
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal!801
No description provided.