Skip to content

Commit 8134cb9

Browse files
committed
feat: extend taxonomy schema with relatedTerms and contrastsWith fields and add supporting UI rendering and documentation.
1 parent f832ca0 commit 8134cb9

3 files changed

Lines changed: 248 additions & 2 deletions

File tree

docs/data-schemas.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ Each entry in the master taxonomy array is a JavaScript object representing a co
1616
"broaderTerm": "Agentic Misbehavior",
1717
"definition": "An unintended deviation in an AI agent's behavior that causes it to pursue goals...",
1818
"scopeNote": "Raised during discussion of non-malicious agent misbehavior (2026-03-03)...",
19+
"relatedTerms": ["Agent sabotage"],
20+
"contrastsWith": ["Deterministic operation"],
1921
"workgroups": ["Security & Privacy", "Accuracy & Reliability"]
2022
}
2123
```
@@ -36,8 +38,10 @@ Each entry in the master taxonomy array is a JavaScript object representing a co
3638
* *Rule:* For example, the broader term of `Agent derailment` is `Agentic Misbehavior`.
3739
* *Root nodes:* If the term is a top-level conceptual category, set this to `null`.
3840
* **`definition`** *(String, Required):* A clear, technical, pre-competitive definition.
39-
* *Content Rule:* Vendor-neutral and objective. Do not mention proprietary commercial tools.
41+
* *Content Rule:* Vendor-neutral and objective. If the term represents an adjacent contrasting concept (e.g., *Tool* vs. *Skill*), the definition MUST explicitly state how it differs from its counterpart.
4042
* **`scopeNote`** *(String, Optional):* Captures historical context, meeting review dates, or explanations of conceptual boundaries between working groups.
43+
* **`relatedTerms`** *(Array of Strings, Optional):* Maps associative `skos:related` conceptual linkages (e.g., `["Skill", "Primitive"]`). Defaults to `[]`.
44+
* **`contrastsWith`** *(Array of Strings, Optional):* Explicitly links paired contrasting terms (e.g., `["Tool"]`). Defaults to `[]`.
4145
* **`workgroups`** *(Array of Strings, Required):* The working groups that share interest or joint ownership of this term (e.g., `["Security & Privacy", "Identity & Trust"]`).
4246

4347
---

taxonomy/app.js

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,50 @@ document.addEventListener('DOMContentLoaded', () => {
365365
card.appendChild(notesDiv);
366366
}
367367

368+
if (activeItem.relatedTerms && activeItem.relatedTerms.length > 0) {
369+
const relDiv = document.createElement('div');
370+
relDiv.className = 'card-aliases';
371+
372+
const relLabel = document.createElement('span');
373+
relLabel.className = 'alias-label';
374+
relLabel.textContent = 'Related Concept:';
375+
relDiv.appendChild(relLabel);
376+
377+
activeItem.relatedTerms.forEach(rel => {
378+
const badge = document.createElement('span');
379+
badge.className = 'alias-badge';
380+
badge.style.background = 'rgba(14, 165, 233, 0.15)';
381+
badge.style.border = '1px solid rgba(14, 165, 233, 0.3)';
382+
badge.style.color = '#38bdf8';
383+
appendHighlightedText(badge, rel, query);
384+
relDiv.appendChild(badge);
385+
});
386+
387+
card.appendChild(relDiv);
388+
}
389+
390+
if (activeItem.contrastsWith && activeItem.contrastsWith.length > 0) {
391+
const conDiv = document.createElement('div');
392+
conDiv.className = 'card-aliases';
393+
394+
const conLabel = document.createElement('span');
395+
conLabel.className = 'alias-label';
396+
conLabel.textContent = 'Contrasts With:';
397+
conDiv.appendChild(conLabel);
398+
399+
activeItem.contrastsWith.forEach(con => {
400+
const badge = document.createElement('span');
401+
badge.className = 'alias-badge';
402+
badge.style.background = 'rgba(244, 63, 94, 0.15)';
403+
badge.style.border = '1px solid rgba(244, 63, 94, 0.3)';
404+
badge.style.color = '#fb7185';
405+
appendHighlightedText(badge, con, query);
406+
conDiv.appendChild(badge);
407+
});
408+
409+
card.appendChild(conDiv);
410+
}
411+
368412
const wgDiv = document.createElement('div');
369413
wgDiv.className = 'card-workgroups';
370414

@@ -520,6 +564,50 @@ document.addEventListener('DOMContentLoaded', () => {
520564
card.appendChild(notesDiv);
521565
}
522566

567+
if (item.relatedTerms && item.relatedTerms.length > 0) {
568+
const relDiv = document.createElement('div');
569+
relDiv.className = 'card-aliases';
570+
571+
const relLabel = document.createElement('span');
572+
relLabel.className = 'alias-label';
573+
relLabel.textContent = 'Related Concept:';
574+
relDiv.appendChild(relLabel);
575+
576+
item.relatedTerms.forEach(rel => {
577+
const badge = document.createElement('span');
578+
badge.className = 'alias-badge';
579+
badge.style.background = 'rgba(14, 165, 233, 0.15)';
580+
badge.style.border = '1px solid rgba(14, 165, 233, 0.3)';
581+
badge.style.color = '#38bdf8';
582+
appendHighlightedText(badge, rel, query);
583+
relDiv.appendChild(badge);
584+
});
585+
586+
card.appendChild(relDiv);
587+
}
588+
589+
if (item.contrastsWith && item.contrastsWith.length > 0) {
590+
const conDiv = document.createElement('div');
591+
conDiv.className = 'card-aliases';
592+
593+
const conLabel = document.createElement('span');
594+
conLabel.className = 'alias-label';
595+
conLabel.textContent = 'Contrasts With:';
596+
conDiv.appendChild(conLabel);
597+
598+
item.contrastsWith.forEach(con => {
599+
const badge = document.createElement('span');
600+
badge.className = 'alias-badge';
601+
badge.style.background = 'rgba(244, 63, 94, 0.15)';
602+
badge.style.border = '1px solid rgba(244, 63, 94, 0.3)';
603+
badge.style.color = '#fb7185';
604+
appendHighlightedText(badge, con, query);
605+
conDiv.appendChild(badge);
606+
});
607+
608+
card.appendChild(conDiv);
609+
}
610+
523611
const wgDiv = document.createElement('div');
524612
wgDiv.className = 'card-workgroups';
525613

@@ -803,6 +891,50 @@ document.addEventListener('DOMContentLoaded', () => {
803891
card.appendChild(notesDiv);
804892
}
805893

894+
if (activeItem.relatedTerms && activeItem.relatedTerms.length > 0) {
895+
const relDiv = document.createElement('div');
896+
relDiv.className = 'card-aliases';
897+
898+
const relLabel = document.createElement('span');
899+
relLabel.className = 'alias-label';
900+
relLabel.textContent = 'Related Concept:';
901+
relDiv.appendChild(relLabel);
902+
903+
activeItem.relatedTerms.forEach(rel => {
904+
const badge = document.createElement('span');
905+
badge.className = 'alias-badge';
906+
badge.style.background = 'rgba(14, 165, 233, 0.15)';
907+
badge.style.border = '1px solid rgba(14, 165, 233, 0.3)';
908+
badge.style.color = '#38bdf8';
909+
appendHighlightedText(badge, rel, query);
910+
relDiv.appendChild(badge);
911+
});
912+
913+
card.appendChild(relDiv);
914+
}
915+
916+
if (activeItem.contrastsWith && activeItem.contrastsWith.length > 0) {
917+
const conDiv = document.createElement('div');
918+
conDiv.className = 'card-aliases';
919+
920+
const conLabel = document.createElement('span');
921+
conLabel.className = 'alias-label';
922+
conLabel.textContent = 'Contrasts With:';
923+
conDiv.appendChild(conLabel);
924+
925+
activeItem.contrastsWith.forEach(con => {
926+
const badge = document.createElement('span');
927+
badge.className = 'alias-badge';
928+
badge.style.background = 'rgba(244, 63, 94, 0.15)';
929+
badge.style.border = '1px solid rgba(244, 63, 94, 0.3)';
930+
badge.style.color = '#fb7185';
931+
appendHighlightedText(badge, con, query);
932+
conDiv.appendChild(badge);
933+
});
934+
935+
card.appendChild(conDiv);
936+
}
937+
806938
const wgDiv = document.createElement('div');
807939
wgDiv.className = 'card-workgroups';
808940

0 commit comments

Comments
 (0)