4.8 KiB
4.8 KiB
Task 013: Draft Assembly, Editor, And Generic Preview
Development description: Assemble section scaffolds into a canonical Markdown/MDX draft, provide versioned draft editing, and render a generic rich preview for editor review.
Implementation Details
- Backend endpoints:
POST /api/articles/{article_id}/draft/assembleGET /api/articles/{article_id}/draftsGET /api/articles/{article_id}/drafts/{draft_id}PATCH /api/articles/{article_id}/drafts/{draft_id}
- Markdown is the canonical editable draft format.
- Draft assembly includes:
- Title.
- Meta title.
- Meta description.
- Body Markdown/MDX.
- FAQ block when applicable.
- Visual placeholders.
- Evidence references.
- Unsupported claim warnings.
- Approval-relevant draft edits create new immutable versions.
- Frontend includes:
- Draft editor.
- Generic Markdown/MDX preview.
- Version selector/history.
- Unsupported-claim warnings near content.
- The preview is for editor UX and content-shape validation, not target-site build/runtime validation.
Public Interface
- Editor assembles a draft after production artifacts are ready.
- Editor edits Markdown and metadata.
- Editor views a generic preview.
Acceptance Criteria
- TDD pre-requirement: before implementation, write one failing behavior test that assembles a draft from successful section scaffolds through the public API; proceed one draft behavior at a time and record evidence in
Result. - Draft assembly includes all planned sections in order.
- Draft includes metadata, FAQ, visual placeholders, evidence references, and unsupported claim warnings.
- Draft version 1 is immutable after approval-relevant edits; edits create a new version.
- Generic Markdown/MDX preview renders headings, links, tables, images/placeholders, and FAQ.
- Editor can compare or select draft versions.
- Draft assembly fails clearly if required section scaffolds are missing.
Verification
- Run draft assembly API tests.
- Run frontend editor/preview tests.
- Run Docker Compose smoke flow from production artifacts to previewed draft.
Result
- Status: Completed. Pre-requirement (RED) and implementation (GREEN) finished.
- TDD plan:
- Keep the original RED pre-requirement behavior test for
POST /api/articles/{article_id}/draft/assemble. - Extend backend integration coverage for draft assembly payload completeness, immutable versioning, missing scaffold conflict, unsupported warning propagation, and not-found paths.
- Implement backend drafts application layer and public routes for assemble/list/get/patch.
- Extend shared API contracts (OpenAPI + generated TS types).
- Implement frontend draft editor with version selector, compare summary, and generic markdown preview parser/renderer.
- Add frontend model tests for preview parsing and version comparison.
- Keep the original RED pre-requirement behavior test for
- Red evidence:
- Pre-requirement test
apps/backend/tests/integration/test_draft_assembly_public_api.py::DraftAssemblyPublicApiTest::test_assemble_draft_from_successful_section_scaffoldsinitially failed before implementation. - Observed RED error before implementation:
AssertionError: 201 != 404 : {"detail":"Not Found"}.
- Pre-requirement test
- Green evidence:
POST /api/articles/{article_id}/draft/assembleimplemented and returns201with canonical draft payload.GET /api/articles/{article_id}/drafts,GET /api/articles/{article_id}/drafts/{draft_id}, andPATCH /api/articles/{article_id}/drafts/{draft_id}implemented and covered.- Immutable versioning verified: patch creates
v2+, base draft remains unchanged. - Missing required successful section scaffolds returns clear
409. - Frontend generic preview parser renders headings, links, tables, images/placeholders, and FAQ blocks.
- Frontend editor supports version selection and compare summary.
- Refactor notes:
- Added dedicated backend drafts service (
application/drafts.py) and drafts route module to isolate draft logic from evidence/plan flows. - Extended
article_draftspersistence model with canonical body and metadata lists (faq_items, placeholders, evidence refs, warnings, based_on_draft_id`) for explicit version snapshots.
- Added dedicated backend drafts service (
- Verification output:
PYTHONPATH=/private/tmp/pupline-backend-deps python3 -m unittest apps/backend/tests/integration/test_draft_assembly_public_api.py-> OK (5 tests)PYTHONPATH=/private/tmp/pupline-backend-deps python3 -m unittest apps/backend/tests/integration/test_parallel_production_public_api.py-> OK (6 tests)PYTHONPATH=/private/tmp/pupline-backend-deps python3 -m unittest apps/backend/tests/integration/test_evidence_matrix_public_api.py-> OK (2 tests)node apps/frontend/tests/draft_editor.model.test.mjs-> OKnode apps/frontend/tests/article_detail.model.test.mjs-> OKpnpm --dir apps/frontend typecheck-> OK