2026-07-05
Dayanıklı Ajan
Koşu ortasındaki bir crash, yarısı verilmiş refund'ı kaybeder ve naif bir restart müşteriyi yeniden charge eder. Bir journal, replay ve idempotency key'ler ajanı effectively-once kılar.
Neler öğreneceksin
Buraya kadarki her parça ajanı daha akıllı, daha güvenli ya da daha ucuz kıldı, ve her biri sessizce aynı şeyi varsaydı: ajan tek bir process içinde yaşar ve o process hayatta kalır. Koşu ortasında fişi çek, varsayım çöker. Yarısı bitmiş refund, her gözlem, controller’ın aldığı her karar, hepsi RAM’de yaşar ve process ile birlikte ölür. Bu tek başına kötüdür, ama recovery daha da kötüdür, çünkü en bariz recovery tehlikeli olandır: sadece görevi tekrar çalıştır. Refund crash’ten önce zaten payment gateway’e post edildiyse, naif bir tekrar koşusu onu ikinci kez post eder, ve şimdi yardımcı olmaya çalışırken müşterinin kartını iki kez charge etmiş olursun. Ajan hem bir crash’ten hem de kendi recovery’sinden sağ çıkmak zorundadır. Bu parça, birlikte çalışan üç parçayla durability’yi gerçek kılar. İlki bir append-only event journal: her step bir event’i (run_started, llm_decided, tool_result, finished) sabit bir run id’siyle key’lenmiş bir log’a yazar, ve anahtar fikir şudur ki state, log’un üzerindeki fold’dur (state is the fold over the log). Ne olduğunu bilmek için event’leri replay edersin, asla in-memory bir değişkene güvenmezsin, çünkü o değişken tam olarak crash’in yok ettiği şeydir. İkincisi deterministic replay with step memoization: resume sırasında journal’ı fold edersin, zaten bitmiş herhangi bir step için kaydedilmiş sonucu onu yeniden çalıştırmadan döndürürsün, ve yalnızca crash’ten sonraki kuyruğu çalıştırırsın. Üçüncüsü, side-effect üreten tool’lar için idempotency key’ler, çünkü memoization tek başına en kötü durum crash’i, yani effect’in gerçekleştiği ama sonucunun asla journal’a yazılmadığı durumu, kapatamaz. Birlikte sana effectively-once execution verirler: process öldüğünde yarısı verilmiş bir refund ne kaybolur ne de iki kez ödenir.
Ön koşullar
Temel Python yeterli: fonksiyonlar, bir dictionary, bir liste ve bir loop. Hepsi bu. Part 2 ve Part 8 yardımcı olur, ama yazı kendi içinde bütünlüklü. Part 2 refund tool’una bir local idempotency guard verdi, bir koşu içindeki bir retry’ın iki kez davranmasını durduran in-memory bir dictionary, ve bu parça tam olarak o guard’ın vaat edilen sertleştirilmesidir, dolayısıyla nereden geldiğini bilmek değer. Part 8 son “limitler” parçasıydı, bir ajana kaçak bir loop’u ne zaman durduracağını öğreten parça, ve durability bir budget’tan ziyade bir kill’den sağ çıkan limittir. Ama bu parça daha önceki bir fikre yaslandığı yerde onu tek bir cümleyle yeniden ifade eder, ve ReAct loop’unu ya da tool contract’ını yeniden öğretmez; bunlar Part 1’e aittir ve burada referans verilir. Eşlik eden kod, durable_agent.py, API anahtarı, ağ ve bağımlılık olmadan offline çalışır; böylece her satırı okuyup bu yazıdaki her trace’i kendiniz yeniden üretebilirsiniz. Timestamp’ler ve run id donduruludur, dolayısıyla journal bu deterministik path’te byte-reproducible’dır, gerçek LLM path’i (generate()) tek bir ortam bayrağı uzaklıkta, tam olarak Part 1’den 8’e kadarki gibi.
In-memory ajandan beri yeni olan ne
Neyin yeni olduğu konusunda kesin olmak istiyorum, çünkü her iki seride de neredeyse her şey RAM’de oldu ve bunu hiç düşünmedi. RAG Part 19’un ajanı ve RAG Part 20’nin conversational ajanı her zaman in-memory’ydi: state bir Python değişkeniydi, loop ya tamamlanana kadar çalıştı ya da çalışmadı, ve bir crash basitçe işi kaybetti, hikayenin sonu. Her iki parçada da hiçbir şey process’ten sağ çıkmadı, çünkü hiçbir şeyden çıkması istenmemişti. Bu parça hiçbirinin sahip olmadığı orthogonal bir katman ekler, durability, ve bu bilerek orthogonal’dır. Loop’un nasıl karar verdiğini, tool’ların ne olduğunu ya da bir başarısızlığın nasıl sınıflandırıldığını değiştirmez; process iki step arasında öldüğünde neyin hayatta kalacağını değiştirir. Bunu görmenin en somut yolu Part 2’nin guard’ı üzerindendir. O guard, order_id üzerinde key’lenmiş local in-memory bir dictionary’ydi: tek bir canlı process içindeki bir retry’ı koruyordu, ve o process ile birlikte öldü. Burada aynı fikir durable hale gelir. Journal, her step’ten önce ve sonra intent’i ve sonucu diske kaydeder, replay state’i o journal’dan yeniden inşa eder, ve payment provider’a verilen stabil bir idempotency key side-effect’i yalnızca bir koşu içinde değil, bir crash ve bir replay boyunca effectively-once kılar. Tohum Part 2’de, sertleştirme burada. Loop’u yeniden türetmiyorum; onu, zeminin her an altından çekilebileceğini varsayan bir katmanla sarıyorum.
Journal: state, log’un üzerindeki fold’dur
Log’la başla, çünkü diğer her şey onun üzerine kurulu. Ajanın üzerinde çalıştığı dünya, bir crash’ten sağ çıkması gereken üç artefaktı bir araya getirir: journal (append-only event log’u), keystore (payment provider’ın zaten honor ettiği idempotency key’ler), ve ledger (gerçek side-effect, paranın gerçekten hareket ettiği yer). Her step journal’a bir event ekler, ve bir event küçük ve eksiksizdir: bir sequence number, sabit run id, dondurulmuş bir timestamp, bir type ve bir data payload. Onu burada bir liste içinde tutuyor ve JSONL olarak yazdırıyoruz, ama zihinsel model bir dosyadır: gerçek bir sistem her satırı bir JSONL dosyasına ya da bir satırı SQLite’a ekler, böylece process’ten sağ çıkar. Onu yazıya dökmenin amacı, ondan çıkan kuraldır. State, log’un üzerindeki fold’dur. Hangi step’lerin tamamlandığını, ne döndürdüklerini ve koşunun bitip bitmediğini bilmek için event’leri baştan replay eder ve onları state’e fold edersin. In-memory bir değişken okumazsın, çünkü bu parçanın tüm önermesi şudur ki in-memory değişkenler gitmiştir. İşte ilk koşu crash ettikten sonra diskte hayatta kalan şey, artefaktın gerçek çıktısından alıntılanmış:
{"data": {"run_id": "run-7f3a"}, "run_id": "run-7f3a", "seq": 0, "ts": "2026-07-05T10:00:00Z", "type": "run_started"}
{"data": {"args": {"query": "refund policy window"}, "idx": 0, "tool": "search_policy"}, "run_id": "run-7f3a", "seq": 1, "ts": "2026-07-05T10:00:01Z", "type": "llm_decided"}
{"data": {"idx": 0, "result": "Refunds after the window are refundable minus a 10% restocking fee.", "tool": "search_policy"}, "run_id": "run-7f3a", "seq": 2, "ts": "2026-07-05T10:00:02Z", "type": "tool_result"}
{"data": {"args": {"amount": 180.0, "order_id": "ORD-3300"}, "idx": 1, "tool": "process_refund"}, "run_id": "run-7f3a", "seq": 3, "ts": "2026-07-05T10:00:03Z", "type": "llm_decided"}
Onu sequence sequence oku. seq 0, run_started, bu koşunun (run-7f3a) var olduğunu gösteren işaret. seq 1, step 0 için llm_decided: controller search_policy’yi çağırmayı seçti, ve kararı onu çalıştırmadan önce kaydettik. seq 2, step 0 için tool_result: search Refunds after the window are refundable minus a 10% restocking fee. döndürdü, ve o sonucu kaydettik. Yani step 0 diskte tamamen tamamdır, karar ve sonuç ikisi de. Sonra seq 3, step 1 için llm_decided: controller ORD-3300 için 180.0’da process_refund çağırmayı seçti. Ve sonra journal durur. Step 1 için bir karar var ama onun için bir tool_result yok. O boşluk sonraki iki bölümün tüm dramıdır, ve log’u fold etmenin neden bir değişkene güvenmeyi yendiğinin nedenidir: log sana tam olarak ne kadar ilerlediğini söyler ve, en az onun kadar önemlisi, tam olarak nerede belirsiz olduğunu söyler.
Naif recovery’yi kıran crash
Crash bilerek zor noktaya yerleştirilmiştir. “Process refund’dan önce öldü” değildir, ki bu kolay olurdu, ve “process her şey journal’a yazıldıktan sonra öldü” da değildir, ki bu da kolay olurdu. O can sıkıcı orta noktadır: refund provider’a post edilir ve key honor edilir, ve sonra process öldürülür, o step için tool_result journal’a hiç ulaşmadan önce. İşte koşu, artefaktın gerçek çıktısından alıntılanmış:
step 0 search_policy: Refunds after the window are refundable minus a 10% restocking fee.
step 1 process_refund: effect done (ledger touched, key honored), but
*** PROCESS KILLED before the result was journaled ***
Ve işte geride bıraktığı state:
Ledger after the crash: ORD-3300=$180.00 (the refund DID post)
Note: the journal has NO tool_result for step 1, so memoization alone would re-run it.
Bu, tüm tuzak üç satırda. Ledger ORD-3300=$180.00 diyor: para gerçekten hareket etti, refund gerçek, müşteriye ödeme yapıldı. Ama yukarıda gördüğümüz gibi journal’da step 1 için bir tool_result yok, yalnızca llm_decided var. Yani durable kayıt gerçeklikle çelişiyor: diskte step 1, karar verilmiş ama hiç bitmemiş gibi görünüyor. Journal’ı fold eden ve “hangi step’ler tamamlandı?” diye soran herhangi bir recovery, step 1’in tamamlanmadığı sonucuna varacak ve onu tekrar çalıştırmak isteyecektir. Memoization’ın tek başına kapatamayacağı boşluk budur, ve trace’teki not bunu açıkça söyler: memoization alone would re-run it. Şimdi tehlikeli recovery’yi izleyin, journal’ı ve idempotency’yi tamamen görmezden gelen ve sadece planı yeniden yapan olanı, artefaktın gerçek çıktısından:
step 0 search_policy: re-ran from scratch
step 1 process_refund: refunded $180.00 to ORD-3300 (no idempotency check!)
ledger now: ORD-3300=$360.00 <- DOUBLE REFUND ($360.00). This is the bug.
Naif restart’ın ne yaptığını oku. Step 0’ı yeniden çalıştırdı (zararsız, search read-only) ve sonra step 1’i hiçbir idempotency check’i olmadan yeniden çalıştırdı, zaten geçmiş olanın üstüne ikinci bir $180.00 refund post ederek. Ledger şimdi ORD-3300=$360.00 okuyor, bir double refund, ve trace bunu açıkça etiketliyor: This is the bug. $180 alacaklı müşteri $360 aldı, ve ajanın yanlış yaptığı tek şey bir crash’ten recover etmeye çalışmaktı. Bu yapay bir uç durum değildir. Side-effect üreten bir job’ı restart etmenin varsayılan sonucudur, ve para hareket ettiren herhangi bir şey için “sadece tekrar çalıştır”ın neden yanlış içgüdü olduğunun tam olarak nedenidir.
Replay, memoization ve idempotency key
Şimdi durable resume, hem crash’ten hem de recovery’den sağ çıkan olan. Aynı crash sonrası dünyadan başlar (ledger’da zaten bir refund var, journal’da o dört event var) ve replay eder. Artefaktın gerçek çıktısından alıntılanmış:
step 0 search_policy: memoized from journal -> 'Refunds after the window are refundable minus a 10% restocking fee.'
step 1 process_refund: refunded $180.00 to ORD-3300 (idempotent: key already honored, no second charge)
finished -> Refund of $180.00 for ORD-3300 is complete (processed exactly once).
Ledger after the resume: ORD-3300=$180.00 <- still ONE refund. Effectively-once.
İki farklı mekanizma iki farklı step’i kurtardı, ve bu ayrım parçanın kalbidir. Step 0’ı memoization kurtardı: journal üzerindeki fold step 0 için bir tool_result buldu, dolayısıyla resume kaydedilmiş değeri, memoized from journal -> 'Refunds after the window are refundable minus a 10% restocking fee.', search’ü yeniden çalıştırmadan döndürdü. Bu kolay crash’tir, sonucun journal’a yazıldığı olan, ve memoization onu temizce halleder. Step 1 zor crash’tir, effect’in gerçekleştiği ama sonucun asla journal’a yazılmadığı olan. Burada memoization işe yaramaz, çünkü döndürülecek kaydedilmiş bir sonuç yoktur; fold step 1’i tamamlanmamış olarak görür ve onu yeniden dener. Step 1’i kurtaran şey idempotency key’dir. Refund stabil bir key taşır (burada ORD-3300:refund:180.00), payment provider zaten honor ettiği key’leri durable keystore’unda hatırlar, ve resume refund’ı yeniden denediğinde provider key’i tanır ve yeniden charge etmek yerine orijinal sonucu döndürür: refunded $180.00 to ORD-3300 (idempotent: key already honored, no second charge). Koşu sonra biter, processed exactly once, ve ledger hâlâ ORD-3300=$180.00 okur. İşte effectively-once budur: refund kararı resume’da yeniden verildi, effect verilmedi. Ve bu Part 2’nin local guard’ının sertleştirilmiş halidir. Part 2’nin dictionary’si bir process içindeki bir retry’ı korudu; durable bir keystore tarafından tutulan bu key, bir crash ve taze bir process boyunca bir re-charge’a karşı korur.
Resume’dan sonra journal’da işaret etmeye değer dürüst bir ayrıntı var, çünkü aksi halde bir bug gibi görünürdü. Resume edilmiş journal seq 6’ya kadar büyür, ve step 1 için iki llm_decided event’i içerir (orijinal koşudan seq 3 ve resume’dan seq 4), seq 5’teki tool_result’tan ve seq 6’daki finished’tan önce. O ikinci llm_decided özensiz değil, dürüsttür: resume sırasında ajan, confirm edemediği step için kararı gerçekten yeniden verir, ve journal verdiğini kaydeder. İki kez olmayan şey effect’tir, çünkü idempotency key onu yakalar. Journal gerçek hikayeyi anlatır, “Tekrar refund yapmaya karar verdim, ve provider bana bunun zaten yapılmış olduğunu söyledi”, ki bu tam olarak istediğin audit trail’dir. Diagram 2 key’i keystore boyunca takip eder, ve aşağıdaki interaktif figür crash’i, naif restart’ı ve durable resume’u yan yana sürmenizi ve üç artefaktın da (journal, keystore, ledger) hareket etmesini izlemenizi sağlar.
Neyi iddia ediyoruz, neyi etmiyoruz
Garantiler konusunda kesin olmak değer, çünkü durability, overclaiming’in insanları zarara uğrattığı bir alandır. Bu parçadaki journal yalnızca deterministic path’te byte-reproducible’dır, planın sabit olduğu ve timestamp’lerin ve run id’sinin donduruldu olduğu yerde. Loop içinde gerçek bir LLM ile kararlar bir koşudan diğerine byte-identical değildir, dolayısıyla resume onları yeniden türetmez; bunun yerine her karar ilk verildiğinde journal’da cache’lenir, ve replay’de cache’lenmiş karar yeniden üretilmek yerine geri okunur. Bu byte-for-byte değil, best-effort faithful’dır, ve bir non-deterministic ajanı replayable kılmanın dürüst yoludur. İkincisi, burada cross-process resume, aynı script’i aynı journal üzerinde yeniden çalıştırmak anlamına gelir. Gerçek inter-process messaging ya da iki çalışan worker arasında canlı bir handoff değildir; ölen bir worker’ın ve aynı durable log’u devralan yeni bir worker’ın gerçekçi modelidir. Üçüncüsü, keystore, payment provider’ın kendi idempotency’sini modeller, ki pratikte gerçek garantinin yaşadığı yer burasıdır. Effectively-once’ın çalışmasının nedeni, ajanın değil, provider’ın hangi key’leri honor ettiği konusunda durable otorite olmasıdır; ajanın işi stabil bir key göndermek ve provider’ın de-duplicate edeceğine güvenmektir. Provider’ın idempotency key’leri desteklemiyorsa, bu pattern “çok dikkatli ol”a düşer, ki bu tam olarak Part 2’nin local guard’ının seni bıraktığı durumdur. Buradaki mekanizma gerçektir; garantinin gücü ise idempotency’yi ciddiye alan bir provider’dan ödünç alınmıştır.
💡 Deneyimden. Aldığım en kötü page, charge ortasında crash eden bir payment worker’dan geldi. Queue’dan bir job çekti, gateway’i çağırdı, ve charge geçti, ve sonra worker job’ı done olarak işaretleyemeden önce box OOM ile öldürüldü. Queue, bir queue’nun tam olarak yapması gerekeni yaparak, job’ı başka bir worker’a yeniden teslim etti, ki o da kartı tekrar charge etti. Dashboard’lardan değil, müşterilerden öğrendik, ve özür e-postaları yazmak eğlenceli değildi. Çare “worker’ı crash etmemesini sağla” değildi, çünkü worker’lar crash eder, güvenebileceğin tek şey budur. Çare bu parçadaki iki fikirdi. Her job için bir event yazmaya başladık, önce karar sonra sonuç, durable bir log’a, böylece restart edilmiş bir worker log’u fold edip ölü olanın tahmin etmek yerine tam olarak ne kadar ilerlediğini bilebilirdi. Ve her charge’a stabil bir idempotency key koyduk ve gateway’in de-duplicate etmesine izin verdik, böylece yeniden teslim edilen job gateway’in zaten honor ettiği bir key’e çarptı ve yeni bir charge yerine orijinal charge’ı geri aldı. Onu worker’ı charge post edildikten hemen sonra bilerek öldürerek ilk kez test ettiğimizde, yeniden teslim “already done” döndürdü ve ledger hareket etmedi. Tüm ders budur: journal yeni bir process’e eskisinin nerede durduğunu söyler, ve idempotency key zaten gerçekleşmiş olan tek step’i tekrar denemeyi güvenli kılar. Yeniden inşa edebileceğin bir state ve güvenle retry edebileceğin bir side-effect, ve bir crash bir non-event’e dönüşür.
Özet / Çıkarımlar
- Ajan her zaman tek, kırılgan, in-memory bir process içinde yaşadı. Koşu ortasında öldür ve yarısı bitmiş refund ve tüm state’i gider, ve en bariz recovery, tekrar çalıştır, tehlikeli olandır: müşteriyi yeniden charge eder. Ajan hem bir crash’ten hem de kendi recovery’sinden sağ çıkmak zorundadır.
- Bir append-only event journal (
run_started,llm_decided,tool_result,finished, dondurulmuş timestamp’lerlerun-7f3arun id’sinde key’lenmiş) source of truth’tur, ve state, log’un üzerindeki fold’dur: state’i yeniden inşa etmek için event’leri replay edersin ve asla crash’in yok ettiği in-memory bir değişkene güvenmezsin. - Crash zor noktaya yerleştirilmiştir: refund post edildikten ve key honor edildikten sonra (
ledger ORD-3300=$180.00) amatool_resultjournal’a yazılmadan önce, dolayısıyla journal’da step 1 için yalnızcallm_decidedvardır. Trace bunu açıkça söyler:memoization alone would re-run it. - Journal’ı ve idempotency’yi görmezden gelen bir naif restart her iki step’i de yeniden çalıştırır ve ikinci bir refund post eder,
ledger now: ORD-3300=$360.00 <- DOUBLE REFUND ($360.00). This is the bug.Side-effect üreten bir job’ı körlemesine restart etmenin varsayılan sonucu budur. - Durable resume iki mekanizma kullanır: step memoization step 0’ın kaydedilmiş sonucunu onu yeniden çalıştırmadan döndürür (kolay crash), ve idempotency key yeniden denenen refund’ın key’i
already honoredetmiş bir provider’a çarpmasını sağlar,no second charge, böylece koşuprocessed exactly oncebiter ve ledger$180.00’da kalır. İşte effectively-once budur, ve Part 2’nin local guard’ını sertleştirir. - Journal step 1 için iki
llm_decidedevent’ini dürüstçe kaydeder (seq 3 ve seq 4): resume’da karar yeniden verilir, ama effect verilmez, çünkü side-effect’i de-duplicate eden journal değil, key’dir. Karar tekrarlanabilir; charge tekrarlanamaz.
Sözlük
- Event journal / event sourcing: tipli event’lerin (burada
run_started,llm_decided,tool_result,finished) append-only bir log’u, her step’i o olmadan önce ve sonra kaydeder; herhangi bir in-memory değişken değil, log durable source of truth’tur, ve gerçek bir sistem onu bir JSONL dosyasına ya da SQLite’a ekler, böylece process’ten sağ çıkar. - State, log’un üzerindeki fold’dur: mevcut state’in, bir crash’in yok edeceği bir değişkenden okunmak yerine journal’ı baştan replay edip event’leri ona fold ederek türetildiği kural; resume’da fold sana hangi step’lerin tamamlandığını, ne döndürdüklerini ve koşunun bitip bitmediğini söyler.
- Deterministic replay: koşuyu journal’dan yeniden türetmek; deterministic path’te byte-reproducible (dondurulmuş timestamp’ler ve run id), ve gerçek LLM path’inde best-effort, her kararın journal’da cache’lenip yeniden üretilmek yerine geri okunduğu yerde.
- Step memoization: resume’da, zaten tamamlanmış herhangi bir step için kaydedilmiş
tool_result’ı onu yeniden çalıştırmadan döndürmek, böylece yalnızca crash’ten sonraki kuyruk çalışır; kolay crash’i halleder ama effect’i sonucu journal’a yazılmadan önce gerçekleşmiş bir step’i kapatamaz. - Idempotency key: bir side-effect üreten çağrıya iliştirilmiş stabil bir tanımlayıcı (burada
ORD-3300:refund:180.00), böylece aynı key’in tekrarı yeniden davranmak yerine orijinal sonucu döndürür; memoization’ın kapatamayacağı zor crash’i, effect’in gerçekleştiği ama sonucun asla journal’a yazılmadığı olanı, kapatır. Part 2’nin local in-memory guard’ını sertleştirir. - Keystore (provider idempotency): payment provider’ın zaten honor ettiği key’lerin durable store’u; provider’ın kendi idempotency’sini modeller, ki gerçek garantinin yaşadığı yer burasıdır, çünkü ajan değil, provider hangi key’lerin görüldüğü konusunda durable otoritedir.
- Effectively-once: bir crash ve bir replay boyunca bile bir side-effect’in tam olarak bir kez gerçekleştiği garantisi; karar resume’da yeniden verilebilir, ama effect idempotency key tarafından de-duplicate edilir, böylece müşteri bir kez charge edilir, asla sıfır kez ve asla iki kez.
- Sonradan yeniden kullanıldı: burada inşa edilen journal Part 10 (pause ve resume aynı log üzerinde çalışır) ve Part 11 (span’ler bu aynı event’lerden tracing için okunur) için substrate’tir, dolayısıyla event şeklini şimdi doğru yapmak değer.
Bu parçanın kuralı: para hareket ettiren bir ajan yalnızca RAM’de yaşayamaz, çünkü bir crash eninde sonunda onu bulacaktır. Log’u source of truth yap ve state’i onun üzerindeki fold olarak ele al (her karar ve sonucun append-only bir journal’ı), o log’u resume’da replay et böylece yalnızca crash’ten sonraki kuyruk yeniden çalışsın (step memoization), ve her side-effect’e stabil bir idempotency key koy böylece bir yeniden deneme onu ikiye katlamak yerine orijinal sonucu döndürsün (effectively-once, Part 2’nin local guard’ının sertleştirilmiş hali). Ama durable ajanın hâlâ yapamadığı şeye dikkat et. Ya tamamlanana kadar çalışır ya da crash edip resume eder, ve her iki durumda da yalnız çalışır, başı eğik, durup kontrol etmenin bir yolu yok. Bazı action’lar bir insan evet demeden gerçekleşmemeli (büyük bir refund post edilmeden önce onay gerektirir), ve koşuyu izleyen bir kullanıcı, ajan yanlış step’e bağlanmadan önce onu uçuş ortasında düzeltmek isteyebilir. Durable ajan ikisini de mümkün kılan journal’a sahiptir, ama henüz journal üzerinde pause edip bir insanı bekleyip tam durduğu yerden resume etmenin bir yolu yok. Part 10, Pause, Approve, Resume, Steer, bununla ilgilidir: journal’ı koşunun durabileceği, kontrolü bir kişiye devredebileceği ve tek bir şey kaybetmeden tekrar devam edebileceği bir yere çevirmek.