{
 "version": "katman-kutugu/1.0",
 "generated_by": "katki/corpus/build_steps.py",
 "layers": [
  {
   "id": "K0",
   "ad": "Katılım ve rıza",
   "en": "Participation & consent"
  },
  {
   "id": "K1",
   "ad": "Cihazda baytlar",
   "en": "Bytes on the device"
  },
  {
   "id": "K2",
   "ad": "Anlam",
   "en": "Meaning"
  },
  {
   "id": "K3",
   "ad": "Kanonik çekirdek",
   "en": "Canonical core"
  },
  {
   "id": "K4",
   "ad": "Taahhüt ve tel",
   "en": "Commitment & wire"
  },
  {
   "id": "K5",
   "ad": "Bronz",
   "en": "Bronze"
  },
  {
   "id": "K6",
   "ad": "Gümüş kapısı",
   "en": "Silver gate"
  },
  {
   "id": "K7",
   "ad": "Mühür",
   "en": "Seal"
  },
  {
   "id": "K8",
   "ad": "Altın",
   "en": "Gold"
  },
  {
   "id": "K9",
   "ad": "Çözümleme",
   "en": "Analysis"
  },
  {
   "id": "K10",
   "ad": "Sunum",
   "en": "Presentation"
  },
  {
   "id": "K11",
   "ad": "Dağıtım",
   "en": "Distribution"
  },
  {
   "id": "K12",
   "ad": "Yönetişim",
   "en": "Governance"
  },
  {
   "id": "K13",
   "ad": "Barolar ve kurumlar",
   "en": "Bar associations & institutions"
  },
  {
   "id": "K14",
   "ad": "Hasta yüzeyi (iadeos.com)",
   "en": "Patient surface: landing, slugs, plans, kits"
  }
 ],
 "steps": [
  {
   "id": "A01",
   "layer": "K0",
   "ad": "Katılım sözü (canlı sayaç)",
   "what": "One pledge per person: province + ISO week, nothing else.",
   "inp": [
    "kisi"
   ],
   "out": [
    "soz"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katil.js",
     "symbol": "initPledge"
    },
    {
     "file": "katki/backend/api/openapi.yaml",
     "symbol": "/pledge"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/egress.mjs",
     "find": "ay,hafta,il,t,v"
    },
    {
     "file": "katki/harness/katil.mjs",
     "find": "pledge"
    }
   ],
   "axioms": [
    "buyuk-sayilar",
    "tesvik"
   ],
   "ne": "Kişi başına bir söz: il ve ISO hafta, başka hiçbir şey."
  },
  {
   "id": "A02",
   "layer": "K0",
   "ad": "KVKK m.6 açık rıza metni ve VERBİS",
   "what": "Legal consent text for special-category health data; registration.",
   "inp": [
    "kisi"
   ],
   "out": [
    "riza_metni"
   ],
   "status": "decision",
   "reason": "Hukuk incelemesi: canlı gönderim bu adım bitmeden açılmaz (atlas §4.1).",
   "owner": "hukuk",
   "ne": "Özel nitelikli sağlık verisi için açık rıza metni ve VERBİS kaydı."
  },
  {
   "id": "A03",
   "layer": "K0",
   "ad": "Rıza kaydı (/consent)",
   "what": "One consent record per submission, three boxes, notice version.",
   "inp": [
    "riza_metni"
   ],
   "out": [
    "consent_id"
   ],
   "status": "contract",
   "impl": [
    {
     "file": "katki/backend/api/openapi.yaml",
     "symbol": "/consent"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/api/openapi.yaml",
     "find": "Consent:"
    }
   ],
   "reason": "Sunucu kurulmadı; sözleşme OpenAPI’de, redocly 0 hata.",
   "owner": "backend",
   "ne": "Her gönderim için bir rıza kaydı: üç kutu ve metin sürümü."
  },
  {
   "id": "A04",
   "layer": "K1",
   "ad": "Dosya alımı (sürükle/seç, 25 MB sınırı)",
   "what": "The file is read into the tab's memory; nothing is uploaded.",
   "inp": [
    "kisi"
   ],
   "out": [
    "baytlar"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katil.js",
     "symbol": "handleBytes"
    },
    {
     "file": "site/assets/anydoc.js",
     "symbol": "decode"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/egress.mjs",
     "find": "requests_during_decode"
    }
   ],
   "ne": "Dosya sekmenin belleğine okunur; hiçbir şey yüklenmez."
  },
  {
   "id": "A05",
   "layer": "K1",
   "ad": "Biçim tanıma (sihirli baytlar)",
   "what": "PDF, ZIP/DOCX/XLSX, JPEG/PNG/HEIC/WebP, OLE2, UTF-8/16, cp1254.",
   "inp": [
    "baytlar"
   ],
   "out": [
    "bicim"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/anydoc.js",
     "symbol": "sniff"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "sniff pdf with junk prefix"
    },
    {
     "file": "katki/backend/anydoc-rs/tests/parity.rs",
     "find": "hostile_and_edge_inputs"
    }
   ],
   "ne": "PDF, ZIP/DOCX/XLSX, JPEG/PNG/HEIC/WebP, OLE2, UTF-8/16, cp1254 tanınır."
  },
  {
   "id": "A06",
   "layer": "K1",
   "ad": "Kap çözme (PDF akışları, ObjStm, ZIP)",
   "what": "Flate/ASCII85/AHx streams, ToUnicode CMaps, object streams, ZIP entries.",
   "inp": [
    "bicim"
   ],
   "out": [
    "ham_metin"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/anydoc.js",
     "symbol": "inflate"
    },
    {
     "file": "site/assets/anydoc.js",
     "symbol": "parseCMap"
    },
    {
     "file": "site/assets/anydoc.js",
     "symbol": "zipEntries"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "objstm resolved font from ObjStm"
    },
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "ascii85"
    }
   ],
   "ne": "Flate/ASCII85/AHx akışları, ToUnicode eşlemleri, nesne akışları, ZIP girdileri açılır."
  },
  {
   "id": "A07",
   "layer": "K1",
   "ad": "Güvenlik: zip bombası, şifreli, taranmış, bozuk",
   "what": "Hostile or unreadable input is named, never crashes.",
   "inp": [
    "bicim"
   ],
   "out": [
    "uyarilar"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/anydoc.js",
     "symbol": "zip-bomba"
    },
    {
     "file": "site/assets/anydoc.js",
     "symbol": "sifreli-pdf"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "zip bomb refused"
    },
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "encrypted flagged"
    },
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "truncated no throw"
    }
   ],
   "ne": "Zararlı ya da okunamayan girdi adıyla bildirilir; sayfa çökmez."
  },
  {
   "id": "A08",
   "layer": "K1",
   "ad": "Fotoğraftan metin (cihazda OCR)",
   "what": "Photos and scans currently need manual entry.",
   "inp": [
    "bicim"
   ],
   "out": [
    "ham_metin"
   ],
   "status": "not-built",
   "reason": "Cihazda OCR yok; ağır model indirmesi ve doğruluk kararı gerekiyor.",
   "owner": "ürün",
   "ne": "Fotoğraf ve taramalar şimdilik elle girilir."
  },
  {
   "id": "A09",
   "layer": "K2",
   "ad": "Kişisel veri bulma ve karartma",
   "what": "TCKN (checksum), IBAN (mod-97), phone, e-mail, name, address.",
   "inp": [
    "ham_metin"
   ],
   "out": [
    "kararti_metin"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/anydoc.js",
     "symbol": "findPII"
    },
    {
     "file": "site/assets/anydoc.js",
     "symbol": "redact"
    },
    {
     "file": "katki/backend/anydoc-rs/src/lib.rs",
     "symbol": "pub mod pii"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "redacted hides tckn"
    },
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "telefon"
    },
    {
     "file": "katki/backend/anydoc-rs/tests/parity.rs",
     "find": "pii_validators"
    }
   ],
   "ne": "TCKN (sağlama), IBAN (mod-97), telefon, e-posta, ad, adres bulunur ve karartılır."
  },
  {
   "id": "A10",
   "layer": "K2",
   "ad": "Alan çıkarma (güven puanıyla)",
   "what": "ay, il, kod, fiyat, sut_bedeli, tesis; hospital name detected and withheld.",
   "inp": [
    "ham_metin"
   ],
   "out": [
    "alanlar"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/anydoc.js",
     "symbol": "extractFields"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/anydoc.test.mjs",
     "find": "hospital name withheld"
    },
    {
     "file": "katki/backend/anydoc-rs/tests/parity.rs",
     "find": "invoices_extract_same_fields_as_js"
    }
   ],
   "ne": "Altı alan güven puanıyla çıkarılır; hastane adı bulunur ama tutulmaz."
  },
  {
   "id": "A11",
   "layer": "K2",
   "ad": "Kişinin gözden geçirmesi",
   "what": "Low-confidence fields shown dashed; the person corrects them.",
   "inp": [
    "alanlar"
   ],
   "out": [
    "onayli_alanlar"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katil.js",
     "symbol": "renderL3"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/egress.mjs",
     "find": "mf-fiyat"
    }
   ],
   "ne": "Düşük güvenli alanlar kesikli gösterilir; kişi düzeltir."
  },
  {
   "id": "A12",
   "layer": "K3",
   "ad": "Tutar ayrıştırma (tam sayı kuruş)",
   "what": "'1.234,56' → 123456; fixes the float rule that rejected 13 % of amounts.",
   "inp": [
    "onayli_alanlar"
   ],
   "out": [
    "kurus"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "parseTrAmount"
    },
    {
     "file": "katki/backend/anydoc-rs/src/lib.rs",
     "symbol": "parse_tr_amount"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "old float rule rejects"
    },
    {
     "file": "katki/backend/anydoc-rs/tests/parity.rs",
     "find": "money_matches_js_on_every_amount"
    }
   ],
   "ne": "'1.234,56' → 123456 kuruş; tutarların %13’ünü reddeden eski kayan nokta kuralı düzeldi."
  },
  {
   "id": "A13",
   "layer": "K3",
   "ad": "Çekirdek doğrulama (6 alan)",
   "what": "Same accept/reject in JS, Rust, PostgreSQL and OpenAPI on 31 boundary cases.",
   "inp": [
    "kurus",
    "onayli_alanlar"
   ],
   "out": [
    "cekirdek"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "validateCore"
    }
   ],
   "verify": [
    {
     "file": "katki/corpus/parity.mjs",
     "find": "behavioural"
    },
    {
     "file": "katki/tests/core.test.mjs",
     "find": "integer kuruş path rejects"
    }
   ],
   "ne": "31 sınır durumunda JS, Rust, PostgreSQL ve OpenAPI aynı kararı verir."
  },
  {
   "id": "A14",
   "layer": "K3",
   "ad": "Kanonik JSON (NFC, sıralı anahtar)",
   "what": "One byte string per core, on every device.",
   "inp": [
    "cekirdek"
   ],
   "out": [
    "kanonik"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "canonical"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "canonical NFC"
    },
    {
     "file": "katki/tests/core.test.mjs",
     "find": "canonical rejects floats"
    }
   ],
   "ne": "Her çekirdek her cihazda tek bir bayt dizisine dönüşür (NFC, sıralı anahtar)."
  },
  {
   "id": "A15",
   "layer": "K4",
   "ad": "Taahhüt SHA-256(çekirdek ‖ | ‖ tuz)",
   "what": "256-bit salt stays in the tab; the server can never recompute it.",
   "inp": [
    "kanonik"
   ],
   "out": [
    "taahhut"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "commit"
    },
    {
     "file": "katki/backend/anydoc-rs/src/lib.rs",
     "symbol": "pub fn commitment"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "commitment = sha256(core|salt)"
    },
    {
     "file": "katki/backend/anydoc-rs/tests/parity.rs",
     "find": "golden_vectors_match_js"
    }
   ],
   "ne": "256 bitlik tuz sekmede kalır; sunucu taahhüdü yeniden üretemez."
  },
  {
   "id": "A16",
   "layer": "K4",
   "ad": "Protobuf tel biçimi (~107 bayt)",
   "what": "Byte-identical in JS, Rust and Google's protobuf runtime.",
   "inp": [
    "cekirdek",
    "taahhut",
    "consent_id"
   ],
   "out": [
    "tel"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "encodeSubmission"
    },
    {
     "file": "katki/backend/proto/katki.proto",
     "symbol": "message Submission"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "pb round trip core"
    },
    {
     "file": "katki/tests/core.test.mjs",
     "find": "pb runaway varint rejected"
    }
   ],
   "ne": "JS, Rust ve Google protobuf ile bayt bayt aynı; ortalama 107 bayt."
  },
  {
   "id": "A17",
   "layer": "K4",
   "ad": "Sıfır çıkış (rıza öncesi hiçbir şey gitmez)",
   "what": "Decode of 5 files causes 0 requests; no PII string anywhere on the wire; send disabled.",
   "inp": [
    "tel"
   ],
   "out": [
    "gonderim_hazir"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katil.js",
     "symbol": "renderWire"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/egress.mjs",
     "find": "pii_strings_found_anywhere"
    }
   ],
   "ne": "Beş dosyanın çözümü sıfır ağ isteği doğurur; hiçbir kişisel veri dizesi tele çıkmaz; gönder düğmesi kapalı."
  },
  {
   "id": "A18",
   "layer": "K4",
   "ad": "Gönderim (/submissions)",
   "what": "Protobuf body, 4 KB cap, neutral reason codes, rate limit.",
   "inp": [
    "gonderim_hazir",
    "consent_id"
   ],
   "out": [
    "gelen"
   ],
   "status": "contract",
   "impl": [
    {
     "file": "katki/backend/api/openapi.yaml",
     "symbol": "/submissions"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/api/openapi.yaml",
     "find": "application/x-protobuf"
    }
   ],
   "reason": "A02 bitmeden açılmaz; sunucu kurulmadı.",
   "owner": "backend",
   "ne": "Protobuf gövde, 4 KB sınırı, tarafsız ret kodları, hız sınırı."
  },
  {
   "id": "A19",
   "layer": "K5",
   "ad": "Bronz kayıt (değişmez, gün hassasiyeti)",
   "what": "What arrived, byte for byte; UPDATE/DELETE raise 55000.",
   "inp": [
    "gelen"
   ],
   "out": [
    "bronz"
   ],
   "status": "built",
   "impl": [
    {
     "file": "katki/backend/db/medallion.sql",
     "symbol": "CREATE TABLE bronze.submission"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/db/medallion.test.sql",
     "find": "ok bronze immutable"
    }
   ],
   "ne": "Gelen bayt bayt saklanır; UPDATE/DELETE 55000 hatası verir."
  },
  {
   "id": "A20",
   "layer": "K5",
   "ad": "Kötüye kullanım sınırı",
   "what": "Salted-IP rate limit, one pledge per verified source.",
   "inp": [
    "gelen"
   ],
   "out": [
    "bronz"
   ],
   "status": "contract",
   "impl": [
    {
     "file": "katki/backend/api/openapi.yaml",
     "symbol": "rate limited"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/api/openapi.yaml",
     "find": "'429'"
    }
   ],
   "reason": "Uygulama katmanı kurulmadı.",
   "owner": "backend",
   "ne": "Tuzlanmış IP ile hız sınırı; doğrulanmış kaynak başına bir söz."
  },
  {
   "id": "A21",
   "layer": "K6",
   "ad": "Kapı (atlas §4.6 sırası)",
   "what": "Decode → schema → keys → kod → fiyat → sut → ay → il → tesis → duplicate.",
   "inp": [
    "bronz"
   ],
   "out": [
    "gumus",
    "karantina"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "toSilver"
    },
    {
     "file": "katki/backend/anydoc-rs/src/lib.rs",
     "symbol": "pub mod gate"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "quarantine reasons"
    },
    {
     "file": "katki/backend/anydoc-rs/tests/parity.rs",
     "find": "gate_order_and_codes"
    },
    {
     "file": "katki/bench/bench-rs.json",
     "find": "gate_check"
    }
   ],
   "ne": "Çöz → şema → anahtar → kod → fiyat → SUT → ay → il → tesis → tekrar."
  },
  {
   "id": "A22",
   "layer": "K6",
   "ad": "Kanıt durumu (ADAY → KANITLI)",
   "what": "Only KANITLI rows enter any percentile.",
   "inp": [
    "gumus"
   ],
   "out": [
    "kanitli"
   ],
   "status": "decision",
   "reason": "Bir kaydın nasıl KANITLI olacağı tanımlı değil (belge kanıtı mı, kaynak doğrulaması mı?). Tüm yayım bu karara bağlı.",
   "owner": "ürün + hukuk",
   "ne": "Yalnızca KANITLI kayıtlar yüzdeliklere girer; bunun nasıl kazanılacağı tanımlı değil."
  },
  {
   "id": "A23",
   "layer": "K7",
   "ad": "Haftalık parti, Merkle kökü",
   "what": "Leaf H(0x00‖c), node H(0x01‖l‖r); levels hashed in parallel.",
   "inp": [
    "kanitli"
   ],
   "out": [
    "parti"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "merkleRoot"
    },
    {
     "file": "katki/backend/anydoc-rs/src/lib.rs",
     "symbol": "pub fn merkle_root"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "merkle root n="
    },
    {
     "file": "katki/backend/anydoc-rs/tests/parity.rs",
     "find": "merkle_matches_reference_shape"
    }
   ],
   "ne": "Yaprak H(0x00‖c), düğüm H(0x01‖sol‖sağ); her düzey paralel karma."
  },
  {
   "id": "A24",
   "layer": "K7",
   "ad": "Zincir ve bağımsız tanık imzası",
   "what": "chain_hash = H(prev ‖ root ‖ week), witness_sig from a party outside the operator.",
   "inp": [
    "parti"
   ],
   "out": [
    "muhur"
   ],
   "status": "contract",
   "impl": [
    {
     "file": "katki/backend/db/medallion.sql",
     "symbol": "witness_sig"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/db/medallion.sql",
     "find": "chain_hash"
    }
   ],
   "reason": "Tanık kurum seçilmedi.",
   "owner": "yönetişim",
   "ne": "Zincir karması ve işletmeci dışından bir tanığın imzası."
  },
  {
   "id": "A25",
   "layer": "K7",
   "ad": "Dahil olma kanıtı (/proof)",
   "what": "Anyone can check their commitment is inside a sealed batch.",
   "inp": [
    "muhur"
   ],
   "out": [
    "kanit_yolu"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "merkleProof"
    },
    {
     "file": "site/assets/katki-core.js",
     "symbol": "verifyProof"
    }
   ],
   "verify": [
    {
     "file": "site/assets/katil.js",
     "find": "merkle proof n="
    }
   ],
   "ne": "Herkes taahhüdünün mühürlü partide olduğunu kendisi doğrulayabilir."
  },
  {
   "id": "A26",
   "layer": "K7",
   "ad": "Geri çekme (iki zamanlı olgu)",
   "what": "A withdrawal is a new fact with its own transaction time; history stays reproducible.",
   "inp": [
    "muhur"
   ],
   "out": [
    "geri_cekme"
   ],
   "status": "built",
   "impl": [
    {
     "file": "katki/backend/db/medallion.sql",
     "symbol": "CREATE TABLE silver.withdrawal"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/db/medallion.test.sql",
     "find": "ok withdrawal immutable"
    }
   ],
   "ne": "Geri çekme kendi işlem zamanıyla yeni bir olgudur; geçmiş yeniden üretilebilir kalır."
  },
  {
   "id": "A27",
   "layer": "K7",
   "ad": "Silme hakkı ile değişmezlik",
   "what": "KVKK m.7 erasure vs an immutable sealed ledger.",
   "inp": [
    "geri_cekme"
   ],
   "out": [
    "silme_politikasi"
   ],
   "status": "decision",
   "reason": "Mühürlü satır fiziksel olarak silinebilir mi (taahhüt kalır, çekirdek silinir)? Hukuk kararı.",
   "owner": "hukuk",
   "ne": "KVKK m.7 silme hakkı ile değişmez mühürlü defter."
  },
  {
   "id": "A28",
   "layer": "K8",
   "ad": "Hücre ve yüzdelik kuralı",
   "what": "n ≥ eşik; each percentile only when its exact-binomial CI fits inside the sample.",
   "inp": [
    "muhur"
   ],
   "out": [
    "hucre"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "goldCells"
    },
    {
     "file": "site/assets/katki-core.js",
     "symbol": "orderCI"
    },
    {
     "file": "katki/backend/db/medallion.sql",
     "symbol": "gold.cell_raw"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "n=10 publishable set"
    },
    {
     "file": "katki/tests/core.test.mjs",
     "find": "orderCI "
    }
   ],
   "ne": "n ≥ eşik; her yüzdelik yalnızca kesin binom aralığı örneğe sığınca."
  },
  {
   "id": "A29",
   "layer": "K8",
   "ad": "Tamamlayıcı gizleme",
   "what": "No hidden cell can be recovered by subtraction from published totals.",
   "inp": [
    "hucre"
   ],
   "out": [
    "yayim_hucre"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "suppress"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "no singleton hidden group"
    }
   ],
   "ne": "Gizli hiçbir hücre yayımlanan toplamlardan çıkarma ile bulunamaz."
  },
  {
   "id": "A30",
   "layer": "K8",
   "ad": "Fark Φ hücresi",
   "what": "Φ quantiles, share above the 200 % line with a Wilson CI; integer test fiyat > 3·SUT.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "fark_hucre"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-math.js",
     "symbol": "farkSummary"
    },
    {
     "file": "katki/backend/db/medallion.sql",
     "symbol": "gold.cell_fark"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/db/medallion.test.sql",
     "find": "ok fark cell"
    },
    {
     "file": "katki/tests/math.test.mjs",
     "find": "fark: share over 200"
    }
   ],
   "ne": "Φ yüzdelikleri ve %200 çizgisi üstündeki pay (Wilson); tam sayı testi fiyat > 3·SUT."
  },
  {
   "id": "A31",
   "layer": "K8",
   "ad": "Geçmiş bir günün yayımı (as-of)",
   "what": "gold.cells_as_of(Tt): exactly what was publishable that day.",
   "inp": [
    "yayim_hucre",
    "geri_cekme"
   ],
   "out": [
    "asof_hucre"
   ],
   "status": "built",
   "impl": [
    {
     "file": "katki/backend/db/medallion.sql",
     "symbol": "gold.cells_as_of"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/db/medallion.test.sql",
     "find": "ok bitemporal"
    }
   ],
   "ne": "gold.cells_as_of(Tt): o gün tam olarak neyin yayımlanabilir olduğu."
  },
  {
   "id": "A32",
   "layer": "K8",
   "ad": "Yayımlanan değerde yuvarlama/gürültü",
   "what": "At odd n the median is one participant's exact amount.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "yayim_deger"
   ],
   "status": "decision",
   "reason": "₺10’a yuvarlama mı, kalibre gürültü mü? Gürültü Merkle doğrulanabilirliğiyle çatışır.",
   "owner": "ürün + hukuk",
   "ne": "Tek n’de medyan bir katılımcının tam tutarıdır."
  },
  {
   "id": "A33",
   "layer": "K8",
   "ad": "Hastane düzeyi",
   "what": "ZIP rules (n ≥ 15, 3 months, ≤ 20 % single source) on fictional codes only.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "hastane_hucre"
   ],
   "status": "decision",
   "reason": "ARCH §5 kilitli; yanıt hakkı süreci tasarlanmadı.",
   "owner": "yönetim",
   "ne": "ZIP kuralları yalnızca kurgusal kodlarda; gerçek hastane adı yok."
  },
  {
   "id": "A34",
   "layer": "K9",
   "ad": "Değişim: Mann–Whitney + BH + bootstrap",
   "what": "Rank test per province, false-discovery control across provinces, seeded bootstrap CI.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "degisim"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-math.js",
     "symbol": "mannWhitney"
    },
    {
     "file": "site/assets/katki-math.js",
     "symbol": "bh"
    },
    {
     "file": "site/assets/katki-math.js",
     "symbol": "bootMedianRatioIter"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/math.test.mjs",
     "find": "scipy.mannwhitneyu"
    },
    {
     "file": "katki/tests/math.test.mjs",
     "find": "BH q["
    }
   ],
   "ne": "İl başına sıra testi, iller arasında yanlış keşif denetimi, tohumlu bootstrap aralığı."
  },
  {
   "id": "A35",
   "layer": "K9",
   "ad": "Erken uyarı (EWMA)",
   "what": "λ = 0.2, L = 3, exact time-varying limits.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "sinyal"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-math.js",
     "symbol": "ewma"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/math.test.mjs",
     "find": "EWMA z["
    }
   ],
   "ne": "λ = 0,2, L = 3, zamana bağlı kesin sınırlar."
  },
  {
   "id": "A36",
   "layer": "K9",
   "ad": "EWMA taban uzunluğu ve sinyal politikası",
   "what": "13-week baseline gives unstable false-alarm rates (median run 110 weeks, mean 1,757).",
   "inp": [
    "sinyal"
   ],
   "out": [
    "sinyal_politikasi"
   ],
   "status": "decision",
   "reason": "Gerçek veride ≥ 26–52 hafta taban; sinyal kime, nasıl gösterilir?",
   "owner": "istatistik",
   "ne": "13 haftalık taban kararsız yanlış alarm oranı verir (medyan 110, ortalama 1.757 hafta)."
  },
  {
   "id": "A37",
   "layer": "K9",
   "ad": "Dağılım kayması (W₁, KS)",
   "what": "Area between ECDFs and the largest vertical gap.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "kayma"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-math.js",
     "symbol": "wasserstein1"
    },
    {
     "file": "site/assets/katki-math.js",
     "symbol": "ks2"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/math.test.mjs",
     "find": "scipy.wasserstein_distance"
    },
    {
     "file": "katki/tests/math.test.mjs",
     "find": "scipy.ks_2samp"
    }
   ],
   "ne": "Birikimli dağılımlar arasındaki alan ve en büyük dikey fark."
  },
  {
   "id": "A38",
   "layer": "K9",
   "ad": "Ayrıştırma (SUT etkisi / fark etkisi)",
   "what": "Δln GM(fiyat) = Δln GM(SUT) + Δln GM(1+Φ), residual < 1e−12.",
   "inp": [
    "fark_hucre"
   ],
   "out": [
    "ayristirma"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-math.js",
     "symbol": "decompose"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/math.test.mjs",
     "find": "residual < 1e-12"
    }
   ],
   "ne": "Δln GM(fiyat) = Δln GM(SUT) + Δln GM(1+Φ); artık < 10⁻¹²."
  },
  {
   "id": "A39",
   "layer": "K9",
   "ad": "Eşitsizlik ve komşuluk (Gini, Moran I)",
   "what": "Lorenz/Gini of province medians; Moran I with 5-NN weights, permutation p.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "mekan"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-math.js",
     "symbol": "gini"
    },
    {
     "file": "site/assets/katki-math.js",
     "symbol": "moran"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/math.test.mjs",
     "find": "Moran permutation p exact"
    }
   ],
   "ne": "İl medyanlarının Lorenz/Gini’si; 5 en yakın komşu ile Moran I, permütasyon p."
  },
  {
   "id": "A40",
   "layer": "K9",
   "ad": "Akış istatistiği (Welford, P²)",
   "what": "Monitoring only; P² error up to 19.6 % at p95 on sample cells, so never for publication.",
   "inp": [
    "kanitli"
   ],
   "out": [
    "izleme"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-math.js",
     "symbol": "welford"
    },
    {
     "file": "site/assets/katki-math.js",
     "symbol": "p2"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/math.test.mjs",
     "find": "P² p="
    },
    {
     "file": "katki/bench/bench-js.json",
     "find": "p2_vs_exact"
    }
   ],
   "ne": "Yalnızca izleme: P² hatası örnek hücrelerde p95’te %19,6’ya çıkıyor; yayımda kullanılmaz."
  },
  {
   "id": "A41",
   "layer": "K10",
   "ad": "Üç okuma düzeyi",
   "what": "Basit / Standart / Uzman rewrite every sentence from the same numbers.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "metin"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katil.js",
     "symbol": "setLevel"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/hesap.mjs",
     "find": "basit"
    }
   ],
   "ne": "Basit / Standart / Uzman, aynı sayılardan her cümleyi yeniden yazar."
  },
  {
   "id": "A42",
   "layer": "K10",
   "ad": "Grafik dürüstlüğü (Lie Factor)",
   "what": "The page measures the bars and columns it actually drew.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "grafik"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-math.js",
     "symbol": "lieFactor"
    },
    {
     "file": "site/assets/katki-math.js",
     "symbol": "worstDistortion"
    }
   ],
   "verify": [
    {
     "file": "site/assets/katil.js",
     "find": "Lie Factor 1,00"
    },
    {
     "file": "katki/tests/math.test.mjs",
     "find": "orthographic"
    }
   ],
   "ne": "Sayfa, gerçekten çizdiği çubukları ve sütunları ölçer."
  },
  {
   "id": "A43",
   "layer": "K10",
   "ad": "Konum: 'sizden az ödeyen'",
   "what": "Mid-rank percentile of the person's own invoice, on device only.",
   "inp": [
    "cekirdek",
    "yayim_hucre"
   ],
   "out": [
    "konum"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katki-core.js",
     "symbol": "positionOf"
    },
    {
     "file": "site/assets/katil.js",
     "symbol": "renderPosition"
    }
   ],
   "verify": [
    {
     "file": "katki/tests/core.test.mjs",
     "find": "position at median"
    }
   ],
   "ne": "Kişinin kendi faturasının orta-sıra yüzdeliği, yalnızca cihazda."
  },
  {
   "id": "A44",
   "layer": "K10",
   "ad": "Dünya kıyası (gerçek veri)",
   "what": "World Bank SH.XPD.OOPC.CH.ZS with year on every row.",
   "inp": [
    "dis_kaynak"
   ],
   "out": [
    "baglam"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katil.js",
     "symbol": "SH.XPD.OOPC.CH.ZS"
    }
   ],
   "verify": [
    {
     "file": "site/katil.html",
     "find": "data.worldbank.org/indicator/SH.XPD.OOPC.CH.ZS"
    }
   ],
   "ne": "Dünya Bankası SH.XPD.OOPC.CH.ZS, her satırda yılıyla."
  },
  {
   "id": "A45",
   "layer": "K10",
   "ad": "Erişilebilirlik ve kararlılık",
   "what": "10 routes × 3 widths: 0 errors, 0 small targets, CLS ≈ 0.",
   "inp": [
    "grafik",
    "metin"
   ],
   "out": [
    "sayfa"
   ],
   "status": "built",
   "impl": [
    {
     "file": "katki/harness/audit-routes.mjs",
     "symbol": "small"
    }
   ],
   "verify": [
    {
     "file": "katki/route-audit.json",
     "find": "katil.html"
    }
   ],
   "ne": "10 rota × 3 genişlik: 0 hata, 0 küçük hedef, CLS ≈ 0."
  },
  {
   "id": "A46",
   "layer": "K11",
   "ad": "Kapılı rota planı ve site haritası",
   "what": "A URL exists only for a publishable cell; no doorway pages.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "rotalar"
   ],
   "status": "built",
   "impl": [
    {
     "file": "katki/seo/routes.mjs",
     "symbol": "export function plan"
    },
    {
     "file": "katki/seo/routes.mjs",
     "symbol": "export function slug"
    }
   ],
   "verify": [
    {
     "file": "katki/seo/routes.test.mjs",
     "find": "no URL for a hidden cell"
    }
   ],
   "ne": "URL yalnızca yayımlanabilir hücre için açılır; boş kapı sayfası yok."
  },
  {
   "id": "A47",
   "layer": "K11",
   "ad": "Açık veri (CSV, yalnızca yayımlanan)",
   "what": "Published cells only, ÖRNEK VERİ header while sample.",
   "inp": [
    "yayim_hucre"
   ],
   "out": [
    "csv"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/katil-hesap.js",
     "symbol": "pLedger"
    }
   ],
   "verify": [
    {
     "file": "site/assets/katil.js",
     "find": "Hücre defteri 81 il"
    }
   ],
   "ne": "Yalnızca yayımlanan hücreler; örnek veride ÖRNEK VERİ başlığıyla."
  },
  {
   "id": "A48",
   "layer": "K11",
   "ad": "Genel API (/cells, /proof)",
   "what": "Latest, by batch, or as of a day.",
   "inp": [
    "asof_hucre",
    "kanit_yolu"
   ],
   "out": [
    "api"
   ],
   "status": "contract",
   "impl": [
    {
     "file": "katki/backend/api/openapi.yaml",
     "symbol": "/cells"
    }
   ],
   "verify": [
    {
     "file": "katki/backend/api/openapi.yaml",
     "find": "name: asof"
    }
   ],
   "reason": "Sunucu kurulmadı.",
   "owner": "backend",
   "ne": "En son, partiye göre ya da geçmiş bir güne göre hücreler; dahil olma kanıtı."
  },
  {
   "id": "A49",
   "layer": "K11",
   "ad": "Veri lisansı ve kurumsal kullanım",
   "what": "Who may use published cells, under which licence.",
   "inp": [
    "api"
   ],
   "out": [
    "lisans"
   ],
   "status": "decision",
   "reason": "Lisans seçilmedi; kurumsal mikro veri satışı rızayla çelişir (MATH_SPEC §6).",
   "owner": "yönetim + hukuk",
   "ne": "Yayımlanan hücreleri kim, hangi lisansla kullanabilir."
  },
  {
   "id": "A50",
   "layer": "K12",
   "ad": "Katmanlar arası şema eşliği",
   "what": "6 fields × 5 layers present; 31 cases agree in JS, Rust, SQL, OpenAPI.",
   "inp": [
    "cekirdek"
   ],
   "out": [
    "esitlik"
   ],
   "status": "built",
   "impl": [
    {
     "file": "katki/corpus/parity.mjs",
     "symbol": "behavioural"
    }
   ],
   "verify": [
    {
     "file": "katki/corpus/parity.json",
     "find": "\"verdict\": \"PASS\""
    }
   ],
   "ne": "6 alan × 5 katman mevcut; 31 durum JS, Rust, SQL, OpenAPI’de aynı."
  },
  {
   "id": "A51",
   "layer": "K12",
   "ad": "Ölçülen performans",
   "what": "ns/op in JS and Rust; found and fixed two hot spots.",
   "inp": [
    "tel"
   ],
   "out": [
    "olcum"
   ],
   "status": "built",
   "impl": [
    {
     "file": "katki/bench/bench.mjs",
     "symbol": "ns_per_op"
    },
    {
     "file": "katki/backend/anydoc-rs/src/main.rs",
     "symbol": "\"bench\""
    }
   ],
   "verify": [
    {
     "file": "katki/bench/bench-js.json",
     "find": "decodeSubmission"
    },
    {
     "file": "katki/bench/bench-rs.json",
     "find": "encode_submission"
    }
   ],
   "ne": "JS ve Rust’ta ns/işlem; iki darboğaz bulundu ve düzeltildi."
  },
  {
   "id": "A52",
   "layer": "K12",
   "ad": "Bağımsız güvenlik incelemesi (CSP, başlıklar)",
   "what": "External review before live data.",
   "inp": [
    "sayfa",
    "api"
   ],
   "out": [
    "guvenlik"
   ],
   "status": "not-built",
   "reason": "Dış ekip seçilmedi; LOGIN_AUDIT’teki başlık listesi hazır.",
   "owner": "güvenlik",
   "ne": "Canlı veriden önce dış güvenlik incelemesi."
  },
  {
   "id": "A54",
   "layer": "K3",
   "ad": "Tesis türü: vakıf / üniversite hastanesi",
   "what": "core-v2 has two values; foundation-university hospitals follow their own extra-fee rules.",
   "inp": [
    "cekirdek"
   ],
   "out": [
    "tesis_v3"
   ],
   "status": "decision",
   "reason": "Üçüncü değer şema değişikliği (core-v3) ister: proto, SQL enum, Rust, OpenAPI, eşlik testi birlikte.",
   "owner": "ürün",
   "ne": "core-v2 iki değer taşır; vakıf üniversite hastaneleri ayrı kurallara tabidir."
  },
  {
   "id": "B01",
   "layer": "K13",
   "ad": "Baro talebi (kişi başına bir)",
   "what": "A lawyer asks for their bar; counts shown, <5 masked; no agreement implied.",
   "inp": [
    "kisi"
   ],
   "out": [
    "baro_talebi"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/barolar.js",
     "symbol": "talep/"
    },
    {
     "file": "site/barolar.html",
     "symbol": "data-demand"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/baro.mjs",
     "find": "r.demand"
    }
   ],
   "ne": "Avukat baronu ister; sayılar görünür, 5’ten az “<5”; anlaşma anlamına gelmez."
  },
  {
   "id": "B02",
   "layer": "K13",
   "ad": "Kurum başvurusu (baro, sendika, oda, dernek)",
   "what": "Inquiry stored under the sender's own id; only the owner reads.",
   "inp": [
    "kisi"
   ],
   "out": [
    "kurum_basvurusu"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/barolar.js",
     "symbol": "basvuru/"
    },
    {
     "file": "site/barolar.html",
     "symbol": "data-inquiry"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/baro.mjs",
     "find": "r.inquiry"
    }
   ],
   "ne": "Başvuru gönderenin kendi kimliği altında saklanır; yalnızca sahip okur."
  },
  {
   "id": "B03",
   "layer": "K13",
   "ad": "Baro protokolü",
   "what": "No fee, no exclusivity, no client referral; bar may suspend at any time.",
   "inp": [
    "kurum_basvurusu",
    "baro_talebi"
   ],
   "out": [
    "baro_protokolu"
   ],
   "status": "decision",
   "reason": "Protokol metni hukuk ve baro hukuk birimiyle yazılacak (Avukatlık Kanunu, TBB Meslek Kuralları).",
   "owner": "hukuk",
   "ne": "Ücret yok, münhasırlık yok, müvekkil yönlendirme yok; baro istediği an askıya alır."
  },
  {
   "id": "B04",
   "layer": "K13",
   "ad": "Kurum kodu (80 bit + mod 97 sağlama)",
   "what": "Random code shown once to the owner; only SHA-256 stored.",
   "inp": [
    "baro_protokolu"
   ],
   "out": [
    "kurum_kodu"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/barolar.js",
     "symbol": "function newCode"
    },
    {
     "file": "site/assets/barolar.js",
     "symbol": "async function codeHash"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/baro.mjs",
     "find": "v_badcheck"
    }
   ],
   "ne": "Rastgele kod sahibe bir kez gösterilir; yalnızca SHA-256 özeti saklanır."
  },
  {
   "id": "B05",
   "layer": "K13",
   "ad": "Doğrudan eşleşme ve %20",
   "what": "Code hashed on the device and matched to active partners; discount per verified seat.",
   "inp": [
    "kurum_kodu"
   ],
   "out": [
    "indirim"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/barolar.js",
     "symbol": "kodHash === h"
    },
    {
     "file": "site/assets/barolar.js",
     "symbol": "RATE = 0.2"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/baro.mjs",
     "find": "v_good"
    },
    {
     "file": "katki/harness/baro.mjs",
     "find": "r.calc"
    }
   ],
   "ne": "Kod cihazda özetlenir, etkin anlaşmalarla eşleşir; indirim doğrulanmış koltuk başına."
  },
  {
   "id": "B06",
   "layer": "K13",
   "ad": "Liste fiyatları",
   "what": "Plans exist; prices are null until published (one config line).",
   "inp": [
    "kisi"
   ],
   "out": [
    "fiyat"
   ],
   "status": "decision",
   "reason": "Fiyatlar belirlenmedi; sayfa 'liste fiyatı yayımlanmadı' gösterir.",
   "owner": "yönetim",
   "ne": "Planlar hazır; fiyatlar yayımlanana kadar boş (tek yapılandırma satırı)."
  },
  {
   "id": "B07",
   "layer": "K13",
   "ad": "Abonelik ve ödeme",
   "what": "Checkout applying the verified discount; invoicing.",
   "inp": [
    "fiyat",
    "indirim"
   ],
   "out": [
    "abonelik"
   ],
   "status": "not-built",
   "reason": "Ödeme sağlayıcısı ve e-fatura entegrasyonu seçilmedi.",
   "owner": "ürün",
   "ne": "Doğrulanmış indirimi uygulayan ödeme ve faturalama."
  },
  {
   "id": "H01",
   "layer": "K14",
   "ad": "Çift kahraman (A: index.html insan · B: index.b.html parmak)",
   "what": "A and B are separate files, never mounted together (router chooses the file); identity asset morphs with the scenario tab.",
   "inp": [
    "kisi"
   ],
   "out": [
    "hasta_giris"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/index.html",
     "symbol": "data-hh-asset"
    },
    {
     "file": "hasta-build/extras.py",
     "symbol": "def build_b"
    },
    {
     "file": "site/assets/hasta.js",
     "symbol": "startForm"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/hasta.mjs",
     "find": "kolA"
    },
    {
     "file": "katki/harness/kabuk.mjs",
     "find": "index.b.html"
    }
   ],
   "ne": "A ve B ayrı dosyalardır (index.html, index.b.html), aynı sayfada asla birlikte yok; kimlik varlığı durum sekmesiyle değişir."
  },
  {
   "id": "H02",
   "layer": "K14",
   "ad": "Üç durum: önce · kasada · sonra",
   "what": "Tablist drives panel, legend and identity stage; each scenario has its own page.",
   "inp": [
    "hasta_giris"
   ],
   "out": [
    "durum"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/hasta.js",
     "symbol": "var STAGE"
    },
    {
     "file": "site/vezne.html",
     "symbol": "data-show-toggle"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/hasta.mjs",
     "find": "r.tab"
    },
    {
     "file": "katki/harness/hasta.mjs",
     "find": "vezneEsc"
    }
   ],
   "ne": "Sekme paneli, lejantı ve kimlik aşamasını sürer; her durumun kendi sayfası var."
  },
  {
   "id": "H03",
   "layer": "K14",
   "ad": "Tavan hesabı (tam sayı kuruş)",
   "what": "Cap = 2 × SGK, 0 in exempt services; result is ADAY until a document confirms it.",
   "inp": [
    "durum"
   ],
   "out": [
    "aday_fark"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/hasta.js",
     "symbol": "var tavan = ist ? 0 : 2 * sgk"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/hasta.mjs",
     "find": "calc034"
    }
   ],
   "ne": "Tavan = 2 × SGK, istisnada 0; belge doğrulayana kadar sonuç ADAY."
  },
  {
   "id": "H04",
   "layer": "K14",
   "ad": "Hasta sayfaları ve sözlük (37 sayfa)",
   "what": "Guides, terms, sources, press links and hospital list generated from the reference corpus; one nav and footer everywhere.",
   "inp": [
    "hasta_giris"
   ],
   "out": [
    "hasta_sayfalari"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/build.py",
     "symbol": "def sync"
    },
    {
     "file": "hasta-build/chrome.py",
     "symbol": "def foot"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/audit-all.mjs",
     "find": "navOv"
    }
   ],
   "ne": "Rehber, terim, kaynak, basın ve hastane sayfaları referans derlemeden üretilir; her sayfada aynı menü ve alt bilgi."
  },
  {
   "id": "H05",
   "layer": "K14",
   "ad": "Planlar ₺490 / ₺690 → app.iadeos.com",
   "what": "Prices shown from one config; buttons open app.iadeos.com/odeme?plan=…",
   "inp": [
    "aday_fark"
   ],
   "out": [
    "plan_secimi"
   ],
   "status": "contract",
   "impl": [
    {
     "file": "site/assets/hasta.js",
     "symbol": "kurus: 49000"
    },
    {
     "file": "site/planlar.html",
     "symbol": "odeme?plan=koruma-14"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/hasta.mjs",
     "find": "planLinks"
    }
   ],
   "reason": "Kanonik katalog plans.ts 29.900/59.900 kuruş; 49.000/69.000'e ve PayTR geri çağrısına çekilmeli.",
   "owner": "ürün",
   "ne": "Fiyatlar tek yapılandırmadan; düğmeler app.iadeos.com/odeme?plan=… açar."
  },
  {
   "id": "H06",
   "layer": "K14",
   "ad": "Ödeme ve satır satır denetim",
   "what": "Checkout, upload, audit report and petition drafts in the patient app.",
   "inp": [
    "plan_secimi"
   ],
   "out": [
    "hasta_raporu"
   ],
   "status": "not-built",
   "reason": "app.iadeos.com bu pakette değil; ekip deposunda.",
   "owner": "ürün",
   "ne": "Hasta uygulamasında ödeme, yükleme, rapor ve dilekçe taslakları."
  },
  {
   "id": "H07",
   "layer": "K14",
   "ad": "Hastane dizini (1.181 kayıt)",
   "what": "Public Ministry lists with source and date; SGK contract state shown as ÖLÇÜLMEDİ for every row.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "hastane_dizini"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/hasta.js",
     "symbol": "data-hosp"
    },
    {
     "file": "hasta-build/build.py",
     "symbol": "def hastaneler"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/hasta.mjs",
     "find": "hospQ"
    }
   ],
   "ne": "Bakanlık listeleri kaynağı ve tarihiyle; SGK sözleşmesi her satırda ÖLÇÜLMEDİ."
  },
  {
   "id": "H08",
   "layer": "K14",
   "ad": "Basın arşivi özetleri",
   "what": "Links only; headlines not yet compared with the original articles.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "basin_ozeti"
   ],
   "status": "decision",
   "reason": "Editör her başlığı asıl haberle karşılaştıracak; metin alıntısı yapılmayacak.",
   "owner": "editör",
   "ne": "Yalnızca bağlantı; başlıklar asıl haberle karşılaştırılmadı."
  },
  {
   "id": "H09",
   "layer": "K14",
   "ad": "Saklama, barındırma ve aydınlatma metinleri",
   "what": "Bracketed placeholders on güvenlik and plan pages.",
   "inp": [
    "hasta_raporu"
   ],
   "out": [
    "kvkk_metni"
   ],
   "status": "decision",
   "reason": "Hukuk ve güvenlik incelemesi (KVKK m.6, VERBİS) tamamlanınca yazılacak.",
   "owner": "hukuk",
   "ne": "Güvenlik ve plan sayfalarında köşeli parantezli yer tutucular."
  },
  {
   "id": "H10",
   "layer": "K14",
   "ad": "Bileşen kitleri (giriş ×4 + 6 sayfa)",
   "what": "Self-contained HTML per page and login variant, plus DOM-read component inventory.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "kit"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/kit.py",
     "symbol": "def inventory"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/kitcheck.mjs",
     "find": "requestfailed"
    }
   ],
   "ne": "Her sayfa ve giriş varyantı için tek dosya; DOM'dan okunan bileşen envanteri."
  },
  {
   "id": "H11",
   "layer": "K14",
   "ad": "Güneş / Ay görünümü",
   "what": "Theme before first paint (?tema, saved, OS); radial view transition; browser chrome colour; dark token remap.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "tema"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/chrome.py",
     "symbol": "THEME_HEAD"
    },
    {
     "file": "site/assets/tema.css",
     "symbol": "data-theme=\"dark\""
    }
   ],
   "verify": [
    {
     "file": "katki/harness/tema.mjs",
     "find": "theme-color"
    },
    {
     "file": "katki/harness/darkshots.mjs",
     "find": "koyu"
    }
   ],
   "ne": "Tema ilk boyamadan önce seçilir; tıklanan noktadan açılan geçiş; tarayıcı çerçevesi rengi."
  },
  {
   "id": "H12",
   "layer": "K14",
   "ad": "Ön alt bilgi parçacık alanı",
   "what": "WebGL1 field from KATKI.sample: scattered → 81 il → Λ; governor, IO pause, reduced-motion static.",
   "inp": [
    "hasta_giris"
   ],
   "out": [
    "pf"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/hasta-field.js",
     "symbol": "IADEOS_FIELD"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/pf.mjs",
     "find": "IADEOS_FIELD.stats"
    }
   ],
   "ne": "Ön alt bilgide fatura satırlarından parçacık alanı: dağınık → 81 il → Λ."
  },
  {
   "id": "H13",
   "layer": "K14",
   "ad": "Işık çizgisi",
   "what": "Fixed line fills with scroll from page start to end; a tick per section lights as the bead passes and the section heading line ignites. Transform only.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "iz"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/kabuk.js",
     "symbol": "ışık çizgisi"
    },
    {
     "file": "site/assets/kabuk.css",
     "symbol": ".iz__bead"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/kabuk.mjs",
     "find": "izMid"
    }
   ],
   "ne": "Sayfanın başından sonuna kaydırmayla dolan ışık çizgisi; geçilen bölüm tutuşur."
  },
  {
   "id": "H14",
   "layer": "K14",
   "ad": "Site katmanı: tasarım sistemi SiteChrome (hasta derlemesi)",
   "what": "The av.iadeos.com components themselves, built for patients from ds-hasta/src: ⌘K / Ctrl K / '/' search over site-index.js, contact rail + drawer, feedback, motion switch, DEOS bottom right, measurement consent, phone dock DEOS · Ara · İletişim · Geri bildirim · Durdur/Oynat. Mounted as an <ia-island> by boot.js + islands.js (LCP first).",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "ara"
   ],
   "status": "built",
   "impl": [
    {
     "file": "ds-hasta/src/site.ts",
     "symbol": "audience: 'hasta'"
    },
    {
     "file": "ds-hasta/islands.js",
     "symbol": "SiteChrome"
    },
    {
     "file": "ds-hasta/boot.js",
     "symbol": "IADEOS_CALL"
    },
    {
     "file": "hasta-build/chrome.py",
     "symbol": "def dock"
    },
    {
     "file": "hasta-build/extras.py",
     "symbol": "site-index.js"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/ds.mjs",
     "find": "searchOpen"
    },
    {
     "file": "katki/harness/ds.mjs",
     "find": "dock"
    }
   ],
   "ne": "av.iadeos.com'un kendi bileşenleri hasta için derlendi: arama, iletişim, geri bildirim, hareket anahtarı, DEOS, 5 düğmeli alt çubuk."
  },
  {
   "id": "H15",
   "layer": "K14",
   "ad": "Sayılar: kaynaklı, anında",
   "what": "Four figures from official sources (hospitals, doctor visits, 2× cap, ₺186.000) in the HTML at first paint; toggles and inputs update at once (no count-up); the arbitration route uses the law's 'below 186.000' rule.",
   "inp": [
    "hasta_giris"
   ],
   "out": [
    "sayilar"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/index.html",
     "symbol": "id=\"sayilar\""
    },
    {
     "file": "site/assets/kabuk.js",
     "symbol": "LIMIT = 186000"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/kabuk.mjs",
     "find": "yol186"
    },
    {
     "file": "katki/harness/kabuk.mjs",
     "find": "firstPaint"
    }
   ],
   "ne": "Dört resmî sayı ilk boyamada yerinde; her biri bir dokunuşla 'neden önemli' durumuna geçer."
  },
  {
   "id": "H16",
   "layer": "K14",
   "ad": "Alt bilgi: beyan, dipnotlar, makine uçları",
   "what": "Not-a-law-firm statement, numbered footnotes, Markdown copy, index.md, llms.txt, ara.json, last updated date.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "dipnot"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/chrome.py",
     "symbol": "NOTES"
    },
    {
     "file": "hasta-build/extras.py",
     "symbol": "def build_md_and_llms"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/kabuk.mjs",
     "find": "md"
    }
   ],
   "ne": "Hukuk bürosu değildir beyanı, dipnotlar, Markdown kopyala, index.md ve llms.txt."
  },
  {
   "id": "H17",
   "layer": "K14",
   "ad": "İletişim ve geri bildirim kaydı (canlı sitede)",
   "what": "In the published artifact the DS forms write iletisim/<uid> and geri/<uid> (owner reads); elsewhere they stay in preview and send nothing. The production endpoint (POST /api/v1/iletisim, /geri-bildirim) and retention are open.",
   "inp": [
    "ara"
   ],
   "out": [
    "geri"
   ],
   "status": "decision",
   "reason": "Canlı sitede formların nereye gideceği (e-posta, CRM ya da veritabanı) ve saklama süresi seçilecek.",
   "owner": "ürün",
   "ne": "Formlar artifact'te kendi veritabanına yazar; canlı sitede nereye gideceği seçilecek."
  },
  {
   "id": "H18",
   "layer": "K14",
   "ad": "DEOS · hasta bilgi tabanı ve ajanı",
   "what": "The reference DEOS engine (retriever, flows, agent) with a patient knowledge base: the reference legal entries verbatim, patient product/plan/cashier entries, a three-question plan survey (₺490 / ₺690), the five-question quiz; handoff shows only channels that lead somewhere; agent rules forbid lawyer referral.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "deos"
   ],
   "status": "built",
   "impl": [
    {
     "file": "ds-hasta/src/deos-kb.ts",
     "symbol": "export const KB"
    },
    {
     "file": "ds-hasta/src/deos-engine.ts",
     "symbol": "export function handoffActions"
    },
    {
     "file": "ds-hasta/src/deos-engine.ts",
     "symbol": "Avukat önerme"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/ds.mjs",
     "find": "tavanAnswer"
    },
    {
     "file": "katki/harness/ds.mjs",
     "find": "plan"
    },
    {
     "file": "katki/harness/ds.mjs",
     "find": "agent"
    }
   ],
   "ne": "DEOS hasta bilgi tabanıyla: hukuk yanıtları referanstan, plan anketi ₺490/₺690, avukat yönlendirmesi yok."
  },
  {
   "id": "H19",
   "layer": "K14",
   "ad": "Ücretsiz araçlar: tasarım sistemi adaları",
   "what": "RefundCalculator, DocChecklist, InterestCalculator (9 · 24 · 31 %), RouteFinder, ExemptionCheck on araclar.html as islands; the earlier HTML tools stay inside each island as its no-JS fallback.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "araclar"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/build.py",
     "symbol": "def araclar_islands"
    },
    {
     "file": "ds-hasta/src/tools.tsx",
     "symbol": "export function RouteFinder"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/ds.mjs",
     "find": "route2"
    },
    {
     "file": "katki/harness/ds.mjs",
     "find": "refundEx"
    }
   ],
   "ne": "Beş ücretsiz araç tasarım sistemi bileşeni olarak; eski araçlar JS yokken yedek."
  },
  {
   "id": "H20",
   "layer": "K14",
   "ad": "Durdur / Oynat bütün tuvallerde (WCAG 2.2.2)",
   "what": "html[data-motion] from the DS switch stops every autonomous loop (identity, pre-footer field, specimens, 3D maps) and resumes them; CSS animations pause.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "hareket"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/kabuk.js",
     "symbol": "iadeos:hareket"
    },
    {
     "file": "site/assets/hasta-field.js",
     "symbol": "stillNow"
    },
    {
     "file": "site/assets/katil-3d.js",
     "symbol": "intro jumps to its end state"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/hareket.mjs",
     "find": "rafPerSec"
    }
   ],
   "ne": "Durdur bütün tuvalleri ve CSS hareketini durdurur, Oynat sürdürür."
  },
  {
   "id": "H21",
   "layer": "K14",
   "ad": "DEOS uygulaması ve bütün ekranları",
   "what": "deos.html: the live DEOS full screen (same engine and conversation as the floating one) and the reference board 1:1: 8 mark states with their parameters, nudge and the damped-shake curve drawn from the same equation, 14 live panels with patient conversations, the 4-tier state machine and measured retrieval accuracy.",
   "inp": [
    "deos"
   ],
   "out": [
    "deos_pano"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/boards.py",
     "symbol": "def deos_page"
    },
    {
     "file": "ds-hasta/src/deos.tsx",
     "symbol": "Babam hâlâ hastanede yatıyor"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/boards.mjs",
     "find": "lawyerWords"
    },
    {
     "file": "katki/harness/boards.mjs",
     "find": "quizWhy"
    }
   ],
   "ne": "DEOS tam ekran ve referans panosu birebir: 8 işaret durumu, çağrı, 14 canlı ekran, motor."
  },
  {
   "id": "H22",
   "layer": "K14",
   "ad": "DEOS doğruluğu: ayar ve görülmemiş set",
   "what": "112 patient questions: 52 tuning, the v13 held-out 20 (folded into tuning in v14) and a second held-out set of 40 written before the v14 tuning, short search queries included. Decision rule sure(): score ≥ CONF.answer, or ≥ CONF.lead and ≥ CONF.ratio × runner-up; the expected entry must win; out-of-scope questions must get no prepared answer. Results to assets/ds/deos-olcum.json and the DEOS board.",
   "inp": [
    "deos"
   ],
   "out": [
    "deos_olcum"
   ],
   "status": "built",
   "impl": [
    {
     "file": "ds-hasta/qa/deos-eval.mjs",
     "symbol": "gorulmemis"
    },
    {
     "file": "ds-hasta/qa/deos-heldout.json",
     "symbol": "ayar sırasında açılmadı"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/boards.mjs",
     "find": "#motor .db-table"
    }
   ],
   "ne": "DEOS hasta sorularında ölçüldü: görülmemiş set 2'de ayardan önce 24/34, sonra 29/34 doğrudan doğru, 31/34 tek tıkla; 1 yanlış, kapsam dışı 6 sorudan 1'ine yanıt."
  },
  {
   "id": "H23",
   "layer": "K14",
   "ad": "Marka paleti ve tasarım sistemi panosu, çapraz denetimli",
   "what": "sistem.html generated from tokens.json, the site's CSS and the DS bundle: palette, roles in kâğıt / mürekkep / ay, WCAG ratio for every text and control pair (43), token parity tokens.json ↔ site :root ↔ bundle var() fallbacks (25), type, spacing, radius, border, z-index, live components. denetim.json; a failing pair or a drifted value fails the board test.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "sistem"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/boards.py",
     "symbol": "def audit"
    },
    {
     "file": "hasta-build/boards.py",
     "symbol": "def ratio"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/boards.mjs",
     "find": "rowsMatch"
    },
    {
     "file": "katki/harness/boards.mjs",
     "find": "liveTokens"
    }
   ],
   "ne": "Palet ve belirteçler üç temada; 43 kontrast çifti ve 25 değer eşitliği denetlendi."
  },
  {
   "id": "H24",
   "layer": "K14",
   "ad": "Resmî hesaplar @iadeos",
   "what": "One source (ds-hasta/src/sosyal.json): Instagram, LinkedIn, X, GitHub (public benchmarks only), F6S. Footer on every page, contact page, contact drawer, kanallar.html, Organization sameAs, llms.txt, index.md and a DEOS answer. Links only: rel=me noopener noreferrer; no embeds, pixels or widgets.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "sosyal"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/chrome.py",
     "symbol": "def sosyal_links"
    },
    {
     "file": "hasta-build/build.py",
     "symbol": "def kanallar"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/aradeos.mjs",
     "find": "footSocial"
    },
    {
     "file": "katki/harness/aradeos.mjs",
     "find": "sameAs"
    }
   ],
   "ne": "Beş resmî hesap (@iadeos) tek dosyadan: alt bilgi, iletişim, çekmece, kanallar sayfası, sameAs, DEOS."
  },
  {
   "id": "H25",
   "layer": "K14",
   "ad": "DEOS aramanın içinde (Ctrl K)",
   "what": "Site search runs the DEOS retriever on every keystroke (same rule as the chat): a sure answer shows as a sourced card above the page results; otherwise an “ask DEOS” row and up to three prepared questions. Enter opens the chat with the answer, Ctrl/⌘ Enter sends the typed question.",
   "inp": [
    "deos"
   ],
   "out": [
    "arama_deos"
   ],
   "status": "built",
   "impl": [
    {
     "file": "ds-hasta/src/deos-engine.ts",
     "symbol": "export function deosPeek"
    },
    {
     "file": "ds-hasta/src/chrome.tsx",
     "symbol": "toDeos"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/aradeos.mjs",
     "find": "ia-search-deos"
    },
    {
     "file": "katki/harness/aradeos.mjs",
     "find": "Control+Enter"
    }
   ],
   "ne": "Ctrl K: DEOS'un kaynaklı yanıtı arama sonuçlarının üstünde; Ctrl Enter soruyu DEOS'a gönderir."
  },
  {
   "id": "H26",
   "layer": "K14",
   "ad": "Sıfır üçüncü taraf istek",
   "what": "IBM Plex (SIL OFL) and three.js 0.160.0 served from the site; Google Fonts and the jsDelivr import map removed from every page; kits embed both. The harness aborts any non-local request and fails the page.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "yerel"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/build.py",
     "symbol": "def yerel"
    },
    {
     "file": "hasta-build/chrome.py",
     "symbol": "FONTS_HEAD"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/aradeos.mjs",
     "find": "extByPage"
    },
    {
     "file": "katki/harness/aradeos.mjs",
     "find": "fontOk"
    }
   ],
   "ne": "Yazı tipi ve three.js siteden; hiçbir sayfa başka sunucuya istek atmaz."
  },
  {
   "id": "H27",
   "layer": "K14",
   "ad": "Sayılar kaydırınca açılır ve sayar",
   "what": "Each number card glides in when 45% is on screen and counts from 0 with s(t) = 1 − (1 + ωt)e^(−ωt), ω = 8, 1.1 s; width locked first (no layout shift); final value in the HTML; instant when paused or reduced motion; pill changes tween 0.6 s. Phones: the four cards swipe with scroll-snap and position dots.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "sayilar"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/kabuk.js",
     "symbol": "countTo"
    },
    {
     "file": "site/assets/kabuk.css",
     "symbol": "sayi__dots"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/kabuk.mjs",
     "find": "perDay"
    },
    {
     "file": "katki/harness/hareket.mjs",
     "find": "paused"
    }
   ],
   "ne": "Sayılar kartı ekrana girince açılır ve 0'dan sayar; telefonda kartlar kaydırılır."
  },
  {
   "id": "H28",
   "layer": "K14",
   "ad": "Sayfa başında Λ alanı, çağrıda 3B parmak izi, kahramanda yalnızca yüz",
   "what": "The particle field (sample data, labelled) heads every inner page without its own art; every 'Başlayın' block carries the 3D fingerprint (second instance of the identity engine); the home hero is the 3D face only, no switch. All stop at 0 frames when paused.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "baslik_alani"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/build.py",
     "symbol": "def baslik_alani"
    },
    {
     "file": "site/assets/hasta.js",
     "symbol": "data-pf-iz"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/pf.mjs",
     "find": "IADEOS_IZ"
    },
    {
     "file": "katki/harness/hareket.mjs",
     "find": "guvenlik.html"
    }
   ],
   "ne": "İç sayfaların başında Λ alanı; Başlayın'da 3B parmak izi; ana sayfa kahramanında yalnızca yüz."
  },
  {
   "id": "H29",
   "layer": "K14",
   "ad": "Kanallar: Instagram, X, LinkedIn, F6S, e-posta",
   "what": "One source (ds-hasta/src/sosyal.json); handle iadeos; mail via mailto; generic @ and envelope icons (official logos drop in under assets/brand/sosyal/); footer, contact page, drawer, kanallar.html, sameAs + email, DEOS, llms.txt.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "sosyal"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/chrome.py",
     "symbol": "def sosyal_icon"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/aradeos.mjs",
     "find": "footSocial"
    }
   ],
   "ne": "Instagram, X, LinkedIn, F6S ve e-posta tek dosyadan; simgeli."
  },
  {
   "id": "H30",
   "layer": "K14",
   "ad": "Telefon denetimi",
   "what": "Every page at 360, 390, 414 px and 390 dark: horizontal overflow, elements past the edge, tap targets ≥ 24 px (2.5.8), text ≥ 12 px, inputs ≥ 16 px, fixed layers overlapping, dock hiding the last content, unsized images, page errors, one h1.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "mobil"
   ],
   "status": "built",
   "impl": [
    {
     "file": "site/assets/kabuk.css",
     "symbol": "okunurluk tabanı"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/mobil.mjs",
     "find": "fixedOverlap"
    },
    {
     "file": "katki/harness/mobil.mjs",
     "find": "tiny"
    }
   ],
   "ne": "41 sayfa dört telefon görünümünde denetlendi: taşma, dokunma hedefi, yazı boyu, katman çakışması."
  },
  {
   "id": "H31",
   "layer": "K14",
   "ad": "Tasarım varlıkları panosu",
   "what": "pano.html generated each build: desktop and phone first screen of every page (captured from the pages), every asset with size and SHA-256, registry levels by layer.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "pano"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/boards.py",
     "symbol": "def pano_page"
    },
    {
     "file": "katki/harness/pano-shots.mjs",
     "symbol": "pano.json"
    }
   ],
   "verify": [
    {
     "file": "katki/harness/boards.mjs",
     "find": "pano"
    }
   ],
   "ne": "Pano: bütün sayfaların iki ekranı, bütün varlıklar SHA-256 ile, kütük seviyeleri."
  },
  {
   "id": "H32",
   "layer": "K14",
   "ad": "PAT-1 · PAT-2 · PAT-3 paketleri",
   "what": "Three ZIPs each ≤ 29 MB: PAT-1 the runnable site with server and runners, PAT-2 sources, build and kits, PAT-3 evidence (benchmarks, audits, screenshots, docs). SHA256SUMS per pack and per file; smoke test (every page and every local reference answers 200, no third-party URL) and tracer bullet (one patient path end to end) run on the unpacked copies.",
   "inp": [
    "hasta_sayfalari"
   ],
   "out": [
    "paket"
   ],
   "status": "built",
   "impl": [
    {
     "file": "hasta-build/paketle.py",
     "symbol": "def paketle"
    }
   ],
   "verify": [
    {
     "file": "hasta-build/paket/smoke_test.py",
     "find": "DUMAN TESTİ"
    },
    {
     "file": "hasta-build/paket/tracer_bullet.py",
     "find": "İZLEYİCİ MERMİ"
    }
   ],
   "ne": "PAT-1/2/3: her biri 29 MB altında, SHA-256, duman testi ve izleyici mermi açılmış kopyada."
  },
  {
   "id": "A53",
   "layer": "K12",
   "ad": "%200 çizgisinin birincil hukuki kaynağı",
   "what": "Replace the newspaper source with the SUT/SGK text.",
   "inp": [
    "fark_hucre"
   ],
   "out": [
    "kaynak"
   ],
   "status": "decision",
   "reason": "Hukuk metni seçecek.",
   "owner": "hukuk",
   "ne": "Gazete kaynağı yerine SUT/SGK metni."
  }
 ],
 "axioms": [
  {
   "id": "deger",
   "ad": "Değer ≠ emek (Picasso)",
   "how": "The value of a number is the decision it changes, not the cost of computing it.",
   "steps": [
    "A43",
    "A38",
    "A34"
   ]
  },
  {
   "id": "uc-deger",
   "ad": "Beklenen → algılanan → gerçek değer",
   "how": "Expected: the promise in the hero. Perceived: the invoice read on the device in ~2 ms. True: a verifiable position and a proof of inclusion.",
   "steps": [
    "A04",
    "A43",
    "A25"
   ]
  },
  {
   "id": "buyuk-sayilar",
   "ad": "Büyük sayılar yasası",
   "how": "Width ∝ 1/√n; each percentile unlocks at its exact-binomial n (6, 13, 36, 72).",
   "steps": [
    "A28",
    "A40",
    "A01"
   ]
  },
  {
   "id": "asch",
   "ad": "Asch uyum etkisine karşı",
   "how": "The crowd number is shown after the person's own invoice is read, never as a target to agree with; no ratings, no votes.",
   "steps": [
    "A43",
    "A11"
   ]
  },
  {
   "id": "nedensellik",
   "ad": "Korelasyon ≠ nedensellik",
   "how": "The page decomposes and tests; it never claims a cause. A signal says 'look', not 'why'.",
   "steps": [
    "A38",
    "A35",
    "A34"
   ]
  },
  {
   "id": "sistem",
   "ad": "Sistem ve ortaya çıkış",
   "how": "Tariff, surcharge and participation interact; panels are linked so one change moves every view.",
   "steps": [
    "A38",
    "A39"
   ]
  },
  {
   "id": "tesvik",
   "ad": "Teşvikler",
   "how": "One pledge per person, no leaderboard of hospitals, no reward for volume.",
   "steps": [
    "A01",
    "A33"
   ]
  },
  {
   "id": "baro-ag",
   "ad": "Kartopu (1 + 1 = 3)",
   "how": "Bar demand, lawyer use, client evidence and institution members share nodes; the cross term is modelled, not promised.",
   "steps": [
    "B01",
    "B05",
    "A43",
    "A01"
   ]
  },
  {
   "id": "via-negativa",
   "ad": "Via negativa",
   "how": "What the system never does is enforced by tests, not promised.",
   "steps": [
    "A17",
    "A29",
    "A28",
    "A42"
   ]
  }
 ],
 "via_negativa": [
  {
   "rule": "Ham dosya ağa çıkmaz.",
   "step": "A17",
   "test": "egress.mjs: 5 dosyada 0 istek"
  },
  {
   "rule": "TCKN, IBAN, ad, adres sunucuya gitmez; çekirdekte bu alanlar yoktur.",
   "step": "A09",
   "test": "anydoc.test.mjs + egress.mjs"
  },
  {
   "rule": "n < eşik hücre yayımlanmaz; güven aralığı sığmayan yüzdelik gösterilmez.",
   "step": "A28",
   "test": "core.test.mjs orderCI"
  },
  {
   "rule": "Hiçbir değer çıkarma yoluyla açılamaz.",
   "step": "A29",
   "test": "core.test.mjs tamamlayıcı gizleme"
  },
  {
   "rule": "Grafik ölçüsü veriyle orantısız olamaz (Lie Factor 0,95–1,05).",
   "step": "A42",
   "test": "in-page harness, çizilen çubuklar"
  },
  {
   "rule": "Gürültü 'değişim' diye sunulmaz: sıra testi + BH.",
   "step": "A34",
   "test": "math.test.mjs"
  },
  {
   "rule": "Mühürlü kayıt değiştirilemez; geri çekme yeni bir olgudur.",
   "step": "A26",
   "test": "medallion.test.sql"
  },
  {
   "rule": "Hastane adı tutulmaz; ad türetilmiş bir takma adla da tutulmaz.",
   "step": "A10",
   "test": "anydoc.test.mjs hospital name withheld"
  },
  {
   "rule": "Akış tahmini (P²) yayım kararı vermez.",
   "step": "A40",
   "test": "bench-js.json p2_vs_exact"
  },
  {
   "rule": "Veri olmayan hücreye sayfa açılmaz.",
   "step": "A46",
   "test": "routes.test.mjs"
  },
  {
   "rule": "Örnek veri gerçek gibi sunulmaz: her görünümde ÖRNEK VERİ.",
   "step": "A41",
   "test": "katil.html"
  },
  {
   "rule": "Kapı başarısızlığı başarıya çevrilmez: testler eşik düşürülerek geçirilmez.",
   "step": "A50",
   "test": "parity.mjs FAIL → exit 1"
  }
 ],
 "sources": [
  "kisi",
  "dis_kaynak"
 ],
 "dictionary": [
  {
   "logical": "ay",
   "js": "ay",
   "proto": "ay (2)",
   "sql": "ay char(7)",
   "rust": "ay",
   "openapi": "ay",
   "kural": "YYYY-AA; gün hiçbir zaman gönderilmez",
   "yayim": "hücre penceresi (çeyrek veya ay — karar bekliyor)",
   "not": "geçerlilik zamanı Tv"
  },
  {
   "logical": "il",
   "js": "il",
   "proto": "il (3)",
   "sql": "il char(2)",
   "rust": "il",
   "openapi": "il",
   "kural": "01–81 plaka kodu",
   "yayim": "hücre anahtarı",
   "not": "il adı istemcide"
  },
  {
   "logical": "kod",
   "js": "kod",
   "proto": "kod (4)",
   "sql": "kod char(7)",
   "rust": "kod",
   "openapi": "kod",
   "kural": "P + 6 rakam (yalnızca biçim)",
   "yayim": "hücre anahtarı",
   "not": "SUT sürümü ayrı tablo (karar)"
  },
  {
   "logical": "fiyat",
   "js": "fiyat",
   "proto": "fiyat_kurus (5)",
   "sql": "fiyat_kurus bigint",
   "rust": "fiyat",
   "openapi": "fiyat",
   "kural": "0 < x < 10⁹ kuruş, tam sayı",
   "yayim": "yalnızca yüzdelik ve CI; tek kayıt asla",
   "not": "gönderilir (altı alandan biri); tek n’de medyan bir kayda eşittir → A32"
  },
  {
   "logical": "sut",
   "js": "sut_bedeli",
   "proto": "sut_kurus (6)",
   "sql": "sut_kurus bigint",
   "rust": "sut_bedeli",
   "openapi": "sut_bedeli",
   "kural": "0 < x < 10⁹ kuruş",
   "yayim": "Φ = fiyat/SUT − 1 özetleri",
   "not": "belgede yazan SUT"
  },
  {
   "logical": "tesis",
   "js": "tesis",
   "proto": "tesis enum (7)",
   "sql": "tesis silver.tesis",
   "rust": "tesis",
   "openapi": "tesis",
   "kural": "ozel_hastane | kamu_hastanesi",
   "yayim": "hücre anahtarı",
   "not": "vakıf/üniversite yok → A54"
  }
 ],
 "never_collected": [
  "T.C. kimlik no",
  "IBAN",
  "telefon",
  "e-posta",
  "ad soyad",
  "adres",
  "hastane adı",
  "tanı / ICD kodu",
  "doktor adı",
  "fatura günü",
  "dosyanın kendisi"
 ]
}