From 07169e127409cf8b1a2ab16777effe4b36e6ef0b Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Tue, 6 Oct 2026 14:27:33 -0400 Subject: [PATCH] feat(family): an idea links to the rule topic holding its norms - set_family_topic, the readouts name the rules, the idea row shows the link (milestone 463 step 1 gap, found in step 7, #4993) Step 1 added family_ideas.topic_id but nothing could set it, so the note<->topic link the milestone promised existed only as a column. set_family_topic links or unlinks (0) a topic in a rulebook the caller owns, one idea per topic; the version does not move. get_family_idea and get_family_adoption list the topic's rules; list_family_ideas and the Family page name the topic. The model docstrings no longer claim the topic's rules are platform-scoped in retrieval. Co-Authored-By: Claude Opus 5.5 --- frontend/src/api/family.ts | 11 +++ frontend/src/views/FamilyView.vue | 7 ++ plugin/.claude-plugin/plugin.json | 2 +- plugin/skills/family-canon/SKILL.md | 3 + src/scribe/mcp/server.py | 2 +- src/scribe/mcp/tools/family.py | 21 +++++- src/scribe/models/family.py | 10 ++- src/scribe/services/family.py | 60 +++++++++++++++ tests/test_family_adoption.py | 2 +- tests/test_integration_family_promotion.py | 85 ++++++++++++++++++++++ 10 files changed, 195 insertions(+), 8 deletions(-) diff --git a/frontend/src/api/family.ts b/frontend/src/api/family.ts index 5162b578..45852044 100644 --- a/frontend/src/api/family.ts +++ b/frontend/src/api/family.ts @@ -17,12 +17,23 @@ export interface Criterion { test: string; } +export interface IdeaTopic { + id: number; + title: string; + rulebook_id: number; + /** Present on a single idea's read, not on the list. */ + rules?: { id: number; title: string }[]; +} + export interface FamilyIdea { note_id: number; status: IdeaStatus; applies_when: string; canon_version: number; topic_id: number | null; + /** The rule topic holding the idea's binding norms; null when none is + * linked or the reader does not own its rulebook. */ + topic: IdeaTopic | null; title: string; note_type: string; is_task: boolean; diff --git a/frontend/src/views/FamilyView.vue b/frontend/src/views/FamilyView.vue index 67444c6e..0ca2997f 100644 --- a/frontend/src/views/FamilyView.vue +++ b/frontend/src/views/FamilyView.vue @@ -259,6 +259,12 @@ onMounted(load);
{{ p }}
+

+ Binding rules: + {{ idea.topic.title }} +