Problem
Tink validates duplicate names only within a single skillset manifest. It does not prevent a project from activating the same skill name through:
- two different skillsets;
- a standalone skill followed by a skillset member;
- a skillset member followed by a standalone skill.
The library audit found 525 of 527 grouped member names also present as flat library entries, plus a real cross-creator agents-sdk collision. Library coexistence is safe because $TINK_HOME is not the runtime namespace; project coexistence is ambiguous.
Relevant seams:
src/skillsets.rs: validate_members, add, and refresh
src/add.rs: standalone skill add
src/check.rs: project validation
Proposed change
Introduce a single ActiveSkillIndex / ProjectInventory mapping each active skill name to its owner:
- standalone path; or
- skillset root and member path.
Use it before skill add, skillset add, and skillset refresh. Have skill check report conflicts already present in manually constructed or legacy trees. Refresh must exclude the set being replaced from its own preflight.
Conflict errors should name both owners and fail before depositing into the library or mutating the project.
Acceptance
Priority
P0 — namespace integrity.
Problem
Tink validates duplicate names only within a single skillset manifest. It does not prevent a project from activating the same skill name through:
The library audit found 525 of 527 grouped member names also present as flat library entries, plus a real cross-creator
agents-sdkcollision. Library coexistence is safe because$TINK_HOMEis not the runtime namespace; project coexistence is ambiguous.Relevant seams:
src/skillsets.rs:validate_members,add, andrefreshsrc/add.rs: standaloneskill addsrc/check.rs: project validationProposed change
Introduce a single
ActiveSkillIndex/ProjectInventorymapping each active skill name to its owner:Use it before
skill add,skillset add, andskillset refresh. Haveskill checkreport conflicts already present in manually constructed or legacy trees. Refresh must exclude the set being replaced from its own preflight.Conflict errors should name both owners and fail before depositing into the library or mutating the project.
Acceptance
alpha, then set B containingalpha: second add fails without mutation.alpha, then a set containingalpha: set add fails without mutation.alpha, then flatalpha: flat add fails before library deposit.tink skill checkto fail with both owners.Priority
P0 — namespace integrity.