Keep temporary storage in each Home private directory #750
Closed
kayg
wants to merge 6 commits from
fix/storage-private-tmp-642-dev into dev
pull from: fix/storage-private-tmp-642-dev
merge into: kayg:dev
kayg:main
kayg:feat/contrast
kayg:feat/style-sheet-fixes
kayg:storage/wal-checkpoint-off-save-1051
kayg:t3/paged-search-reconcile-final
kayg:feat/pass8
kayg:review/calendar-2
kayg:fix/shared-row-swipes
kayg:dev
kayg:feat/collections-db
kayg:fix/instant-keys-1056
kayg:feat/money-round
kayg:perf/stalls-1054
kayg:wip/tiering-v3-cold4
kayg:wip/tiering-v3-cold5
kayg:port/rows-actions
kayg:port/rows-drop
kayg:port/hidden-blocks
kayg:port/rows
kayg:port/port-tables
kayg:port/port-tables-2
kayg:t3/mail-1011-liveness
kayg:port/devices
kayg:port/port-attachments
kayg:port/port-attachments-2
kayg:port/port-attachments-3
kayg:docs/design-consistency
kayg:docs/engineering-standards
kayg:fix/rusqlite-0.41-rustsec-2026-0459
kayg:feat/iphone-fixes
kayg:shared/restore-and-stale-918-919
kayg:fix/phone-top-band-contrast
kayg:feat/notes-approve
kayg:perf/soak-max-gate
kayg:feat/files-s1-identity
kayg:fix/lifecycle-event-id
kayg:feat/quickfix
kayg:wip/tiering-v3-cold
kayg:perf/web-mockup-frame-fixes
kayg:port/contacts-merge
kayg:port/contacts-edit
kayg:test/shared-room-no-deleted-text
kayg:perf/first-paint-credits
kayg:fix/shared-history-after-grant
kayg:fix/phone-swipe-regressions
kayg:feat/contrast-r1
kayg:review/sharing-pr3-review
kayg:feat/tiering-v3-s2-tags
kayg:feat/folder-drop
kayg:fix/deskpills-lazy-share
kayg:feat/sharing-s1-pr3
kayg:tmp/money-round-before
kayg:fix/phone-pane-backdrop-roots
kayg:fix/palette-preload-chips
kayg:fix/invite-defaults
kayg:port/tasks-matrix
kayg:fix/restore-green-gates
kayg:fix/sharing-fast-path-hardening
kayg:t3/photos-s1
kayg:feat/tiering-v3-s1-namespace
kayg:notes-archive-hide
kayg:feat/tasks-actions
kayg:t3/photos-plan-slice-one
kayg:feat/whiteboard-s1
kayg:t3/paged-search-reconcile
kayg:t3/smooth-pane-transitions
kayg:t3/index-position-startup-scan
kayg:fix/private-staging-759b-r2
kayg:feat/dav-transport
kayg:feat/imap-notes-fetch
kayg:feat/imap-notes-projection
kayg:feat/imap-notes-readonly
kayg:feat/imap-notes-auth
kayg:feat/imap-notes-server-foundation
kayg:docs/undo-block-ids-plan
kayg:fix/undo-768
kayg:proto/block-identity-v7d
kayg:issue/carddav-read-perf-fix-r2
kayg:issue/carddav-read-r2
kayg:docs/imap-766-plan-v2
kayg:docs/imap-notes-plan
kayg:docs/quota-plan-2
kayg:fix/parallel-test-flakes
kayg:feat/contacts-companion-pure
kayg:docs/calendar-backend-v2-plan
kayg:feat/calendar-ical-converter
kayg:docs/tasks-writes-v2-plan
kayg:docs/carddav-writes-v2-plan
kayg:docs/contacts-import-v2-plan
kayg:issue/610-pm-midnight
kayg:feat/calendar-v2-s1-containment
kayg:docs/dav-recorder-v2-plan
kayg:plan/previews-865
kayg:plan/save-log-durable-entry
kayg:fix/e2e-data-on-ram
kayg:feat/appwindow3
kayg:feat/appwindow2
kayg:feat/appwindow
kayg:feat/money-p1
kayg:feat/keys-sheet
kayg:review/calendar-2-themes
kayg:feat/smooth-cursor
kayg:fix/float-style
kayg:review/calendar-2-float
kayg:release/2026-11-06-hotfix
kayg:archive/port/rows-drop-code
kayg:archive/port/rows-actions
kayg:archive/port/rows
kayg:scratch/tasks-894-ui-gates
kayg:review/calendar-2-night-wip
kayg:release/2026-11-05
kayg:archive/feat/tiering-v3-s1-namespace
kayg:archive/flaky/rows-drop-fixed
kayg:archive/flaky/rows-actions
kayg:archive/feat/tiering-v3-reader
kayg:archive/feat/tiering-v3-roots
kayg:archive/flaky/rows
kayg:sim/bm15-final
kayg:sim/bm15-fix
kayg:sim/bm15-bis-932
kayg:sim/bm15-bis-909
kayg:sim/bm15
kayg:sim/bm15-bis-887
kayg:perf/tiering-option-b
kayg:port/style-3
kayg:port/style-2
kayg:port/style
kayg:fix/sw-lazy-precache
kayg:fix/vim-w-waits-for-save
kayg:fix/signout-test-races
kayg:fp-scratch/all
kayg:sim/bm15-first-paint
kayg:archive/bm15/rows-drop
kayg:archive/bm15/rows-actions
kayg:fix/palette-snippet-contrast
kayg:archive/bm15/rows
kayg:archive/bm15/hidden
kayg:archive/plan/save-log-durable-entry
kayg:mock/money-fix2
kayg:archive/fix/e2e-data-on-ram
kayg:mock/appearance-all
kayg:mock/pill-press
kayg:archive/docs/design-consistency
kayg:mock/auto-swipes
kayg:mock/mail-actions
kayg:archive/feat/mail-p1
kayg:mock/money-static
kayg:archive/review/standards-917
kayg:archive/docs/engineering-standards
kayg:perf/tiering-761-fix
kayg:mock/type-audit
kayg:mock/third-pane
kayg:feat/contacts-import-v2-s1
kayg:perf/executor-hot-path
kayg:archive/port/hidden-blocks
kayg:archive/port/devices
kayg:scratch/executor-on-894
kayg:scratch/executor-spans2
kayg:scratch/executor-spans
kayg:train/2026-11-03-bm14c
kayg:archive/port/rows-drop
kayg:feat/tiering-761-d-scale
kayg:feat/tiering-761-c-index
kayg:feat/tiering-761-b-reader
kayg:archive/review/sharing-pr3-review-9fec3d1f
kayg:train/2026-11-03-bm14b
kayg:perf/ports-lazy-budgets
kayg:feat/tiering-761-a-migration
kayg:train/2026-11-03-bm14
kayg:train/2026-11-03-bm12
kayg:archive/review/sharing-pr3-review
kayg:archive/feat/sharing-s1-pr3
kayg:train/2026-11-03-bm11
kayg:archive/feat/imap-notes-fetch
kayg:train/2026-11-03-bm10
kayg:archive/review/sharing-pr3-review-code
kayg:archive/plan/previews-865
kayg:train/2026-11-02-bm9
kayg:archive/port/port-attachments-3
kayg:archive/port/contacts-merge
kayg:fix/motion-audit-859
kayg:train/2026-11-02-bm8
kayg:archive/scratch/bm8-prep
kayg:archive/port/port-pickers
kayg:archive/port/port-tables-2
kayg:archive/port/port-tables
kayg:archive/feat/sharing-s1-pr3-code
kayg:archive/scratch/bm7-fixed
kayg:train/2026-11-02-bm7
kayg:archive/fix/parallel-test-flakes-code-minipc01
kayg:train/2026-11-02-bm6
kayg:docs/imap-766-readonly-slice
kayg:feat/dav-recorder-v3
kayg:research/788-diagnosis
kayg:archive/fix/parallel-test-flakes
kayg:archive/perf/pr792-cold-index-edit
kayg:docs/sharing-slice-1
kayg:archive/docs/imap-766-plan-v2
kayg:feat/dav-recorder-v2
kayg:archive/docs/dav-recorder-v2-plan
kayg:spike/imap-766-s0-cases
kayg:archive/fix/undo-768
kayg:feat/dav-recorder
kayg:archive/docs/contacts-import-v2-plan
kayg:archive/feat/calendar-ical-converter
kayg:feat/contacts-import
kayg:perf/cold-growth-on-764
kayg:perf/cold-growth-on-tiering
kayg:archive/docs/tasks-writes-v2-plan
kayg:archive/docs/calendar-backend-v2-plan
kayg:archive/feat/contacts-companion-pure
kayg:feat/tasks-set-status
kayg:feat/tasks-move-reorder
kayg:archive/docs/carddav-writes-v2-plan
kayg:archive/feat/calendar-v2-s1-containment
kayg:feat/tasks-delete-promote-duplicate
kayg:archive/feat/dav-transport
kayg:archive/fix/carddav-rebuild-r1
kayg:archive/fix/carddav-retention-r1
kayg:feat/carddav-writes
kayg:perf/quota-on-tiering
kayg:perf/quota-simple
kayg:perf/cold-growth-on-quota-stack
kayg:feat/calendar-identity
kayg:feat/calendar-event-parser
kayg:feat/calendar-props-maps
kayg:port/glass-when-ring
kayg:feat/tiering-761-s1
kayg:wip/10by32-01-impl-759b-scratch-20261030
kayg:wip/6by32-01-bm3-webkit-pause-20261030
kayg:wip/10by32-01-bm3-chromium-pause-20261030
kayg:wip/6by32-01-tier-761-s1-pause-20261030
kayg:spike/imap-766-s0
kayg:wip/6by32-02-calternal-pause-20261030
kayg:wip/8by64-01-review-688-pause-20261030
kayg:wip/6by32-01-verify-744-pause-20261030
kayg:wip/6by32-01-verify-742-pause-20261030
kayg:fix/private-staging-759b
kayg:wip/6by32-01-review-748-pause-20261030
kayg:wip/6by32-01-review-733c-pause-20261030
kayg:wip/6by32-01-review-733b-pause-20261030
kayg:wip/6by32-01-perf-idle-8-pause-20261030
kayg:wip/6by32-01-perf767-base-pause-20261030
kayg:wip/6by32-01-perf767b-767-pause-20261030
kayg:wip/6by32-01-perf767b-764-pause-20261030
kayg:wip/6by32-01-perf767-767-pause-20261030
kayg:wip/6by32-01-perf767-764-pause-20261030
kayg:wip/6by32-01-lists-b-pause-20261030
kayg:wip/6by32-01-ids-verify5-pause-20261030
kayg:wip/6by32-01-ids-verify4-pause-20261030
kayg:review/calendar-month
kayg:wip/10by32-02-undo-768-20261030
kayg:test/ids-verify3
kayg:wip/10by32-02-bm3-chromium-20261030
kayg:wip/10by32-01-review-753-20261030
kayg:wip/10by32-01-perf-idle-2-20261030
kayg:wip/10by32-01-bm2-webkit2-20261030
kayg:plan/759b-staging
kayg:train/2026-10-30-bm2
kayg:review/758b-tests
kayg:review/758-tests
kayg:review/764d-tests
kayg:review/767b-tests
kayg:review/preview-2026-10-29
kayg:review/767-tests
kayg:docs/tiering-731-plan
kayg:wip/c6b02-when2
kayg:wip/c6b02-tasks-create-fix5
kayg:wip/c6b02-settings-frost-mock
kayg:wip/c6b02-settings-frost-base
kayg:wip/c6b02-settings-frost
kayg:wip/c6b02-ring
kayg:wip/c6b02-review-733d
kayg:wip/c6b02-bm1-full-a
kayg:wip/compute02-when-field
kayg:wip/compute02-webkit-lists-repro
kayg:wip/compute02-train-bl2-dev
kayg:wip/compute02-dev-green-pw164
kayg:docs/deploy-plan
kayg:review/764c-tests
kayg:review/764b-tests
kayg:review/748g-tests
kayg:review/764-tests
kayg:review/759b-tests
kayg:fix/storage-owner-liveness-642
kayg:fix/storage-fix-7
kayg:wip/compute02-storage-fix-7
kayg:review/759-tests
kayg:feat/tiering-731
kayg:wip/tiering-731-first-attempt
kayg:wip/compute02-storage-fix-1
kayg:review/754g-tests
kayg:perf/idle-honest-2
kayg:review/754f-tests
kayg:review/754e-tests
kayg:review/755-tests
kayg:review/754d-tests
kayg:review/754c-tests
kayg:review/754b-tests
kayg:review/754-tests
kayg:wip/compute02-verify-750
kayg:test/ids-verify5
kayg:test/ids-verify4
kayg:fix/storage-exact-file-quarantine-642
kayg:wip/compute02-verify-740
kayg:perf/one-flush-save
kayg:review/calendar-static
kayg:wip/compute02-verify-737
kayg:review/indexing-ring
kayg:review/when-field-2
kayg:wip/compute02-review-733
kayg:proto/block-identity-2-review
kayg:proto/block-identity-review
kayg:wip/c6b02-tc-design
kayg:review/when-field
kayg:issue/tasks-create-ids
kayg:issue/tasks-create
kayg:review/combined
kayg:wip/compute02-review-combined
kayg:review/task-polish
kayg:review/top-buttons
kayg:review/q1-q5
kayg:train/2026-10-26-bl2
kayg:archive/wt-398h
kayg:archive/train-bm-proptest-seed
kayg:archive/integ325-293
kayg:archive/integ325-ci
kayg:archive/client-auth-review-baseline
kayg:archive/wt-sim-4853
kayg:archive/wt-sim-4811
kayg:archive/wt-448m
kayg:archive/wt-398a-allocator
kayg:issue/calendar-adr
kayg:archive/old/train/2026-10-23bk2
kayg:archive/old/train/2026-10-23bk
kayg:issue/469-mockup-9a
kayg:issue/smart-tasks-mockup
kayg:issue/469-menus
kayg:issue/652-signout-flake
kayg:issue/652-history-fix7
kayg:issue/652-history-fix6
kayg:archive/old/issue/spring-check-perf
kayg:issue/spring-check-perf
kayg:issue/659-rename-fast
kayg:archive/old/train/2026-10-21ar
kayg:issue/search-hardening-3
kayg:issue/652-history-fix5
kayg:issue/660-port-sheets-glass
kayg:issue/652-history-fix4
kayg:issue/652-history-fix3
kayg:issue/652-history-fix2
kayg:issue/652-history-flake
kayg:train/2026-10-21an
kayg:issue/settings-admin-port
kayg:issue/search-port
kayg:train/2026-10-20am
kayg:issue/storage-split-fix2
kayg:issue/storage-split
kayg:archive/old/issue/folder-ids-fix
kayg:train/2026-10-20al
kayg:archive/old/issue/folder-ids
kayg:train/2026-10-20ak
kayg:issue/tables-mockup
kayg:train/2026-10-19aj
kayg:train/2026-10-19ai
kayg:issue/469-merge-fixes
kayg:issue/sidebar-band
kayg:archive/old/issue/608-settings-spec
kayg:train/2026-10-19ah
kayg:issue/swipe-offscreen
kayg:train/2026-10-19ag
kayg:archive/old/issue/590-nlp-adr
kayg:archive/old/issue/587-event-after-write-2
kayg:train/2026-10-19af
kayg:archive/old/issue/587-event-after-write
kayg:issue/469-pill-room-c
kayg:issue/469-pill-room
kayg:train/2026-10-19ae
kayg:issue/469-narrow-handle
kayg:issue/397-ios-swipe-2
kayg:archive/old/issue/adrs-photos-files-tasks
kayg:issue/469-desk-fixes
kayg:archive/old/issue/auto-update-adr
kayg:issue/469-filter-gap
kayg:issue/469-port-1b
kayg:issue/442-opacity-flake
kayg:archive/397-ios-swipe-2
kayg:issue/327-web-fast-3
kayg:archive/old/issue/469-port-1
kayg:issue/469-port-1
kayg:issue/327-web-fast-2
kayg:archive/old/issue/327-web-fast
kayg:archive/old/issue/425-stt-bench-vq1
kayg:archive/old/issue/445-no-bleed
kayg:archive/old/issue/400-swipe-mockup-2
kayg:issue/426-client-review
kayg:issue/426-client-2
kayg:issue/426-client
kayg:archive/old/issue/476-safe-area-lab
kayg:archive/445-top-light-2
kayg:archive/old/issue/445-top-light
kayg:issue/471-blocks-mockup
kayg:archive/old/issue/448-links-app-2
kayg:archive/old/issue/448-links-app
kayg:archive/old/issue/398-cold-links
kayg:issue/434-442-small-2
kayg:issue/434-442-small
kayg:archive/old/issue/398-unload
kayg:archive/old/issue/445-bottom-band
kayg:issue/445-bottom-band
kayg:issue/351-rem-3
kayg:archive/312-views-mockup
kayg:issue/351-rem-2
kayg:issue/351-rem
kayg:archive/old/issue/327-first-note
kayg:issue/395-width-phone
kayg:archive/old/issue/327-typing
kayg:issue/396-ios-edges
kayg:issue/397-ios-swipe
kayg:archive/398-allocator
kayg:archive/old/issue/327-notes-index
kayg:issue/345-347-contrast-empty-2
kayg:archive/old/issue/44-arenas
kayg:issue/44-arenas
kayg:archive/integ325
kayg:archive/old/issue/327-perf-harness
kayg:archive/old/issue/44-thp
kayg:issue/44-thp
kayg:archive/old/issue/285-sticky-pills
kayg:archive/old/issue/44-trim-3
kayg:issue/44-trim-3
kayg:archive/old/issue/165-cards
kayg:archive/old/issue/165-picker-2
kayg:archive/old/issue/212-multi-select
No reviewers
Labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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!750
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/storage-private-tmp-642-dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Temporary notes, uploads, import images and metadata snapshots now start in one private
.calternal/tmpdirectory per Home on the target filesystem. Publication uses atomic rename. Temporary cleanup refuses public paths; explicit Trash, creation undo and backdrop deletion use separate user-action APIs.Replaces #749 and #744 for #642. The accepted ADR updates from current dev are preserved. Rust and Cargo inputs are byte-for-byte identical to the tested runtime tree after this documentation reconciliation.
Private recovery covers data and split state roots. Format owners authorize legacy migration; a creator receipt alone cannot make authoritative state disposable. Unknown legacy files retain their original names. Hard links and existing descriptors prevent disposal, including a read-only descriptor later reopened for writing. Case-only moves retain a durable restoration intent. Destination group and ACL inheritance are preserved before placement.
The production cards lint exemption is removed. Removal, rename and overwrite bans cover the standard and Tokio filesystem APIs. Tests verify direct production removal and async overwrite calls are rejected. Private content stays out of note scans, watchers, lists, search, sync and attachment serving; future WebDAV and File Provider bridges must keep that boundary.
Validation passed: formatting, workspace Clippy with warnings denied, workspace tests, all 74 fsio tests, the permanent reviewer regressions from #737/#740/#742/#744, ordinary-binary startup cases, upload memory bounds, watcher publication and tree confinement. The settled 1,000-stop run preserved every acknowledged Unicode marker exactly once, matched canonical bytes to notes.get, and left no staging entries in either root. Final Rust and Cargo inputs match that binary; only five static async overwrite bans were added afterward and independently checked.
Legacy replay cleared 211 proven file images from a local 511-entry old state tree. It retained 285 directories and 15 files without sufficient proof; retained file bytes were unchanged and new private staging was empty. This is the conservative choice required by the rule to leave unproven legacy entries alone. ADR 0062 and docs/storage.md document it and the separate Trash lifecycle.
The designated performance VM was unreachable through NetBird and its direct hostname could not resolve, so there is no latency measurement claim. Detailed gate output and earlier failed checks are recorded on #642. Evidence and run artifacts remain outside the commit.
Verdict: fix first. Independent verification of PR #750 at
1f3cf05f5ed8d24db0d6ae450ddb0ff756c7860b, based on devd83e54dbe571b625504001a8b6add90d44ca6161. Detached worktree/home/agent/wt/verify-750. All tracked files are restored byte for byte. No commits, pushes, merges, deployments or issue closures.P2: cold note Home recovery moves a live upload into a public folder and breaks completion. History::clean_staging scans the whole Home. The scanner traverses live locked transactions, and recover_staging claims and restores an unknown private image without checking its transaction lock. Stopping note writers does not stop other plugins' upload writers.
Reproduction: register a Home, create an actual
Folder::create_tempupload in Photos, write a partial body and keep its writer alive. Open the coldNotes::homein the same process. Its private source disappears and a public conflict appears. Append through the original writer and attemptpersist: publication fails. The ordinaryrecover_cleanupcontrol correctly preserves the locked source. The ordinary uninstrumented server reproduces the same behavior when it opens that Home while the actual TempFile owner remains alive.Verbatim independent output:
The public conflict is still being written before upload completion. This is a live-writer isolation and placement failure; these reproductions do not demonstrate loss of acknowledged bytes.
P2: staging enumeration removes a cancellation transaction during construction and leaves an abandoned image. staging_files removes empty transaction directories while enumerating. Pause Quarantine::new_in after mkdirat and before openat/locking/manifest creation. Run the real scanner, then resume cancellation. The scanner has removed the new directory; construction gets NotFound; TempFile::Drop ignores the cleanup error and leaves its original image. Normal cancellation without the scan passes the empty-directory control.
Verbatim deterministic output:
This uses one cfg(test) pause with a channel handshake, without a scheduling sleep, preload or syscall interception. Restart recovers the image; the defect is failed cancellation cleanup.
The storage boundary needs consistent handling of live transactions across every plugin. Format-owned legacy migration must respect transaction locks, and enumeration must not remove directories that producers can be constructing. Correct line reference for the earlier finding comment: the unknown-private branch is staging.rs:110-115.
Additional unresolved gate: importing 70 contacts, undoing the import and checking the existing card invariant reproducibly leaves a card with no live or trashed contact.
tests::undo::undo_of_an_import_takes_every_contact_backfails both in the complete workspace run and alone with test threads=1 and a process-local descriptor limit of 8192. Isolated output:import undone: card 0478ceda-096f-8080-9f53-ead3d31ba4e5 has no contact. I have not established whether #750 introduced that regression.The complete workspace gate finished with 119 passed/11 failed in contacts and 429 passed/2 failed/6 ignored in notes. Most other failures were SQLite CannotOpen errors under the original soft descriptor limit of 1024. The seven naming tests and the before-history import crash passed in isolation with limit 8192. The initial upload-cancellation timeout passed isolated and concurrent reruns. These results do not establish a common cause for the workspace failures; they remain recorded as failed gates.
Checks that passed: original fsio suite, 74 tests, both initially and within the complete run; eight independent placement/confinement tests; ordinary-binary list/search/journal/get/live-room/attachment exclusion; visible conflict recovery after ordinary restart; Clippy with warnings denied. Direct removal probes in fsio/src/lib.rs and contacts-actions/src/cards.rs both failed compilation with the intended disallowed-method diagnostic and were restored.
The fresh settled workload passed 1,000/1,000 stops: 250 saves, 250 renames, 250 Trash operations and 250 restores. All 1,000 acknowledged Unicode markers survived exactly once after each restart; same-key retries completed; auxiliary title/path/body stayed correct; final canonical bytes equaled notes.get. Both Home and separate state roots were empty of private transactions after discovery/save barriers settled. Deterministic tests supply separate boundary coverage; randomized after-send kills do not identify an interrupted syscall.
After the complete workspace run, a whole-tree scan found zero public temporary names and 48 retained private transaction directories in one test fixture. I inventoried them before running the original fsio recovery in a fresh process:
before=48; after=0. The final scan across all retained workload roots and the full-test directory reports zero public temporary entries and zero nonempty private roots. Earlier failed scans remain recorded.Reproductions and evidence:
/home/agent/wt/verify-750/findings.mdand.verification/REPRODUCE.md. Independent sources and patches: constructor-race.rs/.patch, live-home-notes.rs/.patch, live-upload-startup.py, independent.rs and review-tests.patch. From the restored reviewed tree, source/etc/calternal/env.sh, set TMPDIR to this job's.verification/full-tmp, and run/usr/local/bin/build-slot.sh bash .verification/run-followup.sh. It installs the test-only hooks, reproduces the lifecycle failures, restores source, and runs the isolated contacts checks. Logs and gate output remain uncommitted.Earlier reviewer files on 6by32-compute01 were inaccessible through the requested hostname and peer IP; I read their published independent PR verdicts through Forgejo instead. Local #737/#740 findings were read directly. The earlier byte-loss mechanisms are addressed by private-only ordinary cleanup, creator-written receipts, link-count rejection and exclusive leases rejecting existing readers/writers. The new failures concern another recovery path bypassing live transaction ownership.
This verification covers Linux process stops. It does not establish disk power-cut behavior or non-Linux execution. WebDAV and File Provider adapters are absent in this checkout; their exclusion requirement is documented for future implementation.
Gate output, verbatim. Nonzero reproduction gates are failing preservation/lifecycle assertions. The first two independent failures include the corrected fixture length and a conservative parallel legacy-disposal refusal; the first loop scan overlapped a live background scan-state write. None is silently converted into a safety pass.
Final head:
1f3cf05f5ed8d24db0d6ae450ddb0ff756c7860b.git diff --exit-codeandgit diff --checkpass. Only findings.md and .verification/ remain untracked.Finished in PR #759 on
fix/storage-owner-liveness-642, based on the reviewed #750 head1f3cf05f5ed8d24db0d6ae450ddb0ff756c7860b.Head:
257a1af579932a78b22599bda86d03ec062d98df. The committed contents match all 18 frozen code/test files used for the final gates. Evidence and artifacts are excluded from the commit.Finding → fix → test:
image remains private=true; public entries before completion=0; publication succeeds=true. The fsio test also appends later bytes and verifies the complete published body; both recovery paths skip the live image even when given a journal predicate.cancellation_and_staging_scan_do_not_orphan_a_private_uploadrequires zero private root entries before restart cleanup runs. A second permanent test runs recovery during the mkdir/owner-lock gap. Both pass.tmpas a root. The permanent locked-child test fails before this correction and passes afterward, including its positive abandoned-entry control.The original Notes tag failure logged EMFILE immediately before SQLite CannotOpen. Nine Contacts CannotOpen failures did not capture their underlying OS errno, so I do not claim every one had the same cause. Final gates use the normal user, disk-backed job-local temporary files, descriptor limit 8192, cargo
-j3, and one test thread per binary. All three consecutive full workspace runs pass, including documentation tests: Contacts 131, fsio 82 and Notes 434 passed in each run. Existing ignored perf, release-stress and helper cases remain configured; no new ignores were added.The independent eight-case preservation matrix passes again, covering outside in-place writes and replacements, open public descriptors, exclusive destination collisions, unconditional metadata writers and deterministic save crash boundaries. The two requested reproductions are permanent tests.
contact-copy-redbelow is a successful negative-control wrapper: it requires the old implementation's exit 101 and restores the verified source before the positive gates.Verbatim final gate output:
Verbatim settled-loop result:
kayg referenced this pull request2026-11-05 23:21:11 +00:00
housekeeping #1009: needs-decision.
Old private-temp implementation is a predecessor of #759 and the simpler #759b/#788 redesign. Replaying it would restore the older staging design. Preserve its regression coverage for salvage.
original head:
1f3cf05f5ed8d24db0d6ae450ddb0ff756c7860b. against devcd7f84432febfc63b788fbb9b9f9950452982d74, git cherry reports 6 unmatched and 0 equivalent patches. the landing audit lists each candidate missing commit and stable patch match inpr-750.md; unmatched patches can include superseded behavior.left open, source branch unchanged. no rebase or new test claim for this decision lane.
Superseded by the private-staging redesign #788. The branch and original tips are archived under
archive/(see #1009), so nothing is lost; useful regression vectors are noted there for the active lanes. Closing.Pull request closed