projects/taxonomy
운영 JSON 번들, SemVer, vocabulary·alias·deprecated·entity model의 개정 규칙을 소유한다.
source of truthcontractgovernanceKnowledge architecture · 2026-07-20
knowledge vault의 taxonomy 설계 원칙, 5계층 번들, LLM 태깅 검증 게이트, frontmatter 거버넌스와 OpenSearch 검색 런타임의 경계를 현재 문서와 코드로 조사했다.
이 설계의 중심은 지능과 결정성을 분리하는 것이다. 사람이나 LLM은 taxonomy가 공개한 digest 안에서 후보 observations를 제안할 뿐이다. canonical 값 결정, alias 치환, 타입·cardinality· 참조 무결성 검증, 저장 허용 여부는 코드가 결정한다.
projects/taxonomy
운영 JSON 번들, SemVer, vocabulary·alias·deprecated·entity model의 개정 규칙을 소유한다.
source of truthcontractgovernanceprojects/taxonomy-query
번들을 입력으로 받아 digest·검증·인덱싱·tags/BM25/hybrid 검색·웹 챗을 실행한다.
consumerOpenSearchfeedbackblue_dress 같은 조합 폭발을 막는다.
누구나 임의 태그를 추가해 빠르지만 동의어·표기 변형·언어 차이가 누적된다.
framework · frameworks · 프레임워크
canonical term을 통제하고 alias가 입력 편의를 흡수한다. deprecated lifecycle로 과거 데이터도 수용한다.
aliases → canonical → lifecycle policy
| 계층 | 질문 | 핵심 필드 | 불변식 |
|---|---|---|---|
| Vocabulary | 어떤 값을 허용하는가? | term, aliases, status, color_code | term 유일, active/deprecated lifecycle |
| Attribute | 어떤 성질을 어떤 타입으로 기록하는가? | key, type, cardinality, vocab_ref | enum/color는 vocab_ref 필수, 나머지는 금지 |
| Category | 대상을 계층 어디에 놓는가? | parent_id, search_path, bindings | 고아·자기참조·순환 금지, path 유일 |
| Entity Model | 대상 내부 객체와 관계를 따로 질의해야 하는가? | entity_types, relation_types | 정의된 type과 유효 endpoint만 참조 |
| Normalization / Rules | 입력을 어떻게 canonicalize하고 진화시키는가? | unicode, alias order, deprecated policy, multi_category | 명시된 순서·수용·경고 정책 적용 |
Category의 유효 attribute 계약은 root→현재 node 경로를 따라 계산된다.
inherit_attributes=false면 누적 binding을 초기화하고, 자식 binding은 같은 key의 부모 binding을 덮어쓴다.
override.allowed_terms는 넓은 vocabulary를 특정 category에서만 좁힌다.
Vocabulary: colors = [red, blue, green, ivory, ...]
Attribute: dominant_color → colors
Category: dress
└─ binding dominant_color
└─ allowed_terms = [red, blue, ivory]
LLM은 schema 작성자가 아니라 제안자다. 저장 경로는 항상 동일한 결정적 validator를 통과한다.
buildTagRecord()로 다시 검증한다.
ERROR가 있으면 record가 생성되지 않으며 파일은 바뀌지 않는다.
문서 저장용 태깅은 category에 바인딩된 required attribute를 모두 요구한다.
짧은 검색어는 모든 필수값을 알 수 없으므로 requireRequired: false로 부분 태깅을 허용한다.
| 행위 | 소유 프로젝트 | 저장 위치 | 규칙 |
|---|---|---|---|
| term/category/attribute 개정 | taxonomy | projects/taxonomy/bundles/*.json |
SemVer, alias/deprecate 우선, 삭제로 하위 호환 파괴 금지 |
| 문서 frontmatter 태깅 | taxonomy | meta_tags: namespace |
기존 type/topics/status 보존, dry-run 기본, --write 명시 |
| 이미지 태깅 | taxonomy | .meta-tags.json sidecar |
원본 이미지 비파괴 |
| 검색용 태깅 | taxonomy-query | untracked cache + OpenSearch | vault 파일을 수정하지 않음 |
| 운영 품질 피드백 | taxonomy-query → taxonomy | untagged 사유, bench 결과 | runtime은 schema를 직접 수정하지 않음 |
기존 term은 즉시 삭제하지 않고 deprecated로 전환한다.
accept_input, store_as_canonical_if_possible, warn_on_use가
과거 입력 수용·canonical 치환·경고를 각각 결정한다. 현행 두 운영 번들은 모두 입력 수용과 경고를 활성화한다.
7 vocab · 45 terms
15 attributes · 29 categories · entity model 없음
6 vocab · 36 terms
10 attributes · 18 categories · 5 entity types · 4 relation types
두 번들은 같은 스키마를 사용하지만 도메인 복잡도에 따라 Entity Model 채택 여부가 다르다. 지식 문서는 문서 전체 metadata로 충분해 entity model이 없고, 배경 사진은 장면 속 객체·관계가 필요해 고급 계층을 사용한다.
taxo-<slug>-v<version> 규칙으로 schema version이 바뀌면 새 인덱스를 사용한다.
현재 인덱스에는 summary와 앞 800자의 excerpt만 저장하고, 웹 챗은 로컬 vault 원문을 읽는다.
Hybrid에서 태그 유추가 실패하면 BM25로 자동 강등해 검색 전체 실패를 막는다.
| 모드 | 질의 | LLM | 실패 시 |
|---|---|---|---|
| tags | canonical category/attribute term 중심 | 기본 필요 | 태그 유추 실패로 종료 |
| bm25 | title/summary/excerpt 텍스트 | 불필요 | 그대로 실행 |
| hybrid | BM25 + 태그 match boost | 기본 필요 | BM25로 강등 |
summary와 excerpt만 가진다. 이 문서는 현재 코드와 프로젝트 README를 기준으로 정리했다.
| 항목 | 상태 | 사실 |
|---|---|---|
| 스키마·거버넌스 | paused | 방법론·번들·태깅 스킬·dry-run 파일럿까지 완료. vault 전량 적용은 범위 밖으로 이관. |
| 검색 런타임 | implemented | 인덱싱, tags/BM25/hybrid, bench, 로컬 웹 챗과 에이전트 스킬 구현 완료. |
| 기존 topics 마이그레이션 | not done | 현재 wiki/topics와 frontmatter topics는 계속 사용 중이며 meta_tags 전량 기록은 하지 않았다. |
| 최신 bench | backlog | 기존 hybrid P@5 0.27 / MRR 0.82는 전문 body 인덱스 시점 수치다. summary/excerpt 스키마 기준 재실행은 남아 있다. |
Vault 내부 진실원과 현재 TypeScript 구현만 사용했다. 외부 일반론은 추가하지 않았다.
Vault 운영 규칙과 query output template을 먼저 확인하고, project README·wiki 개념 문서·운영 번들을 읽었다.
CodeGraph로 TaxonomyFile, buildDigest, buildTagRecord,
ingestDocs, buildIndexMapping의 구조와 호출 관계를 추적했다.
번들 통계는 JSON 원본에서 직접 집계했다.