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.
Status
Complete — superseded by the MVP. See POC Scope & Achievements for deliverables and MVP Scope for what was added next.
What the POC Validated
Before the step-by-step walkthrough, the POC proved:
- Slack integration patterns (Socket Mode, Bolt SDK)
- Notion bidirectional sync feasibility
- AI summary generation with OpenAI
- Category management and organization
- Content ingestion from Slack messages and URLs
INPUT LAYER (Slack)
Message shortcuts, global shortcuts, App Home
↓
PROCESSING LAYER (Symfony)
Knowledge capture, URL extraction, AI summaries, Notion sync
↓
OUTPUT LAYER
Notion pages, Slack DMs (digests), App Home dashboardWhat the POC Proves
TIP
The POC is intentionally minimal — no subscriptions, no distribution tracking, no digest persistence. It proves the architecture works end-to-end with real data flowing through all layers, including AI-powered summarization.
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).
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.
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, 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→OpenAIService→ OpenAI / OpenRouter - KnowledgeHighlightGenerator with hardcoded Dutch prompt template and AI fallback
- DigestQueryService for read-only domain queries
- 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 phase introduced 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 |