diff --git a/backend/migrations/tenant/20260411000001_create_knowledge_layer_tables.js b/backend/migrations/tenant/20260411000001_create_knowledge_layer_tables.js
index a1bbfd8..1c70097 100644
--- a/backend/migrations/tenant/20260411000001_create_knowledge_layer_tables.js
+++ b/backend/migrations/tenant/20260411000001_create_knowledge_layer_tables.js
@@ -52,11 +52,11 @@ exports.up = async function (knex) {
await knex.schema.createTable('semantic_links', (table) => {
table.uuid('id').primary().defaultTo(knex.raw('(UUID())'));
- table.string('source_entity_type').notNullable();
+ table.string('source_entity_type', 100).notNullable();
table.uuid('source_entity_id').notNullable();
- table.string('target_entity_type').notNullable();
+ table.string('target_entity_type', 100).notNullable();
table.uuid('target_entity_id').notNullable();
- table.string('link_type').notNullable().defaultTo('related_to');
+ table.string('link_type', 100).notNullable().defaultTo('related_to');
table.string('status').notNullable().defaultTo('suggested');
table.string('origin').notNullable().defaultTo('semantic');
table.decimal('confidence', 5, 4).notNullable().defaultTo(0);
diff --git a/frontend/components/knowledge/RecordCommentsPanel.vue b/frontend/components/knowledge/RecordCommentsPanel.vue
new file mode 100644
index 0000000..479edb3
--- /dev/null
+++ b/frontend/components/knowledge/RecordCommentsPanel.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+ Comments
+
+
+
+
+
+
{{ error }}
+
+
+
+
+
+
+ Loading comments...
+
+ No comments yet.
+
+
+
+
+
+ Author: {{ comment.author_user_id }}
+ •
+ {{ formatDate(comment.created_at) }}
+
+
+
+
+
+
+
+
+
{{ comment.content }}
+
+
+
+
+
diff --git a/frontend/components/knowledge/SemanticLinksPanel.vue b/frontend/components/knowledge/SemanticLinksPanel.vue
new file mode 100644
index 0000000..6277516
--- /dev/null
+++ b/frontend/components/knowledge/SemanticLinksPanel.vue
@@ -0,0 +1,220 @@
+
+
+
+
+
+ Semantic Links
+
+
+
+
+
+ Suggested
+ Approved
+ Rejected
+ Dismissed
+ All
+
+
+
+
+ Loading links...
+
+
+ {{ error }}
+
+
+ No links found.
+
+
+
+
+
+ {{ getOtherSide(link).entityType }} · {{ getOtherSide(link).entityId }}
+
+
+ {{ link.link_type }} • {{ link.origin }} • {{ formatConfidence(link.confidence) }}
+
+
+
+
+ Status: {{ link.status }}
+ Updated: {{ formatDate(link.updated_at) }}
+
+
+
{{ link.reason }}
+
+
+
+
+
Evidence
+
+
Source signals:
+
+ -
+ {{ signal.sourceKind }}: {{ signal.text }}
+
+
+
+
+
Matched:
+
+ -
+ {{ match.sourceKind }}: {{ match.text }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/components/views/DetailView.vue b/frontend/components/views/DetailView.vue
index ef17100..def029a 100644
--- a/frontend/components/views/DetailView.vue
+++ b/frontend/components/views/DetailView.vue
@@ -5,6 +5,8 @@ import { Button } from '@/components/ui/button'
import { Separator } from '@/components/ui/separator'
import FieldRenderer from '@/components/fields/FieldRenderer.vue'
import RelatedList from '@/components/RelatedList.vue'
+import RecordCommentsPanel from '@/components/knowledge/RecordCommentsPanel.vue'
+import SemanticLinksPanel from '@/components/knowledge/SemanticLinksPanel.vue'
import { DetailViewConfig, ViewMode, FieldSection, FieldConfig, RelatedListConfig } from '@/types/field-types'
import { Edit, Trash2, ArrowLeft } from 'lucide-vue-next'
import {
@@ -167,6 +169,18 @@ const getFieldsBySection = (section: FieldSection) => {
@create="(objectApiName, parentId) => emit('createRelated', objectApiName, parentId)"
/>
+
+
+
+
+
+
diff --git a/frontend/components/views/DetailViewEnhanced.vue b/frontend/components/views/DetailViewEnhanced.vue
index 7b2f874..1ac046c 100644
--- a/frontend/components/views/DetailViewEnhanced.vue
+++ b/frontend/components/views/DetailViewEnhanced.vue
@@ -7,6 +7,8 @@ import FieldRenderer from '@/components/fields/FieldRenderer.vue'
import PageLayoutRenderer from '@/components/PageLayoutRenderer.vue'
import RelatedList from '@/components/RelatedList.vue'
import RecordSharing from '@/components/RecordSharing.vue'
+import RecordCommentsPanel from '@/components/knowledge/RecordCommentsPanel.vue'
+import SemanticLinksPanel from '@/components/knowledge/SemanticLinksPanel.vue'
import { DetailViewConfig, ViewMode, FieldSection, FieldConfig, RelatedListConfig } from '@/types/field-types'
import { Edit, Trash2, ArrowLeft } from 'lucide-vue-next'
import {
@@ -170,6 +172,9 @@ const visibleRelatedLists = computed(() => {
Sharing
+
+ Knowledge
+
@@ -277,6 +282,20 @@ const visibleRelatedLists = computed(() => {
+
+
+
+
+
+