waktu membaca : 20 minutes

Teknik prompt engineering itu rapuh. Pada 80 000 token, aturan penyelarasan Anda terbenam dalam noise, dan LLM lupa apa yang Anda minta di awal percakapan. Solusi saya? Tidak menyelaraskan melalui teks, tetapi melalui l'ruang. Saya telah menyusun workspace pengembangan saya menjadi empat lingkaran kepercayaan konsentris — dari taman rahasia intim hingga pabrik publik — dan setiap lingkaran adalah area fisik dari sistem berkas. LLM tidak perlu dikonfirmasi ulang aturan-aturannya: jalur file mengandung aturan-aturannya. Berikut ini cara kerjanya, dan mengapa arsitektur perataan berbasis ruang ini lebih tahan daripada`system prompt`500 baris.

Ini adalah artikel yang panjang.
Duduklah dengan nyaman.

ketuk

[]

Catatan: Prompt Engineering adalah sebuah kastil pasir

Selama tiga minggu, saya telah mengembangkan plugin Gradle dengan Opencode, menggunakan tiga LLM yang berbeda — Kimi K2.6, GLM-5.1, dan DeepSeek-V4-Pro (yang satu-satunya yang masih bertahan, tetapi itu adalah cerita lainDéjà couverte ici.). Metode tata kelola agenJe l’ai documentée en détail dans un précédent article. berdasarkan file AsciiDoc —AGENT.adoc, INDEX.adoc, PROMPT_REPRISE.adoc— yang memuat ~30 000 token aturan, backlog, dan riwayat di setiap awal sesi.

Dan meskipun infrastruktur dokumen ini, dua hal membuat saya terkesan:

  1. LLM lupa. Meskipun dengan aturan mutlak di awal setiap file EAGER, di atas 60 000 token kumulatif (konteks awal + percakapan), Kimi K2.6 telah mulai mengusulkan`Write`menggugat pada file konfigurasi. GLM-5.1 salah mengidentifikasi token Firebase sebagai placeholder yang harus diganti. Aturan telah ditulis — LLM tidak lagi melihatnya.

  2. Tata kelola itu sendiri menjadi masalah. Setelah mengimplementasikan mekanisme Hot/Warm/ColdArticle sur la rotation de backup. untuk menghindari ledakan konteks, file-file EAGER saya masih berat 1414 barisJ’ai documenté cet audit ici. Tata kelola — yang dirancang untuk melindungi LLM dari saturasi — justru menyaturasi LLM.

Saya membutuhkan sebuah mekanisme penyelarasan yang tidak bergantung pada jumlah token dalam prompt.

Jawaban: berhenti menyelaraskan menurut teks, dan mulai menyelaraskan dengan l'ruang.

Empat Lingkaran Kepercayaan: Ontologi Spasial

folder saya`workspace/(di~/workspace/`) bukan pas sebuah repositori Git. Ini adalah akar dari seluruh pekerjaan saya — kode, dokumentasi, pelatihan, infrastruktur. Dan ia terstruktur dalam empat zona yang bukan konvensi pengaturan, tetapilingkaran kepercayaan konsentrik :

tingkat

label

Zona fisik

CVS

Keterlihatan

0

Taman rahasia

`workspace/`akar

Tidak ada

Intim — pikiran bebas, tanpa commit, tanpa publikasi

1

kotak aman

configuration/

Git privat (solo)

Rahasia, token, arsip visi. Satu orang saja.

2

perpustakaan

office/

Git pribadi (luas)

Data pedagogi, SPG/SPD, skema JSON. Lingkaran kepercayaan teridentifikasi.

4

Bengkel (publik)

foundry/

Git publik (Apache 2.0)

Kode sumber, plugin, tes, dokumentasi teknis.

Tidak ada level 3 dalam tabel. Level 3 adalah level transitoire : itu adalah konten dari`office/`yang telah dianonimkan dan siap untuk dipublikasikan sebagai data terbuka. Tidak memiliki zona fisik khusus — ini adalah kondisi data, bukan lokasi.

Setiap level menjawab pertanyaan spesifik :

  • Di mana menaruh ide yang belum siap untuk dibagikan, bahkan dengan lingkaran terbatas?

  • Di mana menyimpan token API agar tidak bocor ? → selembari (configuration/) Fisik terisolasi. Tidak ada repositori lain yang dapat mereferensikannya secara kesalahan.

  • Dimana membangun bersama sebuah katalog pelatihan dengan suatu OF pilot? → Perpustakaan (office/). Berversi, kolaboratif, tetapi pribad

  • Dimana mengindustrialisasi plugin Gradle sumber terbuka? → pabrik kode`foundry/`). Publik, dapat di-fork, diuji di CI.

Ontologi inidapat dikonsumsi oleh LLM. Saat ia membaca sebuah file dalam`foundry/plantuml-gradle/src/`, dia mengetahui secara tersirat: "saya berada di lingkaran 4 — kode publik, tes wajib, tidak ada rahasia, tidak ada data pendidikan". Dia tidak memerlukan prompt yang mengingatkannya.

Taman Rahasia: Ruang Di Luar CVS

Ini adalah konsep yang paling penting — dan yang paling tidak intuitif.

akar`workspace/tidak memiliki.git/. Dokumen yang tinggal di sana (`WORKSPACE_VISION.adoc, WORKSPACE_AS_PRODUCT.adoc, WORKSPACE_ORGANIZATION.adoc— dan yang Anda baca saat ini, yang turun dari itu) tidak dimaksudkan untuk ditaruh dalam sistem kontrol versi, dibagikan, atau bahkan dibaca oleh siapa pun selain saya. Ini adalahpikiran yang sedang tumbuh.

Taman rahasia itu adalah out-of-CVS secara alami. Ketiadaan pencatatan versi adalah kondisi kebebasan berpikir. Di sini tidak ditulis untuk dibaca — ditulis di sini untuk memperjelas visi sendiri.

Namun kebebasan ini memiliki biaya: satu`rm`kecelakaan, dan ini adalah bulan-bulan pemikiran strategis yang menghilang. Solusinya bukanlah untuk membuat versi taman (karena itu akan menghancurkannya) — adalah untukmencerminkandalam lingkaran yang paling terbatas

.gitignore` sebagai Konfigurasi Tata Kelola

Di akar`workspace/, sebuah file.gitignore`minimal mendeklarasikankebijakan historisasides fichiers du jardin secret :

.goosehints
.goose

Ce .gitignore`tidak memiliki fungsi Git klasik (tidak ada.git/`di akar). Dia bertindak seperti sebuahfile konfigurasi tata kelolayang menjawab pertanyaan tertentu: artefak taman rahasia yang layak untuk dihistorisasi, dan manakah yang hanya bersifat sementara ?

  • File yang tercantum dalam`.gitignore`—.goosehints, .goose— adalah artefak sementara yang dihasilkan oleh agen. Tidak ada nilai strategis. Tidak ada historisasi.

  • File-file`.adoc`dari akar —WORKSPACE_VISION.adoc, WORKSPACE_ORGANIZATION.adoc, WORKSPACE_AS_PRODUCT.adoc, WHAT_THE_GAMES_BEEN_MISSING.adoc, depots_implementes_strategie.adoc, synthese-LLMs-long-contexte.adoc— tidaktidakdi dalam`.gitignore`. Ini artefak yang akan dihistorikan.

Le `.gitignore`adalahskema tata kelola: Semua yang tidak tercantum di sana adalah kandidat snapshot. Dan LLM, dengan membaca file ini, tahu tepat apa yang harus diarsipkan dan apa yang dapat diabaikan — tanpa perlu diingatkan dalam prompt.

Mekanisme Snapshot

Saya telah membuat`configuration/vision-archive/: snapshot ber-tanggal dari semua.adoc`dari akar, commits di repositori pribadi`configuration/`. Setiap sesi brainstorming menghasilkan sebuah snapshot :

DATE=$(date +%Y-%m-%d)
mkdir -p /home/cheroliv/workspace/configuration/vision-archive/$DATE
cp /home/cheroliv/workspace/*.adoc /home/cheroliv/workspace/configuration/vision-archive/$DATE/
cd /home/cheroliv/workspace/configuration && git add vision-archive/ && \
  git commit -m "vision-archive: snapshot $DATE"

Prosedur dipicu pada akhir sesi oleh LLM sendiri, yang mengeksekusi tugas routing global ini. Setiap snapshot mencapture keadaan lengkap dari pemikiran strategis pada saat T.

Sejarah Git dari`configuration/`menjadiBiografi dari pikiran strategis saya. Saya bisa membuat satu`git log — vision-archive/`dan melihat perkembangan visi saya, sesi per sesi, tanggal per tanggal

Contoh nyata dari riwayat setelah sehari bekerja :

$ git -C configuration log --oneline -- vision-archive/
1089d1b vision-archive: fin de session finale 2026-05-03
6b21eaf vision-archive: fin de session 2026-05-03-1300
1690f82 vision-archive: post-article 2026-05-03
28e6593 vision-archive: post-migration 2026-05-03
3707b78 vision-archive: snapshot 2026-05-03 — jardin secret initial

Lima snapshot dalam sehari. Setiap snapshot adalah titik pemulihan. Setiap snapshot adalah jalon dalam pembentukan strategi.

Berkas`configuration/vision-archive/latest/`selalu mengandung sebuahsalinan kerjacuplikan terakhir, berfungsi sebagai referensi cepat tanpa harus menjelajahi riwayat Git.

Dan untuk LLM, ini adalahoracle koherensi: ketika ia mengamati adanya ketidaksesuaian antara implementasi saat ini dan visi yang terarsip pada tanggal sebelumnya, ia dapat melaporkannya.

Vault : configuration/ seperti Spring Cloud Config

`configuration/`tidak hanya berisi arsip dari penglihatan. Fungsinya utama — dan masa depan — adalah menjadi sebuahserver Spring Cloud Config. Semua rahasia, token, kredensial, dan deskriptor infrastruktur berada di sini, dalam repositori Git pribadi yang dapat diakses hanya oleh pemilik.

Mengapa sebuah repositori terpisah daripada sebuah file`.env`di setiap proyek?

  • Push rahasia tidak sengaja : tidak mungkin. Rahasia berada di repositori pribadi yang proyek publik tidak dapat mereferensikan secara salah.

  • Audit : riwayat Git memberikan jejak setiap modifikasi konfigurasi. Siapa yang mengubah apa, kapan, dengan hash SHA apa.

  • Rollback :`git revert`pada konfigurasi yang rusak. Instan, tanpa backup manual.

Perpustakaan: office/ sebagai Data Konsumsi

`office/`is the documentary counterpart of the development work. It contains the blog articles, the technical specifications, the training materials (38 course directories FPA, SPG/SPD, JSON schemas, Bloom/Harrow/Krathwohl taxonomies) — everything that constitutes themateri pembelajaran.

Tapi`office/`bukan hanya sebuah laci untuk dokumen. Ini adalah sebuahsumber data terstrukturbahwasanya plugin Gradle`foundry/`mengkonsumi. Sebuah artikel blog di`office/`adalah sebuah entri yang akan diubah menjadi HTML oleh sebuah plugin. Sebuah SPG AsciiDoc di`office/metiers/FPA/`adalah sebuah artefak yang akan diurai oleh sebuah orchestrator untuk menghasilkan slide, kuis, dan kapsul video.

Et le `build.gradle.kts`pada akar dari`office/`bukan kode bisnis — ini adalahskrip konsumsi ekosistem plugin. Dia berkata: "Ini adalah plugin Gradle yang saya gunakan, ini adalah konteks workspace saya".

Forges : foundry/ sebagai Implementasi

foundry/`mengandungkode industri. 54 repositori Git, yang 7 saat ini diatur oleh beberapa.agents/`. Ini-lah tempat visi menjadi dapat dieksekusi — plugin Gradle, CI/CD, tes JUnit5 + Cucumber.

Hubungan dengan`office/`adalah dua arah :

  • office/→foundry/: data pedagogik adalah bahan baku yang dikonsumsi oleh plugin.

  • foundry/→office/`plugin menghasilkan data yang mengkaya`office/ — le `graph.json`dari graphify-gradle, decks slider yang terkompilasi, laporan build.

Pro/Contra : Alignasi Spasial vs Alignasi Prompt

Mari kita bandingkan kedua pendekatan.

Pendekatan Klasik: Penyelarasan dengan Prompt Awal

✅ Profesional

lawan

Mudah diimplementasikan. Sebuah blok teks dalam system prompt.

Lemah pada konteks panjang : aturan tenggelam setelah 80K token.

Berfungsi untuk aturan umum (ton, format).

Tidak dapat diverifikasi : tidak ada yang mencegah LLM melanggar aturan.

Tidak perlu memikirkan ulang arsitektur proyek.

Tidak dapat dipindahkan : setiap repo mendeclare ulang aturan.

Secara deklaratif : LLM tahu bahwa harus, tapi tidak ada yang menghalangi.

Pendekatan ini : Penyelarasan melalui Ontologi Spasial

✅ Pro

❌ terhadap

Resilien terhadap konteks panjang : aturan berada di jalur file, bukan di prompt yang jauh.

Biaya infrastruktur awal : mengatur workspace dalam lingkaran memakan waktu.

Dapat diverifikasi secara mekanis : sebuah rahasia di`foundry/terdeteksi oleh`git check-ignore.

Membutuhkan disiplin : seorang kontributor baru harus memahami lingkaran.

Transferable : satu`AGENT.adoc`standar mengekspos lingkaran ke setiap proyek baru.

Hanya mencakup batasan spasial — gaya kode tetap ada dalam prompt.

keamanan sejak desain : satu`git push`sejak`foundry/tidak bisa mengekspos`configuration/.

Konsumsi oleh agen non-LLM : sebuah orchestrator Gradle dapat merute sesuai dengan lingkaran.

Keuntungan utama bukan bersifat defensif (keamanan, visibilitas) — inikreatif. Ketika LLM bekerja dalam ruang yang terstruktur oleh sebuah ontologi, dia dapat melakukan sesuatu yang tidak dapat diizinkan oleh prompt apa pun : mengamati delta

Aljabar Relasional dari Workspace dan Delta yang dapat diamati

Ketika LLM menelusuri`foundry/, ia memiliki sebuahkerangka data terstruktur: simpul (plugins, file, tes, dependensi), tepi bertipe (`import, depends_on, generates, tests), relasi komposisi dan urutan (`training-gradle`Ekstrak repositori →`slider-gradle`menghasilkan slide →`capsule-gradle`sunting video

Algebra ini tidak ditulis di mana-mana dalam bentuk jelas — tapi ia dapat diamati. Setiap`build.gradle.kts`menunjukkan dependensi. Setiap`INDEX.adoc`menunjukkan referensi silang

LLM mengamati aljabar ini dan mendeteksi itudelta: selisih antara apa yang sistem sudah mampu menghasilkan dan apa yang visi menggambarkan.

Dari delta ini, ia dapat menentukanpeta ahli bisnis— CDA (Perancang Pengembang Aplikasi, Kotlin/Gradle/JHipster) dan FPA (Pelatihan Profesional Dewasa, Pedagogi/Qualiopi/Bloom) — dan mengidentifikasi apa yang kurang untuk setiap ahli.

Expert CDA (Kotlin/Gradle/JHipster)
  ├── Plugins : jhipster-gradle-plugins, plantuml-gradle,
  │   codebase-gradle
  ├── Delta : pas encore de SPG CDA formalisé,
  │   pas de fine-tuning expert CDA

Expert FPA (Pédagogie/Qualiopi/Bloom)
  ├── Plugins : training-gradle, slider-gradle,
  │   school-backoffice/forms, capsule-gradle
  ├── Matériel : 38 modules cours, SPG/SPD, taxonomies
  └── Delta : parser AsciiDoc→JSON à créer,
      orchestrateur à coder

LLM tidak perlu diberi tahu apa yang harus dilakukan. Delta muncul dari struktur.

Vektor Komposit Konteks : RAG + pgvector + Graphify

Aljabar relasional bukan konstruksi teoretis. Ia terwujud oleh tiga komponen yang membentuk satuvektor komposit konteksuntuk LLM.

Komponen 1 — RAG LangChain4j + PostgreSQL pgvector

Saya sudah memiliki LangChain4j dalam produksi di dua plugin :`slider-gradle`(4 penyedia LLM) dan`plantuml-gradle`(7 penyedia). Embedding ONNX (AllMiniLmL6V2) mengindeks data dari`office/`dan kode sumber dari`foundry/`dalam PostgreSQL + pgvector.

RAG ini beroperasi pada dua dimensi :

  • Dimension data : dokumen`office/`(SPG, articles, formations, skema JSON)

  • Dimensi kode : codebases`foundry/`(sumber Kotlin, uji Cucumber, AGENT.adoc)

Intersepsi mencakup baik apa (domain bisnis) dan bagaimana (implementasi).

Komponen 2 — Knowledge Graph Graphify

Graphify terintegrasi dalam`plantuml-gradle`(109 tes, 380/380 LULUS) dan menghasilkan sebuah`graph.json`— sebuah knowledge graph terstruktur dengan node, edge, dan komunitas yang terdeteksi secara otomatis.

Berbeda dengan RAG yang bekerja berdasarkan similaritas vektor (samar), knowledge graph bekerja berdasarkanrelasi eksak(deterministis) :`graphify query`untuk pertanyaan semantik (~50 token)`graphify path`untuk menavigasi,`graphify explain`untuk menjelaskan.

Komponen 3 — Graphify Inkremental : Sparse, Dapat Diagregasikan, Dapat Dikonsumsi

Ini adalah keputusan arsitektural kunci.

Graphify tidak boleh hidup dalam satu repositori. Harus hidup dengan caratersiardalam setiap plugin :

  1. Setiap plugin memuat satu tugas Gradle`updateKnowledgeGraph`yang memanggil Graphifypada lingkup sendiridan menghasilkan satu`graph.json`lokal.

  2. Skrip build`office/ mengonsumsi`graphify-gradle`dengan`rootDir = /home/cheroliv/workspace`dan menghasilkan sebuah`graph.json globalyang menggabungkan grafik lokal.

  3. RAG dari setiap plugin menginject`graph.json`global sepertifilter konteksuntuk permintaan LLM.

TÂCHE GRADLE (dans chaque plugin)
    ↓
graphify → graph.json (scope local)
    ↓
office/build.gradle.kts → graph.json (scope global)
    ↓
RAG pgvector (dans slider, plantuml, codebase...)
    ↓  ← injection du graph.json comme filtre
LLM (deepseek-v4-pro)
    ↓  ← observation algèbre relationnelle
    ↓  ← détection delta vs cartographies experts
PRIORISATION → prochaine tâche

Hasil: LLM tidak mencari dalam kekosongan — ia menavigasi ruang yang terstruktur oleh knowledge graph. Permintaan tentang génère un diagramme dapat mencapai node-node yang relevan dalam grafik.

Klasifikasi Otomatis GDPR : LLM sebagai Router

Ontologi spasial tidak hanya menyelaraskan LLM — ia memberi padanya sebuahgrid klasifikasi GDPRUntuk mengalirkan setiap data ke zona sahnya

kriteria

Deteksi LLM

Aksi

Tingkat maksimal

Data pribadi (nama, email, IP)

pola`@`, IP, nama proper

Anonimkan →`[OF_PILOTE]`atau router level 2

2

Token / Rahasia / Kredensial

Pola`sk-…​, `ghp_…​, ya29…​

Router →configuration/. Direferensikan oleh`${VAR}`di kode.

1

URL internal

Mengandung`localhost`, IP pribadi

Menganonimkan →${API_URL}

2

Data pedagogik (SPG, kuliah)

Struktur Bloom/Qualiopi

router →office/(tingkat 2). Versi ganda jika ekspor.

3

Kode sumber / uji

Perpanjangan`.kt`, .kts`dalam`foundry/

Router →foundry/. Memeriksa tidak ada rahasia.

4

Pada akhir sesi, LLM mengeksekusi sebuahtugas global:

  1. Pembacaan`.gitignore`akar untuk mengidentifikasi artefak sementara (yang harus dikecualikan dari snapshot) vs artefak strategis (yang harus direkam)

  2. Inventaris semua file`.adoc`dari akar`workspace/`

  3. Penyaringan: pengecualian berkas yang tercantum dalam`.gitignore`, inklusi semua yang lain

  4. Salin ke`configuration/vision-archive/$DATE/dan pembaruan symlink`latest/

  5. Commit dalam repositori`configuration/`dengan pesan terstruktur

  6. Klasifikasi GDPR otomatis setiap file yang dimodifikasi (semua lingkaran)

  7. Routing : data`office/→ commit pribadi, kode`foundry/→./gradlew check, konfigurasi → commit

  8. Laporan terstruktur dengan peringatan GDPR dan konfirmasi arsip

Le `.gitignore`akar bukan berkas konfigurasi Git — ini adalahfile pengelolaan historisasi. Ia menentukan skema yang LLM konsumsi untuk memutuskan berkas mana dari taman rahasia yang masuk ke dalam biograf strategis dan mana yang dapat dibuang.

LLM tidak lagi hanya sebuah generator teks. Ia adalahmanajer informasidari ekosistem — produsen, klasifikator, router.

Roadmap : dari AsciiDoc ke LangGraph4j

Hari ini, tata kelola ini adalah determinist: LLM menerapkan prosedur yang dijelaskan dalam file AsciiDoc. Ini adalahtahap 1— prompt engineering dengan memori LLM.

La fase 2akan mengekstrak setiap langkah dari prosedur dalam sebuahtugas Gradle bertipe:

./gradlew endSessionWorkspace    → snapshot vision-archive
./gradlew endSessionProject      → archive .agents/
./gradlew endSessionReport       → rapport multi-zones

La fase 3akan memodelkan proses akhir sesi sebagaigrafik statusdenganhttps://github.com/langgraph4j/langgraph4j[LangGraph4j]:

[Start] → [Inventaire fichiers modifiés]
       → [Classification RGPD] (nœud ONNX)
       → [Branchement par cercle]
            ├→ cercle 0 → snapshot → commit
            ├→ cercle 2 → anonymisation → commit
            ├→ cercle 4 → archive → commit
            └→ cercle 1 → commit configuration/
       → [Rapport] → [End]

Grafik ini akan versi di CI/CD, dijalankan oleh Gradle, dan dikonfigurasi melalui GitHub Secrets plugin. LLM tidak lagi perlu memutuskan perutean — grafik akan melakukannya.

Apa yang Diselesaikan oleh Arsitektur Ini (dan apa yang tidak Diselesaikan)

Ontologi spasial tidak mencakup semuanya. Konvensi gaya kode, penamaan, pilihan desain arsitektur — semuanya tetap berada dalam prompt. Apa yang diselesaikan oleh ontologi spasial adalahlapisan keamanan dan visibilitas: di mana setiap byte harus hidup, dan siapa yang dapat melihatnya.

Ini adalah apa yang dia sebenarnya bawa:

  1. * tidak ada`git push`accidental dari sebuah rahasia* : rahasia-rahasa berada di`configuration/(cercle 1). Proyek-proyek publik berada di`foundry/(lingkaran 4). Tidak ada jalur yang melewati keduanya.

  2. Tidak ada kode bisnis dalam data :`office/mengandung beberapa.adoc`, beberapa YAML, beberapa skema JSON — tetapi tidak ada`.kt`. Le `build.gradle.kts`yang tinggal di sana adalah skrip konsumsi, bukan kode bisnis.

  3. Tidak ada pemikiran strategis yang diekspos : dokumen visi berada di taman rahasia (akar di luar CVS). Snapshot berada di`configuration/`(kotak aman pribadi). Tidak ada orang, bahkan dalam lingkaran kepercayaan yang diperluas, yang membaca asal-usul strategi.

  4. Prioritasi otomatis : LLM mengamati delta antara aljabar relasional (yang ada) dan pemetaan ahli (yang diperlukan). Tugas pengembangan berikutnya muncul dari delta tersebut.

Kesimpulan: Arsitektur sebagai Diskursus

Saya tidak menaruh manifesto politik di footer situs saya. Saya tidak menaruh aturan etika di prompt saya. Penataan tidak ada dalam teks — itu ada disistem file.

Saat LLM bekerja di ruang ini, ia tidak dapat membocorkan rahasia (jalan ini mencegahnya). Ia tidak dapat mencampurkan data pendidikan dengan kode sumber (zona fisik berbeda). Ia tidak dapat melupakan aturan keamanan sebesar 80.000 token — karena aturan itu tidak ada dalam prompt, melainkan di`workspace/→`configuration/→office/→`foundry/`bahwa setiap pembacaan file mengaktifkan kembali

Ini adalah prinsip secure by design yang diterapkan pada penyelarasan agen: tidak meminta LLM untuk mengingat aturan. Pastikan arsitektur membuat kesalahan menjadi mustahil secara struktural.

Dan sekaligus, ini memberi LLM apa yang tidak dapat diberikan oleh prompt apa pun: kemampuan untukmengertioù ia berada, apa yang ada, apa yang kurang — dan dari itu menyimpulkan apa yang harus dilakukan.

Referensi

Artikel terkait