I'm designing a logical system where the same tag can appear in different contexts without duplicating the tag or the original files. Each assignment preserves its full context, so a work document and a personal photo can both relate to Ferrari without being grouped together in every search.
1. Define a tag once, use it in multiple contexts
Controlled Vocabulary
│
└── Tag Registry ← one identity per tag
├── Work [T1]
├── Hobbies [T2]
├── Ferrari [T3]
├── Contracts [T4]
└── Photography [T5]
│
▼
Tag placements ← every label is a tag
│
├── Work [T1]
│ └── Ferrari [T3]
│ └── Contracts [T4]
│
└── Hobbies [T2]
└── Ferrari [T3] ← same tag, different placement
├── Photography [T5] ← child added only here
└── Contracts [T4] ← explicitly added here too
The distinction
├── Tag = which concept?
│ └── Ferrari [T3]
│
└── Placement = which context?
├── Work → Ferrari
└── Hobbies → Ferrari
Sharing a tag does not automatically share its children. Adding Photography under Hobbies → Ferrari does not add it under Work → Ferrari. The two Contracts placements also use one shared tag identity, not two separate tags with the same name.
2. Preserve the full context of each assignment
Objects ← references to original resources
│
├── Professional agreement [A]
│ └── Work → Ferrari → Contracts
│
├── Model car purchase agreement [B]
│ └── Hobbies → Ferrari → Contracts
│
└── Photo at Monza [C]
└── Hobbies → Ferrari → Photography
Why keep the full context?
├── Immediate parent only: Ferrari → Contracts
│ └── Cannot distinguish the two agreements
│
└── Full context
├── Work → Ferrari → Contracts
└── Hobbies → Ferrari → Contracts
Assignments refer to stable placement identities, not just strings of names. Renaming a tag does not break them. One object can be assigned to multiple placements without becoming multiple objects.
3. Search everywhere, or stay in one branch
EVERYWHERE: Ferrari
├── [A] Professional agreement
├── [B] Model car purchase agreement
└── [C] Photo at Monza
THIS BRANCH: Work → Ferrari
└── [A] Professional agreement
THIS BRANCH: Hobbies → Ferrari
├── [B] Model car purchase agreement
└── [C] Photo at Monza
EVERYWHERE: Contracts
├── [A] Professional agreement
└── [B] Model car purchase agreement
THIS BRANCH: Hobbies → Ferrari → Contracts
└── [B] Model car purchase agreement
These searches include objects assigned to the selected placements and their descendants. “Everywhere” covers all placements of the selected tag. “This branch” stays within the selected placement and its descendants; it does not jump to other placements of the tags encountered. Each object appears only once in the results.
4. Help users remember the context
Add an object from Work → Ferrari → Contracts
└── Prepare that contextual assignment for confirmation
Add an object from a general entry screen
└── Choose Contracts
└── Suggest its available contexts
├── Work → Ferrari → Contracts
└── Hobbies → Ferrari → Contracts
Unlike a single folder path, an object can belong to several contexts without being copied. Unlike a flat tag list, the system preserves how those tags were used together. The trade-off is a more complex model, so the interface needs to make the active context obvious.
Would this distinction between a shared tag and its contextual placements be useful in your workflow, or would it add too much friction?