| name | glossary-audit |
| description | Use when: kullanıcı "glossary audit", "term drift", "sözlük kontrol",
"glossary missing", "/pseo-driftcheck" der ya da Disiplin #8 (Glossary
Discipline) enforcement gerekir. GLOSSARY.md drift detect; cross-ref
docs/REFERENCE_INDEX.md ve spec §20; reverse-lookup orphan/missing
term'leri skills/**/SKILL.md'de denetler.
Also use when: yeni skill eklendi (terim katalog tutarlılığı), spec
§20 güncellendi (terim eklendi/çıkarıldı), CI quality gate, fresh
session öncesi glossary sanity check.
Do not use when: schema drift (schema-validate'in işi),
master.xlsx invariants (drift-check'in işi). glossary-audit
AMBER-only warn skill — RED kararı vermez, missing term ya da
orphan term'i sadece liste eder; insan triage'a gerek var.
|
| version | 1.0 |
| status | active |
| category | governance |
| inputs | {"glossary_path":{"type":"string","required":false,"default":"docs/GLOSSARY.md","description":"Glossary kaynağı. Default docs/GLOSSARY.md (alfabetik liste)."},"spec_path":{"type":"string","required":false,"default":"docs/superpowers/specs/2026-04-30-platinum-seo-engine-design.md","description":"Spec design.md path. §20 (Glossary) section'ı extract için."}} |
| outputs | ["outputs/reports/{date}-glossary-audit.md","_state/events.jsonl"] |
| consumes | ["init-project:docs/GLOSSARY.md","init-project:docs/REFERENCE_INDEX.md","init-project:docs/superpowers/specs/2026-04-30-platinum-seo-engine-design.md","init-project:skills/**/SKILL.md"] |
| produces | [] |
| triggers | {"manual":["/pseo-driftcheck"],"natural_language":"\"glossary audit\", \"sözlük kontrol\", \"term drift\",\n\"glossary missing\", \"orphan term\", \"glossary discipline\",\n\"terim eksik\", \"terim drift kontrol\"\n","hooks":[],"scheduled":[]} |
| mcp_tools | {"required":[],"optional":[]} |
| budget | {"uses_paid_mcp":false,"estimated_credits":0} |
| autonomy | {"confidence":"HIGH","requires_approval":false,"safe_auto_execute":true} |
glossary-audit — governance skill (Phase 13)
Read-only term catalog audit. Loads docs/GLOSSARY.md (alphabetical
term registry per Disiplin #8), extracts spec §20 bold-marked terms,
verifies docs/REFERENCE_INDEX.md glossary anchor integrity, and
performs reverse-lookup over skills/**/SKILL.md to surface two drift
classes:
- Orphan terms — listed in GLOSSARY.md but never referenced in any
skill body.
- Missing terms — used in a skill body (Title Case, capitalized
noun) but absent from GLOSSARY.md.
Both classes surface as AMBER warn entries (NOT RED). RED-style
hard-failure is reserved for schema-validate and drift-check.
Read-only contract: master.xlsx MUST NOT be opened. Skill writes
only to outputs/reports/{date}-glossary-audit.md and
_state/events.jsonl.
Foundational Principles (3-layer enforce)
- Truth-verifiable — every "missing term" claim cites the file +
line number where the term was used; every "orphan term" claim
cites GLOSSARY.md line. No prose-fabricated drift claims.
- Profile-aware (5-enum) — defensive whitelist (acronyms common
to all profiles) prevents
solo profile false positives without
exempting enterprise profile from terminology rigor.
- AI suistimal yasağı — the skill MUST NOT call any LLM tool to
"judge" whether a term is glossary-worthy. Terminology curation is
human authority (Süleyman + Disiplin #8).
mcp_tools=[] enforces.
DURUR (no fall-back) conditions
- DURUR #1 —
docs/GLOSSARY.md missing or unparseable → AMBER
exit. Glossary is the source of truth; without it no audit is
possible. The skill DOES NOT fall back to spec §20 (that would
mask Disiplin #8 violation).
- DURUR #2 — orphan term detected → AMBER warn list (NOT RED).
A term in GLOSSARY but unused in any skill could be (a) genuinely
stale, (b) used in docs/spec but not skills (legitimate),
(c) about-to-be-used in a Phase 13+ skill (legitimate). Human
triage determines.
- DURUR #3 — missing term detected → AMBER warn list (NOT RED).
A capitalized term used in a skill body but absent from GLOSSARY
could be (a) Disiplin #8 violation requiring catalog add, (b) a
common acronym (whitelisted), (c) a proper noun (URL, brand name).
Human triage determines.
Inputs (frontmatter contract)
| Name | Type | Default | Notes |
|---|
glossary_path | string | docs/GLOSSARY.md | Alphabetical term registry root. |
spec_path | string | docs/superpowers/specs/2026-04-30-platinum-seo-engine-design.md | spec §20 cross-ref source for term extract. |
Outputs (artifacts produced)
outputs/reports/{date}-glossary-audit.md — orphan list +
missing list + verdict.
_state/events.jsonl — single event_kind=audit row
(audit_action="accessed", audit_target="docs:glossary-audit",
actor="agent:glossary-audit").
8-Step Body Protocol
Step 1 — parse_glossary (DURUR #1)
import os
import sys
import re
from pathlib import Path
sys.path.insert(0, os.getcwd())
glossary_path = Path("docs/GLOSSARY.md")
spec_path = Path("docs/superpowers/specs/2026-04-30-platinum-seo-engine-design.md")
reference_index_path = Path("docs/REFERENCE_INDEX.md")
project_id = "drifttest"
REPO_ROOT = Path.cwd()
glossary_text = glossary_path.read_text(encoding="utf-8")
term_pattern = re.compile(r"^- \*\*([^\*]+)\*\*", re.MULTILINE)
glossary_terms = set(term_pattern.findall(glossary_text))
if not glossary_terms:
raise SystemExit("DURUR #1: GLOSSARY.md unparseable or empty")
Glossary follows the alphabetical bullet pattern documented in
Disiplin #8. The skill counts ~20 terms typical (manager kanıt #12 =
23 lines including header/separator).
Step 2 — extract_spec_section_20
spec_text = spec_path.read_text(encoding="utf-8")
section_re = re.compile(r"^## 20\.[^\n]*\n(.*?)(?=^## \d+\.)", re.MULTILINE | re.DOTALL)
m = section_re.search(spec_text)
section_20 = m.group(1) if m else ""
spec_term_pattern = re.compile(r"^- \*\*([A-Z][^\*]+)\*\*", re.MULTILINE)
spec_terms = set(spec_term_pattern.findall(section_20))
Spec §20 declares the canonical term set. GLOSSARY.md should be a
superset (Phase 0 bootstrap added some + Phase 5+ adds more).
Step 3 — verify_reference_index_anchor
ref_index_text = reference_index_path.read_text(encoding="utf-8")
assert "GLOSSARY.md" in ref_index_text, (
"REFERENCE_INDEX missing glossary anchor"
)
REFERENCE_INDEX is the Q&A "where to look for X?" router; the
glossary anchor MUST be present (link integrity).
Step 4 — scan_skill_bodies_for_terms
skill_terms_used: dict = {}
for skill_md in (REPO_ROOT / "skills").rglob("SKILL.md"):
text = skill_md.read_text(encoding="utf-8")
m = re.match(r"^---\n.*?\n---\n", text, re.DOTALL)
body = text[m.end():] if m else text
candidates = re.findall(r"\b([A-Z][A-Za-z]{1,}(?:\s+[A-Z][A-Za-z]{1,})+)\b", body)
for c in candidates:
skill_terms_used.setdefault(c, []).append(skill_md)
Heuristic: capitalized 2+ token spans are candidates for glossary
terms. False positives are filtered by the whitelist below.
Step 5 — detect_orphan_terms (DURUR #2)
used_set = set(skill_terms_used.keys())
orphan_terms = sorted(glossary_terms - used_set)
Orphan terms surface as AMBER warn list (NOT RED). Manager triages:
keep (used in docs/spec only) vs. remove (genuinely stale).
Step 6 — detect_missing_terms_with_whitelist (DURUR #3)
ACRONYM_WHITELIST = frozenset({
"JSON", "URL", "API", "HTML", "CSS", "SEO", "MCP", "GSC",
"DFS", "AIO", "FAQ", "JSON-LD", "XML", "HTTP", "CSV", "CLI",
"CI", "ADR", "UTC", "SHA", "SHA-256", "UUID", "REST", "TLS",
"F-01", "F-02", "F-03",
})
def _is_rule_id(t: str) -> bool:
return bool(re.match(r"^[FDMR]-\d+$", t))
missing_terms = sorted(
t for t in skill_terms_used
if t not in glossary_terms
and t not in ACRONYM_WHITELIST
and not _is_rule_id(t)
)
Defensive whitelist guards against false positives from common
acronyms and rule IDs (R-XX, F-XX, D-XX, M-XX), but it does NOT make
this a precise detector. The Title-Case heuristic flags every 2+ token
capitalized span absent from GLOSSARY — skill names, step labels, proper
nouns, prose emphasis — so the missing-term list runs to the hundreds
even after the 2+ token requirement and the whitelist (≈360 over the
current skills/ tree; the pre-fix single-token regex flagged ≈1,400).
It is therefore an AMBER advisory candidate list for manager triage,
not an authoritative "these terms are undefined" set: the operator skims
it for genuinely missing glossary entries and ignores the expected
false-positive bulk. The whitelist is conservative; new acronyms must be
added explicitly.
Step 7 — render_report
Write outputs/reports/{date}-glossary-audit.md:
- Glossary terms — count + list.
- Spec §20 terms — count + diff vs glossary (extras / missing).
- Skills using terms — count of distinct candidates.
- Orphan terms — DURUR #2 list (AMBER).
- Missing terms — DURUR #3 list with first-occurrence
file path (AMBER).
- Verdict — GREEN if both lists empty; AMBER otherwise.
Step 8 — emit_audit_event
from scripts.state import events_writer
audit_payload = {
"event_kind": "audit",
"audit_action": "accessed",
"audit_target": "docs:glossary-audit",
"actor": "agent:glossary-audit",
"notes": f"orphans={len(orphan_terms)} missing={len(missing_terms)}",
}
event_kind=audit requires the audit_action + audit_target + actor
triple per events.schema.json allOf. event_type (WORK-only enum)
is NOT used — schema-first override (lesson 31+34) routes governance
signals to audit, never to work.
Master.xlsx WRITE forbidden
glossary-audit MUST NOT call transaction.append, transaction.update,
transaction.delete, or wb.save. It does not open master.xlsx —
the audit operates on docs/ and skills/ exclusively. The test
suite enforces this by regex grep over the production prose.
Why orphan + missing surface as AMBER (not RED)
Disiplin #8 (Glossary Discipline) is a curation discipline, not a
hard schema rule. Both drift classes are signals for human triage:
- An orphan term may be used in
docs/ but not in any skill yet
(Phase 13 future skill will reference it).
- A missing term may be a proper noun the skill body legitimately
introduces.
RED would force an unnecessary halt; AMBER surfaces the signal,
manager triages. This split is symmetric with drift-check's
F-15 manual-triage routing.
Cross-references
- Schemas:
schemas/skill-frontmatter.schema.json (link to body
parser), schemas/events.schema.json (audit branch).
- Cross-modules:
scripts/state/events_writer.py (audit append),
scripts/reporting/render_template.py (report render).
- Tests:
tests/skills/governance/test_glossary_audit.py.
- Sibling governance skills:
schema-validate (schema drift),
drift-check (master.xlsx invariants), load-context
(session wakeup).