Skip to main content

Breaking Changes: v0.0.85

· 6 min read
vNext Team
Burgan Tech Engineering

v0.0.85, script compiler ve ScriptContext performans çalışmasının davranışsal yan etkilerini, payload envelope algılamasındaki bir düzeltmeyi ve component cache'in generation-token memoization'ının devreye alınmasını taşır. Aşağıdaki maddelerin çoğu vnext-meta/migrations.json'a since: 0.0.85 olarak kaydedilmiştir.

Breaking Changes

1. Script metriklerinde hit/miss ayrımı ve gerçek execution metrikleri eklendi

Etkilenen Alan: Prometheus script_* metrikleri (vnext #907)

Önceki Davranış: script_executions_total her zaman compile yolunda artıyordu (cache hit'ler dahil), gerçek script execution'ını yansıtmıyordu; compile ve execution latency'si ayrıştırılamıyordu.

Yeni Davranış: script_compilations_total{result=hit|miss,status} yeni metriği hit/miss'i ayırır; script_execution_duration_seconds{script_type,language,status} ve script_runtime_errors_total{script_type,language,error_type} gerçek execution funnel'larında (task-input, task-output, condition, transition-mapping, function) kaydedilir; script_compilation_duration_seconds yeni bir cache etiketi kazandı. script_executions_total değişmeden yayınlanmaya devam ediyor. Yön: davranış değişikliği.

Migration: Compile-rate panellerini rate(script_compilations_total[5m])'e, temiz compile latency'sini {cache="miss"} filtresine, gerçek execution sayacını script_execution_duration_seconds_count'a taşıyın. Acil aksiyon gerekmez — eski metrik hâlâ yayınlanıyor (bkz. madde 9).

2. Task audit request artık tam task tanımı yerine referans taşıyor

Etkilenen Alan: InstanceTask.Request (transition/task audit kaydı) (vnext #907)

Önceki Davranış: Her execution'da InstanceTask.Request, mapping script kodu dahil tüm task tanımını gömüyordu.

Yeni Davranış: Request.task artık { key, version, domain, flow, type } referansını taşır; tanımın kendisi component store'da yaşamaya devam eder. InputResponse değişmedi. Yön: daha kısıtlayıcı.

Migration: request.task.* altında tanım alanlarını (config, mapping kodu gibi) parse eden harici tüketiciler varsa, gömülü referansı kullanarak tanımı component store'dan çözümlemeye geçin.

3. Instance data okumaları artık data versiyonu başına tek bir materialize edilmiş ağacı paylaşıyor

Etkilenen Alan: scriptContext.instance.data (vnext #907)

Önceki Davranış: context.Instance.Data her erişimde taze bir dynamic tree materialize ediyordu; script tarafındaki mutasyonlar bir sonraki okumada sessizce kayboluyordu.

Yeni Davranış: Okumalar artık data versiyonu başına memoize edilir — bir mutasyon aynı transition içindeki sonraki okumalarda görünür olur (hâlâ persist edilmez; kalıcılık yalnızca ScriptResponse.Data üzerinden delta-only'dir). Benzer şekilde, parallel-branch task response değerleri artık parent ile branch arasında referans olarak paylaşılır (container'lar izole kalır); branch içinde var olan bir response değerinin yerinde mutasyonu, join sonrası parent'ta görünür olur. Yön: davranış değişikliği.

Migration: Script'ler context.Instance.Data'yı veya var olan task response değerlerini yerinde mutate edip eski "sessiz kayıp" davranışına güvenmemeli; değişiklikleri dokümante edildiği gibi ScriptResponse.Data üzerinden delta olarak döndürmeli.

4. SetBody, ExpandoObject/list anahtarlarını yazıldığı gibi koruyor

Etkilenen Alan: scriptContext.setBody (ve WithBody builder yolu) (vnext #907)

Önceki Davranış: Bir ExpandoObject/List girişiyle SetBody, dictionary anahtarlarını global seçeneklerle serialize ediyordu; bu seçeneklerin DictionaryKeyPolicy'si anahtarları camelCase'e çeviriyordu.

Yeni Davranış: ExpandoObject/List girişi artık yapısal olarak klonlanır ve dictionary anahtarları yazıldığı gibi korunur. Anonymous-object/POCO girişleri değişmeden camelCase kalır. Bu, SetBody'yi (hiçbir zaman dict anahtarlarını camelCase yapmayan) SetStandardResponse ile ve instance-data ağaçlarıyla (persist anında camelCase) hizalar. Yön: davranış değişikliği.

Migration: SetBody'ye PascalCase expando anahtarları verip global ayarların camelCase yapmasına güvenen script'ler, kendi anahtarlarını kendileri camelCase yapmalı.

5. Parallel-branch merge conflict tespiti artık yapısal ve sıradan bağımsız

Etkilenen Alan: scriptContext.mergeParallelBranch (vnext #907)

Önceki Davranış: Merge conflict tespiti serialize edilmiş metin karşılaştırmasına dayanıyordu ve sıraya duyarlıydı; aynı içeriğin farklı sırada gelen çıktısı sahte bir conflict fırlatıyordu.

Yeni Davranış: Karşılaştırma artık JsonElement.DeepEquals ile yapısal olarak yapılır (object property sırası göz ardı edilir); aynı içerik farklı sırada artık merge edilir. Yön: daha permissive.

Migration: Aksiyon gerekmez — gerçekten farklı içerik için conflict semantiği değişmedi.

6. Kendine referans veren script değerleri artık sessizce budanmak yerine hata fırlatıyor

Etkilenen Alan: scriptContext.setBody — body/branch clone yolu (vnext #907)

Önceki Davranış: Body/branch clone JSON round-trip ile yapılıyordu (ReferenceHandler.IgnoreCycles); bir script bir ExpandoObject'i kendi içine (doğrudan veya transitif olarak) atadığında, tekrarlanan referans sessizce null'a çevriliyor ve task budanmış veriyle devam ediyordu.

Yeni Davranış: Clone artık yapısaldır ve aşırı nesting'i tespit ederek 256 derinlikte InvalidOperationException fırlatır; task normal error boundary üzerinden görünür şekilde fail olur. JSON'dan türeyen acyclic değerler etkilenmez. Yön: daha kısıtlayıcı.

Migration: Script'ler kendine referans veren dynamic değer üretmemeli. Bir mapping meşru olarak 256 seviyeden derin nesting yapıyorsa düzleştirin; bir task bu mesajla fail etmeye başlarsa mapping'i kendi içine atanan bir değer için inceleyin.

7. Payload envelope algılaması key/tags/stage'i rezerve ediyor; validation hata alanları path oldu

Etkilenen Alan: Payload-mode algılaması (JSON ve form-url-encoded) ve JSON schema validation hata detayları (vnext #906)

Önceki Davranış: Payload-mode algılaması tek bir case-sensitive attributes alanına bakıyordu; attributes içermeyen bir envelope free-form sayılıp bütün olarak sarmalanıyor, schema key/tags'i business payload'u yerine doğruluyordu. Ayrıca reddedilen bir payload bazen hiçbir alan adı taşımadan ("errors":{}) geri dönebiliyordu — evaluation ağacı flatten edilirken bir node'un kendi hataları, child detayı varsa siliniyordu.

Yeni Davranış: Envelope algılaması artık key/tags/stage/attributes alan setinin tamamına bakar (her biri bağımsız opsiyonel). Bir node hem kendi hatasını hem child detaylarını raporlar; geçersiz bir subtree asla boş listeye düşmez. Hata alan adları artık keyword ("required") değil, instance path'i (root, customer.ownerUserId) olarak döner. Free-form bir payload'un kendi alanları yalnızca key/tags/stage isimlerinden oluşuyorsa, bu bir envelope'tan ayırt edilemez ve x-vnext-payload-mode: raw header'ının gönderilmesi gerekir. Yön: davranış değişikliği.

Migration: Eski keyword-tabanlı ("required") hata alan adlarına dayanan client parsing'i instance path'lerine (root, customer.ownerUserId, ...) güncelleyin. Yalnızca key/tags/stage isimli alanlar taşıyan free-form bir payload gönderen entegrasyonlar x-vnext-payload-mode: raw header'ını eklemeli. Ayrıntı için vnext reposundaki docs/contracts/form-url-encoded-payloads.md ve docs/contracts/json-validation.md'e bakın.

8. Component generation-token memoization aktive edildi — ≤5 saniyelik pod-arası görünürlük penceresi

Etkilenen Alan: Orchestration host component cache (ComponentCache:GenerationMemoSeconds) (vnext #898)

Önceki Davranış: Memoization mekanizması koddan vardı ama varsayılan değeri 0'dı (etkisizdi) — her generation-token okuması distributed cache'e (Redis/Dapr state) gidiyordu.

Yeni Davranış: Orchestration host'un appsettings.json'ında ComponentCache:GenerationMemoSeconds 5 saniyeye ayarlandı. Bu, publish yapan pod'un anında güncel kalmasını sağlarken, diğer pod'ların bir publish'i görmesi en fazla 5 saniye gecikebilir. Pinlenmiş full version'lar ve çalışan instance'lar etkilenmez. ComponentCache__GenerationMemoSeconds env var'ı ile ortam bazında override/disable edilebilir. Yön: davranış değişikliği.

Migration: CI/CD pipeline'ında son publish'ten sonra smoke test/cutover öncesi N + margin saniye bekleme kuralı ekleyin (rollback runbook'ları için de aynı pencere geçerli). Anlık görünürlük gereken ortamlarda değeri 0'a çekin. Ayrıntı için vnext reposundaki docs/runtime/component-cache-generation-memo.md'a bakın.

9. script_executions_total metriği deprecated edildi

Etkilenen Alan: Prometheus script_executions_total (vnext-meta/deprecations.json)

Önceki Davranış: script_executions_total, tek "script execution sayacı" olarak dashboard/alert'lerde kullanılıyordu.

Yeni Davranış: Metrik deprecated olarak işaretlendi (geriye dönük uyumluluk için değişmeden yayınlanmaya devam ediyor) — yerini script_compilations_total (compile-or-fetch, result=hit|miss) ve script_execution_duration_seconds_count (gerçek execution) alıyor; gelecekteki bir sürümde kaldırılacak. Yön: davranış değişikliği.

Migration: Dashboard/alert'leri madde 1'deki yeni metriklere taşıyın; script_executions_total'a olan bağımlılığı planlı şekilde kaldırın.


Bu sürümün tüm özellikleri için Release v0.0.85 notuna bakın.

vNext Runtime Platform Team