Skip to content

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)

  • ClusterCASS / CBT / CHS / CIST / CNE
  • JenjangD3 / D4 / S1 / S2 / S3 / Profesi
  • KampusKarawaci / Medan / Surabaya
  • Funnel stage (derived dari L1) — awareness (1-3) / consideration (4-7) / evaluation (8-9) / action (10) / post-apply (11) / na (12)
  • Urgencybrowse / 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: CategoryL1 type, CATEGORY_L1 constants, CATEGORY_TREE, FUNNEL_STAGE_BY_L1 map, and tests.
  • Cross-reference targets must point at codes that exist in the tree; otherwise the integrity test fails.