docs: Tasks writes v2, pure planners and one journaled executor #808

Open
kayg wants to merge 1 commit from docs/tasks-writes-v2-plan into dev
Owner

Task write reviews repeatedly found checked actions escaping through flush, recovery and undo, including restoring a deletion that never applied. This docs-only plan replaces B1/B2/B3 write paths with pure exact-byte splice planners and one durable journaled executor for apply, recovery and recorded inverse undo.

Reuses calendar v2’s shared pulldown view, TS/Rust vectors and strict frontmatter writer. Covers ownership/extents, lifecycle and ranks, conflict/receipt semantics, failure table, sizes/big-O, property and crash gates, salvage and executor-first slices. Explicit gates remain for recurring map-list log support and safe filesystem placement; no implementation or enablement is claimed. Held branches are not merged.

Validation: git diff origin/dev --check passed; relative ADR links resolve; only docs/plans/0066-tasks-writes-v2.md changed. No build or runtime tests, consistent with docs-only scope and the control-host rule.

Task write reviews repeatedly found checked actions escaping through flush, recovery and undo, including restoring a deletion that never applied. This docs-only plan replaces B1/B2/B3 write paths with pure exact-byte splice planners and one durable journaled executor for apply, recovery and recorded inverse undo. Reuses calendar v2’s shared pulldown view, TS/Rust vectors and strict frontmatter writer. Covers ownership/extents, lifecycle and ranks, conflict/receipt semantics, failure table, sizes/big-O, property and crash gates, salvage and executor-first slices. Explicit gates remain for recurring map-list log support and safe filesystem placement; no implementation or enablement is claimed. Held branches are not merged. Validation: `git diff origin/dev --check` passed; relative ADR links resolve; only `docs/plans/0066-tasks-writes-v2.md` changed. No build or runtime tests, consistent with docs-only scope and the control-host rule.
docs: plan one journaled executor for all task writes
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
8d32f65604
Author
Owner

Plan review

verdict: approve with changes. reviewed 8d32f656049061a195653e950c9db097d10285c7, all review rounds and hold/fix reports on #798/#799/#801, calendar v2 #802 at c19747b2, ADRs 0066/0068, and kayg's Tasks decision memory. this is a plan review, not an implementation approval. the direction is sound; the two blocking clarifications below belong in the plan before implementation.

blocking

  1. make the executor shared by Tasks AND Calendar, explicitly. 0066-tasks-writes-v2.md:134–140 defines one executor for task transactions, while calendar v2 still says “existing room revision guards/history/placement apply” and “stale revisions re-read and replan” (its writer section), plus its own gated bulk execution boundary (line 354). sharing the parser/writer does not resolve who owns placement, claims, recovery and undo when calendar and task actions touch the same note or occurrence. specify that both use the same versioned plan/WAL executor, Home coordination, publication barrier and deferral/ancestry policy; task/calendar planners may differ. retain the distinction between replanning a refused admission and replaying an immutable admitted plan. add an explicit dependency/cross-reference for calendar's later write enablement so it cannot ship through ordinary Flush while Tasks uses this boundary. gate a task/calendar overlap and cross-domain replay/undo deferral. this does not require a second executor or reopening calendar's read-only slices.

  2. reconcile the actual ADR changes instead of claiming none. ADR 0066 lines 385–388 explicitly require existing room/history durability and “No new durability scheme”; the proposed separate prepare/COMMIT/ROLLBACK WAL needs either a concrete mapping onto that history store or an explicit architectural amendment. ADR 0066 lines 421–429 also gives both Trash restore and Undo nearest-anchor/daily fallback behavior, whereas this plan deliberately makes Undo exact-post-image-only and gives relocation to a later explicit restore planner. i support conservative refusal after later edits: it prevents the second-owner failure and avoids inventing a merge. document that deliberate exception/amendment, retain kayg's explicit Trash-restoration behavior, and make delivery of that restore planner a gate for claiming the full delete/restore workflow complete. distinguish this from accepted later format amendments: 0068 does not erase these particular requirements. the plan can remain safe without claiming it leaves all earlier contracts unchanged.

every prior finding mapped to its prevention

these are structural closures in the proposed contract, conditional on the executor and shared-view gates actually landing. retained regressions are still required.

review finding preventing mechanism
#801 r1: late placement/Flush, receipt and recovery bypasses mandatory executor ownership through actual guarded placement; no generic save of pending task changes; immutable raw pre/post images and disk re-read even with receipts
#801 r1: inverse reinserts an absent completed beside a later value; unsafe YAML/BOM/CRLF bypass full recorded post-image precondition for the entire inverse, same executor and writer contract; changed note refuses before prepare
#801 r1: custom checkbox marks overwritten shared view retains unknown marks; failure table and B1 slice explicitly refuse unsupported/custom marks
#799 r1: late apply/undo and receipt/recovery guard bypass same mandatory boundary and raw images for forward/reverse placement, recovery and retries
#799 r1: edited already-published destination followed by source removal loses last copy revalidate previously placed destination, destination-first publication, retain WAL bytes, withhold generation and preserve conflict
#799 r1: continuation identity omitted from collisions/incoming-link retargeting one marker module enumerates all supported physical continuation ranges inside the selected subtree; complete identity set drives collisions and UUID-bound link edits
#799 r1: mixed line endings normalized; inverse cannot restore bytes byte splices/raw images preserve untouched bytes; adapters that cannot round-trip refuse before prepare
#798 r1: delete removes ordinary reference bullets shared direct-parent/ownership classification; explicit disjoint owning/session ranges; retain unrelated references, children and event facts
#798 r1: duplicate retains continuation IDs/hidden content shared marker extents, hidden-block omission and rekeyed copied identity graph; permanent claims prevent reuse
#798 r1: insertion-only stale promotion succeeds full source pre-image/read dependencies plus source provenance/conditional claim; insertion has a guard even when expected span is empty
#798 r1: unchanged delete Undo rewrites link spelling recorded exact inverse bytes; no link serializer during execution of the inverse
#798 r1: YAML list interior-quote/round-trip bypass same strict input/output writer and independent YAML 1.2 typed oracle; no task-only scanner or serializer-equality proof
#798 r2: changed task trashed without source validation Trash is a typed lifecycle participant with content, identity, existence and namespace preconditions, not a UUID-only step
#798 r2: child marker conceals existing owner strip structural markers before direct-child relationship classification; index/planner use the same view; existing owner returned or ambiguity refused
#798 final: Undo restores a planned but refused removal, or changed/moved owner gets duplicate relationship only COMMIT creates undo eligibility; recorded inverse must match full post-image/bindings; no planned-rows restore or fresh snapshot to legitimize insertion
#798 final: promotion/duplicate inverse and post-guard Flush/recovery bypass policy mandatory plan execution in both directions and publication; old versions/undo ancestry durably deferred; ordinary CRDT save cannot publish pending task edits

should change

  • finish the concurrency contract for the read set. the plan explicitly checks unchanged semantic dependencies and the inventory epoch at admission, then describes post-image verification of placed files. state which read dependencies/namespace epochs remain pinned until commit, when all are revalidated, and how queued outside edits are handled. an unrelated new owner/link added while files are being placed must not disappear merely because it was absent from the admitted participant set. known concurrent Calternal mutations need the shared coordination above; uncooperative outside edits need preserved evidence and explicit later reconciliation/conflict semantics, not an implied whole-Home filesystem snapshot. add a read-only blocker/owner edit and a newly arriving backlink between PREPARE and COMMIT to the failure table/tests.

  • make retention and compaction executable. per-transaction byte caps are good, but “follows history/Trash/undo policy” and “inverse references are durable” do not define when referenced blobs may be collected. specify roots for pending/conflicted transactions, retained undo/Trash/history, publication cursors and permanent claims; crash-safe checkpoint/GC order; and retained operation-digest/undo-consumed receipts after log compaction. a very old same-key retry must not become a second operation, nor may a consumed inverse become usable again. define total journal/blob accounting and backpressure when pinned conflicts or retained history fill storage, without deleting evidence. test compact → crash/reopen → retry/undo/restore, including an unresolved transaction and ENOSPC.

  • split the executor-first slice before assigning a small line budget. it currently contains a new WAL state machine, cross-store coordination, lifecycle/ranks, room isolation, outbox, recovery, undo and platform-specific safe placement. 700–1,000 production lines is an aspiration, not a convincing delivery size for all of that. use default-off sub-PRs: containment/route inventory; placement feasibility and independent byte/existence model; durable protocol plus publication; lifecycle/rank/inverse integration. establish the placement primitive on each supported platform first. the explicit gate against read-then-rename TOCTOU is correct; no proof means the route stays disabled. retain executor → B1 → B2 → B3 order and do not port actions to a half-proven boundary.

  • add a post-COMMIT outside-edit case. kill after durable COMMIT but before private-state/outbox installation, edit a participant, then reopen. committed recovery must finish the committed batch exactly once and preserve/queue the later outside revision, rather than replaying the old file over it or treating COMMIT as rollbackable. distinguish this from a precommit conflict. also say explicitly that an inverse's private-state expected values are the forward post-state versions/ancestry, not the pre-forward versions suggested by “original private-state versions”.

crash, atomicity and gates assessment

prepare before any placement, durable direction choice, pre/post classification instead of receipt authority, COMMIT before public generation, and idempotent state/outbox installation form a coherent protocol. a crash with no direction decision completing forward, while an explicitly fsynced ROLLBACK remains rollback, is deterministic. ABORT only after all pre-images are restored prevents an unapplied deletion becoming undoable. partial files may be visible externally; the promise is a whole accepted Calternal generation, not simultaneous multi-file disk visibility. preserving displaced conflicting bytes is essential, not an optional final-read optimization.

the caps, explicit byte costs, 500-note case and limit-boundary measurements are useful. the failure table and six independent property groups cover the original classes well: confinement, exact inverse, refusal, real process kills in both directions, structural identity and independent YAML semantics. positive controls, unequal-length splice offsets, all four final B3 probes, same/new-key restarts and no blanket-refusal pass are particularly good. add the concurrency/compaction/postcommit cases above. recurring map-list writes must stay disabled until the same shared writer supports canonical log; do not revive B1's link-list workaround. rank-only writes correctly stay outside Markdown. no runtime/performance result is claimed here.

nits

use stable section links for the calendar dependency once available, and distinguish this private recovery WAL consistently from the public change journal. no formatting blocker.

validation: read-only inspection of the pinned documents and Forgejo review comments; no code changes, builds, runtime tests, pushes or merge. held branches remain held.

## Plan review **verdict: approve with changes.** reviewed `8d32f656049061a195653e950c9db097d10285c7`, all review rounds and hold/fix reports on #798/#799/#801, calendar v2 #802 at `c19747b2`, ADRs 0066/0068, and kayg's Tasks decision memory. this is a plan review, not an implementation approval. the direction is sound; the two blocking clarifications below belong in the plan before implementation. ### blocking 1. **make the executor shared by Tasks AND Calendar, explicitly.** `0066-tasks-writes-v2.md:134–140` defines one executor for task transactions, while calendar v2 still says “existing room revision guards/history/placement apply” and “stale revisions re-read and replan” (its writer section), plus its own gated bulk execution boundary (line 354). sharing the parser/writer does not resolve who owns placement, claims, recovery and undo when calendar and task actions touch the same note or occurrence. specify that both use the same versioned plan/WAL executor, Home coordination, publication barrier and deferral/ancestry policy; task/calendar planners may differ. retain the distinction between replanning a refused admission and replaying an immutable admitted plan. add an explicit dependency/cross-reference for calendar's later write enablement so it cannot ship through ordinary Flush while Tasks uses this boundary. gate a task/calendar overlap and cross-domain replay/undo deferral. this does not require a second executor or reopening calendar's read-only slices. 2. **reconcile the actual ADR changes instead of claiming none.** ADR 0066 lines 385–388 explicitly require existing room/history durability and “No new durability scheme”; the proposed separate prepare/COMMIT/ROLLBACK WAL needs either a concrete mapping onto that history store or an explicit architectural amendment. ADR 0066 lines 421–429 also gives *both* Trash restore and Undo nearest-anchor/daily fallback behavior, whereas this plan deliberately makes Undo exact-post-image-only and gives relocation to a later explicit restore planner. i support conservative refusal after later edits: it prevents the second-owner failure and avoids inventing a merge. document that deliberate exception/amendment, retain kayg's explicit Trash-restoration behavior, and make delivery of that restore planner a gate for claiming the full delete/restore workflow complete. distinguish this from accepted later format amendments: 0068 does not erase these particular requirements. the plan can remain safe without claiming it leaves all earlier contracts unchanged. ### every prior finding mapped to its prevention these are structural closures in the proposed contract, conditional on the executor and shared-view gates actually landing. retained regressions are still required. | review finding | preventing mechanism | | --- | --- | | #801 r1: late placement/Flush, receipt and recovery bypasses | mandatory executor ownership through actual guarded placement; no generic save of pending task changes; immutable raw pre/post images and disk re-read even with receipts | | #801 r1: inverse reinserts an absent `completed` beside a later value; unsafe YAML/BOM/CRLF bypass | full recorded post-image precondition for the entire inverse, same executor and writer contract; changed note refuses before prepare | | #801 r1: custom checkbox marks overwritten | shared view retains unknown marks; failure table and B1 slice explicitly refuse unsupported/custom marks | | #799 r1: late apply/undo and receipt/recovery guard bypass | same mandatory boundary and raw images for forward/reverse placement, recovery and retries | | #799 r1: edited already-published destination followed by source removal loses last copy | revalidate previously placed destination, destination-first publication, retain WAL bytes, withhold generation and preserve conflict | | #799 r1: continuation identity omitted from collisions/incoming-link retargeting | one marker module enumerates all supported physical continuation ranges inside the selected subtree; complete identity set drives collisions and UUID-bound link edits | | #799 r1: mixed line endings normalized; inverse cannot restore bytes | byte splices/raw images preserve untouched bytes; adapters that cannot round-trip refuse before prepare | | #798 r1: delete removes ordinary reference bullets | shared direct-parent/ownership classification; explicit disjoint owning/session ranges; retain unrelated references, children and event facts | | #798 r1: duplicate retains continuation IDs/hidden content | shared marker extents, hidden-block omission and rekeyed copied identity graph; permanent claims prevent reuse | | #798 r1: insertion-only stale promotion succeeds | full source pre-image/read dependencies plus source provenance/conditional claim; insertion has a guard even when expected span is empty | | #798 r1: unchanged delete Undo rewrites link spelling | recorded exact inverse bytes; no link serializer during execution of the inverse | | #798 r1: YAML list interior-quote/round-trip bypass | same strict input/output writer and independent YAML 1.2 typed oracle; no task-only scanner or serializer-equality proof | | #798 r2: changed task trashed without source validation | Trash is a typed lifecycle participant with content, identity, existence and namespace preconditions, not a UUID-only step | | #798 r2: child marker conceals existing owner | strip structural markers before direct-child relationship classification; index/planner use the same view; existing owner returned or ambiguity refused | | #798 final: Undo restores a planned but refused removal, or changed/moved owner gets duplicate relationship | only COMMIT creates undo eligibility; recorded inverse must match full post-image/bindings; no planned-rows restore or fresh snapshot to legitimize insertion | | #798 final: promotion/duplicate inverse and post-guard Flush/recovery bypass policy | mandatory plan execution in both directions and publication; old versions/undo ancestry durably deferred; ordinary CRDT save cannot publish pending task edits | ### should change - **finish the concurrency contract for the read set.** the plan explicitly checks unchanged semantic dependencies and the inventory epoch at admission, then describes post-image verification of placed files. state which read dependencies/namespace epochs remain pinned until commit, when all are revalidated, and how queued outside edits are handled. an unrelated new owner/link added while files are being placed must not disappear merely because it was absent from the admitted participant set. known concurrent Calternal mutations need the shared coordination above; uncooperative outside edits need preserved evidence and explicit later reconciliation/conflict semantics, not an implied whole-Home filesystem snapshot. add a read-only blocker/owner edit and a newly arriving backlink between PREPARE and COMMIT to the failure table/tests. - **make retention and compaction executable.** per-transaction byte caps are good, but “follows history/Trash/undo policy” and “inverse references are durable” do not define when referenced blobs may be collected. specify roots for pending/conflicted transactions, retained undo/Trash/history, publication cursors and permanent claims; crash-safe checkpoint/GC order; and retained operation-digest/undo-consumed receipts after log compaction. a very old same-key retry must not become a second operation, nor may a consumed inverse become usable again. define total journal/blob accounting and backpressure when pinned conflicts or retained history fill storage, without deleting evidence. test compact → crash/reopen → retry/undo/restore, including an unresolved transaction and ENOSPC. - **split the executor-first slice before assigning a small line budget.** it currently contains a new WAL state machine, cross-store coordination, lifecycle/ranks, room isolation, outbox, recovery, undo and platform-specific safe placement. 700–1,000 production lines is an aspiration, not a convincing delivery size for all of that. use default-off sub-PRs: containment/route inventory; placement feasibility and independent byte/existence model; durable protocol plus publication; lifecycle/rank/inverse integration. establish the placement primitive on each supported platform first. the explicit gate against read-then-rename TOCTOU is correct; no proof means the route stays disabled. retain executor → B1 → B2 → B3 order and do not port actions to a half-proven boundary. - **add a post-COMMIT outside-edit case.** kill after durable COMMIT but before private-state/outbox installation, edit a participant, then reopen. committed recovery must finish the committed batch exactly once and preserve/queue the later outside revision, rather than replaying the old file over it or treating COMMIT as rollbackable. distinguish this from a precommit conflict. also say explicitly that an inverse's private-state expected values are the forward *post-state* versions/ancestry, not the pre-forward versions suggested by “original private-state versions”. ### crash, atomicity and gates assessment prepare before any placement, durable direction choice, pre/post classification instead of receipt authority, COMMIT before public generation, and idempotent state/outbox installation form a coherent protocol. a crash with no direction decision completing forward, while an explicitly fsynced ROLLBACK remains rollback, is deterministic. ABORT only after all pre-images are restored prevents an unapplied deletion becoming undoable. partial files may be visible externally; the promise is a whole accepted Calternal generation, not simultaneous multi-file disk visibility. preserving displaced conflicting bytes is essential, not an optional final-read optimization. the caps, explicit byte costs, 500-note case and limit-boundary measurements are useful. the failure table and six independent property groups cover the original classes well: confinement, exact inverse, refusal, real process kills in both directions, structural identity and independent YAML semantics. positive controls, unequal-length splice offsets, all four final B3 probes, same/new-key restarts and no blanket-refusal pass are particularly good. add the concurrency/compaction/postcommit cases above. recurring map-list writes must stay disabled until the *same* shared writer supports canonical `log`; do not revive B1's link-list workaround. rank-only writes correctly stay outside Markdown. no runtime/performance result is claimed here. ### nits use stable section links for the calendar dependency once available, and distinguish this private recovery WAL consistently from the public change journal. no formatting blocker. validation: read-only inspection of the pinned documents and Forgejo review comments; no code changes, builds, runtime tests, pushes or merge. held branches remain held.
Author
Owner

updated and pushed: ca1a94bb defines the shared executor; 5be50361 reconciles ADR 0066. calendar counterpart: 6a4289fa on #802, with comment #802 (comment).

review/request change
one Tasks + Calendar executor named NoteWriteExecutor, crate calternal-notes, module crates/notes/src/write_executor/; one canonical plan contract and API table for exact splices + inverse, verify, journal/apply, recovery and own-author undo
shared coordination and replay one Home instance, WAL, claims, version/ancestry deferral and publication barrier; pinned read-set/epochs, pre-COMMIT revalidation and later-revision preservation; task/calendar overlap and cross-domain replay/undo gates
calendar dependency/order updated #802's actual branch and writer wording: shared executor lands once before either domain enables writes; read-only/pure-planner prerequisites remain independent; Tasks ports retain B1 → B2 → B3; no Calendar Flush bypass
ADR says no new durability scheme explicit proposed architectural amendment A replaces that constraint with the private WAL; no claim it already maps onto old history storage; public change journal remains distinct
ADR Undo versus restore top-level “Waiting on kayg” Q1–Q2 leave strict full-post-state Undo and its separation from adaptive Trash Restore pending; own-author rule unchanged; explicit Restore retains UUID/nearest-anchor/today fallback and is required before full delete/restore completion
other user-visible differences Q3 later success/committed-only undo, Q4 admitted-plan conflict instead of merge/retry, Q5 unsupported writer input, Q6 whole-action size refusal. every question uses “Q: … Recommend: … — 'yes' accepts”; none answered on kayg’s behalf
every affected ADR reference reconciliation table covers Actions, durability/semantic merge, delete evidence, all restore/undo fallbacks and idempotency, acknowledgement budgets, Why, failure cases, build order, settled/rejected restore wording and retry changelog
inverse private versions clarified these are forward post-state versions/ancestry, not pre-forward versions

validation: git diff HEAD~1 HEAD --check passed in both worktrees; git status --short empty; both local heads equal upstream; Python/rtk relative-document-link checks passed and verified six unanswered grill questions at the top. only the two requested plan files changed. no builds, runtime/performance tests, enablement, merge or ADR adoption. the existing review remains “approve with changes”; product answers and implementation gates remain pending. this addresses the requested blocking clarifications, not a claim that the entire should-change list has shipped.

updated and pushed: `ca1a94bb` defines the shared executor; `5be50361` reconciles ADR 0066. calendar counterpart: `6a4289fa` on #802, with comment https://git.kayg.org/kayg/calternal/pulls/802#issuecomment-71470. | review/request | change | | --- | --- | | one Tasks + Calendar executor | named `NoteWriteExecutor`, crate `calternal-notes`, module `crates/notes/src/write_executor/`; one canonical plan contract and API table for exact splices + inverse, verify, journal/apply, recovery and own-author undo | | shared coordination and replay | one Home instance, WAL, claims, version/ancestry deferral and publication barrier; pinned read-set/epochs, pre-COMMIT revalidation and later-revision preservation; task/calendar overlap and cross-domain replay/undo gates | | calendar dependency/order | updated #802's actual branch and writer wording: shared executor lands once before either domain enables writes; read-only/pure-planner prerequisites remain independent; Tasks ports retain B1 → B2 → B3; no Calendar Flush bypass | | ADR says no new durability scheme | explicit proposed architectural amendment A replaces that constraint with the private WAL; no claim it already maps onto old history storage; public change journal remains distinct | | ADR Undo versus restore | top-level “Waiting on kayg” Q1–Q2 leave strict full-post-state Undo and its separation from adaptive Trash Restore pending; own-author rule unchanged; explicit Restore retains UUID/nearest-anchor/today fallback and is required before full delete/restore completion | | other user-visible differences | Q3 later success/committed-only undo, Q4 admitted-plan conflict instead of merge/retry, Q5 unsupported writer input, Q6 whole-action size refusal. every question uses “Q: … Recommend: … — 'yes' accepts”; none answered on kayg’s behalf | | every affected ADR reference | reconciliation table covers Actions, durability/semantic merge, delete evidence, all restore/undo fallbacks and idempotency, acknowledgement budgets, Why, failure cases, build order, settled/rejected restore wording and retry changelog | | inverse private versions | clarified these are forward post-state versions/ancestry, not pre-forward versions | validation: `git diff HEAD~1 HEAD --check` passed in both worktrees; `git status --short` empty; both local heads equal upstream; Python/rtk relative-document-link checks passed and verified six unanswered grill questions at the top. only the two requested plan files changed. no builds, runtime/performance tests, enablement, merge or ADR adoption. the existing review remains “approve with changes”; product answers and implementation gates remain pending. this addresses the requested blocking clarifications, not a claim that the entire should-change list has shipped.
Author
Owner

housekeeping #1009: rebased+green, left open for review.

rebased Tasks write v2 proposal.

head: 8946c2c5b23096bc878179b54af8ec0c4defdf8a. rebased onto dev cd7f84432febfc63b788fbb9b9f9950452982d74 and pushed with the original exact force-with-lease.

validation on the Mac VM, through Nix and the shared Mac lock/slot: root bun install --frozen-lockfile; in apps/web, bun run check, bun run lint, bun run build, bun run test; PERF_DIST=<worktree>/apps/web/dist bash perf/web.sh --bundle-only --gate. all passed. this documentation-only branch has no targeted browser specs or Rust implementation changes. exact commands, logs, and dev bundle control.

original-head missing-commit/patch inventory, file pr-808.md.

housekeeping #1009: rebased+green, left open for review. rebased Tasks write v2 proposal. head: `8946c2c5b23096bc878179b54af8ec0c4defdf8a`. rebased onto dev `cd7f84432febfc63b788fbb9b9f9950452982d74` and pushed with the original exact force-with-lease. validation on the Mac VM, through Nix and the shared Mac lock/slot: root `bun install --frozen-lockfile`; in `apps/web`, `bun run check`, `bun run lint`, `bun run build`, `bun run test`; `PERF_DIST=<worktree>/apps/web/dist bash perf/web.sh --bundle-only --gate`. all passed. this documentation-only branch has no targeted browser specs or Rust implementation changes. [exact commands, logs, and dev bundle control](https://git.kayg.org/attachments/64244177-fd81-4992-860e-4d5d22ca01cd). [original-head missing-commit/patch inventory](https://git.kayg.org/attachments/fe3c09dc-dea3-47a0-92e2-b44a777083e5), file `pr-808.md`.
Some checks failed
CI / server (pull_request) Has been cancelled
CI / rust (pull_request) Has been cancelled
CI / web (pull_request) Has been cancelled
Merge conflict checking is in progress. Try again in few moments.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin docs/tasks-writes-v2-plan:docs/tasks-writes-v2-plan
git switch docs/tasks-writes-v2-plan

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch dev
git merge --no-ff docs/tasks-writes-v2-plan
git switch docs/tasks-writes-v2-plan
git rebase dev
git switch dev
git merge --ff-only docs/tasks-writes-v2-plan
git switch docs/tasks-writes-v2-plan
git rebase dev
git switch dev
git merge --no-ff docs/tasks-writes-v2-plan
git switch dev
git merge --squash docs/tasks-writes-v2-plan
git switch dev
git merge --ff-only docs/tasks-writes-v2-plan
git switch dev
git merge docs/tasks-writes-v2-plan
git push origin dev
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!808
No description provided.