fix(family): the owed task is tagged by the matching System only, and the ground fixtures build without duplicate keys (#4990)
CI & Build / Python lint (push) Successful in 2s
CI & Build / Plugin hooks (push) Successful in 14s
CI & Build / TypeScript typecheck (push) Successful in 53s
CI & Build / integration (push) Successful in 1m4s
CI & Build / Python tests (push) Successful in 1m57s
CI & Build / Build & push image (push) Successful in 44s

assess_family_adoption took system_ids for the task it files, which made
the family tool module look like a System-tagging door and tripped the
parity registry. It is not one: the owed task is tagged to the project's
System matching the idea's canonical area, and update_task retags it.
The unit test for each conflict ground passed evidence/conditions twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 11:11:41 -04:00
co-authored by Claude Opus 5.5
parent 201e09901b
commit 233fa3eea9
3 changed files with 12 additions and 14 deletions
+5 -5
View File
@@ -253,7 +253,6 @@ async def assess_family_adoption(
reason: str,
evidence: list[str] | None = None,
precedent_ids: list[int] | None = None,
system_ids: list[int] | None = None,
) -> dict:
"""Answer one canon family idea for one project. YOU decide; nobody
approves. Judge in this order and stop at the first that holds:
@@ -268,8 +267,10 @@ async def assess_family_adoption(
3. adopted — it applies and the project does it. `evidence` names where
(a file, a commit, a task, a CI run).
4. owed — none of the above. A task is filed in THIS project naming the
gap and the reference implementation for its language. Nothing edits
another repository; the project picks the task up itself.
gap and the reference implementation for its language, filed under
the project's System matching the idea's area (retag it with
update_task if that guess is wrong). Nothing edits another
repository; the project picks the task up itself.
Read get_family_adoption first: answer consistently with its precedents
unless this project differs in a way you can name in `reason`. The
@@ -286,11 +287,10 @@ async def assess_family_adoption(
reason: why — required for every outcome.
evidence: where it is done (required for adopted), or what you checked.
precedent_ids: earlier family decisions you followed, if any.
system_ids: Systems for an owed task. Omit to match the idea's own.
"""
return await adoption_svc.assess(
current_user_id(), project_id, idea_id, outcome=outcome, reason=reason,
evidence=evidence, precedent_ids=precedent_ids, system_ids=system_ids,
evidence=evidence, precedent_ids=precedent_ids,
)