curo1305
8c80607df9
fix(dev-env): complete local startup configuration
2026-06-21 20:43:45 +02:00
curo1305
461b56892c
docs(12-05): mark VERIFICATION.md passed — all 5 truths verified
2026-06-21 20:33:37 +02:00
curo1305 and Claude Sonnet 4.6
206f564248
test(12-05): fix test_nextcloud_connect_persists + compose migration test path
...
- test_nextcloud_connect_persists: provider=nextcloud routes to NextcloudBackend
(not WebDAVBackend) — add storage.nextcloud_backend.validate_cloud_url patch
and use AsyncMock for asyncio.to_thread (plain return_value=True is not
awaitable, swallowed by except → False). Test now passes HTTP 201.
- test_compose_migrations: skip module when docker-compose.yml is not found at
the expected repo-root path (file is not mounted inside the backend container).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-20 12:35:35 +02:00
curo1305 and Claude Sonnet 4.6
043a7817e2
fix(12-uat): add display_name_override schema regression + Compose hardening
...
- test_list_connections_reads_display_name_override_column: proves GET /api/cloud/connections
does not raise UndefinedColumn (direct Phase 12 UAT blocker regression)
- docker-compose: promtail socket :ro, Grafana password fail-fast (:?)
- test_migration_0006: DDL privilege test fails not skips when role absent
- README: version 0.2.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-20 11:07:30 +02:00
curo1305 and Claude Sonnet 4.6
760a8d4bcd
fix(12-uat): resolve critical code review findings in gap closure (CR-01 through CR-03, IN-01)
...
- CR-01: promtail Docker socket mounted :ro (was read-write)
- CR-02: Grafana admin password uses :? fail-fast (was :-changeme default)
- CR-03: DDL privilege test fails not skips when docuvault_app role absent
- IN-01: README version synced to 0.2.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-20 10:55:23 +02:00
curo1305
b6526e46f1
docs(12): add gap closure code review report
2026-06-20 10:54:22 +02:00
curo1305
bb818e0621
docs(phase-12): resolve UAT gaps and debug sessions after 12-05 gap closure
2026-06-20 10:51:44 +02:00
curo1305
34be364ca7
docs(phase-12): update tracking after gap closure wave
2026-06-20 10:50:38 +02:00
curo1305
824d271a42
chore: merge executor worktree (worktree-agent-a724010d4b729caf8)
2026-06-20 10:50:22 +02:00
curo1305
67d3e4bcac
docs(12-05): complete gap closure plan SUMMARY
2026-06-20 10:49:59 +02:00
curo1305
3ca57dcd0c
fix(12-05): bump version to 0.2.1 and update docs for migration-gated startup
...
- backend/main.py, frontend/package.json: version 0.2.0 → 0.2.1
- CLAUDE.md, AGENTS.md: current state updated to reflect gap-closure
- README.md: startup instructions note migrate runs automatically; update migration commands
- RUNBOOK.md: startup diagram includes migrate service; migration gate explanation
- SECURITY.md: Phase 12 gap-closure threat register and security gate evidence
2026-06-20 10:49:21 +02:00
curo1305
de2efd1664
test(12-05): add migration 0005→0006 integration regression and RUNBOOK migration ops
...
- test_migration_0006.py: proves display_name_override, cloud_items, cloud_item_topics,
cloud_folder_states, unique constraints, indexes, and DDL privilege boundary
- Tests skip cleanly without INTEGRATION=1/INTEGRATION_DATABASE_URL (no dev DB mutation)
- RUNBOOK: add Database Migrations section with revision check, upgrade, recovery, and
emergency schema-drift remediation commands
2026-06-20 10:47:11 +02:00
curo1305
1b3084ddfa
feat(12-05): add migration-gated Compose startup path
...
- Add one-shot migrate service using DATABASE_MIGRATE_URL and alembic upgrade head
- Add migrate dependency (service_completed_successfully) to backend, celery-worker, celery-beat
- migrate service has same read_only/cap_drop/no-new-privileges hardening as other services
- Add test_compose_migrations.py: 7 static assertions on Compose configuration
2026-06-20 10:45:22 +02:00
curo1305
66d8634b17
docs(12): plan UAT migration gap closure
2026-06-20 10:40:37 +02:00
curo1305
a7e17d69b4
docs(12): add root causes from diagnosis
2026-06-19 23:44:04 +02:00
curo1305
802afebafe
test(12): complete UAT - 0 passed, 2 issues
2026-06-19 23:39:22 +02:00
curo1305
13b9d83401
docs(phase-12): update validation strategy
2026-06-19 06:10:55 +02:00
curo1305
33264862c1
docs(phase-12): evolve PROJECT.md and CLAUDE.md after phase completion
2026-06-19 06:06:01 +02:00
curo1305
8e5d7a1900
docs(phase-12): complete phase execution
2026-06-19 06:05:03 +02:00
curo1305 and Claude Sonnet 4.6
b6911fb4ed
fix(12): resolve critical code review findings (CR-01 through CR-04)
...
- CR-01: fix browse URL from /folders/{id} to /items?parent_ref= (broken feature)
- CR-02: remove raw provider exception text from _TerminalProviderError messages
- CR-03: add user_id predicate to get_or_create_folder_state query (ownership boundary)
- CR-04: add max_length=255 to ConnectionRenameRequest.display_name
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-19 02:00:05 +02:00
curo1305
de63e2a3a4
docs(12): add code review report
2026-06-19 01:59:17 +02:00
curo1305
b7ae44b3f8
docs(phase-12): update tracking after wave 4
2026-06-19 01:55:47 +02:00
curo1305
06ccc865b9
chore: merge executor worktree (worktree-agent-aa3d7c2b49ba82638)
2026-06-19 01:55:35 +02:00
curo1305
7b1fc6e5cf
docs(12-04): create Phase 12 Plan 04 SUMMARY.md
...
Records security-negative suite completion, threat register closure, gate
evidence, version bump to 0.2.0, and D-01..D-18 decision coverage map.
2026-06-19 01:55:15 +02:00
curo1305
c441fc63e5
chore(12-04): bump version to 0.2.0 and finalize Phase 12 documentation
...
- backend/main.py, frontend/package.json: 0.1.6 → 0.2.0 (phase-complete minor bump)
- AGENTS.md: current state updated to Phase 12 complete; cloud-resource-foundation
summary with browse contract, security suite, and Phase 13/14 boundary note
- README.md: version updated to 0.2.0
- All existing shared module map rules and frontend architecture constraints unchanged
2026-06-19 01:54:24 +02:00
curo1305
fccb9c6394
security(12-04): add Phase 12 security gate evidence and cloud ops runbook
...
- SECURITY.md: Phase 12 threat register (T-12-01 through T-12-SC) with
evidence for all 8 threat IDs; bandit/npm audit gate results;
accepted risks for pip-audit tooling gap and DISABLED connection behavior
- RUNBOOK.md: Phase 12 cloud operations section covering connection
management, browse refresh lifecycle, item metadata queries,
stuck-refresh recovery, and security operation notes
2026-06-19 01:52:49 +02:00
curo1305
3b24058e15
test(12-04): add dedicated cloud security-negative integration suite
...
- test_foreign_user_cannot_browse_cloud_item (IDOR T-12-01, CONN-04)
- test_admin_cannot_browse_cloud_connection (admin block T-12-01, D-03)
- test_browse_response_excludes_credentials_and_raw_fields (T-12-03, D-06)
- test_ssrf_url_validation_invariants (T-12-04, D-14)
- test_browse_no_quota_mutation (T-12-09, D-07)
- test_browse_no_minio_calls (T-12-09, D-08)
- test_disabled_connection_browse_blocked (D-17)
- test_same_provider_items_scoped_to_connection (D-01, D-05 PostgreSQL)
- test_no_byte_download_during_browse (D-18)
- 16 tests pass; full suite 509 passed
2026-06-19 01:51:13 +02:00
curo1305
8a99230048
docs(phase-12): update tracking after wave 3
2026-06-18 23:33:03 +02:00
curo1305
84c2549c36
chore: merge executor worktree (worktree-agent-a280818c01e94acd2)
2026-06-18 23:32:56 +02:00
curo1305
5287efd34c
docs(12-03): add plan 03 execution summary
2026-06-18 23:32:41 +02:00
curo1305
c6c0742267
feat(12-03): breadcrumb freshness, formatRelativeTime, v0.1.6, docs
...
- BreadcrumbBar: refreshing spinner, fresh checkmark (fades 3s), stale warning banner
- Accessible labels and role=status for all freshness states
- formatters.js: add formatRelativeTime (shared, no duplication)
- Version bump 0.1.5 → 0.1.6 in backend/main.py and frontend/package.json
- AGENTS.md: update state, shared module map (formatRelativeTime)
- README.md: unified connection-root browsing and capability explanations feature text
- 17 BreadcrumbBar tests pass; 323 total; production build clean
2026-06-18 23:31:50 +02:00
curo1305
44244335a1
feat(12-03): capability-aware action rendering in StorageBrowser
...
- Add capabilities, connectionRoot, folderFreshness, lastRefreshedAt, byteAvailability props
- CapabilityButton inline component: aria-disabled, click/Enter/Space/touch suppression
- Gray for unsupported, amber for temporarily_unavailable — no native disabled
- Local defaults preserve all pre-Phase-12 drag/share/move/delete behavior
- Cached-byte marker (clock icon) on size column when byteAvailability='cached'
- No marker for cloud_only
- AppIcon: add info, clock icons
- 50 StorageBrowser tests pass
2026-06-18 23:29:10 +02:00
curo1305
bf9af11274
feat(12-03): connection-ID routing, rename, session folder memory, thin views
...
- Route /cloud/:connectionId/:folderId replaces /cloud/:provider/:folderId
- api/cloud.js: getCloudFoldersByConnectionId + renameCloudConnection
- cloudConnections store: rename, selectConnection, setBrowseState, defaultDisplayName, session storage helpers
- CloudStorageView: thin — passes connectionRoots to StorageBrowser
- CloudFolderView: thin — uses connectionId param, never provider slug
- SettingsCloudTab: inline rename input for each active connection
- 27 tests pass: store, view, settings
2026-06-18 23:25:29 +02:00
curo1305
6f0ecfa39b
docs(phase-12): update tracking after wave 2
2026-06-18 23:19:55 +02:00
curo1305
81c4d52041
chore: merge executor worktree (worktree-agent-ac074b0ec7fc0dbc3)
2026-06-18 23:19:27 +02:00
curo1305
f61736621e
chore: track AGENTS.md (untracked file blocking wave-2 merge)
2026-06-18 23:19:05 +02:00
curo1305
e5d6b9ea53
docs(12-02): execution summary — CloudResourceAdapter, browse endpoint, Celery refresh task
2026-06-18 23:18:30 +02:00
curo1305
c6237ca57f
feat(12-02): add refresh_cloud_folder Celery task, staleness trigger, version 0.1.5
...
- Add tasks/cloud_tasks.py: durable refresh_cloud_folder task with 3-retry
bounded backoff (30s/90s/270s +jitter), credential decryption in worker only
- Register tasks.cloud_tasks.* on documents queue in celery_app.py
- Add stale-while-revalidate staleness trigger in browse.py (5-min threshold)
- Add 4 Task 3 tests: idempotency, cached-row retention on failure, task structure,
no-byte-download contract; add background-refresh scheduling integration test
- Bump backend version 0.1.4 → 0.1.5, frontend package.json 0.1.4 → 0.1.5
- Update AGENTS.md with Phase 12 Plan 02 state and new shared module map entries
- Update README with connection-ID browse API table and v0.1.5
2026-06-18 23:17:34 +02:00
curo1305
e186019066
feat(12-02): decompose api/cloud.py into package with connection-ID browse endpoint
...
- Add api/cloud/ package: connections.py, browse.py, schemas.py, __init__.py
- Add GET /api/cloud/connections/{connection_id}/items (T-12-01 IDOR, T-12-03 cred-free)
- Add PATCH /api/cloud/connections/{id} for display_name_override rename
- Add display_name_override ORM field to CloudConnection model
- Add CloudResourceAdapter service layer with str/UUID coercion
- Fix UUID type compatibility: test_cloud_items.py now uses UUID(as_uuid=True)
matching conftest — removes String(36) patch that caused type incompatibility
- Add 11 Phase 12 integration tests (IDOR, admin block, credential exclusion,
duplicate providers, rename, malformed UUID)
- Remove deleted api/cloud.py (replaced by api/cloud/ package)
2026-06-18 23:10:30 +02:00
curo1305
ff33439f0a
feat(12-02): normalize all four providers into CloudResourceAdapter contract
...
- GoogleDriveBackend: list_folder with full pagination, native doc size=None, get_capabilities
- OneDriveBackend: list_folder with @odata.nextLink pagination, get_capabilities
- WebDAVBackend: list_folder via PROPFIND with SSRF re-validation, get_capabilities
- NextcloudBackend: inherits CloudResourceAdapter from WebDAVBackend
- build_cloud_resource_adapter() added to factory
- 22 new contract/behavior/pagination/no-byte-download tests (51 total pass)
2026-06-18 22:45:09 +02:00
curo1305
71ba0293a5
docs(phase-12): update tracking after wave 1
2026-06-18 22:39:35 +02:00
curo1305
312a96d2bf
chore: merge executor worktree (worktree-agent-a032d981c3b3ec11b)
2026-06-18 22:39:06 +02:00
curo1305
3127853c1e
docs(12-01): complete cloud-resource-foundation plan 01 summary
2026-06-18 22:38:46 +02:00
curo1305
718fb2c2b5
feat(12-01): durable owner-scoped cloud metadata schema (migration 0006 + models)
...
- Migration 0006: cloud_items, cloud_item_topics, cloud_folder_states tables
- cloud_connections: add display_name_override column for same-provider disambiguation
- CloudItem, CloudItemTopic, CloudFolderState ORM models with owner/connection indexes
- Unique (connection_id, provider_item_id) boundary; no MinIO object_key field
- Root folder state representable as parent_ref='' without CloudItem parent row
- services/cloud_items.py: resolve_owned_connection, upsert, list, reconcile, folder state
- 17 unit/integration tests covering model fields, isolation, quota invariant, idempotency
2026-06-18 22:37:28 +02:00
curo1305
0a7273b9fe
feat(12-01): normalized cloud resource capability contract and unit tests
...
- Define 9 action keys, 3 capability states, 6 reason codes in cloud_base.py
- Immutable CloudCapability, CloudResource, CloudListing frozen dataclasses
- Abstract CloudResourceAdapter with list_folder, get_capabilities, merge_item_capabilities
- No mutation methods in Phase 12 interface (Phase 13 boundary enforced)
- 29 unit tests covering vocabulary, validation, merge behavior, fake adapter
2026-06-18 22:34:23 +02:00
curo1305
11b91775b6
docs(12): create phase plan
2026-06-18 22:30:07 +02:00
curo1305 and Claude Sonnet 4.6
fe54a855b3
docs(phase-12): fix UI-SPEC typography and spacing blocking issues
...
- Collapse font weights from 3 to 2: drop font-medium (500), use font-semibold (600) for row primary names, labels, column headers; font-normal (400) for body
- Fix sm spacing token usage: replace p-1.5 (6px) with p-2 (8px) to match declared 8px value
- Update health badge in connection root list from font-medium to font-semibold
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-18 22:19:25 +02:00
curo1305 and Claude Sonnet 4.6
ea682fdecd
docs(phase-12): add UI design contract for cloud-resource-foundation
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-18 22:16:22 +02:00
curo1305
52b110acef
docs(phase-12): add research and validation strategy
2026-06-18 22:13:23 +02:00
curo1305
09814c28a9
docs(12): capture phase context
2026-06-18 22:07:26 +02:00