Skip to content

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
MetricValue
Files25 (16 backend, 8 Slack, 1 app entry)
LOC~1,850
API routes4 (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 urlMetadata JSON 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
MetricValue
Files3 new (+ 1 modified orchestrator)
LOC~320
Slack changes0

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: AiProviderInterfaceSymfonyAiProvider → 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
MetricValue
Files12 (9 backend, 3 Slack)
LOC~872
AI provider files5 (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

MetricTarget
Total files~40
Total LOC~3,042
Backend files28
Slack files12
Implementation steps3
API routes5
Slack modals3
Entities2 (Category, Knowledge)
Base classes5
AI provider files5