[{"data":1,"prerenderedAt":624},["ShallowReactive",2],{"\u002Fid\u002Fdocs\u002Fsdd":3},{"id":4,"title":5,"body":6,"description":616,"extension":617,"meta":618,"navigation":619,"path":620,"seo":621,"stem":622,"__hash__":623},"docs\u002Fid\u002Fdocs\u002Fsdd.md","Spec-Driven Development",{"type":7,"value":8,"toc":601},"minimark",[9,18,57,60,65,75,79,89,189,206,211,219,280,284,290,309,332,336,349,375,379,396,400,410,444,448,454,508,530,550,554,581,585],[10,11,12,13,17],"p",{},"CAF mengikuti Spec-Driven Development (SDD). Unit kerjanya adalah spec tertulis,\nbukan pesan chat. Level yang dituju CAF adalah ",[14,15,16],"strong",{},"spec-first, menuju spec-anchored"," —\nbukan spec-as-source.",[19,20,21,37,51],"ul",{},[22,23,24,27,28,32,33,36],"li",{},[14,25,26],{},"Spec-first."," Planner menulis ",[29,30,31],"code",{},"requirements.md"," (hasil, scope, keputusan,\nacceptance criteria, masing-masing dengan baris ",[29,34,35],{},"Verify:",") sebelum satu baris kode\nditulis.",[22,38,39,42,43,46,47,50],{},[14,40,41],{},"Spec-anchored."," Setelah disetujui, spec tetap jadi acuan. Task, implementasi,\nvalidasi, dan review semuanya dicek terhadap acceptance criteria-nya. Agent tidak\npernah mengubah spec yang sudah disetujui; perubahan yang dibutuhkan diusulkan di\n",[29,44,45],{},"verify-report.md"," di bawah ",[29,48,49],{},"## Proposed Spec Changes"," dan manusia yang memutuskan.",[22,52,53,56],{},[14,54,55],{},"Bukan spec-as-source."," Kode tetap sumber kebenaran untuk perilaku. Spec tidak\ndi-generate menjadi kode, dan kode tidak di-generate dari spec.",[10,58,59],{},"Review manusia atas pull request tetap wajib. Tidak ada auto-merge.",[61,62,64],"h2",{"id":63},"alurnya","Alurnya",[66,67,72],"pre",{"className":68,"code":70,"language":71},[69],"language-text","ticket atau chat\n  → Planner      Specify → Clarify → Plan → Tasks\n  → spec gate    opsional, manusia menyetujui spec\n  → implement    caf-frontend \u002F caf-backend, lalu self-verify\n  → Validator    mengecek setiap acceptance criterion\n  → Reviewer     review kualitatif terhadap spec dan diff\n  → pull request\n","text",[29,73,70],{"__ignoreMap":74},"",[61,76,78],{"id":77},"yang-ditulis-planner","Yang ditulis Planner",[10,80,81,82,84,85,88],{},"Planner selalu menulis ",[29,83,31],{}," dan ",[29,86,87],{},"tasks.md",", dan menulis file ketiga bila\nrequest membutuhkannya.",[90,91,92,111],"table",{},[93,94,95],"thead",{},[96,97,98,102,105],"tr",{},[99,100,101],"th",{},"File",[99,103,104],{},"Isi",[99,106,107,108],{},"Baris ",[29,109,110],{},"Status:",[112,113,114,133,161,175],"tbody",{},[96,115,116,121,130],{},[117,118,119],"td",{},[29,120,31],{},[117,122,123,124,127,128],{},"Hasil, scope, finding, assumption, keputusan, constraint, pertanyaan terbuka, dan acceptance criteria bernomor ",[29,125,126],{},"AC-n",", masing-masing dengan baris ",[29,129,35],{},[117,131,132],{},"Ya",[96,134,135,139,158],{},[117,136,137],{},[29,138,87],{},[117,140,141,142,145,146,149,150,153,154,157],{},"Task konkret, dibagi di ",[29,143,144],{},"## Frontend Tasks",", ",[29,147,148],{},"## Backend Tasks",", dan ",[29,151,152],{},"## Docs Tasks",", diakhiri ",[29,155,156],{},"## Coverage",": peta dari tiap criterion ke task yang melayaninya (bukan task)",[117,159,160],{},"Tidak",[96,162,163,168,173],{},[117,164,165],{},[29,166,167],{},"design.md",[117,169,170,171],{},"Desain teknis. Ditulis hanya bila ticket melintasi lebih dari satu app atau service, menambah atau mengubah skema atau migrasi, atau menambah atau mengubah kontrak antar layer. Ketiganya tidak terpenuhi: tidak ada ",[29,172,167],{},[117,174,160],{},[96,176,177,182,187],{},[117,178,179],{},[29,180,181],{},"breakdown.md",[117,183,184,185],{},"Usulan memecah request yang berisi lebih dari satu hasil yang bisa dikirim dan dipakai sendiri-sendiri (item, urutan, dependensi, garis besar acceptance criteria). Satu hasil dengan banyak langkah tidak dipecah; langkahnya masuk ",[29,186,87],{},[117,188,160],{},[10,190,191,84,193,195,196,145,199,149,202,205],{},[29,192,167],{},[29,194,181],{}," tidak punya status sendiri: keduanya ikut persetujuan\nspec. Formatnya ada di skill ",[29,197,198],{},"caf-spec",[29,200,201],{},"caf-design",[29,203,204],{},"caf-breakdown",".",[207,208,210],"h3",{"id":209},"status-sebuah-spec","Status sebuah spec",[10,212,107,213,215,216,218],{},[29,214,110],{}," pertama di ",[29,217,31],{}," bernilai salah satu dari empat:",[90,220,221,231],{},[93,222,223],{},[96,224,225,228],{},[99,226,227],{},"Nilai",[99,229,230],{},"Arti",[112,232,233,243,260,270],{},[96,234,235,240],{},[117,236,237],{},[29,238,239],{},"DRAFT",[117,241,242],{},"Sudah ditulis, belum disetujui",[96,244,245,250],{},[117,246,247],{},[29,248,249],{},"NEEDS_CLARIFICATION",[117,251,252,253,256,257,259],{},"Pertanyaan bertanda ",[29,254,255],{},"BLOCKING"," belum dijawab; ",[29,258,87],{}," tidak ditulis",[96,261,262,267],{},[117,263,264],{},[29,265,266],{},"APPROVED",[117,268,269],{},"Manusia menyetujuinya. Agent tidak lagi mengeditnya",[96,271,272,277],{},[117,273,274],{},[29,275,276],{},"NEEDS_HUMAN",[117,278,279],{},"Run tidak bisa lanjut tanpa keputusan manusia",[207,281,283],{"id":282},"acceptance-criteria-dan-buktinya","Acceptance criteria dan buktinya",[10,285,286,287,289],{},"Setiap acceptance criterion menggambarkan satu perilaku yang teramati dan membawa\nbaris ",[29,288,35],{}," dalam salah satu dari tiga bentuk:",[19,291,292,298,303],{},[22,293,294,297],{},[29,295,296],{},"automated test"," — menyebut file test, atau task yang membuatnya",[22,299,300],{},[29,301,302],{},"command: \u003Ccommand> | expect: \u003Cexit code atau output>",[22,304,305,308],{},[29,306,307],{},"manual"," — manusia yang harus mengecek",[10,310,311,312,314,315,145,318,145,321,324,325,327,328,331],{},"Agent implementasi lalu menulis satu baris bukti per criterion di ",[29,313,45],{},",\ndalam salah satu dari lima bentuk: ",[29,316,317],{},"automated-test",[29,319,320],{},"command",[29,322,323],{},"build-only",",\n",[29,326,307],{},", atau ",[29,329,330],{},"none",". Validator dan Reviewer menilai baris-baris itu.",[61,333,335],{"id":334},"clarify-bertanya-bukan-menebak","Clarify: bertanya, bukan menebak",[10,337,338,339,342,343,345,346,205],{},"Planner membaca repo sebelum bertanya. Fakta yang bisa dibaca tidak pernah jadi\npertanyaan, dan klaim yang tidak bisa disumberkan ditulis ",[29,340,341],{},"Assumption A-n:"," beserta\ndasarnya. Yang harus diputuskan manusia menjadi pertanyaan, bertanda ",[29,344,255],{}," atau\n",[29,347,348],{},"NON-BLOCKING",[10,350,351,352,354,355,145,358,360,361,364,365,370,371,374],{},"Selama pertanyaan ",[29,353,255],{}," belum punya ",[29,356,357],{},"Answer:",[29,359,87],{}," tidak ditulis. Di run\nticket tidak ada yang menjawab di chat, jadi Planner menulis ",[29,362,363],{},"Status: NEEDS_CLARIFICATION","\nlalu berhenti. ",[366,367,369],"a",{"href":368},"\u002Fid\u002Fdocs\u002Fcaf-orchestrator#clarify-dan-spec-gate","CAF Orchestrator"," kemudian\nmem-push draft ke branch dan memposting pertanyaannya sebagai komentar di ticket\n(",[29,372,373],{},"❓ CAF-CLARIFY","). Jawab lewat komentar, picu ticket lagi, dan Planner melanjutkan\ndraft yang sama.",[61,376,378],{"id":377},"spec-gate","Spec gate",[10,380,381,382,385,386,389,390,392,393,395],{},"Ticket berlabel ",[29,383,384],{},"spec-approval"," (bisa dikonfigurasi) berhenti setelah Planner dengan\nDraft PR yang hanya berisi spec. Manusia me-review-nya, mengeditnya di branch bila\nperlu, lalu berkomentar ",[29,387,388],{},"\u002Fcaf-approve-spec",". Orchestrator hanya mengubah baris ",[29,391,110],{},"\nmenjadi ",[29,394,266],{}," dan melanjutkan ke implementasi. Tanpa label, pipeline langsung jalan\nsetelah Planner.",[61,397,399],{"id":398},"spec-yang-disetujui-adalah-kontrak","Spec yang disetujui adalah kontrak",[10,401,402,403,405,406,409],{},"Setelah ",[29,404,31],{}," berstatus ",[29,407,408],{},"Status: APPROVED",":",[19,411,412,421,433],{},[22,413,414,415,417,418,420],{},"Tidak ada agent yang menulis ke sana. Agent implementasi tidak pernah menulis\n",[29,416,31],{}," atau ",[29,419,87],{},"; Reviewer memperlakukan perubahan pada spec yang\ndisetujui sebagai temuan yang memblokir.",[22,422,423,424,426,427,429,430,205],{},"Spec yang ternyata salah, ambigu, atau mustahil dilaporkan di ",[29,425,45],{}," di\nbawah ",[29,428,49],{},", dan run berhenti dengan ",[29,431,432],{},"Status: NEEDS_HUMAN",[22,434,435,436,439,440,443],{},"Komentar review yang meminta perubahan tujuan, scope, atau sebuah criterion\n(",[29,437,438],{},"\u002Fcaf-fix-review",") dicatat sebagai usulan dan ditandai ",[29,441,442],{},"SKIPPED",", tidak pernah diterapkan.",[61,445,447],{"id":446},"validator-dan-reviewer","Validator dan Reviewer",[10,449,450,453],{},[14,451,452],{},"Validator"," memberi tiap acceptance criterion satu status dengan menjalankan buktinya\nsendiri:",[90,455,456,466],{},[93,457,458],{},[96,459,460,463],{},[99,461,462],{},"Status",[99,464,465],{},"Kapan",[112,467,468,483,493],{},[96,469,470,475],{},[117,471,472],{},[29,473,474],{},"PASS",[117,476,477,478,417,480,482],{},"Bukti ",[29,479,317],{},[29,481,320],{}," yang dijalankan Validator sendiri, sesuai dengan criterion",[96,484,485,490],{},[117,486,487],{},[29,488,489],{},"FAIL",[117,491,492],{},"Bukti dijalankan dan hasilnya bertentangan dengan criterion",[96,494,495,500],{},[117,496,497],{},[29,498,499],{},"UNVERIFIED",[117,501,502,503,145,505,507],{},"Yang lain: ",[29,504,307],{},[29,506,323],{},", tidak ada test bernama, command yang tidak boleh dijalankan, atau tidak ada baris bukti",[10,509,510,512,513,515,516,519,520,523,524,526,527,529],{},[29,511,499],{}," tidak pernah membuat report ",[29,514,489],{},", tapi jumlahnya selalu ada di baris\n",[29,517,518],{},"Unverified:",". Di pipeline yang dijalankan CAF Orchestrator, report yang menyatakan\n",[29,521,522],{},"Status: PASS"," padahal setiap criterion ",[29,525,499],{}," diperlakukan sebagai\n",[29,528,276],{},": tidak ada yang terbukti.",[10,531,532,535,536,539,540,145,543,546,547,205],{},[14,533,534],{},"Reviewer"," membaca bukti dan tidak menjalankan test lagi. Ia melaporkan scope\ndeviation, task yang belum dikerjakan, criterion yang butuh pengecekan manusia, dan\npelanggaran ADR, lalu mengakhiri dengan ",[29,537,538],{},"Verdict:"," ",[29,541,542],{},"APPROVE",[29,544,545],{},"CHANGES REQUESTED",", atau\n",[29,548,549],{},"DEFER",[61,551,553],{"id":552},"bahasa","Bahasa",[10,555,556,557,559,560,145,563,145,565,145,568,145,570,145,573,324,575,149,577,580],{},"Planner menulis prosa artifact-nya dalam bahasa penulis ticket, dinilai dari judul dan\nkalimat si penulis sendiri, bukan dari teks UI yang dikutip ticket. Kata-kata yang\ndibaca agent lain dan Orchestrator tetap di semua bahasa: heading section, ",[29,558,110],{},"\nbeserta nilainya, ",[29,561,562],{},"AC-n:",[29,564,35],{},[29,566,567],{},"Finding:",[29,569,341],{},[29,571,572],{},"Q-n",[29,574,255],{},[29,576,357],{},[29,578,579],{},"Tidak ada"," (literal untuk section kosong).",[61,582,584],{"id":583},"apa-yang-ditegakkan-dan-apa-yang-tidak","Apa yang ditegakkan dan apa yang tidak",[10,586,587,588,591,592,594,595,597,598,600],{},"Sebagian besar SDD adalah instruksi yang ditulis ke definisi agent dan skill hasil\ngenerate. ",[29,589,590],{},"caf-init"," tidak mengecek apakah agent mengikutinya. Yang ditegakkan\nOrchestrator lewat kode: berhenti pada ",[29,593,249],{}," atau pertanyaan ",[29,596,255],{},"\nyang belum dijawab, spec gate dan ",[29,599,388],{},", ringkasan acceptance criteria di\nPR, dan allowlist command validator.",{"title":74,"searchDepth":602,"depth":602,"links":603},2,[604,605,610,611,612,613,614,615],{"id":63,"depth":602,"text":64},{"id":77,"depth":602,"text":78,"children":606},[607,609],{"id":209,"depth":608,"text":210},3,{"id":282,"depth":608,"text":283},{"id":334,"depth":602,"text":335},{"id":377,"depth":602,"text":378},{"id":398,"depth":602,"text":399},{"id":446,"depth":602,"text":447},{"id":552,"depth":602,"text":553},{"id":583,"depth":602,"text":584},"Cara CAF bekerja dari spec tertulis — Planner menulisnya, manusia menyetujuinya, dan setiap agent berikutnya dicek terhadapnya.","md",{},true,"\u002Fid\u002Fdocs\u002Fsdd",{"title":5,"description":616},"id\u002Fdocs\u002Fsdd","5F2zBk7m9X6SZ9NWMi3ugnYMRYfsegaoBMtnx3paBgA",1792519414599]