SSD Nodes Learn 🎉 VPS $5.50/aydan başlayan
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-21

DeepSeek Harness dsh eklentisi nasıl yazılır?

DeepSeek Harness icin kendi dsh eklentinizi sifirdan olusturun. package.json alanlari, eklentiyi baglayan yama dosyasi ve kullanmaniz gereken iki temel kanca hakkinda bilgi edinin.

dsh eklentisinin gerçekte ne olduğu

Bir dsh eklentisi, bir apply fonksiyonu dışa aktaran ve DeepSeek Harness'a onu yüklemesini söyleyen küçük bir YAML dosyası içeren bir npm paketidir. İlk önce öğrenilmesi gereken ayrı bir eklenti SDK'sı yoktur. dsh bir Cordis uygulamasıdır ve "her şey bir eklentidir" ifadesi gerçektir: araç kayıt defteri, aracı döngüsü, oturum deposu ve web sunucusu, paketinizin katıldığı aynı eklenti ağacındaki satırlardır.

Cordis, bağımsız olarak oluşturulmuş ve yıllardır Koishi sohbet botu çerçevesinin temeli olarak kullanılan genel bir kompozisyon çerçevesidir. Yükleme ve kaldırma işlemlerini yönetir ve eklentiler arasındaki bağımlılıkları çözer. Aracılar hakkında hiçbir şey bilmez. Aracı şeklindeki her şey, üzerine katmanlanan harness paketlerinden gelir; bu yüzden aşağıdaki eklenti şekli bu kadar küçük görünür. Elde ettiğiniz şeylerin çoğu kalıtım yoluyla gelir.

Bir eklentinin iki yarısı vardır. Ana bilgisayar (host) tarafı Node içinde çalışır, araçları ve olay dinleyicilerini kaydeder ve kendi servislerini sağlayabilir. Tarayıcı tarafı ise Web arayüzü içinde çalışır ve arayüz yuvalarını kaydeder. İlk eklenti neredeyse her zaman sadece ana bilgisayar tarafındadır, bu yüzden tarayıcı tarafını ihtiyacınız olana kadar isteğe bağlı olarak değerlendirin.

Bu kılavuz, 19 Ağustos 2026 tarihli npm latest etiketi olan @deepseek-ai/dsh sürüm 0.1.0-rc.7'ye göre yazılmıştır. dsh bir geliştirici önizlemesidir ve kendi README dosyası, uyumluluğu bozacak değişikliklerin olacağını belirtmektedir. Aşağıdaki her anahtar adı, o tarihte yukarı akış belgelerinden ve depodan okunmuştur. Birine bağımlı hale gelmeden önce onları tekrar okuyun, çünkü bir önizleme API'si sürüm adayları arasında alan adlarını yeniden adlandırabilir. Eğer harness henüz çalışmıyorsa, önce VPS üzerinde DeepSeek Harness ve dsh API anahtarı ve model yapılandırması ile kurulumu yapın, ardından buraya geri dönün.

Herhangi bir paketleme yapmadan önce bir karalama dosyası yükleyin

Önce paketleme yapmak, bu süreci öğrenmenin yavaş yoludur. Tek bir dosya yükleyin, çalışma zamanının kodunuzu çağırdığını kanıtlayın ve ardından paketleyin.

Harness checkout dizininin dışında bir klasör oluşturun ve içine bir dosya yerleştirin.

import type { Context } from '@deepseek-ai/cordis'

export const name = 'hello-plugin'

export function apply(ctx: Context) {
  console.log('[hello-plugin] plugin loaded')
}

export const name, eklentiyi tanılama sırasında etiketlemek için kullanılan bir meta veridir. apply ise tüm sözleşmedir: Cordis bunu bir kez çağırır ve eklentinize özel bir bağlam (context) iletir. Bu bağlam üzerinde kaydettiğiniz her şey, eklenti kaldırıldığında sizin yerinize geri alınır.

Bunun yanına cordis.yml dosyasını yazın.

- insert:
    - id: hello
      name: '/absolute/path/to/scratch-plugin/hello.ts'

Şimdi bu dosya en üstte olacak şekilde bir profil başlatın.

dsh web --patch ./scratch-plugin/cordis.yml

Eğer dsh, PATH değişkeninizde tanımlı değilse, npx @deepseek-ai/dsh web --patch ./scratch-plugin/cordis.yml aynı işi görür. Bu npx yolu, size bu kılavuzda açıklanan sürüm yerine önbelleğe alınmış daha eski bir sürüm adayı sunabilir; bu nedenle, eğer harness belgelenmiş bir bayrağı (flag) doğrudan reddederse, kendi dosyanızdan şüphe duymadan önce dsh kurulumu ve sürüm hataları için düzeltmeler kısmını inceleyin. dsh'ı başlattığınız terminalde [hello-plugin] plugin loaded ifadesini görmelisiniz. Eğer hiçbir şey görünmüyorsa, satır çözümlenmemiş demektir.

name alanı bir npm paket adı veya dosya sistemi yolu alır; yukarı akış belgeleri, yolun mutlak (absolute) olması gerektiğini belirtir. Göreli bir ./hello.ts, karalama eklentisi çıktı üretmediğinde kontrol edilmesi gereken ilk şeydir. İkincisi ise dosya uzantısıdır. Belgelenmiş döngü, harness deposunun bir kopyasından pnpm dsh web --patch ... olarak çalıştırılır; burada TypeScript girdileri tsx aracılığıyla yüklenir. Eğer dsh'ınız npm üzerinden geldiyse, satırı düz JavaScript'e yönlendirin veya dosyayı önce derleyin.

--patch bir başlatıcı bayrağıdır ve katmanı, tüm paketlerden ve kendi profil yamanızdan sonra en son uygulanır. Bu nedenle bir karalama katmanı her zaman önceliklidir; yineleme yaparken tam olarak istediğiniz şey de budur.

İşe yarar bir şey yapan en küçük aracı yazın

Bir günlük satırı, eklentinin yüklendiğini kanıtlar. Bir araç ise eklentinin aracı yazılımın bir parçası olduğunu kanıtlar.

import type { Context } from '@deepseek-ai/cordis'
import { defineTool } from '@deepseek-ai/dsh-tools'

export const name = 'greet-tool'
export const inject = ['tools']

export function apply(ctx: Context) {
  ctx.tools.register(defineTool({
    name: 'greet',
    description: 'Greet someone by name.',
    parameters: {
      name: { type: 'string', required: true, description: 'The name to greet' },
    },
    output: {
      schema: { type: 'string' },
      render: (_args, value) => [{ type: 'text', text: value }],
    },
    async execute(args) {
      return `Hello, ${args.name}!`
    },
  }))
}

export const inject = ['tools'], insanların atladığı satırdır. Cordis yapılandırmasındaki girdiler eş zamanlı olarak başlar, bu nedenle bir satırın dosyadaki konumu yükleme sırası hakkında hiçbir garanti vermez. Sıralama, tanımlanan bağımlılıklardan gelir. inject, Cordis'e apply öğenizi çağırmadan önce ctx.tools var olana kadar beklemesini söyler; bu olmadan kodunuz, kayıt defterinin henüz kayıt için hazır olmadığı bir anda çalışabilir.

Nesnenin geri kalanı, modelin gördüğü sözleşmedir. parameters argüman şemasıdır ve execute, bu şemaya göre önceden ayrıştırılmış argümanları alır. output.schema, execute değerinin döndürdüğü veriyi tanımlarken, render bu değeri modelin okuduğu içerik bloklarına dönüştürür. Bu ikisini ayrı tutmak, arayüzün bir şey göstermesine karşın modelin başka bir şey okumasına olanak tanır.

Profili başlatın ve asistandan birine ismiyle hitap etmesini isteyin. Yanıt, execute öğeniz aracılığıyla geri gelir. ctx üzerinden kayıt işlemi geri alınabilir, bu nedenle eklentiyi kaldırmak aracı sizin yerinize kayıttan düşürür. Soket veya dosya tanıtıcısı gibi Cordis'in hakkında bilgi sahibi olamayacağı durumlar için ctx.effect() öğesini çağırın ve ona bir atıcı (disposer) verin.

İlk eklentinin doğrudan temas ettiği iki genişletme noktası

Genişletme noktalarının tam listesi uzundur. Bunlardan ikisi, neredeyse her ilk eklentiyi kapsar.

Konuşma etkinlikleri, kalıcı ve günlüğe kaydedilen akıştır. İsimleri session/event, turn/start, turn/end, step/start, step/end, user/message, assistant/message, assistant/chunk, tool/call ve tool/result şeklindedir. Bunlara sıradan bir dinleyici eklersiniz.

ctx.on('tool/call', (payload) => {
  console.log('[my-plugin] tool/call', JSON.stringify(payload))
})

Payload içeriğini bir kez yazdırın ve okuyun. Payload alan isimlerini bu kılavuz dahil hiçbir rehberden kopyalamayın; çünkü payload yapıları, önizleme API'sinin en çok değişen kısmıdır.

İkinci genişletme noktası şelale (waterfall) yapısıdır. agent/pre-step, agent/request, agent/request-error, llm/stream ve tools/* etkinlikleri şelale yapısındadır ve bir şelale dinleyicisi farklı bir imzaya sahiptir. Bir next geri çağırma işlevi (callback) alır ve zincir ancak bu işlev çağrıldığında devam eder.

ctx.on('agent/request', async (payload, next) => {
  const startedAt = Date.now()
  const downstream = await next()
  console.log('[my-plugin] model request took', Date.now() - startedAt, 'ms')
  return downstream
})

Eğer await next() çağrısını unutursanız, bir kanca (hook) eklememiş olursunuz. Model çağrısını hiçbir şeyle değiştirmiş olursunuz ve aracı (agent) orada durur; çünkü kısa devre (short circuit) davranışı, bir isteği kasten reddeden ağ geçidi eklentileri için tasarlanmış bir özelliktir. Bu tek fark, ilk eklenti geliştirme sürecindeki kafa karışıklıklarının çoğuna neden olur. next() çağrısını, etrafına başka bir kod yazmadan önce yazın.

agent/request, model çağrısının kendisini sarmalar. Payload içeriği; çağrıyı yapan aracı, açık tur numarası, isteğin ait olduğu adım ve o turun iptal sinyalini taşır; bu da onu bir istek günlükleyicisi veya hız sınırlayıcı (rate limiter) için doğru nokta yapar. tools/* şelaleleri, bir katman aşağıda aynı yapıdadır. tools/pre-execute, gönderim öncesinde izin verir, reddeder veya onay ister. tools/execute, gönderimi sarmalar. tools/post-execute, normalleştirilmiş sonucu değiştirebilir veya engelleyebilir. tools/result ise yalnızca kesinleşmiş sonucu gözlemler.

Başkalarının kurabileceği bir paket haline getirin

Bir paket, package.json dosyasında yama dosyasına işaret eden bir dsh.bundle alanı tanımlanmış bir npm paketidir. Bu bildirim, bir taslak dosya ile kurulabilir bir öğe arasındaki tek farktır.

{
  "name": "dsh-plugin-hello",
  "version": "0.1.0",
  "type": "module",
  "main": "lib/index.js",
  "files": ["lib", "cordis.patch.yml", "README.md", "LICENSE"],
  "engines": { "node": "^22.19 || >=24", "dsh": ">=0.1.0-rc.6" },
  "dsh": { "bundle": { "patch": "./cordis.patch.yml" } },
  "keywords": ["dsh-plugin", "deepseek-harness"],
  "scripts": { "build": "tsdown", "prepare": "pnpm run build" },
  "exports": {
    ".": { "types": "./lib/index.d.ts", "default": "./lib/index.js" },
    "./cordis.patch.yml": "./cordis.patch.yml",
    "./package.json": "./package.json"
  }
}

Yanında bulunan cordis.patch.yml oldukça kısadır.

- insert:
    - id: dsh-plugin-hello
      name: dsh-plugin-hello

name satırı paket adıdır, bu nedenle bu iki dizge birbiriyle eşleşmelidir. id satırı, bir kullanıcı yapılandırmanızı geçersiz kıldığında sonraki katmanın hedef aldığı değerdir; bu yüzden kararlı bir değer seçin ve farklı bir eklenti için asla yeniden kullanmayın.

files alanı cordis.patch.yml değerini içermelidir. Bu alanı atlarsanız, yayınlanan tarball dosyası paketlenmemiş bir dosyaya işaret eden bir dsh.bundle.patch içerir; bu durumda paket kurulur ancak ağaca hiçbir katkıda bulunmaz.

Eklenti klasörünüzü içeren dizinden bir profile kurun.

dsh plugin --profile demo add ./dsh-plugin-hello
dsh --profile demo --dump-config
dsh --profile demo

dsh plugin --profile <name>, argümanlarının geri kalanını o profil dizini içindeki pnpm aracına iletir, bu nedenle add ve remove komutları pnpm ile aynı şekilde davranır. Kaldırma işlemi için dsh plugin --profile demo remove dsh-plugin-hello kullanın. web ve headless profilleri ilk kullanımda sunulan şablonlardan kendilerini oluşturur; diğer tüm profil adları ise dsh plugin aracılığıyla oluşturulmalıdır.

Satırınızın oluşturulan ağaçta neden görünmediği

Oluşturma işlemi boş bir girdi listesiyle başlar ve katmanları sabit bir sırada üst üste dizer. Profilin dsh.profile.bundles kısmında belirtilen her paket, listelendikleri sırayla eklenir. Ardından profilin kendi cordis.patch.yml kısmı gelir. Daha sonra $DSH_HOME/cordis.patch.yml eklenir. Son olarak komut satırından gelen herhangi bir --patch katmanı uygulanır. Sonraki katmanlar, aynı kimliğe (id) sahip önceki satırların yerini alır.

Profiller $DSH_HOME/profiles/<name> altında bulunur. Bir profil dizini, sıralı bundles listesini içeren dsh.profile manifestosunu taşıyan bir package.json dosyasını ve kullanıcının kendi yama dosyasını barındırır. Paket adları önce dsh kurulumundan, ikinci sırada ise pnpm'in ağaç dışı bir eklentiyi yerleştirdiği profilin node_modules dizininden çözümlenir.

dsh --profile demo --dump-config komutu, herhangi bir başlatma yapmadan tamamen oluşturulmuş ağacı yazdırır; hata ayıklama sürecinde bu çıktı belirleyici bir sınırdır. Eğer satır kimliğiniz mevcut değilse, sorun oluşturma aşamasındadır: çözümlenemeyen bir isim veya hiç paketlenmemiş bir yama dosyası söz konusudur. Eğer satır mevcutsa ancak hiçbir işlem gerçekleşmiyorsa, sorun sizin kodunuzdadır. Bu soruyu öncelikle yanıtladığınızda, tahmin yürütme sürecinin büyük bir kısmını atlamış olursunuz.

Yükleme hatalarının gerçekte nerede ortaya çıktığı

apply içinde oluşan bir hata belirgindir. Süreç bu istisna ile sonlanır ve kendi satırınızı işaret eden bir yığın izi (stack trace) alırsınız.

Çözümleme hataları ise sessizdir. Yükleyici, çökme yerine Cordis günlükleyicisi aracılığıyla çözümleyemediği bir modülü bildirir. Kaynak eğitim dokümanı, bu mesajların konsol dışa aktarıcıları bağlanmadan önce yayınlandığı için başlangıçta kaybolmuş gibi görünebileceği konusunda uyarır. Bu nedenle, bir yol yazım hatası, yüklenmiş ancak hiçbir şey yapmamış bir eklentiyle aynı şekilde görünür; yukarıdaki --dump-config kontrolünün herhangi bir kod okumadan önce yapılmasının nedeni budur.

Geliştirme yaparken apply içindeki ilk ifade olarak bir console.log tutun. Bunun yokluğu, sorunun hangi tarafta olduğunu size söyler ve daha sonra silmenin bir maliyeti yoktur. Bir sunucuda, yineleme yaparken süreci bir servis yöneticisi altında çalıştırmak yerine ön planda çalıştırın; böylece yükleyici çıktısı, gidip okumanız gereken bir günlük yerine doğrudan terminalinize ulaşır.

Sistemi yeniden başlatmadan yineleme

Sunucu tarafı için dürüst cevap, şu an için yeniden başlatmanız gerektiğidir. Web uygulaması paketi, paylaşılan hot module reload satırı devre dışı bırakılmış şekilde gelir ve dosya, yeniden yükleme yaşam döngüsü test edildikten sonra bu özelliğin tekrar etkinleştirileceğine dair bir not içerir. İstemci tarafı yeniden yükleme zinciri her zaman bağlıdır ancak bir yeniden derleme izleyicisi istemci paketlerini yeniden yazana kadar boşta kalır; bu nedenle Node tarafınız için de bir işlem yapmaz.

Henüz mevcut olmayan bir yeniden yükleme özelliğinin peşinde koşmak yerine yeniden başlatma işlemini maliyetsiz hale getirin. Eklentiyi tek bir dosyada tutun. Bir profile yüklemek yerine --patch ile yükleyin; böylece düzenleme ile çalıştırma arasında herhangi bir derleme veya pnpm adımı yer almaz. Her şeyi ctx üzerinden kaydedin; böylece yeniden başlatma işlemi geride yinelenen bir araç veya eski bir dinleyici bırakmaz. Kendi ayırdığınız her şeyi gerçek bir temizleyici (disposer) ile ctx.effect() içinde sarmalayın; çünkü eksik bir temizleyicinin yaygın belirtisi, ikinci çalıştırmanın ilk çalıştırmanın hala tuttuğu bir portta başarısız olmasıdır.

Eğer dizüstü bilgisayarınız yerine bir sunucuda çalışan bir altyapı üzerinde geliştirme yapıyorsanız, yukarıdakilerin hiçbiri değişmez ancak Web arayüzü bağlaması önem kazanır. 3080 numaralı porttaki loopback bağlaması, sayfanın neden kendiliğinden açılmadığını ve bu konuda ne yapılması gerektiğini açıklar.

Tarayıcı tarafı ve güvenilirlik düzeyi

Bunu yalnızca eklentinizin kendi arayüzüne ihtiyacı olduğunda ekleyin. Bu, paket ile aynı dsh alanında tanımlanır.

{
  "dsh": {
    "client": {
      "platform": "web",
      "inject": [],
      "external": [],
      "immediately": false
    }
  },
  "exports": {
    ".": "./src/index.ts",
    "./client": "./src/client/apply.ts",
    "./package.json": "./package.json"
  }
}

"platform": "web" zorunludur ve paket herhangi bir ./client dışa aktarımına sahip değilse tarayıcı hata verir; bu nedenle dışa aktarım haritası bir kolaylıktan ziyade manifestin bir parçasıdır. İstemci girişi, istemci çalışma zamanı türüyle genişletilmiş Cordis Context değerini alır ve her kayıt işlemi ctx.slots.register aracılığıyla apply içinde gerçekleşir. Modül düzeyindeki yan etkilere burada izin verilmez.

import type { Context } from 'cordis'
import type { DshClientContext } from '@deepseek-ai/dsh-client-runtime'

export async function apply(ctx: Context & DshClientContext) {
  ctx.slots.register({ name: 'domain.entry.slot' }, MyComponent)
}

Başlamadan önce iki detayı bilmekte fayda vardır. İstemci manifestindeki inject, zamanlamadan ziyade dokümantasyon amaçlıdır: paket düzeyindeki bağımlılık ilişkilerini kaydeder ve aktivasyon sırasını kontrol etmez. external, temel yapı dışındaki modül isteklerini tanımladığınız yerdir; böylece eklentiniz bu modülleri talep etmeden önce söz konusu modüller kullanıma hazır hale getirilir. Burası önizleme sürümünün en hızlı değişen kısmıdır; bu nedenle kodu yazdığınız gün, rehberi okuduğunuz gün değil, harness deposundaki packages/client/AGENTS.md dosyasını okuyun.

Yayınlama ve eklentinizin neleri etkilediğini belirtme

Bir GitHub deposuna dsh-plugin konusunu eklemek, onu eklenti arayan kişilerin göz attığı listeye dahil eder. Bu, yabancıların güvenine yönelik bir taleptir ve beraberinde sorumluluklar getirir. Bu sorumluluklar, bir dsh eklentisini yüklemeden önce inceleme kılavuzumuzun okuyuculara kontrol etmelerini söylediği maddelerin tam karşılığıdır; bu nedenle, bu kontrol listesine uygun yazmak, onay almanın en kolay yoludur.

  • Bağımlılıklarınızı sabitleyin. Geçişli bir bağımlılık üzerindeki caret aralığı, geçen hafta güvenli olan bir paketin bu hafta farklı kod çalıştırmasının yoludur; bu, sunuculardaki npm tedarik zinciri saldırılarının arkasındaki temel mekanizmadır.
  • Manifest dosyanızda neleri etkilediğinizi belirtin. inject listeniz, hangi harness servislerini kullandığınızın dürüst ve makine tarafından okunabilir bir özetidir. Bir incelemeci bunu saniyeler içinde okur ve buna göre bir kanaat oluşturur.
  • Sessiz ağ çağrıları yapmayın. Bir araç bir API'yi çağırıyorsa, ana bilgisayar adını README dosyasında belirtin ve uç noktayı yapılandırılabilir hale getirin. Bahsetmediği bir sunucuyla iletişim kuran bir eklenti, bu tür denetimleri yapan kişiler tarafından listeden çıkarılacaktır.
  • files dosyasını dar tutun. Tüm çalışma klasörünü yayınlamak, başıboş bir kimlik bilgisi dosyasının kayıt defterine ulaşmasına neden olur.
  • Git ile yükleyenlere, yalnızca geliştirme aşamasına özel varsayımlar içermeyen bir prepare betiği verin ve README dosyasında, bu derlemeyi profillerinin pnpm-workspace.yaml dosyasında izin verilenler listesine eklemeleri gerektiğini belirtin.
  • README dosyasını, üzerinde derleme ve test yaptığınız sürüm adayı ile tarih damgalayın. Bir önizleme API'sinin okuyucuları, elinizde hangisinin olduğunu bilmelidir.

Tamamlanmış bir eklentinin dışarıdan nasıl göründüğünü anlamak için yüklemeye değer dsh eklentileri listesini okuyun ve her bir README dosyasının yüklemeden önce size neler söylediğine dikkat edin. Başka bir aracı için uzantılar yazdıysanız, Claude Code eklentilerinin nasıl oluşturulduğu faydalı bir karşılaştırma sunar. Harness size canlı bir nesne grafiği ve geri alınabilir kayıt imkanı sunar; bu, dosya manifestinden daha fazla güç ve beraberinde daha fazla sorumluluk demektir.

FAQ

dsh eklentisi yazmak için npm üzerinde yayın yapmam gerekiyor mu?

Hayır. cordis.yml katmanındaki bir dosya sistemi yolu ve dsh web --patch ./scratch-plugin/cordis.yml ile yükleme yapmak, kendi kodunuzu harness içinde çalıştırmak için yeterlidir. Yolun mutlak (absolute) olması gerekir. Paketleme yalnızca başka biri eklentiyi kurduğunda önem kazanır; bu durumda bile, paketlenmiş formu bir kayıt defterine dokunmadan test etmek için dsh plugin --profile demo add ./my-plugin ile yerel bir klasörü kurabilirsiniz.

Eklentim yükleniyor ancak araç neden görünmüyor?

Önce dsh --profile demo --dump-config komutunu çalıştırın. Satır kimliğiniz bu çıktıda yoksa, eklenti hiç bağlanmamıştır ve sorun koddan ziyade yapılandırmadadır. Satır mevcutsa, export const inject = ['tools'] kontrolü yapın. Cordis yapılandırmasındaki girdiler eş zamanlı başlar, bu nedenle dosya sırası yükleme sırasını belirlemez. Bu bildirim olmadan Cordis araç kayıt defterini beklemez ve apply kodunuz, ctx.tools henüz kayıt için hazır değilken çalışabilir.

cordis.yml ile cordis.patch.yml arasındaki fark nedir?

cordis.yml tam bir girdi listesidir. cordis.patch.yml ise mevcut bir yapılandırmayı değiştirmek veya yenilerini eklemek için satırları kimliklerine göre hedefleyen, mevcut listenin üzerine uygulanan bir katmandır. Bir paket, package.json içindeki dsh.bundle.patch aracılığıyla kendi yama dosyasına işaret eder. Katmanlar sabit bir sırada uygulanır: profilin listelenen sırasındaki her paket, ardından profilin yama dosyası, ardından $DSH_HOME/cordis.patch.yml ve son olarak herhangi bir --patch katmanı. Son uygulanan katmanlar geçerli olur.

Agent çalışırken bir dsh eklentisini hot reload yapabilir miyim?

0.1.0-rc.7 sürümü itibarıyla, web profilindeki ana bilgisayar tarafı için bu mümkün değildir. Bu paket, paylaşılan hot module reload satırı devre dışı bırakılmış şekilde gelir ve dosya içinde, yeniden yükleme yaşam döngüsü test edildiğinde özelliğin geri döneceğine dair bir not bulunur. Bunun yerine hızlı bir yeniden başlatma için tasarım yapın: derleme adımı gerektirmeyen ve --patch ile yüklenen tek bir dosya kullanın; ayrıca her kaydı ctx üzerinden yapın ki bir çalıştırmadan diğerine hiçbir veri sızıntısı olmasın. Cordis'in kendi başına temizleyemediği kaynaklar için bir disposer ile birlikte ctx.effect() kullanın.