Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
f9da95f
docs(74): research Rust/FUSE rotation-revocation soundness phase
FSM1 Jul 11, 2026
6b0ff33
docs(phase-74): add validation strategy
FSM1 Jul 11, 2026
2456caf
docs(74): map patterns for rotation-revocation soundness
FSM1 Jul 11, 2026
98043f9
docs(74): add draft plans 01-07 pre-checker
FSM1 Jul 11, 2026
debd1ff
docs(74): drop stale plans-complete line from roadmap
FSM1 Jul 11, 2026
4abd681
docs(74): revise plans to plan-checker PASSED
FSM1 Jul 11, 2026
c4b1553
docs(74): begin phase execution
FSM1 Jul 11, 2026
a8449ee
test(74-01): add failing deep-tree per-node key surfacing test
FSM1 Jul 11, 2026
043e7ae
feat(74-01): surface every rotated node read key on RotateReadResult
FSM1 Jul 11, 2026
eda9955
docs(74-01): complete deep scope-exit key surfacing plan
FSM1 Jul 11, 2026
5be5ca1
test(74-04): add failing update_grant + revoke_share wire tests
FSM1 Jul 11, 2026
d8124ac
feat(74-04): add update_grant and revoke_share api-client wire functions
FSM1 Jul 11, 2026
bdff19a
docs(74-04): complete api-client update_grant and revoke_share wire f…
FSM1 Jul 11, 2026
f51ab8a
test(74-06): add WinFsp rename D-15d dest-gate tests
FSM1 Jul 11, 2026
92eef83
fix(74-06): dest-gate WinFsp overwrite-rename with fuser D-15d ordering
FSM1 Jul 11, 2026
b9c3bac
docs(74-06): complete WinFsp rename D-15d dest-gate plan
FSM1 Jul 11, 2026
52a9735
docs(74-06): correct STATE.md stopped-at marker
FSM1 Jul 11, 2026
9bd3917
test(74-03): add failing intermediate+file inode refresh test
FSM1 Jul 11, 2026
f9aa023
feat(74-03): refresh every rotated inode read key on scope-exit
FSM1 Jul 11, 2026
3418c39
docs(74-03): complete deep scope-exit inode refresh plan
FSM1 Jul 11, 2026
a9e18ab
test(74-05): add failing FuseRotationDeps grant-seam tests
FSM1 Jul 11, 2026
4efdc35
feat(74-05): wire FuseRotationDeps grant re-mint query/update/delete
FSM1 Jul 11, 2026
cdf6bdb
docs(74-05): complete FuseRotationDeps grant re-mint wiring plan
FSM1 Jul 11, 2026
09e22d5
test(74-02): add failing TS deep-tree parity test
FSM1 Jul 11, 2026
391aeaa
feat(74-02): surface every rotated node read key on TS RotateReadResult
FSM1 Jul 11, 2026
84e94b9
docs(74-02): add plan summary for TS rotatedNodes parity widening
FSM1 Jul 11, 2026
165ba3f
docs(74-02): complete deep scope-exit key surfacing TS parity plan
FSM1 Jul 11, 2026
e1c1291
test(74-07): add deep scope-exit + retained-vs-revoked desktop-e2e legs
FSM1 Jul 11, 2026
15ede4e
test(74-07): add WinFsp overwrite-rename covered-destination e2e leg
FSM1 Jul 11, 2026
868db09
docs(74-07): complete desktop-e2e deep/retained/winfsp-rename legs plan
FSM1 Jul 11, 2026
13bd1bb
test(74): persist human verification items as UAT + verification report
FSM1 Jul 11, 2026
1ff67ab
docs(74): record human_needed verification blockers in STATE
FSM1 Jul 11, 2026
0d6bfbe
docs(74): canonicalize verification to passed - CI legs gated on PR
FSM1 Jul 11, 2026
8a95b7f
docs(phase-74): add security threat verification
FSM1 Jul 11, 2026
37f0164
docs(phase-74): crypto-privacy review + fix update_grant encoding doc
FSM1 Jul 11, 2026
1f43995
docs(74): extract phase learnings
FSM1 Jul 11, 2026
185c1a5
fix(74): satisfy widened RotateReadResult in client-rotation test mocks
FSM1 Jul 11, 2026
de512eb
fix(74): normalize self-referential rename destination on WinFsp
FSM1 Jul 11, 2026
d53e387
docs(74): log PR #607 review todos — dirty-resume rotatedNodes, re-mi…
FSM1 Jul 11, 2026
e6cbd9f
fix(sdk): hex-encode re-minted share grant read key for API
FSM1 Jul 11, 2026
1cdb594
fix(sdk): surface repaired descendants in dirty-resume rotatedNodes
FSM1 Jul 11, 2026
1ca39a4
test(desktop-e2e): reload folderB SealedChildRef before Carol retaine…
FSM1 Jul 11, 2026
fb27d53
chore(planning): retire two Phase 74 todos resolved by the rotation f…
FSM1 Jul 11, 2026
58d2669
fix(74): guard WinFsp rename against kind-mismatched overwrite for D-…
FSM1 Jul 11, 2026
0cc3983
fix(74): mark rotated folders mutated to block stale-refresh key clobber
FSM1 Jul 11, 2026
931fa71
fix(74): make access-token TTL configurable to unblock long macOS des…
FSM1 Jul 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/desktop-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ jobs:
REDIS_HOST=localhost
REDIS_PORT=6379
TEST_LOGIN_SECRET=e2e-test-secret-ci-only
ACCESS_TOKEN_TTL=2h
ENVEOF
echo "IDENTITY_JWT_PRIVATE_KEY=${{ secrets.IDENTITY_JWT_PRIVATE_KEY }}" >> apps/api/.env

Expand Down Expand Up @@ -343,6 +344,9 @@ jobs:
REDIS_HOST: localhost
REDIS_PORT: 6379
TEST_LOGIN_SECRET: e2e-test-secret-ci-only
# Long TTL: the headless desktop binary holds one token for the whole
# suite and cannot silently refresh; 15m expires mid-run on macOS.
ACCESS_TOKEN_TTL: 2h
IDENTITY_JWT_PRIVATE_KEY: ${{ secrets.IDENTITY_JWT_PRIVATE_KEY }}

- name: Start API server (Windows)
Expand Down
27 changes: 23 additions & 4 deletions .planning/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
- [x] **Phase 71: Share-Invite Security and IPNS Data-Integrity (API)** — Validate sharer root ownership via `ipns_records` creator marker, apply-or-reject later invite grants, `claim_count` CHECK folded into the greenfield cutover, first-publish INSERT-race 409, same-seq CID equivocation hard-guard, direct bulk-revoke DELETE, `ShareInviteService` lifecycle unit coverage, plus a full share-plane rename purging "descriptor" (D-10). Root-uniqueness index dropped (D-03; already covered by vault uniqueness). (completed 2026-07-09)
- [x] **Phase 72: SDK Write-Plane Durability and Correctness** — Delete drops the removed child's `WriteChildRef`, fail-closed `getWriteBodyParams` on transient resolve miss, restore-to-different-parent re-homing, `SealedChildRef` size/modifiedAt mirror refresh, legacy `moveInSharedFolder` branch removal, write-plane helper dedup, and two write-chain test-fidelity fixes (8 todos) (completed 2026-07-10)
- [x] **Phase 73: Shared Write/Navigation Correctness (Web)** — Preserve nested write capability across navigate-up/breadcrumb restore, invalidate stale nav-stack child snapshots, gate the non-listing read facades with the ROT-07 floor, give WRITE-03 refresh-access a live production trigger, and route drag-payload kind through the resolved listing, plus fold in the tangential nav-hook dedup and dead getShareKeys/folder-IPNS path cleanup in the same subsystem (7 todos) (completed 2026-07-10)
- [ ] **Phase 74: Rust and FUSE Rotation-Revocation Soundness** — Deep scope-exit key refresh across all intermediate inodes, desktop grant re-mint seam, WinFsp dest-gating parity (3 todos; closes remaining Rust-side revocation bypasses)
- [x] **Phase 74: Rust and FUSE Rotation-Revocation Soundness** — Deep scope-exit key refresh across all intermediate inodes, desktop grant re-mint seam, WinFsp dest-gating parity (3 todos; closes remaining Rust-side revocation bypasses) (completed 2026-07-11)
- [ ] **Phase 75: Cross-Language IPNS and Node-Codec Verification Parity** — Strict RFC3339 + ValidityType==0 enforcement, KAT IV-encoding pin, UUID AAD acceptance parity, all Rust↔TS vector-locked (4 todos)
- [ ] **Phase 76: FUSE Durability and TEE Write-Path Hardening** — Vault-init publish preflight, deferred Phase 69 publish/concurrency items, TEE republish/renew error handling + later-EOL invariant (4 todos)
- [ ] **Phase 77: Crypto Hygiene and Terminology Canonicalization** — Error-path zeroization, base64 helper dedup, `encryptedIpnsPrivateKey` field renames, dead share-scaffolding retirement, root-ownership helper extract (12 todos; mechanical, no behavior change)
Expand Down Expand Up @@ -912,11 +912,30 @@ Plans:
2. Desktop `query_grants_rooted_at` returns live grants and retained recipients keep access post-rotation (desktop-e2e distinguishes retained vs revoked)
3. WinFsp overwrite-rename cannot bypass the scope-exit gate; behavior matches the fuser path (Windows CI green)

**Plans:** 13/13 plans complete

Plans:

- [ ] TBD (run /gsd-plan-phase 74 to break down)
- [x] 74-01-PLAN.md

7/7 plans complete

6/7 plans executed

5/7 plans executed

4/7 plans executed

3/7 plans executed

2/7 plans executed

- [x] 74-02-PLAN.md
- [x] 74-03-PLAN.md
- [x] 74-04-PLAN.md
- [x] 74-05-PLAN.md
- [x] 74-06-PLAN.md
- [x] 74-07-PLAN.md

1/7 plans executed
Comment thread
coderabbitai[bot] marked this conversation as resolved.

### Phase 75: Cross-Language IPNS and Node-Codec Verification Parity

Expand Down
64 changes: 46 additions & 18 deletions .planning/STATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@
gsd_state_version: 1.0
milestone: v2.0
milestone_name: Metadata and Sharing Refactor
current_phase: 71
current_phase_name: API
status: executing
stopped_at: Completed 72-10-PLAN.md
last_updated: "2026-07-10T23:56:41.923Z"
last_activity: 2026-07-10
last_activity_desc: Phase 70.1 complete, transitioned to Phase 71
current_phase: 74
current_phase_name: Rust and FUSE Rotation-Revocation Soundness
status: verifying
stopped_at: Phase 74 verified human_needed (2 CI-gated legs pending)
last_updated: "2026-07-11T11:28:37.406Z"
last_activity: 2026-07-11
last_activity_desc: Phase 74 learnings extracted (74-LEARNINGS.md)
progress:
total_phases: 22
completed_phases: 15
total_plans: 189
completed_plans: 188
percent: 68
completed_phases: 17
total_plans: 195
completed_plans: 195
percent: 77
---

# Project State
Expand All @@ -24,14 +24,21 @@ progress:
See: .planning/PROJECT.md (updated 2026-06-27)

**Core value:** Zero-knowledge privacy -- files encrypted client-side, server never sees plaintext
**Current focus:** Phase 73shared-write-navigation-correctness-web
**Current focus:** Phase 74Rust and FUSE Rotation-Revocation Soundness

## Current Position

Phase: 71 — Share-Invite Security and IPNS Data-Integrity (API)
Plan: Not started
Status: Executing Phase 73
Last activity: 2026-07-10 — Phase 70.1 complete, transitioned to Phase 71
Phase: 74 (Rust and FUSE Rotation-Revocation Soundness) — VERIFIED human_needed (NOT marked complete)
Plan: 7 of 7 executed + committed
Status: All 7 plans done; verification = human_needed. 21/21 must-haves code-verified; all local test suites pass (SC1 27/27+370/370+17/17, SC2 15/15+10/10 / fuse 117/117). SC3 code source-verified (D-15d parity). Two CI-gated legs pending (see Blockers).
Last activity: 2026-07-11 — Phase 74 learnings extracted (74-LEARNINGS.md)

## Phase 74 Blockers (CI-gated verification, not code gaps)

Recorded per GSD human_needed handling. Both are infra limitations that cannot run on this macOS host — routed to `74-UAT.md`, not treated as gaps. Phase 74 stays open pending these; run `/gsd-verify-work 74` after CI confirms.

1. Windows CI (`Cargo Check & Test (Windows)`) must compile 74-06's `#[cfg(windows)]` WinFsp rename dest-gate and pass its two new tests — cannot build winfsp on macOS.
2. Desktop-e2e 3-platform matrix (`desktop-e2e` workflow) must run 74-07's live-mount Part C (SC1+SC2 deep decryptability / retained-vs-revoked) and Part D (SC3 WinFsp overwrite-rename) — needs a built desktop binary + real FUSE/WinFsp mount. Also confirms Part A's pre-existing Bob assertion still holds (static analysis: likely a false alarm).

Progress: `██████████` 79 / 79 plans (100%)

Expand Down Expand Up @@ -266,6 +273,13 @@ Items acknowledged and deferred at v1.1 milestone close on 2026-06-27. None are
| Phase 72 P08 | 15min | 2 tasks | 1 files |
| Phase 72 P09 | 8min | 1 tasks | 5 files |
| Phase 72 P10 | 10min | 2 tasks | 3 files |
| Phase 74 P01 | 20min | 2 tasks | 1 files |
| Phase 74 P04 | 15min | 2 tasks | 2 files |
| Phase 74 P06 | 45min | 2 tasks | 3 files |
| Phase 74 P74-03 | 20min | 2 tasks | 2 files |
| Phase 74 P05 | 25min | 2 tasks | 2 files |
| Phase 74 P02 | 12min | 2 tasks | 4 files |
| Phase 74 P07 | 40min | 2 tasks | 5 files |

## Accumulated Context

Expand Down Expand Up @@ -586,15 +600,29 @@ Last session: 2026-06-28T18:09:45.156Z
- [Phase ?]: 72-09: vault/index.ts's two root-key wraps (wrapKey(rootReadKey/rootWriteKey, userPublicKey)) left untouched — only the TEE ipns-key wrap was extracted
- [Phase ?]: runFileVersionOp is not wrapped in withOperation itself -- each public method keeps its own withOperation(name) call for correct per-op telemetry attribution
- [Phase ?]: write-body-params.ts standardizes the IPNS-resolve path on inline resolveIpnsRecord+fetchFromIpfs+JSON.parse (bin's pre-existing style) rather than client.ts's resolvePublishedNode wrapper, since the extra signatureVerified field was never consumed by getWriteBodyParams
- [Phase ?]: 74-01: RotateReadResult.rotated_nodes (HashMap<String, RotatedNodeKey> keyed by ipns_name) surfaces every rotated node's post-rotation read key, populated at root/BFS-child/repair_dirty_node hooks; CommittedRotation stays host-agnostic
- [Phase ?]: [Phase 74-04] No mock-HTTP crate exists in api-client dev-deps; added a minimal raw TcpListener capturing mock server in shares.rs test mod (mirrors fuse/delete.rs's spawn_mock_rotation_server) instead of pulling in wiremock/mockito
- [Phase ?]: [Phase 74-04] update_grant accepts root_generation as u64 and formats to decimal string at the wire boundary, matching UpdateGrantDto's numeric-string contract
- [Phase ?]: [Phase 74-06]: WinFsp handle_rename reordered to fuser D-15d pipeline (validate -> source-gate -> dest-gate -> mutate); new dest scope-exit gate closes T-74-09 overwrite-rename revocation bypass
- [Phase ?]: [Phase 74-06]: crate::test_support cfg widened to any(feature=fuse, feature=winfsp) so WinFsp #[cfg(test)] can reuse make_test_fs_with_keypair; fuser-specific CaptureSender/reply_error_code stay fuse-gated
- [Phase ?]: [Phase 74-06]: Did not add self-replace/kind-mismatch validation to WinFsp handle_rename (RESEARCH.md Todo 3 point 4 scoped it out-of-scope for SC3)
- [Phase ?]: RotatedNodeKey exported from cipherbox_sdk::rotation (mod.rs re-export) — was engine.rs-internal, needed by grant_scope.rs's test (74-03)
- [Phase ?]: grant_scope.rs refresh function extended to InodeKind::Root | Folder | File (was Root | Folder only) — files rotate too via mint_file_key_on_rotate/CRIT-1 (74-03)
- [Phase 74]: RotationTransport::update_grant generation param typed u32 (matches RotationDeps::update_grant exactly); ApiClientTransport converts u32->u64 only at the cipherbox_api_client::shares::update_grant call boundary
- [Phase 74]: delete_grant implemented for engine-contract completeness though is_revoked is structurally always false from collect_sent_shares (revoked shares hard-deleted server-side); no test asserts that branch firing through this path (T-74-14 accepted, not mitigated)
- [Phase 74]: 74-02: RotatedNodeKey.sequenceNumber typed bigint (not the plan table's literal number) to match this file's existing IPNS sequence-number convention
- [Phase 74]: 74-02: repairDirtyNode crash-resume path does not populate rotatedNodes (out of scope per plan's task action/acceptance_criteria) — Rust 74-01 folded it in; documented TS/Rust asymmetry for a future follow-up
- [Phase ?]: [Phase 74-07] Combined the plan's deep leg and second-recipient leg into one Part C scenario (Eve revoked, Carol retained on the same grant root) -- the only construction matching 74-05's real re-mint semantics; revoked recipients in Parts C/D are explicitly DELETE'd pre-mutation since an active-but-untouched grantee is now correctly re-minted, not cut off
- [Phase ?]: [Phase 74-07] Flagged (not fixed) that Part A's existing Bob assertion in shared-scope-exit-rotation.mts may no longer hold post-74-05 (an active never-revoked grantee is now re-minted rather than cut off) -- left untouched per the plan's explicit instruction; needs a live CI run to confirm

## Operator Next Steps

- Run `/gsd-plan-phase 61` to begin Phase 61: AAD-Bound Seal Primitive and Cross-Language KAT

## Session

**Last session:** 2026-07-10T15:32:28.115Z
**Stopped at:** Completed 72-10-PLAN.md
**Last session:** 2026-07-11T04:58:48.845Z
**Stopped at:** Completed 74-02-PLAN.md
Comment thread
coderabbitai[bot] marked this conversation as resolved.
**Resume file:**

None
Expand Down
Loading
Loading