Forge Schema — TAC-GKOS
version:: "2.3"
The Phase-4 backfill landed (merge 338f729f, 347 notes) — the precondition v2.0 named. Per Tony's in-session ruling: domain is now severity: error, scoped to the 10 JD areas by adding the staging/rogue-queue zones (A-I, J-R, S-Z, _system, Del, Secrets) to exempt_paths — the 86-note rogue queue stays domain: null legally until the Inbox-Triage router drains it. Companion drift view: 📺 02.25 Domain Drift.base. Executed under PLAN-057-build-out-mega-batch (card forge-domain-enum-100pct-and-error-promotion). v2.2 note preserved below.
Adds jd_id as an optional validate-only field (warning). The law it carries: a note's jd_id category digits MUST equal its physical JD category folder (DD-022 R1 — the folder is truth; the field is never trusted over it). The frontmatter contract below validates presence + format; the folder-match cross-check is enforced primarily by the content-router Gate 3b (the capture-time enforcer, live 2026-08-11) — the Forge rule is defense-in-depth, added via the plugin UI (Tony-in-Obsidian step, ADR-007; click-by-click in 2026-08-11-vault-log). Context: the 2026-08-11 sweep corrected 336 stale pre-refactor jd_ids (drift 415 → ~78). Note: the domain warning→error promotion is deliberately not flipped here — it is carded separately (forge-domain-enum-100pct-and-error-promotion) with a JD-area-scoping precondition (the 86-note rogue queue is domainless by design). v2.1 note preserved below.
Adds two optional, validate-only frontmatter fields for the Track-B dual-track capture model: needs_routing (boolean, info) marks an unregistered stub awaiting promotion, and promote_as (enum TN·DD·IDEA, warning) records which family Claude Code mints it into. Plugins never allocate IDs — these fields are the contract Claude Code reads when promoting. Never error. Rationale: ADR-009-registry-safe-capture-surfaces / DD-002-gkos-command-and-capture-surface. v2.0 note preserved below.
Adds the load-bearing domain field as a closed enum of the 10 JD-area values (meta·self·work·create·know·money·live·connect·build·archive) — the routing key that maps 1:1 to the JD areas (P029 / PLAN-044-jd-compliant-tag-routing, 6-seat council 2026-07-25). Still validate-only — shapes/repair OFF, nothing mutates. domain is severity: warning on purpose: warning catches both absence and off-vocabulary values without a wall of red while Phase-4 backfill runs; promote to error after the crosswalk migration lands (every note carrying exactly one domain). type/status stay presence-only by design — the type: value vocabulary is governed by DD-009 / GL-005 §2A (a separate, dry-run-gated enum), and status vocabulary is owned by CLAUDE.md "one home per status vocabulary"; Forge must not launder either. v1.0 history preserved below.
Contract
frontmatter:
required:
- name: domain
type: enum
severity: error
description: "JD-area router (1:1 with the 10 areas). Closed enum — the load-bearing routing field (P029). ERROR since v2.3 (backfill landed 2026-08-11, merge 338f729f); staging zones exempt via exempt_paths."
values:
- meta # 00-09 SYS
- self # 10-19 Self & Development
- work # 20-29 Work & Projects
- create # 30-39 Creative & Content
- know # 40-49 Knowledge & Concepts
- money # 50-59 Finance & Legal
- live # 60-69 Live & Home
- connect # 70-79 Connect & Community
- build # 80-89 Build & Systems
- archive # 90-99 Archive & Vault
- name: type
type: string
severity: error
description: "Every note declares a type (CLAUDE.md vault standard). Value enum belongs to DD-009 / GL-005 §2A subtype vocab — a separate dry-run, not here."
- name: status
type: string
severity: error
description: "Lifecycle/status token. Value constraint intentionally omitted — CLAUDE.md 'one home per status vocabulary' owns the vocabulary; Forge must not launder slot<->project status."
- name: tags
type: list
severity: error
min_items: 1
- name: created
type: date
severity: warning
format: "yyyy-MM-dd"
strict_parse: false
optional:
- name: updated
type: date
severity: warning
format: "yyyy-MM-dd"
strict_parse: false
- name: tac7code
type: string
severity: warning
description: "4-char Note Codes id on substantive docs (exempt: daily notes, templates, fleeting captures)."
- name: aliases
type: list
severity: info
description: "Backward-link preservation on renamed/moved notes (GL-002 §7)."
- name: jd_id
type: string
severity: warning
description: "JD address (NN or NN.MM). LAW (DD-022 R1): the category digits must equal the note's physical JD category folder — folder is truth. Primary enforcement: content-router Gate 3b at capture; this rule is defense-in-depth. Validate-only, never error."
- name: needs_routing
type: boolean
severity: info
description: "Track-B capture-stub marker (PLAN-045 / ADR-009). true = unregistered stub awaiting Claude-Code promotion. Validate-only, never error."
- name: promote_as
type: enum
severity: warning
description: "Which registry family a needs_routing stub becomes on promotion (PLAN-045 / ADR-009). Plugins never mint IDs; Claude Code owns promotion. Validate-only, never error."
values:
- TN
- DD
- IDEA
inline:
allowed:
- name: version
- name: source
ontology:
relationships: {}
tag_rules:
require_namespace: false
unknown_tags: "off"
severity: info
forbidden_namespaces:
- domain # domain lives in the frontmatter field, never as a #domain/* tag
allowed_namespaces:
- meta
- area
- topic
- tool
- moc
- practice
- flashcards
- card-forge
exempt_paths:
- A-I/Forge
- Journal
- 01 GKOS Inbox
- 90-99 Archive & Vault
- S-Z/System/Forge
- .obsidian
- .trash
- .claude
- A-I # staging catch-all — rogue queue lives here legally (v2.3)
- J-R # staging catch-all (v2.3)
- S-Z # staging catch-all (v2.3)
- _system # external-tool mirrors, not curated content (v2.3)
- Del # pending-delete staging (v2.3)
- Secrets # never linted (v2.3)
Part of the k-a system · TOE.KNEE.SEE