chore: update client submodule and enhance project management documentation
- Updated client submodule reference to the latest commit. - Revised project management documentation to reflect changes in project roles, settings, and rule inheritance. - Enhanced roadmap and sprint documentation with detailed objectives and deliverables for upcoming sprints. - Improved clarity on project scoping and dependencies in the context of workspace management. All quality checks pass.
This commit is contained in:
2
client
2
client
Submodule client updated: 924c7e0982...bb72edb99f
@@ -141,9 +141,9 @@ Sprint 18 (Projects) ─────┬─────────────
|
||||
| **15** | Platform Hardening | M | Phase 4 | ⚠️ Partial | Central error taxonomy, OpenTelemetry instrumentation, usage events |
|
||||
| **16** | Identity Foundation | L | Sprint 15 | ✅ Ready | User auth mechanism, workspace enforcement |
|
||||
| **17** | Custom OAuth Providers | L | Sprint 16 | ✅ Ready | OIDC discovery, Authentik/Authelia presets |
|
||||
| **18** | Projects v1 | M-L | Sprint 16 | ❌ Not started | Project entity, meeting/task grouping |
|
||||
| **18** | Projects v1 | L | Sprint 16 | ❌ Not started | Project entity, ProjectRole, rule inheritance, UI |
|
||||
| **19** | Artifacts v1 | XL | Sprint 18 | ✅ Ready | Upload + chunking + embedding pipeline |
|
||||
| **20** | Artifacts v2 | XL | Sprint 19 | 🚫 Blocked | Google Drive / OneDrive connectors |
|
||||
| **20** | Artifacts v2 + RAG | XL | Sprint 19 | 🚫 Blocked | External connectors, Qdrant migration, Q&A |
|
||||
| **21** | MCP Configuration | L | Sprint 18 | 🚫 Blocked | Scoped MCP registry (workspace defaults + project overrides) |
|
||||
| **22** | Rules v1 | XL | Sprint 16, 21 | 🚫 Blocked | Rules schema, auto-record, templates, outputs |
|
||||
| **23** | Analytics | M-L | Sprint 15, 22 | 🚫 Blocked | Conflict detection, usage/evaluations tabs |
|
||||
@@ -300,30 +300,46 @@ All sync infrastructure implemented and tested (validated 2025-12-29):
|
||||
---
|
||||
|
||||
### Sprint 18: Projects v1
|
||||
**Size**: M-L | **Owner**: Backend + Client | **Prerequisites**: Sprint 16
|
||||
**Size**: L | **Owner**: Backend + Client | **Prerequisites**: Sprint 16
|
||||
**Status**: ❌ NOT IMPLEMENTED
|
||||
|
||||
> **Objective**: Introduce a first-class container above meetings/tasks.
|
||||
> **Objective**: Introduce Projects as first-class container with roles, settings, and rule inheritance.
|
||||
|
||||
#### Key Decisions (2025-12-30)
|
||||
|
||||
| Decision | Choice |
|
||||
|----------|--------|
|
||||
| Ownership | Single Workspace (projects scoped to one workspace) |
|
||||
| Roles | Project-level (viewer/editor/admin separate from WorkspaceRole) |
|
||||
| Rules | Merge/inherit (projects inherit workspace rules, can override) |
|
||||
| Migration | Default project per workspace for unassigned meetings |
|
||||
|
||||
#### Missing Components
|
||||
|
||||
| Component | Required Location |
|
||||
|-----------|------------------|
|
||||
| ProjectModel | `persistence/models/project.py` |
|
||||
| Project domain entity | `domain/entities/project.py` |
|
||||
| Project RPCs | proto messages needed |
|
||||
| Project UI | `client/src/pages/Projects.tsx` |
|
||||
| Task domain entity | Currently ORM-only, no gRPC API |
|
||||
| Project entity + ProjectSettings | `domain/entities/project.py` |
|
||||
| ProjectRole enum | `domain/identity/roles.py` |
|
||||
| ProjectMembership entity | `domain/identity/entities.py` |
|
||||
| ProjectModel + ProjectMembershipModel | `persistence/models/project.py` |
|
||||
| ProjectRepository + impl | `ports/` + `repositories/` |
|
||||
| ProjectService | `application/services/project_service.py` |
|
||||
| Project RPCs (8 endpoints) | proto messages needed |
|
||||
| Project UI (sidebar, switcher, settings) | `client/src/components/projects/` |
|
||||
|
||||
**⚠️ Blocker**: Sprint 21 (MCP Config) and Sprint 22 (Rules) depend on project scoping.
|
||||
|
||||
#### Deliverables
|
||||
- `src/noteflow/domain/entities/project.py`
|
||||
- `src/noteflow/infrastructure/persistence/models/project.py`
|
||||
- Project RPCs in proto
|
||||
- `client/src/pages/Projects.tsx`
|
||||
- `src/noteflow/domain/identity/scope.py` — Scope lattice (workspace → project → resource)
|
||||
- `src/noteflow/grpc/_interceptors/scope.py` — Enforce scope on all RPCs
|
||||
- `src/noteflow/domain/entities/project.py` — Project, ProjectSettings, ExportRules, TriggerRules
|
||||
- `src/noteflow/domain/identity/roles.py` — ProjectRole enum with permissions
|
||||
- `src/noteflow/domain/identity/entities.py` — ProjectMembership
|
||||
- `src/noteflow/infrastructure/persistence/models/project.py` — ORM models
|
||||
- `src/noteflow/application/services/project_service.py` — Lifecycle + rule merging
|
||||
- `src/noteflow/grpc/_mixins/project.py` — 8 RPCs (CRUD + membership)
|
||||
- `client/src/components/projects/ProjectSidebar.tsx`
|
||||
- `client/src/components/projects/ProjectSwitcher.tsx`
|
||||
- `client/src/components/settings/ProjectSettingsPanel.tsx`
|
||||
- Alembic migrations for projects, memberships, meeting.project_id
|
||||
|
||||
---
|
||||
|
||||
@@ -350,11 +366,17 @@ All sync infrastructure implemented and tested (validated 2025-12-29):
|
||||
|
||||
---
|
||||
|
||||
### Sprint 20: Artifacts v2
|
||||
### Sprint 20: Artifacts v2 + RAG Migration
|
||||
**Size**: XL | **Owner**: Backend + Client | **Prerequisites**: Sprint 19
|
||||
**Status**: 🚫 BLOCKED
|
||||
|
||||
> **Objective**: Sync from external sources (directories, cloud drives).
|
||||
> **Objective**: External connectors + migrate from pgvector to Qdrant for RAG.
|
||||
|
||||
#### Key Decision (2025-12-30)
|
||||
|
||||
| Decision | Choice | Rationale |
|
||||
|----------|--------|-----------|
|
||||
| RAG Backend | Qdrant | Replace pgvector for better scaling, hybrid search, collection-per-project isolation |
|
||||
|
||||
#### Verified Assets
|
||||
|
||||
@@ -363,12 +385,20 @@ All sync infrastructure implemented and tested (validated 2025-12-29):
|
||||
| StartIntegrationSync RPC | `noteflow.proto:73`, `grpc/_mixins/sync.py:47-105` |
|
||||
| Google OAuth | `oauth_manager.py` with PKCE |
|
||||
| CalendarEventModel | `models/integrations/integration.py:188-255` |
|
||||
| SegmentModel.embedding | `models/core/meeting.py:202-205` (migration source) |
|
||||
|
||||
**Blocked by**: Sprint 19 (Artifacts v1) must be implemented first.
|
||||
|
||||
#### Deliverables
|
||||
- `src/noteflow/infrastructure/artifacts/sources/` — Directory, Drive, OneDrive
|
||||
- `ArtifactSource` domain entity with sync metadata
|
||||
- `src/noteflow/domain/rag/` — Chunk, SearchResult, QAResponse, ports
|
||||
- `src/noteflow/infrastructure/rag/` — Qdrant client, embedding providers, chunking, indexing
|
||||
- `src/noteflow/application/services/qa_service.py` — Q&A orchestration
|
||||
- `SearchProject`, `AskQuestion` RPCs
|
||||
- `client/src/components/qa/QAPanel.tsx` — Q&A interface with citations
|
||||
- `scripts/migrate_to_qdrant.py` — pgvector migration
|
||||
- Docker compose Qdrant service with `rag` profile
|
||||
|
||||
---
|
||||
|
||||
@@ -650,7 +680,12 @@ Week 7-9: Sprint 23 + Sprint 24 + Sprint 25 ─ all can parallelize
|
||||
|----------|--------|--------|-----------|
|
||||
| **Auth Model** | 16 | Local-first | Single user per install, design for multi-user. Reduces Sprint 16 from L → M. |
|
||||
| **OIDC Config** | 17 | Discovery only | Require issuer URL with `.well-known`. Covers 90%+ of providers. |
|
||||
| **Project Ownership** | 18 | Single Workspace | Projects scoped to one workspace; simpler ACL model. |
|
||||
| **Project Roles** | 18 | Project-level | Separate ProjectRole (viewer/editor/admin) from WorkspaceRole. |
|
||||
| **Rule Inheritance** | 18 | Merge/inherit | Projects inherit workspace rules, can add/modify with precedence. |
|
||||
| **Meeting Migration** | 18 | Default project | Each workspace gets 'General' project for unassigned meetings. |
|
||||
| **Artifact Scope** | 19 | Per-workspace | Simpler ACL, easier cross-project sharing. |
|
||||
| **RAG Backend** | 20 | Qdrant | Replace pgvector with dedicated vector DB for scaling, hybrid search, project isolation. |
|
||||
| **MCP Storage** | 21 | Backend DB | Enables team sharing, consistent behavior across devices. |
|
||||
| **Rules Execution** | 22 | Backend-evaluated | Audit trails, single source of truth. Client handles triggers only. |
|
||||
| **Offline Mode** | 12 | Cached read-only | Prevents silent divergence; no mock writes. |
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,8 @@ Get any non-meeting corpus into embeddings and retrievable context. Enable RAG o
|
||||
## Decision: Per-Workspace
|
||||
|
||||
> **Decided**: Artifacts scoped per-workspace by default, can be linked to projects. Simpler ACL model, easier cross-project sharing.
|
||||
> **Default**: If `project_id` is omitted, use the workspace's active project (default project if none set).
|
||||
> **Roles**: Workspace OWNER/ADMIN implies ProjectRole.ADMIN for artifact access.
|
||||
|
||||
---
|
||||
|
||||
@@ -49,11 +51,13 @@ Get any non-meeting corpus into embeddings and retrievable context. Enable RAG o
|
||||
|------|--------|
|
||||
| `ArtifactModel` (metadata, chunks) | M |
|
||||
| `ArtifactChunkModel` with embedding | M |
|
||||
| Project scoping (`project_id`, default routing) | S |
|
||||
| Artifact repositories + ports | M |
|
||||
| File upload endpoint | M |
|
||||
| Text extraction (PDF, DOCX, MD) | L |
|
||||
| Chunking pipeline | M |
|
||||
| Embedding pipeline | M |
|
||||
| `RetrieveContext` RPC | M |
|
||||
| RAG retrieval RPC (align with Sprint 20 `SearchProject`) | M |
|
||||
| Artifact upload UI | M |
|
||||
|
||||
---
|
||||
@@ -62,11 +66,47 @@ Get any non-meeting corpus into embeddings and retrievable context. Enable RAG o
|
||||
|
||||
- `src/noteflow/domain/entities/artifact.py`
|
||||
- `src/noteflow/infrastructure/artifacts/` — Storage, chunking, embedding
|
||||
- `RetrieveContext` RPC for RAG queries
|
||||
- Artifact repositories + ports (domain + infrastructure)
|
||||
- RAG retrieval RPC (align response schema with Sprint 20 SearchProject)
|
||||
- `client/src/pages/Artifacts.tsx`
|
||||
|
||||
---
|
||||
|
||||
## Test Strategy
|
||||
|
||||
### Fixtures to extend or create
|
||||
|
||||
- `tests/conftest.py`: add `workspace_id`, `project_id`, `user_id`, and `artifact_storage_dir` fixtures; extend `mock_uow` with `artifacts` + `artifact_chunks` repos.
|
||||
- `tests/grpc/conftest.py`: add `mock_artifact_repo` and `mock_artifact_chunk_repo` to keep gRPC tests isolated.
|
||||
- New `tests/infrastructure/artifacts/conftest.py`: provide `sample_artifact_file_*` (pdf/docx/md/txt), `artifact_content`, `chunking_service`, and `embedding_provider_stub`.
|
||||
- New `tests/fixtures/artifacts/`: add small representative files for extraction (ASCII-safe if possible).
|
||||
|
||||
### Parameterized tests
|
||||
|
||||
- Extraction per file type: PDF, DOCX, Markdown, TXT.
|
||||
- Chunking strategies and sizes: sentence/paragraph, `max_chunk_size`, `overlap`.
|
||||
- Project scoping: explicit `project_id` vs default active project.
|
||||
- Retrieval limits + filters: `limit`, `chunk_type`, `meeting_id`, `artifact_id`.
|
||||
|
||||
### Core test cases (behavior + robustness)
|
||||
|
||||
- **Domain**: Artifact creation validates required metadata, workspace/project scoping, and default project routing.
|
||||
- **Storage**: Uploaded binary is encrypted at rest; decrypt matches input; tampered ciphertext fails cleanly.
|
||||
- **Extraction**: Handles empty content, corrupted files, non-UTF8, and oversized documents with actionable errors.
|
||||
- **Chunking**: Deterministic chunk IDs, overlap rules enforced, and stable output ordering.
|
||||
- **Embedding**: Embedding called once per chunk batch; dimension mismatches surface as clear errors.
|
||||
- **Retrieval RPC**: Project scoping enforced; default project applied when `project_id` omitted; returns ordered results.
|
||||
|
||||
---
|
||||
|
||||
## Shared Types & Reuse Notes
|
||||
|
||||
- Reuse encrypted asset storage patterns from `infrastructure/audio/` for artifact binary storage.
|
||||
- Reuse vector embedding dimension constant and chunking utilities across meeting + artifact pipelines.
|
||||
- Align RAG response types with Sprint 20 (`SearchResult`, `SearchFilters`) to avoid API churn.
|
||||
|
||||
---
|
||||
|
||||
## Post-Sprint
|
||||
|
||||
- Artifact versioning
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user