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)
CI & Build / Plugin hooks (push) Successful in 15s
CI & Build / Python lint (push) Successful in 2s
CI & Build / TypeScript typecheck (push) Successful in 1m9s
CI & Build / integration (push) Successful in 1m21s
CI & Build / Python tests (push) Successful in 2m2s
CI & Build / Build & push image (push) Successful in 1m29s

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 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 14:27:33 -04:00
co-authored by Claude Opus 5.5
parent b8efff43b4
commit 07169e1274
10 changed files with 195 additions and 8 deletions
+1 -1
View File
@@ -196,7 +196,7 @@ _WRITE_TOOLS = frozenset({
"undo_family_decision",
# family canon — the adoption ledger
"revise_family_idea", "assess_family_adoption", "resolve_family_conflict",
"set_family_references",
"set_family_references", "set_family_topic",
"bind_repo", "unbind_repo",
# snippets, processes, the shape ledger
"create_snippet", "update_snippet", "delete_snippet", "verify_snippet",
+20 -1
View File
@@ -372,12 +372,31 @@ async def set_family_references(note_id: int, snippet_ids: list[int]) -> dict:
return {"references": refs}
async def set_family_topic(note_id: int, topic_id: int) -> dict:
"""Link a family idea to the rule topic that holds its binding norms — the
rules every project on its platforms follows. The note says when the idea
applies and why; the topic's rules say what must hold. One idea per topic.
get_family_idea and get_family_adoption then list those rules, so an
assessment judges against them.
Use it when an idea already has rules written for it, or when you write
rules that exist to carry one idea. The version does not move: linking
changes where the norms are found, not what they say.
Args:
note_id: the family idea.
topic_id: a topic in a rulebook you own (list_rulebooks,
list_topics). 0 unlinks.
"""
return await family_svc.set_topic(current_user_id(), note_id, topic_id)
def register(mcp) -> None:
for fn in (
list_family_ideas, get_family_idea, propose_family_idea,
promote_family_idea, retire_family_idea, undo_family_decision,
list_family_decisions, revise_family_idea, get_family_adoption,
list_family_adoptions, assess_family_adoption, resolve_family_conflict,
set_family_references,
set_family_references, set_family_topic,
):
mcp.tool(name=fn.__name__)(fn)