12 KiB
12 KiB
phase, slug, status, nyquist_compliant, wave_0_complete, created, last_audited
| phase | slug | status | nyquist_compliant | wave_0_complete | created | last_audited |
|---|---|---|---|---|---|---|
| 12 | cloud-resource-foundation | complete | true | true | 2026-06-18 | 2026-06-22 |
Phase 12 — Validation Strategy
Post-execution validation contract and Nyquist audit evidence for the cloud resource foundation.
Test Infrastructure
| Property | Value |
|---|---|
| Framework | pytest 9.x, Vitest 4.x, Vue Test Utils 2.x |
| Config file | backend/pytest.ini, frontend/vitest.config.js |
| Quick backend command | docker compose run --rm backend pytest -q tests/test_cloud.py tests/test_cloud_backends.py tests/test_cloud_capabilities.py tests/test_cloud_items.py tests/test_cloud_security.py tests/test_compose_migrations.py tests/test_migration_0006.py |
| Quick frontend command | cd frontend && npm test -- --run src/components/storage/__tests__/StorageBrowser.capabilities.test.js src/components/ui/__tests__/BreadcrumbBar.test.js src/views/__tests__/CloudFolderView.test.js src/views/__tests__/CloudStorageView.test.js src/stores/__tests__/cloudConnections.test.js src/components/settings/__tests__/SettingsCloudTab.test.js src/components/cloud/__tests__/CloudCredentialModal.test.js src/components/cloud/__tests__/CloudProviderTreeItem.test.js src/components/cloud/__tests__/CloudFolderTreeItem.test.js src/components/layout/__tests__/AppSidebar.test.js |
| Full suite command | cd backend && pytest -v; cd frontend && npm test; cd frontend && npm run build |
| Fresh focused runtime | Backend cloud/migration slice 159 passed, 12 prerequisite skips in 3.48 s plus 7 Compose contract tests in 0.23 s; frontend focused slice 76 passed in 1.12 s (2026-06-22) |
Sampling Rate
- After every task commit: Run the focused test file(s) named by that task.
- After every plan wave: Run backend and frontend suites for all touched layers.
- Before
/gsd:verify-work: Run the full backend suite, full frontend suite, production build, and required PostgreSQL integration tests. - Max observed focused feedback latency: 4.14 seconds, excluding container startup.
Per-Task Verification Map
| Task ID | Plan | Wave | Requirement | Threat Ref | Secure Behavior | Test Type | Automated Evidence | File Exists | Status |
|---|---|---|---|---|---|---|---|---|---|
| 12-01-01 | 01 | 1 | CONN-04, CLOUD-08 | T-12-06 | Capability discovery is normalized and never mutates provider content | unit | tests/test_cloud_capabilities.py |
✅ | ✅ green |
| 12-01-02 | 01 | 1 | CACHE-02, SYNC-01 | T-12-01, T-12-02 | Metadata/search state is owner and connection scoped without byte storage | unit + DB | tests/test_cloud_items.py schema, isolation, quota cases |
✅ | ✅ green |
| 12-01-03 | 01 | 1 | CACHE-02, SYNC-01 | T-12-07 | Reconciliation is stable and incomplete listings cannot delete unseen items | service | tests/test_cloud_items.py reconciliation cases |
✅ | ✅ green |
| 12-02-01 | 02 | 2 | CONN-04, SYNC-01 | T-12-04, T-12-06 | All providers normalize complete metadata/capability listings through read-only calls | adapter contract | tests/test_cloud_backends.py |
✅ | ✅ green |
| 12-02-02 | 02 | 2 | CLOUD-01, CLOUD-08 | T-12-01, T-12-03 | Connection-ID browse rejects foreign/admin access and excludes credentials | API integration | tests/test_cloud.py, tests/test_cloud_security.py |
✅ | ✅ green |
| 12-02-03 | 02 | 2 | CACHE-01, SYNC-01 | T-12-07, T-12-09 | Refresh retries safely, retains metadata on failure, and downloads no bytes | task/service | tests/test_cloud_items.py refresh/no-byte cases |
✅ | ✅ green |
| 12-03-01 | 03 | 3 | CONN-04, CLOUD-01 | T-12-01, T-12-11 | Routes/stores use connection UUID and session storage contains folder references only | store/view | cloudConnections, CloudStorageView, CloudFolderView, SettingsCloudTab tests | ✅ | ✅ green |
| 12-03-02 | 03 | 3 | CONN-04, CLOUD-08 | T-12-10 | Disabled controls are focusable/explanatory and suppress pointer/keyboard/touch actions | component | StorageBrowser.capabilities.test.js |
✅ | ✅ green |
| 12-03-03 | 03 | 3 | CLOUD-01, SYNC-01 | T-12-12 | Breadcrumb freshness states are accessible and cached rows stay usable | component | BreadcrumbBar.test.js, CloudFolderView.test.js |
✅ | ✅ green |
| 12-04-01 | 04 | 4 | All Phase 12 | T-12-01..10 | Dedicated owner/admin/credential/SSRF/no-byte negatives close cross-layer threats | integration/regression | tests/test_cloud_security.py plus focused suites |
✅ | ✅ green |
| 12-04-02 | 04 | 4 | CONN-04, CLOUD-08 | T-12-SC | Static/dependency security gates have no unresolved Phase 12 blocker | security gate | SECURITY.md Phase 12 evidence |
✅ | ✅ green |
| 12-04-03 | 04 | 4 | All Phase 12 | — | Documentation/version claims match tracked shipped behavior | source + suites | 12-VERIFICATION.md, summaries, version source assertions |
✅ | ✅ green |
| 12-05-01 | 05 | 5 | CONN-04, CLOUD-01 | T-12-05-01..04 | Exactly one hardened migrate service gates backend/worker/beat startup | compose contract | tests/test_compose_migrations.py; docker compose config --quiet |
✅ | ✅ green |
| 12-05-02 | 05 | 5 | CONN-04, CLOUD-01 | T-12-05-01, T-12-05-02 | A disposable PostgreSQL database upgrades 0005→0006 and preserves DDL separation | PostgreSQL integration | tests/test_migration_0006.py (12 tests; explicit prerequisite skip without disposable DSN) |
✅ | ✅ green |
| 12-05-03 | 05 | 5 | CONN-04, CLOUD-01 | T-12-05-03, T-12-05-04 | Cloud APIs run against migrated schema without credential disclosure | API regression + config | tests/test_cloud.py, tests/test_cloud_security.py, Compose config validation |
✅ | ✅ green |
| 12-06-01 | 06 | 6 | CONN-04, CLOUD-01 | T-12-06-01..05 | Same-provider accounts create independently; edits target one owned UUID; errors stay actionable and credential-free | API + component | tests/test_cloud.py, tests/test_cloud_security.py, SettingsCloudTab.test.js, CloudCredentialModal.test.js |
✅ | ✅ green |
| 12-06-02 | 06 | 6 | CLOUD-01, CLOUD-08 | T-12-06-06 | Sidebar browse/routes use connection UUIDs; breadcrumbs and deepest-node active state survive refresh failure | component/view | CloudProviderTreeItem.test.js, CloudFolderTreeItem.test.js, AppSidebar.test.js, CloudFolderView.test.js, CloudStorageView.test.js |
✅ | ✅ green |
| 12-06-03 | 06 | 6 | CONN-04, CLOUD-01, CLOUD-08 | T-12-06-SC | UAT regressions, version alignment, build, and security gates remain release-ready | cross-layer suite | Phase summaries/security evidence plus focused and full-suite commands | ✅ | ✅ green |
Status: ✅ green · ❌ red · ⚠️ partial/manual
Requirement Coverage
| Requirement | Status | Automated evidence |
|---|---|---|
| CONN-04 | COVERED | Capability contract tests, independent same-provider lifecycle and owner-targeted edit tests, connection store/settings tests, StorageBrowser action-state tests |
| CLOUD-01 | COVERED | Migration-gated startup tests, connection-ID API tests, UUID-only sidebar navigation, and shared CloudStorageView/CloudFolderView/StorageBrowser tests |
| CLOUD-08 | COVERED | Unsupported/temporarily-unavailable state, message, pointer, Enter, Space, and touch suppression tests |
| CACHE-01 | COVERED | No-MinIO, no-byte-download, no-quota-mutation browse/refresh tests |
| CACHE-02 | COVERED | Cloud metadata/extracted text/topic/semantic fields and cross-connection isolation tests |
| SYNC-01 | COVERED | Provider normalization plus durable item/reconciliation/freshness tests |
Wave 0 Requirements
backend/tests/test_cloud_capabilities.py— capability normalization, reason states, safe discovery, item overrides.backend/tests/test_cloud_items.py— owner-scoped persistence, stable identity, reconciliation, metadata-only invariants.- Database constraint/isolation coverage for UUID ownership, unique connection/item identity, and cascade behavior.
CloudFolderView.test.jsandCloudStorageView.test.js— thin shared-browser view integration.- Provider response fixtures for Google Drive, OneDrive, Nextcloud, and generic WebDAV normalization.
test_compose_migrations.pyandtest_migration_0006.py— startup gate and disposable PostgreSQL 0005→0006 regression.CloudCredentialModal.test.js— new-vs-edit endpoint selection, connection-ID targeting, omitted-password preservation, and actionable errors.- Connection tree/sidebar tests — UUID-only routes, nested folder selection, and exact overview active state.
- Fresh focused runtime recorded for backend, frontend, and Compose contract slices.
Manual-Only Verifications
| Behavior | Requirement | Why Manual | Test Instructions |
|---|---|---|---|
| Tooltip placement and clarity across desktop/mobile viewports | CLOUD-08 | Visual placement and viewport clipping require a rendered browser | Hover and keyboard-focus a gray/amber cloud action on desktop, then tap it on mobile; verify readable explanation, no overlap, and no underlying action |
| Cached-first transition and freshness presentation | CLOUD-01, SYNC-01 | Perceived flicker, layout stability, and continued row usability are visual qualities | Seed durable metadata, delay/fail provider refresh, navigate the folder, and verify rows remain interactive while refreshing/warning indicators and last-update copy render correctly |
These checks supplement automated coverage; no Phase 12 requirement depends solely on manual verification.
Validation Audit 2026-06-22
| Metric | Count |
|---|---|
| Phase requirements audited | 6 |
| Automated requirements covered | 6 |
| Executed plans audited | 6 |
| Gaps found | 1 |
| Tests generated | 1 file / 3 tests |
| Gaps escalated to manual-only | 0 |
| Supplementary manual visual checks retained | 2 |
Gap Closed
- Plan 12-06 named
frontend/src/components/cloud/__tests__/CloudCredentialModal.test.jsas required automated evidence, but the file was absent; only a mobile-layout test existed. - Generated the missing functional suite with three regressions: fresh Nextcloud creation builds the WebDAV URL and calls create, editing targets the selected connection UUID while omitting a blank password, and API validation detail remains visible without closing the modal.
Fresh Execution Evidence
- Backend cloud/migration focused slice: 159 passed, 12 skipped, 1 non-failing SlowAPI deprecation warning, 3.48 s. The 12 migration integration cases correctly require an explicitly disposable PostgreSQL DSN and did not touch the development database.
- Compose migration contract: 7 passed in 0.23 s with the repository Compose file mounted read-only into the backend test container.
- Frontend focused suite after gap closure: 76 passed across 10 files, 1.12 s.
- Compose environment contract:
docker compose config --quietpassed with required variables resolved. - Execution closeout evidence: backend 509 passed with one documented environment-only
libmagicfailure; frontend 323 passed; production build succeeded. - Later Plan 12-06 closeout evidence: backend 516 passed (7 xfailed, 17 skipped), frontend 334 passed across 42 files, and production build succeeded.
- Phase verification:
.planning/phases/12-cloud-resource-foundation/12-VERIFICATION.mdstatuspassed; versions align at 0.2.2.
Validation Sign-Off
- Every Phase 12 requirement has targeted automated verification.
- Every executed task has automated or explicit source/security evidence.
- Sampling continuity contains no three-task gap.
- Wave 0 files and fixtures exist.
- Commands use one-shot test modes, not watch mode.
- Focused feedback latency is below 60 seconds.
nyquist_compliant: trueis set in frontmatter.
Approval: approved 2026-06-22