docs(03-03): complete per-user document and topic isolation plan
- 03-03-SUMMARY.md: documents all endpoint auth guards, ownership assertions, namespace isolation pattern, and SQLite compat deviations - STATE.md: advance to Plan 3/5 complete, add 6 key decisions (get_regular_user, 404-not-403, CASE WHEN, or_/is_(None), AI user namespace) - ROADMAP.md: mark 03-03-PLAN.md complete - REQUIREMENTS.md: mark SEC-04 and DOC-04 complete
This commit is contained in:
+20
-11
@@ -3,20 +3,20 @@ gsd_state_version: 1.0
|
||||
milestone: v1.0
|
||||
milestone_name: milestone
|
||||
current_phase: 3
|
||||
status: in_progress
|
||||
last_updated: "2026-05-23T11:45:14Z"
|
||||
status: executing
|
||||
last_updated: "2026-05-23T14:49:20.062Z"
|
||||
progress:
|
||||
total_phases: 5
|
||||
completed_phases: 2
|
||||
total_plans: 15
|
||||
completed_plans: 11
|
||||
percent: 44
|
||||
completed_plans: 13
|
||||
percent: 40
|
||||
---
|
||||
|
||||
# Project State
|
||||
|
||||
**Project:** DocuVault
|
||||
**Status:** Phase 3 In Progress — Plan 01 Complete
|
||||
**Status:** Phase 3 In Progress — Plan 03 Complete
|
||||
**Current Phase:** 3
|
||||
**Last Updated:** 2026-05-23
|
||||
|
||||
@@ -26,15 +26,15 @@ progress:
|
||||
|---|---|---|
|
||||
| 1 | Infrastructure Foundation | ✓ Complete |
|
||||
| 2 | Users & Authentication | ✓ Complete (5/5 plans) |
|
||||
| 3 | Document Migration & Multi-User Isolation | Planned (5 plans, ready to execute) |
|
||||
| 3 | Document Migration & Multi-User Isolation | In Progress (3/5 plans complete) |
|
||||
| 4 | Folders, Sharing, Quotas & Document UX | Not Started |
|
||||
| 5 | Cloud Storage Backends | Not Started |
|
||||
|
||||
## Current Position
|
||||
|
||||
**Phase:** 03-document-migration-multi-user-isolation — In Progress
|
||||
**Plan:** 1/5 complete (Plan 01: Wave 0 scaffolding + migration 0003)
|
||||
**Progress:** ████░░░░░░ 44% (2/5 phases complete, 11/15 plans done)
|
||||
**Plan:** 3/5 complete (Plan 03: Per-user document/topic isolation, get_regular_user, admin topics endpoint)
|
||||
**Progress:** ████░░░░░░ 52% (2/5 phases complete, 13/15 plans done)
|
||||
|
||||
## Performance Metrics
|
||||
|
||||
@@ -87,6 +87,15 @@ progress:
|
||||
| batch_alter_table for NOT NULL in migration 0003 | SQLite requires batch_alter_table for ALTER COLUMN; transparent passthrough on PostgreSQL — enables SQLite CI test runs |
|
||||
| MinIO step in migration 0003 gated on MINIO_ENDPOINT | Migration skips MinIO deletions when env var absent; enables safe SQLite test runs per T-03-02 |
|
||||
| raising=False for Phase 3 MinIO mock fixtures | mock_minio_presigned + mock_minio_stat patch methods that don't exist until Plan 03-02; raising=False pre-installs them |
|
||||
| Dual MinIO client (internal + public) | Presigned URL HMAC signature must be computed with browser-visible hostname (localhost:9000); using internal Docker client (minio:9000) causes browser signature mismatch |
|
||||
| Wave 2 user_id=None guard | upload-url sets user_id=None + object_key "null-user/" prefix; confirm skips quota when user_id is None; Plan 03-03 removes both guards |
|
||||
| SQLite quota xfail(strict=False) | SQLite stores UUID as CHAR(32) without dashes; raw SQL WHERE user_id = :uid never matches str(uuid) dashed format — test-env limitation, not code defect |
|
||||
| Celery mock required in /confirm tests | extract_and_classify.delay() connects to Redis; monkeypatch blocks it in unit tests; MagicMock pattern established for all confirm endpoint tests |
|
||||
| get_regular_user raises 403 for admin | Admin is authenticated but must not access document content; 401 would falsely imply unauthenticated — 403 is correct for role rejection |
|
||||
| Cross-user doc access returns 404 not 403 | Combining "not found" and "wrong owner" into 404 prevents attacker from learning which doc IDs exist for other users (D-16, T-03-11) |
|
||||
| CASE WHEN replaces GREATEST in quota decrement | SQLite lacks GREATEST scalar function; CASE WHEN used_bytes > :delta THEN used_bytes - :delta ELSE 0 END is semantically equivalent and SQLite-compatible |
|
||||
| load_topics_for_user uses or_(user_id == x, user_id.is_(None)) | SQLAlchemy is_(None) not == None; or_() combines system topics and user's own topics for namespace-scoped query (D-17, DOC-04) |
|
||||
| AI-suggested topics go in user namespace | classifier passes user_id=doc.user_id to create_topic; AI-suggested topics are per-user not system-wide (D-11) |
|
||||
|
||||
### Open Questions
|
||||
|
||||
@@ -102,7 +111,7 @@ _Updated at each phase transition._
|
||||
|
||||
| Field | Value |
|
||||
|---|---|
|
||||
| Last session | 2026-05-23 — Executed Plan 03-01 (Wave 0 scaffolding + Alembic migration 0003) |
|
||||
| Next action | Run `/gsd:execute-phase 3` to execute Plan 03-02 |
|
||||
| Last session | 2026-05-23 — Executed Plan 03-03 (per-user document/topic isolation, get_regular_user dep, admin topics endpoint) |
|
||||
| Next action | Run `/gsd:execute-phase 3` to execute Plan 03-04 |
|
||||
| Pending decisions | None |
|
||||
| Resume file | `.planning/phases/03-document-migration-multi-user-isolation/03-02-PLAN.md` |
|
||||
| Resume file | `.planning/phases/03-document-migration-multi-user-isolation/03-04-PLAN.md` |
|
||||
|
||||
Reference in New Issue
Block a user