|
|
@@ -0,0 +1,408 @@
|
|
|
+# Data Research V60-V65 Implementation Plan
|
|
|
+
|
|
|
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
|
+
|
|
|
+**Goal:** Upgrade DataOps data research into a tested, evidence-backed ingestion, data-element governance, and multi-domain ontology platform through V60-V65.
|
|
|
+
|
|
|
+**Architecture:** PostgreSQL is the control-plane source of truth for jobs, evidence, candidates, reviews, immutable versions, and publication state. MinIO stores source artifacts, while Neo4j stores the active semantic projection; existing Outbox processing provides idempotent cross-store publication. A new `/api/development/v1` boundary orchestrates existing datasource, metadata, business-domain, knowledge, and graph capabilities without removing legacy APIs.
|
|
|
+
|
|
|
+**Tech Stack:** Python 3.11, Flask, Flask-SQLAlchemy, Alembic, PostgreSQL JSONB, Neo4j, MinIO, SQLAlchemy inspector/catalog queries, pandas/openpyxl, python-docx, pdfplumber, pluggable OCR, Vue 2/Vuetify, pytest.
|
|
|
+
|
|
|
+## Global Constraints
|
|
|
+
|
|
|
+- Use TDD for every production behavior: add one failing test, verify the expected failure, implement minimally, then rerun the focused and phase suites.
|
|
|
+- Preserve `/api/meta`, `/api/bd`, `/api/datasource`, `DataMeta`, and `BusinessDomain-[:INCLUDES]->DataMeta` during compatibility migration.
|
|
|
+- Use stable UUID strings for all new cross-store references; Neo4j integer IDs are legacy compatibility only.
|
|
|
+- Database collection is read-only through `DataSourceConnectionManager.connect(uid, "metadata_collection")`; never accept arbitrary metadata SQL from the client.
|
|
|
+- AI/OCR output is always a candidate with confidence and evidence; it cannot directly publish a data element or ontology.
|
|
|
+- Credentials, connection strings, tokens, and unredacted sensitive samples must not appear in API responses, logs, model requests, or evidence previews.
|
|
|
+- `app/` is primary source. Update `deployment/app/` only through `deployment/sync_release.sh` at V65 release preparation.
|
|
|
+- Every phase ends with focused tests, the complete Python suite, frontend production build when frontend changes exist, and `git diff --check`.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## V60 — Unified model and ingestion foundation
|
|
|
+
|
|
|
+### Task 1: Add ingestion control-plane schema and models
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `migrations/versions/20260722_100_data_research_ingestion.py`
|
|
|
+- Create: `app/models/data_research.py`
|
|
|
+- Modify: `app/models/__init__.py`
|
|
|
+- Modify: `tests/test_database_migrations.py`
|
|
|
+- Test: `tests/data_research/test_ingestion_models.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: `IngestionSource`, `IngestionJob`, `SourceArtifact`, `EvidenceFragment`, `ExtractionCandidate` SQLAlchemy models.
|
|
|
+- Produces: job statuses `created`, `queued`, `extracting`, `normalizing`, `matching`, `awaiting_review`, `published`, `partial`, `failed`, `cancelled`.
|
|
|
+
|
|
|
+- [x] Write migration contract tests asserting the five tables, UUID foreign keys, content-hash/parser-version idempotency key, JSONB evidence locator, status checks, and non-destructive downgrade.
|
|
|
+- [x] Run `PYTHONPATH=. .venv/bin/pytest -q tests/test_database_migrations.py tests/data_research/test_ingestion_models.py` and verify failure because the migration and models do not exist.
|
|
|
+- [x] Implement the additive migration and SQLAlchemy models with `to_dict()` methods that never serialize storage credentials or internal MinIO secrets.
|
|
|
+- [x] Rerun the focused tests and verify they pass.
|
|
|
+
|
|
|
+### Task 2: Implement ingestion state machine and idempotent job service
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/__init__.py`
|
|
|
+- Create: `app/core/data_research/errors.py`
|
|
|
+- Create: `app/core/data_research/models.py`
|
|
|
+- Create: `app/core/data_research/repository.py`
|
|
|
+- Create: `app/core/data_research/ingestion.py`
|
|
|
+- Test: `tests/data_research/test_ingestion_service.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: `IngestionService.create_job(payload, actor_uid)`, `transition(job_uid, target_status, statistics=None, error=None)`, `retry(job_uid)`, and `cancel(job_uid)`.
|
|
|
+- Produces: `IngestionJobSpec`, `JobTransition`, and typed errors `InvalidJobTransition`, `IngestionJobNotFound`, `IngestionPayloadInvalid`.
|
|
|
+
|
|
|
+- [x] Write tests for deterministic idempotency keys, same-input job reuse, force-rerun behavior, allowed/forbidden transitions, retry from failed, cancellation, and redacted error serialization.
|
|
|
+- [x] Run `PYTHONPATH=. .venv/bin/pytest -q tests/data_research/test_ingestion_service.py` and verify failure because the service is absent.
|
|
|
+- [x] Implement pure transition rules and repository-injected orchestration; keep Flask globals out of the core service.
|
|
|
+- [x] Rerun the focused tests and verify they pass.
|
|
|
+
|
|
|
+### Task 3: Add the development API boundary, permissions, and task contracts
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/api/data_development/__init__.py`
|
|
|
+- Create: `app/api/data_development/routes.py`
|
|
|
+- Modify: `app/__init__.py`
|
|
|
+- Modify: `app/core/system/permissions.py`
|
|
|
+- Create: `frontend/src/api/dataDevelopment.js`
|
|
|
+- Test: `tests/data_research/test_development_api.py`
|
|
|
+- Test: `tests/data_research/test_development_frontend_contract.py`
|
|
|
+- Modify: `tests/test_permission_matrix.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: `POST/GET /api/development/v1/ingestion-jobs`, `GET /ingestion-jobs/<uid>`, `POST /<uid>/retry`, and `POST /<uid>/cancel`.
|
|
|
+- Produces: permissions `ingestion:run`, `ingestion:admin`, `evidence:download`, `data-elements:edit`, `data-elements:publish`, `ontologies:edit`, `ontologies:publish`.
|
|
|
+
|
|
|
+- [x] Write API and permission tests for 401, 403, editor create/list, owner cancellation, admin retry, stable response envelopes, and secret-free payloads.
|
|
|
+- [x] Run the focused API/permission tests and verify missing blueprint/permissions failures.
|
|
|
+- [x] Register the blueprint, add monotonic role permissions, inject the service through a testable factory, and add frontend API wrappers.
|
|
|
+- [x] Run focused tests, regenerate `docs/architecture/OPENAPI.yaml`, then rerun architecture artifact tests.
|
|
|
+
|
|
|
+### V60 gate
|
|
|
+
|
|
|
+- [x] Run `PYTHONPATH=. .venv/bin/pytest -q tests/data_research tests/test_database_migrations.py tests/test_permission_matrix.py tests/test_architecture_artifacts.py`.
|
|
|
+- [x] Run `PYTHONPATH=. .venv/bin/pytest -q` and `git diff --check`.
|
|
|
+- [ ] Record evidence in `docs/validation/data-research-v60.md` and commit V60.
|
|
|
+
|
|
|
+## V61 — Database catalog and structured files
|
|
|
+
|
|
|
+### Task 4: Add deterministic SQL, CSV, and Excel extractors
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/extractors/base.py`
|
|
|
+- Create: `app/core/data_research/extractors/sql.py`
|
|
|
+- Create: `app/core/data_research/extractors/csv.py`
|
|
|
+- Create: `app/core/data_research/extractors/excel.py`
|
|
|
+- Create: `app/core/data_research/extractors/registry.py`
|
|
|
+- Test: `tests/data_research/test_structured_extractors.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: `Extractor.can_handle(media_type, filename)`, `extract(stream, context) -> ExtractionBatch`, and evidence locators `sql.statement`, `csv.header`, `excel.sheet/cell_range`.
|
|
|
+- Consumes: existing `DDLParser` only as SQL fallback; deterministic extraction runs first.
|
|
|
+
|
|
|
+- [ ] Write tests for dialect-preserving DDL, multi-table SQL, BOM/delimiter CSV, empty/header-only CSV, multi-sheet Excel, parser version, content hash, and exact evidence positions.
|
|
|
+- [ ] Run the extractor tests and verify missing-registry failures.
|
|
|
+- [ ] Implement bounded streaming extractors and registry selection without reading arbitrary large files into unbounded memory.
|
|
|
+- [ ] Rerun focused tests and existing `tests/test_ddl_parser_view.py`.
|
|
|
+
|
|
|
+### Task 5: Add PostgreSQL and MySQL catalog collectors with snapshot diff
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/catalog/base.py`
|
|
|
+- Create: `app/core/data_research/catalog/postgresql.py`
|
|
|
+- Create: `app/core/data_research/catalog/mysql.py`
|
|
|
+- Create: `app/core/data_research/catalog/service.py`
|
|
|
+- Test: `tests/data_research/test_catalog_collectors.py`
|
|
|
+- Test: `tests/integration/test_data_research_catalog.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: `CatalogCollectionService.collect(data_source_uid, scope) -> CatalogSnapshot` and `diff(previous, current) -> CatalogDiff`.
|
|
|
+- Consumes: `DataSourceConnectionManager.connect(uid, "metadata_collection")` and allowlisted schema/table filters.
|
|
|
+
|
|
|
+- [ ] Write unit tests for generated allowlisted catalog statements, schema/table exclusions, stable field keys, no business-row reads, add/remove/type/rename diffs, and query timeout propagation.
|
|
|
+- [ ] Run unit tests and verify missing collector failures.
|
|
|
+- [ ] Implement dialect collectors and pure snapshot differ; never concatenate untrusted identifiers into SQL.
|
|
|
+- [ ] Run unit tests and, when source containers are available, the integration catalog test.
|
|
|
+
|
|
|
+### Task 6: Implement data-element lifecycle and candidate decisions
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/data_elements.py`
|
|
|
+- Create: `app/core/data_research/candidate_decisions.py`
|
|
|
+- Create: `app/core/data_research/graph_projection.py`
|
|
|
+- Modify: `app/api/data_development/routes.py`
|
|
|
+- Modify: `app/models/data_research.py`
|
|
|
+- Create: `tests/data_research/test_data_element_lifecycle.py`
|
|
|
+- Create: `tests/data_research/test_candidate_decisions.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: lifecycle `candidate -> draft -> in_review -> published -> deprecated -> retired`.
|
|
|
+- Produces: batch decisions `reuse`, `create`, `map`, `ignore`, and outbox event `data_element.version_published`.
|
|
|
+
|
|
|
+- [ ] Write tests for required definitions, stable UID/version increments, optimistic concurrency, invalid lifecycle moves, batch decision atomicity, evidence retention, and no direct candidate publication.
|
|
|
+- [ ] Run focused tests and verify missing service failures.
|
|
|
+- [ ] Implement lifecycle/version services, extend API endpoints, and emit outbox events within the PostgreSQL transaction.
|
|
|
+- [ ] Rerun focused tests plus outbox and cross-store consistency tests.
|
|
|
+
|
|
|
+### V61 gate
|
|
|
+
|
|
|
+- [ ] Run all V61-focused tests and `tests/core/data_source`.
|
|
|
+- [ ] Run the complete Python suite and `git diff --check`.
|
|
|
+- [ ] Record evidence in `docs/validation/data-research-v61.md` and commit V61.
|
|
|
+
|
|
|
+## V62 — Documents, scanned PDFs, and images
|
|
|
+
|
|
|
+### Task 7: Add DOCX and text-PDF evidence extractors
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/extractors/docx.py`
|
|
|
+- Create: `app/core/data_research/extractors/pdf.py`
|
|
|
+- Modify: `app/core/data_research/extractors/registry.py`
|
|
|
+- Test: `tests/data_research/test_document_extractors.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces evidence locators `docx.paragraph/table/row/cell` and `pdf.page/table/bbox`.
|
|
|
+
|
|
|
+- [ ] Write in-memory fixture tests for paragraphs, tables, repeated headers, empty documents, page ordering, and exact evidence locations.
|
|
|
+- [ ] Run focused tests and verify missing extractors.
|
|
|
+- [ ] Implement structured extraction using python-docx and pdfplumber; return OCR-required classification when a PDF page has no usable text.
|
|
|
+- [ ] Rerun focused tests and existing DDL document parser tests.
|
|
|
+
|
|
|
+### Task 8: Add pluggable OCR and scanned-document processing
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/ocr/base.py`
|
|
|
+- Create: `app/core/data_research/ocr/http_provider.py`
|
|
|
+- Create: `app/core/data_research/ocr/service.py`
|
|
|
+- Create: `app/core/data_research/extractors/image.py`
|
|
|
+- Test: `tests/data_research/test_ocr_service.py`
|
|
|
+- Test: `tests/data_research/test_image_extractor.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: `OcrProvider.extract(image_bytes) -> list[OcrBlock]` with text, normalized bounding box, page, and confidence.
|
|
|
+- Produces: a fail-closed HTTP provider with configured endpoint, timeout, TLS verification, response-size limit, and no implicit external default.
|
|
|
+
|
|
|
+- [ ] Write tests with a local fake provider for PNG/JPEG, multi-page scanned PDF page ordering, normalized boxes, low-confidence review flags, provider timeout, malformed response, and disabled-provider failure.
|
|
|
+- [ ] Run tests and verify missing OCR interfaces.
|
|
|
+- [ ] Implement provider abstraction, fail-closed configuration, image extractor, and scanned-PDF page handoff.
|
|
|
+- [ ] Rerun focused tests and verify no source bytes or tokens appear in errors/logs.
|
|
|
+
|
|
|
+### Task 9: Unify file policy, artifact storage, and evidence preview
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/file_policy.py`
|
|
|
+- Create: `app/core/data_research/artifacts.py`
|
|
|
+- Modify: `app/api/data_development/routes.py`
|
|
|
+- Modify: `app/config/config.py`
|
|
|
+- Test: `tests/data_research/test_file_policy.py`
|
|
|
+- Test: `tests/data_research/test_evidence_api.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: one allowlist for SQL, XLS/XLSX, CSV, DOCX, PDF, PNG, JPG/JPEG; legacy DOC returns a deterministic conversion-required error.
|
|
|
+- Produces: `POST /sources/files` and permission-filtered `GET /evidence/<uid>`; full download requires `evidence:download`.
|
|
|
+
|
|
|
+- [ ] Write tests for extension/MIME/magic agreement, size/page limits, legacy DOC rejection, hash deduplication, unsafe filenames, evidence redaction, and download permissions.
|
|
|
+- [ ] Run focused tests and verify failures against current split policies.
|
|
|
+- [ ] Implement the unified policy, MinIO gateway abstraction, artifact hash reuse, and redacted preview endpoint.
|
|
|
+- [ ] Rerun focused tests plus datasource/file security regression tests.
|
|
|
+
|
|
|
+### V62 gate
|
|
|
+
|
|
|
+- [ ] Run all V62-focused tests, the complete Python suite, and `git diff --check`.
|
|
|
+- [ ] Record evidence in `docs/validation/data-research-v62.md` and commit V62.
|
|
|
+
|
|
|
+## V63 — Ontology MVP
|
|
|
+
|
|
|
+### Task 10: Add ontology control-plane schema and repository
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `migrations/versions/20260722_110_data_research_ontology.py`
|
|
|
+- Extend: `app/models/data_research.py`
|
|
|
+- Create: `app/core/data_research/ontology/models.py`
|
|
|
+- Create: `app/core/data_research/ontology/repository.py`
|
|
|
+- Test: `tests/data_research/test_ontology_schema.py`
|
|
|
+- Test: `tests/data_research/test_ontology_repository.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces: `Ontology`, immutable `OntologyVersion`, `OntologyChangeSet`, and `OntologyPublishRun`.
|
|
|
+- Produces graph document fields `classes`, `properties`, `relations`, `constraints`, `domain_links`, and `element_mappings`.
|
|
|
+
|
|
|
+- [ ] Write schema and repository tests for unique ontology codes, immutable published versions, parent version, content hash, many-domain role links, and optimistic draft revisions.
|
|
|
+- [ ] Run focused tests and verify missing schema/repository failures.
|
|
|
+- [ ] Implement additive migration, dataclasses, canonical graph hashing, and repository operations.
|
|
|
+- [ ] Rerun focused and migration tests.
|
|
|
+
|
|
|
+### Task 11: Implement ontology validation, publication, projection, and rollback
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/ontology/validation.py`
|
|
|
+- Create: `app/core/data_research/ontology/publication.py`
|
|
|
+- Create: `app/core/data_research/ontology/projection.py`
|
|
|
+- Test: `tests/data_research/test_ontology_validation.py`
|
|
|
+- Test: `tests/data_research/test_ontology_publication.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces validation codes for duplicate names, dangling edges, inheritance cycles, invalid cardinality, ownerless ontology, and unmapped required property.
|
|
|
+- Produces events `ontology.version_published` and `ontology.rollback_version_created`.
|
|
|
+
|
|
|
+- [ ] Write tests for every validation code, publish idempotency, outbox atomicity, active-version projection, retryable Neo4j failure, version diff, and rollback-as-new-version behavior.
|
|
|
+- [ ] Run focused tests and verify missing service failures.
|
|
|
+- [ ] Implement pure validation, publish transaction, UID-based Neo4j projection, diff, and rollback version creation.
|
|
|
+- [ ] Rerun focused tests plus cross-store/outbox tests.
|
|
|
+
|
|
|
+### Task 12: Add ontology APIs and Vue 2 ontology center
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Modify: `app/api/data_development/routes.py`
|
|
|
+- Modify: `frontend/src/api/dataDevelopment.js`
|
|
|
+- Create: `frontend/src/views/dataGovernance/ontology/index.vue`
|
|
|
+- Create: `frontend/src/views/dataGovernance/ontology/workbench.vue`
|
|
|
+- Modify: `frontend/src/router/routes.js`
|
|
|
+- Test: `tests/data_research/test_ontology_api.py`
|
|
|
+- Test: `tests/data_research/test_ontology_frontend_contract.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces ontology CRUD, graph patch, validate, publish, diff, and rollback endpoints under `/api/development/v1`.
|
|
|
+- Produces permission-gated ontology list and workbench routes.
|
|
|
+
|
|
|
+- [ ] Write API tests for editor drafts, publisher release, multi-domain roles, ETag conflicts, validation errors, and viewer read-only behavior; write source contract tests for routes and secret-free rendering.
|
|
|
+- [ ] Run focused tests and verify missing endpoints/pages.
|
|
|
+- [ ] Implement API handlers and Vue pages with graph JSON editing/preview, validation panel, version diff, and publish confirmation.
|
|
|
+- [ ] Run focused tests and frontend production build.
|
|
|
+
|
|
|
+### V63 gate
|
|
|
+
|
|
|
+- [ ] Run all ontology tests, complete Python suite, frontend build, and `git diff --check`.
|
|
|
+- [ ] Record evidence in `docs/validation/data-research-v63.md` and commit V63.
|
|
|
+
|
|
|
+## V64 — Dynamic ontology and knowledge services
|
|
|
+
|
|
|
+### Task 13: Generate and review explainable ontology change sets
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/ontology/suggestions.py`
|
|
|
+- Create: `app/core/data_research/ontology/change_sets.py`
|
|
|
+- Modify: `app/api/data_development/routes.py`
|
|
|
+- Test: `tests/data_research/test_ontology_suggestions.py`
|
|
|
+- Test: `tests/data_research/test_ontology_change_sets.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces deterministic suggestions from business domains, published data elements, foreign-key evidence, and aliases before optional AI suggestions.
|
|
|
+- Produces decisions `accept`, `reject`, `edit` with actor, reason, evidence UIDs, confidence, and model/prompt version.
|
|
|
+
|
|
|
+- [ ] Write tests for deterministic class/property/relation proposals, evidence-required AI proposals, confidence ordering, conflict detection, partial decisions, and the guarantee that undecided suggestions never publish.
|
|
|
+- [ ] Run focused tests and verify missing services.
|
|
|
+- [ ] Implement rule suggestions, injected AI suggestion port, immutable decision audit, and accepted-change application to a draft version.
|
|
|
+- [ ] Rerun focused tests and ontology publication regressions.
|
|
|
+
|
|
|
+### Task 14: Add JSON/RDF/OWL exchange and governance knowledge synchronization
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/ontology/exchange.py`
|
|
|
+- Create: `app/core/data_research/ontology/knowledge_sync.py`
|
|
|
+- Modify: `app/api/data_development/routes.py`
|
|
|
+- Test: `tests/data_research/test_ontology_exchange.py`
|
|
|
+- Test: `tests/data_research/test_ontology_knowledge_sync.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces deterministic JSON export and bounded RDF/OWL XML export/import with stable platform UIDs.
|
|
|
+- Consumes: `app/core/knowledge/document_builder.py`; produces versioned governance documents only for published ontology versions.
|
|
|
+
|
|
|
+- [ ] Write round-trip tests for classes/properties/relations/domain links, unsafe XML rejection, import size limits, deterministic hashes, secret redaction, and knowledge-document version/hash behavior.
|
|
|
+- [ ] Run focused tests and verify missing exchange/sync modules.
|
|
|
+- [ ] Implement bounded import/export, canonical namespaces, publication-triggered knowledge documents, and idempotent chunk sync.
|
|
|
+- [ ] Rerun focused tests plus governance document builder tests.
|
|
|
+
|
|
|
+### Task 15: Expose read-only semantic queries and MCP context
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/ontology/query.py`
|
|
|
+- Modify: `app/api/data_development/routes.py`
|
|
|
+- Modify: `app/core/mcp/context.py`
|
|
|
+- Test: `tests/data_research/test_semantic_query.py`
|
|
|
+- Test: `tests/mcp/test_data_research_context.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces bounded read-only queries from ontology property to data element, physical field, source evidence, and business domain.
|
|
|
+- Produces MCP context tools that return published data only and enforce permission scope.
|
|
|
+
|
|
|
+- [ ] Write tests for bounded traversal, unpublished exclusion, permission filtering, stable pagination, no arbitrary Cypher input, and MCP result redaction.
|
|
|
+- [ ] Run focused tests and verify missing query/tool behavior.
|
|
|
+- [ ] Implement allowlisted query methods and MCP context adapters.
|
|
|
+- [ ] Rerun focused tests and existing MCP security/runtime suites.
|
|
|
+
|
|
|
+### V64 gate
|
|
|
+
|
|
|
+- [ ] Run all V64-focused, governance knowledge, MCP, complete Python, and frontend build tests.
|
|
|
+- [ ] Record evidence in `docs/validation/data-research-v64.md` and commit V64.
|
|
|
+
|
|
|
+## V65 — Production hardening and acceptance
|
|
|
+
|
|
|
+### Task 16: Add limits, metrics, reconciliation, and recovery
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `app/core/data_research/operations.py`
|
|
|
+- Create: `app/commands/reconcile_data_research.py`
|
|
|
+- Modify: `app/core/system/health.py`
|
|
|
+- Test: `tests/data_research/test_operations.py`
|
|
|
+- Test: `tests/integration/test_data_research_reconciliation.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces metrics for job states/duration, failure stage, candidate acceptance, review time, ontology coverage, and projection lag.
|
|
|
+- Produces reconciliation reports for PostgreSQL versions, Neo4j active projections, MinIO artifacts, and governance documents.
|
|
|
+
|
|
|
+- [ ] Write tests for concurrency/resource limits, stale-job recovery, dead-letter reporting, projection mismatch repair plans, artifact-missing detection, and secret-free health output.
|
|
|
+- [ ] Run focused tests and verify missing operations module.
|
|
|
+- [ ] Implement bounded counters, recovery transitions, read-only audit, explicit repair mode, and health component.
|
|
|
+- [ ] Rerun focused tests plus health/outbox tests.
|
|
|
+
|
|
|
+### Task 17: Complete task center, ingestion, data-element, and ontology UX
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `frontend/src/views/dataGovernance/development/index.vue`
|
|
|
+- Create: `frontend/src/views/dataGovernance/development/ingestion.vue`
|
|
|
+- Create: `frontend/src/views/dataGovernance/development/tasks.vue`
|
|
|
+- Create: `frontend/src/views/dataGovernance/development/review.vue`
|
|
|
+- Modify: `frontend/src/views/dataGovernance/metadata/index.vue`
|
|
|
+- Modify: `frontend/src/router/routes.js`
|
|
|
+- Test: `tests/data_research/test_data_research_frontend_contract.py`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces source selection, scope configuration, upload, progress, evidence preview, batch decisions, data-element lifecycle, ontology generation, validation, publish, and rollback navigation.
|
|
|
+
|
|
|
+- [ ] Write frontend source-contract tests for every required route/API/permission, supported format copy, evidence navigation, status labels, no credential fields, and viewer read-only controls.
|
|
|
+- [ ] Run focused tests and verify missing pages/contracts.
|
|
|
+- [ ] Implement Vue 2 pages using existing list/dialog/form patterns and permission metadata.
|
|
|
+- [ ] Run focused tests and `npm --prefix frontend run build` with Node 24.
|
|
|
+
|
|
|
+### Task 18: Release parity, documentation, and end-to-end acceptance
|
|
|
+
|
|
|
+**Files:**
|
|
|
+- Create: `tests/acceptance/test_data_research_v60_v65.py`
|
|
|
+- Create: `docs/validation/data-research-v60-v65-acceptance.md`
|
|
|
+- Modify: `docs/architecture/ARCHITECTURE_OVERVIEW.md`
|
|
|
+- Modify: `docs/architecture/DATA_MODEL.md`
|
|
|
+- Modify: `docs/architecture/NEXT_ITERATION_ROADMAP.md`
|
|
|
+- Modify: `docs/architecture/OPENAPI.yaml`
|
|
|
+- Modify: `deployment/app/` via `deployment/sync_release.sh`
|
|
|
+
|
|
|
+**Interfaces:**
|
|
|
+- Produces one acceptance entry point covering source ingestion, evidence, data-element publication, two-domain ontology, dynamic change set, publish, rollback, knowledge sync, RBAC, reconciliation, and redaction.
|
|
|
+
|
|
|
+- [ ] Write acceptance tests that initially fail on any missing V60-V65 capability and use deterministic fixtures/fake OCR/AI ports while exercising real Flask services and persistence contracts.
|
|
|
+- [ ] Run `PYTHONPATH=. .venv/bin/pytest -q tests/acceptance/test_data_research_v60_v65.py` and verify requirement-specific failures before final wiring.
|
|
|
+- [ ] Complete release wiring, regenerate OpenAPI, run `deployment/sync_release.sh`, and verify `diff -qr app deployment/app` is empty for application source.
|
|
|
+- [ ] Run the final acceptance matrix below and record exact commands, counts, skips, build output, and environment-limited checks in the acceptance document.
|
|
|
+
|
|
|
+### V65 and final acceptance gate
|
|
|
+
|
|
|
+- [ ] `PYTHONPATH=. .venv/bin/pytest -q tests/data_research tests/acceptance/test_data_research_v60_v65.py`
|
|
|
+- [ ] `PYTHONPATH=. .venv/bin/pytest -q`
|
|
|
+- [ ] `npm --prefix frontend run build`
|
|
|
+- [ ] `python scripts/generate_openapi.py --output docs/architecture/OPENAPI.yaml` followed by `PYTHONPATH=. .venv/bin/pytest -q tests/test_architecture_artifacts.py`.
|
|
|
+- [ ] `diff -qr app deployment/app` and `git diff --check`.
|
|
|
+- [ ] When Docker is available, run catalog, reconciliation, RBAC, MCP, and migration integration tests against `deploy/docker/docker-compose.yml`.
|
|
|
+- [ ] Mark V60-V65 complete only if every non-environment-limited requirement has fresh passing evidence and every skipped external check is explicitly listed with its blocker.
|