Bu şartname, Tamga'daki belge türlerinin (şemaların) nasıl adlandırıldığını, yayınlandığını ve doğrulayıcıda (verifier)Gösterilen belgeyi denetleyen taraf: imza, belge verenin güven listesindeki kaydı, durum ve politika. Relying party diye de anılır. nasıl çözüldüğünü tanımlar; belge veren (issuer)Belgeyi imzalayıp veren kurum: üniversite, meslek kuruluşu, kamu kurumu ya da şirket. kurumlar, doğrulayıcı geliştiricileri ve şema yazarları içindir.
Ne zaman okunur
- Önce Belge biçimleri kavram sayfasını okuyun.
- Yeni bir belge türü tasarlıyorsanız ya da doğrulayıcınızda bir belgenin türünü çözüyorsanız bu sayfa sizin için.
- Türlerin içeriği ayrı belgelerde: eğitim SPEC-SCHEMA-0002, diğer sektörler SPEC-SCHEMA-0003.
Kısaca
Her belge türünün bir adı (vct (Verifiable Credential Type)SD-JWT VC'de belge türünün kalıcı kimliği; Tamga'da urn:tamga:edu:Diploma:1 gibi bir URN'dir.) vardır: urn:tamga:edu:DiplomaCredential:1 gibi. Bu adın karşılığı schemas.tamga.network'te yayınlanan bir tür tanımıdır (Type Metadata): belgede hangi alanların olduğunu, ekranda nasıl gösterileceğini ve hangi alanların gizlenebileceğini söyler. Tür tanımının parmak izi (integrity) belgeye yazılır; doğrulayıcı indirdiği tanımın bu parmak iziyle eşleştiğini denetler, böylece tanım sessizce değiştirilemez. Hangi türlerin geçerli olduğu imzalı güven listesinde (trust list)Bir ülkenin kök sertifikalarını, belge verenlerini ve kayıtlı relying party'lerini taşıyan imzalı liste. Bugün Tamga'da güven bu listelere dayanır; ortak defter sonra gelir. yayınlanır.
Bugün katalog imzalı güven listeleriyle (
lotl.schemas[]+ çapa günlüğü) yayınlanır. §5'teki kontrat arayüzleri ve yayın hattındaki zincir adımı zincir aşamasına aittir (ADR-0009).
Kapsam
Bu şartname, Tamga şema kayıt defterinin teknik olarak nasıl çalıştığını tanımlar. Kararlar ve gerekçeler ADR-0007 ve PM-SCHEMA-0001'dedir; burada tekrar edilmez.
Kapsam dışı: tekil şemaların içeriği (SPEC-SCHEMA-0002 eğitim, SPEC-SCHEMA-0003 diğer sektörler).
Standart temeli: SD-JWT VC (Selective Disclosure JWT Verifiable Credential)Selective disclosure destekli JSON tabanlı belge biçimi; EUDI Wallet'ta ve Tamga'da çevrimiçi gösterme için kullanılır. (draft-ietf-oauth-sd-jwt-vc-19) Type Metadata bölümü; JSON Schema draft 2020-12; W3C Subresource Integrity (integrity metadata dize biçimi).
1. URL Şeması ve İsim Alanları
1.1 Genel biçim
Geliştirme evresi (ADR-0029): beta yayınına kadar şemalar aynı sürüm yolunda yerinde düzeltilir; D1 ve küçük sürüm kuralı beta (
SCHEMA_STAGE = "stable") ile uygulanır. Katalog velotl.schemas[]girdisicontent_hashesalanını taşır; doğrulayıcı (B4) ve cüzdan belgeninvct#integrity'sini bu listede arar. Geliştirme evresinde listede yalnız güncel özet vardır.
ADR-0010 (D-SCHEMA-4): Tip kimliği
vct = urn:tamga:<domain>:<Type>:<major>(devlet aşaması devlet-özelurn:tamga:<cc>:<domain>:<Type>:<major>),schemaId = keccak256(vct). Aşağıdaki HTTPS yolları kimlik değil,metadata_url/schema_uri(barındırma adresi; katalogschemas.tamga.network/v1/catalogue.jsonvct → metadata_url + content_hashverir, IETF SD-JWT VC-19 §5.3.2 registry yolu).vct#integrityzorunludur (ETSI TS 119 472-1). Alan adı değişse kimlik değişmez (D-NAME-1).
NETWORK katmanı:
https://schemas.tamga.network/v1/<domain>/<TypeName>/<semver>
NATIONAL katmanı:
https://schemas.tamga.network/v1/<cc>/<domain>/<TypeName>/<semver>v1— registry protokol sürümü, şema sürümü değil. Type Metadata dokümanının yapısı değişirsev2olur. Bugüne kadarv1.<cc>— ISO 3166-1 alpha-2, küçük harf (tr,az,kz,uz,kg). Yalnızca NATIONAL katmanda bulunur.<domain>— kapalı liste (§1.2).<TypeName>— PascalCase,Credentialile biter.<semver>—MAJOR.MINOR.PATCH, üç parça zorunlu.
Örnekler:
urn:tamga:edu:DiplomaCredential:1
urn:tamga:edu:StudentCredential:1
urn:tamga:core:TamgaBaseCredential:1
https://schemas.tamga.network/v1/tr/edu/YOKDenklikCredential/1.0.01.2 Alan listesi (domain, kapalı)
| Domain | Kapsam | Faz |
|---|---|---|
core | Kök tipler, ortak yapılar | 0 |
edu | Eğitim ve yeterlilik | 0 |
org | Tüzel kişilik, çalışan yetkisi | 0 (iskelet) |
id | Kimlik, ikamet | 1 |
health | Sağlık | 2 |
fin | Finans | 2 |
log | Lojistik, ticaret | 2 |
travel | Seyahat, turizm | 2 |
Yeni domain eklemek NETWORK kararıdır (2/3 oy). NATIONAL şemalar mevcut domain listesini kullanır; kendi domain'ini icat edemez.
1.3 Her URL'in döndürdüğü içerik
| Yol | İçerik | Content-Type |
|---|---|---|
.../<semver> | Type Metadata dokümanı | application/json |
.../<semver>/schema.json | JSON Schema 2020-12 | application/schema+json |
.../<semver>/mapping.json | ELM/OBv3 eşleme tablosu (bilgilendirici) | application/json |
Type Metadata'nın kendisi vct URL'inde durur. Bu, standardın "URL'deki vct'den al" yolunu (ADR-0007 Karar 1) doğrudan çalıştırır.
1.4 Çözümlenebilirlik ve kayıt defteri yolu
vct bir HTTPS URL olduğu için birincil çözümleme yolu doğrudan GET'tir. Buna ek olarak registry, standardın "registry'den al" yolunu da destekler:
GET https://schemas.tamga.network/v1/resolve?vct=<url-encoded-vct>Bu uç, ağ dışı consumer'lar ve vct'ye doğrudan erişemeyen istemciler içindir. Aynı dokümanı, aynı baytlarla döndürür — aksi hâlde integrity kırılır.
2. Tür tanımı (Type Metadata)
2.1 Yapı
Her vct adresinde yayınlanan doküman:
{
"vct": "urn:tamga:edu:DiplomaCredential:1",
"name": "Tamga Diploma Credential",
"description": "Bir yükseköğretim kurumunun verdiği mezuniyet belgesi.",
"extends": "urn:tamga:core:TamgaBaseCredential:1",
"extends#integrity": "sha256-Yr9k...",
"schema_uri": "https://schemas.tamga.network/v1/edu/DiplomaCredential/1.0.0/schema.json",
"schema_uri#integrity": "sha256-3Qm2...",
"display": [ /* §2.2 */ ],
"claims": [ /* §2.3 */ ],
"tamga": { /* §2.4 — ekosistem uzantısı */ }
}Kurallar:
schema(gömülü) kullanılmaz; her zamanschema_urikullanılır. Gerekçe: Type Metadata dokümanını küçük tutmak, şemayı ayrı önbelleklenebilir kılmak.schema_uri#integrityzorunludur.- Kök tip (
TamgaBaseCredential) dışında her tipteextends+extends#integrityzorunludur. - Tanınmayan üst düzey özellikler consumer tarafından yok sayılır — standardın gereği.
tamgauzantı bloğu bu sayede güvenlidir.
2.2 display — dil bazlı sunum
"display": [
{
"lang": "tr-TR",
"name": "Diploma",
"description": "Yükseköğretim mezuniyet belgesi",
"rendering": {
"simple": {
"background_color": "#0B3D2E",
"text_color": "#FFFFFF"
}
}
},
{ "lang": "en-US", "name": "Diploma", "description": "Higher education degree" },
{ "lang": "az-AZ", "name": "Diplom", "description": "Ali təhsil diplomu" },
{ "lang": "kk-KZ", "name": "Диплом", "description": "Жоғары білім дипломы" },
{ "lang": "uz-UZ", "name": "Diplom", "description": "Oliy ta'lim diplomi" },
{ "lang": "ky-KG", "name": "Диплом", "description": "Жогорку билим дипломy" }
]Asgari dil seti: tr-TR ve en-US her NETWORK şemasında zorunludur. Diğer üye devlet dilleri o devlet katıldığında eklenir (MINOR sürüm).
NATIONAL şemalarda yalnızca sahibi devletin dili + en-US zorunludur.
2.3 claims — alan bazlı sunum ve açıklama politikası
"claims": [
{
"path": ["qualification_title"],
"display": [
{ "lang": "tr-TR", "label": "Program", "description": "Mezun olunan program" },
{ "lang": "en-US", "label": "Programme" }
],
"sd": "allowed"
},
{
"path": ["vct"],
"sd": "never"
},
{
"path": ["birth_date"],
"display": [{ "lang": "tr-TR", "label": "Doğum tarihi" }],
"sd": "allowed"
}
]sd değerleri ve Tamga'daki anlamları:
| Değer | Anlam | Tamga kullanımı |
|---|---|---|
always | Claim zorunlu olarak selective disclosure ile gizlenebilir olmalı | Hassas alanlar (kimlik no, doğum tarihi) |
allowed | Belge veren seçebilir | Varsayılan |
never | Selective disclosure ile gizlenebilir olamaz, her zaman görünür | iss, vct, cnf, status, iat |
Tamga kuralı: sd: "never" yalnızca protokol claim'lerinde kullanılır. Hiçbir kişisel veri alanı never olamaz. Bu, §11 değişmezlerinde zorlanır.
2.4 tamga uzantı bloğu
Standartta olmayan, Tamga'ya özgü meta veri:
"tamga": {
"tier": "NETWORK",
"schemaId": "0x7f3a...",
"issuer_categories": ["EDUCATION"],
"default_ttl_days": null,
"uses_status_list": true,
"min_issuer_assurance": "I2",
"derived_claims": ["is_graduate", "graduated_before"],
"elm_profile": "ELM-3.3/Qualification",
"status": "ACTIVE"
}| Alan | Anlam |
|---|---|
tier | NETWORK | NATIONAL (ADR-0007 Karar 5) |
schemaId | Zincirdeki keccak256(vctURI) — çapraz kontrol |
issuer_categories | Bu şemayı hangi IssuerCategory kullanabilir |
default_ttl_days | Azami exp süresi (tavan, sabit değil); null = uzun ömürlü |
uses_status_list | false ise kısa ömürlü, iptal listesi yok (ADR-0008 Alt. C) |
min_issuer_assurance | Asgari belge veren seviyesi (PM-ASSUR-0001 I1–I3) |
derived_claims | age_over_NN deseni türevleri (RS-SCHEMA-0001 §4) |
elm_profile | Hangi ELM sürümüne/profiline eşlenmiş |
status | ACTIVE | DEPRECATED | REVOKED — zincirle tutarlı |
issuer_categories alanı bilgilendiricidir; bağlayıcı kontrol zincirdedir (§5.2). Doküman ile zincir çelişirse zincir kazanır.
3. Bütünlük değeri (integrity) üretimi
3.1 Biçim
W3C Subresource Integrity dize biçimi:
sha256-<base64(SHA-256(dokümanın ham baytları))>Örnek: sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
3.2 Hesaplama kuralları (normatif)
- Hash, sunucunun döndürdüğü ham bayt dizisi üzerinden hesaplanır. JSON yeniden serileştirilmez, boşluk normalize edilmez.
- Bu yüzden yayınlanan dosya bayt bayt değişmezdir. CDN veya proxy'nin yeniden biçimlendirme yapmasına izin verilmez.
- Dosyalar LF satır sonu, UTF-8, BOM'suz yazılır.
- Sondaki yeni satır karakteri dosyanın parçasıdır ve hash'e dahildir.
# Referans hesaplama
printf 'sha256-%s\n' "$(openssl dgst -sha256 -binary dosya.json | openssl base64 -A)"3.3 Nerede kullanılır
| Değer | Nerede | Zorunlu mu |
|---|---|---|
vct#integrity | Belgenin kendi payload'ında | Evet (ADR-0007 Karar 3) |
extends#integrity | Type Metadata içinde | Evet (kök tip hariç) |
schema_uri#integrity | Type Metadata içinde | Evet |
contentHash | SchemaRegistry kontratında | Evet |
contentHash = vct#integrity'nin işaret ettiği aynı dokümanın hash'i, bytes32 olarak (base64 değil, ham SHA-256).
Değişmez: contentHash ile vct#integrity aynı baytları temsil eder. Biri diğerini doğrular; ikisi tutmuyorsa belge reddedilir.
4. Kök Tip — TamgaBaseCredential
Her Tamga belgesi, doğrudan veya dolaylı olarak core/TamgaBaseCredential'dan türer.
4.1 Zorunlu alanlar
| Claim | Tip | sd | Açıklama |
|---|---|---|---|
iss | string | never | Belge veren tanımlayıcısı, X.509'a çözülür (SPEC-ID-0002) |
vct | string (URI) | never | Tip URL'i |
vct#integrity | string | never | §3 |
iat | number | never | İhraç zamanı |
cnf | object | never | Belge sahibi anahtarı (SPEC-CRED-0001 §3) |
4.2 Koşullu alanlar
| Claim | Ne zaman |
|---|---|
exp | tamga.default_ttl_days doluysa zorunlu; exp - iat o değeri aşamaz |
status | tamga.uses_status_list = true ise zorunlu (ADR-0008) |
4.3 Ortak yapılar
Kök tip ayrıca yeniden kullanılabilir JSON Schema tanımları taşır:
LangString— çok dilli metin (§8)IssuerRef— belge veren referansıDateOnly—YYYY-MM-DDbiçimi
5. Kontrat arayüzleri (zincir aşaması)
Bugün kullanılmıyor: şema kayıtları imzalı güven listesinde (
lotl.schemas[]) yayınlanır. Bu arayüzler zincir aşaması içindir (ADR-0009).
5.1 SchemaRegistry
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.24;
interface ISchemaRegistry {
enum Tier { NETWORK, NATIONAL }
enum Status { NONE, ACTIVE, DEPRECATED, REVOKED }
struct SchemaRecord {
string vctURI; // kanonik tip URL'i
bytes32 contentHash; // Type Metadata dokümanının SHA-256'sı
string version; // semver, örn. "1.0.0"
Tier tier;
bytes2 stateCode; // NATIONAL ise sahibi; NETWORK ise 0x0000
Status status;
uint64 validFrom;
bytes32 supersededBy; // yeni sürüm; yoksa 0x0
}
event SchemaRegistered(bytes32 indexed schemaId, string vctURI, Tier tier, bytes2 indexed stateCode);
event SchemaDeprecated(bytes32 indexed schemaId, bytes32 supersededBy);
event SchemaRevoked(bytes32 indexed schemaId, string reason);
error SchemaExists(bytes32 schemaId);
error UnknownSchema(bytes32 schemaId);
error NotSchemaOwner(bytes32 schemaId, address caller);
error NetworkTierRequiresGovernance();
/// @notice schemaId = keccak256(bytes(vctURI))
function schemaIdOf(string calldata vctURI) external pure returns (bytes32);
/// @notice NETWORK: yalnızca Governance yürütmesiyle. NATIONAL: onlyOwnerState.
function registerSchema(SchemaRecord calldata rec) external;
function deprecateSchema(bytes32 schemaId, bytes32 supersededBy) external;
function revokeSchema(bytes32 schemaId, string calldata reason) external;
function getSchema(bytes32 schemaId) external view returns (SchemaRecord memory);
function isActiveSchema(bytes32 schemaId) external view returns (bool);
/// @notice Doğrulama için: verilen hash zincirdeki kayıtla eşleşiyor mu?
function matchesContentHash(bytes32 schemaId, bytes32 hash) external view returns (bool);
}Yetki kuralları:
tier == NETWORK→ çağrı yalnızcaGovernancekontratının 2/3 oyla yürüttüğü bir öneriden gelebilir (ADR-0002 Katman 1).tier == NATIONAL→onlyOwnerState(stateCode)(SPEC-BC-0001 §0).
Değişmez: Kayıtlı bir şemanın vctURI ve contentHash alanları asla güncellenmez. Değişiklik = yeni sürüm = yeni schemaId. deprecateSchema ve revokeSchema yalnızca status alanını değiştirir.
5.2 IssuerRegistry — şema yetkisi eklentisi
ADR-0007 Karar 6'nın kontrat karşılığı. Mevcut IIssuerRegistry'ye eklenir:
interface IIssuerRegistry {
// ... mevcut üyeler ...
event SchemaAuthorizationSet(bytes32 indexed issuerId, bytes32 indexed schemaId, bool allowed);
error SchemaNotAuthorized(bytes32 issuerId, bytes32 schemaId);
/// @notice Issuer'ı hangi devlet kaydettiyse yetkiyi de o verir (onlyOwnerState).
function setSchemaAuthorization(bytes32 issuerId, bytes32 schemaId, bool allowed) external;
/// @notice İHRAÇ anında: "şimdi bu şemayla verebilir mi?"
function isAuthorizedForSchema(bytes32 issuerId, bytes32 schemaId) external view returns (bool);
/// @notice DOĞRULAMA anında (ZORUNLU adım): "iat anında yetkili miydi?" — 1.0.1
function isCredentialSchemaAcceptable(bytes32 issuerId, bytes32 schemaId, uint64 iat)
external view returns (bool);
function authorizedSchemasOf(bytes32 issuerId) external view returns (bytes32[] memory);
}Uygulama notu: isAuthorizedForSchema şu üç koşulun hepsini sağlamalıdır:
issuerIdgeçerli vecanIssue✓schemaIdACTIVE✓ (DEPRECATEDise yeni belge verilemez)(issuerId, schemaId)çifti açıkça yetkilendirilmiş ✓
Üçüncü koşul varsayılan olarak yanlıştır. Yani yetki açıkça verilmediyse yoktur — allowlist mantığı, blocklist değil.
6. Şema Yayın Hattı
Bir şemanın hayata geçmesi altı adımdır ve sırası bağlayıcıdır:
1. TASARIM şema kaynak repoda yazılır (schemas/ dizini)
↓
2. DOĞRULAMA CI: JSON Schema geçerli mi, Type Metadata alanları tam mı,
extends zinciri çözülüyor mu, asgari diller var mı,
sd:never kişisel veride kullanılmış mı (§11 denetimi)
↓
3. DONDURMA dosyalar bayt düzeyinde sabitlenir (LF, UTF-8, no-BOM)
↓
4. HASH CI, contentHash ve tüm #integrity değerlerini hesaplar;
Type Metadata içine yazar; tekrar hash alır (iki geçiş)
↓
5. YAYIN CDN'e değişmez URL'de yüklenir (henüz kimse kullanamaz)
↓
6. KAYIT registerSchema(...) — NETWORK ise oy sonrası, NATIONAL ise doğrudanNeden bu sıra: Zincir kaydı, dokümanın erişilebilir olmasından sonra yapılmalıdır. Ters sırada, zincirde kayıtlı ama çözümlenemeyen bir şema oluşur ve o şemayla üretilen her belge doğrulanamaz.
İki geçişli hash (adım 4) dikkat gerektirir: schema_uri#integrity Type Metadata'nın içindedir, dolayısıyla önce şema hash'lenir, Type Metadata'ya yazılır, sonra Type Metadata hash'lenir. Sıra ters çevrilirse hash asla tutmaz.
Geri alma: Adım 6'dan sonra geri alma yoktur. revokeSchema bir ileri harekettir, silme değildir.
7. Çözümleme algoritması (doğrulayıcı tarafı)
Normatif. Herhangi bir adımın başarısızlığı belgenin reddedilmesi demektir.
GİRDİ: SD-JWT VC (issuer-signed JWT + disclosures + KB-JWT)
Ş1. vct ve vct#integrity claim'lerini oku.
vct yoksa veya vct#integrity yoksa → RED.
Ş2. schemaId = keccak256(bytes(vct))
SchemaRegistry.getSchema(schemaId)
Kayıt yoksa → RED (kayıtsız tip).
status == REVOKED → RED.
status == DEPRECATED → kabul edilebilir; ancak iat > deprecation zamanı ise RED.
Ş3. Type Metadata'yı al:
a) Yerel önbellekte vct#integrity anahtarıyla var mı? Varsa kullan.
b) Yoksa GET <vct>. Başarısızsa /v1/resolve?vct=... dene.
c) Hiçbiri olmazsa → doğrulama YAPILAMAZ (RED değil, "belirsiz" döndür).
Ş4. Bütünlük:
SHA-256(alınan baytlar) == vct#integrity → değilse RED.
SHA-256(alınan baytlar) == kayıt.contentHash → değilse RED.
Dokümanın içindeki "vct" alanı == belgedeki vct → değilse RED.
Ş5. extends zincirini çöz (varsa):
Her adımda extends#integrity doğrula.
Döngü tespit edilirse → RED. Derinlik > 5 → RED.
Ş6. Şema uyumu:
schema_uri'yi al, schema_uri#integrity doğrula,
credential payload'ını JSON Schema 2020-12 ile doğrula → uymazsa RED.
Ş7. YETKİ (ADR-0007 Karar 6 — atlanamaz):
issuerId = x5c yaprak parmak izinden türet (SPEC-ID-0002; iss claim'inden DEĞİL)
IssuerRegistry.isCredentialSchemaAcceptable(issuerId, schemaId, credential.iat) == true
→ değilse RED.
(1.0.1: isAuthorizedForSchema İHRAÇ sorusudur; doğrulamada kullanılırsa
DEPRECATED şemayla verilmiş eski belgeler düşer — SPEC-BC-0001 2.1.0 R3)
ÇIKTI: şema geçerli. Doğrulamanın kalan adımları SPEC-API-0001'de.Ş3(c) hakkında: Şema alınamadığında sonuç "geçersiz" değil **"doğrulanamadı"**dır. Doğrulayıcı bu ikisini kullanıcıya farklı göstermelidir. "Diploma sahte" ile "şu an doğrulayamıyorum" arasındaki fark, bir insanın işe alınıp alınmamasıdır.
7.1 Çevrimdışı doğrulama
Ş3(a) sayesinde çevrimdışı doğrulama mümkündür: vct#integrity dokümanın içeriğini benzersiz tanımladığı için önbellek süresiz geçerlidir ve HTTP önbellek direktiflerinden bağımsızdır.
Çevrimdışı modda Ş2 ve Ş7 yapılamaz (zincir okuması gerekir). Bu durumda doğrulayıcı, son bilinen zincir durumunun tazeliğini (blockNumber, timestamp) kullanıcıya göstermek zorundadır.
8. Çok Dillilik
8.1 LangString yapısı
Kullanıcıya gösterilecek her metin alanı LangString'dir:
"qualification_title": {
"tr-TR": "Bilgisayar Mühendisliği",
"en-US": "Computer Engineering"
}JSON Schema tanımı (kök tipte, yeniden kullanılır):
"LangString": {
"type": "object",
"propertyNames": { "pattern": "^[a-z]{2}(-[A-Z]{2})?$" },
"additionalProperties": { "type": "string", "minLength": 1 },
"minProperties": 1
}8.2 Kurallar
- Baştan konur. Bir alanı düz
stringyapıp sonraLangString'e çevirmek MAJOR sürüm kırılmasıdır. Kullanıcıya gösterilecek her alan doğrudanLangStringdoğar. - Kod alanları
LangStringdeğildir.eqf_level,isced_f_code,awarding_datetek değerlidir; çevrilmez. - En az bir dil zorunludur. Belge veren, kurumun resmî dilini her zaman doldurur.
- Cüzdan gösterim sırası: kullanıcının cihaz dili →
en-US→ mevcut ilk dil.
8.3 Neden kod alanları asıl önemlidir
Bir işveren qualification_title metnini okumaz; isced_f_code ve eqf_level alanlarını okur. Metin insan içindir, kod makine içindir ve tanınırlığı sağlayan koddur. Almanya'daki bir işveren "Bilgisayar Mühendisliği" ibaresini anlamak zorunda değildir; ISCED-F kodunu ve EQF seviyesini anlar.
Bu, RS-SCHEMA-0001'in kontrollü sözlük vurgusunun pratik karşılığıdır.
9. Sürümleme ve Emeklilik
9.1 Semver kuralları
| Değişiklik | Sürüm | Eski şema durumu |
|---|---|---|
| Alan kaldırma, tip değiştirme, zorunlu alan ekleme | MAJOR | DEPRECATED |
| Opsiyonel alan ekleme, yeni dil, yeni türetilmiş claim | MINOR | ACTIVE kalır |
| Açıklama/etiket düzeltmesi (anlam değişmez) | PATCH | ACTIVE kalır |
Her sürüm yeni URL, yeni schemaId, yeni zincir kaydıdır. Yayınlanmış bir URL'in içeriği asla değişmez.
9.2 Üç durum ve anlamları
| Durum | Yeni belge verme | Mevcut belgelerin doğrulanması |
|---|---|---|
ACTIVE | ✓ | ✓ |
DEPRECATED | ✗ | ✓ — devam eder |
REVOKED | ✗ | ✗ (özel işlem) |
Kritik: DEPRECATED, "artık verilemez" demektir; "artık doğrulanamaz" demek değildir. 2027'de 1.0.0 ile verilmiş bir diploma, 2035'te 3.0.0 yürürlükteyken hâlâ doğrulanabilir olmak zorundadır. Bir diplomanın ömrü şema sürümünden uzundur.
Bu yüzden:
DEPRECATEDşemaların dokümanları CDN'den asla kaldırılmaz.- Zincir kaydı silinmez.
supersededByalanı, doğrulayıcının "bu belge eski sürüm, güncel karşılığı bu" diyebilmesini sağlar.
REVOKED istisnaidir: şemanın kendisinin hatalı veya tehlikeli olduğu durumlarda (örneğin yanlışlıkla sd: never işaretlenmiş bir kimlik numarası alanı). O şemayla verilmiş belgeler ayrıca ele alınır ve belge verenler yeniden belge vermeye yönlendirilir.
9.3 Geçiş dönemi
MAJOR sürüm yayınlandığında eski sürüm en az 24 ay ACTIVE kalır. Bu süre içinde belge verenler iki sürümü paralel verebilir. Süre sonunda eski sürüm DEPRECATED olur.
10. Barındırma ve İşletim
10.1 Bileşen özellikleri
schemas.tamga.network bir statik dosya servisidir. Uygulama sunucusu değildir; veritabanı yoktur, dinamik içerik üretmez. Tek istisna /v1/resolve ucudur ve o da yalnızca yönlendirme yapar.
| Özellik | Değer |
|---|---|
| İçerik | Statik JSON |
| Önbellek | Cache-Control: public, max-age=31536000, immutable |
| TLS | Zorunlu, HSTS |
| DNSSEC | Zorunlu |
| Erişilebilirlik hedefi | %99,9 (doğrulamayı durdurmaz, §10.2) |
| Kaynak | Git repo — her yayın bir commit |
10.2 Kesinti etkisi
Şema sunucusunun kesintiye uğraması:
- Doğrulamayı durdurmaz. Önbellekteki şemalarla devam edilir (§7.1).
- Yeni tip öğrenmeyi durdurur. Daha önce görülmemiş bir
vctçözümlenemez. - Yeni belge vermeyi etkilemez. Belge veren kendi şemasını yerelde tutar.
Bu yüzden SLO, kritik yol bileşenlerinden daha gevşek olabilir. Ayrıntı ARCH-0004'te.
10.3 Alan adı riski
schemas.tamga.network alan adının kaybı ekosistemik bir olaydır — geçmişe dönük tüm vct değerleri çözümlenemez hâle gelir. Azaltma:
- Alan adı, kurumsal (vakıf) mülkiyetinde, kilit (registrar lock) açık.
- DNSSEC.
- Tüm şemaların git deposu ayna olarak birden çok yerde.
- Devlet aşamasında üye devletlerin ayna sunucuları (
/v1/resolveuyumlu). - Devir planı: vakıf tasfiye olursa alan adının konseye geçişi PM-GOV-0001'de sözleşmeye bağlanır.
11. Değişmezler (Invariants)
Bunlar CI'da ve kontratta zorlanır. İhlal = yayın engellenir.
| # | Değişmez |
|---|---|
| D1 | Yayınlanmış bir Type Metadata / JSON Schema dosyasının (metadata_url) içeriği asla değişmez; minor/patch yeni metadata_url + hash, major yeni vct URN'i (ADR-0010 K7). |
| D2 | contentHash (zincir) = vct#integrity (belge) = SHA-256(yayınlanan baytlar). |
| D3 | Type Metadata içindeki vct, belgedeki vct ile aynı olmalıdır. |
| D4 | Kök tip dışında her tipte extends + extends#integrity bulunur. |
| D5 | extends zinciri döngüsüzdür ve en fazla 5 seviyedir. |
| D6 | Hiçbir kişisel veri alanı sd: "never" olamaz. |
| D7 | Her NETWORK şeması en az tr-TR ve en-US display taşır. |
| D8 | Zincir kaydı, CDN yayınından sonra yapılır (§6 sıra kuralı). |
| D9 | isAuthorizedForSchema varsayılanı false'tur (allowlist). |
Güvenlik ve Mahremiyet Notları
Şema sunucusu bir takip yüzeyidir. Bir cüzdan veya doğrulayıcı, şemayı her seferinde sunucudan çekerse, sunucu "kim hangi tip belgeyi ne zaman gördü" bilgisini toplar. Azaltma:
- Süresiz önbellekleme (§7.1) — normal işleyişte istek gitmez.
- Cüzdanlar, kullanıcının sahip olduğu tipleri kurulumda toplu çeker, kullanım anında değil.
- Sunucu erişim logu tutmaz — yalnızca toplu sayaç. Bu bir politika taahhüdüdür ve PM-GOV-0001'e yazılmalıdır.
Şema, kişisel veri içermez. Şema bir tanımdır, veri değildir. Yine de display metinlerinde kurum adı geçebilir; bu kamusal bilgidir ve sorun değildir.
D6 neden kritik: sd: "never" işaretli bir alan selective disclosureBir belgeden yalnız doğrulayıcının istediği alanların gösterilmesi, fazlasının değil.'a kapatılır, yani her sunumda görünür. Bir kimlik numarasını yanlışlıkla never yapmak, o şemayla verilmiş tüm belgelerde kimlik numarasının her doğrulayıcıya gitmesi demektir. Bu geri alınamaz; ancak REVOKED + yeniden belge verme ile düzelir. Bu yüzden D6 hem CI hem insan gözden geçirmesinde kontrol edilmelidir.
Açık Konular
/v1/resolveucunun ayna sunucularla tutarlılığı nasıl garanti edilir? (devlet aşaması, üye devlet aynaları)- Şema kullanım istatistikleri hangi granülariteyle toplanır — mahremiyet tavanı ne? → PM-GOV-0001
- Bir NATIONAL şema, sonradan NETWORK'e "terfi" edebilir mi? Öneri: hayır, yeni bir NETWORK şeması yazılır ve NATIONAL olan
supersededByile ona işaret eder. Karar bekliyor. extendszincirinde bir üst tipDEPRECATEDolursa alt tipe ne olur? Öneri: alt tip otomatikDEPRECATEDolmaz ama CI uyarı verir.
İlgili Dokümanlar
ADR-0007 · PM-SCHEMA-0001 · RS-SCHEMA-0001 · SPEC-SCHEMA-0002 · SPEC-BC-0001 · SPEC-CRED-0001 · SPEC-CRED-0002 · SPEC-ID-0002 · ADR-0008 · ARCH-0004 · ARCH-0005
Durum
Yürürlükte — sürüm 1.0.0 (2026-10-02).