---
title: 'Yönetişim, Risk ve Uyumluluk'
source: 'https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk'
language: tr
updated: '2026-08-17T04:39:51+00:00'
license: 'CC BY-SA 4.0'
lessons: 17
outcomes:
    - 'Risk değerlendirmesini nitel ve nicel yöntemlerle yürütür ve sıralamanın nerede değiştiğini gösterir'
    - 'Güvenlik çerçevelerini kontrol ve kanıt eşlemesine çevirir, kanıtsız gereksinimi sayar'
    - 'Açık yönetimi programını düzeltme kapasitesi ve ölçüt kalıcılığıyla kurar'
---

# Yönetişim, Risk ve Uyumluluk

Dokuz kursun ölçtüğü savunmaların aynı listede yarıştırılması ve kıt bütçenin dağıtılması: varlık, tehdit ve etki analizinden risk listesi üretimi, nitel puanlama ile parasal modellemenin aynı listeyi farklı sıralaması, azaltma, aktarma, kabul ve kaçınmanın birim başına düşürdüğü risk, envanterde olmayan kalemin hiçbir sıralamaya girememesi, tedarikçide devredilen ama ölçülemeyen kalem, işlev tabanlı çerçevelerin yapısı, belgelendirilebilir yönetim sistemi modelleri, kontrol ile gereksinim eşlemesinde kanıtsız kalan gereksinim, sektörel uyumluluk gereksinimleri, veri sahibi hakları ve işleme ilkeleri, politika, standart ve yordam hiyerarşisi, bağımsız güvence, açık yönetimi programının düzeltme kapasitesi, yama ve değişiklik yönetiminde hız ile risk dengesi, farkındalık eğitiminin kalıcılığı, iş sürekliliği tatbikatı ve güvenlik ölçütleri.

## Risk Yönetimi

Dokuz kursun tek tek ölçtüğü savunmaların aynı listede yarıştırılması: varlık, tehdit ve etki kalemlerinden risk listesi üretimi, nitel puanlama ile parasal modelin aynı listeyi farklı sıralaması, azaltma, aktarma, kabul ve kaçınmanın aynı bütçede birim başına düşürdüğü risk, envanterde olmayan kalemin hiçbir sıralamaya girememesi ve tedarikçide devredilen ama doğrulanamayan kontrol.

### Risk Değerlendirme Süreci

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/risk-degerlendirme-sureci

Kursun ölçü birimi kurulur: on varlık ile yedi tehdidin 70 çiftinden 47 risk kalemi üretilir, toplam 5.768,61 kurgu birimlik yıllık risk varlık sınıflarına dağıtılır, 300 adetlik sınıfın payı yüzde 7,2 kalırken üç adetlik sınıfın payı yüzde 17,9 çıkar ve birim çabaya düşen azalmaya göre sıralama aynı listede 45 kalemin yerini değiştirip 200 birimlik bütçede 240,00 birim fazla risk düşürür.

Önceki dokuz kurs aynı işi yaptı: bir savunmanın hangi yolu kapattığını, hangi kalemi ayırdığını,
hangi süreyi kısalttığını saydı ve karşılığında durdurduğu meşru işi yazdı. Her kursun sonunda
elde ölçülmüş bir savunma listesi kaldı. Sorulmayan tek şey bu listelerin **birbirine göre** ne
olduğuydu: hangisi önce yapılır, kıt bir bütçe hangisine gider, yapıldığı kime nasıl kanıtlanır.

Bu kurs o üç soruyu ölçüye bağlar ve ölçüsü **sıralama**dır. Bir savunmanın kapattığı yol sayısı
tek başına bir öncelik vermez; öncelik ancak aynı listede duran öteki kalemlerle karşılaştırıldığında
doğar. Bu ders listeyi kurar: varlık kümesi, tehdit kümesi ve ikisinin kesişiminden çıkan risk
kalemleri. Riskin **olasılık ile etkinin bileşimi** olduğu Siber Güvenliğe Giriş kursunda
tanımlanmıştı; burada o tanım girdidir, ölçek ise tek kalem değil **program**dır.

#### Varlıktan Kaleme

Bir risk kalemi tek başına bir varlık değildir; "saha dizüstü bilgisayarı" bir risk kalemi değil, bir
varlık sınıfıdır. Kalem, bir varlığın **belirli bir tehditle** eşleşmesinden doğar: saha dizüstü
bilgisayarında zararlı kod ayrı bir kalem, aynı makinede fiziksel erişim ayrı bir kalemdir. İkisinin
sıklığı, etkisi, ele alma yolu ve bedeli farklıdır. Değerlendirme süreci bu yüzden üç adımdır:
varlıkları sınıflandır, her sınıfa hangi tehditlerin uygulandığını işaretle, kesişimde kalan her
çift için sıklık ve etki yaz.

Aşağıdaki küme kurgu **bölgesel ölçüm ağı**nın bir **modelidir**: gerçek bir envanter taranmıyor,
gerçek bir olay kaydı okunmuyor, gerçek para birimi kullanılmıyor. Bütün değerler **kurgu birim**
cinsindendir.

- **RY1.** On varlık sınıfı, yedi tehdit türü ve bütün katsayılar modeldir.
- **RY2.** Uygulanabilirlik maskesi iş tanımından türetilmiş sayılır ve modelde sabittir. Gerçekte
  bu maske bir değerlendirme çalışmasıyla doldurulur ve rol değiştikçe değişir.
- **RY3.** Sıklık, tehdidin taban sıklığı ile varlığın maruziyet katsayısının çarpımıdır; etki,
  varlık sınıfının değeri ile tehdidin etki çarpanının çarpımıdır.
- **RY4.** Her kalemin tek bir ele alma seçeneği vardır; bedeli tehdit taban bedeli ile varlığın
  bedel katsayısının çarpımıdır ve riski tehdide bağlı sabit bir oranda düşürür.
- **RY5.** Kalemler bağımsızdır: bir kalemin ele alınması başka bir kalemin riskini değiştirmez.
- **RY6.** Bütçe sırayla harcanır; sığmayan kalem atlanır, sıra bozulmaz.

```js
// risk/liste.mjs — kurgu bolgesel olcum aginin risk kalemleri MODELIDIR: gercek bir envanter,
// gercek bir olay kaydi ve gercek para birimi yoktur; degerler "kurgu birim" cinsindendir.

// RY1: tehdit satiri: ad | yillik taban siklik | etki carpani | ele alma bedeli | dusurdugu oran
export const TEHDIT = `
  kimlik-ele-gecirme   0.30  0.35  40  0.70
  zararli-kod          0.50  0.25  30  0.60
  yanlis-yapilandirma  0.80  0.15  12  0.75
  ic-kotuye-kullanim   0.10  0.40  55  0.40
  hizmet-kesintisi     0.40  0.20  25  0.50
  fiziksel-erisim      0.06  0.50  35  0.65
  tedarik-zinciri      0.08  0.45  60  0.30`
  .trim().split("\n").map((r) => {
    const [ad, s, c, b, d] = r.trim().split(/\s+/);
    return { ad, s: +s, c: +c, b: +b, d: +d };
  });

// RY2: varlik satiri: ad | adet | sinif degeri | maruziyet katsayisi | bedel katsayisi |
// tehdit maskesi (TEHDIT sirasinda yedi hane; 1 uygulanabilir, 0 degil)
export const VARLIK = `
  saha-dizustu          120   900  1.6  1.0  1111011
  sube-ucu               40   600  1.2  1.0  1111110
  sayac-toplayici       300   750  1.4  1.5  0111110
  islem-sunucusu         12  1800  0.6  0.8  1111101
  cevre-agi               4  1200  1.8  0.6  0011100
  kimlik-dizini           1  2400  1.0  0.7  1011100
  bulut-hesabi            3  2000  1.5  1.4  1011100
  abone-veri-tabani       1  3000  0.4  0.9  1011100
  saha-uygulamasi         1  1400  1.1  0.7  1111001
  tedarikci-baglantisi    3  1000  1.3  1.2  1001101`
  .trim().split("\n").map((r) => {
    const [ad, n, v, m, bk, maske] = r.trim().split(/\s+/);
    return { ad, n: +n, v: +v, m: +m, bk: +bk, maske };
  });

// RY3: kalem = uygulanabilir (varlik, tehdit) ciftidir. Siklik varliktan ve tehditten,
// etki varlik degerinden turer; risk = siklik x etki (onceki kursun tanimi, burada girdi).
export const KALEM = [];
for (const v of VARLIK)
  for (const [j, t] of TEHDIT.entries())
    if (v.maske[j] === "1") {
      const siklik = +(t.s * v.m).toFixed(3), etki = +(v.v * t.c).toFixed(1);
      const risk = +(siklik * etki).toFixed(2), bedel = +(t.b * v.bk).toFixed(1);
      // RY4: ele alma kalemin riskini tehdide bagli bir oranda dusurur; birim cabaya dusen
      // azalma = dusen risk / harcanan bedel.
      KALEM.push({ v, t, siklik, etki, risk, bedel, dusus: t.d,
        azalma: +(risk * t.d).toFixed(2), oran: +((risk * t.d) / bedel).toFixed(3) });
    }

export const TOPLAM = +KALEM.reduce((a, k) => a + k.risk, 0).toFixed(2);
// Esitlikte uretim sirasi bozulmaz (kararli siralama).
export const sirala = (f) => KALEM.map((k, i) => ({ k, i }))
  .sort((a, b) => f(b.k) - f(a.k) || a.i - b.i).map((x) => x.k);
export const yer = (L, k) => L.indexOf(k) + 1;
```

#### Listenin Sayımı

```js
// risk/uret.mjs — cift kumesinden kalem listesi, program olcegi ve kursun olcu birimi
import { VARLIK, TEHDIT, KALEM, TOPLAM, sirala, yer } from "./liste.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const SR = sirala((k) => k.risk);   // buyuklukten kucuge risk
const SO = sirala((k) => k.oran);   // birim cabaya dusen azalma

console.log(`${VARLIK.length} varlik x ${TEHDIT.length} tehdit = ${VARLIK.length * TEHDIT.length}` +
  ` olasi cift; uygulanabilir ${KALEM.length} kalem; toplam yillik risk ${TOPLAM} kurgu birim`);

const A = [-22, 6, 7, 10, 8, -22];
console.log("\n1. varlik basina");
y(A, "varlik", "adet", "kalem", "risk", "pay %", "  en buyuk kalemi");
for (const v of VARLIK) {
  const ks = KALEM.filter((k) => k.v === v);
  const en = ks.reduce((a, k) => (k.risk > a.risk ? k : a));
  y(A, v.ad, v.n, ks.length, ks.reduce((a, k) => a + k.risk, 0).toFixed(2),
    ((ks.reduce((a, k) => a + k.risk, 0) / TOPLAM) * 100).toFixed(1), "  " + en.t.ad);
}

const B = [-22, -21, 7, 8, 9, 7, 7, 5, 5];
console.log("\n2. risk sirasinda ilk on kalem");
y(B, "varlik", "tehdit", "siklik", "etki", "risk", "bedel", "oran", "R", "O");
for (const k of SR.slice(0, 10))
  y(B, k.v.ad, k.t.ad, k.siklik.toFixed(2), k.etki.toFixed(1), k.risk.toFixed(2),
    k.bedel.toFixed(1), k.oran.toFixed(3), yer(SR, k), yer(SO, k));

const C = [-22, -21, 7, 8, 9, 7, 7, 5, 5];
console.log("\n3. oran sirasinda ilk bes kalem");
y(C, "varlik", "tehdit", "siklik", "etki", "risk", "bedel", "oran", "R", "O");
for (const k of SO.slice(0, 5))
  y(C, k.v.ad, k.t.ad, k.siklik.toFixed(2), k.etki.toFixed(1), k.risk.toFixed(2),
    k.bedel.toFixed(1), k.oran.toFixed(3), yer(SR, k), yer(SO, k));

const D = [-38, 6];
console.log("\n4. iki siralama arasindaki fark");
const kayma = KALEM.map((k) => Math.abs(yer(SR, k) - yer(SO, k)));
y(D, "sirasi degisen kalem", kayma.filter((x) => x > 0).length);
y(D, "en buyuk sira kaymasi", Math.max(...kayma));
y(D, "ilk onun kaci ortak", SO.slice(0, 10).filter((k) => SR.slice(0, 10).includes(k)).length);
y(D, "en riskli kalemin oran sirasi", yer(SO, SR[0]));
y(D, "en yuksek oranli kalemin risk sirasi", yer(SR, SO[0]));

const BUTCE = 200;
const E = [-14, 7, 10, 8, 9];
console.log(`\n5. ${BUTCE} birimlik butce iki siraya gore harcaninca`);
y(E, "siralama", "kalem", "harcanan", "azalma", "kalan %");
const harca = (L) => L.reduce((s, k) => (s.h + k.bedel > BUTCE ? s
  : { h: s.h + k.bedel, a: s.a + k.azalma, n: s.n + 1 }), { h: 0, a: 0, n: 0 });
const [R, O] = [harca(SR), harca(SO)];
for (const [ad, s] of [["risk", R], ["oran", O]])
  y(E, ad, s.n, s.h.toFixed(1), s.a.toFixed(2), (((TOPLAM - s.a) / TOPLAM) * 100).toFixed(1));
console.log(`oran siralamasi ${(O.a - R.a).toFixed(2)} birim fazla azalma ` +
  `(%${(((O.a - R.a) / R.a) * 100).toFixed(1)}) ve ${(R.h - O.h).toFixed(1)} birim az harcama`);
```

```
10 varlik x 7 tehdit = 70 olasi cift; uygulanabilir 47 kalem; toplam yillik risk 5768.61 kurgu birim

1. varlik basina
varlik                  adet  kalem      risk   pay %  en buyuk kalemi
saha-dizustu             120      6    656.64    11.4  zararli-kod
sube-ucu                  40      6    360.00     6.2  zararli-kod
sayac-toplayici          300      5    414.75     7.2  zararli-kod
islem-sunucusu            12      6    546.48     9.5  zararli-kod
cevre-agi                  4      3    518.40     9.0  yanlis-yapilandirma
kimlik-dizini              1      4    828.00    14.4  yanlis-yapilandirma
bulut-hesabi               3      4   1035.00    17.9  yanlis-yapilandirma
abone-veri-tabani          1      4    414.00     7.2  yanlis-yapilandirma
saha-uygulamasi            1      5    656.04    11.4  zararli-kod
tedarikci-baglantisi       3      4    339.30     5.9  kimlik-ele-gecirme

2. risk sirasinda ilk on kalem
varlik                tehdit                siklik    etki     risk  bedel   oran    R    O
bulut-hesabi          yanlis-yapilandirma     1.20   300.0   360.00   16.8 16.071    1    4
bulut-hesabi          kimlik-ele-gecirme      0.45   700.0   315.00   56.0  3.938    2   15
kimlik-dizini         yanlis-yapilandirma     0.80   360.0   288.00    8.4 25.714    3    2
cevre-agi             yanlis-yapilandirma     1.44   180.0   259.20    7.2 27.000    4    1
kimlik-dizini         kimlik-ele-gecirme      0.30   840.0   252.00   28.0  6.300    5    8
bulut-hesabi          hizmet-kesintisi        0.60   400.0   240.00   35.0  3.429    6   17
saha-uygulamasi       zararli-kod             0.55   350.0   192.50   21.0  5.500    7   10
kimlik-dizini         hizmet-kesintisi        0.40   480.0   192.00   17.5  5.486    8   11
saha-uygulamasi       yanlis-yapilandirma     0.88   210.0   184.80    8.4 16.500    9    3
saha-dizustu          zararli-kod             0.80   225.0   180.00   30.0  3.600   10   16

3. oran sirasinda ilk bes kalem
varlik                tehdit                siklik    etki     risk  bedel   oran    R    O
cevre-agi             yanlis-yapilandirma     1.44   180.0   259.20    7.2 27.000    4    1
kimlik-dizini         yanlis-yapilandirma     0.80   360.0   288.00    8.4 25.714    3    2
saha-uygulamasi       yanlis-yapilandirma     0.88   210.0   184.80    8.4 16.500    9    3
bulut-hesabi          yanlis-yapilandirma     1.20   300.0   360.00   16.8 16.071    1    4
saha-dizustu          yanlis-yapilandirma     1.28   135.0   172.80   12.0 10.800   11    5

4. iki siralama arasindaki fark
sirasi degisen kalem                      45
en buyuk sira kaymasi                     16
ilk onun kaci ortak                        6
en riskli kalemin oran sirasi              4
en yuksek oranli kalemin risk sirasi       4

5. 200 birimlik butce iki siraya gore harcaninca
siralama        kalem  harcanan  azalma  kalan %
risk                9     198.3 1547.40     73.2
oran               13     184.7 1787.40     69.0
oran siralamasi 240.00 birim fazla azalma (%15.5) ve 13.6 birim az harcama
```

Sayılar **ölçüm** sınıfındadır; girdileri RY1–RY6'dır.

#### Süzgecin Kendisi Bir Karardır

İlk satır iki sayı veriyor: 70 olası çift ve 47 uygulanabilir kalem. Aradaki 23 çift listeye hiç
girmiyor, çünkü uygulanabilirlik maskesi onları eliyor. Çevre ağına kimlik ele geçirme
işaretlenmemiş, sayaç toplayıcıya kimlik ele geçirme işaretlenmemiş, abone veri tabanına zararlı
kod işaretlenmemiş. Her biri savunulabilir bir karardır, ama hiçbiri ölçülmüş bir karar değildir.

Elenen bir çiftin riski sıfır yazılmaz; **hiç yazılmaz**. Sıralamada görünmez, bütçede yer
tutmaz, toplamda payı olmaz. Bu, değerlendirme sürecinin en sessiz adımıdır: listeye alınmayan
kalem, sonraki bütün ölçümlerin dışında kalır. 23 elemenin biri yanlışsa, o yanlış bu dersin
hiçbir tablosunda görünmez.

#### Adet Risk Değildir

Birinci tablo program ölçeğinin ilk sonucunu veriyor. Sayaç toplayıcı 300 adetle en kalabalık
varlık sınıfıdır ve toplam riskin **yüzde 7,2'sini** taşır. Bulut hesabı **üç** adettir ve
**yüzde 17,9** taşır. Kimlik dizini **tek** adettir ve yüzde 14,4 taşır. İki sınıf birlikte
program riskinin üçte birini yazar ve envanterde dört satır tutar.

Ayrışmanın nedeni değerin adetle değil işlevle taşınmasıdır. Bir sayaç toplayıcı düştüğünde
bölgenin küçük bir parçası okunamaz; kimlik dizini düştüğünde bütün erişim kararları düşer. Adet
üzerinden kurulan bir öncelik listesi tam ters sırayı verir ve bu, envanter sayfası açıkken
verilmesi en kolay karardır.

İkinci ayrışma varlık toplamı ile kalem sıralaması arasındadır. Saha dizüstü bilgisayarı sınıf
toplamında **üçüncü**dür (656,64 birim), ama bu sınıfın en büyük kalemi ilk onda ancak **onuncu**
sıraya girer. Sınıf altı kalemin toplamıyla yukarı çıkar, tek tek her kalemi orta halli kalır.
Ters yönde çevre ağı yalnız üç kalem taşır ve bunlardan biri dördüncü sıradadır. Bir varlığı ele
almak ile bir kalemi ele almak aynı iş değildir: birincisi altı ayrı çalışma, ikincisi bir çalışma
demektir.

#### Kursun Ölçü Birimi

Buraya kadarki bütün sıralama riskin kendi büyüklüğüne göredir ve bir şeyi hiç sormaz: o riski
düşürmek ne kadar çabaya mal olur. Kalem listesinin dördüncü sütunu bunu yazar. **Birim çabaya
düşen risk azalması**, düşen riskin harcanan bedele bölümüdür ve bu kursun ölçü birimidir.

İkinci tablonun son iki sütunu iki sıralamayı yan yana koyuyor. Bulut hesabındaki kimlik ele
geçirme kalemi risk sırasında **ikinci**, oran sırasında **on beşinci**dir. Riski 315,00 birimdir,
ama ele alma bedeli 56,0 birimle kırk yedi kalemin en yüksek altı bedelinden biridir: üç bulut
hesabında kimlik düzeninin
değiştirilmesi hem en geniş çalışmadır hem de düşürdüğü oran yüzde 70'te kalır. Aynı sıradaki
komşusu — kimlik dizininde yanlış yapılandırma — 288,00 birim risk taşır ve 8,4 birime ele alınır.

Dördüncü tablo farkı toplu olarak sayıyor. Aynı 47 kalemde **45'inin sırası değişiyor**, en büyük
kayma **16 basamaktır** ve ilk onun yalnız **altısı** ortaktır. En riskli kalem oran sırasında
dördüncüye, en yüksek oranlı kalem risk sırasında dördüncüye iner. İkisi de listenin tepesinden
düşmüyor; asıl kayma orta bantta oluyor ve orta bant bütçenin çoğunun harcandığı yerdir.

#### Sıralama Bütçeye Çevrilince

Beşinci tablo farkı karara bağlıyor. İki yüz birimlik bütçe risk sırasına göre harcanınca
**dokuz kalem** ele alınıyor, 198,3 birim harcanıyor ve toplam risk 1.547,40 birim düşüyor. Aynı
bütçe oran sırasına göre harcanınca **on üç kalem** ele alınıyor, 184,7 birim harcanıyor ve risk
1.787,40 birim düşüyor. Fark **240,00 birim**, yani yüzde 15,5 daha fazla azalma — üstelik 13,6
birim daha az harcamayla.

Risk sıralamasının bütçeyi dokuz kalemde tüketmesi bir kusur değil, sıralamanın kendi mantığının
sonucudur: en büyük riskler aynı zamanda en pahalı ele alınanlardır, çünkü ikisi de aynı yerden —
varlığın merkezîliğinden — gelir. Öncelik listesi "önce büyük olan" dediğinde bütçeyi az sayıda
pahalı kaleme bağlar ve geri kalan otuz sekiz kalemi hiç açmaz. Bu, sıralamanın **yanlış kalemi öne
aldığı** birinci durumdur ve bedeli sayılabilir.

Üçüncü tablo oran sıralamasının kendi kör noktasını yazıyor: ilk beş kalemin **beşi de** yanlış
yapılandırma tehdididir. Ele alma bedeli en düşük olan tehdit türü listenin tepesini bütünüyle
kaplar. Program bu sıraya uyduğunda tek bir tehdit türünde derinleşir ve kalan risk öteki altı
türde toplanır. İki sıralamanın da bıraktığı kalan **yüzde 69 ile yüzde 73 arasındadır**; ikisi
arasındaki dört puanlık fark gerçek bir kazançtır, ama asıl sayı bütçenin listeyi bitirmeye
yetmediğidir.

#### Özet

- Risk kalemi bir varlık değil, bir varlık ile bir tehdidin çiftidir; on varlık ile yedi tehdidin
  70 çiftinden 47'si uygulanabilir ve toplam 5.768,61 kurgu birimlik yıllık risk taşır.
- Elenen 23 çift sıfır olarak değil, hiç yazılmaz; listeye alınmayan kalem sonraki bütün
  sıralamaların, bütçelerin ve toplamların dışında kalır.
- Adet ile risk ayrı sıralar verir: 300 adetlik sınıf yüzde 7,2, üç adetlik sınıf yüzde 17,9,
  tek adetlik sınıf yüzde 14,4 taşır. Varlık toplamında üçüncü olan sınıfın en büyük kalemi
  kalem sıralamasında ancak onuncudur.
- Kursun ölçü birimi birim çabaya düşen risk azalmasıdır; aynı listede 45 kalemin sırası değişir,
  en büyük kayma 16 basamaktır ve ilk onun altısı ortak kalır.
- İki yüz birimlik bütçe risk sırasına göre dokuz kalem ve 1.547,40 birim azalma, oran sırasına
  göre on üç kalem ve 1.787,40 birim azalma verir: 240,00 birim fark, 13,6 birim daha az harcamayla.
- Oran sıralamasının ilk beşi tek bir tehdit türünden gelir; iki sıralama da riskin yüzde 69 ile
  73 arasını açık bırakır.

#### Sonraki Adım

Bu dersin bütün sayıları tek bir varsayıma dayanıyor: sıklık ve etki bilinen sayılardır. Oysa
listenin hiçbir satırındaki 0,80 sıklık ya da 300,0 etki bir ölçümden gelmedi; bir kestirimden
geldi. Kurumların çoğu bu yüzden iki ayrı yol kullanır: kalemleri sayı yerine bantlara oturtan
nitel bir puanlama, ya da kaybı varlık değeri ile maruziyet oranına ayıran parasal bir model.
Sonraki ders bu iki yolu **aynı 47 kalem** üzerinde koşturur, tekil ve yıllık kayıp beklentilerini
kurgu birimle hesaplar ve tek bir soruya cevap verir: iki yöntem aynı veriden kaç sırayı farklı
yazar, hangi kalemleri beraberliğe düşürür.

### Nitel ve Nicel Yaklaşımlar

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/nitel-ve-nicel-yaklasimlar

Aynı 47 kalem iki ölçekte koşturulur: parasal model tekil ve yıllık kayıp beklentisini kurgu birimle hesaplarken beş kere beş nitel matris kalemleri üç düzeye indirir, 1.081 kalem çiftinin 479'unu beraberliğe düşürür, 52'sini ters sıralar, 184,80 birimlik kalemi orta ile 96,00 birimlik kalemi yüksek yazar ve aynı çabayla seçilen on kalemin sonucunu 745,20 birim açar.

Önceki ders 47 kalemlik listeyi üretti ve sıraladı, ama her satırdaki sıklık ile etki bir ölçümden
değil bir kestirimden geliyordu. Kestirimin iki yaygın yolu vardır: kalemleri sayı yerine bantlara
oturtan **nitel yaklaşım**, kaybı varlık değeri ile kayıp oranına ayıran **nicel yaklaşım**. Bu ders
ikisini aynı liste üzerinde koşturur. Sorulan şey hangisinin doğru olduğu değildir — ikisi de aynı
belirsiz girdiden çalışır — **aynı veriden kaç sıra farklı çıktığı** ve bu farkın bütçede kaç birim
tuttuğudur. Öncelik listesi verinin değil, veriye uygulanan ölçeğin ürünüdür.

#### İki Ölçek

Nicel yaklaşım kaybı iki parçaya ayırır. **Tekil kayıp beklentisi**, olay bir kez gerçekleştiğinde
kaybedilendir ve varlık değeri ile **maruziyet oranının** çarpımıdır: 3.000 kurgu birimlik bir veri
tabanında yüzde 35'lik bir maruziyet oranı 1.050 birimlik tekil kayıp yazar. **Yıllık kayıp
beklentisi**, tekil kayıp ile yıllık gerçekleşme sıklığının çarpımıdır. Önceki dersin "etki" ve
"risk" sütunları tam olarak bunlardır; ad değişir, sayı değişmez.

Nitel yaklaşım aynı iki girdiyi bantlara indirir ve bant çiftini bir **matrise** sokar. Her hücre
sıralı bir düzey verir. Düzeyler bir ölçek değil bir sıradır: "yüksek" ile "orta" arasındaki uzaklık
tanımsızdır, iki "orta" toplanamaz.

- **RY7.** Yedi tehdit, on varlık ve bütün katsayılar modeldir; birim **kurgu birim**dir.
- **RY8.** Varlık değeri iş tanımından türetilmiş sayılır ve modelde sabittir.
- **RY9.** Tekil kayıp beklentisi varlık değeri ile maruziyet oranının, yıllık kayıp beklentisi
  tekil kayıp ile yıllık sıklığın çarpımıdır.
- **RY10.** Nitel matris beş kere beştir ve dört düzey taşır; düzeyler sıralıdır, toplanamaz.
- **RY11.** Taban sıklık bir kestirimdir; sapma üreteci her tehdide 0,75 ile 1,25 arasında bir
  katsayı verir, tohum görünürdür ve çıktı koşumdan koşuma değişmez.

```js
// risk/olcek.mjs — ayni 47 kalem, iki olcek: nitel bant matrisi ve parasal model. MODELDIR;
// gercek envanter, gercek olay kaydi ve gercek para birimi yok, birim "kurgu birim"dir.

// RY7: tehdit satiri: ad | yillik gerceklesme sikligi (taban) | maruziyet orani
const TEHDIT = `
  kimlik-ele-gecirme   0.30  0.35
  zararli-kod          0.50  0.25
  yanlis-yapilandirma  0.80  0.15
  ic-kotuye-kullanim   0.10  0.40
  hizmet-kesintisi     0.40  0.20
  fiziksel-erisim      0.06  0.50
  tedarik-zinciri      0.08  0.45`
  .trim().split("\n").map((r) => { const [ad, s, m] = r.trim().split(/\s+/);
    return { ad, s: +s, m: +m }; });

// RY8: varlik satiri: ad | varlik degeri | maruziyet katsayisi | tehdit maskesi (yedi hane)
const VARLIK = `
  saha-dizustu           900  1.6  1111011
  sube-ucu               600  1.2  1111110
  sayac-toplayici        750  1.4  0111110
  islem-sunucusu        1800  0.6  1111101
  cevre-agi             1200  1.8  0011100
  kimlik-dizini         2400  1.0  1011100
  bulut-hesabi          2000  1.5  1011100
  abone-veri-tabani     3000  0.4  1011100
  saha-uygulamasi       1400  1.1  1111001
  tedarikci-baglantisi  1000  1.3  1001101`
  .trim().split("\n").map((r) => { const [ad, v, k, maske] = r.trim().split(/\s+/);
    return { ad, v: +v, k: +k, maske }; });

// RY9: parasal model. Tekil kayip beklentisi (TKB) = varlik degeri x maruziyet orani;
// yillik kayip beklentisi (YKB) = TKB x yillik siklik. Onceki dersin "etki" ve "risk"
// sutunlari bunlardir; ad degisti, sayi degismedi.
export const KALEM = [];
for (const v of VARLIK)
  for (const [j, t] of TEHDIT.entries())
    if (v.maske[j] === "1") {
      const siklik = +(t.s * v.k).toFixed(3), tkb = +(v.v * t.m).toFixed(1);
      KALEM.push({ v, t, j, siklik, tkb, ykb: +(siklik * tkb).toFixed(2) });
    }

// RY10: nitel olcek. Siklik ve TKB birer banda indirilir, bant cifti bir matris hucresine
// bakar; hucre dort duzeyden birini verir. Duzeyler siralidir, toplanamaz.
const bant = (x, s) => s.findIndex((u) => x < u) + 1 || s.length + 1;
export const S_SINIR = [0.10, 0.25, 0.50, 1.00], E_SINIR = [180, 315, 450, 700];
export const DUZEY = ["dusuk", "orta", "yuksek", "kritik"];
// Satir = TKB bandi (5'ten 1'e), sutun = siklik bandi (1'den 5'e). Rakam DUZEY dizinidir.
export const MATRIS = ["12233", "11223", "01122", "00112", "00011"];
export const sBant = (k) => bant(k.siklik, S_SINIR);
export const eBant = (k) => bant(k.tkb, E_SINIR);
export const duzey = (k) => +MATRIS[5 - eBant(k)][sBant(k) - 1];
for (const k of KALEM) { k.sb = sBant(k); k.eb = eBant(k); k.d = duzey(k); }

export const TOPLAM = +KALEM.reduce((a, k) => a + k.ykb, 0).toFixed(2);
export const sirala = (f) => KALEM.map((k, i) => ({ k, i }))
  .sort((a, b) => f(b.k) - f(a.k) || a.i - b.i).map((x) => x.k);
export const yer = (L, k) => L.indexOf(k) + 1;

// RY11: kestirim sapmasi. Taban siklik bir olcum degil bir kestirimdir; asagidaki uretec her
// tehdide 0,75 ile 1,25 arasinda bir katsayi verir. Tohum gorunurdur, cikti degismez.
let tohum = 20250401;
const rast = () => (tohum = (tohum * 1103515245 + 12345) % 2147483648) / 2147483648;
export const SAPMA = TEHDIT.map(() => +(0.75 + rast() * 0.5).toFixed(3));
export const sapmali = (k) => {
  const siklik = +(k.siklik * SAPMA[k.j]).toFixed(3);
  return { siklik, ykb: +(siklik * k.tkb).toFixed(2),
    d: +MATRIS[5 - k.eb][bant(siklik, S_SINIR) - 1] };
};
```

#### Aynı Listede İki Ölçek

```js
// risk/karsilastir.mjs — nitel duzey ile yillik kayip beklentisi ayni listede yarisir
import { KALEM, TOPLAM, DUZEY, MATRIS, S_SINIR, E_SINIR, SAPMA, sapmali, sirala, yer }
  from "./olcek.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const SN = sirala((k) => k.ykb);   // parasal: yillik kayip beklentisi
const SQ = sirala((k) => k.d);     // nitel: duzey, esitlikte liste sirasi bozulmaz

console.log(`${KALEM.length} kalem, toplam yillik kayip beklentisi ${TOPLAM} kurgu birim; ` +
  `bant sinirlari ${S_SINIR.join("/")} ve ${E_SINIR.join("/")}`);

const A = [-9, 9, 9, 9, 9, 9];
console.log("\n1. nitel matris (satir: tekil kayip bandi 5..1, sutun: siklik bandi 1..5)");
y(A, "tkb\\sik", "1", "2", "3", "4", "5");
MATRIS.forEach((r, i) => y(A, String(5 - i), ...[...r].map((c) => DUZEY[+c])));
const sb5 = KALEM.filter((k) => k.sb === 5), eb5 = KALEM.filter((k) => k.eb === 5);
console.log(`25 hucrenin ${new Set(KALEM.map((k) => `${k.eb}${k.sb}`)).size} tanesi dolu; ` +
  `siklik bandi 5 olan ${sb5.length} kalemin en yuksek tekil kayip bandi ` +
  `${Math.max(...sb5.map((k) => k.eb))}, tekil kayip bandi 5 olan ${eb5.length} kalemin ` +
  `en yuksek siklik bandi ${Math.max(...eb5.map((k) => k.sb))}`);

const B = [-8, 7, 10, 10, 6, 12, 8];
console.log("\n2. duzey basina");
y(B, "duzey", "kalem", "en kucuk", "en buyuk", "kat", "toplam YKB", "pay %");
for (const [i, ad] of DUZEY.entries()) {
  const g = KALEM.filter((k) => k.d === i);
  if (g.length === 0) { y(B, ad, 0, "-", "-", "-", "0.00", "0.0"); continue; }
  const alt = Math.min(...g.map((k) => k.ykb)), ust = Math.max(...g.map((k) => k.ykb));
  const t = g.reduce((a, k) => a + k.ykb, 0);
  y(B, ad, g.length, alt.toFixed(2), ust.toFixed(2), (ust / alt).toFixed(1),
    t.toFixed(2), ((t / TOPLAM) * 100).toFixed(1));
}

const YUK = KALEM.filter((k) => k.d === 2).sort((a, b) => b.ykb - a.ykb);
const C = [-22, -21, 5, 5, 10, 5];
console.log("\n3. 'yuksek' duzeyinin parasal sirada geriye dusen bolumu");
y(C, "varlik", "tehdit", "s-b", "t-b", "YKB", "N");
for (const k of YUK.slice(8)) y(C, k.v.ad, k.t.ad, k.sb, k.eb, k.ykb.toFixed(2), yer(SN, k));
console.log(`bu duzeyin ilk ${YUK.filter((k, i) => yer(SN, k) === i + 1).length} kalemi ` +
  `parasal sirada da ayni yerdedir`);
const ortaUst = KALEM.filter((k) => k.d === 1).reduce((a, k) => (k.ykb > a.ykb ? k : a));
console.log(`en yuksek YKB'li "orta" kalem: ${ortaUst.v.ad} / ${ortaUst.t.ad} ` +
  `${ortaUst.ykb.toFixed(2)} birim, YKB sirasi ${yer(SN, ortaUst)}`);

const D = [-42, 8];
console.log("\n4. iki olcek arasindaki fark");
const cift = (f) => { let n = 0;
  for (let a = 0; a < KALEM.length; a++) for (let b = a + 1; b < KALEM.length; b++)
    if (f(KALEM[a], KALEM[b])) n++;
  return n; };
y(D, "toplam kalem cifti", cift(() => true));
y(D, "nitel olcekte beraberlige dusen cift", cift((a, b) => a.d === b.d));
y(D, "iki olcegin ters siraladigi cift", cift((a, b) => (a.d - b.d) * (a.ykb - b.ykb) < 0));
y(D, "nitel olcekte kullanilan duzey", new Set(KALEM.map((k) => k.d)).size + "/4");
y(D, "ilk onun kaci ortak", SQ.slice(0, 10).filter((k) => SN.slice(0, 10).includes(k)).length);

const E = [-42, 8];
const top = (L) => +L.reduce((a, k) => a + k.ykb, 0).toFixed(2);
console.log("\n5. ayni cabayla on kalem secilirse (beraberlik keyfiligi)");
y(E, "parasal siraya gore ilk on", top(SN.slice(0, 10)));
y(E, "nitel: yuksek duzeyden en iyi on", top(YUK.slice(0, 10)));
y(E, "nitel: yuksek duzeyden en kotu on", top(YUK.slice(-10)));
y(E, "keyfiligin acikligi", +(top(YUK.slice(0, 10)) - top(YUK.slice(-10))).toFixed(2));

const F = [-42, 8];
const SS = sirala((k) => sapmali(k).ykb);
console.log(`\n6. kestirim sapmasi (tehdit basina katsayi: ${SAPMA.join(" ")})`);
y(F, "YKB sirasi degisen kalem", KALEM.filter((k) => yer(SN, k) !== yer(SS, k)).length);
y(F, "en buyuk sira kaymasi", Math.max(...KALEM.map((k) => Math.abs(yer(SN, k) - yer(SS, k)))));
y(F, "parasal ilk onun kaci ayni kalir",
  SS.slice(0, 10).filter((k) => SN.slice(0, 10).includes(k)).length);
y(F, "nitel duzeyi degisen kalem", KALEM.filter((k) => sapmali(k).d !== k.d).length);
```

```
47 kalem, toplam yillik kayip beklentisi 5768.61 kurgu birim; bant sinirlari 0.1/0.25/0.5/1 ve 180/315/450/700

1. nitel matris (satir: tekil kayip bandi 5..1, sutun: siklik bandi 1..5)
tkb\sik          1        2        3        4        5
5             orta   yuksek   yuksek   kritik   kritik
4             orta     orta   yuksek   yuksek   kritik
3            dusuk     orta     orta   yuksek   yuksek
2            dusuk    dusuk     orta     orta   yuksek
1            dusuk    dusuk    dusuk     orta     orta
25 hucrenin 18 tanesi dolu; siklik bandi 5 olan 4 kalemin en yuksek tekil kayip bandi 2, tekil kayip bandi 5 olan 8 kalemin en yuksek siklik bandi 3

2. duzey basina
duzey     kalem  en kucuk  en buyuk   kat  toplam YKB   pay %
dusuk         5     21.60     57.60   2.7      181.50     3.1
orta         28     38.88    184.80   4.8     2705.71    46.9
yuksek       14     96.00    360.00   3.8     2881.40    49.9
kritik        0         -         -     -        0.00     0.0

3. 'yuksek' duzeyinin parasal sirada geriye dusen bolumu
varlik                tehdit                 s-b  t-b       YKB    N
saha-uygulamasi       kimlik-ele-gecirme       3    4    161.70   13
abone-veri-tabani     yanlis-yapilandirma      3    4    144.00   15
islem-sunucusu        zararli-kod              3    4    135.00   17
abone-veri-tabani     kimlik-ele-gecirme       2    5    126.00   21
bulut-hesabi          ic-kotuye-kullanim       2    5    120.00   22
kimlik-dizini         ic-kotuye-kullanim       2    5     96.00   25
bu duzeyin ilk 8 kalemi parasal sirada da ayni yerdedir
en yuksek YKB'li "orta" kalem: saha-uygulamasi / yanlis-yapilandirma 184.80 birim, YKB sirasi 9

4. iki olcek arasindaki fark
toplam kalem cifti                            1081
nitel olcekte beraberlige dusen cift           479
iki olcegin ters siraladigi cift                52
nitel olcekte kullanilan duzey                 3/4
ilk onun kaci ortak                              7

5. ayni cabayla on kalem secilirse (beraberlik keyfiligi)
parasal siraya gore ilk on                  2463.5
nitel: yuksek duzeyden en iyi on            2404.4
nitel: yuksek duzeyden en kotu on           1659.2
keyfiligin acikligi                          745.2

6. kestirim sapmasi (tehdit basina katsayi: 1.116 0.896 1.167 0.756 0.814 0.759 1.191)
YKB sirasi degisen kalem                        37
en buyuk sira kaymasi                            7
parasal ilk onun kaci ayni kalir                 8
nitel duzeyi degisen kalem                       8
```

Sayılar **ölçüm** sınıfındadır; girdileri RY7–RY11'dir.

#### Hiç Dolmayan Köşe

Matris dört düzey tanımlıyor ve programda **üçü** kullanılıyor. "Kritik" hücreleri boş kalıyor,
çünkü o hücreler hem yüksek sıklık hem yüksek tekil kayıp istiyor ve iki koşul aynı kalemde
buluşmuyor: sıklık bandı 5 olan dört kalemin en yüksek tekil kayıp bandı **2**, tekil kayıp bandı 5
olan sekiz kalemin en yüksek sıklık bandı **3**. Yirmi beş hücrenin on sekizi doluyor, ama dolan
hücreler köşegenin iki yanına yayılıyor.

Bu, ölçeğin **çözünürlüğünün** veriye göre daraldığını gösterir: 47 kalem üç kelimeyle anlatılır
ve en kalabalık kelime "orta"dır — 28 kalem, listenin yüzde altmışı, tek bir kutuda durur.

#### Aynı Düzeyin İçindeki Açıklık

İkinci tablo bu dersin ana bulgusunu veriyor. "Yüksek" düzeyindeki 14 kalemin yıllık kayıp
beklentisi **96,00 ile 360,00 birim** arasında değişiyor — **3,8 kat**. "Orta" düzeyinde açıklık
daha da geniştir: 38,88 ile 184,80 arası, **4,8 kat**.

Asıl sonuç iki düzeyin kesiştiği yerdedir. En yüksek yıllık kayıp beklentisine sahip "orta" kalem
saha uygulamasındaki yanlış yapılandırmadır: 184,80 birim ve parasal sırada **dokuzuncu**. Aynı
listede kimlik dizinindeki iç kötüye kullanım kalemi "yüksek" yazılır ve 96,00 birim taşır, parasal
sırada **yirmi beşinci**dir. Nitel ölçek ikincisini öne alır, parasal model birincisini on altı
sıra öne alır.

Ters çevrilme rastlantı değildir. Nitel matris tekil kaybı ve sıklığı **ayrı ayrı** bantlar; bir
kalem tek boyutta uç değere gittiğinde hücre onu yukarı taşır, çarpımın ne verdiğine bakmaz.
Üçüncü tablo bu kalemleri ayırıyor: "yüksek" düzeyinin ilk sekizi parasal sırada da ilk sekizdir,
geriye kalan altısı 13. ile 25. sıralar arasına dağılır ve üçünde tekil kayıp bandı 5, sıklık
bandı 2'dir.

Dördüncü tablo aynı olguyu çift sayısıyla ölçüyor. 47 kalem 1.081 çift üretir; nitel ölçek bunların
**479'unu beraberliğe** düşürür ve **52 çiftte** iki ölçek birbirinin tersini söyler. Beraberlik bir
eksiklik, ters sıralama bir çelişkidir; ilki kararı erteler, ikincisi yanlış kararı verdirir.

#### Beraberlik Bütçeye Çevrilince

Beşinci tablo beraberliğin bedelini yazıyor. Program on kalem ele alabiliyorsa parasal sıra ilk onu
seçer ve **2.463,50 birim** hedefler. Nitel sıra "yüksek" düzeyindeki 14 kalemden onunu seçer, ama
hangi onunu seçeceğini söylemez: en iyi seçim **2.404,40**, en kötü seçim **1.659,20 birim** tutar.

Aradaki **745,20 birim** ölçeğin bıraktığı keyfiliktir. Aynı liste, aynı çaba ve aynı kalem sayısı;
sonucu belirleyen şey listenin hangi sırayla yazıldığıdır. Nitel yaklaşımın iyi ucu parasal modelin
sonucuna 59,10 birim yaklaşır, kötü ucu 804,30 birim uzaktadır. Ölçek yanlış değildir, **eksik**tir:
kararı bir yere kadar götürür ve son adımı adlandırılmamış bir tercihe bırakır.

#### Kestirim Sapması Karşısında

Altıncı tablo parasal modelin kendi zayıflığını ölçer. Taban sıklıklar yüzde 25'lik bir bantta
oynatıldığında — üreteç ders içinde yazılıdır, tohum görünürdür — parasal sıralamada **37 kalemin
yeri değişir** ve en büyük kayma yedi basamaktır. İlk onun sekizi yerinde kalır; oynayan yer orta
banttır.

Aynı sapma nitel ölçekte yalnız **8 kalemin düzeyini** değiştirir. Bant sınırları girdideki oynamayı
yutar: 0,36 ile 0,44 arasındaki bir sıklık aynı banda düşer. Çözünürlük kaybı burada bir kazanca
dönüşür — az sayıda kutu, girdi hatasına az tepki verir.

İki tablo birlikte okunduğunda seçim netleşir. Parasal model daha ince ayrım yapar ve bu ayrımın
bir bölümü gerçek değil, kestirim gürültüsüdür; 37 kalemlik kayma bunun kanıtıdır. Nitel model
gürültüye dayanır ve karşılığında 479 çiftte hiçbir şey söylemez. **İkisi de aynı belirsizliği
farklı yere koyar:** biri sayının basamaklarına, öteki kutunun içine. Hangi yaklaşımın kullanıldığı
yazılmadıkça sıralamanın ne kadarının veriden geldiği bilinemez.

#### Özet

- Parasal model kaybı ikiye ayırır: tekil kayıp beklentisi varlık değeri ile maruziyet oranının,
  yıllık kayıp beklentisi tekil kayıp ile yıllık sıklığın çarpımıdır; toplam 5.768,61 kurgu birimdir.
- Beş kere beşlik nitel matris dört düzey tanımlar, programda üçünü kullanır; 25 hücrenin 18'i
  doludur ve "kritik" boş kalır, çünkü yüksek sıklık ile yüksek tekil kayıp aynı kalemde buluşmaz.
- Aynı düzeyin içindeki açıklık 3,8 ile 4,8 kat arasındadır; 184,80 birimlik kalem "orta",
  96,00 birimlik kalem "yüksek" yazılır, aralarında on altı sıra vardır.
- 1.081 kalem çiftinin 479'u nitel ölçekte beraberliğe düşer, 52'sinde iki ölçek birbirinin tersini
  söyler; ilk onun yalnız yedisi ortaktır.
- On kalemlik aynı çaba parasal sırayla 2.463,50 birim, nitel sırayla 1.659,20 ile 2.404,40 arası
  hedefler; 745,20 birimlik açıklık ölçeğin adlandırmadığı tercihtir.
- Sıklık kestirimi yüzde 25 bandında oynatıldığında parasal sırada 37 kalem yer değiştirir, nitel
  ölçekte yalnız 8 kalemin düzeyi değişir: çözünürlük kaybı girdi hatasına dayanıklılık verir.

#### Sonraki Adım

İki ders de aynı sessiz varsayımı taşıyor: her kalem için tek bir ele alma yolu vardı ve o yol
riski sabit bir oranda düşürüyordu. Gerçekte bir risk kalemine dört ayrı biçimde karşılık verilir —
kontrol ekleyip **azaltmak**, bedelini bir sözleşmeyle **aktarmak**, olduğu gibi **kabul etmek**,
riski doğuran işi bırakarak **kaçınmak**. Dördü aynı bütçeden harcanır ve birim başına düşürdükleri
risk farklıdır. Sonraki ders dördünü aynı liste üzerinde koşturur ve aktarmanın hangi kalemleri
devretmediğini ayrıca sayar.

### Risk Ele Alma Seçenekleri

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/risk-ele-alma-secenekleri

Azaltma, aktarma, kabul ve kaçınma aynı 300 birimlik yıllık bütçede koşturulur: azaltma 22 kararla 2.746,71 birim düşürürken aktarma 243,00 ve kaçınma 656,04 birimde kalır, devir sözleşmesi 235 bileşen kaleminin 76'sını devralıp 3.507,70 birimi dışarıda bırakır, kaçınma varlık düzeyinde bir karar olduğu için 1.200 birimlik bütçede bile sıralamaya hiç giremez ve kabul edilen 3.021,90 birimin 1.699,81'i hiç açılmamış 25 kalemden gelir.

Önceki iki ders listeyi kurdu ve iki ölçekle sıraladı, ama her kalem için tek bir karşılık tanıdı.
Karşılık dörttür. **Azaltma** kontrol ekleyip
olasılığı ya da etkiyi düşürür, **aktarma** kaybın bir bölümünü bir devir sözleşmesiyle başkasına
yükler, **kabul** kalemi olduğu gibi taşır, **kaçınma** riski doğuran işten vazgeçer. Dördü aynı
bütçeden harcanır ama farklı birimlerde tüketir. Bu ders ortak birime çevirir, dördünü aynı listede
koşturur ve iki şeyi ayrıca sayar: aktarmanın **devretmediği** kalem ile kaçınmanın sıralamaya
**girememesi**.

#### Dört Seçenek, Tek Birim

Azaltmanın bedeli bir kurulum ve bir bakımdır; kurulum bir kez, bakım her yıl ödenir. Aktarmanın
bedeli yıllık bir primdir ve prim, devredilen riskin bir **yükleme** katsayısıyla çarpımıdır.
Kaçınmanın bedeli vazgeçilen işin yıllık değeridir; kabulün bedeli de düşürdüğü risk de sıfırdır.

Ortak birim **yıllık kurgu birim**dir: kurulum bedeli üç yıla bölünüp bakım eklenir, prim ve
vazgeçilen iş değeri zaten yıllıktır. Bu çevirim yapılmadan karşılaştırma sessizce bozulur.

- **RY12.** Katsayıların, bedellerin, devir yüklemelerinin ve bileşen dağılımlarının hepsi
  modeldir; birim **kurgu birim**dir.
- **RY13.** Kaçınma bedeli işten vazgeçmenin yıllık iş değeri kaybıdır; `-` işaretli varlıkta iş
  bırakılamaz.
- **RY14.** Devir sözleşmesi beş bileşenden ilk ikisini kapsar, üçünü kapsamaz.
- **RY15.** Bütün bedeller yıllık birime çevrilir: azaltmanın yıllık bedeli kurulumun üçe bölünmüşü
  artı yıllık bakımdır.
- **RY16.** Bütçe oran sırasına göre harcanır; alınmış bir kalem ikinci kez ele alınmaz. Kaçınma
  varlık düzeyinde bir karardır ve varlığın bütün kalemlerini birden kapatır.

```js
// risk/secenek.mjs — ayni 47 kalem, dort ele alma secenegi. MODELDIR; gercek envanter,
// gercek sozlesme ve gercek para birimi yok, butun bedeller yillik "kurgu birim"dir.

// RY12: tehdit satiri: ad | siklik | maruziyet orani | azaltmanin dusurdugu oran |
// kurulum bedeli | yillik bakim | devir yuklemesi ('-' devredilemez) |
// bilesen dagilimi (yuzde): dogrudan / kesinti / duzeltme / bildirim / itibar
export const TEHDIT = `
  kimlik-ele-gecirme   0.30  0.35  0.70  40   9  1.35  30 15 20 20 15
  zararli-kod          0.50  0.25  0.60  30   8  1.50  25 35 25  5 10
  yanlis-yapilandirma  0.80  0.15  0.75  12   5     -  20 45 25  0 10
  ic-kotuye-kullanim   0.10  0.40  0.40  55  12  1.80  35 10 15 20 20
  hizmet-kesintisi     0.40  0.20  0.50  25   6  1.20  10 65 20  0  5
  fiziksel-erisim      0.06  0.50  0.65  35   7  1.45  45 15 15 15 10
  tedarik-zinciri      0.08  0.45  0.30  60  14  1.60  30 25 20 10 15`
  .trim().split("\n").map((r) => {
    const [ad, s, m, d, kur, bak, yuk, ...b] = r.trim().split(/\s+/);
    return { ad, s: +s, m: +m, d: +d, kur: +kur, bak: +bak,
      yuk: yuk === "-" ? null : +yuk, b: b.map(Number) };
  });

// RY13: varlik satiri: ad | deger | maruziyet katsayisi | bedel katsayisi |
// kacinma yillik bedeli ('-' isten vazgecilemez) | tehdit maskesi
export const VARLIK = `
  saha-dizustu           900  1.6  1.0    -  1111011
  sube-ucu               600  1.2  1.0    -  1111110
  sayac-toplayici        750  1.4  1.5    -  0111110
  islem-sunucusu        1800  0.6  0.8    -  1111101
  cevre-agi             1200  1.8  0.6    -  0011100
  kimlik-dizini         2400  1.0  0.7    -  1011100
  bulut-hesabi          2000  1.5  1.4  620  1011100
  abone-veri-tabani     3000  0.4  0.9    -  1011100
  saha-uygulamasi       1400  1.1  0.7  300  1111001
  tedarikci-baglantisi  1000  1.3  1.2  260  1001101`
  .trim().split("\n").map((r) => {
    const [ad, v, m, bk, kac, maske] = r.trim().split(/\s+/);
    return { ad, v: +v, m: +m, bk: +bk, kac: kac === "-" ? null : +kac, maske };
  });

export const BILESEN = ["dogrudan", "kesinti", "duzeltme", "bildirim", "itibar"];
// RY14: devir sozlesmesi ilk iki bileseni kapsar, ucunu kapsamaz.
export const KAPSAM = [1, 1, 0, 0, 0];

export const KALEM = [];
for (const v of VARLIK)
  for (const t of TEHDIT.filter((_, j) => v.maske[j] === "1")) {
    const risk = +(t.s * v.m * v.v * t.m).toFixed(2);
    // RY15: butun bedeller yillik birime cevrilir. Azaltmanin yillik bedeli kurulumun
    // uc yila bolunmusu arti yillik bakimdir; devir primi devredilen riskin yuklemelisidir.
    const azBedel = +(((t.kur / 3) + t.bak) * v.bk).toFixed(2);
    const pay = t.b.reduce((a, x, i) => a + x * KAPSAM[i], 0) / 100;
    KALEM.push({ v, t, risk,
      azaltma: { bedel: azBedel, duser: +(risk * t.d).toFixed(2) },
      aktarma: t.yuk === null ? null
        : { bedel: +(risk * pay * t.yuk).toFixed(2), duser: +(risk * pay).toFixed(2), pay },
    });
  }
for (const k of KALEM)
  for (const s of ["azaltma", "aktarma"])
    if (k[s]) k[s].oran = +(k[s].duser / k[s].bedel).toFixed(3);

// Kacinma varlik duzeyinde bir karardir: varligin butun kalemleri listeden cikar.
export const KACINMA = VARLIK.filter((v) => v.kac !== null).map((v) => {
  const ks = KALEM.filter((k) => k.v === v);
  const duser = +ks.reduce((a, k) => a + k.risk, 0).toFixed(2);
  return { v, ks, bedel: v.kac, duser, oran: +(duser / v.kac).toFixed(3) };
});
export const TOPLAM = +KALEM.reduce((a, k) => a + k.risk, 0).toFixed(2);
```

#### Aynı Bütçede Dört Strateji

```js
// risk/yaris.mjs — dort secenek ayni butcede kosar; kabul edilen kalan ayrica sayilir
import { KALEM, KACINMA, TOPLAM, BILESEN, KAPSAM } from "./secenek.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const AK = KALEM.filter((k) => k.aktarma);
const aday = (L, alan) => L.map((k) => ({ ...k[alan], ad: alan, ks: [k] }));
const enIyi = KALEM.map((k) => (k.aktarma && k.aktarma.oran > k.azaltma.oran
  ? { ...k.aktarma, ad: "aktarma", ks: [k] } : { ...k.azaltma, ad: "azaltma", ks: [k] }));
const KARMA = [...enIyi, ...KACINMA.map((x) => ({ ...x, ad: "kacinma" }))];

// Butce oran sirasina gore harcanir; alinmis kalemi ikinci kez ele almak yok.
const kos = (adaylar, butce) => {
  const alinan = new Set(); const sec = [];
  let h = 0, d = 0;
  for (const a of [...adaylar].sort((x, z) => z.oran - x.oran))
    if (!a.ks.some((k) => alinan.has(k)) && h + a.bedel <= butce) {
      a.ks.forEach((k) => alinan.add(k)); h += a.bedel; d += a.duser; sec.push(a);
    }
  return { sec, alinan, n: sec.length, h: +h.toFixed(2), d: +d.toFixed(2),
    kalan: +(TOPLAM - d).toFixed(2) };
};

console.log(`${KALEM.length} kalem, toplam yillik risk ${TOPLAM} kurgu birim`);

const A = [-10, 9, 10, 10, 10, 8];
console.log("\n1. secenek basina uygulanabilirlik ve oran (dusen risk / yillik bedel)");
y(A, "secenek", "birim", "en dusuk", "en yuksek", "ortalama", "karar");
for (const [ad, L, f, kapsam] of [["azaltma", KALEM, (k) => k.azaltma.oran, "kalem"],
  ["aktarma", AK, (k) => k.aktarma.oran, "kalem"],
  ["kacinma", KACINMA, (x) => x.oran, "varlik"]]) {
  const o = L.map(f);
  y(A, ad, L.length, Math.min(...o).toFixed(3), Math.max(...o).toFixed(3),
    (o.reduce((a, x) => a + x, 0) / o.length).toFixed(3), kapsam);
}
console.log("kabul   47 kalem, bedel 0, dusen risk 0: secilmeyen her kalemin varsayilanidir");
console.log("aktarma orani azaltmadan iyi olan kalem: " +
  `${AK.filter((k) => k.aktarma.oran > k.azaltma.oran).length}`);

const B = [-22, 7, 10, 12, 13, 8];
console.log("\n2. 300 birimlik yillik butce, dort strateji");
y(B, "strateji", "karar", "harcanan", "dusen risk", "kabul edilen", "kalan %");
for (const [ad, L] of [["yalniz azaltma", aday(KALEM, "azaltma")],
  ["yalniz aktarma", aday(AK, "aktarma")], ["yalniz kacinma", KACINMA],
  ["karma", KARMA]]) {
  const r = kos(L, 300);
  y(B, ad, r.n, r.h.toFixed(2), r.d.toFixed(2), r.kalan.toFixed(2),
    ((r.kalan / TOPLAM) * 100).toFixed(1));
}

const C = [-9, 8, 8, 15, 8];
console.log("\n3. aktarmanin devrettigi ve devretmedigi bilesen (38 devredilebilir kalem)");
y(C, "bilesen", "kapsam", "kalem", "tasidigi birim", "pay %");
const bil = (i) => +AK.reduce((a, k) => a + k.risk * k.t.b[i] / 100, 0).toFixed(2);
for (const [i, ad] of BILESEN.entries())
  y(C, ad, KAPSAM[i] ? "devir" : "kalir", AK.length, bil(i).toFixed(2),
    ((bil(i) / TOPLAM) * 100).toFixed(1));
const devir = BILESEN.reduce((a, _, i) => a + KAPSAM[i] * bil(i), 0);
const bk = KALEM.length * BILESEN.length, dv = AK.length * KAPSAM.filter(Boolean).length;
console.log(`${bk} bilesen kaleminin ${dv} tanesi devrediliyor, ${bk - dv} tanesi kaliyor; ` +
  `devredilen ${devir.toFixed(2)}, disarida kalan ${(TOPLAM - devir).toFixed(2)} birim`);

const D = [-8, 7, 10, 11, 9, 9, 9];
console.log("\n4. karma strateji butce buyudukce: hangi secenek listeye giriyor");
y(D, "butce", "karar", "harcanan", "dusen risk", "azaltma", "aktarma", "kacinma");
for (const b of [300, 600, 900, 1200]) {
  const r = kos(KARMA, b);
  const say = (ad) => r.sec.filter((a) => a.ad === ad).length;
  y(D, b, r.n, r.h.toFixed(2), r.d.toFixed(2), say("azaltma"), say("aktarma"), say("kacinma"));
}

const r300 = kos(KARMA, 300);
const bos = KALEM.filter((k) => !r300.alinan.has(k));
const bosRisk = +bos.reduce((a, k) => a + k.risk, 0).toFixed(2);
const enTekil = bos.reduce((a, k) => (k.v.v * k.t.m > a.v.v * a.t.m ? k : a));
console.log(`\n5. 300 birimlik karma stratejide kabul edilen ${r300.kalan.toFixed(2)} birim`);
console.log(`hic acilmayan ${bos.length} kalem ${bosRisk} birim, ele alinan ${r300.n} kalemin ` +
  `artigi ${(r300.kalan - bosRisk).toFixed(2)} birim`);
console.log(`acilmayanlarin en buyuk tekil kaybi: ${enTekil.v.ad} / ${enTekil.t.ad}, ` +
  `yillik ${enTekil.risk.toFixed(2)}, tekil ${(enTekil.v.v * enTekil.t.m).toFixed(1)} birim`);

const F = [-22, 8, 7, 9, 9];
console.log("\n6. kacinma neden hic secilmiyor (1200 birimlik butce)");
y(F, "varlik", "oran", "kalem", "onceden", "bedel");
const r1200 = kos(KARMA, 1200);
for (const x of KACINMA)
  y(F, x.v.ad, x.oran.toFixed(3), x.ks.length,
    x.ks.filter((k) => r1200.sec.some((a) => a.oran > x.oran && a.ks.includes(k))).length,
    x.bedel);
```

```
47 kalem, toplam yillik risk 5768.61 kurgu birim

1. secenek basina uygulanabilirlik ve oran (dusen risk / yillik bedel)
secenek       birim  en dusuk en yuksek  ortalama   karar
azaltma          47     0.344    36.000     6.286   kalem
aktarma          38     0.556     0.833     0.686   kalem
kacinma           3     1.305     2.187     1.720  varlik
kabul   47 kalem, bedel 0, dusen risk 0: secilmeyen her kalemin varsayilanidir
aktarma orani azaltmadan iyi olan kalem: 5

2. 300 birimlik yillik butce, dort strateji
strateji                karar  harcanan  dusen risk kabul edilen kalan %
yalniz azaltma             22    295.40     2746.71      3021.90    52.4
yalniz aktarma              4    291.60      243.00      5525.61    95.8
yalniz kacinma              1    300.00      656.04      5112.57    88.6
karma                      22    295.40     2746.71      3021.90    52.4

3. aktarmanin devrettigi ve devretmedigi bilesen (38 devredilebilir kalem)
bilesen    kapsam   kalem tasidigi birim   pay %
dogrudan    devir      38        1008.57    17.5
kesinti     devir      38        1252.34    21.7
duzeltme    kalir      38         803.40    13.9
bildirim    kalir      38         463.58     8.0
itibar      kalir      38         489.92     8.5
235 bilesen kaleminin 76 tanesi devrediliyor, 159 tanesi kaliyor; devredilen 2260.91, disarida kalan 3507.70 birim

4. karma strateji butce buyudukce: hangi secenek listeye giriyor
butce     karar  harcanan dusen risk  azaltma  aktarma  kacinma
300          22    295.40    2746.71       22        0        0
600          36    595.93    3386.45       36        0        0
900          45    887.04    3579.51       42        3        0
1200         47    944.39    3611.37       42        5        0

5. 300 birimlik karma stratejide kabul edilen 3021.90 birim
hic acilmayan 25 kalem 1699.81 birim, ele alinan 22 kalemin artigi 1322.09 birim
acilmayanlarin en buyuk tekil kaybi: abone-veri-tabani / ic-kotuye-kullanim, yillik 48.00, tekil 1200.0 birim

6. kacinma neden hic secilmiyor (1200 birimlik butce)
varlik                    oran  kalem  onceden    bedel
bulut-hesabi             1.669      4        3      620
saha-uygulamasi          2.187      5        3      300
tedarikci-baglantisi     1.305      4        2      260
```

Sayılar **ölçüm** sınıfındadır; girdileri RY12–RY16'dır.

#### Oranların Ayrıştığı Yer

Birinci tablo dört seçeneği tek sütunda karşılaştırıyor. Azaltmanın oranı 0,344 ile 36,000
arasında değişir, ortalaması 6,286'dır. Aktarmanın oranı 0,556 ile 0,833 arasındadır ve **hiçbiri
1'i geçmez**. Bu bir kusur değil tanımın kendisidir: prim, devredilen riskin yüklemelisidir ve
yükleme birden büyüktür. Beklenen değer hesabında aktarma kaçınılmaz olarak kaybettirir.

Aynı satır aktarmanın ne için var olduğunu da gösterir: aktarma ortalamayı değil **dağılımı** satın
alır ve oran sütunu dağılımı ölçmez. Kaçınmanın oranı 1,305 ile 2,187 arasındadır ve yalnız üç
varlıkta uygulanabilir. Kabulün oranı tanımsızdır; kabul bir seçenek gibi görünür, ama **seçilmeyen
her kalemin varsayılanıdır**.

#### Aynı Bütçe, Dört Sonuç

İkinci tablo 300 birimlik yıllık bütçeyi dört stratejiye harcıyor. Yalnız azaltma **22 karar** alır
ve riski **2.746,71 birim** düşürür; toplamın yüzde 52,4'ü kabul edilmiş kalır. Yalnız aktarma aynı
bütçeyle **4 karar** alır ve 243,00 birim düşürür. Yalnız kaçınma tek karar alır, 300 birimi tek
kalemde harcar, 656,04 birim düşürür.

Karma strateji her kalem için en iyi oranlı seçeneği alır ve sonucu yalnız azaltmayla **aynıdır**.
Aktarmanın oranı beş kalemde azaltmadan iyidir, ama o beşin en yükseği 0,833 olduğu için bütçe
onlara hiç ulaşmaz. **Bir kalemde daha iyi olan seçenek, listenin tepesine giremediği sürece
bütçede hiç görünmez.**

Dördüncü tablo eşiği arıyor: 600 birimde 36 kararın hepsi hâlâ azaltmadır, 900 birimde ilk **üç
aktarma kararı** girer, 1.200 birimde beş olur. Karar sayısı 45'ten 47'ye çıkarken düşen risk
yalnız 31,86 birim artar.

#### Aktarmanın Devretmediği

Üçüncü tablo aktarmanın kapsamını bileşen kalemi olarak sayıyor. Bir olayın kaybı beşe ayrılır:
doğrudan kayıp, kesinti, düzeltme emeği, bildirim yükümlülüğü ve itibar. Devir sözleşmesi ilk
ikisini devralır, üçünü almaz.

Sayı iki biçimde çıkar. Kalem olarak 47 kalem beş bileşenle **235 bileşen kalemi** üretir; sözleşme
**76'sını** devralır, **159'u** kurumda kalır. Birim olarak devredilen 2.260,91, dışarıda kalan
**3.507,70 birim**.

Kalan üç bileşenin ortak yanı vardır: hiçbiri para ödemekle kapanmaz. Düzeltme emeği kurumun kendi
zamanıdır, bildirim kurumun kendi işidir, itibar bir bedelle geri alınmaz. **Aktarma bir kaybı
devreder, bir işi devretmez.**

#### Kaçınmanın Sıralamaya Girememesi

Altıncı tablo bu dersin yapısal bulgusunu veriyor. Kaçınmanın oranı üç varlıkta 1,305 ile 2,187
arasındadır ve aktarmanın her oranından yüksektir; buna rağmen 1.200 birimlik bütçede bile
**hiçbir kaçınma kararı seçilmez**. Neden sayıdadır: kaçınma bir varlığın bütün kalemlerini birden
kapatan tek bir karardır, ama sıralama kalem düzeyinde yapılır. Saha uygulamasının beş kaleminden
**üçü**, kaçınmanın 2,187 oranından yüksek bir kalem kararıyla zaten alınmıştır; bulut hesabında
dörtte üç, tedarikçi bağlantısında dörtte iki aynı durumdadır.

Sıralama kaçınmayı elemez, **erişilemez** kılar. Yanlış olan sıranın kendisi değil, sıralamanın
**hangi düzeyde** yapıldığıdır: varlık düzeyinde bir seçenek ancak varlık düzeyinde bir listeyle
karşılaştırılabilir.

#### Kabulün Sessiz Payı

Beşinci satır bütçe bittikten sonra ne kaldığını yazıyor. Kabul edilen 3.021,90 birimin
**1.699,81'i hiç açılmamış 25 kalemden**, 1.322,09'u ele alınmış 22 kalemin artığından gelir. İki
sayı ayrı yazılır, çünkü ayrı sorulardır: ilki "bakmadık", ikincisi "baktık ve yetmedi".

Açılmayanların içinde en büyük tekil kaybı taşıyan kalem abone veri tabanındaki iç kötüye
kullanımdır: yıllık **48,00 birim**, tekil kaybı **1.200,0 birim**. Yıllık değeri küçük olduğu için
her iki sıralama da onu geriye atar; oysa devir sözleşmesinin dağılım açısından en çok işe
yarayacağı kalem tam olarak budur. Seçim bu yüzden tek sütunla yapılamaz: oran ortalamayı, aktarma
kuyruğu, kabul ikisinin de dışında kalanı taşır.

#### Özet

- Dört seçenek ortak yıllık birime çevrilmeden karşılaştırılamaz: kurulum bedeli üçe bölünüp bakım
  eklenir, prim ve vazgeçilen iş değeri zaten yıllıktır, kabulün bedeli sıfırdır.
- Aktarmanın oranı 0,556 ile 0,833 arasındadır ve hiçbiri 1'i geçmez; aktarma ortalamayı değil
  dağılımı satın alır.
- 300 birimlik bütçede yalnız azaltma 22 kararla 2.746,71, yalnız aktarma 4 kararla 243,00, yalnız
  kaçınma tek kararla 656,04 birim düşürür; karma strateji azaltmayla aynı sonucu verir.
- Devir sözleşmesi 235 bileşen kaleminin 76'sını devralır, 159'u kurumda kalır; 2.260,91 birim
  devredilir, 3.507,70 dışarıda kalır ve kalan üç bileşen para ödemekle kapanmaz.
- Kaçınma varlık düzeyinde bir karardır ve oranı yüksek olduğu hâlde 1.200 birimlik bütçede bile
  seçilmez: varlığın kalemlerinden birkaçı daha yüksek oranlı kalem kararlarıyla zaten alınmıştır.
- Kabul edilen 3.021,90 birimin 1.699,81'i hiç açılmamış 25 kalemden gelir; açılmayanların en
  büyüğü yıllık 48,00 birim yazan, tekil kaybı 1.200,0 birim olan kalemdir.

#### Sonraki Adım

Üç ders boyunca liste sabit kaldı: 47 kalem, on varlık, yedi tehdit. Her sıralama ve her bütçe bu
listenin **tam** olduğunu varsaydı. Oysa her kalem bir varlık kaydından türedi ve o kayıtları bir
envanter tuttu. Envanterde olmayan bir sunucu ya da bir ekibin kendi kurduğu bir servis hiçbir
çifte girmez, hiçbir sıraya yazılmaz ve hiçbir bütçede yer tutmaz — kabul edilmiş bile sayılmaz,
çünkü kabul en azından bir kaydı gerektirir. Sonraki ders envanter dışı kalemleri sayar ve tek bir
soruyu ölçer: bu kalemler listeye girseydi sıralamanın kaç sırası değişirdi.

### Varlık ve Envanter Yönetimi

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/varlik-ve-envanter-yonetimi

Envanter dışı altı varlık listeye eklendiğinde 47 kalemlik liste 69 kaleme, 5.768,61 birimlik toplam 8.045,45 kurgu birime çıkar: envanter dışı kalemler gerçek riskin yüzde 28,3'ünü taşır, 41 kayıtlı kalemin sırası değişir, en büyük kayma 22 basamaktır, ilk yirmiye altı gölge kalem girer, 30 gölge kalemin 8'i değeri yazılmadığı için hiçbir sıralamaya giremez ve en yüksek sıraya çıkan gölge kalem hiçbir keşif kaynağının görmediği varlıktan gelir.

Üç ders boyunca aynı liste sıralandı, ölçüldü ve bütçelendi: 47 kalem, on varlık, yedi tehdit. Her
hesap bu listenin **tam** olduğunu varsaydı. Oysa liste bir envanterden türedi ve envanter bir
kayıt kümesidir — kaydedilmemiş bir varlık listeye giremez.

Kaydedilmeyen bir varlığın riski sıfır değildir; **yazılmamış**tır. Sıralamada görünmez, bütçede
yer tutmaz, kabul edilmiş bile sayılmaz — çünkü kabul en azından bir kaydı gerektirir. Bu ders o
boşluğu sayar: envanter dışında kaç varlık var, kaç kalem üretiyorlar, listeye girseydi sıralamanın
kaç sırası değişirdi ve onları bulmanın birim bedeli ne.

#### Envanterin Dışında Kalan

Envanter dışı varlık bir kural ihlali değil, çoğu zaman sıradan işleyişin artığıdır: bir sınama
için açılıp kapatılmayan sunucu, bir ekibin kendi bütçesiyle açtığı bulut hesabı, saha ekibinin
kendi kurduğu bir aktarım servisi, hizmetten çıkarılmış ama fişi çekilmemiş bir şube ucu, ikinci
bir tedarikçi bağlantısı, bir yedek veri kopyası. Hepsi bir işe yaradığı için vardır ve hiçbiri
envanteri güncellemek üzere kurulmamıştır.

Bunları bulmanın yolu **keşif kaynaklarıdır** ve her kaynak farklı bir yerden bakar. Ağ taraması
adreslenebilir olanı görür, kimlik kaydı bir hesabı olanı, faturalama kaydı bir bedel üreteni,
yapılandırma deposu tanımlanmış olanı, uç ajanı üzerinde yazılım çalışanı. Bir varlık kaç kaynakta
görünüyorsa o kadar bulunabilirdir; hiçbirinde görünmüyorsa bulunamaz.

- **RY17.** Yedi tehdit ve katsayıları önceki derslerle aynıdır; birim **kurgu birim**dir.
- **RY18.** Beş keşif kaynağı, bedelleri ve kaynak maskeleri modeldir; gerçek bir tarama yapılmaz.
- **RY19.** Envanter dışı altı varlık modeldir. `?` işareti, varlığın bulunmuş ama değerinin
  yazılmamış olduğunu gösterir.
- **RY20.** Bir kalemin riski yalnız varlığın değeri yazılıysa hesaplanabilir; değeri yazılmamış
  varlık keşfedilse bile hiçbir sıralamaya giremez.
- **RY21.** Keşif tek seferliktir ve bulduğu varlığı envantere sokar; envantere girmek değerin
  yazılması demek değildir.
- **RY22.** Envanter dışı varlıkların maruziyet katsayıları kayıtlı varlıklarınkinden yüksek
  yazılmıştır; modelin gerekçesi, bakım ve sertleştirme çalışmalarının yalnız kayıtlı varlıklara
  uygulanmasıdır.

```js
// risk/envanter.mjs — envanterdeki varliklar ile envanter disi varliklar. MODELDIR; gercek bir
// tarama yapilmaz, gercek bir hesap acilmaz, butun degerler "kurgu birim" cinsindendir.

// RY17: tehdit satiri: ad | yillik taban siklik | maruziyet orani
export const TEHDIT = `
  kimlik-ele-gecirme   0.30  0.35
  zararli-kod          0.50  0.25
  yanlis-yapilandirma  0.80  0.15
  ic-kotuye-kullanim   0.10  0.40
  hizmet-kesintisi     0.40  0.20
  fiziksel-erisim      0.06  0.50
  tedarik-zinciri      0.08  0.45`
  .trim().split("\n").map((r) => { const [ad, s, m] = r.trim().split(/\s+/);
    return { ad, s: +s, m: +m }; });

// RY18: kesif kaynagi: ad | yillik bedel. Her varlik bir kaynak maskesi tasir.
export const KAYNAK = `
  ag-taramasi          35
  kimlik-kaydi         15
  faturalama-kaydi     10
  yapilandirma-deposu  25
  uc-ajani             45`
  .trim().split("\n").map((r) => { const [ad, b] = r.trim().split(/\s+/);
    return { ad, b: +b }; });

// RY19: varlik satiri: ad | deger ('?' degeri yazilmamis) | maruziyet | tehdit maskesi |
// kaynak maskesi | envanterde mi. Envanterdeki on varlik zaten kayitlidir.
const SATIR = `
  saha-dizustu           900  1.6  1111011  11001  E
  sube-ucu               600  1.2  1111110  10011  E
  sayac-toplayici        750  1.4  0111110  10010  E
  islem-sunucusu        1800  0.6  1111101  11011  E
  cevre-agi             1200  1.8  0011100  10010  E
  kimlik-dizini         2400  1.0  1011100  01010  E
  bulut-hesabi          2000  1.5  1011100  01100  E
  abone-veri-tabani     3000  0.4  1011100  00011  E
  saha-uygulamasi       1400  1.1  1111001  00110  E
  tedarikci-baglantisi  1000  1.3  1001101  01100  E
  gecici-test-sunucusu   800  1.7  1111101  11010  H
  ekip-bulut-hesabi        ?  1.6  1011100  01100  H
  saha-aktarim-servisi   700  1.9  1111011  10001  H
  emekli-sube-ucu        500  1.5  1111110  10010  H
  ucuncu-tedarikci-ucu     ?  1.4  1001101  01100  H
  yedek-veri-kopyasi    2200  0.8  1011100  00000  H`;

export const VARLIK = SATIR.trim().split("\n").map((r) => {
  const [ad, v, m, maske, km, env] = r.trim().split(/\s+/);
  return { ad, v: v === "?" ? null : +v, m: +m, maske, km, envanterde: env === "E",
    gorulur: km.includes("1") };
});
export const KAYITLI = VARLIK.filter((v) => v.envanterde);
export const GOLGE = VARLIK.filter((v) => !v.envanterde);

// RY20: bir kalemin riski sadece varligin degeri yaziliysa hesaplanabilir; degeri yazilmamis
// varlik kesfedilse bile hicbir siralamaya giremez.
export const TUM = VARLIK.flatMap((v) => TEHDIT
  .filter((_, j) => v.maske[j] === "1")
  .map((t) => ({ v, t, risk: v.v === null ? null : +(t.s * v.m * v.v * t.m).toFixed(2) })));
export const KAY = TUM.filter((k) => k.v.envanterde);
export const GOL = TUM.filter((k) => !k.v.envanterde);
export const sirala = (L) => L.filter((k) => k.risk !== null)
  .map((k, i) => ({ k, i })).sort((a, b) => b.k.risk - a.k.risk || a.i - b.i).map((x) => x.k);
export const top = (L) => +L.reduce((a, k) => a + (k.risk || 0), 0).toFixed(2);
```

#### İki Listenin Sayımı

```js
// risk/eksik.mjs — envanter disi kalemler listeye girseydi siralama nasil degisirdi
import { KAYITLI, GOLGE, KAYNAK, TUM, KAY, GOL, sirala, top } from "./envanter.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const S1 = sirala(KAY), S2 = sirala(TUM);
const yer = (L, k) => L.indexOf(k) + 1;

console.log(`envanterde ${KAYITLI.length} varlik / ${KAY.length} kalem / ${top(KAY)} kurgu birim; ` +
  `envanter disi ${GOLGE.length} varlik / ${GOL.length} kalem / ${top(GOL)} birim ` +
  `(gercek toplamin %${((top(GOL) / top(TUM)) * 100).toFixed(1)}'i)`);

const A = [-22, 7, 7, 10, 8, 10];
console.log("\n1. envanter disi varliklar");
y(A, "varlik", "deger", "kalem", "risk", "kaynak", "durum");
for (const v of GOLGE) {
  const ks = GOL.filter((k) => k.v === v);
  y(A, v.ad, v.v ?? "?", ks.length, v.v === null ? "-" : top(ks).toFixed(2),
    v.km.split("").filter((c) => c === "1").length,
    v.v === null ? "degersiz" : v.gorulur ? "gorulur" : "gorulmez");
}
const puanlanabilir = GOL.filter((k) => k.risk !== null);
console.log(`envanter disi ${GOL.length} kalemin ${puanlanabilir.length} tanesi puanlanabilir ` +
  `(${top(puanlanabilir).toFixed(2)} birim), ${GOL.length - puanlanabilir.length} tanesi degeri ` +
  `yazilmadigi icin hicbir siralamaya giremez`);

const B = [-38, 9];
console.log("\n2. tam liste siralaninca ne degisiyor");
const kayma = KAY.map((k) => Math.abs(yer(S1, k) - yer(S2, k)));
y(B, "envanter listesi / tam liste kalem", `${S1.length} / ${S2.length}`);
y(B, "toplam risk", `${top(KAY).toFixed(2)} / ${top(TUM).toFixed(2)}`);
y(B, "sirasi degisen kayitli kalem", kayma.filter((x) => x > 0).length);
y(B, "en buyuk sira kaymasi", Math.max(...kayma));
y(B, "ilk ona giren envanter disi kalem",
  S2.slice(0, 10).filter((k) => !k.v.envanterde).length);
y(B, "en yuksek envanter disi kalemin sirasi",
  Math.min(...puanlanabilir.map((k) => yer(S2, k))));
y(B, "ilk yirmide envanter disi kalem",
  S2.slice(0, 20).filter((k) => !k.v.envanterde).length);

const C = [-22, -21, 10, 7, 6];
console.log("\n3. tam listenin ilk onu");
y(C, "varlik", "tehdit", "risk", "kaynak", "sira");
for (const k of S2.slice(0, 10))
  y(C, k.v.ad, k.t.ad, k.risk.toFixed(2), k.v.envanterde ? "kayit" : "golge", yer(S1, k) || "-");

const D = [-21, 7, 8, 13, 8, 9];
console.log("\n4. kesif kaynagi basina (yalniz envanter disi varliklar)");
y(D, "kaynak", "bedel", "varlik", "acilan risk", "kalem", "oran");
const acilan = (f) => { const vs = GOLGE.filter(f);
  const ks = GOL.filter((k) => vs.includes(k.v) && k.risk !== null);
  return { vs, ks, r: top(ks) }; };
for (const [i, s] of KAYNAK.entries()) {
  const a = acilan((v) => v.km[i] === "1");
  y(D, s.ad, s.b, a.vs.length, a.r.toFixed(2), a.ks.length, (a.r / s.b).toFixed(3));
}
const hepsi = acilan((v) => v.gorulur);
const bedel = KAYNAK.reduce((a, s) => a + s.b, 0);
y(D, "besi birden", bedel, hepsi.vs.length, hepsi.r.toFixed(2), hepsi.ks.length,
  (hepsi.r / bedel).toFixed(3));
const kor = GOLGE.filter((v) => !v.gorulur);
console.log(`hicbir kaynagin gormedigi varlik ${kor.length}, kalem ` +
  `${GOL.filter((k) => kor.includes(k.v)).length}, risk ` +
  `${top(GOL.filter((k) => kor.includes(k.v))).toFixed(2)} birim`);
```

```
envanterde 10 varlik / 47 kalem / 5768.61 kurgu birim; envanter disi 6 varlik / 30 kalem / 2276.84 birim (gercek toplamin %28.3'i)

1. envanter disi varliklar
varlik                  deger  kalem      risk  kaynak     durum
gecici-test-sunucusu      800      6    688.16       3   gorulur
ekip-bulut-hesabi           ?      4         -       2  degersiz
saha-aktarim-servisi      700      6    606.48       2   gorulur
emekli-sube-ucu           500      6    375.00       2   gorulur
ucuncu-tedarikci-ucu        ?      4         -       2  degersiz
yedek-veri-kopyasi       2200      4    607.20       0  gorulmez
envanter disi 30 kalemin 22 tanesi puanlanabilir (2276.84 birim), 8 tanesi degeri yazilmadigi icin hicbir siralamaya giremez

2. tam liste siralaninca ne degisiyor
envanter listesi / tam liste kalem      47 / 69
toplam risk                           5768.61 / 8045.45
sirasi degisen kayitli kalem                 41
en buyuk sira kaymasi                        22
ilk ona giren envanter disi kalem             1
en yuksek envanter disi kalemin sirasi        7
ilk yirmide envanter disi kalem               6

3. tam listenin ilk onu
varlik                tehdit                     risk kaynak  sira
bulut-hesabi          yanlis-yapilandirma      360.00  kayit     1
bulut-hesabi          kimlik-ele-gecirme       315.00  kayit     2
kimlik-dizini         yanlis-yapilandirma      288.00  kayit     3
cevre-agi             yanlis-yapilandirma      259.20  kayit     4
kimlik-dizini         kimlik-ele-gecirme       252.00  kayit     5
bulut-hesabi          hizmet-kesintisi         240.00  kayit     6
yedek-veri-kopyasi    yanlis-yapilandirma      211.20  golge     -
saha-uygulamasi       zararli-kod              192.50  kayit     7
kimlik-dizini         hizmet-kesintisi         192.00  kayit     8
saha-uygulamasi       yanlis-yapilandirma      184.80  kayit     9

4. kesif kaynagi basina (yalniz envanter disi varliklar)
kaynak                 bedel  varlik  acilan risk   kalem     oran
ag-taramasi               35       3      1669.64      18   47.704
kimlik-kaydi              15       3       688.16       6   45.877
faturalama-kaydi          10       2         0.00       0    0.000
yapilandirma-deposu       25       2      1063.16      12   42.526
uc-ajani                  45       1       606.48       6   13.477
besi birden              130       5      1669.64      18   12.843
hicbir kaynagin gormedigi varlik 1, kalem 4, risk 607.20 birim
```

Sayılar **ölçüm** sınıfındadır; girdileri RY17–RY21'dir.

#### Eksik Listenin Payı

Altı envanter dışı varlık 30 risk kalemi üretiyor ve bunların taşıdığı risk 2.276,84 kurgu birim.
Gerçek toplam 5.768,61 değil **8.045,45 birim**; envanter dışı pay **yüzde 28,3**. Üç ders boyunca
yapılan bütün sıralamalar, bütün bütçe hesapları ve bütün kabul kararları bu payın var olmadığı
varsayımıyla verildi.

Sayı yalnız büyük olduğu için değil, **dağılımı** yüzünden önemlidir. Yedek veri kopyası tek başına
607,20 birim taşır ve envanterdeki on varlığın altısından fazla risk yazar. Geçici sınama
sunucusu 688,16 birimle o on varlığın sekizinden fazladır. Bunların ortak yanı düşük değerli
olmalarıdır — ama düşük değer, yüksek maruziyetle çarpıldığında küçük bir sayı vermez.

Maruziyet katsayısı sütunu bu yüksekliği açıklıyor ve modelin bir tercihidir (RY22): envanter dışı
varlıklar 0,8 ile 1,9 arasında, kayıtlı varlıklar 0,4 ile 1,8 arasında değer alır. Gerekçe basittir
ve kendi kendini besler — sertleştirme, yama ve izleme çalışmaları envanterdeki listeye uygulanır,
listede olmayan varlık bu çalışmaların hiçbirini almaz. Kayıtsız olmak yalnız görünmezlik değil,
aynı zamanda **bakımsızlık** demektir; iki etki aynı yönde çarpılır.

#### Sıralamanın Kaydığı Yer

İkinci tablo asıl soruya cevap veriyor. Eksik liste 47 kalemi sıralıyor, tam liste 69 kalemi; **41
kayıtlı kalemin sırası değişiyor** ve en büyük kayma **22 basamak**. İlk yirmiye **altı** gölge
kalem giriyor ve bunlardan biri **yedinci sıraya** çıkıyor.

Üçüncü tablo bu kalemi adıyla gösteriyor: yedek veri kopyasındaki yanlış yapılandırma, 211,20
birimle listenin yedincisidir ve envanter listesinde **hiç yoktur**. Onun girmesiyle saha
uygulamasındaki zararlı kod kalemi yedincilikten sekizinciliğe düşer ve altında kalan her kalem bir
basamak aşağı iner. Bütçe ilk on kalemi ele alıyorsa, eksik listeyle çalışan bir program bu kalemi
hiç açmaz — üstelik bunun bir eksiklik olduğunu da bilmez, çünkü kalem listede olmadığı için
"ele alınmadı" sütununda da görünmez.

Kaymanın büyüklüğü listenin düzlüğüyle ilgilidir. Risk dağılımı düz olduğunda 22 yeni kalem araya
serpilir ve neredeyse her kalemin sırasını değiştirir. Yoğun bir tepe olsaydı yeni kalemler alta
yığılır ve ilk on değişmezdi. Burada ilk on değişiyor, yani eksiklik **karar veren bölgeye**
ulaşıyor.

#### Bulunmak ile Sayılmak Ayrı Şeydir

Birinci tablonun son sütunu ikinci bir ayrım yazıyor. Altı varlığın ikisi — ekibin açtığı bulut
hesabı ve üçüncü tedarikçi ucu — iki ayrı kaynakta **görünüyor**, ama değerleri yazılmamış. Bu iki
varlık 8 risk kalemi üretir ve o kalemlerin hiçbiri puanlanamaz: değer yoksa etki yoktur, etki
yoksa risk hesaplanamaz. **30 gölge kalemin 22'si puanlanabilir, 8'i puanlanamaz.**

Bu, envanter çalışmasının en sık kaçırılan yarısıdır. Keşif bir varlığın **varlığını** yazar;
envanter onun **ne olduğunu** yazar — sahibi kim, hangi işi taşıyor, düştüğünde ne olur. Birincisi
otomatik yapılabilir, ikincisi bir insanın karar vermesini gerektirir. Bulunmuş ama değeri
yazılmamış bir varlık, hiç bulunmamış bir varlıkla aynı sıraya girer: **ikisi de hiçbir sıraya
girmez.** Aradaki tek fark, birincisinin bir listede adının bulunmasıdır.

#### Keşfin Birim Bedeli

Dördüncü tablo keşfi kursun ölçü birimiyle sınıyor. Ağ taraması 35 birime üç varlık ve 1.669,64
birimlik risk açar; oranı **47,704** ile listenin en yükseğidir. Kimlik kaydı 15 birime 688,16
birim açar (45,877). Faturalama kaydı 10 birime iki varlık bulur ve **0,00 birim** açar — bulduğu
iki varlığın değeri yazılmamıştır, dolayısıyla açılan puanlanabilir risk sıfırdır.

Son satır toplamayı sınıyor. Beş kaynağın hepsi 130 birime beş varlık bulur, ama açtığı risk yine
**1.669,64 birimdir** — ağ taramasının tek başına açtığı sayı. Kalan dört kaynak 95 birim daha
harcayıp puanlanabilir riske hiçbir şey eklemez; ekledikleri iki varlık değersiz kalır. Birim
başına getiri 47,704'ten **12,843**'e iner. Keşif kaynağı eklemek her zaman daha çok kalem bulur,
ama bulunan kalem puanlanmıyorsa sıralamaya girmez ve bütçede yer tutmaz.

Son satır dersin en sert sayısını yazıyor: **hiçbir kaynağın görmediği bir varlık** var, 4 kalem ve
607,20 birim taşıyor. Beş kaynağın tamamı satın alınsa bile bulunmaz. Üstelik tam listenin yedinci
sırasındaki kalem tam olarak bu varlıktan gelir. Keşif kapsamı bir kapak değil, bir **eşiktir**:
altına düşen her şey ölçülmez ve ölçülmeyen her şey varsayılan olarak kabul edilmiş sayılır.

#### Özet

- Envanter dışı altı varlık 30 kalem ve 2.276,84 kurgu birim taşır; gerçek toplam 8.045,45 birimdir
  ve envanter dışı pay yüzde 28,3'tür.
- Tam liste sıralandığında 41 kayıtlı kalemin sırası değişir, en büyük kayma 22 basamaktır; ilk
  yirmiye altı gölge kalem girer ve biri yedinci sıraya çıkar.
- Eksik listeyle çalışan bir program bu kalemi ele almadığını bile göremez: kalem listede olmadığı
  için "ele alınmadı" sütununda da yoktur.
- Bulunmak ile sayılmak ayrı şeylerdir. İki gölge varlık iki kaynakta görünür ama değeri
  yazılmamıştır; 30 gölge kalemin 22'si puanlanabilir, 8'i hiçbir sıralamaya giremez.
- Ağ taraması 35 birime 47,704 oran verir; beş kaynağın tamamı 130 birime aynı riski açar ve oran
  12,843'e iner. Kaynak eklemek daha çok varlık bulur, puanlanabilir risk eklemez.
- Hiçbir kaynağın görmediği bir varlık 4 kalem ve 607,20 birim taşır; tam listenin yedinci
  sırasındaki kalem bu varlıktan gelir.

#### Sonraki Adım

Keşif kaynaklarının hepsi bir şeyi ortak varsayıyor: aranan varlık kurumun kendi ağında, kendi
kimlik düzeninde ya da kendi faturasında bir iz bırakıyor. Tedarikçinin kendi sistemindeki bir
sunucu bu izlerin hiçbirini bırakmaz. Ağ taraması oraya ulaşmaz, uç ajanı orada çalışmaz,
yapılandırma deposu orayı tanımaz. O varlıkların yerine kurumda duran tek şey bir **sözleşme
maddesi** ve bir **değerlendirme anketidir**. Sonraki ders üç tedarikçilik bir kümede bunu ölçer:
sözleşmede yazan kontrol kaç, anketin gerçekten kanıtladığı kaç, devredilmiş görünüp doğrulanamayan
kaç kalem kalıyor.

### Üçüncü Taraf Riski

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/ucuncu-taraf-riski

Üç tedarikçide sözleşmede yazan 16 kontrolün 3'ü ankette hiç sorulmuyor, 6'sı yanıtlanıp kanıtlanmıyor ve yalnız 7'si kanıtla doğrulanıyor: devredilmiş görünüp doğrulanamayan 9 kontrol 555,10 kurgu birim taşır, bu tedarikçi riskinin yüzde 25,4'üdür, beyan yerine kanıtla sıralanan 62 kalemlik program listesinde 51 kalemin sırası değişir ve ilk ondaki tedarikçi kalemi birden üçe çıkar.

Önceki ders keşif kaynaklarını ölçtü ve hepsi aynı şeyi varsayıyordu: aranan varlık kurumun kendi
ağında, kendi kimlik düzeninde ya da kendi faturasında bir iz bırakır. Tedarikçinin kendi
sistemindeki bir sunucu bu izlerin hiçbirini bırakmaz. Ağ taraması oraya ulaşmaz, uç ajanı orada
çalışmaz, yapılandırma deposu orayı tanımaz.

O varlıkların yerine kurumda duran şey iki kağıttır: bir **sözleşme maddesi** ve bir **değerlendirme
anketi**. Bulut Temelleri kursunda kurulan paylaşılan sorumluluk ayrımı burada bir adım öteye gider —
orada sorumluluğun kimde olduğu sorulmuştu, burada sorulan şey o sorumluluğun **yerine getirildiğinin
nasıl bilindiğidir**. Bu ders üç tedarikçilik bir kümede onu ölçer.

#### Üç Küme, Üç Ayrı Sayı

Bir tedarikçi kontrolü üç ayrı kümede bulunabilir ve üçü aynı şey değildir. **Sözleşmede yazan**
kontrol bir yükümlülüktür; taraflardan biri onu yapmayı kabul etmiştir. **Ankette yanıtlanan**
kontrol bir beyandır; tedarikçi onu yaptığını söylemiştir. **Kanıtla doğrulanan** kontrol bir
gözlemdir; kurum onun işlediğini gösteren bir çıktı görmüştür.

Üç kümenin iç içe olması beklenir: kanıtlanan kümesi anketin, anket kümesi sözleşmenin alt
kümesidir. Aradaki iki fark ayrı ayrı sayılır, çünkü ayrı sorunlardır. Sözleşmede yazıp ankette hiç
sorulmayan kontrol bir **kapsam boşluğudur**: taahhüt alınmış, hiç bakılmamıştır. Yanıtlanıp
kanıtlanmayan kontrol bir **kanıt boşluğudur**: bakılmış, cevap alınmış, cevabın doğruluğu
gösterilmemiştir.

- **RY23.** Yedi tehdit ve katsayıları önceki derslerle aynıdır; birim **kurgu birim**dir.
- **RY24.** Sekiz kontrol, düşürdükleri oran, dokundukları tehditler ve doğrulama bedelleri
  modeldir; gerçek bir sözleşme ya da denetim yoktur.
- **RY25.** Kurum varlıkları önceki derslerin on varlıklık kümesidir.
- **RY26.** Üç tedarikçi ve üç maske modeldir; kanıt kümesi anketin, anket kümesi sözleşmenin alt
  kümesi olarak yazılmıştır.
- **RY27.** Kontroller bağımsız uygulanır: bir kalemin kalan riski, o tehdide dokunan kontrollerin
  çarpımıyla düşer.
- **RY28.** Doğrulama riski düşürmez, **ölçümü kesinleştirir**; doğrulanan kontrol kanıt kümesine
  girer ve ölçülen kalan risk buna göre yeniden hesaplanır.

```js
// risk/tedarikci.mjs — uc tedarikci, sekiz sozlesme kontrolu ve uc ayri kanit duzeyi. MODELDIR;
// gercek bir sozlesme, gercek bir denetim ve gercek para birimi yok, birim "kurgu birim"dir.

// RY23: tehdit satiri: ad | yillik taban siklik | maruziyet orani
export const TEHDIT = `
  kimlik-ele-gecirme   0.30  0.35
  zararli-kod          0.50  0.25
  yanlis-yapilandirma  0.80  0.15
  ic-kotuye-kullanim   0.10  0.40
  hizmet-kesintisi     0.40  0.20
  fiziksel-erisim      0.06  0.50
  tedarik-zinciri      0.08  0.45`
  .trim().split("\n").map((r) => { const [ad, s, m] = r.trim().split(/\s+/);
    return { ad, s: +s, m: +m }; });

// RY24: kontrol satiri: ad | dusurdugu oran | etkiledigi tehdit maskesi |
// kanit isteme bedeli | yerinde dogrulama bedeli
export const KONTROL = `
  erisim-kaydi-tutma          0.10  1001100   6  22
  cok-etmenli-dogrulama       0.35  1000000   4  18
  yama-suresi-taahhudu        0.30  0110000   9  26
  veri-sifreleme              0.25  1000010   7  24
  alt-yuklenici-bildirimi     0.15  0000001   5  30
  olay-bildirim-suresi        0.12  1111111   8  20
  yedek-ve-kurtarma-testi     0.28  0000100  11  28
  personel-guvenlik-taramasi  0.20  0001001   6  34`
  .trim().split("\n").map((r) => { const [ad, d, tm, kb, yb] = r.trim().split(/\s+/);
    return { ad, d: +d, tm, kb: +kb, yb: +yb }; });

// RY25: kurum varligi: ad | deger | maruziyet | tehdit maskesi
export const VARLIK = `
  saha-dizustu           900  1.6  1111011
  sube-ucu               600  1.2  1111110
  sayac-toplayici        750  1.4  0111110
  islem-sunucusu        1800  0.6  1111101
  cevre-agi             1200  1.8  0011100
  kimlik-dizini         2400  1.0  1011100
  bulut-hesabi          2000  1.5  1011100
  abone-veri-tabani     3000  0.4  1011100
  saha-uygulamasi       1400  1.1  1111001
  tedarikci-baglantisi  1000  1.3  1001101`
  .trim().split("\n").map((r) => { const [ad, v, m, maske] = r.trim().split(/\s+/);
    return { ad, v: +v, m: +m, maske, tedarikci: false }; });

// RY26: tedarikci satiri: ad | deger | maruziyet | tehdit maskesi | sozlesmede yazan kontrol |
// ankette yanitlanan kontrol | kanitla dogrulanan kontrol (KONTROL sirasinda sekiz hane)
export const TEDARIKCI = `
  sayac-bakim-firmasi   1400  1.5  1101101  11101100  11101000  10001000
  bulut-barindirma      2600  1.3  1011101  11111110  11011110  11010010
  saha-isgucu-firmasi    900  1.7  1101011  10100101  10100001  00100000`
  .trim().split("\n").map((r) => {
    const [ad, v, m, maske, soz, ank, kan] = r.trim().split(/\s+/);
    return { ad, v: +v, m: +m, maske, soz, ank, kan, tedarikci: true };
  });

// RY27: bir kalemin kalan riski, o tehdide dokunan kontrollerin bagimsiz uygulanmasiyla duser.
export const TUM = [...VARLIK, ...TEDARIKCI].flatMap((v) => TEHDIT
  .map((t, j) => ({ v, t, j }))
  .filter(({ j }) => v.maske[j] === "1")
  .map(({ t, j }) => ({ v, t, j, ham: +(t.s * v.m * v.v * t.m).toFixed(2) })));

// duzey: 'soz' beyan edilen, 'ank' ankette yanitlanan, 'kan' kanitla dogrulanan kontrol kumesi.
export const kalan = (k, duzey) => {
  if (!k.v.tedarikci) return k.ham;
  const p = KONTROL.reduce((a, c, i) => (k.v[duzey][i] === "1" && c.tm[k.j] === "1"
    ? a * (1 - c.d) : a), 1);
  return +(k.ham * p).toFixed(2);
};
export const sirala = (duzey) => TUM.map((k, i) => ({ k, i }))
  .sort((a, b) => kalan(b.k, duzey) - kalan(a.k, duzey) || a.i - b.i).map((x) => x.k);
export const top = (L, duzey) => +L.reduce((a, k) => a + kalan(k, duzey), 0).toFixed(2);
export const yer = (L, k) => L.indexOf(k) + 1;
```

#### Üç Kanıt Düzeyinin Sayımı

```js
// risk/dogrula.mjs — sozlesmede yazan, ankette yanitlanan ve kanitla dogrulanan kontrol sayilir
import { TUM, TEDARIKCI, KONTROL, kalan, sirala, top, yer } from "./tedarikci.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const say = (m) => [...m].filter((c) => c === "1").length;
const TED = TUM.filter((k) => k.v.tedarikci);
const S = { soz: sirala("soz"), ank: sirala("ank"), kan: sirala("kan") };

console.log(`${TUM.length} kalem; ${TED.length} tanesi ${TEDARIKCI.length} tedarikcide. ` +
  `Kontrol kumesi ${KONTROL.length} kalem, kurgu birim.`);

const A = [-21, 7, 7, 7, 12, 12, 12];
console.log("\n1. tedarikci basina kontrol ve kalan risk");
y(A, "tedarikci", "sozles", "anket", "kanit", "beyanla", "anketle", "kanitla");
for (const v of TEDARIKCI) {
  const ks = TED.filter((k) => k.v === v);
  y(A, v.ad, say(v.soz), say(v.ank), say(v.kan), top(ks, "soz").toFixed(2),
    top(ks, "ank").toFixed(2), top(ks, "kan").toFixed(2));
}
const t3 = (d) => top(TED, d);
y(A, "toplam", TEDARIKCI.reduce((a, v) => a + say(v.soz), 0),
  TEDARIKCI.reduce((a, v) => a + say(v.ank), 0), TEDARIKCI.reduce((a, v) => a + say(v.kan), 0),
  t3("soz").toFixed(2), t3("ank").toFixed(2), t3("kan").toFixed(2));

const B = [-40, 8];
console.log("\n2. devredilen ama olculemeyen kalem");
const sozT = TEDARIKCI.reduce((a, v) => a + say(v.soz), 0);
const ankT = TEDARIKCI.reduce((a, v) => a + say(v.ank), 0);
const kanT = TEDARIKCI.reduce((a, v) => a + say(v.kan), 0);
y(B, "sozlesmede yazan kontrol", sozT);
y(B, "ankette hic sorulmayan", sozT - ankT);
y(B, "yanitlanmis ama kanitsiz", ankT - kanT);
y(B, "kanitla dogrulanan", kanT);
y(B, "devredilmis gorunup dogrulanamayan", sozT - kanT);
y(B, "beyan ile kanit arasindaki risk", (t3("kan") - t3("soz")).toFixed(2));
y(B, "kanitsizligin tasidigi pay %",
  (((t3("kan") - t3("soz")) / t3("kan")) * 100).toFixed(1));

const C = [-40, 8];
console.log("\n3. ayni program listesinde siralama");
const kayma = TUM.map((k) => Math.abs(yer(S.soz, k) - yer(S.kan, k)));
y(C, "sirasi degisen kalem", kayma.filter((x) => x > 0).length);
y(C, "en buyuk sira kaymasi", Math.max(...kayma));
y(C, "ilk onda tedarikci kalemi (beyan)", S.soz.slice(0, 10).filter((k) => k.v.tedarikci).length);
y(C, "ilk onda tedarikci kalemi (kanit)", S.kan.slice(0, 10).filter((k) => k.v.tedarikci).length);
y(C, "program toplami beyan / kanit",
  `${top(TUM, "soz").toFixed(2)} / ${top(TUM, "kan").toFixed(2)}`);

const D = [-21, -20, 9, 9, 7, 7];
console.log("\n4. en cok yukselen bes kalem (beyandan kanita)");
for (const k of [...TUM].sort((a, b) => (yer(S.soz, b) - yer(S.kan, b))
  - (yer(S.soz, a) - yer(S.kan, a))).slice(0, 5))
  y(D, k.v.ad, k.t.ad, kalan(k, "soz").toFixed(2), kalan(k, "kan").toFixed(2),
    yer(S.soz, k), yer(S.kan, k));

const E = [-24, 8, 9, 10, 9];
console.log("\n5. dogrulamanin kapattigi belirsizlik (risk dusmez, olcum kesinlesir)");
y(E, "secenek", "bedel", "kontrol", "kapanan", "oran");
const kanitsiz = TEDARIKCI.flatMap((v) => KONTROL
  .map((c, i) => ({ v, c, i })).filter(({ v: t, i }) => t.soz[i] === "1" && t.kan[i] !== "1"));
const ankSadece = kanitsiz.filter(({ v, i }) => v.ank[i] === "1");
// Grup dogrulanirsa o kontroller kanit kumesine girer; olculen kalan risk yeniden hesaplanir.
const olcum = (grup) => {
  const eski = TEDARIKCI.map((v) => v.kan);
  TEDARIKCI.forEach((v) => { v.kan = [...v.kan].map((c, i) =>
    (grup.some((g) => g.v === v && g.i === i) ? "1" : c)).join(""); });
  const r = top(TED, "kan");
  TEDARIKCI.forEach((v, n) => { v.kan = eski[n]; });
  return r;
};
const taban = t3("kan");
for (const [ad, grup, bedel] of [["anketi yenilemek", [], 12],
  ["kanit istemek", ankSadece, ankSadece.reduce((a, g) => a + g.c.kb, 0)],
  ["yerinde dogrulamak", kanitsiz, kanitsiz.reduce((a, g) => a + g.c.yb, 0)]]) {
  const kap = +(taban - olcum(grup)).toFixed(2);
  y(E, ad, bedel, grup.length, kap.toFixed(2), (kap / bedel).toFixed(3));
}
```

```
62 kalem; 15 tanesi 3 tedarikcide. Kontrol kumesi 8 kalem, kurgu birim.

1. tedarikci basina kontrol ve kalan risk
tedarikci             sozles  anket  kanit     beyanla     anketle     kanitla
sayac-bakim-firmasi        5      4      2      531.35      603.80      752.01
bulut-barindirma           7      6      4      739.17      846.25      979.89
saha-isgucu-firmasi        4      3      1      362.99      412.49      456.71
toplam                    16     13      7     1633.51     1862.54     2188.61

2. devredilen ama olculemeyen kalem
sozlesmede yazan kontrol                      16
ankette hic sorulmayan                         3
yanitlanmis ama kanitsiz                       6
kanitla dogrulanan                             7
devredilmis gorunup dogrulanamayan             9
beyan ile kanit arasindaki risk           555.10
kanitsizligin tasidigi pay %                25.4

3. ayni program listesinde siralama
sirasi degisen kalem                          51
en buyuk sira kaymasi                         21
ilk onda tedarikci kalemi (beyan)              1
ilk onda tedarikci kalemi (kanit)              3
program toplami beyan / kanit           7402.12 / 7957.22

4. en cok yukselen bes kalem (beyandan kanita)
sayac-bakim-firmasi  kimlik-ele-gecirme     113.51   198.45     30      9
saha-isgucu-firmasi  ic-kotuye-kullanim      38.78    61.20     58     46
sayac-bakim-firmasi  zararli-kod            161.70   262.50     15      5
saha-isgucu-firmasi  tedarik-zinciri         38.78    55.08     59     50
saha-isgucu-firmasi  kimlik-ele-gecirme     127.23   160.65     25     18

5. dogrulamanin kapattigi belirsizlik (risk dusmez, olcum kesinlesir)
secenek                    bedel  kontrol   kapanan     oran
anketi yenilemek              12        0      0.00    0.000
kanit istemek                 38        6    326.07    8.581
yerinde dogrulamak           216        9    555.10    2.570
```

Sayılar **ölçüm** sınıfındadır; girdileri RY23–RY28'dir.

#### Üç Kümenin Arası

Birinci tablo üç sayıyı yan yana koyuyor: üç tedarikçide sözleşmede **16**, ankette **13**,
kanıtta **7** kontrol vardır. Aradaki daralma tek biçimde değildir. Sayaç bakım firmasında beş
kontrolden ikisi kanıtlanır, bulut barındırmada yediden dördü, saha işgücü firmasında dörtten
biri. En çok kontrol taahhüt eden tedarikçi en çok kanıtı da verir ve oranı da en yüksektir — yedi
sözleşme kaleminin dördü. Öteki iki tedarikçide oran yarının altında kalıyor: beşte iki ve
dörtte bir.

İkinci tablo daralmayı ikiye ayırıyor. **3 kontrol ankette hiç sorulmuyor** — sözleşmede yazılı,
değerlendirme sorularının kapsamı dışında kalmış. **6 kontrol yanıtlanmış ama kanıtsız** —
sorulmuş, tedarikçi "evet" demiş, o "evet"i gösteren hiçbir çıktı istenmemiş. Toplamda
**devredilmiş görünüp doğrulanamayan 9 kontrol** vardır ve bu, sözleşmede yazanların yarısından
fazlasıdır.

#### Doğrulanamayanın Taşıdığı Sayı

Kontrol sayısı tek başına bir büyüklük vermez; ikinci tablonun son iki satırı onu birime çeviriyor.
Bütün sözleşme kontrollerinin işlediği varsayılırsa tedarikçi kalemlerinin kalan riski 1.633,51
kurgu birimdir. Yalnız kanıtlananların işlediği kabul edilirse **2.188,61 birim**. Aradaki
**555,10 birim**, tedarikçi riskinin **yüzde 25,4'ü**, doğrulanamayan dokuz kontrolün taşıdığı
paydır.

Bu sayı bir kayıp değil, bir **belirsizliktir** ve iki yönde de açılabilir. Kontroller gerçekten
işliyorsa gerçek risk 1.633,51 birime yakındır ve kurum kendi listesini gereğinden yüksek yazıyor
demektir. İşlemiyorsa gerçek risk 2.188,61 birime yakındır ve kurum bir bölümünü devrettiğini
sanarak taşımaktadır. Ölçüm iki durumu ayırt edemez, çünkü ikisini ayıracak veri hiç toplanmamıştır.

Anket sütunu da bu yüzden ayrı durur: 1.862,54 birim, ikisinin ortasında. Bir beyanı kanıt yerine
saymak riski 326,07 birim düşürmez; yalnız tabloyu daha rahat okunur yapar.

#### Beyanla Sıralamak, Kanıtla Sıralamak

Üçüncü tablo bu kursun ana ölçüsüne dönüyor. Aynı 62 kalemlik program listesi beyanla
sıralandığında ve kanıtla sıralandığında **51 kalemin yeri değişir**, en büyük kayma **21
basamaktır**. İlk onda tedarikçi kalemi beyanla **1**, kanıtla **3** tanedir.

Dördüncü tablo hangi kalemlerin yükseldiğini gösteriyor. Sayaç bakım firmasındaki kimlik ele
geçirme kalemi beyan sıralamasında **otuzuncu**, kanıt sıralamasında **dokuzuncu**dur; sayısı
113,51'den 198,45 birime çıkar. Aynı firmadaki zararlı kod kalemi on beşincilikten beşinciliğe
yükselir. İkisinin ortak yanı, düşüşü sağlayan kontrollerin ankette yanıtlanmış ama kanıtlanmamış
olmasıdır.

Sonuç bu kursun kuralının tedarikçi tarafındaki karşılığıdır. Öncelik listesi kimin ne taahhüt
ettiğine göre değil, neyin gösterildiğine göre kurulduğunda **ilk on değişir** — yani bütçenin
gittiği yer değişir. Beyanla çalışan bir program tedarikçi kalemlerini listenin ortasına yazar ve
bütçesini kendi uçlarına harcar; bu, sıralamanın yanlış kalemi öne aldığı üçüncü durumdur ve
sebebi ne ölçek ne düzeydir, **veri kaynağıdır**.

#### Doğrulamanın Birim Bedeli

Beşinci tablo doğrulamayı kursun ölçü birimiyle sınıyor; burada ölçülen şey düşen risk değil,
**kapanan belirsizliktir**. Anketi yenilemek 12 birime mal olur ve **sıfır** kontrol doğrular:
aynı soruyu ikinci kez sormak yeni bir gözlem üretmez. Kanıt istemek 38 birime **altı** kontrolü
kapatır ve 326,07 birimlik belirsizliği kaldırır; oranı **8,581**. Yerinde doğrulama 216 birime
**dokuz** kontrolü, yani belirsizliğin tamamını kapatır, ama oranı **2,570**'e iner.

İki satır arasındaki fark yönetim kararının kendisidir. Kanıt istemek belirsizliğin yüzde
58,7'sini bedelin altıda biriyle kapatır; yerinde doğrulama kalan üç kontrol için 178 birim daha
ister. Kalan üç kontrol tam olarak **ankette hiç sorulmayanlardır** ve onları kapatmanın tek yolu
yerinde bakmaktır — çünkü tedarikçi o konuda hiçbir şey beyan etmemiştir, çürütülecek bir cevap
bile yoktur.

#### Özet

- Bir tedarikçi kontrolü üç ayrı kümede bulunabilir: sözleşmede yazan bir yükümlülük, ankette
  yanıtlanan bir beyan, kanıtla doğrulanan bir gözlemdir. Üç tedarikçide sayılar 16, 13 ve 7'dir.
- Daralma iki ayrı boşluktan gelir: 3 kontrol ankette hiç sorulmaz (kapsam boşluğu), 6 kontrol
  yanıtlanıp kanıtlanmaz (kanıt boşluğu). Devredilmiş görünüp doğrulanamayan toplam 9 kontroldür.
- Doğrulanamayan dokuz kontrol 555,10 kurgu birim taşır, tedarikçi riskinin yüzde 25,4'ü. Bu bir
  kayıp değil belirsizliktir ve iki yönde de açılabilir; ölçüm ikisini ayırt edemez.
- Aynı 62 kalemlik liste beyanla ve kanıtla sıralandığında 51 kalemin yeri değişir, en büyük kayma
  21 basamaktır ve ilk ondaki tedarikçi kalemi birden üçe çıkar.
- Bir kalem otuzuncu sıradan dokuzuncu sıraya yükselir; düşüşü sağlayan kontroller ankette
  yanıtlanmış ama kanıtlanmamıştır. Sıralamayı değiştiren şey ölçek ya da düzey değil, veri
  kaynağıdır.
- Anketi yenilemek 12 birime sıfır kontrol doğrular; kanıt istemek 38 birime altı kontrolü ve
  belirsizliğin yüzde 58,7'sini kapatır (oran 8,581); yerinde doğrulama 216 birime tamamını kapatır
  (oran 2,570).

#### Sonraki Adım

Beş ders boyunca tek bir liste kuruldu, iki ölçekle sıralandı, dört seçenekle yarıştırıldı,
envanter dışı kalemlerle tamamlandı ve son olarak kanıt düzeyine göre yeniden dizildi. Elde
sayılabilir bir öncelik listesi, birim çabaya düşen risk azalması ve her kararın bedeli var.
Eksik olan tek şey, bütün bunları **dışarıdan bakan birine** anlatabilecek bir dildir.

Bu dersin kendisi bunu gösteriyor. Kurum üç tedarikçisinden kanıt istedi ve neyin kanıt sayılacağını
kendi tanımladı: sekiz kontrol, üç maske, bir bedel listesi. Aynı soru kuruma da soruluyor — abone
kimin? bir denetçi kimin? — ve kurumun elinde onlara verecek ortak bir sözlük yok. Kendi
sıralamasının doğru olduğunu kanıtlamaya çalışan her kurum önce kendi kontrol adlarını, kendi
olgunluk basamaklarını ve kendi kanıt biçimini uydurur; sonuç, hiçbir iki kurumun aynı şeyi
söylemediği bir tablodur. Sonraki konu **Çerçeveler ve Uyumluluk** bu ortak dili ele alır: kontrol
kümeleri nasıl yapılandırılır, bir gereksinim hangi kontrolle karşılanır ve o karşılamanın kanıtı
kaç kalem üretmeyi gerektirir.

## Çerçeveler

Kurumun kendi ölçüsünün dışarıdan okunabilir ortak bir dile çevrilmesi ve bu dilin kanıt üretimi cinsinden bedeli: işlev tabanlı çerçevenin olgunluk hesabı, belgelendirilebilir yönetim sistemi döngüsü ile kapsam daraltmanın dışarıda bıraktığı kalem, kontrol ile gereksinim matrisinde kanıtsız kalan gereksinim ve birden çok gereksinimi karşılayan kontrol, veri türüne bağlı sektörel gereksinimlerin getirdiği ek kontroller, veri sahibi haklarının sistem başına arama maliyeti, politika, standart ve yordam hiyerarşisinde hangi düzeyin denetimde kanıt sayıldığı ve bağımsız güvencenin çıkar ayrımıyla ortaya çıkardığı bulgu.

### Güvenlik Çerçeveleri

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/guvenlik-cerceveleri

İşlev tabanlı çerçevenin yapısı ve kurgu bir kontrol kümesinde olgunluk hesabı: 5 işlev, 14 kategori ve 31 kontrol kaleminde genel olgunluğun 1,35 çıkması, 5 kontrolün düzey 0'da durması ve bir kategorinin hiçbir işleyen kontrole sahip olmaması, 31 kontrolün 15'inin kanıt üretmesi ve 25 kanıt kalemi vermesi, 45 adam-günlük bütçede boşluk önceliğiyle verim önceliğinin beş işlevi de farklı sıralaması ve verim sırasının ortalamayı 0,07 yükseltirken en zayıf işlevi 0,33 geride bırakması.

Önceki konu bir liste bıraktı: kalemler sıralandı, seçenekler bedeliyle yarıştırıldı ve kıt
bütçenin hangi kaleme gideceği sayıyla gerekçelendirildi. O listenin kurum içinden görünmeyen bir
kusuru vardır — tamamı kurumun kendi dilinde yazılmıştır. Ölçütleri kurum seçti, ağırlıkları kurum
verdi, sıralamayı kurum çıkardı. Dışarıdan bakan biri, bir alıcı, bir sigortacı ya da hizmeti satın
alan başka bir kurum "güvenlik durumunuzu gösterin" dediğinde bu liste yanıt olmaz: karşı tarafın
onu kendi listesiyle yan yana koyabileceği ortak bir eksen yoktur.

**Güvenlik çerçevesi** (security framework) o eksendir. Bir kurumun yaptığı güvenlik işini, kimin
yaptığından ve hangi araçla yaptığından bağımsız olarak sayılabilir başlıklara bölen ortak bir
sınıflandırmadır. Bu ders çerçeveyi **yapısıyla** ele alır ve tek bir soruya bağlar: aynı kontrol
kümesi bu yapıya oturtulduğunda hangi sayı çıkıyor, o sayı neyi gösteriyor, neyi saklıyor. Ders
boyunca hiçbir çerçeve, standart ya da kurum adı geçmez; ölçülen şey ad değil, yapının kendisidir.

#### İşlev, Kategori, Kontrol

**İşlev tabanlı çerçeve** üç katmanlıdır. En üstte **işlev** durur ve güvenlik işini birbirini
izleyen beş başlığa böler: **kimlik** (neye sahibim, hangi riski taşıyorum), **koruma** (erişimi
neyle daraltıyorum), **tespit** (olan biteni nasıl görüyorum), **yanıt** (görünce ne yapıyorum) ve
**kurtarma** (sonrasında nasıl ayağa kalkıyorum). Her işlev **kategori**lere, her kategori tek tek
**kontrol**lere ayrılır. Bu bölünmenin işlevi şudur: farklı iki kurumun farklı araçlarla yaptığı
işler aynı beş başlığa düşer, böylece iki kurum aynı tabloda karşılaştırılabilir.

İkinci katman **olgunluk düzeyi**dir (maturity level) ve kontrolün varlığını değil, **ne kadar
kurumsallaştığını** ölçer. Bu ayrım dersin ana kavramıdır: bir kontrolün var olması ile denetlenebilir
biçimde işlemesi aynı şey değildir. Aşağıdaki model beş düzey kullanır — yok, belgesiz yapılıyor,
belgeli, ölçülüyor, sürekli iyileştiriliyor.

- **CE1.** Örnek kurum, dokuz kurs boyunca sürdürülen kurgu **bölgesel ölçüm ağı**dır: uç noktalar,
  ağ, kimlik, kiralanan hesaplar ve üç tedarikçi. Kontrol kümesi ve düzeyler **kurgudur**.
- **CE2.** Çerçeve beş işlev, on dört kategori ve otuz bir kontrol kaleminden oluşur.
- **CE3.** Olgunluk düzeyi 0–4 aralığındadır: 0 yok, 1 belgesiz yapılıyor, 2 belgeli, 3 ölçülüyor,
  4 sürekli iyileştiriliyor.
- **CE4.** Kategori olgunluğu kontrollerinin, işlev olgunluğu kategorilerinin **ağırlıksız
  ortalamasıdır**; genel olgunluk beş işlevin ortalamasıdır.
- **CE5.** Bir kontrolü bir düzey yükseltmek `2 + 3 × mevcut düzey` adam-gün tutar: düşük düzeyden
  çıkmak ucuz, yüksek düzeyi taşımak pahalıdır.
- **CE6.** Kanıt üretimi düzeye bağlıdır: düzey 2'den itibaren bir belge, düzey 3'ten itibaren iki
  ölçüm kaydı daha üretilir. Düzey 0 ve 1 hiçbir kanıt kalemi üretmez.

```js
// cerceve/olgunluk.mjs — islev tabanli cercevede olgunluk duzeyinin hesaplanmasi.
// MODELDIR: bolgesel olcum agi (kurgu); kontrol kumesi ve duzeyler kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

// islev | kategori | kategorideki kontrollerin olgunluk duzeyleri (0-4)
export const KATEGORI = satir(`
  kimlik|varlik envanteri|3 2 1
  kimlik|is baglami|2 2
  kimlik|risk degerlendirmesi|3 2
  koruma|erisim denetimi|3 3 2
  koruma|veri guvenligi|3 2 2
  koruma|bakim ve yama|2 1
  tespit|surekli izleme|2 1 1
  tespit|olay ayirdetme|1 0
  yanit|yanit plani|2 1
  yanit|bildirim|1 0
  yanit|azaltma|1 1
  kurtarma|kurtarma plani|1 0
  kurtarma|iyilestirme|0 0
  kurtarma|iletisim|1`)
  .map(([islev, ad, d]) => ({ islev, ad, duzey: d.split(" ").map(Number) }));

export const ISLEV = ["kimlik", "koruma", "tespit", "yanit", "kurtarma"];
export const kategoriler = (i) => KATEGORI.filter((k) => k.islev === i);
export const kOrt = (k) => k.duzey.reduce((a, b) => a + b, 0) / k.duzey.length;
export const iOrt = (i) => kategoriler(i).reduce((a, k) => a + kOrt(k), 0) / kategoriler(i).length;
// Bir kontrolu bir duzey yukseltmek 2 + 3 x mevcut duzey adam-gun tutar (kurgu).
export const gun = (d) => 2 + 3 * d;
// Kanit: duzey 2'den itibaren 1 belge, duzey 3'ten itibaren 2 olcum kaydi daha.
export const kanit = (d) => (d >= 2 ? 1 : 0) + (d >= 3 ? 2 : 0);

if (import.meta.url === `file://${process.argv[1]}`) {
  const kontrol = KATEGORI.flatMap((k) => k.duzey);
  console.log(`model: ${ISLEV.length} islev, ${KATEGORI.length} kategori, ` +
    `${kontrol.length} kontrol kalemi`);

  const y = gen([10, 9, 8, 10, 22, 9]);
  console.log("\n" + y("islev", "kategori", "kontrol", "olgunluk", "en zayif", "duzey 0"));
  for (const i of ISLEV) {
    const c = kategoriler(i), d = c.flatMap((k) => k.duzey);
    const enZayif = c.reduce((a, k) => (kOrt(k) < kOrt(a) ? k : a));
    console.log(y(i, c.length, d.length, iOrt(i).toFixed(2),
      `${enZayif.ad} ${kOrt(enZayif).toFixed(1)}`, d.filter((x) => x === 0).length));
  }
  const hepsi = KATEGORI.flatMap((k) => k.duzey);
  const genelOrt = ISLEV.reduce((a, i) => a + iOrt(i), 0) / ISLEV.length;
  const isleyensiz = KATEGORI.filter((k) => k.duzey.every((d) => d === 0));
  console.log(`\ngenel olgunluk ${genelOrt.toFixed(2)}; duzey 0 kontrol ` +
    `${hepsi.filter((d) => d === 0).length}/${hepsi.length}; ` +
    `hicbir isleyen kontrolu olmayan kategori ${isleyensiz.length} ` +
    `(${isleyensiz.map((k) => k.ad).join(", ")})`);
  console.log(`kanit ureten kontrol ${hepsi.filter((d) => d >= 2).length}/${hepsi.length}; ` +
    `uretilen kanit kalemi ${hepsi.reduce((a, d) => a + kanit(d), 0)}`);

  // Bir duzey yukseltmenin islev olgunluguna kazanci: 1 / (kategori x kontrol).
  const z = gen([10, 9, 14, 24, 11]);
  console.log("\n" + z("islev", "olgunluk", "olgunluk sira", "en ucuz +1", "verim sira"));
  const verim = ISLEV.map((i) => {
    const c = kategoriler(i);
    const en = c.flatMap((k) => k.duzey.map((d) =>
      ({ ad: k.ad, kazanc: 1 / (c.length * k.duzey.length) / gun(d), d })))
      .reduce((a, b) => (b.kazanc > a.kazanc ? b : a));
    return { i, ort: iOrt(i), en };
  });
  const sO = [...verim].sort((a, b) => a.ort - b.ort).map((v) => v.i);
  const sV = [...verim].sort((a, b) => b.en.kazanc - a.en.kazanc).map((v) => v.i);
  for (const v of verim) {
    console.log(z(v.i, v.ort.toFixed(2), sO.indexOf(v.i) + 1,
      `${v.en.ad} ${gun(v.en.d)} gun`, sV.indexOf(v.i) + 1));
  }
  const ayni = sO.filter((i, k) => i === sV[k]).length;
  console.log(`\nolgunluk sirasi: ${sO.join(" > ")}`);
  console.log(`verim sirasi   : ${sV.join(" > ")}`);
  console.log(`ayni sirada kalan islev: ${ayni}/${ISLEV.length}`);
}
```

```
model: 5 islev, 14 kategori, 31 kontrol kalemi

islev      kategori kontrol  olgunluk              en zayif  duzey 0
kimlik            3       7      2.17  varlik envanteri 2.0        0
koruma            3       8      2.17     bakim ve yama 1.5        0
tespit            2       5      0.92    olay ayirdetme 0.5        1
yanit             3       6      1.00          bildirim 0.5        1
kurtarma          3       5      0.50       iyilestirme 0.0        3

genel olgunluk 1.35; duzey 0 kontrol 5/31; hicbir isleyen kontrolu olmayan kategori 1 (iyilestirme)
kanit ureten kontrol 15/31; uretilen kanit kalemi 25

islev      olgunluk olgunluk sira              en ucuz +1 verim sira
kimlik         2.17             4  varlik envanteri 5 gun          5
koruma         2.17             5     bakim ve yama 5 gun          4
tespit         0.92             2    olay ayirdetme 2 gun          1
yanit          1.00             3          bildirim 2 gun          2
kurtarma       0.50             1    kurtarma plani 2 gun          3

olgunluk sirasi: kurtarma > tespit > yanit > kimlik > koruma
verim sirasi   : tespit > yanit > kurtarma > koruma > kimlik
ayni sirada kalan islev: 0/5
```

Birinci tablo çerçevenin asıl işini yapıyor: otuz bir dağınık kontrol kalemi beş sayıya iniyor ve
beş sayı **karşılaştırılabilir**. Kurumun dağılımı çarpıktır — koruma ve kimlik 2,17, kurtarma
0,50. Dokuz kursun bıraktığı tablo tam olarak budur: erişimi daraltmak, verinin okunduğunda ne
göstereceğini değiştirmek ve sınırı çekmek üzerine çok iş yapılmış, olaydan sonra ayağa kalkmak
üzerine az iş yapılmıştır. Bu çarpıklık ancak beş başlık ayrı ayrı yazıldığında görünür.

Genel olgunluk 1,35'tir ve bu sayı tek başına verildiğinde yanıltır. İki nedenle: birincisi,
**ortalama en zayıf halkayı yutar** — kurtarma işlevi ortalamanın üçte biri kadar bir değerdeyken
genel sayı orta bir yerde durur. İkincisi, ortalama bir kontrolün **hiç bulunmadığı** durumla
**düşük düzeyde bulunduğu** durumu ayırmaz. Son sütun bu ayrımı yapıyor: otuz bir kontrolün beşi
düzey 0'dadır ve bir kategori — iyileştirme — hiçbir işleyen kontrole sahip değildir. Bu tek satır,
"kurtarma olgunluğumuz 0,50" cümlesinden farklı bir karar doğurur, çünkü bir kategorinin tamamen
boş olması bir yavaşlık değil, bir **boşluktur**.

Üçüncü sayı kanıt tarafını açar ve sonraki iki dersin girdisidir. Otuz bir kontrolün on beşi
kanıt üretiyor, üretilen kanıt kalemi yirmi beştir. Düzey 0 ve 1'deki on altı kontrol ise
denetimde **hiçbir şey gösteremez**: yapılıyor olabilir, ama yapıldığını ortaya koyan bir kalem
yoktur. Olgunluk düzeyinin kanıtla bu kadar sıkı bağlı olması rastlantı değildir — düzey
tanımlarının kendisi belge ve ölçüm kaydı üzerinden yazılmıştır.

İkinci tablo kursun ölçü eksenini çerçeveye taşıyor. Sol taraf işlevleri olgunluğa göre sıralıyor:
en zayıf olan kurtarma birinci sırada. Sağ taraf ise aynı işlevleri **birim çabaya düşen olgunluk
kazancına** göre sıralıyor. İki sıra hiçbir işlevde çakışmıyor. Nedeni yapısaldır: bir işlevin
olgunluğuna yapılan katkı, o işlevin kategori sayısına ve kategorideki kontrol sayısına bölünür.
Tespit iki kategorilidir, bu yüzden oradaki bir yükseltme kurtarmadaki bir yükseltmeden daha çok
oynatır — kurtarma en düşük olduğu hâlde verim sırasında üçüncüdür.

#### Aynı Bütçe, İki Sıra

İki sıralamanın gerçek farkı, sabit bir bütçe harcandığında ortaya çıkar. Aşağıdaki dosya aynı
kontrol kümesini iki ayrı kuralla yükseltir: **boşluk önce** her adımda en düşük olgunluklu işlevin
en ucuz kalemini alır; **verim önce** genel olgunluğa birim gün başına en çok katkı veren kalemi
alır. Bütçe kırk beş adam-gündür ve kurgudur.

```js
// cerceve/butce.mjs — ayni cerceve iki farkli sirayla yukseltilir (kurgu butce).
import { KATEGORI, ISLEV, gen, gun, kanit } from "./olgunluk.mjs";

const BUTCE = 45;                                    // adam-gun (kurgu birim)
const kopya = () => KATEGORI.map((k) => ({ ...k, duzey: [...k.duzey] }));
const ort = (K, i) => { const c = K.filter((k) => k.islev === i);
  return c.reduce((a, k) => a + k.duzey.reduce((x, d) => x + d, 0) / k.duzey.length, 0) / c.length; };
const genel = (K) => ISLEV.reduce((a, i) => a + ort(K, i), 0) / ISLEV.length;
const kanitSay = (K) => K.flatMap((k) => k.duzey).reduce((a, d) => a + kanit(d), 0);
const sifir = (K) => K.flatMap((k) => k.duzey).filter((d) => d === 0).length;

// Aday yukseltme: kategori, kontrol, maliyet ve genel olgunluga kazanc.
const adaylar = (K) => K.flatMap((k, ki) => k.duzey.map((d, di) => ({ ki, di, d, k,
  maliyet: gun(d), kazanc: 1 / (ISLEV.length * K.filter((x) => x.islev === k.islev).length
    * k.duzey.length) })).filter((a) => a.d < 4));

function kostur(sec) {
  const K = kopya(); let kalan = BUTCE, adim = 0;
  for (;;) {
    const uygun = adaylar(K).filter((a) => a.maliyet <= kalan);
    if (!uygun.length) break;
    const a = sec(uygun, K);
    K[a.ki].duzey[a.di]++; kalan -= a.maliyet; adim++;
  }
  return { K, kalan, adim };
}

const YOL = [
  ["bosluk once", (u, K) => { const enDusuk = [...ISLEV].sort((a, b) => ort(K, a) - ort(K, b))[0];
    const ic = u.filter((a) => a.k.islev === enDusuk);
    return (ic.length ? ic : u).sort((a, b) => a.maliyet - b.maliyet || a.ki - b.ki)[0]; }],
  ["verim once", (u) => [...u].sort((a, b) =>
    b.kazanc / b.maliyet - a.kazanc / a.maliyet || a.ki - b.ki)[0]],
];

const y = gen([13, 9, 7, 8, 9, 7, 17]);
console.log(`butce ${BUTCE} adam-gun; baslangic genel olgunluk ` +
  `${genel(kopya()).toFixed(2)}, duzey 0 kontrol ${sifir(kopya())}, ` +
  `kanit kalemi ${kanitSay(kopya())}`);
console.log("\n" + y("sira", "yukselen", "kalan", "genel", "duzey 0", "kanit", "en zayif islev"));
const sonuc = {};
for (const [ad, sec] of YOL) {
  const { K, kalan, adim } = kostur(sec);
  const enZayif = [...ISLEV].sort((a, b) => ort(K, a) - ort(K, b))[0];
  sonuc[ad] = { K, enZayif };
  console.log(y(ad, adim, kalan, genel(K).toFixed(2), sifir(K), kanitSay(K),
    `${enZayif} ${ort(K, enZayif).toFixed(2)}`));
}

const z = gen([11, 12, 14, 14, 12]);
console.log("\n" + z("islev", "baslangic", "bosluk once", "verim once", "fark"));
for (const i of ISLEV) {
  const a = ort(sonuc["bosluk once"].K, i), b = ort(sonuc["verim once"].K, i);
  console.log(z(i, ort(kopya(), i).toFixed(2), a.toFixed(2), b.toFixed(2), (b - a).toFixed(2)));
}
const v = sonuc["verim once"].K;
const dokunulmayan = ISLEV.filter((i) => ort(v, i) === ort(kopya(), i));
console.log(`\nverim sirasi ${dokunulmayan.length} islevi hic yukseltmedi: ` +
  `${dokunulmayan.join(", ")}`);
console.log(`genel olgunluk farki ${(genel(v) - genel(sonuc["bosluk once"].K)).toFixed(2)}; ` +
  `en zayif islev farki ${(ort(v, sonuc["verim once"].enZayif) -
    ort(sonuc["bosluk once"].K, sonuc["bosluk once"].enZayif)).toFixed(2)}`);
```

```
butce 45 adam-gun; baslangic genel olgunluk 1.35, duzey 0 kontrol 5, kanit kalemi 25

sira          yukselen  kalan   genel  duzey 0  kanit   en zayif islev
bosluk once         12      0    1.77        0     32      tespit 1.50
verim once          11      2    1.83        0     32       yanit 1.17

islev         baslangic   bosluk once    verim once        fark
kimlik             2.17          2.17          2.17        0.00
koruma             2.17          2.17          2.33        0.17
tespit             0.92          1.50          1.83        0.33
yanit              1.00          1.50          1.17       -0.33
kurtarma           0.50          1.50          1.67        0.17

verim sirasi 1 islevi hic yukseltmedi: kimlik
genel olgunluk farki 0.07; en zayif islev farki -0.33
```

İki satır aynı kırk beş günü harcıyor ve ikisi de düzey 0'daki beş kontrolü sıfırdan çıkarıyor;
kanıt kalemi ikisinde de yirmi beşten otuz ikiye çıkıyor. Ayrıldıkları yer son iki sütundur. Verim
sırası genel olgunluğu 1,83'e taşıyor, boşluk sırası 1,77'de kalıyor — arada 0,07 vardır ve tek
başına okunduğunda verim sırası kazanmış görünür. Ama en zayıf işleve bakıldığında iş tersine
döner: boşluk sırası en zayıf işlevi 1,50'ye kadar getiriyor, verim sırası 1,17'de bırakıyor. Fark
0,33'tür, yani ortalamada kazanılanın yaklaşık beş katı kadar bir kayıp en zayıf halkada
birikiyor.

Alt tablo bunun nedenini gösteriyor. Verim sırası yanıt işlevini boşluk sırasından 0,33 geride
bırakıyor ve kimlik işlevine hiç dokunmuyor. Kural bunu bilerek yapıyor: kimlikteki bir yükseltme
beş gün tutuyor ve az oynatıyor, tespitteki iki gün tutuyor ve çok oynatıyor. **Verim ölçüsü bir
kalemin ne kadar kritik olduğunu değil, ölçüyü ne kadar oynattığını sorar.** Bu ders için sonuç
biçimseldir: olgunluk sayısı bir hedef hâline geldiğinde, sayıyı en ucuza yükselten sıra ile
boşluğu kapatan sıra ayrışır ve ikisi aynı bütçeyle farklı kurumlar üretir.

Buradan çıkan üçüncü gözlem çerçevenin kendisiyle ilgilidir. Ağırlıksız ortalama (CE4) bir
tercihtir, kaçınılmaz değildir: kategori sayısı az olan işlev, kalem başına daha çok oynar. Ölçüyü
kuran kural, ölçünün hangi kalemi öne alacağını da kurar. Bir çerçeve raporunda yalnız beş sayı
görünüyorsa, o beş sayının nasıl toplandığı da sorulmalıdır.

#### Özet

- İşlev tabanlı çerçeve üç katmanlıdır — işlev, kategori, kontrol — ve otuz bir dağınık kalemi
  karşılaştırılabilir beş sayıya indirir: kimlik ve koruma 2,17, yanıt 1,00, tespit 0,92,
  kurtarma 0,50.
- Genel olgunluk 1,35'tir ve iki şeyi saklar: en zayıf işlevi yutar, "yok" ile "düşük"ü ayırmaz.
  Otuz bir kontrolün beşi düzey 0'dadır ve bir kategorinin hiçbir işleyen kontrolü yoktur.
- Kanıt üretimi düzeye bağlıdır: otuz bir kontrolün yalnız on beşi kanıt üretiyor ve toplam yirmi
  beş kalem veriyor; düzey 0 ve 1'deki on altı kontrol denetimde hiçbir şey gösteremez.
- İşlevleri olgunluğa göre sıralamakla birim çabaya düşen kazanca göre sıralamak beş işlevin
  hiçbirinde aynı sonucu vermiyor; kurtarma en düşük olduğu hâlde verim sırasında üçüncüdür.
- Kırk beş adam-günlük bütçede verim sırası genel olgunluğu 0,07 daha yükseltiyor ama en zayıf
  işlevi 0,33 geride bırakıyor ve bir işleve hiç dokunmuyor: sayıyı yükseltmekle boşluğu kapatmak
  aynı iş değildir.

#### Sonraki Adım

Çerçeve ortak bir eksen kurdu ve dağınık kontrolleri karşılaştırılabilir sayılara indirdi. Bu
sayıların hepsinin ortak bir özelliği var: **kurumun kendisi hesapladı.** Düzeyleri kurum atadı,
ortalamayı kurum aldı, hangi kalemin yükseltileceğine kurum karar verdi. Dışarıdan bakan biri için
bu, önceki konudaki listeden yalnız bir adım ilerdedir — dil ortaklaştı, ama sayıyı üreten taraf
değişmedi.

Sonraki ders bu adımı atan yapıyı ele alır: kapsamı bildirilen, hangi kontrolün neden uygulanıp
neden uygulanmadığı yazılan, iç denetimden geçen ve **dışarıdan bir tarafça belgelendirilen**
yönetim sistemi modelini. Ölçülecek şey belgenin kendisi değil, kapsam bildirimidir: kapsamı
daraltmak belgeyi ucuzlatır ve aynı hareketle kaç kalemi belgenin dışında bırakır.

### Yönetim Sistemi Standartları

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/yonetim-sistemi-standartlari

Belgelendirilebilir yönetim sistemi modelinin kapsam bildirimi, uygulanabilirlik bildirimi, iç denetim ve dış belgelendirme döngüsüyle koşturulması: 23 kalemlik envanterde dar kapsamın 100 kontrol maddesinin 25'ini uygulama dışı bırakması, toplam riskin yüzde 76'sını belgenin dışında tutması ve 15 kalemi dış taraf hâline getirmesi, 20 uygunsuzluk/tur düzeltme kapasitesinin geniş kapsamda belgeyi engellemesi ve mutlak maliyet sırasıyla birim risk başına maliyet sırasının tam ters çıkması.

Önceki ders dağınık kontrolleri karşılaştırılabilir beş sayıya indirdi, ama o sayıları kurumun
kendisi hesapladı. Düzeyleri kurum atadı, ortalamayı kurum aldı. Dışarıdan bakan biri için bu, iyi
düzenlenmiş bir öz beyandır; öz beyanın kanıt değeri, beyanı verenin çıkarına bağlıdır.

Bu dersin konusu o bağı koparan yapıdır: **belgelendirilebilir yönetim sistemi standardı**. Dört
adımlı bir döngü tanımlar — kapsam bildirimi, uygulanabilirlik bildirimi, iç denetim, dış
belgelendirme — ve döngünün sonunda kurum dışı bir taraf bir karar verir. Kararın kendisi ikili
olduğu için ("verilir" ya da "verilmez") döngünün asıl ölçüsü karar değildir; **kapsamdır.** Belge
her zaman bir kapsam için verilir ve kapsamı kurum kendi seçer. Bu ders kapsam seçiminin ne
sakladığını sayar. Hiçbir standart, belgelendirme kuruluşu ya da program adı geçmez.

#### Kapsam Bildirimi ve Uygulanabilirlik Bildirimi

**Kapsam bildirimi**, yönetim sisteminin hangi birimleri, hangi yerleri ve hangi varlıkları
kapsadığını yazan tanımdır. **Uygulanabilirlik bildirimi** ise standardın kontrol maddelerinden
hangilerinin uygulandığını, uygulanmayanların hangi gerekçeyle dışarıda bırakıldığını madde madde
listeler. İkisi birlikte okunmadıkça belge tek başına bir şey söylemez: kapsam neyin denetlendiğini,
uygulanabilirlik bildirimi ise kapsam içinde bile **neyin denetlenmediğini** verir.

- **CE7.** Envanter, önceki konudan gelen kurgu **bölgesel ölçüm ağı**dır: 23 kalem, yedi birim,
  dört bölge. Risk puanları önceki konunun sıralamasından alınır ve **kurgudur**.
- **CE8.** Standardın kontrol kümesi 100 maddedir ve 12 özellik öbeğine bölünmüştür. Bir öbek,
  ancak kapsam içinde o özelliği taşıyan en az bir kalem varsa **uygulanabilir** sayılır.
- **CE9.** Üç kapsam bildirimi karşılaştırılır: dar (yalnız faturalama birimi), orta (faturalama,
  ölçüm ve kimlik birimlerinin saha dışı kalemleri), geniş (bütün envanter).
- **CE10.** Kapsam dışında kalıp kapsam içi bir kalemle aynı özelliği paylaşan kalem, belgede
  **dış taraf** olarak görünür: arayüzü vardır, denetimi yoktur.
- **CE11.** İç denetim uygulanan kontrollerin tamamını tarar; her öbeğin bilinen bir uygunsuzluk
  oranı vardır (kurgu).
- **CE12.** Düzeltme kapasitesi turda 20 uygunsuzluktur. Dış belgelendirme denetimi uygulanan
  kontrollerin yüzde 40'ına bakar ve iki maddeden çok uygunsuzluk görürse belge verilmez.
- **CE13.** Denetim süresi `⌈kalem/2⌉ + ⌈uygulanan kontrol/15⌉` gündür: sabit bir kapsam gezme
  yükü ile madde başına artan bir inceleme yükü.

```js
// sistem/kapsam.mjs — belgelendirilebilir yonetim sisteminde kapsam bildirimi.
// MODELDIR: bolgesel olcum agi (kurgu); kalemler, risk puanlari ve kontrol sayilari kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

// ad | birim | bolge | risk puani (onceki konudan gelir) | ozellikler
export const KALEM = satir(`
  fatura-uygulamasi|faturalama|merkez|8|kisisel-veri odeme-verisi gelistirme yedekleme
  fatura-veritabani|faturalama|merkez|9|kisisel-veri odeme-verisi kriptografi yedekleme
  odeme-gecidi-baglantisi|faturalama|kiralanan|7|odeme-verisi tedarikci kriptografi
  abone-portali|faturalama|kiralanan|8|kisisel-veri uzak-erisim bulut-hesabi
  fatura-rapor-servisi|faturalama|kiralanan|4|kisisel-veri bulut-hesabi
  toplayici-servis|olcum|merkez|7|bulut-hesabi yedekleme gelistirme
  dogrulayici-servis|olcum|merkez|6|bulut-hesabi gelistirme
  saha-sayac-agi|olcum|saha|9|saha-cihazi kablosuz kriptografi
  saha-el-terminali|olcum|saha|6|saha-cihazi kablosuz uzak-erisim
  sube-ucu|olcum|saha|5|saha-cihazi fiziksel-tesis
  kimlik-saglayici|kimlik|merkez|9|uzak-erisim kriptografi olay-mudahale
  yonetici-atlama-konagi|kimlik|merkez|8|uzak-erisim kriptografi
  dizin-servisi|kimlik|merkez|7|kisisel-veri uzak-erisim
  is-emri-servisi|saha-operasyon|merkez|5|kisisel-veri gelistirme
  saha-ekip-uygulamasi|saha-operasyon|saha|4|kisisel-veri uzak-erisim saha-cihazi
  arac-takip-baglantisi|saha-operasyon|tedarikci|5|kisisel-veri tedarikci
  veri-merkezi-alani|tesis|merkez|6|fiziksel-tesis yedekleme
  sube-deposu|tesis|saha|3|fiziksel-tesis
  gunluk-toplama-hatti|guvenlik|merkez|7|olay-mudahale bulut-hesabi yedekleme
  nobet-ve-mudahale|guvenlik|merkez|6|olay-mudahale
  bakim-tedarikcisi-erisimi|tedarik|tedarikci|8|tedarikci uzak-erisim
  bulut-tedarikcisi-hesabi|tedarik|tedarikci|7|tedarikci bulut-hesabi
  danisman-gelistirme-erisimi|tedarik|tedarikci|6|tedarikci gelistirme`)
  .map(([ad, birim, bolge, risk, oz]) =>
    ({ ad, birim, bolge, risk: +risk, oz: oz.split(" ") }));

// Kontrol kumesi: her ozellik bir kontrol obegini tetikler.
// ozellik | kontrol sayisi | ic denetimde uygunsuz cikan oran (yuzde)
export const OBEK = satir(`
  kisisel-veri|12|25
  odeme-verisi|9|22
  kriptografi|8|25
  uzak-erisim|11|18
  bulut-hesabi|10|30
  saha-cihazi|7|43
  kablosuz|5|40
  fiziksel-tesis|6|17
  yedekleme|8|38
  olay-mudahale|7|29
  gelistirme|9|33
  tedarikci|8|50`)
  .map(([ozellik, n, oran]) => ({ ozellik, n: +n, oran: +oran }));

export const TOPLAM_KONTROL = OBEK.reduce((a, o) => a + o.n, 0);
export const TOPLAM_RISK = KALEM.reduce((a, k) => a + k.risk, 0);

// Uc kapsam bildirimi. Kapsam, kalem kumesini secen bir yuklemdir.
export const KAPSAM = [
  ["dar", (k) => k.birim === "faturalama"],
  ["orta", (k) => ["faturalama", "olcum", "kimlik"].includes(k.birim) && k.bolge !== "saha"],
  ["genis", () => true],
];

export const ic = (yuklem) => KALEM.filter(yuklem);
export const ozellikler = (kume) => new Set(kume.flatMap((k) => k.oz));
export const uygulanabilir = (kume) => {
  const o = ozellikler(kume);
  return OBEK.filter((b) => o.has(b.ozellik));
};
// Sinir arayuzu: kapsam disinda kalip kapsam ici bir kalemle ayni ozelligi
// paylasan kalem, belgede "dis taraf" olarak gorunur (model varsayimi).
export const disTaraf = (kume) => KALEM.filter((b) =>
  !kume.includes(b) && b.oz.some((o) => kume.some((a) => a.oz.includes(o))));

if (import.meta.url === `file://${process.argv[1]}`) {
  console.log(`model: ${KALEM.length} kalem, toplam risk ${TOPLAM_RISK}, ` +
    `${OBEK.length} ozellik obegi, ${TOPLAM_KONTROL} kontrol maddesi`);
  const y = gen([8, 8, 10, 12, 14, 17, 12]);
  console.log("\n" + y("kapsam", "kalem", "kapsam %", "uygulanan", "uygulanmayan",
    "disarida risk %", "dis taraf"));
  for (const [ad, yuklem] of KAPSAM) {
    const kume = ic(yuklem);
    const u = uygulanabilir(kume).reduce((a, b) => a + b.n, 0);
    const risk = kume.reduce((a, k) => a + k.risk, 0);
    console.log(y(ad, kume.length, (100 * kume.length / KALEM.length).toFixed(0),
      u, TOPLAM_KONTROL - u, (100 * (TOPLAM_RISK - risk) / TOPLAM_RISK).toFixed(1),
      disTaraf(kume).length));
  }
  // Dar kapsamda uygulanmayan obekler ve disarida kalan risk kalemleri
  const dar = ic(KAPSAM[0][1]);
  const yok = OBEK.filter((b) => !ozellikler(dar).has(b.ozellik));
  console.log(`\ndar kapsamda uygulanmayan obek: ` +
    `${yok.map((b) => `${b.ozellik} (${b.n})`).join(", ")}`);
  const disRisk = KALEM.filter((k) => !dar.includes(k)).sort((a, b) => b.risk - a.risk).slice(0, 4);
  console.log(`dar kapsamin disinda kalan en yuksek riskli dort kalem: ` +
    `${disRisk.map((k) => `${k.ad} (${k.risk})`).join(", ")}`);
}
```

```
model: 23 kalem, toplam risk 150, 12 ozellik obegi, 100 kontrol maddesi

kapsam     kalem  kapsam %   uygulanan  uygulanmayan  disarida risk %   dis taraf
dar            5        22          75            25             76.0          15
orta          10        43          82            18             51.3          11
genis         23       100         100             0              0.0           0

dar kapsamda uygulanmayan obek: saha-cihazi (7), kablosuz (5), fiziksel-tesis (6), olay-mudahale (7)
dar kapsamin disinda kalan en yuksek riskli dort kalem: saha-sayac-agi (9), kimlik-saglayici (9), yonetici-atlama-konagi (8), bakim-tedarikcisi-erisimi (8)
```

Tablonun okunacak yeri üçüncü ve beşinci sütunların arasıdır. Dar kapsam envanterin yüzde 22'sini
alıyor ve 100 kontrol maddesinin **75'ini** uyguluyor. Bu oransızlık kapsam bildiriminin en kolay
yanlış okunan yanıdır: kapsam beşte bire indiği hâlde kontrol maddesi yalnız dörtte bir azalıyor,
çünkü kontrol maddeleri kalem sayısıyla değil **özellik çeşitliliğiyle** ölçeklenir. Faturalama
birimi tek başına kişisel veri, ödeme verisi, kriptografi, uzak erişim, bulut hesabı, geliştirme,
yedekleme ve tedarikçi bağlantısı taşır; on iki öbeğin sekizini tetikler.

Belgeyi okuyan taraf için sonuç şudur: "yüz maddenin yetmiş beşi uygulanmıştır" cümlesi geniş bir
kapsam izlenimi verir, oysa envanterin yüzde 78'i ve toplam riskin yüzde 76'sı dışarıdadır. Dışarıda
kalanlar da rastgele değildir — dört en yüksek riskli kalemden ikisi risk puanı 9 olan saha sayaç
ağı ve kimlik sağlayıcıdır. Uygulanmayan dört öbek de bunu doğruluyor: saha cihazı, kablosuz,
fiziksel tesis ve olay müdahalesi. Bu dört öbek, faturalama birimi hiçbir saha cihazı ve tesis
taşımadığı için "uygulanamaz" damgası yiyor; damganın gerekçesi biçimsel olarak doğrudur ve sonuç
yine de yanıltıcıdır.

Orta kapsam ara bir durum değil, farklı bir tercihtir: kalem sayısını iki katına çıkarıyor ve
uygulanan madde sayısını yalnız 75'ten 82'ye taşıyor. Eklenen yedi madde olay müdahalesi öbeğinden
geliyor, çünkü kimlik sağlayıcı o özelliği taşıyan ilk kapsam içi kalemdir. Kapsamı genişletmenin
kontrol tarafındaki bedeli, eklenen kalemlerin **yeni özellik getirip getirmediğine** bağlıdır;
aynı özellikleri taşıyan bir kalem eklemek uygulanabilirlik bildirimini hiç değiştirmez.

Son sütun bu yanılgının adını koyuyor. Dar kapsamda **15 kalem dış taraf** sayılıyor: sistemle
arayüzü var, denetimi yok. Bir belge, kapsam sınırındaki arayüzleri "dış taraf" başlığı altında
toplar ve o tarafın kendi kontrollerini kanıtlamasını bekler. Kurumun kendi kalemleri kendi
belgesinde dış taraf olarak görünüyorsa, kapsam sınırı kurumu ikiye bölmüş demektir. Uygulanabilirlik
bildiriminin belgeyle birlikte istenmesinin nedeni budur: dışarıda kalan 25 maddeyi ve gerekçesini
yalnız o belge listeler.

#### Döngü ve Düzeltme Kapasitesi

Kapsam seçildikten sonra döngünün geri kalanı koşar: iç denetim uygulanan kontrolleri tarar,
bulunanlar düzeltilir, dış belgelendirme denetimi örneklem alır ve karar verir.

```js
// sistem/dongu.mjs — ic denetim ve dis belgelendirme dongusu ayni uc kapsamda kosturulur.
import { KALEM, KAPSAM, TOPLAM_KONTROL, TOPLAM_RISK, ic, uygulanabilir, disTaraf, gen }
  from "./kapsam.mjs";

const DUZELTME = 20;   // bir turda duzeltilebilen uygunsuzluk sayisi (kurgu kapasite)
const ORNEK = 0.4;     // dis belgelendirme denetimi uygulanan kontrollerin %40'ina bakar
const ESIK = 2;        // dis denetimde 2'den cok uygunsuzluk gorulurse belge verilmez
const gunHesap = (kalem, kontrol) => Math.ceil(kalem / 2) + Math.ceil(kontrol / 15);

const y = gen([8, 11, 10, 12, 8, 14, 11, 10]);
console.log(`${TOPLAM_KONTROL} kontrol maddesi, ${KALEM.length} kalem, toplam risk ` +
  `${TOPLAM_RISK}; duzeltme kapasitesi ${DUZELTME} uygunsuzluk/tur (kurgu)`);
console.log("\n" + y("kapsam", "uygulanan", "ic bulgu", "duzeltilen", "kalan",
  "dis orneklem", "yakalanan", "belge"));
const sonuc = [];
for (const [ad, yuklem] of KAPSAM) {
  const kume = ic(yuklem), obek = uygulanabilir(kume);
  const uygulanan = obek.reduce((a, b) => a + b.n, 0);
  const bulgu = obek.reduce((a, b) => a + Math.round(b.n * b.oran / 100), 0);
  const kalan = Math.max(0, bulgu - DUZELTME);
  const orneklem = Math.round(uygulanan * ORNEK);
  const yakalanan = Math.round(kalan * ORNEK);
  const risk = kume.reduce((a, k) => a + k.risk, 0);
  const gun = gunHesap(kume.length, uygulanan);
  sonuc.push({ ad, kume, uygulanan, bulgu, kalan, yakalanan, risk, gun });
  console.log(y(ad, uygulanan, bulgu, Math.min(bulgu, DUZELTME), kalan, orneklem, yakalanan,
    yakalanan > ESIK ? "yok" : "verilir"));
}

const z = gen([8, 11, 11, 9, 12, 15, 11]);
console.log("\n" + z("kapsam", "kapsanan", "disarida", "gun", "gun / risk", "disarida kalem",
  "dis taraf"));
for (const s of sonuc) {
  console.log(z(s.ad, s.risk, TOPLAM_RISK - s.risk, s.gun, (s.gun / s.risk).toFixed(3),
    KALEM.length - s.kume.length, disTaraf(s.kume).length));
}
const ucuz = [...sonuc].sort((a, b) => a.gun - b.gun).map((s) => s.ad);
const verimli = [...sonuc].sort((a, b) => a.gun / a.risk - b.gun / b.risk).map((s) => s.ad);
console.log(`\nmutlak maliyet sirasi : ${ucuz.join(" < ")}`);
console.log(`birim risk basina sira: ${verimli.join(" < ")}`);

const [dar, , genis] = sonuc;
console.log(`\ndar kapsam ${genis.gun - dar.gun} denetim gunu ve ` +
  `${genis.bulgu - dar.bulgu} ic bulgu tasarruf ediyor; karsiliginda ` +
  `${TOPLAM_RISK - dar.risk} risk puani ve ${TOPLAM_KONTROL - dar.uygulanan} kontrol maddesi ` +
  `belgenin disinda kaliyor`);
const dis = disTaraf(dar.kume).filter((k) => k.risk >= 7);
console.log(`dar kapsamda dis taraf sayilan ${disTaraf(dar.kume).length} kalemin ` +
  `${dis.length} tanesinin risk puani 7 ve uzeri: ${dis.map((k) => k.ad).join(", ")}`);
console.log(`genis kapsamda kalan uygunsuzluk ${genis.kalan}; belgenin verilmesi icin ` +
  `duzeltme kapasitesinin ${Math.ceil(genis.bulgu - ESIK / ORNEK)} olmasi gerekirdi ` +
  `(su an ${DUZELTME})`);
```

```
100 kontrol maddesi, 23 kalem, toplam risk 150; duzeltme kapasitesi 20 uygunsuzluk/tur (kurgu)

kapsam    uygulanan  ic bulgu  duzeltilen   kalan  dis orneklem  yakalanan     belge
dar              75        22          20       2            30          1   verilir
orta             82        24          20       4            33          2   verilir
genis           100        30          20      10            40          4       yok

kapsam     kapsanan   disarida      gun  gun / risk disarida kalem  dis taraf
dar              36        114        8       0.222             18         15
orta             73         77       11       0.151             13         11
genis           150          0       19       0.127              0          0

mutlak maliyet sirasi : dar < orta < genis
birim risk basina sira: genis < orta < dar

dar kapsam 11 denetim gunu ve 8 ic bulgu tasarruf ediyor; karsiliginda 114 risk puani ve 25 kontrol maddesi belgenin disinda kaliyor
dar kapsamda dis taraf sayilan 15 kalemin 8 tanesinin risk puani 7 ve uzeri: toplayici-servis, saha-sayac-agi, kimlik-saglayici, yonetici-atlama-konagi, dizin-servisi, gunluk-toplama-hatti, bakim-tedarikcisi-erisimi, bulut-tedarikcisi-hesabi
genis kapsamda kalan uygunsuzluk 10; belgenin verilmesi icin duzeltme kapasitesinin 25 olmasi gerekirdi (su an 20)
```

Birinci tablo döngünün en sert sonucunu veriyor: **kapsamı genişletmek belgeyi kaybettiriyor.** Dar
ve orta kapsamda düzeltme kapasitesi iç bulguları yutuyor, geriye iki ve dört uygunsuzluk kalıyor,
dış denetimin örneklemi bunların birini ve ikisini görüyor, eşik aşılmıyor ve belge veriliyor. Geniş
kapsamda iç bulgu 30'a çıkıyor, kapasite yine 20, kalan 10, örneklemde dört uygunsuzluk görünüyor ve
belge verilmiyor. Son satır bunu kapasiteye çeviriyor: geniş kapsamın belge alması için düzeltme
kapasitesinin 20 değil 25 olması gerekirdi.

Bu, uyum çalışmasının en yanlış anlaşılan yerini açıklıyor. Kapsamı daraltmak bir hile değil,
kapasitenin yetmediği yerde **belgeyi alabilmenin tek yolu**dur; kurum aynı kapasiteyle daha çok
kalem denetlemeyi seçtiğinde uygunsuzluk sayısı büyür ve karar tersine döner. Belge, güvenliğin
düzeyini değil, **kapsam ile düzeltme kapasitesi arasındaki oranı** ölçer. Aynı kurum, hiçbir
kontrolünü değiştirmeden, yalnız kapsam cümlesini kısaltarak belgeli hâle gelir.

İkinci tablo kursun sıralama eksenini bu karara bağlıyor. Mutlak maliyet sırası dar, orta, geniş
biçimindedir — dar kapsam 8, geniş kapsam 19 gün tutuyor. Birim risk başına maliyet sırası ise tam
tersidir: dar kapsam kapsadığı risk puanı başına 0,222 gün, geniş kapsam 0,127 gün harcıyor. Nedeni
denetimin sabit yükündedir; kapsam küçüldükçe sabit yük daha az riske bölünür. **En ucuz belge,
kapsadığı risk birimi başına en pahalı belgedir.** Aynı veriden iki sıralama çıkıyor ve ikisi de
doğru; hangisinin kullanılacağı, sorunun "bu belge kaça mal olur" mu yoksa "bu para ne kadar riski
denetim altına alır" mı olduğuna bağlıdır.

#### Özet

- Belgelendirilebilir yönetim sistemi dört adımlı bir döngüdür — kapsam bildirimi, uygulanabilirlik
  bildirimi, iç denetim, dış belgelendirme — ve kararı kurum dışı bir taraf verir; ama kapsamı kurum
  seçer.
- Kontrol maddeleri kalem sayısıyla değil özellik çeşitliliğiyle ölçeklenir: dar kapsam envanterin
  yüzde 22'sini alıyor ama 100 maddenin 75'ini uyguluyor. "Yüz maddenin yetmiş beşi" cümlesi geniş
  kapsam izlenimi verir.
- Dar kapsamın bedeli üç sayıdır: 25 kontrol maddesi uygulama dışı, toplam riskin yüzde 76'sı
  belgenin dışında, 15 kalem dış taraf — bunların sekizinin risk puanı 7 ve üzeridir.
- Belge kararını kapsam ile düzeltme kapasitesi arasındaki oran belirliyor: 20 uygunsuzluk/tur
  kapasiteyle dar ve orta kapsam belge alıyor, geniş kapsam alamıyor; alması için kapasitenin 25
  olması gerekirdi.
- Mutlak maliyet sırası (dar, orta, geniş) ile birim risk başına maliyet sırası (geniş, orta, dar)
  tam ters çıkıyor: en ucuz belge, kapsadığı risk birimi başına en pahalı belgedir.

#### Sonraki Adım

İki ders iki ölçü kurdu: olgunluk düzeyi kontrolün ne kadar kurumsallaştığını, kapsam bildirimi
denetimin nereye kadar uzandığını söylüyor. İkisi de kontrolün **kendisi** hakkındadır. Belgeyi ya
da olgunluk raporunu okuyan tarafın sorduğu soru ise başkadır: benim gereksinimim şu — bunu hangi
kontrol karşılıyor ve karşıladığını gösteren kalem nerede.

Bu soru bire bir bir eşleme değildir. Bir kontrol birden çok gereksinimi karşılayabilir, bir
gereksinim birden çok kontrol ister ve bazı gereksinimler hiçbir kontrole bağlanmaz. Sonraki ders
konunun en önemli parçasıdır: kontrol ile gereksinim arasındaki matrisi koşturur, hiçbir kontrolle
karşılanmayan gereksinimi ve karşılanmış görünüp kanıtı olmayan gereksinimi ayırır, bir kontrolü
kanıtlamanın kaç kalem üretmeyi gerektirdiğini sayar.

### Denetim Kontrol Kümeleri

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/denetim-kontrol-kumeleri

Kontrol ile gereksinim arasındaki matrisin koşturulması: 28 kontrol, 25 gereksinim ve 33 bağda gereksinimlerin yalnız 19'unun işletim kanıtı taşıması, 2'sinin hiçbir kontrole eşlenmemesi, 2'sinin eşlenip hiç kanıt üretmemesi ve 2'sinin yalnız sağlayıcı beyanına dayanması, 13 gereksinimin tek işletim kontrolüyle ayakta durması, dönemde üretilen 3.205 kanıt kaleminin yüzde 12,3'ünün incelenmesi ve kontrol sayısıyla kanıt yükü sıralamalarının ilk beşte yalnız üç ortak üye taşıması.

Önceki iki ders kontrolün kendisini ölçtü: ne kadar kurumsallaştığını ve denetimin nereye kadar
uzandığını. Belgeyi okuyan tarafın sorusu ise başkadır — kendi gereksinimini getirir ve onu hangi
kontrolün karşıladığını sorar. Bu soruya yanıt veren yapı **denetim kontrol kümesi**dir: güven
ilkelerine göre gruplanmış, **belirli bir dönem boyunca** işlediği kanıtlanan bir kontrol seti.

Buradaki "belirli bir dönem boyunca" ifadesi bu ders için belirleyicidir. Bir kontrolün **tasarım**
olarak var olduğunu göstermek bir belgeyle olur; **işlediğini** göstermek ancak dönem boyunca
üretilmiş kayıtların örneklenmesiyle olur. M23/K05'te kiralanan katmanda kanıtın kimden geldiği
sayılmıştı; o ayrım burada girdidir. Sağlayıcının belgesi tasarımı gösterir, dönem boyunca
işlediğini göstermez — ve bu, bir gereksinimi "karşılanmış" saymaya yetmeyebilir.

- **CE14.** Kontrol kümesi 28 kalemdir ve beş güven ilkesine bölünmüştür: güvenlik,
  erişilebilirlik, işleme bütünlüğü, gizlilik, mahremiyet. Küme ve sayılar **kurgudur**.
- **CE15.** Her kontrolün bir **kanıt kaynağı** vardır: kendi kaydı, sağlayıcı belgesi ya da hiçbiri.
- **CE16.** Her kontrol bir dönemde belirli sayıda **kanıt kalemi** üretir; sıfır üreten kontrol
  denetimde örneklenemez.
- **CE17.** Gereksinim kümesi 25 kalemdir; her gereksinim sıfır ya da daha çok kontrole eşlenir.
  Eşleme **iddiadır**, kanıt değildir.
- **CE18.** Bir gereksinimin durumu dörde ayrılır: en az bir işletim kanıtı taşıyan kontrolü varsa
  **işletim kanıtı**; yalnız sağlayıcı belgesine dayanıyorsa **yalnız beyan**; eşlendiği kontroller
  hiç kanıt üretmiyorsa **kanıtsız**; hiç kontrolü yoksa **eşlenmemiş**.
- **CE19.** Paylaşılan bir kontrolün kanıt yükü, karşıladığı gereksinimlere eşit bölünür.
- **CE20.** Denetçi bir kontrolden en çok 25 kalem inceler ve kalem başına 0,25 kişi-saat derleme
  harcar (kurgu).

```js
// matris/eslem.mjs — denetim kontrol kumesinde kontrol-gereksinim matrisi.
// MODELDIR: bolgesel olcum agi (kurgu); kontroller, gereksinimler ve kanit sayilari kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

// kod | guven ilkesi | kanit kaynagi (kendi|saglayici|yok) | donemde uretilen kanit kalemi
export const KONTROL = Object.fromEntries(satir(`
  K01|guvenlik|kendi|240
  K02|guvenlik|kendi|180
  K03|guvenlik|kendi|60
  K04|guvenlik|kendi|48
  K05|guvenlik|kendi|365
  K06|guvenlik|kendi|52
  K07|guvenlik|kendi|12
  K08|guvenlik|saglayici|1
  K09|guvenlik|saglayici|1
  K10|guvenlik|kendi|4
  K11|guvenlik|kendi|3
  K12|guvenlik|kendi|2
  K13|erisilebilirlik|kendi|365
  K14|erisilebilirlik|kendi|4
  K15|erisilebilirlik|kendi|365
  K16|erisilebilirlik|saglayici|1
  K17|erisilebilirlik|kendi|1
  K18|isleme-butunlugu|kendi|365
  K19|isleme-butunlugu|kendi|12
  K20|isleme-butunlugu|kendi|52
  K21|isleme-butunlugu|kendi|310
  K22|gizlilik|kendi|1
  K23|gizlilik|kendi|365
  K24|gizlilik|kendi|365
  K25|gizlilik|saglayici|1
  K26|mahremiyet|yok|0
  K27|mahremiyet|kendi|30
  K28|mahremiyet|yok|0`)
  .map(([kod, ilke, kaynak, kalem]) => [kod, { kod, ilke, kaynak, kalem: +kalem }]));

// gereksinim | onu karsiladigi ileri surulen kontroller
export const GEREKSINIM = satir(`
  G01 yetkisiz erisimin engellenmesi|K01 K03 K04
  G02 ayricalikli islemin izlenmesi|K01 K02
  G03 personel degisiminin yansitilmasi|K04
  G04 uc nokta korumasinin surekliligi|K05 K06
  G05 acigin makul surede kapatilmasi|K06
  G06 ag sinir kurallarinin gozden gecirilmesi|K07
  G07 fiziksel erisimin denetlenmesi|K08
  G08 donanimin guvenli imhasi|K09
  G09 personelin bilinclendirilmesi|K10
  G10 tedarikcinin degerlendirilmesi|K11
  G11 olaya hazirlikli olma|K12
  G12 verinin kaybolmamasi|K13 K14
  G13 hizmetin kesintisiz surmesi|K15 K16
  G14 kesintiden sonra ayaga kalkma|K14 K17
  G15 girdinin dogrulanmasi|K18
  G16 islemin eksiksizligi|K19 K20
  G17 degisikligin yetkilendirilmesi|K21
  G18 verinin siniflandirilmasi|K22
  G19 saklama suresine uyulmasi|K23
  G20 verinin sifrelenmesi|K24 K25
  G21 verinin nereye aktigi|K26
  G22 silme talebinin karsilanmasi|K26 K27
  G23 islemenin dayanagi|K28
  G24 alt yuklenici zincirinin gorunurlugu|
  G25 kayitlarin degistirilemezligi|`)
  .map(([ad, k]) => ({ ad, kod: ad.split(" ")[0], kontrol: k ? k.split(" ") : [] }));

export const ILKE = ["guvenlik", "erisilebilirlik", "isleme-butunlugu", "gizlilik", "mahremiyet"];
// Isletim kaniti: bir donem boyunca kendi kaydindan uretilen kalem. Saglayici belgesi
// tasarimi gosterir, donem boyunca isledigini gostermez (model varsayimi).
export const isletim = (k) => KONTROL[k].kaynak === "kendi" && KONTROL[k].kalem > 0;
export const durum = (g) => !g.kontrol.length ? "eslenmemis"
  : g.kontrol.some(isletim) ? "isletim kaniti"
  : g.kontrol.some((k) => KONTROL[k].kaynak === "saglayici") ? "yalniz beyan" : "kanitsiz";

if (import.meta.url === `file://${process.argv[1]}`) {
  const bag = GEREKSINIM.reduce((a, g) => a + g.kontrol.length, 0);
  console.log(`model: ${Object.keys(KONTROL).length} kontrol, ${GEREKSINIM.length} gereksinim, ` +
    `${bag} bag, ${ILKE.length} guven ilkesi`);

  const y = gen([18, 9, 11, 20, 16, 14]);
  console.log("\n" + y("guven ilkesi", "kontrol", "isletimli", "karsiladigi gerek.",
    "donem kalemi", "kalem/gerek."));
  for (const i of ILKE) {
    const kume = Object.values(KONTROL).filter((k) => k.ilke === i);
    const kodlar = kume.map((k) => k.kod);
    const gerek = GEREKSINIM.filter((g) => g.kontrol.some((k) => kodlar.includes(k)));
    const kalem = kume.reduce((a, k) => a + k.kalem, 0);
    console.log(y(i, kume.length, kume.filter((k) => isletim(k.kod)).length, gerek.length,
      kalem, gerek.length ? (kalem / gerek.length).toFixed(1) : "-"));
  }

  const z = gen([18, 12, 12, 12]);
  const DURUM = ["isletim kaniti", "yalniz beyan", "kanitsiz", "eslenmemis"];
  console.log("\n" + z("gereksinim durumu", "sayi", "yuzde", "kontrol"));
  for (const d of DURUM) {
    const k = GEREKSINIM.filter((g) => durum(g) === d);
    console.log(z(d, k.length, (100 * k.length / GEREKSINIM.length).toFixed(0),
      k.reduce((a, g) => a + g.kontrol.length, 0)));
  }
  for (const d of DURUM.slice(1)) {
    console.log(`${d}: ${GEREKSINIM.filter((g) => durum(g) === d)
      .map((g) => g.kod).join(", ")}`);
  }

  // Kaldirac: bir kontrol kac gereksinimi karsiliyor.
  const kaldirac = Object.values(KONTROL).map((k) =>
    ({ ...k, g: GEREKSINIM.filter((x) => x.kontrol.includes(k.kod)).length }));
  const cok = kaldirac.filter((k) => k.g > 1), tek = kaldirac.filter((k) => k.g === 1);
  console.log(`\nbirden cok gereksinimi karsilayan kontrol ${cok.length}/${kaldirac.length}: ` +
    `${cok.map((k) => `${k.kod} (${k.g})`).join(", ")}`);
  console.log(`tek gereksinim tasiyan kontrol ${tek.length}; hicbir gereksinime baglanmayan ` +
    `${kaldirac.filter((k) => k.g === 0).length}`);
  const toplam = Object.values(KONTROL).reduce((a, k) => a + k.kalem, 0);
  console.log(`donemde uretilen kanit kalemi ${toplam}; kontrol basina ` +
    `${(toplam / kaldirac.length).toFixed(1)}, karsilanan gereksinim basina ` +
    `${(toplam / GEREKSINIM.filter((g) => durum(g) === "isletim kaniti").length).toFixed(1)}`);
}
```

```
model: 28 kontrol, 25 gereksinim, 33 bag, 5 guven ilkesi

guven ilkesi        kontrol  isletimli  karsiladigi gerek.    donem kalemi  kalem/gerek.
guvenlik                 12         10                  11             968          88.0
erisilebilirlik           5          4                   3             736         245.3
isleme-butunlugu          4          4                   3             739         246.3
gizlilik                  4          3                   3             732         244.0
mahremiyet                3          1                   3              30          10.0

gereksinim durumu         sayi       yuzde     kontrol
isletim kaniti              19          76          29
yalniz beyan                 2           8           2
kanitsiz                     2           8           2
eslenmemis                   2           8           0
yalniz beyan: G07, G08
kanitsiz: G21, G23
eslenmemis: G24, G25

birden cok gereksinimi karsilayan kontrol 5/28: K01 (2), K04 (2), K06 (2), K14 (2), K26 (2)
tek gereksinim tasiyan kontrol 23; hicbir gereksinime baglanmayan 0
donemde uretilen kanit kalemi 3205; kontrol basina 114.5, karsilanan gereksinim basina 168.7
```

İkinci tablo dersin ana sonucudur. Yirmi beş gereksinimin yalnız **on dokuzu** bir dönem boyunca
işlediği kanıtlanabilir durumdadır; kalan altısı üç ayrı nedenle kanıtsızdır ve bu üç neden
birbirine hiç benzemez. G24 ve G25 **eşlenmemiştir**: matriste satırları vardır, hücreleri boştur —
kimse bir kontrol önermemiştir. G21 ve G23 eşlenmiştir ama eşlendikleri kontroller hiç kanıt kalemi
üretmiyor; matriste dolu görünürler ve denetimde çıplak kalırlar. G07 ve G08 ise sağlayıcı belgesine
dayanıyor: tasarımı gösterilebilir, dönem boyunca işlediği gösterilemez.

Bu üçlü ayrım, matrisi "kaç hücre dolu" diye okumanın neden yanıltıcı olduğunu söylüyor. Otuz üç
bağın üçü — G21 ile G22'nin K26 bağı ve G23'ün K28 bağı — hiçbir kanıt üretmiyor. Doluluk oranına
bakılırsa yirmi beş gereksinimin yirmi üçü eşlenmiştir (yüzde 92); işletim kanıtına bakılırsa on
dokuzu karşılanmıştır (yüzde 76). **Eşleme bir iddiadır; onu kanıta çeviren kalem ayrı sayılmalıdır.**

Kaldıraç satırı ikinci gözlemi veriyor: yirmi sekiz kontrolün yalnız beşi birden çok gereksinimi
karşılıyor, yirmi üçü tek gereksinim taşıyor. Kaldıraçlı kontroller kanıt üretiminde ölçek
kazandırır — K01 tek başına iki gereksinime yetiyor. Ama beşinci kaldıraçlı kontrol K26'dır ve hiç
kanıt üretmez: karşıladığı iki gereksinimden birini (G21) **kanıtsız** bırakır, ötekini (G22)
yedek kontrolü K27 kurtarır. Kaldıraç, kontrolün işlemesi koşuluyla
değerlidir; işlemeyen bir kaldıraçlı kontrol hatanın yayılma çarpanıdır.

#### Kanıt Yükü ve Kritik Kontrol

```js
// matris/kanit.mjs — matristen kanit yuku, kritik kontrol ve iki siralama cikarilir.
import { KONTROL, GEREKSINIM, ILKE, isletim, durum, gen } from "./eslem.mjs";

const ORNEK_UST = 25;    // denetci bir kontrolden en cok 25 kalem inceler (kurgu)
const DERLEME = 0.25;    // incelenen kalem basina 0,25 kisi-saat derleme (kurgu)

// Bir kontrol duserse hangi gereksinimler isletim kanitini yitirir
const dususEtkisi = (kod) => GEREKSINIM.filter((g) => durum(g) === "isletim kaniti" &&
  g.kontrol.filter(isletim).every((k) => k === kod));
const kritik = Object.keys(KONTROL).map((k) => ({ k, g: dususEtkisi(k) }))
  .filter((x) => x.g.length > 0);

// Paylasilan kontrolun kanit yuku, karsiladigi gereksinimlere bolunur.
const gerekSay = (kod) => GEREKSINIM.filter((g) => g.kontrol.includes(kod)).length || 1;
const yuk = (g) => g.kontrol.filter(isletim).reduce((a, k) => a + KONTROL[k].kalem / gerekSay(k), 0);
const TOPLAM = GEREKSINIM.reduce((a, g) => a + yuk(g), 0);

const y = gen([40, 10, 12, 12, 10]);
console.log(`${GEREKSINIM.length} gereksinim, toplam kanit yuku ${TOPLAM.toFixed(0)} kalem/donem`);
console.log("\n" + y("en yuksek kanit yuku tasiyan gereksinim", "kontrol", "kalem", "pay %",
  "birikim %"));
let birikim = 0;
for (const g of [...GEREKSINIM].sort((a, b) => yuk(b) - yuk(a)).slice(0, 5)) {
  birikim += 100 * yuk(g) / TOPLAM;
  console.log(y(g.ad, g.kontrol.length, yuk(g).toFixed(0),
    (100 * yuk(g) / TOPLAM).toFixed(1), birikim.toFixed(1)));
}
const sifir = GEREKSINIM.filter((g) => yuk(g) === 0);
console.log(`\nhic kanit yuku uretmeyen gereksinim ${sifir.length}: ` +
  `${sifir.map((g) => g.kod).join(", ")}`);

// Iki siralama: kontrol sayisina gore ve kanit yukune gore
const sK = [...GEREKSINIM].sort((a, b) => b.kontrol.length - a.kontrol.length ||
  a.kod.localeCompare(b.kod)).map((g) => g.kod);
const sY = [...GEREKSINIM].sort((a, b) => yuk(b) - yuk(a) || a.kod.localeCompare(b.kod))
  .map((g) => g.kod);
const ortak = sY.slice(0, 5).filter((k) => sK.slice(0, 5).includes(k));
console.log(`kontrol sayisina gore ilk bes: ${sK.slice(0, 5).join(", ")}`);
console.log(`kanit yukune gore ilk bes  : ${sY.slice(0, 5).join(", ")}`);
console.log(`ortak: ${ortak.length}/5`);

// Kritik kontrol ve denetci is yuku
console.log(`\nduserse en az bir gereksinimi kanitsiz birakan kontrol ${kritik.length}/` +
  `${Object.keys(KONTROL).length}; ${kritik.filter((x) => gerekSay(x.k) === 1).length} tanesi ` +
  `zaten tek gereksinim tasiyan kontrollerdir`);
const tekDayanak = GEREKSINIM.filter((g) => g.kontrol.filter(isletim).length === 1);
console.log(`tek isletim kontroluyle ayakta duran gereksinim ${tekDayanak.length}/` +
  `${GEREKSINIM.length}: ${tekDayanak.map((g) => g.kod).join(", ")}`);

const z = gen([18, 12, 13, 13, 14]);
console.log("\n" + z("guven ilkesi", "uretilen", "incelenen", "inceleme %", "kisi-saat"));
for (const i of ILKE) {
  const kume = Object.values(KONTROL).filter((k) => k.ilke === i);
  const ure = kume.reduce((a, k) => a + k.kalem, 0);
  const inc = kume.reduce((a, k) => a + Math.min(ORNEK_UST, k.kalem), 0);
  console.log(z(i, ure, inc, ure ? (100 * inc / ure).toFixed(1) : "-",
    (inc * DERLEME).toFixed(1)));
}
const ure = Object.values(KONTROL).reduce((a, k) => a + k.kalem, 0);
const inc = Object.values(KONTROL).reduce((a, k) => a + Math.min(ORNEK_UST, k.kalem), 0);
console.log(`toplam: ${ure} kalem uretiliyor, ${inc} kalem inceleniyor (%` +
  `${(100 * inc / ure).toFixed(1)}), ${(inc * DERLEME).toFixed(1)} kisi-saat derleme`);
```

```
25 gereksinim, toplam kanit yuku 3201 kalem/donem

en yuksek kanit yuku tasiyan gereksinim    kontrol       kalem       pay % birikim %
G04 uc nokta korumasinin surekliligi             2         391        12.2      12.2
G12 verinin kaybolmamasi                         2         367        11.5      23.7
G13 hizmetin kesintisiz surmesi                  2         365        11.4      35.1
G15 girdinin dogrulanmasi                        1         365        11.4      46.5
G19 saklama suresine uyulmasi                    1         365        11.4      57.9

hic kanit yuku uretmeyen gereksinim 6: G07, G08, G21, G23, G24, G25
kontrol sayisina gore ilk bes: G01, G02, G04, G12, G13
kanit yukune gore ilk bes  : G04, G12, G13, G15, G19
ortak: 3/5

duserse en az bir gereksinimi kanitsiz birakan kontrol 13/28; 11 tanesi zaten tek gereksinim tasiyan kontrollerdir
tek isletim kontroluyle ayakta duran gereksinim 13/25: G03, G05, G06, G09, G10, G11, G13, G15, G17, G18, G19, G20, G22

guven ilkesi          uretilen    incelenen   inceleme %     kisi-saat
guvenlik                   968          173         17.9          43.3
erisilebilirlik            736           56          7.6          14.0
isleme-butunlugu           739           87         11.8          21.8
gizlilik                   732           52          7.1          13.0
mahremiyet                  30           25         83.3           6.3
toplam: 3205 kalem uretiliyor, 393 kalem inceleniyor (%12.3), 98.3 kisi-saat derleme
```

Kanıt yükü beş gereksinimde yoğunlaşıyor: yirmi beş gereksinimin beşi toplam yükün yüzde 57,9'unu
taşıyor. Ortak yanları, günlük çalışan bir kontrole bağlı olmalarıdır — uç nokta durumu, yedek
alma, kapasite izleme, girdi doğrulama ve yaşam döngüsü koşumu yılda 365 kalem üretir. Buna karşılık
hiç yük üretmeyen altı gereksinim, yukarıdaki altı kanıtsız gereksinimin tam olarak kendisidir.
**Kanıt yükü sıfır olan gereksinim ucuz değildir; karşılanmamıştır.** Bir uyum bütçesi yalnız üretilen
kalem sayısına bakarak dağıtılırsa, bu altı satır hiç görünmez.

İki sıralamanın ilk beşi yalnız üç üyede örtüşüyor. Kontrol sayısına göre sıralamak G01 ve G02'yi
öne alır — üç ve iki kontrolle en çok "kapsanmış" görünen gereksinimlerdir. Kanıt yüküne göre
sıralamak ise G15 ve G19'u öne alır; ikisinin de tek kontrolü vardır, ama o tek kontrol dönemde 365
kalem üretir. Kontrol sayısı bir **kapsama** ölçüsüdür, kanıt yükü bir **maliyet** ölçüsüdür ve
ikisi aynı listeyi farklı dizer.

Kritik kontrol sayısı üçüncü sonucu veriyor: yirmi sekiz kontrolün on üçü düşerse en az bir
gereksinim kanıtsız kalır ve bunların on biri zaten tek gereksinim taşıyan kontrollerdir. Yani
kırılganlık, kaldıraçlı kontrollerde değil, **yedeksiz** kontrollerde toplanmıştır: on üç gereksinim
tek bir işletim kontrolünün üzerinde durur. Kaldıraçlı bir kontrolü kaybetmek genellikle bir
gereksinimi düşürmez, çünkü yanında başka kontrol vardır.

Son tablo denetimin iş yükünü veriyor. Dönemde 3.205 kanıt kalemi üretiliyor, denetçi bunların
yüzde 12,3'ünü — 393 kalemini — inceliyor ve 98,3 kişi-saat derleme gerektiriyor. Örneklem üst
sınırı yüzünden yüksek hacimli kontroller oransal olarak daha az inceleniyor: erişilebilirlikte
oran yüzde 7,6, mahremiyette yüzde 83,3. Bu, kanıt üretmenin asıl bedelinin **denetlenmek**
olmadığını gösteriyor — üretilen 3.205 kalemin 2.812'si hiç okunmadan saklanır, ama gerektiğinde
gösterilebilir olması için yine de üretilmek ve saklanmak zorundadır.

#### Özet

- Denetim kontrol kümesi tasarımı değil, bir dönem boyunca işlemeyi kanıtlar; sağlayıcı belgesi
  tasarımı gösterir, dönem boyunca işlediğini göstermez.
- Yirmi beş gereksinimin on dokuzu işletim kanıtı taşıyor; kalan altısı üç ayrı nedenle kanıtsız:
  ikisi hiç eşlenmemiş, ikisi eşlenip hiç kanıt üretmiyor, ikisi yalnız beyana dayanıyor.
- Doluluk oranı yüzde 92, işletim kanıtı oranı yüzde 76'dır: eşleme bir iddiadır ve onu kanıta
  çeviren kalem ayrı sayılmalıdır.
- Yirmi sekiz kontrolün beşi birden çok gereksinimi karşılıyor; ama biri hiç kanıt üretmediği için
  bağlı olduğu iki gereksinimden birini kanıtsız bırakıyor — kaldıraç ancak kontrol işliyorsa
  değerlidir.
- Kırılganlık yedeksiz kontrollerdedir: on üç kontrol düşerse bir gereksinim kanıtsız kalır ve on üç
  gereksinim tek işletim kontrolünün üzerinde durur.
- Kanıt yükünün yüzde 57,9'u beş gereksinimde toplanıyor; hiç yük üretmeyen altı gereksinim ise tam
  olarak kanıtsız olanlardır. Dönemde 3.205 kalem üretiliyor, yüzde 12,3'ü inceleniyor.

#### Sonraki Adım

Bu dersin matrisi gereksinimleri kaynaklarından bağımsız aldı: her satır bir cümleydi ve nereden
geldiği sorulmadı. Gereksinimlerin bir bölümü ise kurumun ne yaptığından değil, **hangi veriye
dokunduğundan** doğar. Ödeme kartı verisini işleyen bir sistem, sağlık verisini tutan bir sistem ve
kişisel veriyi saklayan bir sistem, başka hiçbir farkları olmasa bile farklı kontrol listeleri
taşır.

Sonraki ders gereksinimi veri türüne bağlar: her tür kaç ek kontrol getiriyor, aynı sistemde iki tür
birden bulunduğunda listeler nasıl birikiyor ve kapsamı daraltmanın en sert biçimi — veriyi hiç
tutmamak — kaç kontrolü ortadan kaldırıyor. Ortadan kaldırılamayan kalan kontroller de sayılacak.

### Sektörel Uyumluluk Gereksinimleri

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/sektorel-uyumluluk-gereksinimleri

Uyumluluk gereksinimlerinin veri türüne bağlanması ve kapsam daraltmanın kontrol tarafındaki karşılığı: 16 sistem ve 4 veri türünde tür başına ek kontrollerin ayrı ayrı toplandığında 29, birleşimde 20 çıkması, 9 çok türlü sistemin 129 kontrol yükü taşıması, bir türü bütün sistemlerden kaldırmanın 4 ve 3 kontrol düşürmesine karşılık kısmen kaldırmanın hiç kontrol düşürmemesi, artık kontrollerin geri gelmesi ve üç ayrı ölçünün dört eylemi üç farklı sırayla dizmesi.

Önceki dersin matrisi gereksinimleri kaynaklarından bağımsız aldı: her satır bir cümleydi. Oysa bir
gereksinim listesinin uzunluğunu belirleyen şey çoğu zaman kurumun ne yaptığı değil, **hangi veriye
dokunduğudur**. Aynı mimariyi taşıyan iki sistemden biri ödeme kartı verisi işliyorsa, öteki
işlemiyorsa, ikisinin kontrol listesi eşit olmaz.

Bu ders gereksinimi veri türüne bağlar. Türler burada **veri türü olarak** anılır — ödeme kartı
verisi, sağlık verisi, kişisel veri, ölçüm verisi — ve hiçbir düzenleme, kurum ya da sektör birliği
adı yazılmaz. Ölçülecek üç şey vardır: bir tür kaç ek kontrol getiriyor, aynı sistemde iki tür
birden bulunduğunda listeler nasıl birikiyor ve kapsamı daraltmanın en sert biçimi — veriyi hiç
tutmamak — kaç kontrolü gerçekten ortadan kaldırıyor.

- **CE21.** Envanter kurgu **bölgesel ölçüm ağı**ndan alınmış 16 sistemdir. Sistemler, veri türleri
  ve kontrol sayıları **kurgudur**.
- **CE22.** Dört veri türü vardır ve her tür bir ek kontrol kümesi getirir. Kümeler kesişir: bir
  kontrol birden çok türde geçebilir.
- **CE23.** Bir sistemin kontrol listesi, taşıdığı türlerin kontrol kümelerinin **birleşimidir**;
  aynı kontrol iki türden geliyorsa bir kez sayılır.
- **CE24.** Her kontrol dönemde belirli sayıda kanıt kalemi üretir ve bunu **her sistem için ayrı**
  üretir; toplam kanıt hacmi sistem-kontrol çiftleri üzerinden toplanır.
- **CE25.** Bir kontrol ancak taşıyan **hiçbir sistem kalmadığında** ortadan kalkar. Türü bazı
  sistemlerden kaldırmak kontrol listesini kısaltmaz.
- **CE26.** Veriyi kaldırmanın **artık kontrolü** olabilir: veriyi dışarı taşıyan sınırın kendisi
  ya da devredilen tarafın değerlendirilmesi yeni bir kontrol olarak geri gelir.

```js
// sektor/veri.mjs — sektorel uyumluluk gereksinimleri veri turune baglanir.
// MODELDIR: bolgesel olcum agi (kurgu); sistemler, kontroller ve sayilar kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

// kod | kontrol | donemde uretilen kanit kalemi
export const KONTROL = Object.fromEntries(satir(`
  C01|beklemede sifreleme|365
  C02|aktarimda sifreleme|365
  C03|ag bolutleme|12
  C04|belirtec sinirinin dogrulanmasi|52
  C05|erisim kaydi|365
  C06|ayricalikli erisim onayi|48
  C07|saklama suresi kosumu|365
  C08|silme istegi akisi|30
  C09|veri envanteri tazeleme|4
  C10|veri akis haritasi|2
  C11|riza kaydi|120
  C12|amac sinirlama incelemesi|4
  C13|ozel nitelikli veriye ek erisim onayi|24
  C14|personel gizlilik taahhudu|1
  C15|ek farkindalik egitimi|2
  C16|saticinin degerlendirilmesi|3
  C17|donemsel sizma testi|1
  C18|gunluk butunlugu|365
  C19|olcum dogrulugu mutabakati|12
  C20|test verisi maskeleme|12`)
  .map(([kod, ad, kalem]) => [kod, { kod, ad, kalem: +kalem }]));

// Veri turu | o turun getirdigi ek kontroller. Duzenleme adi yazilmaz; tur adi yazilir.
export const TUR = Object.fromEntries(satir(`
  odeme-karti|C01 C02 C03 C04 C05 C06 C16 C17 C20
  saglik|C01 C05 C07 C11 C12 C13 C14 C15
  kisisel|C01 C02 C05 C07 C08 C09 C10 C11 C12
  olcum|C05 C18 C19`).map(([t, k]) => [t, k.split(" ")]));

// sistem | tasidigi veri turleri
export const SISTEM = satir(`
  fatura-uygulamasi|odeme-karti kisisel
  fatura-veritabani|odeme-karti kisisel
  odeme-gecidi-baglantisi|odeme-karti
  abone-portali|kisisel
  cagri-merkezi-kaydi|kisisel saglik
  saha-ekip-uygulamasi|kisisel saglik
  is-sagligi-kaydi|saglik
  toplayici-servis|olcum
  dogrulayici-servis|olcum
  saha-sayac-agi|olcum
  raporlama-ambari|odeme-karti kisisel olcum
  yedek-deposu|odeme-karti kisisel saglik olcum
  gunluk-toplama-hatti|kisisel olcum
  kimlik-saglayici|kisisel
  arsiv-deposu|kisisel saglik
  test-ortami|odeme-karti kisisel`).map(([ad, t]) => ({ ad, tur: t.split(" ") }));

export const kontrolleri = (turler) => new Set(turler.flatMap((t) => TUR[t]));
export const gereken = (sistemler) =>
  kontrolleri([...new Set(sistemler.flatMap((s) => s.tur))]);

if (import.meta.url === `file://${process.argv[1]}`) {
  const turAd = Object.keys(TUR);
  console.log(`model: ${SISTEM.length} sistem, ${turAd.length} veri turu, ` +
    `${Object.keys(KONTROL).length} kontrol`);

  const y = gen([13, 9, 11, 10, 12, 14]);
  console.log("\n" + y("veri turu", "sistem", "ek kontrol", "ozgun", "paylasilan", "kanit kalemi"));
  for (const t of turAd) {
    const s = SISTEM.filter((x) => x.tur.includes(t));
    const ozgun = TUR[t].filter((k) => !turAd.some((o) => o !== t && TUR[o].includes(k)));
    console.log(y(t, s.length, TUR[t].length, ozgun.length, TUR[t].length - ozgun.length,
      TUR[t].reduce((a, k) => a + KONTROL[k].kalem, 0)));
  }
  const topla = turAd.reduce((a, t) => a + TUR[t].length, 0);
  const birlesim = gereken(SISTEM);
  console.log(`\ntur basina kontroller ayri ayri toplandiginda ${topla}; birlesim ` +
    `${birlesim.size} — ${topla - birlesim.size} kontrol birden cok turde tekrar ediyor`);

  const z = gen([25, 8, 11, 14, 12]);
  console.log("\n" + z("en yuklu sistem", "tur", "kontrol", "kanit kalemi", "tek turde"));
  const yuklu = [...SISTEM].sort((a, b) => kontrolleri(b.tur).size - kontrolleri(a.tur).size ||
    b.tur.length - a.tur.length).slice(0, 4);
  for (const s of yuklu) {
    const k = [...kontrolleri(s.tur)];
    const tek = k.filter((x) => s.tur.filter((t) => TUR[t].includes(x)).length === 1).length;
    console.log(z(s.ad, s.tur.length, k.length, k.reduce((a, x) => a + KONTROL[x].kalem, 0), tek));
  }
  const cok = SISTEM.filter((s) => s.tur.length > 1);
  console.log(`\ncok turlu sistem ${cok.length}/${SISTEM.length}; bunlarin kontrol yuku ` +
    `${cok.reduce((a, s) => a + kontrolleri(s.tur).size, 0)} kalem, tek turlu ` +
    `${SISTEM.length - cok.length} sistemin yuku ` +
    `${SISTEM.filter((s) => s.tur.length === 1).reduce((a, s) => a + TUR[s.tur[0]].length, 0)}`);
}
```

```
model: 16 sistem, 4 veri turu, 20 kontrol

veri turu       sistem ek kontrol     ozgun  paylasilan  kanit kalemi
odeme-karti          6          9         6           3          1223
saglik               5          8         3           5          1246
kisisel             11          9         3           6          1620
olcum                6          3         2           1           742

tur basina kontroller ayri ayri toplandiginda 29; birlesim 20 — 9 kontrol birden cok turde tekrar ediyor

en yuklu sistem               tur    kontrol  kanit kalemi   tek turde
yedek-deposu                    4         20          2152          14
raporlama-ambari                3         17          2125          14
fatura-uygulamasi               2         15          1748          12
fatura-veritabani               2         15          1748          12

cok turlu sistem 9/16; bunlarin kontrol yuku 129 kalem, tek turlu 7 sistemin yuku 44
```

İlk tablonun okunacak yeri dördüncü ve beşinci sütunlardır. Ödeme kartı verisi dokuz ek kontrol
getiriyor ve bunların altısı yalnız o türe özgüdür; sağlık verisi sekiz kontrol getiriyor ama yalnız
üçü özgündür, beşi başka türlerle paylaşılır. Bu, uyum çalışmasının en çok yanlış hesaplanan
kalemidir: türler ayrı ayrı toplandığında 29 kontrol çıkıyor, birleşim ise 20'dir. Dokuz kontrol
birden çok türde tekrar ediyor, yani **ikinci veri türünü almanın kontrol maliyeti birincisinden
düşüktür.** Beklemede şifreleme üç türde birden geçer; bir kez kurulup üç yükümlülüğe birden yanıt
verir.

Paylaşımın ters yüzü de sayılmalıdır. Bir kontrol birden çok türden geliyorsa, o kontrolü
gevşetmenin bedeli de birden çok yükümlülüğe yayılır: erişim kaydı dört türün dördünde birden
geçiyor, dolayısıyla tek bir kayıt akışının bozulması dört ayrı gereksinimi aynı anda kanıtsız
bırakır. Önceki dersin kaldıraç ölçüsü burada veri türü tarafından yeniden üretiliyor — ortak
kontrol hem tasarrufun hem kırılganlığın kaynağıdır.

İkinci tablo bu birikimi sistem düzeyinde gösteriyor. Yedek deposu dört türü birden taşıdığı için
yirmi kontrolün **tamamını** üzerine alıyor; envanterdeki hiçbir sistem bu kadar yük taşımıyor ve
yedek deposu kendi başına hiçbir iş yapmıyor — yalnız başka sistemlerin verisini tutuyor. Raporlama
ambarı ve test ortamı da aynı sınıftandır. Veri türü listeleri bu üç yerde birikiyor, çünkü
üçü de veriyi **kaynağından bağımsız** topluyor. Son satır aynı şeyi toplu olarak söylüyor: dokuz
çok türlü sistem 129 kontrol yükü taşırken, yedi tek türlü sistem 44 taşıyor.

#### Veriyi Hiç Tutmamak

Kontrol listesini kısaltmanın en sert yolu veriyi hiç tutmamaktır: türü sistemden çıkarmak, dışarıya
devretmek ya da tanımlayıcıları kaldıracak biçimde toplulaştırmak. Aşağıdaki dosya dört eylemi aynı
envanterde koşturuyor ve her birinin gerçekten kaç kontrolü düşürdüğünü sayıyor.

```js
// sektor/daraltma.mjs — veriyi hic tutmamanin kac kontrolu ortadan kaldirdigi.
import { KONTROL, TUR, SISTEM, kontrolleri, gereken, gen } from "./veri.mjs";

// Bir sistemin donemde urettigi kanit kalemi: tasidigi turlerin kontrolleri
const hacim = (kume) => kume.reduce((a, s) =>
  a + [...kontrolleri(s.tur)].reduce((x, k) => x + KONTROL[k].kalem, 0), 0);

// eylem | kaldirilan veri turu | dokunulan sistemler ("*" = tumu) | artik kontrol | gun
const EYLEM = [
  ["belirtec ve gecidin devri", "odeme-karti", "*", ["C04", "C16"], 30],
  ["saglik kaydinin devri", "saglik", "*", ["C16"], 14],
  ["raporda toplulastirma", "kisisel",
    ["raporlama-ambari", "yedek-deposu", "test-ortami", "arsiv-deposu"], ["C09"], 20],
  ["olcumun sahada ozetlenmesi", "olcum",
    ["raporlama-ambari", "yedek-deposu", "gunluk-toplama-hatti"], [], 10],
];

const ONCE_K = gereken(SISTEM), ONCE_H = hacim(SISTEM);
const uygula = (tur, hedef, artik) => {
  const yeni = SISTEM.map((s) => (hedef === "*" || hedef.includes(s.ad))
    ? { ...s, tur: s.tur.filter((t) => t !== tur) } : s);
  const k = gereken(yeni);
  for (const a of artik) k.add(a);
  return { yeni, k };
};

console.log(`baslangic: ${ONCE_K.size} kontrol, donemde ${ONCE_H.toLocaleString("tr-TR")} ` +
  `kanit kalemi, ${SISTEM.length} sistem`);
const y = gen([28, 10, 10, 9, 14, 7, 12]);
console.log("\n" + y("eylem", "sistem", "kontrol", "kalkan", "kanit kalemi", "gun",
  "kalem / gun"));
const sonuc = [];
for (const [ad, tur, hedef, artik, gun] of EYLEM) {
  const { yeni, k } = uygula(tur, hedef, artik);
  const h = hacim(yeni) + artik.reduce((a, x) => a + KONTROL[x].kalem, 0);
  const dokunulan = SISTEM.filter((s) => (hedef === "*" || hedef.includes(s.ad)) &&
    s.tur.includes(tur)).length;
  sonuc.push({ ad, kalkan: ONCE_K.size - k.size, dusen: ONCE_H - h, gun });
  console.log(y(ad, dokunulan, k.size, ONCE_K.size - k.size, h.toLocaleString("tr-TR"), gun,
    ((ONCE_H - h) / gun).toFixed(0)));
}

const sira = (f) => [...sonuc].sort((a, b) => f(b) - f(a)).map((s) => s.ad);
const sK = sira((s) => s.kalkan), sH = sira((s) => s.dusen), sV = sira((s) => s.dusen / s.gun);
console.log(`\nkalkan kontrole gore : ${sK.join(" > ")}`);
console.log(`dusen kaleme gore    : ${sH.join(" > ")}`);
console.log(`birim gune gore      : ${sV.join(" > ")}`);

// Turu butun sistemlerden kaldirmakla kismen kaldirmak arasindaki fark
const kismi = sonuc.filter((s) => s.kalkan === 0);
console.log(`\nturu butun sistemlerden kaldiran ${sonuc.length - kismi.length} eylem kontrol ` +
  `dusuruyor; kismen kaldiran ${kismi.length} eylem hic kontrol dusurmuyor ama ` +
  `${kismi.reduce((a, s) => a + s.dusen, 0).toLocaleString("tr-TR")} kanit kalemi eksiltiyor`);
const artik = ["C04", "C16"];
const ikisi = uygula("odeme-karti", "*", artik).yeni
  .map((s) => ({ ...s, tur: s.tur.filter((t) => t !== "saglik") }));
const kIki = gereken(ikisi);
for (const a of artik) kIki.add(a);
console.log(`iki turu birden kaldirmak: ${ONCE_K.size} kontrolun ${ONCE_K.size - kIki.size} ` +
  `tanesi ortadan kalkiyor, ${kIki.size} tanesi kaliyor; artik kontrol olarak ` +
  `${artik.map((k) => KONTROL[k].ad).join(" ve ")} geri geliyor`);
console.log(`kalan ${kIki.size} kontrolun ${TUR["kisisel"].length} tanesi kisisel veri ` +
  `turunden geliyor; donemdeki kanit kalemi ` +
  `${[...kIki].reduce((a, k) => a + KONTROL[k].kalem, 0).toLocaleString("tr-TR")}`);
```

```
baslangic: 20 kontrol, donemde 24.394 kanit kalemi, 16 sistem

eylem                           sistem   kontrol   kalkan  kanit kalemi    gun kalem / gun
belirtec ve gecidin devri            6        16        4        22.586     30          60
saglik kaydinin devri                5        17        3        23.043     14          97
raporda toplulastirma                4        20        0        22.911     20          74
olcumun sahada ozetlenmesi           3        20        0        23.263     10         113

kalkan kontrole gore : belirtec ve gecidin devri > saglik kaydinin devri > raporda toplulastirma > olcumun sahada ozetlenmesi
dusen kaleme gore    : belirtec ve gecidin devri > raporda toplulastirma > saglik kaydinin devri > olcumun sahada ozetlenmesi
birim gune gore      : olcumun sahada ozetlenmesi > saglik kaydinin devri > raporda toplulastirma > belirtec ve gecidin devri

turu butun sistemlerden kaldiran 2 eylem kontrol dusuruyor; kismen kaldiran 2 eylem hic kontrol dusurmuyor ama 2.614 kanit kalemi eksiltiyor
iki turu birden kaldirmak: 20 kontrolun 7 tanesi ortadan kalkiyor, 13 tanesi kaliyor; artik kontrol olarak belirtec sinirinin dogrulanmasi ve saticinin degerlendirilmesi geri geliyor
kalan 13 kontrolun 9 tanesi kisisel veri turunden geliyor; donemdeki kanit kalemi 2.052
```

Dördüncü sütun dersin sert sonucudur. Kişisel veriyi dört sistemden ve ölçüm verisini üç sistemden
kaldıran eylemler **hiçbir kontrolü ortadan kaldırmıyor.** Nedeni CE25'tir: bir kontrol ancak onu
gerektiren hiçbir sistem kalmadığında düşer; kişisel veri on bir sistemde geçtiği için dördünden
çıkarmak listeyi kısaltmaz. Bu iki eylem yine de işe yarıyor — 2.614 kanıt kalemi eksiltiyorlar —
ama kazandıkları şey kontrol listesi değil, **kanıt hacmidir**. İki farklı kazanç ve iki farklı
karar; ikisini tek başlıkta toplamak, "veriyi azalttık, uyum yükümüz düştü" gibi ölçülemeyen bir
cümle üretir.

Türü bütün sistemlerden kaldıran iki eylem gerçekten kontrol düşürüyor: ödeme kartı verisi dört,
sağlık verisi üç. Ama düşen sayı türün getirdiği sayıdan azdır. Ödeme kartı verisi dokuz kontrol
getirmişti; kaldırıldığında altı özgün kontrol düşüyor, ardından ikisi **artık kontrol** olarak geri
geliyor — veriyi dışarıda tutan belirteç sınırının doğrulanması ve devredilen tarafın
değerlendirilmesi. Veriyi devretmek yükümlülüğü sıfırlamaz; onu **sınırın kendisine** taşır.

Üç sıralama üç farklı liste veriyor ve hiçbiri yanlış değildir. Kalkan kontrole göre belirteç
eylemi birincidir; birim güne göre en son sıradadır ve ölçümün sahada özetlenmesi öne geçer. Otuz
günlük bir çabayla dört kontrol düşürmek ile on günlük bir çabayla hiç kontrol düşürmeyip 1.131
kanıt kalemi eksiltmek arasındaki seçim, kurumun neyi darlık olarak yaşadığına bağlıdır: denetim
listesinin uzunluğu mu, yoksa kanıt derleme emeği mi. Son satır sınırı yazıyor — iki türü birden
kaldırdıktan sonra bile yirmi kontrolün on üçü ayakta kalır ve dokuzu kişisel veri türünden gelir.

#### Özet

- Uyumluluk gereksinimlerinin bir bölümü kurumun ne yaptığından değil, hangi veri türüne
  dokunduğundan doğar; dört tür sırasıyla 9, 8, 9 ve 3 ek kontrol getiriyor.
- Türler ayrı ayrı toplandığında 29, birleşimde 20 kontrol çıkıyor: dokuz kontrol birden çok türde
  tekrar ettiği için ikinci veri türünün kontrol maliyeti birincisinden düşüktür.
- Kontrol yükü, veriyi kaynağından bağımsız toplayan sistemlerde birikiyor: yedek deposu dört türü
  birden taşıdığı için yirmi kontrolün tamamını üzerine alıyor; dokuz çok türlü sistemin yükü 129,
  yedi tek türlü sistemin yükü 44.
- Bir kontrol ancak onu gerektiren hiçbir sistem kalmadığında düşer: kişisel veriyi dört, ölçüm
  verisini üç sistemden kaldırmak hiçbir kontrolü ortadan kaldırmıyor, yalnız 2.614 kanıt kalemi
  eksiltiyor.
- Türü bütünüyle kaldırmak dört ve üç kontrol düşürüyor, ama artık kontroller geri geliyor: veriyi
  devretmek yükümlülüğü sıfırlamaz, sınırın kendisine taşır. İki tür birden kaldırıldığında yirmi
  kontrolün on üçü ayakta kalıyor.
- Kalkan kontrol, düşen kanıt kalemi ve birim güne düşen kazanç üç farklı sıralama üretiyor; en çok
  kontrol düşüren eylem birim çabada sonuncudur.

#### Sonraki Adım

Bu dersin dört türünden biri diğerlerinden farklı davrandı: kişisel veri on bir sistemde geçiyor,
hiçbir daraltmayla ortadan kalkmıyor ve kaldırma denemelerinden sonra bile kalan on üç kontrolün
dokuzunu tek başına taşıyor. Nedeni yalnız yaygınlığı değildir. Öteki türlerde yükümlülük **veriyi
tutan tarafa** yazılır; kişisel veride yükümlülüğün bir bölümü **verisi tutulan kişiye** bir hak
olarak verilir ve o hak istendiği anda kullanılır.

Sonraki ders bu hakları kalem olarak sayar: kaç ayrı talep türü var, bir talep karşılanırken kaç
sistemde arama yapılıyor, envanterde olmayan bir sistem yüzünden kaç talep eksik yanıtlanıyor. İşleme
ilkeleri de aynı biçimde ele alınır — her ilke bir kontrole ve bir kanıt kalemine bağlanır.

### Kişisel Verinin Korunması

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/kisisel-verinin-korunmasi

Veri sahibi haklarının ve işleme ilkelerinin kalem olarak sayılması: 15 sistemin 3'ü envanterde olmadığı için 7 hak talebi türünün 6'sının eksik yanıtlanması ve ayda 121 talebin yüzde 28'inin gölge sistemlere takılması, bir talebin 55 ile 240 dakika arasında sürmesi ve aylık iş yükünün 381 kişi-saat ile 260 kişi-saatlik kapasiteyi aşması, envanteri tamamlamanın yükü 494,8 kişi-saate çıkarması, veri en azlığının 324,9'a indirmesi ve 7 işleme ilkesinin tamamının envanterin tamlığına bağlı olması.

Önceki dersin dört veri türünden biri ötekilere benzemiyordu: kişisel veri on bir sistemde geçiyor,
hiçbir daraltmayla ortadan kalkmıyor ve kaldırma denemelerinden sonra kalan on üç kontrolün
dokuzunu tek başına taşıyordu. Farkın kaynağı yaygınlık değildir. Öteki türlerde yükümlülük veriyi
tutan tarafa yazılır; kişisel veride yükümlülüğün bir bölümü **verisi tutulan kişiye bir hak
olarak** verilir. Hak, kurumun takvimine göre değil, hak sahibinin istediği anda kullanılır ve
kurumdan bir **eylem** ister.

Bu ders hakları ve işleme ilkelerini kalem olarak sayar. Hiçbir yasa, madde, kurum ya da ülke adı
yazılmaz; ölçülen şey yükümlülüğün adı değil, bir talebin kurumda kaç sistemi dolaştığı ve kaç
dakika tuttuğudur. Önceki derslerden gelen envanter burada belirleyici olur: **bir talep ancak
envanterdeki sistemlerde aranabilir.**

- **CE27.** Kurgu kurumda kişisel veri taşıyan 15 sistem vardır; üçü envanterde kayıtlı değildir.
  Sistemler, kayıt sayıları ve süreler **kurgudur**.
- **CE28.** Her sistem bir ya da daha çok **veri sınıfı** tutar: kimlik, iletişim, sözleşme, işlem,
  konum, şikâyet, profil.
- **CE29.** Yedi hak talebi türü tanımlıdır; her tür belirli veri sınıflarını arar ve yalnız o
  sınıfları tutan sistemlere dokunur.
- **CE30.** Bir talebin süresi, dokunduğu **envanterdeki** sistemlerin arama sürelerinin toplamı ile
  sabit bir işlem süresidir. Envanterde olmayan sistem aranmaz; süreye de girmez.
- **CE31.** Envanterde olmayan bir sistemde ilgili kişinin kaydının bulunma olasılığı, o sistemin
  kayıt sayısının abone sayısına oranıdır. Bir talep bu sistemlerden herhangi birinde kayıt
  bırakmışsa **eksik yanıtlanmıştır**.
- **CE32.** Talep ekibinin kapasitesi ayda 260 kişi-saattir (kurgu).

```js
// kisisel/talep.mjs — veri sahibi haklarinin kalem olarak sayilmasi.
// MODELDIR: bolgesel olcum agi (kurgu); sistemler, kayit sayilari ve sureler kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

export const ABONE = 420000;   // kurgu abone sayisi; kapsama orani buna bolunur
// sistem | envanterde mi | kayit | arama dakikasi | tuttugu veri siniflari
export const SISTEM = satir(`
  abone-portali|evet|420000|4|kimlik iletisim sozlesme
  fatura-uygulamasi|evet|380000|6|kimlik sozlesme islem
  fatura-veritabani|evet|380000|8|kimlik sozlesme islem
  cagri-merkezi-kaydi|evet|95000|12|kimlik iletisim sikayet
  saha-ekip-uygulamasi|evet|22000|9|kimlik konum
  is-emri-servisi|evet|140000|7|konum sozlesme
  kimlik-saglayici|evet|31000|3|kimlik
  dizin-servisi|evet|31000|3|kimlik iletisim
  raporlama-ambari|evet|1200000|25|islem profil
  yedek-deposu|evet|2400000|60|kimlik iletisim sozlesme islem
  arsiv-deposu|evet|900000|40|sozlesme
  gunluk-toplama-hatti|evet|5400000|18|islem
  pazarlama-listesi|hayir|60000|10|iletisim profil
  saha-tablo-dosyalari|hayir|8000|35|konum sikayet
  eski-cagri-yedegi|hayir|75000|30|iletisim sikayet`)
  .map(([ad, env, kayit, dk, sinif]) => ({ ad, env: env === "evet", kayit: +kayit, dk: +dk,
    sinif: sinif.split(" "), kapsam: Math.min(1, +kayit / ABONE) }));

// hak | aranan veri siniflari | kalem basina ek islem dakikasi | aylik talep (kurgu)
export const HAK = satir(`
  H1 kaydin kopyasi|kimlik iletisim sozlesme islem konum sikayet profil|30|40
  H2 duzeltme|kimlik iletisim|20|25
  H3 silme|kimlik iletisim sozlesme islem konum sikayet profil|45|30
  H4 islemeyi kisitlama|islem profil|25|6
  H5 itiraza konu isleme|iletisim profil|20|12
  H6 tasinabilirlik|sozlesme islem|40|5
  H7 otomatik karara itiraz|profil|30|3`)
  .map(([ad, s, ek, adet]) =>
    ({ ad, kod: ad.split(" ")[0], sinif: s.split(" "), ek: +ek, adet: +adet }));

export const dokunan = (h, kume = SISTEM) =>
  kume.filter((s) => s.sinif.some((x) => h.sinif.includes(x)));
export const sure = (h, kume = SISTEM) =>
  h.ek + dokunan(h, kume).filter((s) => s.env).reduce((a, s) => a + s.dk, 0);
// Envanterde olmayan bir sistemde o veri sahibinin kaydi bulunma olasiligi kapsam oranidir.
export const eksikOran = (h, kume = SISTEM) => 1 - dokunan(h, kume)
  .filter((s) => !s.env).reduce((a, s) => a * (1 - s.kapsam), 1);

if (import.meta.url === `file://${process.argv[1]}`) {
  const disi = SISTEM.filter((s) => !s.env);
  console.log(`model: ${SISTEM.length} sistem (${disi.length} tanesi envanterde degil), ` +
    `${HAK.length} hak talebi turu, ${HAK.reduce((a, h) => a + h.adet, 0)} talep/ay (kurgu)`);

  const y = gen([25, 9, 10, 10, 14, 11, 12]);
  console.log("\n" + y("hak talebi turu", "aranan", "atlanan", "sure dk", "aranan kayit",
    "talep/ay", "eksik %"));
  for (const h of HAK) {
    const d = dokunan(h), aranan = d.filter((s) => s.env);
    console.log(y(h.ad, aranan.length, d.length - aranan.length, sure(h),
      aranan.reduce((a, s) => a + s.kayit, 0).toLocaleString("tr-TR"), h.adet,
      (100 * eksikOran(h)).toFixed(1)));
  }
  const eksikTalep = HAK.reduce((a, h) => a + h.adet * eksikOran(h), 0);
  const toplam = HAK.reduce((a, h) => a + h.adet, 0);
  console.log(`\nenvanter disi sisteme dokunan hak turu ` +
    `${HAK.filter((h) => eksikOran(h) > 0).length}/${HAK.length}; ayda ` +
    `${eksikTalep.toFixed(1)}/${toplam} talep (%${(100 * eksikTalep / toplam).toFixed(1)}) ` +
    `eksik yanitlaniyor`);
  console.log(`envanter disi ${disi.length} sistem: ` +
    `${disi.map((s) => `${s.ad} (%${(100 * s.kapsam).toFixed(1)})`).join(", ")}`);
  const pahali = [...SISTEM].filter((s) => s.env).sort((a, b) => b.dk - a.dk).slice(0, 3);
  console.log(`arama suresini belirleyen uc sistem: ` +
    `${pahali.map((s) => `${s.ad} ${s.dk} dk`).join(", ")}; toplam is yuku ` +
    `${(HAK.reduce((a, h) => a + h.adet * sure(h), 0) / 60).toFixed(1)} kisi-saat/ay`);
}
```

```
model: 15 sistem (3 tanesi envanterde degil), 7 hak talebi turu, 121 talep/ay (kurgu)

hak talebi turu             aranan   atlanan   sure dk  aranan kayit   talep/ay     eksik %
H1 kaydin kopyasi               12         3       225    11.399.000         40        30.9
H2 duzeltme                      8         2       125     3.759.000         25        29.6
H3 silme                        12         3       240    11.399.000         30        30.9
H4 islemeyi kisitlama            5         1       142     9.760.000          6        14.3
H5 itiraza konu isleme           5         2       124     4.146.000         12        29.6
H6 tasinabilirlik                8         0       208    11.220.000          5         0.0
H7 otomatik karara itiraz        1         1        55     1.200.000          3        14.3

envanter disi sisteme dokunan hak turu 6/7; ayda 33.9/121 talep (%28.0) eksik yanitlaniyor
envanter disi 3 sistem: pazarlama-listesi (%14.3), saha-tablo-dosyalari (%1.9), eski-cagri-yedegi (%17.9)
arama suresini belirleyen uc sistem: yedek-deposu 60 dk, arsiv-deposu 40 dk, raporlama-ambari 25 dk; toplam is yuku 381.2 kisi-saat/ay
```

Tablo hakları tek bir cümleden kalem kümesine çeviriyor. Yedi hak türü aynı işi yapmıyor: kaydın
kopyası ve silme yedi veri sınıfının tamamını arar ve on iki sistem dolaşır, otomatik karara itiraz
yalnız profil sınıfına bakar ve tek sistemde biter. Süre 55 dakika ile 240 dakika arasındadır —
**aynı kurum, aynı kişi için, hangi hakkın kullanıldığına göre dört kattan fazla değişen bir iş
yapar.** Süreyi belirleyen de talebin kendisi değil, envanterin biçimidir: yedek deposu tek başına
60 dakika tutuyor ve altı hak türünde birden aranıyor.

İkinci sütun dersin ana ölçüsüdür. Yedi hak türünün altısı envanterde olmayan bir sisteme dokunuyor
ve o sistem hiç aranmıyor. Aranmayan sistem süreye girmez; bu yüzden **eksik yanıt, yanıt süresinde
hiçbir belirti vermez.** Talep zamanında kapatılır, sahibine "kaydınız şu üç sistemde bulundu"
denir ve gölge sistemdeki kayıt hiç anılmaz. Ayda 121 talebin 33,9'u — yüzde 28'i — bu durumdadır.

Bu, önceki üç dersin ölçtüğü şeylerden farklı bir kusurdur. Kanıtsız gereksinim denetimde görünür,
kapsam dışı kalem uygulanabilirlik bildiriminde yazılır — ikisi de bir yerde **kayıtlıdır**. Gölge
sistemin ürettiği eksiklik hiçbir yerde kayıtlı değildir: ne talep kaydında, ne süre ölçümünde, ne
de kanıt dosyasında bir iz bırakır. Ölçülebilmesinin tek yolu, envanterin dışında ne olduğunun
ayrıca aranmasıdır; envanterin kendisiyle bulunamaz.

Oran hak türüne göre değişiyor ve nedeni gölge sistemlerin kapsama oranıdır: eski çağrı yedeği
abonelerin yüzde 17,9'unu, pazarlama listesi yüzde 14,3'ünü, saha tablo dosyaları yüzde 1,9'unu
içeriyor. İletişim sınıfına dokunan haklarda iki gölge sistem birden devrededir ve eksik yanıt
oranı yüzde 29,6'ya çıkıyor. Taşınabilirlik ise tek temiz haktır: sözleşme ve işlem sınıfları hiçbir
gölge sistemde tutulmuyor.

#### İki Seçenek, Aynı Kapasite

Eksik yanıt oranını düşürmenin iki yolu vardır ve ikisi zıt yönde çalışır: envanteri tamamlamak
(gölge sistemleri kayda geçirip aramaya dâhil etmek) ya da veriyi azaltmak (bir sınıfı hiç
tutmamak, süresi dolan deposu boşaltmak).

```js
// kisisel/senaryo.mjs — envanteri tamamlamanin ve veriyi azaltmanin talep yukune etkisi.
import { SISTEM, HAK, satir, gen, sure, eksikOran } from "./talep.mjs";

const KAPASITE = 260;   // kisi-saat/ay (iki kisi, kurgu)
const isYuku = (k) => HAK.reduce((a, h) => a + h.adet * sure(h, k), 0) / 60;
const eksik = (k) => HAK.reduce((a, h) => a + h.adet * eksikOran(h, k), 0);

// Senaryolar ayni sistem kumesi uzerinde tanimli donusumlerdir.
const envanterTam = (k) => k.map((s) => ({ ...s, env: true }));
const enAzlik = (k) => k.filter((s) => s.ad !== "arsiv-deposu")
  .map((s) => s.ad === "raporlama-ambari"
    ? { ...s, sinif: s.sinif.filter((x) => x !== "profil") } : s);

const SENARYO = [["taban", (k) => k], ["envanter tamamlanir", envanterTam],
  ["veri en azligi", enAzlik], ["ikisi birden", (k) => enAzlik(envanterTam(k))]];

const y = gen([22, 9, 12, 13, 14, 12]);
console.log(`aylik ${HAK.reduce((a, h) => a + h.adet, 0)} talep, kapasite ` +
  `${KAPASITE} kisi-saat/ay (kurgu)`);
console.log("\n" + y("senaryo", "sistem", "eksik/ay", "eksik %", "kisi-saat/ay", "kapasite %"));
for (const [ad, don] of SENARYO) {
  const k = don(SISTEM), y2 = isYuku(k), e = eksik(k);
  const toplam = HAK.reduce((a, h) => a + h.adet, 0);
  console.log(y(ad, k.length, e.toFixed(1), (100 * e / toplam).toFixed(1), y2.toFixed(1),
    (100 * y2 / KAPASITE).toFixed(0)));
}

// Isleme ilkeleri: her ilke bir kanit kalemine ve bir veri sinifi kumesine baglidir.
// ilke | kapsadigi veri siniflari | donemde uretilen kanit kalemi
const HEPSI = "kimlik iletisim sozlesme islem konum sikayet profil";
const ILKE = satir(`
  hukuka uygun dayanak|iletisim profil|120
  amac sinirlamasi|islem profil|4
  veri en azligi|${HEPSI}|4
  dogruluk|kimlik iletisim|12
  saklama siniri|sozlesme islem sikayet|365
  butunluk ve gizlilik|${HEPSI}|365
  hesap verebilirlik|${HEPSI}|4`)
  .map(([ad, s, kalem]) => ({ ad, sinif: s.split(" "), kalem: +kalem }));

const z = gen([22, 13, 14, 22, 16]);
console.log("\n" + z("isleme ilkesi", "veri sinifi", "kanit kalemi", "envanter disi sistem",
  "dogrulanabilir"));
for (const i of ILKE) {
  const disi = SISTEM.filter((s) => !s.env && s.sinif.some((x) => i.sinif.includes(x)));
  console.log(z(i.ad, i.sinif.length, i.kalem, disi.length, disi.length ? "hayir" : "evet"));
}
const bagli = ILKE.filter((i) =>
  SISTEM.some((s) => !s.env && s.sinif.some((x) => i.sinif.includes(x))));
console.log(`\n${ILKE.length} isleme ilkesinin ${bagli.length} tanesi envanterin ` +
  `tamligina bagli; envanter tamamlandiginda ${ILKE.length} ilkenin tamami dogrulanabilir ` +
  `hale geliyor ve is yuku ${(isYuku(envanterTam(SISTEM)) - isYuku(SISTEM)).toFixed(1)} ` +
  `kisi-saat/ay artiyor`);
console.log(`ilkelerin donemde urettigi kanit kalemi ` +
  `${ILKE.reduce((a, i) => a + i.kalem, 0)}; talep karsilamanin yillik yuku ` +
  `${(isYuku(SISTEM) * 12).toFixed(0)} kisi-saat`);
```

```
aylik 121 talep, kapasite 260 kisi-saat/ay (kurgu)

senaryo                  sistem    eksik/ay      eksik %  kisi-saat/ay  kapasite %
taban                        15        33.9         28.0         381.2         147
envanter tamamlanir          15         0.0          0.0         494.8         190
veri en azligi               14        33.9         28.0         324.9         125
ikisi birden                 14         0.0          0.0         438.6         169

isleme ilkesi           veri sinifi  kanit kalemi  envanter disi sistem  dogrulanabilir
hukuka uygun dayanak              2           120                     2           hayir
amac sinirlamasi                  2             4                     1           hayir
veri en azligi                    7             4                     3           hayir
dogruluk                          2            12                     2           hayir
saklama siniri                    3           365                     2           hayir
butunluk ve gizlilik              7           365                     3           hayir
hesap verebilirlik                7             4                     3           hayir

7 isleme ilkesinin 7 tanesi envanterin tamligina bagli; envanter tamamlandiginda 7 ilkenin tamami dogrulanabilir hale geliyor ve is yuku 113.7 kisi-saat/ay artiyor
ilkelerin donemde urettigi kanit kalemi 874; talep karsilamanin yillik yuku 4574 kisi-saat
```

Birinci tablo takası çıplak biçimde gösteriyor. Taban durumda ekip kapasitesinin yüzde 147'si kadar
iş var ve talepler zaten yetişmiyor; üstelik yetişmeyen bu iş, taleplerin yüzde 28'ini eksik
yanıtlayarak yapılıyor. Envanter tamamlandığında eksik yanıt sıfırlanıyor ama iş yükü 494,8
kişi-saate çıkıyor — kapasitenin yüzde 190'ı. **Doğru yanıt vermek, yanlış yanıt vermekten yüzde 30
daha pahalıdır** ve bu fark hiçbir yerde bir gider kalemi olarak görünmez.

İkinci satırla üçüncü satırı yan yana koymak dersin sonucudur. Veri en azlığı iş yükünü 324,9'a
indiriyor ve kapasiteye yaklaştırıyor, ama eksik yanıt oranını hiç değiştirmiyor: kaldırılan
kalemler zaten envanterdeydi, gölge sistemler yerinde duruyor. İki seçenek **farklı sorunları**
çözüyor. Yalnız biri seçilirse ya doğru ama yetişmeyen bir süreç, ya hızlı ama eksik bir süreç
çıkar; ikisi birden uygulandığında eksik yanıt sıfırlanıyor ve yük 438,6'ya iniyor — hâlâ
kapasitenin üzerinde. Kapasiteyi büyütmeden çözülen bir durum yok ve bu da bir karardır.

İkinci tablo aynı eksiği kanıt tarafında gösteriyor. Yedi işleme ilkesinin **yedisi de** envanterde
olmayan en az bir sisteme dokunuyor ve hiçbiri doğrulanabilir durumda değil. Amaç sınırlaması tek
bir gölge sisteme takılıyor, veri en azlığı ve hesap verebilirlik üçüne birden. Bu, ilkelerin
uygulanmadığı anlamına gelmez; **uygulandığının gösterilemeyeceği** anlamına gelir. Üçüncü dersin
ayrımı burada aynen geçerlidir: bir ilkenin kontrolü olabilir, kanıt kalemi de üretiyor olabilir,
ama kanıtın kapsamı envanterin kapsamıyla sınırlıdır. Bu yüzden kişisel veride ilk kalem bir kontrol
değil, **envanterin kendisidir**; ondan önce sayılan her şey eksik bir kümenin üzerinde sayılmıştır.

#### Özet

- Veri sahibi hakları yedi ayrı talep türüdür ve aynı işi yapmazlar: kaydın kopyası ve silme on iki
  sistem dolaşıp 225–240 dakika tutarken otomatik karara itiraz tek sistemde 55 dakikada biter.
- Envanterde olmayan sistem aranmaz ve süreye girmez; bu yüzden eksik yanıt, yanıt süresinde hiçbir
  belirti vermez. Yedi hak türünün altısı bu durumdadır ve ayda 121 talebin yüzde 28'i eksik
  yanıtlanıyor.
- Eksik yanıt oranını gölge sistemlerin kapsama oranı belirliyor: iletişim sınıfına dokunan
  haklarda iki gölge sistem birden devrededir ve oran yüzde 29,6'ya çıkıyor; taşınabilirlik tek
  temiz haktır.
- Doğru yanıt vermek pahalıdır: envanter tamamlandığında eksik yanıt sıfırlanıyor ama aylık iş yükü
  381,2'den 494,8 kişi-saate çıkıyor — 260 kişi-saatlik kapasitenin yüzde 190'ı.
- Envanteri tamamlamak ile veriyi azaltmak farklı sorunları çözüyor: en azlık yükü 324,9'a
  indiriyor ama eksik yanıt oranını hiç değiştirmiyor; ikisi birden uygulandığında bile yük
  kapasitenin üzerinde kalıyor.
- Yedi işleme ilkesinin yedisi de envanterde olmayan bir sisteme dokunduğu için doğrulanamıyor:
  ilkenin uygulanmaması değil, uygulandığının gösterilememesi söz konusudur.

#### Sonraki Adım

Son iki tablonun ortak yanı, ölçülen her şeyin bir **belgeye** dayanmasıdır: envanter bir belgedir,
saklama süresi bir belgede yazar, talep akışının adımları bir belgede tanımlıdır. Bu derse kadar
belgeler tek bir kütle gibi ele alındı — oysa aralarında denetim açısından keskin bir fark vardır.
Bir belge "kişisel veriyi koruruz" der ve hiçbir şey kanıtlamaz; bir başkası "saklama süresi 1.095
gündür" der ve ölçülebilir bir eşik verir; üçüncüsü adım adım bir yordam tanımlar ve her koşumunda
bir kayıt üretir.

Sonraki ders bu üç düzeyi — politika, standart ve yordam — kanıt üretimi ekseninde ayırır: hangi
belge düzeyi denetimde kanıt sayılır, hangisi yalnız niyet bildirir ve bir gereksinimin karşılandığını
göstermek için zincirin kaç halkasının tam olması gerekir.

### Politika, Standart ve Yordam

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/politika-standart-ve-yordam

Belge hiyerarşisinin kanıt üretimi ekseninde ayrılması: 26 belgenin yalnız 10'unun denetimde kanıt üretmesi ve 9'unun ölçülebilir eşik taşımaması, 15 gereksinim zincirinin 9'unun tam olması ve 11'inin kanıtlanabilmesi, politikasız iki zincirin kayıt üreten yordamı sayesinde kanıtlanabilir kalması, eksik halkaları tamamlamanın 104 adam-günü kanıt kazandırırken 14 adam-günü yalnız görünüşü düzeltmesi ve belge sayısı ile kanıt üretimi sıralamalarının ayrışması.

Önceki dersin son iki tablosunda ölçülen her şey bir belgeye dayanıyordu: envanter bir belgedir,
saklama süresi bir belgede yazar, talep akışının adımları bir belgede tanımlıdır. Buraya kadar
belgeler tek bir kütle gibi ele alındı. Denetim açısından ise aralarında keskin bir fark vardır ve
bu ders o farkı ölçer.

Belge hiyerarşisi üç düzeylidir. **Politika** niyeti ve sorumluluğu bildirir; kimin neyi
sahiplendiğini söyler, ölçülebilir bir eşik vermez. **Standart** eşiği verir: bir sayı, bir süre, bir
yapılandırma değeri. **Yordam** adım adım bir işi tanımlar ve her koşumunda bir **kayıt** üretir.
Kanıt yalnız son düzeyden çıkar. Bir mimari kuralı koşturulabilir bir denetime çevirmenin bedeli
M20/K04'te ölçülmüştü; buradaki soru başkadır — denetçi karşısında hangi belge düzeyi bir **kalem**
olarak sayılır, hangisi yalnız okunup geçilir.

- **CE33.** Belge kümesi 26 kalemdir ve sekiz konu alanına dağılmıştır. Belgeler, kayıt sayıları ve
  yaşlar **kurgudur**.
- **CE34.** Her belgenin bir düzeyi (politika, standart, yordam), ölçülebilir eşik taşıyıp
  taşımadığı, dönemde ürettiği kayıt sayısı ve son güncellemeden bu yana geçen gün sayısı vardır.
- **CE35.** Bir gereksinim, üç düzeyi birbirine bağlayan bir **zincir** olarak yazılır: politika →
  standart → yordam. Boş hücre eksik halkadır.
- **CE36.** Kanıt kuralı: bir gereksinim ancak **kayıt üreten bir yordamı** varsa denetimde
  kanıtlanabilir sayılır. Politika ve standart tek başına kanıt değildir.
- **CE37.** Eksik halkayı üretmenin maliyeti düzeye göre değişir: politika 3, standart 8, yordam 15,
  yordamın kayıt akışı 10 adam-gün (kurgu).
- **CE38.** Bir yordam birden çok zincirde geçebilir; o zaman kayıt kalemi de paylaşılır.

```js
// belge/hiyerarsi.mjs — politika, standart ve yordam duzeylerinin kanit uretimi ekseninde ayrimi.
// MODELDIR: bolgesel olcum agi (kurgu); belgeler, kayit sayilari ve yaslar kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

// kod | duzey | alan | olculebilir esik | donemde urettigi kayit | son guncellemeden bu yana gun
export const BELGE = Object.fromEntries(satir(`
  P1|politika|erisim|hayir|0|420
  P2|politika|veri|hayir|0|180
  P3|politika|degisiklik|hayir|0|900
  P4|politika|olay|hayir|0|150
  P5|politika|tedarik|hayir|0|640
  P6|politika|farkindalik|hayir|0|300
  S1|standart|erisim|evet|0|120
  S2|standart|erisim|evet|0|540
  S3|standart|veri|evet|0|90
  S4|standart|veri|hayir|0|380
  S5|standart|degisiklik|evet|0|75
  S6|standart|olay|evet|0|200
  S7|standart|tedarik|hayir|0|700
  S8|standart|sureklilik|evet|0|260
  S9|standart|farkindalik|evet|0|340
  Y1|yordam|erisim|evet|240|60
  Y2|yordam|erisim|evet|48|110
  Y3|yordam|veri|evet|365|30
  Y4|yordam|veri|evet|30|45
  Y5|yordam|degisiklik|evet|310|20
  Y6|yordam|olay|evet|18|95
  Y7|yordam|olay|hayir|0|410
  Y8|yordam|tedarik|evet|3|280
  Y9|yordam|sureklilik|evet|4|150
  Y10|yordam|farkindalik|evet|4|85
  Y11|yordam|varlik|evet|12|40`)
  .map(([kod, duzey, alan, esik, kayit, yas]) =>
    [kod, { kod, duzey, alan, esik: esik === "evet", kayit: +kayit, yas: +yas }]));

// gereksinim | politika | standart | yordam  (bos hucre eksik halkadir)
export const ZINCIR = satir(`
  Z01 erisim onayi|P1|S1|Y1
  Z02 ayricalikli erisim|P1|S2|Y2
  Z03 kimlik dogrulama kurallari|P1|S2|
  Z04 veri siniflandirma|P2|S3|Y3
  Z05 silme talebi|P2|S4|Y4
  Z06 saklama suresi|P2|S3|Y3
  Z07 degisiklik onayi|P3|S5|Y5
  Z08 olay bildirimi|P4|S6|Y6
  Z09 olay sonrasi inceleme|P4|S6|Y7
  Z10 tedarikci degerlendirme|P5|S7|Y8
  Z11 tedarikciden cikis|P5||
  Z12 sureklilik tatbikati||S8|Y9
  Z13 farkindalik egitimi|P6|S9|Y10
  Z14 varlik envanteri|||Y11
  Z15 kayitlarin butunlugu|||`)
  .map(([ad, p, s, y]) => ({ ad, kod: ad.split(" ")[0], p, s, y }));

export const DUZEY = ["politika", "standart", "yordam"];
// Kanit kurali: bir gereksinim ancak kayit ureten bir yordamla kanitlanabilir.
export const kanitli = (z) => Boolean(z.y) && BELGE[z.y].kayit > 0;
export const kopus = (z) => !z.p ? "politika yok" : !z.s ? "standart yok"
  : !z.y ? "yordam yok" : BELGE[z.y].kayit === 0 ? "kayit uretmiyor" : "tam";

if (import.meta.url === `file://${process.argv[1]}`) {
  const hepsi = Object.values(BELGE);
  console.log(`model: ${hepsi.length} belge, ${ZINCIR.length} gereksinim zinciri, ` +
    `${new Set(hepsi.map((b) => b.alan)).size} konu alani`);

  const y = gen([12, 8, 11, 14, 14, 13]);
  console.log("\n" + y("duzey", "belge", "esikli", "kayit uretir", "donem kaydi", "ort yas gun"));
  for (const d of DUZEY) {
    const k = hepsi.filter((b) => b.duzey === d);
    console.log(y(d, k.length, k.filter((b) => b.esik).length,
      k.filter((b) => b.kayit > 0).length, k.reduce((a, b) => a + b.kayit, 0),
      (k.reduce((a, b) => a + b.yas, 0) / k.length).toFixed(0)));
  }
  console.log(`toplam ${hepsi.length} belgenin ${hepsi.filter((b) => b.kayit > 0).length} ` +
    `tanesi denetimde kanit uretiyor; ${hepsi.filter((b) => !b.esik).length} tanesi ` +
    `olculebilir esik tasimiyor`);

  const z = gen([18, 10, 12, 40]);
  console.log("\n" + z("zincir durumu", "sayi", "yuzde", "gereksinimler"));
  const DURUM = ["tam", "kayit uretmiyor", "yordam yok", "standart yok", "politika yok"];
  for (const d of DURUM) {
    const k = ZINCIR.filter((x) => kopus(x) === d);
    console.log(z(d, k.length, (100 * k.length / ZINCIR.length).toFixed(0),
      k.map((x) => x.kod).join(" ") || "-"));
  }
  console.log(`\nkanitlanabilir gereksinim ${ZINCIR.filter(kanitli).length}/${ZINCIR.length}; ` +
    `politikasi olan ${ZINCIR.filter((x) => x.p).length}, standardi olan ` +
    `${ZINCIR.filter((x) => x.s).length}, yordami olan ${ZINCIR.filter((x) => x.y).length}`);
  const eski = ZINCIR.filter((x) => x.p && x.y && BELGE[x.p].yas > BELGE[x.y].yas + 180);
  console.log(`politikasi yordamindan 180 gunden fazla eski olan zincir ${eski.length}: ` +
    `${eski.map((x) => `${x.kod} (${BELGE[x.p].yas}/${BELGE[x.y].yas} gun)`).join(", ")}`);
}
```

```
model: 26 belge, 15 gereksinim zinciri, 8 konu alani

duzey          belge     esikli  kayit uretir   donem kaydi  ort yas gun
politika           6          0             0             0          432
standart           9          7             0             0          301
yordam            11         10            10          1034          120
toplam 26 belgenin 10 tanesi denetimde kanit uretiyor; 9 tanesi olculebilir esik tasimiyor

zincir durumu           sayi       yuzde                           gereksinimler
tam                        9          60     Z01 Z02 Z04 Z05 Z06 Z07 Z08 Z10 Z13
kayit uretmiyor            1           7                                     Z09
yordam yok                 1           7                                     Z03
standart yok               1           7                                     Z11
politika yok               3          20                             Z12 Z14 Z15

kanitlanabilir gereksinim 11/15; politikasi olan 12, standardi olan 12, yordami olan 12
politikasi yordamindan 180 gunden fazla eski olan zincir 5: Z01 (420/60 gun), Z02 (420/110 gun), Z07 (900/20 gun), Z10 (640/280 gun), Z13 (300/85 gun)
```

Birinci tablo hiyerarşiyi düzey düzey ayırıyor ve üç sütunu birden okumak gerekiyor. Altı
politikanın **hiçbiri** ölçülebilir eşik taşımıyor ve hiçbiri kayıt üretmiyor; dokuz standardın
yedisi eşik taşıyor ama yine hiçbiri kayıt üretmiyor; on bir yordamın onu hem eşik taşıyor hem
kayıt üretiyor ve dönemde 1.034 kalem çıkarıyor. Yirmi altı belgenin **onu** denetimde kanıt
üretiyor. Kalan on altısı denetim dosyasına konabilir, okunur, kabul edilir — ama bir işin
yapıldığını göstermez, yalnız yapılması gerektiğini söyler.

Yaş sütunu bunun neden böyle olduğunu açıklıyor. Politikaların ortalama yaşı 432 gün, standartların
301, yordamların 120. Sıralamanın yönü rastlantı değildir: kayıt üreten belge her koşumunda
gerçeklikle karşılaşır ve tutmadığında değişir; hiç kayıt üretmeyen belge kendiliğinden hiçbir
baskıya uğramaz. Son satır bunun keskin biçimini veriyor — beş zincirde politika, kendi yordamından
180 günden fazla eskidir; değişiklik alanında politika 900, yordam 20 günlüktür. Bu zincirlerde iki
belge **aynı işi farklı biçimde** anlatıyor olabilir ve çelişki yalnız okuyan biri fark ederse
görünür.

İkinci tablo zincirleri koşturuyor. On beş gereksinimin dokuzu tam zincirdir. Kalan altı zincirin
koptuğu yer birbirinden çok farklıdır ve dört ayrı sonuç doğurur: Z09'un yordamı vardır ama kayıt
üretmez, Z03'ün standardı vardır yordamı yoktur, Z11'in yalnız politikası vardır, Z12, Z14 ve
Z15'in politikası yoktur.

Son satırdan önceki sayı bu dersin ana ayrımını veriyor: **kanıtlanabilir gereksinim 11'dir, tam
zincir ise 9.** Aradaki iki gereksinim — süreklilik tatbikatı ve varlık envanteri — politikasızdır,
ama kayıt üreten bir yordamları vardır. Denetimde bu ikisi kanıtlanır. Yani kanıt üretimi
hiyerarşinin üst düzeylerine bağlı değildir; kayıt üreten bir yordam, üzerinde hiçbir politika
olmasa da bir işin yapıldığını gösterir. Bunun tersi doğru değildir: on iki zincirin politikası
vardır ama politikaların hiçbiri tek başına hiçbir gereksinimi kanıtlamaz.

#### Eksik Halkanın Bedeli

```js
// belge/tamamlama.mjs — kopuk halkayi tamamlamanin bedeli ve alan basina kanit uretimi.
import { BELGE, ZINCIR, DUZEY, gen, kanitli, kopus } from "./hiyerarsi.mjs";

// Eksik halkayi uretmenin maliyeti (adam-gun, kurgu)
const GUN = { politika: 3, standart: 8, yordam: 15, kayit: 10 };
const eksikler = (z) => [...(!z.p ? ["politika"] : []), ...(!z.s ? ["standart"] : []),
  ...(!z.y ? ["yordam", "kayit"] : BELGE[z.y].kayit === 0 ? ["kayit"] : [])];
const maliyet = (z) => eksikler(z).reduce((a, e) => a + GUN[e], 0);

const eksikZincir = ZINCIR.filter((z) => eksikler(z).length > 0);
const y = gen([31, 32, 7, 15, 14]);
console.log(`${eksikZincir.length} zincirde eksik halka var; kanitlanabilir gereksinim ` +
  `${ZINCIR.filter(kanitli).length}/${ZINCIR.length}`);
console.log("\n" + y("gereksinim", "eksik halka", "gun", "kanit kazanci", "gun / kazanc"));
for (const z of [...eksikZincir].sort((a, b) => maliyet(a) - maliyet(b))) {
  const kazanc = kanitli(z) ? 0 : 1;
  console.log(y(z.ad, eksikler(z).join("+"), maliyet(z), kazanc,
    kazanc ? maliyet(z) : "kazanc yok"));
}
const kanitsiz = eksikZincir.filter((z) => !kanitli(z));
const gorunus = eksikZincir.filter((z) => kanitli(z));
console.log(`\nkanit kazandiran ${kanitsiz.length} zincirin toplam bedeli ` +
  `${kanitsiz.reduce((a, z) => a + maliyet(z), 0)} adam-gun; hicbir kanit kazandirmayan ` +
  `${gorunus.length} zincirin bedeli ${gorunus.reduce((a, z) => a + maliyet(z), 0)} adam-gun`);
console.log(`ucuzdan pahaliya siralama: ` +
  `${[...eksikZincir].sort((a, b) => maliyet(a) - maliyet(b)).map((z) => z.kod).join(" < ")}`);
console.log(`kanit kazancina gore siralama: ` +
  `${[...eksikZincir].sort((a, b) => (kanitli(a) ? 1 : 0) - (kanitli(b) ? 1 : 0) ||
    maliyet(a) - maliyet(b)).map((z) => z.kod).join(" < ")}`);

// Alan basina belge sayisi ile kanit uretimi
const alanlar = [...new Set(Object.values(BELGE).map((b) => b.alan))];
const belgeSay = (a) => Object.values(BELGE).filter((b) => b.alan === a);
const z2 = gen([13, 9, 12, 13, 13, 12]);
console.log("\n" + z2("konu alani", "belge", ...DUZEY, "donem kaydi"));
for (const a of alanlar) {
  const k = belgeSay(a);
  console.log(z2(a, k.length, ...DUZEY.map((d) => k.filter((b) => b.duzey === d).length),
    k.reduce((x, b) => x + b.kayit, 0)));
}
const sB = [...alanlar].sort((a, b) => belgeSay(b).length - belgeSay(a).length ||
  a.localeCompare(b));
const sK = [...alanlar].sort((a, b) => belgeSay(b).reduce((x, i) => x + i.kayit, 0) -
  belgeSay(a).reduce((x, i) => x + i.kayit, 0) || a.localeCompare(b));
console.log(`\nbelge sayisina gore ilk uc : ${sB.slice(0, 3).join(", ")}`);
console.log(`kanit uretimine gore ilk uc: ${sK.slice(0, 3).join(", ")}`);
console.log(`ortak: ${sK.slice(0, 3).filter((a) => sB.slice(0, 3).includes(a)).length}/3; ` +
  `tek belgeli varlik alani ${belgeSay("varlik").reduce((x, b) => x + b.kayit, 0)} kayit, ` +
  `dort belgeli olay alani ${belgeSay("olay").reduce((x, b) => x + b.kayit, 0)} kayit uretiyor`);
console.log(`kopus noktalari: ` +
  `${eksikZincir.map((z) => `${z.kod} ${kopus(z)}`).join("; ")}`);
```

```
6 zincirde eksik halka var; kanitlanabilir gereksinim 11/15

gereksinim                                          eksik halka    gun  kanit kazanci  gun / kazanc
Z12 sureklilik tatbikati                               politika      3              0    kazanc yok
Z09 olay sonrasi inceleme                                 kayit     10              1            10
Z14 varlik envanteri                          politika+standart     11              0    kazanc yok
Z03 kimlik dogrulama kurallari                     yordam+kayit     25              1            25
Z11 tedarikciden cikis                    standart+yordam+kayit     33              1            33
Z15 kayitlarin butunlugu         politika+standart+yordam+kayit     36              1            36

kanit kazandiran 4 zincirin toplam bedeli 104 adam-gun; hicbir kanit kazandirmayan 2 zincirin bedeli 14 adam-gun
ucuzdan pahaliya siralama: Z12 < Z09 < Z14 < Z03 < Z11 < Z15
kanit kazancina gore siralama: Z09 < Z03 < Z11 < Z15 < Z12 < Z14

konu alani       belge    politika     standart       yordam donem kaydi
erisim               5           1            2            2         288
veri                 5           1            2            2         395
degisiklik           3           1            1            1         310
olay                 4           1            1            2          18
tedarik              3           1            1            1           3
farkindalik          3           1            1            1           4
sureklilik           2           0            1            1           4
varlik               1           0            0            1          12

belge sayisina gore ilk uc : erisim, veri, olay
kanit uretimine gore ilk uc: veri, degisiklik, erisim
ortak: 2/3; tek belgeli varlik alani 12 kayit, dort belgeli olay alani 18 kayit uretiyor
kopus noktalari: Z03 yordam yok; Z09 kayit uretmiyor; Z11 standart yok; Z12 politika yok; Z14 politika yok; Z15 politika yok
```

Birinci tablo, ucuzdan pahalıya dizildiğinde en yukarıda iki tuzak taşıyor. Süreklilik tatbikatı 3
adam-günde, varlık envanteri 11 adam-günde "tam zincir" hâline gelir; ikisi de **hiçbir yeni kanıt
üretmez**, çünkü ikisi de zaten kanıtlanabilir durumdadır. Toplam 14 adam-gün, denetim raporundaki
tablo görüntüsünü düzeltir ve denetimde gösterilen kalem sayısını değiştirmez. Buna karşılık olay
sonrası incelemenin kayıt akışını kurmak 10 adam-gündür ve kanıtlanamayan bir gereksinimi
kanıtlanabilir yapar.

İki sıralama tam olarak burada ayrışıyor. Ucuzdan pahalıya sıra Z12 ile başlıyor; kanıt kazancına
göre sıra Z09 ile başlıyor ve Z12 ile Z14 en sona düşüyor. Eksik halkaları düzeye bakarak
tamamlamak — "önce politikaları yazalım, hiyerarşi tamamlansın" — 14 adam-günü **yalnız görünüşe**
harcamak demektir. Kanıt kazandıran dört zincirin toplam bedeli 104 adam-gündür ve bunun 36'sı tek
bir zincire, hiçbir düzeyi olmayan kayıt bütünlüğüne gider.

Son tablo aynı ayrışmayı konu alanı düzeyinde gösteriyor. Belge sayısına göre ilk üç erişim, veri ve
olay alanlarıdır; kanıt üretimine göre ilk üç veri, değişiklik ve erişimdir. Olay alanı dört belge
taşıyor ve dönemde 18 kayıt üretiyor; varlık alanının tek bir belgesi var ve 12 kayıt üretiyor.
**Bir alanda kaç belge olduğu, o alanda ne kadar kanıt üretildiği hakkında bilgi vermiyor.** Belge
sayımı bir çaba ölçüsüdür; kayıt sayımı bir sonuç ölçüsüdür ve bu iki sayı arasında yapısal bir bağ
yoktur.

#### Özet

- Belge hiyerarşisi üç düzeylidir: politika niyeti bildirir, standart ölçülebilir bir eşik verir,
  yordam koşumunda kayıt üretir. Denetimde kanıt yalnız son düzeyden çıkar.
- Yirmi altı belgenin onu kanıt üretiyor; altı politikanın hiçbiri eşik taşımıyor ya da kayıt
  üretmiyor, dokuz standardın yedisi eşik taşıyor ama hiçbiri kayıt üretmiyor.
- Kayıt üreten belge daha tazedir: politikaların ortalama yaşı 432, yordamların 120 gündür. Beş
  zincirde politika kendi yordamından 180 günden fazla eskidir.
- Kanıtlanabilir gereksinim 11, tam zincir 9'dur: iki gereksinim politikasız olduğu hâlde kayıt
  üreten yordamı sayesinde kanıtlanır. Bunun tersi doğru değildir — hiçbir politika tek başına bir
  gereksinimi kanıtlamaz.
- Eksik halkaları düzeye göre tamamlamak yanıltır: 14 adam-gün iki zinciri "tam" gösterir ve hiçbir
  yeni kanıt üretmez; kanıt kazandıran dört zincirin bedeli 104 adam-gündür ve en ucuzu 10 gündür.
- Bir konu alanındaki belge sayısı, o alanın kanıt üretimi hakkında bilgi vermiyor: dört belgeli
  olay alanı 18, tek belgeli varlık alanı 12 kayıt üretiyor.

#### Sonraki Adım

Bu dersin bütün sayıları bir kabule dayanıyor: zincirin dolu olduğu söylenen hücreleri gerçekten
doludur, kayıt üretiyor denen yordam gerçekten üretiyordur, 900 günlük politika hâlâ geçerlidir. Bu
kabulün kaynağı bellidir — tabloyu dolduran, belgeleri yazan ve kayıtların üretildiğini bildiren
taraf aynı taraftır. Beş ders boyunca ölçülen her şey kurumun **kendi beyanı** üzerinde koşturuldu.

Sonraki ders konuyu kapatır ve bu kabulü kaldırır: aynı kişi hem kontrolü kurup hem denetlerse kaç
bulgu hiç görünmez, kuran ile denetleyeni ayırmak kaç kalemi ortaya çıkarır ve bu ayrımın kendisi
kaç kalem ek iş getirir. Bağımsız güvence bir sıfat değil, sayılabilir bir düzenlemedir.

### Denetçi ve Uyum Rollerinin İşlevi

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/denetci-ve-uyum-rollerinin-islevi

Bağımsız güvencenin çıkar ayrımı cinsinden ölçülmesi: 24 kontroldeki 17 gerçek bulgunun öz denetimde yalnız 3'ünün görünmesi ve görünmeyen 14 bulgunun 12'sinin bağımsızlık nedeniyle gizli kalması, uyum işlevinin 8, bağımsız iç denetimin 17, örneklemli dış denetimin 9 bulgu görmesi, tam ayrımın 14 bulgu ortaya çıkarırken 72 denetim günü, 19,2 ek iş günü ve 48 ek kanıt kalemi getirmesi ve gören bulgu ile birim gün sıralamalarının iki uçta yer değiştirmesi.

Önceki dersin bütün sayıları bir kabule dayanıyordu: dolu denen hücreler gerçekten doludur, kayıt
ürettiği söylenen yordam gerçekten üretir. Bu kabulün kaynağı bellidir — tabloyu dolduran, belgeleri
yazan ve kayıtların üretildiğini bildiren taraf aynı taraftır. Konu boyunca ölçülen her şey kurumun
**kendi beyanı** üzerinde koşturuldu.

Bu ders o kabulü kaldırır ve **bağımsız güvenceyi** ölçer. Bağımsız güvence bir sıfat değildir; iki
boyutu olan sayılabilir bir düzenlemedir. Birincisi **derinlik**: bulgunun görülmesi için ne kadar
teknik inceleme gerekir — kayda bakmak yeter mi, ikinci bir kaynakla karşılaştırmak gerekir mi,
yoksa işi bağımsız olarak yeniden koşturmak mı gerekir. İkincisi **bağımsızlık**: bulguyu
raporlayacak kişinin, bulgunun sahibiyle arasındaki mesafe. Bir bulgu ancak **iki koşul birden**
sağlandığında görünür.

- **CE39.** Kontrol kümesi 24 kalemdir ve altı ekibe dağılmıştır; 17'sinde gerçek bir uygunsuzluk
  vardır. Küme ve bulgular **kurgudur**.
- **CE40.** Her bulgunun bir **derinlik** gereksinimi (1 kayıttan görülür, 2 çapraz karşılaştırma
  ister, 3 bağımsız yeniden koşum ister) ve bir **bağımsızlık** gereksinimi (0 kim bakarsa görür,
  1 ayrı ekip ister, 2 ayrı raporlama hattı ister) vardır.
- **CE41.** Dört güvence düzeni karşılaştırılır: öz denetim (derinlik 1, bağımsızlık 0), uyum işlevi
  (2, 1), bağımsız iç denetim (3, 2), dış denetim (3, 2 ama örneklemli).
- **CE42.** Dış denetim kontrollerin yüzde 40'ına bakar ve örneklemini **kanıt kalemi en çok olan**
  kontrollerden seçer.
- **CE43.** Kontrol başına denetim günü düzene göre 0,5 ile 4,0 arasındadır (kurgu).
- **CE44.** Ayrım uygulandığında her kontrol bir ek onay adımı (0,4 gün) ve bağımsızlık düzeyi
  başına bir devir yükü (0,2 gün) getirir; her bağımsız inceleme dönemde iki ek kanıt kalemi üretir.
- **CE45.** Kısmi ayrım, kanıt hacmi en yüksek `n` kontrolde bağımsız denetim, kalanında öz denetim
  uygulamaktır.

```js
// rol/guvence.mjs — bagimsiz guvence duzenlerinin gordugu bulgu.
// MODELDIR: bolgesel olcum agi (kurgu); kontroller, bulgular ve gunler kurgudur.
export const satir = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));
export const gen = (B) => (...h) => h.map((v, j) =>
  (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join("");

// kod | sahip ekip | bulgu var mi | derinlik (1-3) | bagimsizlik (0-2) | kanit kalemi
export const KONTROL = satir(`
  K01|altyapi|evet|1|0|240
  K02|altyapi|evet|2|1|180
  K03|altyapi|hayir|1|0|60
  K04|altyapi|evet|3|2|48
  K05|altyapi|evet|1|1|365
  K06|uygulama|evet|2|0|52
  K07|uygulama|hayir|1|0|12
  K08|uygulama|evet|3|1|310
  K09|uygulama|evet|1|2|30
  K10|uygulama|hayir|2|1|24
  K11|kimlik|evet|2|2|120
  K12|kimlik|evet|1|0|48
  K13|kimlik|hayir|3|1|4
  K14|kimlik|evet|3|2|365
  K15|veri|evet|1|1|365
  K16|veri|hayir|2|0|30
  K17|veri|evet|2|2|12
  K18|veri|evet|3|0|4
  K19|saha|evet|1|2|18
  K20|saha|hayir|1|1|9
  K21|saha|evet|2|1|3
  K22|tedarik|evet|3|2|3
  K23|tedarik|hayir|2|2|2
  K24|tedarik|evet|1|0|1`)
  .map(([kod, ekip, bulgu, d, b, kalem]) => ({ kod, ekip, bulgu: bulgu === "evet",
    d: +d, b: +b, kalem: +kalem }));

// duzen | gorebildigi derinlik | tasidigi bagimsizlik | kontrol basina gun | orneklem orani
export const DUZEN = satir(`
  oz denetim|1|0|0.5|1
  uyum islevi|2|1|1.5|1
  bagimsiz ic denetim|3|2|3.5|1
  dis denetim|3|2|4.0|0.4`)
  .map(([ad, d, b, gun, ornek]) => ({ ad, d: +d, b: +b, gun: +gun, ornek: +ornek }));

export const BULGU = KONTROL.filter((k) => k.bulgu);
// Dis denetim orneklemi: kanit kalemi en cok olan kontroller secilir (model varsayimi).
export const kapsam = (z) => z.ornek === 1 ? KONTROL
  : [...KONTROL].sort((a, b) => b.kalem - a.kalem).slice(0, Math.round(KONTROL.length * z.ornek));
export const goren = (z) => kapsam(z).filter((k) => k.bulgu && k.d <= z.d && k.b <= z.b);

if (import.meta.url === `file://${process.argv[1]}`) {
  console.log(`model: ${KONTROL.length} kontrol, ${BULGU.length} gercek bulgu, ` +
    `${DUZEN.length} guvence duzeni`);

  const y = gen([22, 10, 10, 12, 12, 9, 13]);
  console.log("\n" + y("guvence duzeni", "kapsam", "goren", "gormeyen", "goren %", "gun",
    "gun / bulgu"));
  for (const z of DUZEN) {
    const g = goren(z), gun = kapsam(z).length * z.gun;
    console.log(y(z.ad, kapsam(z).length, g.length, BULGU.length - g.length,
      (100 * g.length / BULGU.length).toFixed(1), gun.toFixed(1),
      g.length ? (gun / g.length).toFixed(2) : "-"));
  }

  const z2 = gen([14, 12, 12, 13, 13]);
  console.log("\n" + z2("bagimsizlik", "bulgu", "oz denetim", "uyum islevi", "ic denetim"));
  for (const b of [0, 1, 2]) {
    const kume = BULGU.filter((k) => k.b === b);
    console.log(z2(`duzey ${b}`, kume.length,
      ...DUZEN.slice(0, 3).map((z) => kume.filter((k) => k.d <= z.d && k.b <= z.b).length)));
  }
  const gizli = BULGU.filter((k) => !goren(DUZEN[0]).includes(k));
  console.log(`\noz denetimde gorunmeyen ${gizli.length} bulgunun ` +
    `${gizli.filter((k) => k.b > 0).length} tanesi bagimsizlik, ` +
    `${gizli.filter((k) => k.b === 0).length} tanesi derinlik nedeniyle gorunmuyor`);
  const sG = [...DUZEN].sort((a, b) => goren(b).length - goren(a).length).map((z) => z.ad);
  const sV = [...DUZEN].sort((a, b) => (kapsam(a).length * a.gun) / (goren(a).length || 1) -
    (kapsam(b).length * b.gun) / (goren(b).length || 1)).map((z) => z.ad);
  console.log(`goren bulguya gore  : ${sG.join(" > ")}`);
  console.log(`birim gune gore     : ${sV.join(" > ")}`);
}
```

```
model: 24 kontrol, 17 gercek bulgu, 4 guvence duzeni

guvence duzeni            kapsam     goren    gormeyen     goren %      gun  gun / bulgu
oz denetim                    24         3          14        17.6     12.0         4.00
uyum islevi                   24         8           9        47.1     36.0         4.50
bagimsiz ic denetim           24        17           0       100.0     84.0         4.94
dis denetim                   10         9           8        52.9     40.0         4.44

bagimsizlik          bulgu  oz denetim  uyum islevi   ic denetim
duzey 0                  5           3            4            5
duzey 1                  5           0            4            5
duzey 2                  7           0            0            7

oz denetimde gorunmeyen 14 bulgunun 12 tanesi bagimsizlik, 2 tanesi derinlik nedeniyle gorunmuyor
goren bulguya gore  : bagimsiz ic denetim > dis denetim > uyum islevi > oz denetim
birim gune gore     : oz denetim > dis denetim > uyum islevi > bagimsiz ic denetim
```

İlk tablonun ilk satırı dersin ana sayısıdır. Kontrolü kuran ekip kendi kontrolünü denetlediğinde
17 gerçek bulgunun **üçü** görünür; 14'ü hiç raporlanmaz. Bu, kötü niyet varsayımı gerektirmez:
aynı ekip aynı varsayımlarla bakar, aynı kaydı aynı biçimde okur ve kendi tasarımının dışında bir
soru sormaz. İkinci tablo bunu nedenine ayırıyor — görünmeyen 14 bulgunun 12'si bağımsızlık, ikisi
derinlik nedeniyle gizli kalıyor. **Sorun ağırlıklı olarak yetkinlik değil, konumdur.**

İkinci tablonun satırları bunu ayrıntılandırıyor. Bağımsızlık düzeyi 0 olan beş bulgunun üçü öz
denetimde görülüyor; düzey 1 ve düzey 2 bulgularının **hiçbiri** görülmüyor. Uyum işlevi — ayrı bir
ekip ama aynı yönetim hattı — düzey 0 ve 1'i açıyor, düzey 2'nin yedisini hâlâ göremiyor. Yedi bulgu
yalnız ayrı raporlama hattıyla ortaya çıkıyor. Bir bulgunun görülmesi için gereken bağımsızlığı
belirleyen şey bulgunun büyüklüğü değil, kimin işini yanlış göstereceğidir.

Son iki satır kursun ölçü eksenini bu derse taşıyor ve iki sıralama **iki ucunda yer
değiştiriyor**; ortadaki iki düzenin bağıl sırası ikisinde de aynı kalıyor. Gören
bulguya göre bağımsız iç denetim birincidir; birim güne göre sonuncudur. Öz denetim gördüğü bulgu
başına 4,00 gün harcıyor, bağımsız iç denetim 4,94. Bu sayı tek başına okunduğunda öz denetimi
verimli gösterir; oysa öz denetimin ucuzluğu **gördüğü üç bulganın en kolay görülenler olmasının**
yan ürünüdür. Kolay bulguları bulup zorları hiç aramayan bir düzen, bulgu başına maliyette her zaman
kazanır. Bir güvence düzenini yalnız birim maliyetle seçmek, körlüğü ödüllendirir.

#### Ayrımın Bedeli ve Kısmi Ayrım

```js
// rol/ayrim.mjs — cikar ayriminin ortaya cikardigi bulgu ve getirdigi ek is.
import { KONTROL, DUZEN, BULGU, gen, goren, kapsam } from "./guvence.mjs";

const ONAY = 0.4;      // ayrimdan sonra kontrol basina ek onay adimi (gun, kurgu)
const DEVIR = 0.2;     // ekipler arasi devir (gun/kontrol, kurgu)
const KAYIT = 2;       // her bagimsiz inceleme donemde 2 ek kanit kalemi uretir (kurgu)

const gun = (z) => kapsam(z).length * z.gun;
const ekIs = (z) => (z.b === 0 ? 0 : kapsam(z).length * (ONAY + DEVIR * z.b));
const ekKayit = (z) => (z.b === 0 ? 0 : kapsam(z).length * KAYIT);

const y = gen([22, 11, 14, 13, 12, 17]);
console.log(`${KONTROL.length} kontrol, ${BULGU.length} gercek bulgu; oz denetimde ` +
  `${goren(DUZEN[0]).length} tanesi gorunuyor`);
console.log("\n" + y("guvence duzeni", "goren", "ortaya cikan", "denetim gun", "ek is gun",
  "ek kanit kalemi"));
for (const z of DUZEN) {
  console.log(y(z.ad, goren(z).length, goren(z).length - goren(DUZEN[0]).length,
    gun(z).toFixed(1), ekIs(z).toFixed(1), ekKayit(z)));
}

// Hibrit duzen: kanit hacmi en yuksek N kontrolde bagimsiz denetim, kalanda oz denetim.
const sirali = [...KONTROL].sort((a, b) => b.kalem - a.kalem);
const z2 = gen([16, 12, 12, 13, 13, 14]);
console.log("\n" + z2("hibrit sinir", "bagimsiz", "goren", "kacan", "denetim gun",
  "gun / bulgu"));
for (const n of [0, 6, 12, 18, 24]) {
  const bagimsiz = new Set(sirali.slice(0, n).map((k) => k.kod));
  const g = KONTROL.filter((k) => k.bulgu && (bagimsiz.has(k.kod)
    ? k.d <= DUZEN[2].d && k.b <= DUZEN[2].b : k.d <= DUZEN[0].d && k.b <= DUZEN[0].b));
  const toplam = n * DUZEN[2].gun + (KONTROL.length - n) * DUZEN[0].gun;
  console.log(z2(`${n} kontrol`, n, g.length, BULGU.length - g.length, toplam.toFixed(1),
    (toplam / g.length).toFixed(2)));
}

// Ekip basina gizli kalan bulgu
const ekipler = [...new Set(KONTROL.map((k) => k.ekip))];
const gorunen = new Set(goren(DUZEN[0]).map((k) => k.kod));
const z3 = gen([12, 10, 10, 12, 14]);
console.log("\n" + z3("ekip", "kontrol", "bulgu", "gorunen", "gizli kalan"));
for (const e of ekipler) {
  const k = KONTROL.filter((x) => x.ekip === e), b = k.filter((x) => x.bulgu);
  console.log(z3(e, k.length, b.length, b.filter((x) => gorunen.has(x.kod)).length,
    b.filter((x) => !gorunen.has(x.kod)).length));
}
const enGizli = ekipler.map((e) => ({ e, n: KONTROL.filter((x) => x.ekip === e && x.bulgu &&
  !gorunen.has(x.kod)).length })).sort((a, b) => b.n - a.n)[0];
console.log(`\noz denetimde en cok bulgusu gizli kalan ekip: ${enGizli.e} (${enGizli.n} bulgu)`);
console.log(`tam ayrim ${goren(DUZEN[2]).length - goren(DUZEN[0]).length} bulgu ortaya ` +
  `cikariyor; bedeli ${(gun(DUZEN[2]) - gun(DUZEN[0])).toFixed(1)} denetim gunu, ` +
  `${ekIs(DUZEN[2]).toFixed(1)} ek is gunu ve ${ekKayit(DUZEN[2])} ` +
  `ek kanit kalemi`);
```

```
24 kontrol, 17 gercek bulgu; oz denetimde 3 tanesi gorunuyor

guvence duzeni              goren  ortaya cikan  denetim gun   ek is gun  ek kanit kalemi
oz denetim                      3             0         12.0         0.0                0
uyum islevi                     8             5         36.0        14.4               48
bagimsiz ic denetim            17            14         84.0        19.2               48
dis denetim                     9             6         40.0         8.0               20

hibrit sinir        bagimsiz       goren        kacan  denetim gun   gun / bulgu
0 kontrol                  0           3           14         12.0          4.00
6 kontrol                  6           8            9         30.0          3.75
12 kontrol                12          12            5         48.0          4.00
18 kontrol                18          14            3         66.0          4.71
24 kontrol                24          17            0         84.0          4.94

ekip           kontrol     bulgu     gorunen   gizli kalan
altyapi              5         4           1             3
uygulama             5         3           0             3
kimlik               4         3           1             2
veri                 4         3           0             3
saha                 3         2           0             2
tedarik              3         2           1             1

oz denetimde en cok bulgusu gizli kalan ekip: altyapi (3 bulgu)
tam ayrim 14 bulgu ortaya cikariyor; bedeli 72.0 denetim gunu, 19.2 ek is gunu ve 48 ek kanit kalemi
```

Birinci tablo ayrımın bedelini üç ayrı kaleme bölüyor ve üçü farklı yerlerden çıkıyor. Tam ayrım 14
bulgu ortaya çıkarıyor; karşılığında 72 denetim günü, 19,2 ek iş günü ve 48 ek kanıt kalemi
getiriyor. Denetim günü denetçinin işidir; ek iş günü **kurulan tarafın** işidir — ek onay adımları
ve ekipler arası devir, denetçiye değil, kontrolü işleten ekibe düşer. Ek kanıt kalemi ise üçüncü
derste sayılan yüke doğrudan eklenir: bağımsız inceleme kendi kaydını üretir ve o kayıt da
saklanır, derlenir, örneklenir. **Bağımsızlık ücretsiz değildir ve faturasının üçte ikisi denetlenen
tarafa çıkar.**

Dış denetim satırı bunun yanında ilginç bir karşılaştırma veriyor. Bağımsız iç denetimle aynı
derinliği ve aynı bağımsızlığı taşıyor, ama örneklemi kontrollerin yüzde 40'ıdır ve 17 bulgunun
dokuzunu görüyor. Örneklem kanıt hacmine göre seçildiği için sistematik bir eğilim taşıyor: çok kayıt
üreten kontroller görülüyor, az kayıt üreten kontroller görülmüyor. Kanıt hacmi ile bulgunun önemi
arasında bir bağ olmadığı için bu, kapsamı daraltmanın en sessiz biçimidir.

İkinci tablo kısmi ayrımı tarıyor ve eğri düz değil. Altı kontrolde bağımsız denetim uygulamak
bulguyu üçten sekize çıkarıyor ve bulgu başına maliyeti 4,00'ten **3,75'e düşürüyor** — hem tam öz
denetimden hem tam ayrımdan iyidir. Sınır 12'ye çıkınca birim maliyet başlangıç değerine dönüyor,
18 ve 24'te yükseliyor. Nedeni açıktır: ilk eklenen kontroller kanıt hacmi en yüksek olanlardır ve
içlerinde bulgu yoğunluğu fazladır; sonraki eklemeler gitgide daha az bulgu getirir. **Bağımsızlık
azalan verim gösterir**, ama kalan beş, üç ve sıfır bulgu farkı da gerçektir; hangisinin kabul
edileceği bir karardır ve bu kararın sayısı yazılmalıdır.

Son tablo ayrımın nerede en çok işe yaradığını gösteriyor. Öz denetimde altyapı, uygulama ve veri
ekiplerinin üçer bulgusu gizli kalıyor; tedarik ekibinde yalnız bir bulgu gizli kalıyor. Ayrımı
bütün kuruma aynı anda uygulamak gerekmiyor — bulgu yoğunluğunun ve gizlilik derecesinin yüksek
olduğu ekiplerden başlamak, aynı günle daha çok bulgu çıkarır. Bunun bilinmesi için de bir ölçüme
gerek vardır ve o ölçüm ancak bir kez bağımsız yapıldıktan sonra elde edilir.

#### Özet

- Bağımsız güvence iki boyutlu bir düzenlemedir: derinlik bulgunun ne kadar inceleme istediğini,
  bağımsızlık raporlayanın sahiple arasındaki mesafeyi verir. Bulgu ancak iki koşul birden
  sağlandığında görünür.
- Kontrolü kuran ekip kendi kontrolünü denetlediğinde 17 gerçek bulgunun yalnız üçü görünüyor;
  görünmeyen 14 bulgunun 12'si bağımsızlık, ikisi derinlik nedeniyle gizli kalıyor.
- Uyum işlevi düzey 0 ve 1 bulgularını açıyor ama düzey 2'nin yedisini göremiyor: bir bulgunun
  gerektirdiği bağımsızlığı belirleyen şey büyüklüğü değil, kimin işini yanlış göstereceğidir.
- Gören bulgu sıralaması ile birim gün sıralaması iki uçta yer değiştiriyor: öz denetim bulgu
  başına 4,00,
  bağımsız iç denetim 4,94 gün harcıyor. Öz denetimin ucuzluğu, yalnız kolay bulguları görmesinin
  yan ürünüdür.
- Tam ayrım 14 bulgu ortaya çıkarıyor ve üç kalem bedel getiriyor: 72 denetim günü, 19,2 ek iş günü
  ve 48 ek kanıt kalemi. Ek iş günü denetçiye değil, kontrolü işleten ekibe düşer.
- Kısmi ayrım azalan verim gösteriyor: altı kontrolde bağımsız denetim bulguyu 8'e çıkarıp birim
  maliyeti 3,75'e düşürüyor; 24 kontrolde bulgu 17'ye çıkıyor ama birim maliyet 4,94'e yükseliyor.

#### Sonraki Adım

Konu burada kapanıyor. Başında bir sorun vardı: önceki konunun sıralaması kurumun kendi diliyle
yazılmıştı ve dışarıdan okunamıyordu. Yedi ders bir ortak dil kurdu ve o dilin bedelini saydı — beş
işleve bölünmüş bir olgunluk ölçüsü, kapsamı yazılan bir belgelendirme döngüsü, kontrolü gereksinime
bağlayan bir matris, veri türüne bağlanan ek kontroller, kalem kalem sayılan haklar, kanıt üreten ve
üretmeyen belge düzeyleri ve bulguyu görünür kılan bir çıkar ayrımı. Her birinin sayısı yazıldı ve
her birinde aynı şey görüldü: **eşleme bir iddiadır, kanıt ayrı bir kalemdir.**

Bu ortak dilin bir sınırı var ve bütün konu boyunca sessizce duruyordu. Olgunluk düzeyi bir tarihte
hesaplandı, belge bir tarihte verildi, kontrol kümesi bir dönem için örneklendi, kanıt dosyası bir
denetim için derlendi. Hepsi **yılda bir kez** doğru olan bir fotoğraftır. Aradaki her gün yeni bir
açık açılıyor, bir yama penceresi kaçıyor, eğitimden sonra düzelen davranış eski hâline dönüyor ve
tatbikat edilmemiş bir kurtarma planı sessizce eskiyor. Fotoğrafın doğru olması, iki fotoğraf
arasındaki 364 gün hakkında hiçbir şey söylemez.

Sonraki konu `Program Yönetimi` bu 364 günü ölçer: açık akışının hızıyla düzeltme kapasitesinin
farkını, yama penceresi daraldıkça yakalanan açık ile artan kesintiyi, farkındalık ölçütünün kaçıncı
haftada eski değerine döndüğünü, tatbikatta tutmayan plan kalemini ve davranışı hiç değiştirmeyen
ölçütü.

## Program Yönetimi

Yıllık fotoğrafın arasındaki her günü ölçen beş ders: açık yönetimi programında gelen bulgu akışı ile düzeltme kapasitesi arasındaki fark ve kuyruğun büyümesi, yama penceresi daraldıkça yakalanan açık ile plan dışı kesintinin kesiştiği nokta, farkındalık kazancının gruplara göre erimesi ve dönüş haftası, tatbikatta tutmayan plan kalemi ile hedef sürenin ölçülen süreden farkı, ve son olarak davranışı değiştiren ölçüt ile yalnız rapora giren ölçütün ayrılması.

### Açık Yönetimi Programı

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/acik-yonetimi-programi

52 haftada gelen 884 bulguya karşı haftalık 84 adam-saatlik düzeltme kapasitesi: 13,2 saatlik açıklık yıl sonunda 684 saatlik bir kuyruk bırakıyor, dört önceliklendirme kuralı aynı kümede 709 ile 843 arasında kalem kapatıyor ve risk maruziyeti 6.681 ile 18.511 puan-hafta arasında değişiyor. Kuralın değeri kapasiteye bağlı: 101 saat/haftada kuyruk boşalıyor, 109 saat/haftada kuralların sırası tersine dönüyor.

Önceki konu ortak bir dil kurdu: kontroller gereksinimlere eşlendi, kanıtsız kalan gereksinim
sayıldı ve dışarıdan bakan birinin ne göreceği ölçüldü. Bu ölçümlerin hepsinin ortak bir özelliği
var — yılda bir kez doğrudurlar. Belgelendirme fotoğrafı çekildiği anda geçerlidir; ertesi sabah
yeni bir bulgu düşer, bir yama gecikir ve bir kullanıcı eski alışkanlığına döner. Bu konunun beş
dersi iki fotoğraf arasındaki günleri ölçer.

İlk ders bulgunun kendisiyle başlar. Bir tarama düzeni her hafta yeni kalem üretir, düzeltme
ekibinin haftalık kapasitesi sabittir ve ikisi eşit değildir. Program ölçeğinde sorulan soru "bu
bulgu ne kadar ciddi" değildir; o soru Güvenlik Araçları ve Sızma Testi kursunda kanıtlanmış bulgu
düzeyinde ölçüldü ve buraya tek bir puan sütunu olarak girer. Buradaki soru şudur: **gelen akış
kapasiteden büyükse hangi kalem bekler ve beklemenin karşılığı nedir.**

Ölçü birimi **puan-hafta**dır: bir kalemin puanı ile açık kaldığı hafta sayısının çarpımı. Kapatılan
kalem sayısı bir çıktı ölçüsüdür; toplam puan-hafta — bu derste **risk maruziyeti** — programın
gerçekten düşürdüğü şeyi verir ve düşük olması istenir.

- **GP1.** 52 haftalık ufuk, altı varlık sınıfı ve haftalık bulgu akışı kurgusal bölgesel ölçüm
  ağına aittir ve **modeldir**. Gerçek bir tarama koşulmuyor, gerçek bir varlık taranmıyor.
- **GP2.** Puan sütunu dışarıdan gelen bir girdidir. Bir bulgunun nasıl kanıtlandığı ve nasıl
  puanlandığı bu derste yeniden türetilmez.
- **GP3.** Çaba adam-saat cinsindendir ve düzeltme boyunca değişmez. Gerçekte aynı sınıftaki ilk
  düzeltme sonrakileri ucuzlatır; bu öğrenme etkisi modellenmedi.
- **GP4.** Kapasite haftalık sabittir ve bölünebilir: yarım kalan kalem ertesi hafta kaldığı yerden
  sürer. Bağlam değiştirme bedeli yok sayıldı.
- **GP5.** Kapatılan kalem yeniden açılmaz ve düzeltmenin kendisi yeni bulgu üretmez.
- **GP6.** Rastgelelik üreteci ders içinde yazılıdır ve tohum görünürdür.

```js
// acik/model.mjs — acik yonetimi programinin MODELIDIR: kurgu bolgesel olcum aginda haftalik
// bulgu akisi, sabit duzeltme kapasitesi ve kuyruk. Gercek bir tarama kosmuyor; puan sutunu
// disaridan gelen bir girdidir.
export const TOHUM = 20260803, HAFTA = 52, KAPASITE = 84, YASLI = 12, YUKSEK = 7;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

export const SINIF = [
  // ad, haftalik yeni bulgu, puan egilimi (0-10), caba egilimi (adam-saat)
  { ad: 'saha-ucu', hafta: 6, puan: 5.2, caba: 3 },
  { ad: 'sube-ucu', hafta: 3, puan: 5.8, caba: 4 },
  { ad: 'toplayici', hafta: 2, puan: 6.6, caba: 9 },
  { ad: 'islem-sunucusu', hafta: 2, puan: 7.1, caba: 14 },
  { ad: 'ag-aygiti', hafta: 1, puan: 6.0, caba: 7 },
  { ad: 'bulut-hesabi', hafta: 3, puan: 6.3, caba: 5 },
];

export const AKIS = (() => {
  const r = uretec(TOHUM); const liste = []; let no = 0;
  for (let h = 1; h <= HAFTA; h += 1)
    for (const s of SINIF)
      for (let k = 0; k < s.hafta; k += 1) {
        const p = Math.min(10, Math.max(1, s.puan + (r() - 0.5) * 4.4));
        liste.push({ no: (no += 1), gelis: h, sinif: s.ad,
          puan: +p.toFixed(1), caba: Math.max(1, Math.round(s.caba * (0.5 + r()))) });
      }
  return liste;
})();
export const gelen = (h) => AKIS.filter((b) => b.gelis === h);
export const TALEP = AKIS.reduce((a, b) => a + b.caba, 0) / HAFTA;

export const KURAL = {
  'puan': (b) => b.puan,
  'puan/caba': (b) => b.puan / b.caba,
  'gelis sirasi': (b) => -b.gelis,
  'puan + yas': (b, h) => b.puan + 0.25 * (h - b.gelis),
};

// Kuyruk: her hafta gelenler eklenir, kural sirasi uygulanir, kapasite tepeden harcanir.
// Sigmayan kalem yarim kalir ve ertesi hafta kaldigi yerden surer.
export function kosum(ad, kapasite = KAPASITE) {
  const kural = KURAL[ad]; const kuyruk = []; const kapanan = [];
  for (let h = 1; h <= HAFTA; h += 1) {
    for (const b of gelen(h)) kuyruk.push({ ...b, kalan: b.caba });
    kuyruk.sort((a, b) => kural(b, h) - kural(a, h) || a.no - b.no);
    let bos = kapasite;
    while (bos > 0 && kuyruk.length) {
      const b = kuyruk[0];
      if (b.kalan <= bos) { bos -= b.kalan; kapanan.push({ ...b, kapanis: h }); kuyruk.shift(); }
      else { b.kalan -= bos; bos = 0; }
    }
  }
  const acikHafta = (b) => (b.kapanis ?? HAFTA + 1) - b.gelis;
  const hepsi = [...kapanan, ...kuyruk];
  const yuksek = kapanan.filter((b) => b.puan >= YUKSEK);
  return { ad, kapanan: kapanan.length, puan: kapanan.reduce((a, b) => a + b.puan, 0),
    maruziyet: hepsi.reduce((a, b) => a + b.puan * acikHafta(b), 0),
    kuyruk: kuyruk.length, saat: kuyruk.reduce((a, b) => a + b.kalan, 0),
    yuksekSure: yuksek.reduce((a, b) => a + acikHafta(b), 0) / yuksek.length,
    yasli: kuyruk.filter((b) => HAFTA - b.gelis + 1 > YASLI).length,
    yuksekAcik: kuyruk.filter((b) => b.puan >= YUKSEK).length };
}
```

#### Akış ile Kapasite Arasındaki Fark

```js
// acik/akis.mjs — gelen bulgu akisi, duzeltme kapasitesi ve dort onceliklendirme kuralinin
// ayni kume uzerindeki sonucu
import { AKIS, SINIF, HAFTA, KAPASITE, TALEP, YASLI, YUKSEK, KURAL, kosum } from './model.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());

console.log(`${HAFTA} haftada ${AKIS.length} bulgu, ${SINIF.length} varlik sinifi; ` +
  `haftalik talep ${TALEP.toFixed(1)} adam-saat, kapasite ${KAPASITE} adam-saat`);
console.log(`aciklik ${(TALEP - KAPASITE).toFixed(1)} adam-saat/hafta; ` +
  `puani ${YUKSEK} ve uzeri olan ${AKIS.filter((b) => b.puan >= YUKSEK).length} kalem`);

const A = [-14, 8, 10, 11, 12, 13, 13];
console.log('\n1. sinif basina akis');
y(A, 'sinif', 'kalem', 'ort puan', 'ort caba', 'saat/hafta');
for (const s of SINIF) {
  const l = AKIS.filter((b) => b.sinif === s.ad);
  y(A, s.ad, l.length, (l.reduce((a, b) => a + b.puan, 0) / l.length).toFixed(1),
    (l.reduce((a, b) => a + b.caba, 0) / l.length).toFixed(1),
    (l.reduce((a, b) => a + b.caba, 0) / HAFTA).toFixed(1));
}

console.log('\n2. dort onceliklendirme kurali, ayni kume, ayni kapasite');
y(A, 'kural', 'kapanan', 'kapatilan', 'maruziyet', 'yetisemeyen', `${YASLI} haftadan`,
  `acik puan>=${YUKSEK}`);
y(A, '', 'kalem', 'puan', 'puan-hafta', 'kalem', 'yasli', 'kalem');
for (const k of Object.keys(KURAL)) {
  const x = kosum(k);
  y(A, k, x.kapanan, x.puan.toFixed(0), Math.round(x.maruziyet), x.kuyruk, x.yasli, x.yuksekAcik);
}
```

```
52 haftada 884 bulgu, 6 varlik sinifi; haftalik talep 97.2 adam-saat, kapasite 84 adam-saat
aciklik 13.2 adam-saat/hafta; puani 7 ve uzeri olan 228 kalem

1. sinif basina akis
sinif            kalem  ort puan   ort caba  saat/hafta
saha-ucu           312       5.3        3.0        18.2
sube-ucu           156       5.8        4.0        11.9
toplayici          104       6.6        8.9        17.8
islem-sunucusu     104       7.0       13.8        27.7
ag-aygiti           52       5.7        7.0         7.0
bulut-hesabi       156       6.5        4.9        14.6

2. dort onceliklendirme kurali, ayni kume, ayni kapasite
kural          kapanan kapatilan  maruziyet yetisemeyen  12 haftadan acik puan>=7
                 kalem      puan puan-hafta       kalem        yasli        kalem
puan               709      4579      18219         175          122            0
puan/caba          843      5050       6681          41           27            6
gelis sirasi       763      4564      18511         121            0           33
puan + yas         747      4593      18208         137           12            9
```

İlk tablo dersin başlangıç koşulunu veriyor ve tek bir satırı okumak yeter: haftalık talep 97,2
adam-saat, kapasite 84. Aradaki 13,2 saatlik açıklık her hafta yeniden doğuyor ve elli iki hafta
sonunda 684 saatlik bir kuyruk bırakıyor. Bu, hiçbir önceliklendirme kuralının kapatamayacağı bir
farktır; kural yalnız **hangi kalemin** beklediğine karar verir.

Sınıf satırları farkın nereden geldiğini gösteriyor. Saha uçları en çok kalemi üretiyor (312) ama
kalem başına yalnız 3 saat tutuyor; işlem sunucuları üç kat daha az kalem üretiyor (104) ve
haftalık talebin en büyük payını alıyor (27,7 saat). Aynı sınıf en yüksek ortalama puanı da taşıyor.
Pahalı ve yüksek puanlı kalemlerin aynı sınıfta toplanması, sonraki tablodaki bütün gerilimin
kaynağıdır.

#### Dört Kural, İki Farklı Yanıt

İkinci tablo aynı 884 kalemi aynı kapasiteyle dört ayrı sırayla işliyor. Saf puan sırası 709 kalem
kapatıyor; puanı çabaya bölen sıra 843. İkincisi yalnız kalem sayısında değil, **kapatılan toplam
puanda da** öndedir (5.050'ye karşı 4.579). Bu şaşırtıcı görünebilir, çünkü saf puan sırası tanım
gereği en yüksek puanlı kalemi önce alır. Nedeni tabloda: en yüksek puanlı sınıf aynı zamanda en
pahalı olandır ve pahalı bir kalem üzerinde geçen süre, aynı sürede kapatılabilecek dört buçuk
ucuz kalemi bekletir.

Risk maruziyeti farkı daha büyüktür: 18.219 puan-haftaya karşı 6.681, yaklaşık 2,7 kat. Geliş
sırasıyla çalışan kuyruk en kötüsüdür (18.511) ve nedeni sütunlarda görünüyor — bu kuralda on iki
haftadan yaşlı **tek bir kalem yok**, ama açık kalan 33 kalemin puanı 7 ve üzeridir. Kuyruğun genç
olması riskin düşük olduğu anlamına gelmiyor; yalnız kimsenin uzun süre beklemediği anlamına
geliyor.

Son iki sütun kuralların sıralamasını tersine çeviriyor. Saf puan sırası 122 kalemi on iki haftadan
uzun süre bekletiyor ama açık bıraktığı yüksek puanlı kalem sayısı **sıfırdır**: bu kural hiçbir
zaman yüksek bir kalemi aç bırakmaz, onun yerine düşük puanlı her şeyi süresiz erteler. Puanı çabaya
bölen kural ise altı yüksek puanlı kalemi açık bırakıyor ve bunlar tam olarak pahalı olanlardır.
**Aynı veriden iki farklı öncelik çıkıyor**: maruziyete bakan yönetici puan/çaba kuralını, "hiçbir
yüksek kalem açıkta kalmasın" kuralını benimseyen yönetici saf puanı seçer. İki karar da aynı
tablodan destek bulur.

#### Kuralın Değeri Kapasiteye Bağlı

```js
// acik/kapasite.mjs — kapasite degistikce kuralin degeri: hangi noktada kuyruk bosaliyor ve
// hangi noktada kurallarin sirasi degisiyor
import { TALEP, KURAL, kosum } from './model.mjs';

const AD = Object.keys(KURAL);
const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const A = [-10, 8, 11, 11, 13, 11, 13, 11];

y(A, 'kapasite', 'talebin', ...AD, 'en dusuk');
y(A, 'saat/hf', 'kati', 'maruziyet', 'maruziyet', 'maruziyet', 'maruziyet', 'maruziyet');
for (let c = 84; c <= 120; c += 6) {
  const s = AD.map((k) => kosum(k, c));
  const m = Math.round(Math.min(...s.map((x) => x.maruziyet)));
  const en = AD.filter((_, i) => Math.round(s[i].maruziyet) === m);
  y(A, c, (c / TALEP).toFixed(2), ...s.map((x) => Math.round(x.maruziyet)),
    en.length === 1 ? en[0] : 'esit');
}

const bos = (() => { for (let c = 84; c <= 160; c += 1)
  if (AD.every((k) => kosum(k, c).kuyruk === 0)) return c; })();
const donus = (() => { for (let c = 84; c <= 160; c += 1) {
  const s = AD.map((k) => kosum(k, c).maruziyet);
  if (s[1] > s[0]) return c; } })();
console.log(`\nkuyrugun dort kuralda da bosaldigi ilk kapasite: ${bos} saat/hafta ` +
  `(talebin ${(bos / TALEP).toFixed(2)} kati)`);
console.log(`kural sirasinin degistigi kapasite: ${donus} saat/hafta ` +
  `(talebin ${(donus / TALEP).toFixed(2)} kati); altinda puan/caba, ustunde puan onde`);
for (const c of [84, bos, donus]) {
  const s = AD.map((k) => kosum(k, c).maruziyet);
  console.log(`  ${String(c).padStart(3)} saat/hafta: en iyi ile en kotu kural arasi ` +
    `${(Math.max(...s) - Math.min(...s)).toFixed(0)} puan-hafta ` +
    `(${(Math.max(...s) / Math.max(1, Math.min(...s))).toFixed(1)} kat)`);
}
```

```
kapasite   talebin       puan  puan/caba gelis sirasi puan + yas     en dusuk
saat/hf       kati  maruziyet  maruziyet    maruziyet  maruziyet    maruziyet
84            0.86      18219       6681        18511      18208    puan/caba
90            0.93      10663       3671         9881       9884    puan/caba
96            0.99       1615        831         1578       1689    puan/caba
102           1.05        281        181          353        297    puan/caba
108           1.11         74         55           89         74    puan/caba
114           1.17         11         14           11         11         esit
120           1.24          0          0            0          0         esit

kuyrugun dort kuralda da bosaldigi ilk kapasite: 101 saat/hafta (talebin 1.04 kati)
kural sirasinin degistigi kapasite: 109 saat/hafta (talebin 1.12 kati); altinda puan/caba, ustunde puan onde
   84 saat/hafta: en iyi ile en kotu kural arasi 11831 puan-hafta (2.8 kat)
  101 saat/hafta: en iyi ile en kotu kural arasi 233 puan-hafta (2.0 kat)
  109 saat/hafta: en iyi ile en kotu kural arasi 34 puan-hafta (1.6 kat)
```

Üçüncü tablo kuralı sabit tutup kapasiteyi değiştiriyor ve iki ayrı eşik veriyor. Birincisi 101
saat/haftadır: talebin 1,04 katına çıkıldığında dört kuralın hepsinde kuyruk boşalıyor, yani
yetişemeyen kalem sıfır oluyor. İkincisi 109 saat/haftadır ve bu dersin asıl kanıtıdır — o noktada
**kuralların sırası tersine dönüyor**. Kapasite dar olduğu sürece puanı çabaya bölen kural en düşük
maruziyeti verir; kapasite talebin 1,12 katını geçtiğinde saf puan sırası öne çıkar. Bolluk varken
hiçbir kalem aç kalmadığı için ucuzu öne almanın kazancı biter ve yüksek puanlıya önce dokunmak
maruziyeti daha çok düşürür.

Son üç satır kuralın ne kadar değerli olduğunu ölçüyor. 84 saat/haftada en iyi kuralla en kötüsü
arasında 11.831 puan-hafta var; 101'de bu fark 233'e, 109'da 34'e iniyor. Kural bir darlık
aracıdır ve darlık azaldıkça değeri erir.

Aynı sayılar iki müdahaleyi de karşılaştırılabilir kılıyor. Kapasite 84'te sabitken kuralı
değiştirmek maruziyeti 18.219'dan 6.681'e indiriyor. Kuralı en iyi seçenekte tutup kapasiteyi 84'ten
101'e — yüzde yirmi — çıkarmak ise 6.681'i 233'e indiriyor. İkinci hamle maruziyeti yaklaşık
yirmi dokuz kata bölüyor, birincisi ise yalnız iki koma yediye. **Önceliklendirme kuralı üzerinde
tartışmak, kapasite açıklığı yazılmadığında
ölçüsüz bir tartışmadır**; iki sayı yan yana yazıldığında hangi kararın büyük olduğu görünür.

#### Özet

- 52 haftada 884 bulgu haftalık 97,2 adam-saat talep üretiyor, kapasite 84 adam-saat: 13,2 saatlik
  açıklık yıl sonunda 684 saatlik bir kuyruk bırakıyor ve hiçbir kural bu farkı kapatmaz.
- Puanı çabaya bölen kural saf puan sırasından hem daha çok kalem (843'e karşı 709) hem daha çok
  puan (5.050'ye karşı 4.579) kapatıyor; risk maruziyeti 6.681'e karşı 18.219 puan-hafta.
- Aynı tablo iki farklı öncelik veriyor: maruziyete bakan puan/çaba kuralını seçer, "hiçbir yüksek
  puanlı kalem açıkta kalmasın" ölçütü saf puanı seçer (0'a karşı 6 açık yüksek kalem).
- Geliş sırasıyla çalışan kuyrukta on iki haftadan yaşlı kalem yok ama açık kalan 33 kalemin puanı
  7 ve üzeri: genç kuyruk düşük risk demek değildir.
- Kuyruk 101 saat/haftada (talebin 1,04 katı) boşalıyor; 109 saat/haftada kuralların sırası tersine
  dönüyor ve saf puan öne geçiyor. Kural bir darlık aracıdır.
- Kapasiteyi yüzde yirmi artırmak maruziyeti 6.681'den 233'e indiriyor; en iyi kuralı seçmek
  18.219'dan 6.681'e. İkinci hamle maruziyeti yirmi dokuz kata, birincisi iki koma yediye bölüyor.

#### Sonraki Adım

Bu ders düzeltmeyi tek boyutlu bir işlem saydı: bir kaleme adam-saat harcanır ve kalem kapanır.
Gerçekte her düzeltme bir **değişikliktir** ve değişiklik üretim ortamına dokunur. Kalemi hızlı
kapatmak, onu sınamadan uygulamak demektir; sınamak ise açık kalma süresini uzatır. Sonraki ders
bu dengeyi ölçer: yama penceresi daraldıkça istismar edilebilir hâle gelmeden yakalanan açık sayısı
artıyor, ama aynı daralma sınama kapsamını düşürüp plan dışı kesinti üretiyor. İki eğri aynı eksen
üzerinde çizilir ve kesiştikleri nokta hesaplanır — o nokta, hız ile riskin eşitlendiği pencere
uzunluğudur.

### Yama ve Değişiklik Yönetimi

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/yama-ve-degisiklik-yonetimi

Kırk duyuruluk bir kümede pencere uzunluğu bir karar değişkeni olarak koşturuluyor: pencere kısaldıkça yakalanan açık 23'ten 30'a çıkıyor ama plan dışı kesinti 9'dan 50'ye yükseliyor, iki eğri dokuzuncu günde kesişiyor ve kesintinin bedeli 900'den 14.000 risk birimine çıkarıldığında en iyi pencere 1 günden 17 güne kayıyor. Onay kapısı hata çarpanını düşürerek pencereyi kısaltıyor, iki yollu düzen tek pencereyi 207.637'den 130.159 risk birimine indiriyor ve on iki duyuruluk sınıflandırma hatası bu kazancın onda dokuzunu geri alıyor.

Bir önceki ders düzeltmeyi tek boyutlu bir işlem saydı: bir kaleme adam-saat harcanır ve kalem
kapanır. Gerçekte her düzeltme bir **değişikliktir** ve değişiklik üretim ortamına dokunur. Kalemi
hızlı kapatmak onu eksik sınayıp uygulamak demektir; tam sınamak ise kalemi daha uzun süre açık
tutar. Bu ders o dengeyi tek bir karar değişkeni üzerinde ölçer: **yama penceresi**, yani duyurunun
yayımlandığı gün ile yamanın uygulandığı gün arasındaki süre.

Pencerenin filo tarafındaki mekaniği — bakım takvimi, turu kaçıran makine, nokta-günü — Uç Nokta ve
Sistem Sertleştirme kursunda ölçüldü ve burada girdi olarak alınır. Buradaki soru program
ölçeğindedir ve iki eğri arasındadır: pencere kısaldıkça **istismar erişilebilir hâle gelmeden
yakalanan açık** sayısı artar, aynı daralma sınama kapsamını düşürüp **plan dışı kesinti** üretir.
İki eğri aynı eksende çizilir ve kesiştikleri nokta hesaplanır.

- **GP7.** Kırk duyuru, etkilenen varlık sayıları ve istismarın erişilebilir hâle geldiği gün
  kurgusal bölgesel ölçüm ağına aittir ve **modeldir**. Gerçek bir yama indirilmiyor.
- **GP8.** Sınama kapsamı pencere uzunluğuyla doğrusal artar ve yirmi bir günde tamamlanır; hata
  oranı eksik kapsamın karesiyle büyür. Gerçekte eğri sıçramalıdır.
- **GP9.** Risk birimi (rb) **kurgudur**; gerçek bir para birimi değildir. Bir plan dışı kesinti
  3.600 rb sayıldı. Bu bir varsayımdır ve ikinci blok onu değiştirdiğinde sonucun ne olduğunu ölçer.
- **GP10.** İstismarın erişilebilir olduğu gün modelde bilinir. Gerçekte kestirilir; son blok
  kestirimin yanlış olmasının bedelini ölçer.
- **GP11.** Onay kapısının hata çarpanı sabittir ve kapının kendisi kusur üretmez.
- **GP12.** Kusurlu yama, geri alma ve kademeli dağıtım modellenmedi; üçü de sabit sayılır.

```js
// yama/model.mjs — pencere uzunlugunun MODELIDIR: kurgu duyuru kumesi, istismarin
// erisilebilir hale geldigi gun, sinama kapsami ve degisiklik basarisizlik orani.
// Gercek bir yama indirilmez; filo mekanigi girdi olarak alinir.
export const TOHUM = 20260811, DUYURU_SAYI = 40, DAGITIM = 6;
export const TAM_SINAMA = 21, HATA_TABAN = 0.01, HATA_ARTIS = 0.34;
export const KESINTI_RB = 3600;             // bir plan disi kesintinin bedeli (risk birimi, kurgu)
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

export const DUYURU = (() => {
  const r = uretec(TOHUM);
  return Array.from({ length: DUYURU_SAYI }, (_, i) => ({
    no: i + 1,
    puan: +(4 + r() * 5).toFixed(1),
    etkilenen: 20 + Math.round(r() * 280),
    // istismarin kullanilabilir hale geldigi gun: bir bolumu duyuru gununde hazir
    istismar: Math.round(Math.max(0, -6 + r() * 46)),
  }));
})();

export const kapsam = (W) => Math.min(1, W / TAM_SINAMA);
export const hataOrani = (W) => HATA_TABAN + HATA_ARTIS * (1 - kapsam(W)) ** 2;
export const kesinti = (W) => Math.round(DUYURU_SAYI * DAGITIM * hataOrani(W));
export const yakalanan = (W) => DUYURU.filter((d) => W <= d.istismar).length;
export const maruziyet = (W) => DUYURU.reduce((a, d) =>
  a + d.puan * d.etkilenen * Math.max(0, W - d.istismar), 0);
export const toplam = (W) => maruziyet(W) + kesinti(W) * KESINTI_RB;

// Duzen: her duyuruya bir pencere atayan islev. Kesinti sayisi duyuru basina hesaplanir.
export const DUZEN = { kapisiz: { gecikme: 0, carpan: 1.00 },
  'hafif onay': { gecikme: 2, carpan: 0.60 }, 'tam onay': { gecikme: 5, carpan: 0.35 } };
export function olc(pencere, duzenAd = 'kapisiz') {
  const d = DUZEN[duzenAd]; let mar = 0, kes = 0, yak = 0;
  for (const x of DUYURU) {
    const W = Math.max(pencere(x), d.gecikme);
    mar += x.puan * x.etkilenen * Math.max(0, W - x.istismar);
    kes += DAGITIM * hataOrani(W) * d.carpan;
    if (W <= x.istismar) yak += 1;
  }
  return { maruziyet: mar, kesinti: Math.round(kes), yakalanan: yak,
    toplam: mar + Math.round(kes) * KESINTI_RB };
}
export const enIyiTek = (duzenAd) => { let b = 1;
  for (let W = 1; W <= 40; W += 1)
    if (olc(() => W, duzenAd).toplam < olc(() => b, duzenAd).toplam) b = W;
  return b; };
```

#### İki Eğrinin Kesiştiği Nokta

```js
// yama/pencere.mjs — pencere uzunlugu taramasi: yakalanan acik, maruziyet, kesinti ve
// bir gun kisaltmanin kazanci ile bedeli
import { DUYURU, DAGITIM, KESINTI_RB, kapsam, hataOrani, olc } from './model.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const tek = (W) => olc(() => W);

console.log(`${DUYURU.length} duyuru, duyuru basina ${DAGITIM} dagitim olayi; ` +
  `bir plan disi kesintinin bedeli ${KESINTI_RB} risk birimi (kurgu)`);
const A = [-9, 9, 11, 12, 10, 11, 11, 18];
y(A, 'pencere', 'sinama', 'yakalanan', 'maruziyet', 'kesinti', 'kesinti', 'toplam', '1 gun kisaltma');
y(A, 'gun', 'kapsami', 'acik', 'rb', 'olayi', 'rb', 'rb', 'kazanc - bedel');
for (let W = 5; W <= 15; W += 1) {
  const r = tek(W), onceki = tek(W - 1);
  const kazanc = r.maruziyet - onceki.maruziyet;                 // 1 gun kisaltmanin kazanci
  const bedel = (onceki.kesinti - r.kesinti) * KESINTI_RB;       // 1 gun kisaltmanin bedeli
  y(A, W, kapsam(W).toFixed(2), r.yakalanan, Math.round(r.maruziyet), r.kesinti,
    r.kesinti * KESINTI_RB, Math.round(r.toplam),
    `${Math.round(kazanc)} - ${Math.round(bedel)}`);
}

const enIyi = (k) => { let b = 1; const t = (W) => tek(W).maruziyet + tek(W).kesinti * k;
  for (let W = 1; W <= 40; W += 1) if (t(W) < t(b)) b = W; return b; };
const kesim = enIyi(KESINTI_RB);
const adim = (W) => `${W} -> ${W - 1}: kazanc ` +
  `${Math.round(tek(W).maruziyet - tek(W - 1).maruziyet)} rb, bedel ` +
  `${(tek(W - 1).kesinti - tek(W).kesinti) * KESINTI_RB} rb`;
console.log(`\nkesisme ${kesim}. gunde: ${adim(kesim + 1)} | ${adim(kesim)}`);
console.log('kesinti bedeli degisince en iyi pencere:');
for (const k of [900, 3600, 14000]) {
  const W = enIyi(k);
  console.log(`  ${String(k).padStart(5)} rb/kesinti -> ${String(W).padStart(2)} gun; ` +
    `yakalanan ${tek(W).yakalanan}/${DUYURU.length}, hata orani ${hataOrani(W).toFixed(3)}`);
}
```

```
40 duyuru, duyuru basina 6 dagitim olayi; bir plan disi kesintinin bedeli 3600 risk birimi (kurgu)
pencere     sinama  yakalanan   maruziyet   kesinti    kesinti     toplam    1 gun kisaltma
gun        kapsami       acik          rb     olayi         rb         rb    kazanc - bedel
5             0.24         30       48357        50     180000     228357     10800 - 21600
6             0.29         28       60960        44     158400     219360     12602 - 21600
7             0.33         27       74746        39     140400     215146     13787 - 18000
8             0.38         27       88533        34     122400     210933     13787 - 18000
9             0.43         26      103237        29     104400     207637     14704 - 18000
10            0.48         25      119524        25      90000     209524     16286 - 14400
11            0.52         24      137399        21      75600     212999     17876 - 14400
12            0.57         23      156171        17      61200     217371     18772 - 14400
13            0.62         23      174942        14      50400     225342     18771 - 10800
14            0.67         23      193714        11      39600     233314     18772 - 10800
15            0.71         23      212485         9      32400     244885      18772 - 7200

kesisme 9. gunde: 10 -> 9: kazanc 16286 rb, bedel 14400 rb | 9 -> 8: kazanc 14704 rb, bedel 18000 rb
kesinti bedeli degisince en iyi pencere:
    900 rb/kesinti ->  1 gun; yakalanan 34/40, hata orani 0.318
   3600 rb/kesinti ->  9 gun; yakalanan 26/40, hata orani 0.121
  14000 rb/kesinti -> 17 gun; yakalanan 22/40, hata orani 0.022
```

Tablonun iki sütunu ters yönde hareket ediyor. Pencere beş günden on beş güne uzarken maruziyet
48.357 risk biriminden 212.485'e çıkıyor, kesinti olayı ise 50'den 9'a iniyor. Hiçbiri tek başına
karar taşımaz: yalnız maruziyete bakan bir program pencereyi bir güne indirir ve yılda elli plan
dışı kesintinin üzerine çıkar; yalnız kesintiye bakan bir program pencereyi uzatır ve bunu görmez.

Son sütun kararı veriyor. On günden dokuza inmek 16.286 rb maruziyet kazandırıyor ve 14.400 rb
kesinti bedeli ekliyor — kazanç büyük, kısaltma yapılır. Dokuzdan sekize inmek 14.704 rb
kazandırıyor ve 18.000 rb'ye mal oluyor — bu adım geri alınır. **İki eğri dokuzuncu günde
kesişiyor** ve toplam orada en düşük değerini alıyor (207.637 rb).

Yakalanan açık sütunu ayrı bir uyarı taşıyor. On ikinci günden on beşinci güne kadar sabit kalıyor
(23), ama maruziyet aynı aralıkta yüzde otuz altı artıyor. Yakalanan açık sayısı kesikli bir
ölçüttür ve pencere uzadıkça duyarlılığını yitirir; maruziyet süreklidir ve her günü sayar. "Kaç
açığı zamanında kapattık" sorusu, aynı verinin en az bilgi taşıyan biçimidir.

Alt blok pencerenin nereden geldiğini gösteriyor. Kesintinin bedeli 900 rb sayıldığında en iyi
pencere bir gün, 14.000 rb sayıldığında on yedi gündür; aynı kırk duyuru için on yedi kat fark.
**Pencere uzunluğu açığın bir özelliği değil, kesintinin bedelinin bir sonucudur.** İki kurum aynı
duyuru kümesine bakıp farklı pencere seçtiğinde bu bir tutarsızlık değildir — yeter ki bedel yazılı
olsun. Yazılı değilse pencere bir sayı olarak tartışılır ve tartışma kapanmaz.

#### Onay Kapısı ve İki Yollu Pencere

```js
// yama/duzen.mjs — degisiklik duzeni: onay kapisinin bedeli, iki yollu pencere ve
// siniflandirma hatasinin bedeli
import { DUYURU, DAGITIM, DUZEN, olc, enIyiTek } from './model.mjs';

const SAAT = { kapisiz: 0, 'hafif onay': 1.5, 'tam onay': 5 };   // dagitim olayi basina onay saati
const OLAY = DUYURU.length * DAGITIM;
const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());

const A = [-12, 9, 9, 9, 11, 9, 11, 12];
console.log('1. uc degisiklik duzeni, her biri kendi en iyi penceresinde');
y(A, 'duzen', 'gecikme', 'hata', 'pencere', 'yakalanan', 'kesinti', 'toplam', 'onay');
y(A, '', 'gun', 'carpani', 'gun', 'acik', 'olayi', 'rb', 'saati');
const sat = [];
for (const ad of Object.keys(DUZEN)) {
  const W = Math.max(enIyiTek(ad), DUZEN[ad].gecikme);
  const r = olc(() => W, ad), saat = OLAY * SAAT[ad];
  sat.push({ ad, W, r, saat });
  y(A, ad, DUZEN[ad].gecikme, DUZEN[ad].carpan.toFixed(2), W, r.yakalanan, r.kesinti,
    Math.round(r.toplam), saat);
}
console.log('\n2. bir ust duzene gecmenin birim cabaya dusen risk azalmasi');
for (let i = 1; i < sat.length; i += 1) {
  const d = sat[i - 1].r.toplam - sat[i].r.toplam, s = sat[i].saat - sat[i - 1].saat;
  console.log(`   ${sat[i - 1].ad} -> ${sat[i].ad}: ${Math.round(d)} rb / ${s} saat = ` +
    `${(d / s).toFixed(0)} rb/saat`);
}

// Iki yollu duzen: istismari erken hazir olan duyuru kisa pencereye, otekiler uzuna.
let en = null;
for (let esik = 2; esik <= 20; esik += 1)
  for (let k = 1; k <= 12; k += 1)
    for (let u = k; u <= 30; u += 1) {
      const r = olc((x) => (x.istismar <= esik ? k : u));
      if (!en || r.toplam < en.r.toplam) en = { esik, k, u, r };
    }
const B = [-38, 11, 10, 11, 11];
console.log('\n3. tek pencere yerine iki yollu duzen (kapisiz)');
y(B, 'duzen', 'yakalanan', 'kesinti', 'toplam rb');
const t9 = olc(() => enIyiTek('kapisiz'));
y(B, `tek pencere ${enIyiTek('kapisiz')} gun`, t9.yakalanan, t9.kesinti, Math.round(t9.toplam));
y(B, `iki yol: <=${en.esik} gun -> ${en.k}, digeri -> ${en.u}`, en.r.yakalanan, en.r.kesinti,
  Math.round(en.r.toplam));

// Siniflandirma hatasi: esige en yakin n duyuru ters yola konur.
const sirali = [...DUYURU].sort((a, b) =>
  Math.abs(a.istismar - en.esik) - Math.abs(b.istismar - en.esik) || a.no - b.no);
console.log('\n4. iki yolu ayiran karar yanlissa');
y(B, 'ters yola konan duyuru', 'yakalanan', 'kesinti', 'toplam rb');
for (const n of [0, 4, 12]) {
  const ters = new Set(sirali.slice(0, n).map((x) => x.no));
  const r = olc((x) => ((x.istismar <= en.esik) !== ters.has(x.no) ? en.k : en.u));
  y(B, `${n} duyuru`, r.yakalanan, r.kesinti, Math.round(r.toplam));
}
```

```
1. uc degisiklik duzeni, her biri kendi en iyi penceresinde
duzen         gecikme     hata  pencere  yakalanan  kesinti     toplam        onay
                  gun  carpani      gun       acik    olayi         rb       saati
kapisiz             0     1.00        9         26       29     207637           0
hafif onay          2     0.60        6         28       26     154560         360
tam onay            5     0.35        5         30       17     109557        1200

2. bir ust duzene gecmenin birim cabaya dusen risk azalmasi
   kapisiz -> hafif onay: 53078 rb / 360 saat = 147 rb/saat
   hafif onay -> tam onay: 45002 rb / 840 saat = 54 rb/saat

3. tek pencere yerine iki yollu duzen (kapisiz)
duzen                                   yakalanan   kesinti  toplam rb
tek pencere 9 gun                              26        29     207637
iki yol: <=11 gun -> 3, digeri -> 19           30        28     130159

4. iki yolu ayiran karar yanlissa
ters yola konan duyuru                  yakalanan   kesinti  toplam rb
0 duyuru                                       30        28     130159
4 duyuru                                       26        22     155943
12 duyuru                                      23        19     199971
```

İlk tablo beklenmedik bir yönde okunuyor. Tam onay kapısı her değişikliğe beş günlük bir gecikme
ekliyor, buna karşın en iyi penceresi kapısız düzeninkinden **kısadır** (5 güne karşı 9) ve
yakalanan açık sayısı daha yüksektir (30'a karşı 26). Nedeni ikinci sütundadır: kapı hata oranını
0,35 ile çarptığı için bir gün kısaltmanın kesinti bedeli düşer, dolayısıyla kısaltma daha uzun süre
kârlı kalır. Onay kapısının bedeli **gün olarak değil, saat olarak** ödenir.

İkinci blok o saati sayıyor. Kapısız düzenden hafif onaya geçmek 53.078 rb kazandırıyor ve 360 saat
tutuyor: saat başına 147 rb. Hafif onaydan tam onaya geçmek 45.002 rb kazandırıyor ve 840 saat
tutuyor: 54 rb/saat. Toplam riske bakan sıralama tam onayı öne alır; birim çabaya düşen risk
azalmasına bakan sıralama hafif onayda durur. **Sıralama ölçü değişince değişiyor** ve hangisinin
doğru olduğu 840 saatin başka nerede kullanılabileceğine bağlıdır — önceki dersteki düzeltme
kapasitesi açıklığı bu saatlerin bir alıcısıdır.

Üçüncü blok saat harcamadan bir kazanç gösteriyor. Duyuruları ikiye ayırmak — istismarı on bir gün
içinde hazır olanlara üç günlük, ötekilere on dokuz günlük pencere — toplamı 207.637'den 130.159
rb'ye indiriyor. Kazanç sıralamanın kendisinden geliyor: kısa pencerenin pahalı sınama bedeli
yalnız gereken duyurulara ödeniyor.

Dördüncü blok bu kazancın neye dayandığını ölçüyor. Eşiğe en yakın dört duyuru ters yola konduğunda
toplam 155.943'e çıkıyor — kazancın üçte biri gidiyor. On iki duyuru yanlış sınıflandırıldığında
199.971 kalıyor ve tek pencereye göre kazanç yalnız yüzde on. Aynı satırlarda ikinci bir şey oluyor:
kesinti olayı 28'den 19'a **iniyor**. Yalnız plan dışı kesinti sayısını izleyen bir program bu
bozulmayı bir iyileşme olarak okur.

#### Özet

- Pencere beş günden on beş güne uzarken maruziyet 48.357 rb'den 212.485'e çıkıyor, kesinti olayı
  50'den 9'a iniyor; iki sütun ters yönde hareket ettiği için hiçbiri tek başına karar taşımaz.
- İki eğri dokuzuncu günde kesişiyor: 10'dan 9'a inmek 16.286 rb kazandırıp 14.400 rb'ye mal oluyor,
  9'dan 8'e inmek 14.704 rb kazandırıp 18.000 rb'ye. Toplam 207.637 rb ile orada en düşüktür.
- Yakalanan açık sayısı 12–15 gün arasında sabit kalırken maruziyet yüzde 36 artıyor: kesikli ölçüt
  pencere uzadıkça duyarlılığını yitirir.
- En iyi pencere kesintinin bedeliyle birlikte kayıyor: 900 rb'de 1 gün, 14.000 rb'de 17 gün. Pencere
  açığın değil, bedelin bir sonucudur.
- Tam onay kapısı beş gün gecikme eklediği hâlde en iyi penceresi kapısız düzeninkinden kısadır
  (5'e karşı 9) ve daha çok açık yakalar (30'a karşı 26); bedeli 1.200 onay saatidir.
- Toplam riske göre tam onay, saat başına kazanca göre hafif onay önde (147'ye karşı 54 rb/saat).
  İki yollu pencere toplamı 130.159'a indiriyor, ama on iki duyuruluk sınıflandırma hatası kazancın
  onda dokuzunu geri alıyor ve bunu yaparken kesinti sayısını düşürüyor.

#### Sonraki Adım

İki ders de bir kuyruk ve bir takvim üzerinde çalıştı: kalemler sıraya girdi, pencereler ayarlandı
ve her ikisinde de değişen şey bir yapılandırmaydı. Yapılandırma değiştiğinde değişmiş kalır. Bir
sonraki dersin konusu ise ayarlandığı yerde durmayan tek kalemdir: insan davranışı. Bir eğitim
oturumu bir ölçütü yükseltir, sonra ölçüt haftalar içinde eski değerine geri döner ve program aynı
harcamayı yeniden yapmak zorunda kalır. Ölçülecek şey eğitimin ne kadar iyi olduğu değil,
**kazancın hangi haftada eridiğidir** — ve bu erime her grupta aynı hızda olmadığı için, kıt
eğitim saatinin hangi gruba gideceği yine bir sıralama sorusudur.

### Güvenlik Farkındalık Eğitimi

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/guvenlik-farkindalik-egitimi

Beş grubun kalıcılığı ayrı ayrı ölçülüyor: dönüş haftası 5 ile 29 arasında değişiyor, on üç haftada bir tekrarda aynı veri kalem, risk birimi ve saat başına kazanç ölçüleriyle üç ayrı sıra üretiyor ve beş grubun tamamı yer değiştiriyor. Aynı 1.512 saatlik bütçe herkese tek aralık olarak dağıtıldığında 51.066, gruplara ayrı ayrı dağıtıldığında 64.391 risk birimi kazandırıyor; en kalabalık grup ilk iki bütçede hiç eğitim almıyor.

Önceki iki ders bir kuyruk ve bir takvim üzerinde çalıştı; her ikisinde de değişen şey bir
yapılandırmaydı ve yapılandırma değiştiği yerde durdu. Bu dersin konusu durmayan tek kalemdir. Bir
eğitim oturumu bir ölçütü yükseltir, sonra ölçüt haftalar içinde eski değerine döner ve program
aynı harcamayı yeniden yapmak zorunda kalır.

Tek bir topluluk üzerinde erimenin biçimi ve tek eğitimin bir çeyrek dönemden kısa sürdüğü Saldırı
Teknikleri ve Tehdit Ortamı kursunda ölçüldü; burada o eğri **girdi**dir ve yeniden türetilmez.
Program ölçeğinde eklenen şey şudur: erime her grupta aynı hızda değildir, her grubun geçirdiği
olay sayısı ve bir olayın taşıdığı ağırlık farklıdır ve eğitim saati kıttır. Böylece kalıcılık
sorusu bir **sıralama** sorusuna dönüşür — kıt saatin hangi gruba, hangi sıklıkta gideceği.

- **GP13.** Beş grup, kişi sayıları, taban oranlar, etki puanları ve erime katsayıları kurgusal
  bölgesel ölçüm ağına aittir ve **modeldir**. Gerçek bir tatbikat koşulmuyor.
- **GP14.** Erime üsteldir: kazancın sabit bir oranı her hafta korunur. Gerçekte erime düzgün
  değildir; üstel biçim dönüş haftasını yaklaşık verir.
- **GP15.** Grup içi dağılım yok sayıldı; her grup ortalamasıyla temsil edilir. Bu, hiç
  öğrenmeyen kesimi gizler ve kazancı olduğundan düzgün gösterir.
- **GP16.** Risk birimi (rb) **kurgudur**. Bir grupta geçen kalemin ağırlığı sabittir; gerçekte
  aynı grupta kalemler arasında da fark vardır.
- **GP17.** Eğitim saati kişi başına 1,5 saattir ve oturumların içeriği gruplar arasında aynı
  sayıldı. Ölçüm koşumlarının kendisinin eğitici etkisi modellenmedi.
- **GP18.** Grup değiştiren, ayrılan ve işe başlayan kişi yoktur; kişi sayıları elli iki hafta
  boyunca sabittir.

```js
// egitim/model.mjs — farkindalik programinin grup MODELIDIR: kurgu bolgesel olcum aginda
// bes grup, her birinin taban orani, egitim etkisi, haftalik erimesi ve olay akisi.
// Erime bicimi Saldiri Teknikleri ve Tehdit Ortami kursundan girdi olarak alinir.
export const HAFTA = 52, EGITIM_SAAT = 1.5, ESIK = 1;   // kisi basina oturum saati
export const GRUP = [
  // ad, kisi, taban gecis orani %, egitimin dusurdugu puan, kazancin haftalik kalani,
  // yillik supheli olay, gecen kalem basina risk birimi (kurgu)
  { ad: 'saha ekibi', kisi: 120, taban: 34, etki: 20, erime: 0.86, olay: 2400, agirlik: 40 },
  { ad: 'abone hizmetleri', kisi: 60, taban: 28, etki: 18, erime: 0.78, olay: 5200, agirlik: 55 },
  { ad: 'faturalama', kisi: 35, taban: 22, etki: 15, erime: 0.72, olay: 1600, agirlik: 120 },
  { ad: 'teknik ekip', kisi: 25, taban: 16, etki: 9, erime: 0.62, olay: 900, agirlik: 150 },
  { ad: 'yonetim', kisi: 12, taban: 30, etki: 21, erime: 0.90, olay: 400, agirlik: 300 },
];
export const kazanc = (g, h) => g.etki * g.erime ** h;
export const oran = (g, h) => g.taban - kazanc(g, h);
export const donusHaftasi = (g) => { let h = 0; while (kazanc(g, h) >= ESIK) h += 1; return h; };

// Aralik T ile yilda gecen kalem: her hafta orani hesaplanir, olay akisiyla carpilir.
export function gecen(g, T) {
  let s = 0;
  for (let h = 0; h < HAFTA; h += 1) s += (g.olay / HAFTA) * (T ? oran(g, h % T) : g.taban) / 100;
  return s;
}
export const oturum = (T) => (T ? Math.ceil(HAFTA / T) : 0);
export const saat = (g, T) => oturum(T) * g.kisi * EGITIM_SAAT;
export const kazanim = (g, T) => (gecen(g, 0) - gecen(g, T)) * g.agirlik;   // risk birimi
export const ARALIK = [26, 13, 8, 4, 2];
```

#### Dönüş Haftası Gruba Göre Beş Kat Değişiyor

```js
// egitim/grup.mjs — gruplarin kaliciligi ve ayni tekrar araliginda uc ayri siralama
import { GRUP, HAFTA, ESIK, kazanc, donusHaftasi, gecen, saat, kazanim } from './model.mjs';

const T = 13;
const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const sira = (f) => { const s = [...GRUP].sort((a, b) => f(b) - f(a));
  return new Map(s.map((g, i) => [g.ad, i + 1])); };

const A = [-17, 7, 9, 9, 9, 9, 10, 10];
console.log(`${GRUP.length} grup, ${GRUP.reduce((a, g) => a + g.kisi, 0)} kisi; ` +
  `kazanc ${ESIK} puanin altina indiginde donus sayildi`);
console.log('\n1. kalicilik: kazancin haftalik kalani ve donus haftasi');
y(A, 'grup', 'kisi', 'taban %', 'etki pn', 'erime', 'h=4 pn', 'h=12 pn', 'donus hf');
for (const g of GRUP)
  y(A, g.ad, g.kisi, g.taban, g.etki, g.erime.toFixed(2), kazanc(g, 4).toFixed(1),
    kazanc(g, 12).toFixed(1), donusHaftasi(g));

const B = [-17, 11, 11, 11, 9, 9, 9, 9];
console.log(`\n2. ${T} haftada bir tekrar: ayni veriden uc ayri siralama`);
y(B, 'grup', 'kazanilan', 'kazanim', 'harcanan', 'rb/saat', 'sira', 'sira', 'sira');
y(B, '', 'kalem/yil', 'rb/yil', 'saat/yil', '', 'kalem', 'rb', 'rb/saat');
const sK = sira((g) => gecen(g, 0) - gecen(g, T));
const sR = sira((g) => kazanim(g, T));
const sV = sira((g) => kazanim(g, T) / saat(g, T));
for (const g of GRUP)
  y(B, g.ad, (gecen(g, 0) - gecen(g, T)).toFixed(0), kazanim(g, T).toFixed(0), saat(g, T),
    (kazanim(g, T) / saat(g, T)).toFixed(1), sK.get(g.ad), sR.get(g.ad), sV.get(g.ad));
const fark = (x, z) => GRUP.filter((g) => x.get(g.ad) !== z.get(g.ad)).length;
console.log(`\nkalem -> rb siralamasinda yeri degisen grup: ${fark(sK, sR)}/${GRUP.length}; ` +
  `rb -> rb/saat siralamasinda: ${fark(sR, sV)}/${GRUP.length}; ` +
  `kalem -> rb/saat siralamasinda: ${fark(sK, sV)}/${GRUP.length}`);
const enUst = [...GRUP].sort((a, b) => (gecen(b, 0) - gecen(b, T)) - (gecen(a, 0) - gecen(a, T)));
console.log(`kalem sirasinda ${sK.get(enUst[1].ad)}. olan ${enUst[1].ad}, ` +
  `rb/saat sirasinda ${sV.get(enUst[1].ad)}. sirada`);
```

```
5 grup, 252 kisi; kazanc 1 puanin altina indiginde donus sayildi

1. kalicilik: kazancin haftalik kalani ve donus haftasi
grup                kisi  taban %  etki pn    erime   h=4 pn   h=12 pn  donus hf
saha ekibi           120       34       20     0.86     10.9       3.3        20
abone hizmetleri      60       28       18     0.78      6.7       0.9        12
faturalama            35       22       15     0.72      4.0       0.3         9
teknik ekip           25       16        9     0.62      1.3       0.0         5
yonetim               12       30       21     0.90     13.8       5.9        29

2. 13 haftada bir tekrar: ayni veriden uc ayri siralama
grup               kazanilan    kazanim   harcanan  rb/saat     sira     sira     sira
                   kalem/yil     rb/yil   saat/yil             kalem       rb  rb/saat
saha ekibi               227       9065        720     12.6        2        3        5
abone hizmetleri         314      17288        360     48.0        1        1        2
faturalama                65       7802        210     37.2        3        4        3
teknik ekip               16       2455        150     16.4        5        5        4
yonetim                   48      14457         72    200.8        4        2        1

kalem -> rb siralamasinda yeri degisen grup: 3/5; rb -> rb/saat siralamasinda: 5/5; kalem -> rb/saat siralamasinda: 4/5
kalem sirasinda 2. olan saha ekibi, rb/saat sirasinda 5. sirada
```

İlk tablo kalıcılığın grup özelliği olduğunu gösteriyor. Dönüş haftası teknik ekipte 5, yönetimde
29 — beş kattan fazla fark. Dördüncü haftadaki kalan kazanç teknik ekipte 1,3 puana inmişken
yönetimde 13,8 puandır; on ikinci haftada bu sayılar 0,0 ve 5,9'dur. Bütün kuruma tek bir tekrar
takvimi uygulamak, bu iki grubun birinde kazancın çoktan bittiği, ötekinde ise henüz üçte ikisinin
durduğu bir noktada aynı parayı harcamak demektir.

İkinci tablo asıl kanıttır. Aynı on üç haftalık aralıkta, aynı model, aynı hafta — ve üç ayrı sıra.
Kalem sayısına göre abone hizmetleri birinci, saha ekibi ikinci; risk birimine göre yönetim ikinci
sıraya çıkıyor; saat başına kazanca göre yönetim birinci, saha ekibi **beşinci** oluyor. Kalem
sıralamasından risk birimi sıralamasına geçerken beş grubun üçü, risk biriminden saat başına
kazanca geçerken **beşinin tamamı** yer değiştiriyor.

Saha ekibi bu üç sıranın nasıl ayrıştığını tek başına özetliyor. En kalabalık grup olduğu için en
çok kalemi kazandırıyor (yılda 227), ama kalem başına ağırlığı en düşük olan gruptur (40 rb) ve
eğitim saatinin yarısını tek başına yutar (720 saat). Yönetim ise tersidir: yılda yalnız 48 kalem
kazandırır, ama kalem başına 300 rb taşır ve on iki kişilik olduğu için yılda 72 saat tutar. **"Kaç
kişi eğitildi" ölçütü bu tablonun hiçbir sütununu tahmin etmez.**

#### Aynı Bütçe, İki Dağıtım

```js
// egitim/dagitim.mjs — tekrar araliginin getirisi ve sabit saat butcesinin dagitimi
import { GRUP, ARALIK, oturum, gecen, saat, kazanim } from './model.mjs';

const SEC = [0, ...ARALIK];
const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const top = (f) => GRUP.reduce((a, g) => a + f(g), 0);

const A = [-10, 9, 11, 11, 11, 10];
console.log('1. herkese ayni tekrar araligi');
y(A, 'aralik', 'oturum', 'kazanilan', 'harcanan', 'kazanim', 'rb/saat');
y(A, 'hafta', 'yilda', 'kalem/yil', 'saat/yil', 'rb/yil', '');
for (const T of ARALIK)
  y(A, T, oturum(T), top((g) => gecen(g, 0) - gecen(g, T)).toFixed(0), top((g) => saat(g, T)),
    top((g) => kazanim(g, T)).toFixed(0), (top((g) => kazanim(g, T)) / top((g) => saat(g, T))).toFixed(1));

// Sabit butce altinda grup basina aralik secimi (tam arama: 6 secenek x 5 grup)
function enIyi(B) {
  let iyi = null;
  const gez = (i, kalan, secim, k) => {
    if (i === GRUP.length) { if (!iyi || k > iyi.k) iyi = { k, secim: [...secim] }; return; }
    for (const T of SEC) { const s = saat(GRUP[i], T);
      if (s <= kalan) { secim.push(T); gez(i + 1, kalan - s, secim, k + kazanim(GRUP[i], T));
        secim.pop(); } }
  };
  gez(0, B, [], 0);
  return { ...iyi, saat: GRUP.reduce((a, g, j) => a + saat(g, iyi.secim[j]), 0) };
}

const C = [-9, 12, 11, 12, 11, 26];
console.log('\n2. ayni butce, iki dagitim');
y(C, 'butce', 'tek aralik', 'kazanim', 'serbest', 'kazanim', 'serbest secim');
y(C, 'saat', 'hafta', 'rb/yil', 'saat', 'rb/yil', GRUP.map((g) => g.ad.slice(0, 4)).join('/'));
for (const B of [756, 1512, 2646]) {
  const T = ARALIK.filter((t) => top((g) => saat(g, t)) <= B).sort((a, b) => a - b)[0];
  const r = enIyi(B);
  y(C, B, T, top((g) => kazanim(g, T)).toFixed(0), r.saat, r.k.toFixed(0), r.secim.join('/'));
}
```

```
1. herkese ayni tekrar araligi
aralik       oturum  kazanilan   harcanan    kazanim   rb/saat
hafta         yilda  kalem/yil   saat/yil     rb/yil
26                2        364        756      28407      37.6
13                4        671       1512      51066      33.8
8                 7        974       2646      73236      27.7
4                13       1333       4914      99659      20.3
2                26       1631       9828     122223      12.4

2. ayni butce, iki dagitim
butce      tek aralik    kazanim     serbest    kazanim             serbest secim
saat            hafta     rb/yil        saat     rb/yil  saha/abon/fatu/tekn/yone
756                26      28407         756      44362                 0/8/0/0/8
1512               13      51066        1494      64391                 0/8/8/8/4
2646                8      73236      2596.5      84941               26/4/4/13/4
```

Üstteki tablo tekrar sıklığının kaç kalem kazandırdığını veriyor. Aralık yirmi altı haftadan iki
haftaya inerken kazanılan kalem 364'ten 1.631'e çıkıyor — dört buçuk kat. Harcanan saat ise 756'dan
9.828'e çıkıyor: on üç kat. Saat başına kazanç 37,6 rb'den 12,4 rb'ye iner. Sıklaştırmanın mutlak
kazancı hep artar, verimi hep düşer; iki sütun ayrı yazılmadığında bu ödünleşim görünmez.

Alttaki tablo bu dersin kararını içeriyor. Aynı 1.512 saatlik bütçe herkese on üç haftalık tek
aralık olarak dağıtıldığında 51.066 rb kazandırıyor; gruplara ayrı ayrı dağıtıldığında, hem de 18
saat daha az harcayarak, 64.391 rb kazandırıyor. Fark yüzde yirmi altıdır ve tek bir ek saat
gerektirmez. Yedi yüz elli altı saatlik dar bütçede fark daha da büyüktür: 28.407'ye karşı 44.362,
yüzde elli altı.

Seçim sütunu asıl rahatsız edici sonucu taşıyor. İlk iki bütçede saha ekibi — kurumun en kalabalık
grubu, 120 kişi — **hiç eğitim almıyor**. Nedeni tablonun mantığında: aynı saat, aynı bütçede,
yönetim ve abone hizmetlerinde on altı kata kadar daha fazla risk birimi düşürüyor. Saha ekibi
ancak bütçe 2.646 saate çıktığında ve o da yılda iki oturumluk en seyrek aralıkla listeye giriyor.

Seçilen aralıklar da sezgiye aykırıdır. En hızlı unutan grup — dönüş haftası 5 olan teknik ekip —
sekiz haftalık aralık alıyor; en yavaş unutan grup — dönüş haftası 29 olan yönetim — dört haftalık,
yani listedeki en sık aralığı alıyor. "Çabuk unutana daha sık tekrar" kuralı bu tabloda yanlıştır,
çünkü aralık kararı erime hızından değil üç sayının çarpımından çıkar: bir oturumun kaç kişiye mal
olduğu, grubun kaç olay geçirdiği ve bir olayın kaç risk birimi taşıdığı. On iki kişilik ve kalem
başına 300 rb'lik bir grupta dört haftada bir tekrar yılda 234 saat tutuyor; yüz yirmi kişilik ve
40 rb'lik bir grupta yirmi altı haftada bir tekrar 360 saat. Erime katsayısı bu kararın yalnız bir
çarpanıdır.

Bu sonucun bir sınırı yazılmalıdır. Model yalnız ölçülen kalemi sayar; bir eğitimin kapsam dışı
bırakılmasının ölçülmeyen etkileri — bildirim alışkanlığının kaybı, bir grubun kendini kapsam dışı
görmesi — bu tabloda yoktur. Sayı, bütçenin nereye gideceğine karar vermek için yeterlidir; kimin
hiç eğitilmeyeceğine karar vermek için yeterli değildir. **Sıralamanın yanlış kalemi öne alması,
ölçülmeyen sütunun sıfır sayılmasıyla başlar.**

#### Özet

- Dönüş haftası gruba göre 5 ile 29 arasında değişiyor; dördüncü haftada kalan kazanç teknik ekipte
  1,3 puan, yönetimde 13,8 puan. Tek bir tekrar takvimi bu farkı görmez.
- Aynı on üç haftalık aralıkta üç ölçü üç ayrı sıra veriyor: kalem sıralamasından risk birimi
  sıralamasına geçerken 5 grubun 3'ü, risk biriminden saat başına kazanca geçerken 5'inin tamamı
  yer değiştiriyor.
- En kalabalık grup en çok kalemi kazandırıyor (yılda 227) ama saat başına kazançta sonuncudur
  (12,6 rb/saat); en küçük grup ilk sıradadır (200,8 rb/saat).
- Aralık 26 haftadan 2 haftaya inerken kazanılan kalem 4,5 kat, harcanan saat 13 kat artıyor; saat
  başına kazanç 37,6'dan 12,4 rb'ye iner.
- Aynı 1.512 saat tek aralıkla 51.066, grup başına dağıtıldığında 18 saat daha az harcayarak 64.391
  rb kazandırıyor; 756 saatlik bütçede fark yüzde elli altıdır.
- Serbest dağıtımda 120 kişilik saha ekibi ilk iki bütçede hiç eğitim almıyor. Bu sonuç bütçenin
  nereye gideceğini söyler; ölçülmeyen sütun sıfır sayıldığı için kimin hiç eğitilmeyeceğini söylemez.

#### Sonraki Adım

Üç ders de sürekli akan bir şeyi ölçtü: bulgu akışı, duyuru akışı, davranışın erimesi. Üçünün de
ortak bir yanı vardı — ölçüm, olağan işleyiş sürerken yapıldı. Bir sonraki dersin konusu olağan
işleyişin durduğu andır ve orada elde ölçüm yoktur, **plan** vardır: hangi hizmetin kaç dakikada
ayağa kalkacağı, hangi sıraya göre, kimin hangi adımı yapacağı yazılıdır. Yazılı olmak
doğrulanmış olmak değildir. Ölçülecek şey planın kalitesi değil, plan ile gerçek arasındaki
farktır: tatbikatta kaç kalem tutmuyor, hedef süre ile ölçülen süre arasında kaç dakika var ve o
farkın hangi kalemden geldiği.

### İş Sürekliliği ve Felaket Kurtarma

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/is-surekliligi-ve-felaket-kurtarma

On iki kurtarma kalemi hem planla hem tatbikatla koşturuluyor: plan kritik yolu 260 dakikayla ilan edilen 300 dakikalık hedefin altında kalıyor, tatbikatta ölçülen 421 dakika hedefi 121 dakika aşıyor ve tatbikat raporundaki 293 dakikalık gecikmenin yalnız 161 dakikası kurtarma süresine yansıyor. Altı adam-günlük bütçe rapordaki gecikmeye göre harcandığında kazanç sıfır, kritik yol kazancına göre harcandığında 40 dakika; hedefin altına inmenin bedeli sıralama ölçüsüne göre 32 ile 21 adam-gün arasında değişiyor.

Önceki üç ders sürekli akan bir şeyi ölçtü ve üçünde de ölçüm olağan işleyiş sürerken yapıldı. Bu
dersin konusu olağan işleyişin durduğu andır. Orada elde ölçüm yoktur, **plan** vardır: hangi
hizmetin kaç dakikada ayağa kalkacağı, hangi sıraya göre ve kimin hangi adımı yapacağı yazılıdır.
Yazılı olmak doğrulanmış olmak değildir.

Yedek türleri, geri yükleme mekaniği ve kurtarma hedeflerinin tanımı Bilgi Teknolojileri ve Sistem
Temelleri kursunda ölçüldü; burada girdi olarak alınır. Bu dersin ölçüsü tek bir farktır: **plan
ile gerçek arasındaki fark.** Üç sayıyla yazılır — tatbikatta kaç kalemin varsayımı tutmuyor, hedef
süre ile ölçülen süre arasında kaç dakika var ve o dakikaların hangi kalemden geldiği. Üçüncü soru
ilk ikisinden bağımsızdır, çünkü bir kalemin gecikmesi kurtarma süresine yansımayabilir.

- **GP19.** On iki kurtarma kalemi, bağımlılık grafı, plan süreleri ve tatbikatta tutmayan
  varsayımlar kurgusal bölgesel ölçüm ağına aittir ve **modeldir**. Gerçek bir kurtarma yapılmıyor.
- **GP20.** Bir kalem bütün bağımlılıkları bittikten sonra başlar ve ekipler paralel çalışabilir.
  Kurtarma ekibinin kişi sayısı sınırlı sayılmadı; sınırlı olsaydı ölçülen süre daha uzun çıkardı.
- **GP21.** Tutmayan varsayımın eklediği dakika varsayım türüne bağlıdır ve kaleme göre değişmez.
  Gerçekte aynı varsayım bir kalemde on dakikaya, ötekinde bir saate mal olabilir.
- **GP22.** Tatbikat bütün kalemleri gerçekten çalıştırır. Masabaşı tatbikatlar bazı varsayımları
  hiç sınamaz; o durumda tutmayan kalem sayısı olduğundan düşük görünür.
- **GP23.** Düzeltme maliyeti adam-gün cinsindendir ve **kurgudur**; düzeltmeler birbirini
  ucuzlatmaz.
- **GP24.** Veri kaybı hedefi bu derste ölçülmedi; ölçülen tek şey süredir.

```js
// sureklilik/model.mjs — kurtarma planinin MODELIDIR: kurgu bolgesel olcum aginda on iki
// kurtarma kalemi, bagimlilik grafi, plan suresi ve tatbikatta tutmayan varsayimlar.
// Gercek bir kurtarma yapilmiyor; yedek turleri ve kurtarma mekanigi girdi olarak alinir.
export const HEDEF_DK = 300;                      // planin ilan ettigi kurtarma hedefi (dakika)
// Varsayim turu: tatbikatta tutmadiginda kalemin suresine eklenen dakika ve duzeltme maliyeti
export const VARSAYIM = {
  'yetkili erisim': { dk: 25, gun: 2 },
  'guncel yordam': { dk: 18, gun: 3 },
  'okunabilir yedek': { dk: 40, gun: 5 },
  'iletisim listesi': { dk: 12, gun: 1 },
  'yedek kapasite': { dk: 30, gun: 8 },
};
// kalem: ad, plan suresi (dk), bagimliliklar, tatbikatta TUTMAYAN varsayimlar
export const KALEM = [
  { ad: 'yedek guc', plan: 25, dep: [], tutmayan: [] },
  { ad: 'ag omurgasi', plan: 35, dep: ['yedek guc'], tutmayan: ['guncel yordam'] },
  { ad: 'kimlik hizmeti', plan: 40, dep: ['ag omurgasi'], tutmayan: ['yetkili erisim'] },
  { ad: 'veritabani birincil', plan: 60, dep: ['ag omurgasi'],
    tutmayan: ['okunabilir yedek', 'yetkili erisim'] },
  { ad: 'alim hizmeti', plan: 30, dep: ['kimlik hizmeti', 'veritabani birincil'],
    tutmayan: ['guncel yordam'] },
  { ad: 'dogrulama hizmeti', plan: 25, dep: ['alim hizmeti'], tutmayan: [] },
  { ad: 'faturalama', plan: 45, dep: ['veritabani birincil', 'dogrulama hizmeti'],
    tutmayan: ['yedek kapasite'] },
  { ad: 'is emri hizmeti', plan: 30, dep: ['kimlik hizmeti', 'veritabani birincil'],
    tutmayan: ['iletisim listesi', 'guncel yordam'] },
  { ad: 'saha uygulamasi', plan: 20, dep: ['is emri hizmeti'],
    tutmayan: ['okunabilir yedek', 'iletisim listesi'] },
  { ad: 'abone portali', plan: 35, dep: ['kimlik hizmeti', 'faturalama'], tutmayan: [] },
  { ad: 'gozetim ve gunluk', plan: 20, dep: ['ag omurgasi'], tutmayan: ['yetkili erisim'] },
  { ad: 'rapor uretimi', plan: 40, dep: ['faturalama'], tutmayan: ['yedek kapasite'] },
];
export const gecikme = (t) => t.reduce((a, v) => a + VARSAYIM[v].dk, 0);

// Bagimlilik grafinde en gec bitis: sure islevi kalem -> dakika
export function bitis(sure) {
  const b = new Map();
  const hesap = (ad) => {
    if (b.has(ad)) return b.get(ad);
    const k = KALEM.find((x) => x.ad === ad);
    const bas = k.dep.reduce((a, d) => Math.max(a, hesap(d)), 0);
    b.set(ad, bas + sure(k));
    return b.get(ad);
  };
  for (const k of KALEM) hesap(k.ad);
  return b;
}
export const toplam = (sure) => Math.max(...bitis(sure).values());
export const planSure = (k) => k.plan;
export const olculenSure = (kapali = new Set()) => (k) =>
  k.plan + gecikme(k.tutmayan.filter((v) => !kapali.has(`${k.ad}|${v}`)));

// Kritik yol: bitis suresi toplama esit olan kalemden geriye dogru
export function kritikYol(sure) {
  const b = bitis(sure), son = Math.max(...b.values());
  const yol = []; let ad = [...b.keys()].find((x) => b.get(x) === son);
  while (ad) { yol.unshift(ad);
    const k = KALEM.find((x) => x.ad === ad);
    ad = k.dep.slice().sort((p, q) => b.get(q) - b.get(p))[0]; }
  return yol;
}
// Bosluk: kalemin kritik yola girmeden gecikebilecegi dakika
export function bosluk(sure) {
  const b = bitis(sure), son = Math.max(...b.values());
  const ardil = new Map(KALEM.map((k) => [k.ad, []]));
  for (const k of KALEM) for (const d of k.dep) ardil.get(d).push(k.ad);
  const gec = new Map();
  const hesap = (ad) => {
    if (gec.has(ad)) return gec.get(ad);
    const a = ardil.get(ad);
    gec.set(ad, a.length ? Math.min(...a.map((x) =>
      hesap(x) - sure(KALEM.find((z) => z.ad === x)))) : son);
    return gec.get(ad);
  };
  return new Map(KALEM.map((k) => [k.ad, hesap(k.ad) - b.get(k.ad)]));
}
export const ADAY = KALEM.flatMap((k) => k.tutmayan.map((v) => ({ kalem: k.ad, varsayim: v,
  anahtar: `${k.ad}|${v}`, dk: VARSAYIM[v].dk, gun: VARSAYIM[v].gun })));
```

#### Rapordaki Gecikme ile Yansıyan Gecikme

```js
// sureklilik/tatbikat.mjs — plan ile gercek arasindaki fark: tutmayan kalem, hedef ile
// olculen sure farki ve gecikmenin ne kadarinin kurtarma suresine yansidigi
import { KALEM, HEDEF_DK, ADAY, gecikme, toplam, kritikYol, bosluk,
  planSure, olculenSure } from './model.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const P = toplam(planSure), O = toplam(olculenSure());
const yolP = kritikYol(planSure), yolO = new Set(kritikYol(olculenSure()));
const bos = bosluk(olculenSure());

console.log(`${KALEM.length} kurtarma kalemi, ilan edilen hedef ${HEDEF_DK} dk`);
console.log(`plan kritik yolu ${P} dk (hedefin ${HEDEF_DK - P} dk altinda), ` +
  `tatbikatta olculen ${O} dk (hedefi ${O - HEDEF_DK} dk asiyor); fark ${O - P} dk`);
console.log(`tutmayan varsayim tasiyan kalem: ` +
  `${KALEM.filter((k) => k.tutmayan.length).length}/${KALEM.length}, ` +
  `toplam ${ADAY.length} varsayim, rapordaki gecikme toplami ` +
  `${KALEM.reduce((a, k) => a + gecikme(k.tutmayan), 0)} dk`);

const A = [-20, 7, 9, 10, 10, 9, 9];
console.log('\n1. kalem basina plan, olculen ve bosluk');
y(A, 'kalem', 'plan', 'olculen', 'gecikme', 'kritik', 'bosluk', 'yansiyan');
for (const k of KALEM) {
  const g = gecikme(k.tutmayan);
  const tek = toplam(olculenSure(new Set(k.tutmayan.map((v) => `${k.ad}|${v}`))));
  y(A, k.ad, k.plan, k.plan + g, g, yolO.has(k.ad) ? 'evet' : 'hayir', bos.get(k.ad), O - tek);
}
console.log(`\nkritik yol (plan ve tatbikatta ayni): ${yolP.join(' -> ')}`);
console.log(`kritik yol disindaki kalemlerin tasidigi gecikme: ` +
  `${KALEM.filter((k) => !yolO.has(k.ad)).reduce((a, k) => a + gecikme(k.tutmayan), 0)} dk`);
```

```
12 kurtarma kalemi, ilan edilen hedef 300 dk
plan kritik yolu 260 dk (hedefin 40 dk altinda), tatbikatta olculen 421 dk (hedefi 121 dk asiyor); fark 161 dk
tutmayan varsayim tasiyan kalem: 9/12, toplam 12 varsayim, rapordaki gecikme toplami 293 dk

1. kalem basina plan, olculen ve bosluk
kalem                  plan  olculen   gecikme    kritik   bosluk yansiyan
yedek guc                25       25         0      evet        0        0
ag omurgasi              35       53        18      evet        0       18
kimlik hizmeti           40       65        25     hayir       60        0
veritabani birincil      60      125        65      evet        0       60
alim hizmeti             30       48        18      evet        0       18
dogrulama hizmeti        25       25         0      evet        0        0
faturalama               45       75        30      evet        0       30
is emri hizmeti          30       60        30     hayir       86        0
saha uygulamasi          20       72        52     hayir       86        0
abone portali            35       35         0     hayir       35        0
gozetim ve gunluk        20       45        25     hayir      298        0
rapor uretimi            40       70        30      evet        0       30

kritik yol (plan ve tatbikatta ayni): yedek guc -> ag omurgasi -> veritabani birincil -> alim hizmeti -> dogrulama hizmeti -> faturalama -> rapor uretimi
kritik yol disindaki kalemlerin tasidigi gecikme: 132 dk
```

Üst satırlar planın kâğıt üzerinde hedefini tutturduğunu gösteriyor: kritik yol 260 dakika, ilan
edilen hedef 300 dakika, kırk dakika pay var. Tatbikat aynı grafı gerçek sürelerle koşturunca 421
dakika çıkıyor — hedefin 121 dakika üzerinde. On iki kalemin dokuzunda en az bir varsayım tutmuyor.

Asıl ayrım son iki sütunda. Tatbikat raporu 293 dakikalık gecikme yazıyor, ama kurtarma süresine
yansıyan gecikme 161 dakikadır. Aradaki 132 dakika, kritik yol dışındaki kalemlerde durur. Gözetim
ve günlük kaleminde 298 dakikalık boşluk var; oradaki 25 dakikalık gecikme kurtarma süresini bir
dakika bile uzatmaz. Saha uygulamasında 52 dakikalık gecikme ve 86 dakikalık boşluk var; yansıması
yine sıfırdır. **Bir tatbikat raporunun toplam gecikme satırı, kurtarma süresinin ne kadar
uzadığını söylemez.**

Yansıyan sütunun kendi içinde de bir tuzak var. Kritik yoldaki beş kalemin tek tek yansıması 18,
60, 18, 30 ve 30 dakikadır; toplamı 156. Oysa hepsi birden düzeltildiğinde kazanç 161 dakikadır.
Her tekil ölçüm, o kalem düzeltilince devreye giren ikinci en uzun yol tarafından sınırlanır;
dolayısıyla kalemleri tek tek değerlendiren bir liste toplam kazancı olduğundan **küçük** gösterir.

Kritik yolun plan ile tatbikatta aynı kalması da kayda değer. Gecikmeler büyüktü ama sırayı
değiştirecek kadar büyük değildi; planın hangi kalemin darboğaz olduğuna dair varsayımı tuttu,
sürelere dair varsayımı tutmadı. İki varsayım ayrı ayrı sınanır ve tatbikat raporunda ayrı ayrı
yazılmalıdır.

#### Aynı Bütçe, Üç Ayrı Sıra

```js
// sureklilik/duzeltme.mjs — tatbikat bulgularini uc ayri olcuyle siralayip ayni butcede kosturur
import { HEDEF_DK, ADAY, toplam, planSure, olculenSure } from './model.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const O = toplam(olculenSure());
const marj = (a, k) => toplam(olculenSure(k)) - toplam(olculenSure(new Set([...k, a.anahtar])));

const KURAL = {
  'rapor gecikmesi': (a) => a.dk,
  'kritik yol kazanci': (a, k) => marj(a, k),
  'kazanc/gun': (a, k) => marj(a, k) / a.gun,
};
function kosum(ad, butce) {
  const kural = KURAL[ad], kapali = new Set(); let kalan = butce, n = 0, liste = [...ADAY];
  while (kalan > 0 && liste.length) {
    liste.sort((p, q) => kural(q, kapali) - kural(p, kapali) || p.kalem.localeCompare(q.kalem));
    const a = liste.find((x) => x.gun <= kalan);
    if (!a) break;
    kalan -= a.gun; kapali.add(a.anahtar); n += 1; liste = liste.filter((x) => x !== a);
  }
  return { n, gun: butce - kalan, sure: toplam(olculenSure(kapali)) };
}

console.log(`tatbikatta olculen ${O} dk, plan ${toplam(planSure)} dk, hedef ${HEDEF_DK} dk; ` +
  `${ADAY.length} duzeltme adayi, hepsini kapatmak ${ADAY.reduce((a, x) => a + x.gun, 0)} adam-gun`);
const A = [-8, 20, 10, 7, 10, 11];
console.log('\n1. ayni butce, uc ayri siralama olcusu');
y(A, 'butce', 'olcu', 'duzeltme', 'gun', 'sure dk', 'kazanc dk');
for (const B of [6, 12, 20])
  for (const ad of Object.keys(KURAL)) {
    const r = kosum(ad, B);
    y(A, B, ad, r.n, r.gun, r.sure, O - r.sure);
  }

console.log('\n2. hedefin altina inmek icin gereken en kucuk butce');
for (const ad of Object.keys(KURAL)) {
  let g = 1; while (g <= 43 && kosum(ad, g).sure > HEDEF_DK) g += 1;
  console.log(`   ${ad.padEnd(20)} ${g} adam-gun`);
}
console.log('\n3. raporda en buyuk iki gecikme');
for (const a of [...ADAY].sort((p, q) => q.dk - p.dk || p.kalem.localeCompare(q.kalem)).slice(0, 2))
  console.log(`   ${a.kalem} / ${a.varsayim}: raporda ${a.dk} dk, ${a.gun} adam-gun, ` +
    `kurtarma suresine yansiyan ${marj(a, new Set())} dk`);
```

```
tatbikatta olculen 421 dk, plan 260 dk, hedef 300 dk; 12 duzeltme adayi, hepsini kapatmak 43 adam-gun

1. ayni butce, uc ayri siralama olcusu
butce                   olcu  duzeltme    gun   sure dk  kazanc dk
6            rapor gecikmesi         2      6       421          0
6         kritik yol kazanci         2      6       381         40
6                 kazanc/gun         3      6       378         43
12           rapor gecikmesi         3     12       381         40
12        kritik yol kazanci         4     12       338         83
12                kazanc/gun         4     12       338         83
20           rapor gecikmesi         4     20       351         70
20        kritik yol kazanci         5     20       308        113
20                kazanc/gun         8     19       320        101

2. hedefin altina inmek icin gereken en kucuk butce
   rapor gecikmesi      32 adam-gun
   kritik yol kazanci   25 adam-gun
   kazanc/gun           21 adam-gun

3. raporda en buyuk iki gecikme
   saha uygulamasi / okunabilir yedek: raporda 40 dk, 5 adam-gun, kurtarma suresine yansiyan 0 dk
   veritabani birincil / okunabilir yedek: raporda 40 dk, 5 adam-gun, kurtarma suresine yansiyan 40 dk
```

İlk satır üçlüsü bu dersin en sert sonucunu taşıyor. Altı adam-günlük bütçe rapordaki gecikme
sırasına göre harcandığında iki düzeltme yapılıyor, bütçenin tamamı gidiyor ve kurtarma süresi 421
dakikada **kalıyor**: kazanç sıfır. Aynı bütçe kritik yol kazancına göre harcandığında 40, kazancı
güne bölen sıraya göre 43 dakika kazandırıyor. Üç sıra da aynı on iki adayı, aynı raporu ve aynı
bütçeyi kullanıyor.

Nedeni üçüncü blokta yazılı. Raporun en büyük iki gecikmesi de kırk dakikadır ve ikisi de beş
adam-güne mal olur; birincisinin kurtarma süresine yansıması **sıfır**, ikincisininki 40 dakikadır.
Rapordaki sayı düzeltmenin değerini vermez; değer ancak kalem bağımlılık grafına konduğunda çıkar.

Yirmi adam-günlük satırda iki akıllı ölçü yer değiştiriyor. On iki adam-güne kadar kritik yol
kazancı ile kazanç/gün aynı sonucu verir (338 dakika); yirmi adam-günde kazanç/gün 320 dakikada
kalırken kritik yol kazancı 308'e iner. **Sıralamanın değiştiği nokta budur**: bütçe büyüdükçe
ucuz kalemleri öne alan ölçü, pahalı ama tek başına daha çok kazandıran kalemi almaya sıra
gelmeden bütçeyi tüketir. Dar bütçede verim ölçüsü, geniş bütçede doğrudan kazanç ölçüsü öndedir.

Son blok kararı tek bir sayıya bağlıyor. Hedefin altına inmek rapordaki gecikme sırasıyla 32,
kritik yol kazancıyla 25, kazanç/gün sırasıyla 21 adam-gün tutuyor. Bulgular aynı, plan aynı, ekip
aynı — aradaki 11 adam-gün yalnız sıralama ölçüsünden geliyor.

#### Özet

- Plan kritik yolu 260 dk ile ilan edilen 300 dk'lık hedefin altında kalıyor; tatbikatta ölçülen
  süre 421 dk ve hedefi 121 dk aşıyor. On iki kalemin dokuzunda en az bir varsayım tutmuyor.
- Tatbikat raporundaki 293 dk'lık gecikmenin yalnız 161 dk'sı kurtarma süresine yansıyor; kalan
  132 dk boşluğu olan kalemlerde durur (gözetim ve günlük kaleminde boşluk 298 dk).
- Kritik yoldaki kalemlerin tek tek yansıması toplamda 156 dk, hepsi birden düzeltildiğinde 161 dk:
  tekil değerlendirme, devreye giren ikinci yol yüzünden kazancı küçük gösterir.
- Kritik yol plan ile tatbikatta aynı kaldı: darboğaz varsayımı tuttu, süre varsayımı tutmadı. İki
  varsayım ayrı sınanır ve ayrı yazılır.
- Altı adam-gün rapordaki gecikme sırasına göre harcandığında kazanç sıfırdır; kritik yol kazancına
  göre 40, kazanç/gün sırasına göre 43 dakikadır. Raporun en büyük iki gecikmesi de 40 dk ve 5
  adam-gündür; birinin yansıması 40, ötekininki 0 dakikadır.
- Yirmi adam-günde iki ölçü yer değiştiriyor (308'e karşı 320 dk); hedefin altına inmek 32, 25 ve
  21 adam-gün tutuyor — 11 adam-günlük fark yalnız sıralama ölçüsünden geliyor.

#### Sonraki Adım

Dört ders dört ayrı sıralama üretti ve her birinde aynı biçim tekrarlandı: bir kalem kümesi, bir
ölçü ve ölçü değiştiğinde değişen bir sıra. Bu dersteki rapor gecikmesi sütunu bunun uç örneğiydi —
gerçek bir sayıydı, doğru ölçülmüştü, tatbikat raporunda yazıyordu ve altı adam-günlük bir bütçeyi
sıfır kazançla harcattı. Böyle bir sütun yanlış değildir; **karar taşımaz**. Son ders program
ölçütlerinin tamamını bu gözle ayırır: hangi ölçüt bir karara bağlı ve eşiği aşınca ne oluyor,
hangisi yalnız rapora giriyor ve ölçütü toplamanın bedeli ile tetiklediği karar sayısı yan yana
yazıldığında liste nasıl kısalıyor.

### Güvenlik Ölçütleri

Source: https://academia.sh/tr/kurslar/yonetisim-risk-uyumluluk/guvenlik-olcutleri

On sekiz program ölçütü dört obeğe ayrılıyor: sekizi karar taşıyor ve yıllık toplama bedelinin yüzde 48'ini alıyor, ikisi eşiği aşıyor ama tanımlı eylemi olmadığı için sinyali düşüyor, beşi eşiğe yaklaşıp hiç aşmıyor ve üçünün eşiği hiç bağlamıyor. En pahalı ölçüt yılda 192 saat tutuyor ve sıfır karar üretiyor; karar taşıyan sekiz ölçütün altısı karar sayısı ile karar başına saat sıralamalarında yer değiştiriyor.

Bir önceki dersin rapor gecikmesi sütunu bu dersin başlangıç noktasıdır. O sütun gerçek bir sayıydı,
doğru ölçülmüştü ve tatbikat raporunda yazıyordu; buna karşın altı adam-günlük bir bütçeyi sıfır
kazançla harcattı. Kusuru yanlış olması değil, bir karara bağlanmamış olmasıydı.

Bu ders bir program ölçüt kümesinin tamamını aynı gözle ayırır. Sınama mekaniktir ve dört sorudan
oluşur: ölçütün tanımlı bir eşiği var mı, eşik dönem içinde aşıldı mı, aşıldığında yapılacak iş
tanımlı mı ve o işi yapacak adı geçen bir sahip var mı. Dördü birden sağlanıyorsa ölçüt bir
davranış değiştirmiştir; biri eksikse ölçüt bir rapor satırıdır. Yanına yazılacak ikinci sayı
**toplama bedelidir**: o ölçütü üretmenin dönem başına kaç saat tuttuğu.

- **GP25.** On sekiz ölçüt, on iki dönemlik gözlem, eşikler ve toplama saatleri kurgusal bölgesel
  ölçüm ağına aittir ve **modeldir**. Gerçek bir ölçüm koşulmuyor.
- **GP26.** Eşiği aşan bir ölçüt, tanımlı eylemi ve adı geçen sahibi varsa karar üretmiş sayıldı.
  Gerçekte tanımlı eylem her zaman uygulanmaz; bu, karar sayısını olduğundan yüksek gösterir.
- **GP27.** Eşiğe yaklaşma, gözlemlerden en az birinin eşikten yüzde on beşten az uzakta olması
  sayıldı; sınır değişirse obeklerin sınırı da değişir.
- **GP28.** Toplama bedeli dönem başına sabit saattir; kurulum ve otomasyon bedeli modellenmedi.
- **GP29.** Ölçütler bağımsız sayıldı; gerçekte biri düşerken öteki yükselir.
- **GP30.** Rastgelelik üreteci ders içinde yazılıdır ve tohum görünürdür.

```js
// olcut/model.mjs — program olcutlerinin MODELIDIR: kurgu bolgesel olcum aginda on sekiz
// olcut, on iki donemlik gozlem, esik, tanimli eylem ve toplama bedeli.
export const TOHUM = 20260829, DONEM = 12;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
// ad, taban deger, donemsel salinim, egilim, esik, esik yonu (+: ustu kotu), tanimli eylem,
// adi gecen sahip, donem basina toplama saati
export const OLCUT = [
  ['acik kuyrugu', 175, 30, 4, 200, 1, true, true, 3],
  ['yetisemeyen kalem', 41, 12, 2, 60, 1, true, true, 2],
  ['ortalama acik yasi', 9, 3, 0.4, 12, 1, true, true, 2],
  ['yama penceresi', 9, 2.5, 0, 12, 1, true, true, 1],
  ['plan disi kesinti', 29, 9, -0.6, 35, 1, true, true, 1],
  ['sinama kapsami', 43, 8, 1.2, 40, -1, true, true, 4],
  ['egitim katilim orani', 68, 8, 0.3, 70, -1, false, true, 6],
  ['bildirim orani', 21, 5, 0.8, 19, -1, true, true, 5],
  ['tatbikat tutmayan kalem', 9, 2, -0.2, 6, 1, true, true, 8],
  ['kurtarma suresi', 421, 40, -6, 300, 1, true, true, 12],
  ['kontrol kapsami', 76, 5, 1.1, 70, -1, false, true, 9],
  ['kanitsiz gereksinim', 14, 4, -0.5, 8, 1, true, true, 7],
  ['tedarikci dogrulanmamis kontrol', 23, 3, 0.1, 40, 1, false, false, 6],
  ['envanterde olmayan varlik', 31, 9, 1.4, 25, 1, true, true, 14],
  ['risk listesi ilk on degisim', 4, 2, 0, 8, 1, false, false, 5],
  ['denetim bulgusu', 11, 5, -0.4, 10, 1, true, true, 3],
  ['politika okuma orani', 94, 4, 0.2, 60, -1, false, false, 16],
  ['guvenlik olayi sayisi', 11, 5, 0.1, 12, 1, false, true, 2],
].map(([ad, taban, salinim, egilim, esik, yon, eylem, sahip, saat], i) =>
  ({ no: i + 1, ad, taban, salinim, egilim, esik, yon, eylem, sahip, saat }));

export const gozlem = (o) => { const r = uretec(TOHUM + o.no * 977);
  return Array.from({ length: DONEM }, (_, d) =>
    +(o.taban + o.egilim * d + (r() - 0.5) * 2 * o.salinim).toFixed(1)); };
export const asan = (o) => gozlem(o).filter((v) => (v - o.esik) * o.yon > 0).length;
// Bir asma karar uretir: esigi asmis olmali, tanimli eylem ve adi gecen sahip bulunmali.
export const karar = (o) => (o.eylem && o.sahip ? asan(o) : 0);
// Esige hic yaklasilmadiysa olcut esik tarafindan hic sinanmamis sayilir.
export const yakin = (o) => { const g = gozlem(o);
  const uzak = g.map((v) => Math.abs(v - o.esik) / Math.max(1, Math.abs(o.esik)));
  return Math.min(...uzak) <= 0.15; };
// Dort obek: karar tasiyan / sinyal verip karara baglanmayan / esige yaklasan / baglamayan esik
export const obek = (o) => (asan(o) > 0
  ? (o.eylem && o.sahip ? 'karar tasiyan' : 'sinyal, karar yok')
  : (yakin(o) ? 'esige yaklasan' : 'baglamayan esik'));
export const OBEK = ['karar tasiyan', 'sinyal, karar yok', 'esige yaklasan', 'baglamayan esik'];
export const yil = (o) => o.saat * DONEM;
export const SAAT = OLCUT.reduce((a, o) => a + yil(o), 0);
```

#### Karar Taşıyan Ölçüt ile Rapor Satırı

```js
// olcut/karar.mjs — olcutleri davranisi degistirip degistirmediklerine gore ayirir ve
// karar sayisi ile toplama bedelini yan yana koyar
import { OLCUT, OBEK, DONEM, SAAT, asan, karar, yakin, obek, yil } from './model.mjs';

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join('').trimEnd());
const sira = (l, f) => { const s = [...l].sort((a, b) => f(b) - f(a));
  return new Map(s.map((o, i) => [o.ad, i + 1])); };

console.log(`${OLCUT.length} olcut, ${DONEM} donem, toplama bedeli ${SAAT} saat/yil`);
const A = [-20, 8, 10, 9, 11];
console.log('\n1. olcutlerin dort obegi');
y(A, 'obek', 'olcut', 'saat/yil', 'saatin %', 'karar/yil');
for (const g of OBEK) {
  const l = OLCUT.filter((o) => obek(o) === g), s = l.reduce((a, o) => a + yil(o), 0);
  y(A, g, l.length, s, (100 * s / SAAT).toFixed(1), l.reduce((a, o) => a + karar(o), 0));
}

const kt = OLCUT.filter((o) => karar(o) > 0);
const sK = sira(kt, (o) => karar(o)), sV = sira(kt, (o) => karar(o) / yil(o));
const B = [-26, 8, 10, 12, 8, 12];
console.log('\n2. karar tasiyan olcutler: iki siralama');
y(B, 'olcut', 'karar', 'saat/yil', 'karar/saat', 'sira', 'sira');
y(B, '', 'yilda', '', '', 'karar', 'karar/saat');
for (const o of [...kt].sort((a, b) => karar(b) - karar(a)))
  y(B, o.ad, karar(o), yil(o), (karar(o) / yil(o)).toFixed(3), sK.get(o.ad), sV.get(o.ad));
console.log(`iki siralamada yeri degisen olcut: ` +
  `${kt.filter((o) => sK.get(o.ad) !== sV.get(o.ad)).length}/${kt.length}`);

const pahali = [...OLCUT].sort((a, b) => yil(b) - yil(a))[0];
console.log(`\nen pahali olcut: ${pahali.ad}, ${yil(pahali)} saat/yil, ` +
  `esigi ${asan(pahali)} donem asildi, tanimli eylem ${pahali.eylem ? 'var' : 'yok'}, ` +
  `sahip ${pahali.sahip ? 'var' : 'yok'}, esige yaklasti mi: ${yakin(pahali) ? 'evet' : 'hayir'}`);
const at = OLCUT.filter((o) => obek(o) === 'baglamayan esik');
console.log(`esigi baglamayan ${at.length} olcut cikarilirsa ` +
  `${at.reduce((a, o) => a + yil(o), 0)} saat/yil (toplamin yuzde ` +
  `${(100 * at.reduce((a, o) => a + yil(o), 0) / SAAT).toFixed(0)}'i) duser, kaybedilen karar ` +
  `${at.reduce((a, o) => a + karar(o), 0)}`);
const sin = OLCUT.filter((o) => obek(o) === 'sinyal, karar yok');
console.log(`sinyal veren ${sin.length} olcute tanimli eylem ve sahip eklenirse ` +
  `yilda ${sin.reduce((a, o) => a + asan(o), 0)} karar eklenir; toplama bedeli ` +
  `${sin.reduce((a, o) => a + yil(o), 0)} saat/yil olarak kalir`);
```

```
18 olcut, 12 donem, toplama bedeli 1272 saat/yil

1. olcutlerin dort obegi
obek                   olcut  saat/yil saatin %  karar/yil
karar tasiyan              8       612     48.1         56
sinyal, karar yok          2        96      7.5          0
esige yaklasan             5       240     18.9          0
baglamayan esik            3       324     25.5          0

2. karar tasiyan olcutler: iki siralama
olcut                        karar  saat/yil  karar/saat    sira        sira
                             yilda                         karar  karar/saat
kurtarma suresi                 12       144       0.083       1           7
envanterde olmayan varlik       12       168       0.071       2           8
tatbikat tutmayan kalem         10        96       0.104       3           3
kanitsiz gereksinim              8        84       0.095       4           4
denetim bulgusu                  6        36       0.167       5           1
acik kuyrugu                     3        36       0.083       6           5
ortalama acik yasi               3        24       0.125       7           2
yetisemeyen kalem                2        24       0.083       8           6
iki siralamada yeri degisen olcut: 6/8

en pahali olcut: politika okuma orani, 192 saat/yil, esigi 0 donem asildi, tanimli eylem yok, sahip yok, esige yaklasti mi: hayir
esigi baglamayan 3 olcut cikarilirsa 324 saat/yil (toplamin yuzde 25'i) duser, kaybedilen karar 0
sinyal veren 2 olcute tanimli eylem ve sahip eklenirse yilda 12 karar eklenir; toplama bedeli 96 saat/yil olarak kalir
```

İlk tablo on sekiz ölçütü dörde ayırıyor ve ilk okunacak sayı toplama bedelinin dağılımıdır. Karar
taşıyan sekiz ölçüt yılda 612 saat tutuyor; kalan on ölçüt 660 saat tutuyor ve **sıfır karar
üretiyor**. Yıllık ölçüm çabasının yarısından fazlası davranışı hiç değiştirmemiş bir sayı kümesine
gidiyor.

Buradan çıkan sonuç "karar üretmeyen ölçütü at" değildir, çünkü sıfırın üç ayrı nedeni var. İkinci
obek — eşiği aşan ama tanımlı eylemi olmayan iki ölçüt — en kötü durumdur: sinyal geldi ve düştü.
Düzeltmesi ölçümde değil tanımdadır; son satır bunu sayıyor: tanımlı eylem ve sahip eklendiğinde
yılda on iki karar ekleniyor, toplama bedeli değişmiyor. Sıfırdan on ikiye çıkan bir sayının
bedeli, bir belgeye iki satır yazmaktır.

Üçüncü obek tam tersi yöndedir. Eşiğe yaklaşan beş ölçüt hiç aşım üretmedi, ama en az bir gözlemi
eşiğin yüzde on beşinden yakın geçti. Bunlar eşiğin **bağlayıcı** olduğunu ve denetimin tuttuğunu
gösteren tek kanıttır; çıkarılırsa geriye kanıt değil iyimserlik kalır. Yılda 240 saat tutuyorlar
ve bu saat karar başına değil, güvence başına harcanmıştır.

Dördüncü obek çıkarılabilecek olandır: eşiği hiç aşılmamış, eşiğine hiç yaklaşılmamış, tanımlı
eylemi ve sahibi olmayan üç ölçüt. Yılda 324 saat, toplamın yüzde yirmi beşi, kaybedilen karar
sıfır. En pahalı ölçüt de bu obektedir: tek başına 192 saat/yıl ve sıfır aşım. **Bir ölçütün
pahalı olması onu önemli yapmaz**, çünkü kimsenin karar bağlamadığı bir sayı sorulmadığı için
sadeleştirilmemiştir.

İkinci tablo bu kursun ana kanıtını son kez tekrarlıyor. Karar sayısına göre sıralandığında
kurtarma süresi ile envanterde olmayan varlık başa çıkıyor; karar başına saate göre sıralandığında
ikisi yedinci ve **sekizinci** sıraya düşüyor, denetim bulgusu beşincilikten birinciliğe çıkıyor.
Sekiz ölçütün altısı yer değiştiriyor: en çok kararı tetikleyen iki ölçüt, karar başına en pahalı
iki ölçüttür.

#### Özet

- Bir ölçüt dört koşulu birden sağladığında davranış değiştirir: tanımlı eşik, dönem içinde aşım,
  tanımlı eylem ve adı geçen sahip. Biri eksikse ölçüt bir rapor satırıdır.
- On sekiz ölçütün sekizi karar taşıyor (yılda 56 karar, 612 saat); kalan on ölçüt 660 saat tutuyor
  ve sıfır karar üretiyor — yıllık ölçüm çabasının yüzde 52'si.
- Sinyal verip karara bağlanmayan iki ölçüte tanımlı eylem ve sahip eklemek, toplama bedelini
  değiştirmeden yılda on iki karar ekliyor.
- Eşiğe yaklaşıp hiç aşmayan beş ölçüt (240 saat/yıl) çıkarılmaz: eşiğin bağlayıcı olduğunu ve
  denetimin tuttuğunu gösteren tek kanıt onlardır.
- Çıkarılabilecek obek, eşiğine hiç yaklaşılmayan üçüdür: 324 saat/yıl, toplamın yüzde 25'i,
  kaybedilen karar sıfır. En pahalı ölçüt (192 saat/yıl) bu obektedir.
- Karar taşıyan sekiz ölçütün altısı, karar sayısı ile karar başına saat sıralamalarında yer
  değiştiriyor; en çok kararı tetikleyen iki ölçüt, karar başına en pahalı iki ölçüttür.

#### Kurs Kapanışı

Bu on yedi ders tek bir biçimi tekrarladı: bir kalem kümesi tanımlandı, bir ölçüyle sıralandı, her
seçeneğin düşürdüğü risk ile harcadığı birim yan yana yazıldı, sonra ölçü değiştirilip sıranın
nerede bozulduğu sayıldı. Son sütun her derste aynı şeyi söyledi — **aynı veriden iki farklı öncelik
çıkabiliyor**; sıralamayı üreten ölçü yazılı değilse liste bir karar değil, gerekçesi görünmeyen
bir tercihtir.

| Ders | Kalem sayısı | Sıralama ölçüsü | Sıralamanın değiştiği yer |
|---|---|---|---|
| Risk Değerlendirme Süreci | 47 risk kalemi | yıllık risk | orana geçince 45 kalem kayar |
| Nitel ve Nicel Yaklaşımlar | 47 kalem, 1.081 çift | parasal değer / nitel düzey | 479 çift beraberlik, 52 çift ters |
| Risk Ele Alma Seçenekleri | 47 kalem, 4 seçenek | yıllık birim azalma | kaçınma 1.200 birimde bile girmez |
| Varlık ve Envanter Yönetimi | 69 kalem, 30'u gölge | tam listedeki yıllık risk | 41 kayıtlı kalem kayar, en çok 22 |
| Üçüncü Taraf Riski | 62 kalem, 16 kontrol | beyan / kanıt | 51 kalem kayar, en çok 21 |
| Güvenlik Çerçeveleri | 31 kontrol, 5 işlev | olgunluk / birim çabaya kazanç | beş işlevin hiçbiri aynı sırada değil |
| Yönetim Sistemi Standartları | 100 madde, 3 kapsam | mutlak / birim risk maliyeti | üç kapsamın sırası tam ters |
| Denetim Kontrol Kümeleri | 28 kontrol, 25 gereksinim | kontrol sayısı / kanıt yükü | ilk beşte üç ortak üye |
| Sektörel Uyumluluk Gereksinimleri | 16 sistem, 20 kontrol | kalkan kontrol / birim güne kazanç | en çok düşüren eylem sonuncu |
| Kişisel Verinin Korunması | 15 sistem, 7 hak türü | eksik yanıt / kişi-saat yükü | iki çözüm iki ölçüde ters sıralanır |
| Politika, Standart ve Yordam | 26 belge, 15 zincir | belge sayısı / kanıt üretimi | 14 adam-gün tam gösterir, kanıt katmaz |
| Denetçi ve Uyum Rollerinin İşlevi | 24 kontrol, 17 bulgu | gören bulgu / bulgu başına gün | dört düzenlemenin iki ucu takas |
| Açık Yönetimi Programı | 884 bulgu | puan / puan-çaba oranı | 109 saat/haftada iki kural yer değiştirir |
| Yama ve Değişiklik Yönetimi | 40 duyuru, 6 dağıtım olayı | maruziyet + kesinti bedeli | bedel değişince pencere 1'den 17 güne |
| Güvenlik Farkındalık Eğitimi | 5 grup, 252 kişi | kalem / risk birimi / saat başına | son geçişte beş grubun beşi kayar |
| İş Sürekliliği ve Felaket Kurtarma | 12 kalem, 12 aday | rapor gecikmesi / kritik yol kazancı | 20 adam-günde iki ölçü yer değiştirir |
| Güvenlik Ölçütleri | 18 ölçüt | karar sayısı / karar başına saat | sekiz ölçütün altısı yer değiştirir |

Bu kurs müfredatın da sonudur. On kurs on ayrı ölçü ekseni kurdu ve her biri kendi birimini
tanımladı:

| Kurs | Ölçü ekseni | Birim |
|---|---|---|
| K01 Siber Güvenliğe Giriş | savunmanın kapattığı yol | yol |
| K02 Bilgi Teknolojileri ve Sistem Temelleri | sınır nerede ve düşerse ne açılır | sınırı geçmek için gereken kalem |
| K03 Ağ Güvenliği | doğrulanmayan iddia | iddia |
| K04 Kimlik, Erişim ve Kriptografi | güven kökü ve kırılma noktası | zincirde tutması gereken kalem |
| K05 Uç Nokta ve Sistem Sertleştirme | tutunma noktası | otomatik çalıştırılan kalem |
| K06 Saldırı Teknikleri ve Tehdit Ortamı | zincirin kırılabilen halkası | halka ve erken kırma kazancı |
| K07 Güvenlik Araçları ve Sızma Testi | aday ile kanıt arasındaki fark | kanıtlanmış bulgu |
| K08 Güvenlik Operasyonları ve Olay Müdahalesi | fark etme ile durdurma arasındaki süre | dakika ve kanıt kalemi |
| K09 Bulut ve Sanallaştırma Güvenliği | tek yanlıştan sonra ulaşılan kalem | yayılma yarıçapı |
| K10 Yönetişim, Risk ve Uyumluluk | birim çabaya düşen risk azalması | sıra |

On kurs boyunca sorulan tek soru vardı: **bir savunma neyi kapatıyor ve karşılığında neyi
durduruyor.** Birim kurstan kursa değişti — yol, kalem, iddia, halka, dakika, yarıçap, sıra — ama
soru değişmedi. Hiçbir kurs "güvenli" sözcüğünü bir sonuç olarak kullanmadı, çünkü ölçülen şey her
zaman **kalan yoldu**: kapatılamayan tutunma noktası, doğrulanamayan iddia, kırılmayan halka,
kanıtsız gereksinim, yetişilemeyen kalem.

Kapanış bu yüzden tek bir kuralla yazılır: **bedeli yazılmayan savunma ölçülmemiş sayılır.** Kaç
meşru istek reddedildi, kaç kesinti üretildi, kaç saat harcandı, kaç kalem elle yönetildi — bu sütun
boşsa geriye kalan sayı bir ölçüm değil, bir iddiadır. Bu müfredatın bıraktığı şey savunmaların
listesi değil, o sütunu doldurma alışkanlığıdır.

