docs(phase-4): complete 04-03-PLAN.md — Folders API + audit helper

- Create 04-03-SUMMARY.md with full frontmatter, decisions, threat surface scan
- Update STATE.md: plan 3/9, new decisions, session continuity
- Update ROADMAP.md: mark 04-01, 04-02, 04-03 plans complete (3/9)
- Update REQUIREMENTS.md: mark FOLD-01..FOLD-05 complete
This commit is contained in:
curo1305
2026-05-25 18:40:33 +02:00
parent 33a6f9a290
commit c6feb5faf2
4 changed files with 156 additions and 12 deletions
+9 -4
View File
@@ -27,13 +27,13 @@ progress:
| 1 | Infrastructure Foundation | ✓ Complete |
| 2 | Users & Authentication | ✓ Complete (5/5 plans) |
| 3 | Document Migration & Multi-User Isolation | ✓ Complete (5/5 plans, 10/10 UAT, security gate passed) |
| 4 | Folders, Sharing, Quotas & Document UX | In Progress (1/9 plans complete) |
| 4 | Folders, Sharing, Quotas & Document UX | In Progress (3/9 plans complete) |
| 5 | Cloud Storage Backends | Not Started |
## Current Position
**Phase:** 04-folders-sharing-quotas-document-ux — In progress
**Plan:** 2/9 — Wave 0 scaffolds complete (04-01); migration 0004 + put_object_raw complete (04-02)
**Plan:** 3/9 — Wave 0 scaffolds (04-01), migration 0004 + put_object_raw (04-02), Folders API + audit helper (04-03)
**Progress:** ██████░░░░ 60% (3/5 phases complete)
## Performance Metrics
@@ -108,6 +108,10 @@ progress:
| Wave 0 stubs: single-line body only | All Phase 4 stubs: body is only pytest.xfail("not implemented yet") — no assertion code; strict=False so xpass never breaks CI |
| GIN index via op.execute() raw SQL | Alembic autogenerate cannot round-trip expression indexes; raw SQL with comment prevents re-creation on every --autogenerate run (issue #1390) |
| put_object_raw not in StorageBackend ABC | audit-logs bucket is MinIO-only; local/WebDAV backends have no audit concept; MinIOBackend-only method |
| write_audit_log uses session.flush() | D-14: caller owns the transaction; flush queues the audit entry without committing — commit remains caller's responsibility |
| Breadcrumb uses iterative Python parent-walk | Not WITH RECURSIVE — ensures SQLite unit tests pass; cycle guard (visited set) prevents infinite loop on malformed data |
| document_move_router is a separate APIRouter | PATCH /api/documents/{id}/folder placed in folders.py not documents.py; separate router with /api/documents prefix avoids circular import |
| FTS plainto_tsquery wrapped in try/except | SQLite silently degrades to unfiltered results when plainto_tsquery unavailable; PostgreSQL works fully — no unit test breakage |
### Open Questions
@@ -146,6 +150,7 @@ _Updated at each phase transition._
| Last session | 2026-05-25 — Phase 4 plans created (9 plans, 7 waves) + verification passed (0 blockers, 2 warnings) |
| Last session | 2026-05-25 — Plan 04-01 executed: 30 Wave 0 xfail stubs across 5 test files; 39 xfailed total, zero new failures |
| Last session | 2026-05-25 — Plan 04-02 executed: migration 0004 (pdf_open_mode, GIN FTS index, audit-logs bucket) + MinIOBackend.put_object_raw(); 122 tests pass |
| Next action | Continue Wave 1 execution: run plan 04-03 |
| Last session | 2026-05-25 — Plan 04-03 executed: write_audit_log() helper (flush-not-commit, never-raises) + FOLD-01..05 folder API + document sort/FTS/move; 122 pass, 0 new failures |
| Next action | Continue Wave 2 execution: run plan 04-04 (shares API) |
| Pending decisions | None |
| Resume file | `.planning/phases/04-folders-sharing-quotas-document-ux/04-02-SUMMARY.md` |
| Resume file | `.planning/phases/04-folders-sharing-quotas-document-ux/04-03-SUMMARY.md` |