POC Implementation Guide
The Proof of Concept validates the core Input → Process → Output loop of the Knowledge Hub in three focused implementation steps. Each step builds on the previous one, delivering a functional foundation that the MVP extends.
What the POC Proves
TIP
The POC is intentionally minimal — no subscriptions, no target groups, no prompt templates. It proves the architecture works end-to-end with real data flowing through all layers, including AI-powered summarization via the Symfony AI Bundle.
Implementation Steps
Step 1 — Input: Create Lists & Add Knowledge
Users organize knowledge through Slack. They create themed lists (categories), add knowledge items via a modal, and save any Slack message as knowledge using the message action (⋮ three-dot menu → "Opslaan in Knowledge Hub").
Three user stories:
- Story 1.1 — Create a list via modal (name, description, icon) from the App Home
- Story 1.2 — Add knowledge via App Home button → empty AddKnowledge modal
- Story 1.3 — Save any Slack message → AddKnowledge modal pre-filled with message text and first URL
Architecture established:
- Full Orchestrator Pipeline: Controller → Orchestrator → PersistenceService → Repository
- Mapper pattern for entity ↔ DTO transformation
- 5 base infrastructure classes (BaseService, BaseDomainService, BaseOrchestrator, BaseMapper, BaseQueryService)
- Slack message action shortcut registration with pre-fill logic
- 2 entities (Category, Knowledge) with ORM relationships
| Metric | Value |
|---|---|
| Files | 25 (16 backend, 8 Slack, 1 app entry) |
| LOC | ~1,850 |
| API routes | 4 (POST/GET /api/categories, POST/GET /api/knowledge) |
Step 2 — Process: Backend Content Extraction
When a knowledge item is saved with a URL, the backend automatically fetches the page, extracts meaningful content from the HTML, and appends it to the knowledge item's content field. The user's original text is never replaced. This is a purely backend enhancement — no new Slack UI.
What changes for users:
- Knowledge items with URLs now contain the full extracted page content appended below the user's notes
- A
urlMetadataJSON field captures extraction details (title, length, truncation status, content type) - No new user actions needed — extraction happens automatically during save
Architecture established:
- Domain Service pattern for content processing (
ContentExtractionService) - HtmlContentExtractor with smart element selection (
<article>→<main>→<body>) - Value Object pattern (
ContentExtractionResult) with factory methods - SSRF protection against localhost/private IP URLs
- Graceful failure handling — extraction errors never block saves
| Metric | Value |
|---|---|
| Files | 3 new (+ 1 modified orchestrator) |
| LOC | ~320 |
| Slack changes | 0 |
Step 3 — Output: AI-Enhanced Digest & DM Delivery
Users generate an ad-hoc digest for any list. The backend queries knowledge items, generates a 2–3 sentence AI summary for each item using the Symfony AI Bundle, and the Slack app delivers a formatted Block Kit DM with summaries and Notion links.
What users can do:
- Click "Digest Maken" on the App Home → select a list and time period
- Receive a formatted DM where each item has an AI-generated summary in Dutch
- Click through to the item's Notion page via embedded links
- If no items exist for the period → polite "Geen items gevonden" message
Architecture established:
- Full AI provider stack:
AiProviderInterface→SymfonyAiProvider→ Symfony AI Platform → OpenAI - DigestAiSummaryGenerator with hardcoded Dutch prompt template and AI fallback
- DigestQueryService for read-only domain queries (extends
BaseQueryService) - DigestOrchestrator coordinating query → AI generation → Notion URL construction
- Mock mode support for deterministic testing without API calls
- Block Kit DM delivery via
client.chat.postMessage()with per-item summaries + Notion links
| Metric | Value |
|---|---|
| Files | 12 (9 backend, 3 Slack) |
| LOC | ~872 |
| AI provider files | 5 (reused by MVP) |
Scope Boundaries
What's Excluded — MVP Deferral Matrix
A complete mapping of every feature excluded from the POC, why it was deferred, and which MVP step will introduce it.
Quick Stats
| Metric | Target |
|---|---|
| Total files | ~40 |
| Total LOC | ~3,042 |
| Backend files | 28 |
| Slack files | 12 |
| Implementation steps | 3 |
| API routes | 5 |
| Slack modals | 3 |
| Entities | 2 (Category, Knowledge) |
| Base classes | 5 |
| AI provider files | 5 |