Question Taxonomy — Reference
This directory holds the prospective-student question taxonomy used for FAQ tagging, future analytics, and shared vocabulary across engineering, content, and admisi teams.
Source of truth (machine-readable):
apps/api/src/services/intentRouter/taxonomy.ts
Source of truth (full tree + discrimination rules):
docs/superpowers/specs/2026-04-30-question-taxonomy-design.md (sections 4–7).
The taxonomy has three levels: - L1 — 12 top-level categories (used for routing & dashboards) - L2 — 69 sub-categories (used for FAQ organization) - L3 — ~304 leaves (used for precise question intent)
Top-level (L1)
| Code | Name | Scope |
|---|---|---|
| 1 | Identitas Kampus | UPH secara keseluruhan — institusi, akreditasi institusi, ranking, alumni, sebaran kampus |
| 2 | Program / Jurusan | Akademik formal — inventory, kurikulum, durasi, akreditasi prodi |
| 3 | Karir & Outcome | Practical exposure & post-grad — magang, koas, prospek kerja, alumni outcome |
| 4 | Biaya Kuliah | Biaya selama kuliah — uang pangkal, SPP, SKS, cicilan, refund |
| 5 | Beasiswa & Bantuan | Skema mengurangi biaya — akademik, prestasi, ekonomi, kerjasama |
| 6 | Pendaftaran & Seleksi | Proses dari "tertarik" → "diterima" — alur, jalur, syarat, tes, formulir, deadline |
| 7 | Eligibility | "Saya/anak saya bisa ga?" — background spesifik (Paket C, transfer, IB, dll) |
| 8 | Kehidupan Kampus | Pengalaman di luar academic content — fasilitas, asrama, UKM, sistem semester |
| 9 | Event & Kunjungan | Pre-apply interaction — Open Day, Info Session, Consultation Day, campus tour |
| 10 | Kontak & Layanan | Info channel komunikasi — email/phone/jam/lokasi kantor |
| 11 | Post-Application | User sudah submit — status pembayaran/dokumen, ganti jurusan, sistem error |
| 12 | Meta / Conversational | Bukan content question — greetings, vague intent, request human, complaint |
Cross-cutting tags (orthogonal — bukan kategori)
- Cluster —
CASS/CBT/CHS/CIST/CNE - Jenjang —
D3/D4/S1/S2/S3/Profesi - Kampus —
Karawaci/Medan/Surabaya - Funnel stage (derived dari L1) — awareness (1-3) / consideration (4-7) / evaluation (8-9) / action (10) / post-apply (11) / na (12)
- Urgency —
browse/blocked/crisis
How to use
TypeScript (in apps/api/):
TypeScript
import {
CATEGORY_L1,
CATEGORY_TREE,
getLeaf,
isValidLeafCode,
deriveFunnelStage,
} from './services/intentRouter/taxonomy';
// L1 named lookup
const beasiswaCode = CATEGORY_L1.BEASISWA; // '5'
// Leaf lookup
const leaf = getLeaf('5.2.1');
// → { code: '5.2.1', name: 'Olahraga (PON, POMNAS, internasional)' }
// Validate format
isValidLeafCode('5.2.1'); // true
isValidLeafCode('5.2'); // false
// Funnel stage from L1
deriveFunnelStage('5'); // 'consideration'
Discrimination rules: see spec section 6 for the 8 boundary rules (Program vs Karir, Biaya vs Pendaftaran, Eligibility vs Pendaftaran, etc).
Maintenance
- Updates to the tree go in
taxonomy.ts. The integrity test (__tests__/taxonomy.test.ts) catches structural drift. - Add a new L1 category requires updating:
CategoryL1type,CATEGORY_L1constants,CATEGORY_TREE,FUNNEL_STAGE_BY_L1map, and tests. - Cross-reference targets must point at codes that exist in the tree; otherwise the integrity test fails.