| title | JSON çıktı şemaları |
|---|---|
| description | Her forgelm subcommand için kilitli --output-format json envelope yapısı. CI tüketicileri bu alan adlarına bağımlıdır. |
--output-format json destekleyen her forgelm subcommand'ı stdout'a stabil bir JSON envelope üretir. Alan adları ve nesting GitHub'daki release standardı gereği public CLI kontratının parçası: bir anahtarı yeniden adlandırmak MAJOR-version break sayılır.
Bu sayfa kanonik referanstır. forgelm çıktısını parse eden CI/CD pipeline'ları burada belgelenen yapılara karşı pin'lemelidir.
- stdout vs stderr. JSON envelope stdout'a gider. İnsana okunabilir loglar (info / warning / error) stderr'e gider.
forgelm ... --output-format json | jq .ile pipe edip operatör mesajlarını2>ile ayrı okuyun. - Üst seviye sarmalayıcı. Her envelope
"success": true | falseile başlar. Tüketiciler önce bu tek anahtarda branch açabilir. - Hata envelope'u.
success: falseolduğunda envelope"error": "<mesaj>"(string) taşır. Opsiyonel zenginleştirilmiş alanlar (exit_code,error_type,details) GitHub'daki error-handling standardı gereği var olabilir. Bu alanlardan kesinlik isteyen tüketiciler$?ile süreç exit kodunu da kontrol etmelidir. - Exit kodları. Bkz. Exit Kodları.
success: falseher zaman non-zero bir exit ile eşleşir.success: truenormal durumda exit0ile eşleşir, tek istisna dışında: Article 14 insan-onay gate'inde duraklayan bir eğitim çalışmasısuccess: trueveawaiting_approval: trueemit ederken exit4ile çıkar (model stage'lenmiştir, henüz promote edilmemiştir). "Bitti" ile "insan onayı bekliyor"u ayırması gereken tüketiciler tek başınasuccessyerineawaiting_approvaldiscriminator'ını (veya$?'i) okumalıdır. - Argüman-ayrıştırma hataları istisnadır. JSON-envelope garantisi argümanlar başarıyla ayrıştırıldıktan sonra başlar. Ayrıştırma anında saptanan bir kullanım hatası (bilinmeyen flag, hatalı
--choice,--workers 0gibi aralık-dışı validator değeri)argparse'in kendisi tarafından raporlanır: stderr'e insana okunabilir birusage: ... error: ...satırı ve exit kodu2, stdout'ta hiçbir JSON envelope olmadan. Her non-zero exit'te stdout-JSON okuyan bir tüketici, boş stdout'u (non-zero$?ile eşleşen) bir ayrıştırma/kullanım hatası olarak ele almalı ve mesaj için stderr'e dönmelidir. Envelope kontratı yalnızca dispatcher çalışmaya başladıktan sonra ortaya çıkan hatalar için geçerlidir.
Ortam kontrolü. Bkz. Doctor komutu.
Başarı envelope'u (forgelm doctor [--offline] --output-format json):
{
"success": true,
"checks": [
{
"name": "forgelm.install",
"status": "pass",
"detail": "ForgeLM 0.9.0 running from /opt/venv/lib/python3.11/site-packages/forgelm (inside site-packages).",
"extras": {"version": "0.9.0", "location": "/opt/venv/lib/python3.11/site-packages/forgelm", "in_site_packages": true}
},
{
"name": "python.version",
"status": "pass",
"detail": "Python 3.11.7 (CPython).",
"extras": {"version": "3.11.7", "implementation": "CPython"}
}
],
"summary": {"pass": 8, "warn": 1, "fail": 0, "crashed": 0}
}| Anahtar | Tip | Notlar |
|---|---|---|
success |
bool | Hiçbir probe fail değilse VE hiçbir probe crash etmediyse true; aksi halde false. |
checks |
list[object] | Çalıştırma sırasıyla probe başına bir entry. Probe adları stabildir (örn. forgelm.install, python.version, torch.cuda, numpy.torch_abi, gpu.inventory, extras.qlora, hf_hub.reachable, hf_hub.offline_cache, disk.workspace, operator.identity, pypdf_normalise.turkish). --offline modunda hf_hub.offline_cache, hf_hub.reachable yerine geçer. |
checks[].name |
str | Probe adı. Sürümler arası stabil; "eklenir" (append) burada isim dağarcığını tanımlar, çalıştırma sırasını değil — yeni probe'lar bir kez yayınlandıktan sonra asla yeniden adlandırılmaz, ama içeriklerinin okunması en faydalı olacağı yere eklenirler (örn. forgelm.install, listenin sonuna değil ilk satıra eklendi — çünkü raporun diğer her satırı, okuyucu raporu hangi ForgeLM kopyasının ürettiğini bilene kadar belirsizdir). Tüketiciler herhangi bir probe için sabit bir index varsaymamalıdır. |
checks[].status |
str | pass, warn, fail'tan biri. Raise eden bir probe status: "fail" ve extras.crashed: true ile görünür; crash ayrıca summary.crashed içinde sayılır. |
checks[].detail |
str | Sonuç için operatör-yüzlü tek satırlık açıklama. |
checks[].extras |
object | Probe-spesifik yapısal veri. Per-probe anahtarlar _doctor.py docstring'lerinde belgelidir; tüketiciler bilinmeyen anahtarları forward-compatible olarak ele almalıdır. |
summary |
object | checks arasında her status'ın sayısı. Toplam len(checks)'a eşittir. |
Exit code mapping: 0 = tüm probe'lar pass veya warn; 1 = en az bir fail; 2 = en az bir crashed (probe raise etti; sonraki probe'lar yine de çalıştı).
forgelm --config <yaml> --dry-run --output-format json, ağır stack'i yüklemeden veya GPU'ya dokunmadan config'i doğrular ve eğitimin ne yapacağını özetler. En sık kullanılan CI ön-uçuş çağrısıdır. Geçerli bir config'te şu envelope'u stdout'a basıp exit code 0 ile çıkar:
{
"success": true,
"status": "valid",
"model": "org/model",
"backend": "auto",
"load_in_4bit": false,
"trust_remote_code": false,
"dora": false,
"lora_rank": 16,
"lora_alpha": 32,
"dataset": "org/dataset",
"epochs": 3,
"batch_size": 1,
"output_dir": "/work/output/final_model",
"offline": false,
"distributed": null,
"rope_scaling": null,
"neftune_noise_alpha": null,
"webhook_configured": false,
"galore_enabled": false,
"galore_optim": null,
"galore_rank": null,
"auto_revert": false,
"safety_enabled": false,
"safety_scoring": null,
"compliance_configured": false,
"risk_classification": null
}| Anahtar | Tip | Notlar |
|---|---|---|
success |
bool | Bu kod yolunda her zaman true — bir dry run stdout'a yalnızca config doğrulandıktan sonra ulaşır. Geçersiz config bunun yerine 2 anahtarlı hata envelope'u (success: false) ile 1 çıkar. |
status |
str | Pre-0.7.1 tüketicilerle geriye dönük uyumluluk için korunan sabit token "valid". Yeni tüketiciler success üzerinde branch yapmalı. |
model / backend / dataset |
str | Config'ten çözülen model id'si, model backend'i ve dataset id'si. |
output_dir |
str | Etkin nihai-model yolu (training.output_dir, training.final_model_dir ile birleştirilmiş). |
load_in_4bit, trust_remote_code, dora, offline |
bool | İlgili config bayraklarının etkin değerleri. |
lora_rank, lora_alpha, epochs, batch_size |
int | Etkin eğitim/LoRA hiper-parametreleri. |
distributed |
str | null | distributed.strategy veya dağıtık eğitim yapılandırılmadığında null. |
rope_scaling, neftune_noise_alpha |
object | float | null | Etkin long-context / NEFTune ayarları, ayarlanmadığında null. |
webhook_configured |
bool | Bir webhook URL'si (literal veya url_env) yapılandırıldığında true. |
galore_enabled, galore_optim, galore_rank |
bool / str / int | GaLore optimizer özeti; GaLore kapalıyken son ikisi null. |
auto_revert, safety_enabled, safety_scoring |
bool / bool / str | Değerlendirme-kapısı özeti (safety eval kapalıyken safety_scoring null). |
compliance_configured, risk_classification |
bool / str | EU AI Act uyumluluk özeti; compliance yapılandırılmadığında risk_classification null. |
Exit code mapping: geçerli config 0 (EXIT_SUCCESS) ile çıkar; geçersiz config standart hata envelope'u ile 1 (EXIT_CONFIG_ERROR) çıkar.
Eğitim pipeline'ı (forgelm --config <yaml> --output-format json) ağır stack'i import etmeden önce bir torch/NumPy ABI sanity check çalıştırır. Sağlıklı bir ortamda preflight sessizdir ve eğitim normal şekilde devam eder; bilinen Intel Mac NumPy 2 / torch 2.2 mismatch'inde preflight şu envelope ile stdout'a basıp exit code 2 ile abort eder:
{
"success": false,
"error": "numpy_torch_abi_mismatch",
"torch_version": "2.2.2",
"numpy_version": "2.4.4",
"remediation": "torch 2.2.2 (compiled against NumPy 1.x) is paired with numpy 2.4.4. ... Fix with: pip install 'numpy<2' ..."
}| Anahtar | Tip | Not |
|---|---|---|
success |
bool | Bu kod yolunda her zaman false; sağlıklı preflight hiçbir şey emit etmez ve pipeline devam eder. |
error |
str | Stabil token "numpy_torch_abi_mismatch". CI tüketicileri tam bu değer üzerinden branch'leyebilir. |
torch_version |
str | Preflight anında torch.__version__'un raporladığı versiyon string'i. |
numpy_version |
str | Preflight anında numpy.__version__'un raporladığı versiyon string'i. |
remediation |
str | İnsan-okunabilir fix talimatı, tam pip install 'numpy<2' komutuyla biten. forgelm doctor numpy.torch_abi probe'unun detail alanıyla bire bir aynı metin — tek kaynak. |
Exit code mapping: preflight abort, 2 (EXIT_TRAINING_ERROR, runtime-error sınıfı) ile çıkar. Aynı forgelm doctor numpy.torch_abi probe'u önceden status: "fail" olarak yüzeye çıkarırdı; preflight, doctor'ı skip edip eğitimi doğrudan çalıştıran operatörler için ikinci savunma hattıdır.
Eğitim tamamlanana kadar çalıştığında pipeline stdout'a bir sonuç envelope'u emit eder. Aynı envelope şekli üç sonucu da kapsar; success + awaiting_approval + reverted anahtarları aralarında ayrım yapar.
Başarı envelope'u (model promote edildi; exit 0):
{
"success": true,
"metrics": {"eval_loss": 0.42, "benchmark/average": 0.78},
"final_model_path": "/work/output/final_model",
"reverted": false,
"awaiting_approval": false,
"run_id": "fg-abc123def456",
"config_hash": "sha256:..."
}Onay-bekliyor envelope'u (evaluation.require_human_approval: true; model stage'lendi, henüz promote edilmedi; exit 4):
{
"success": true,
"metrics": {"eval_loss": 0.42},
"final_model_path": "/work/output/final_model.staging.fg-abc123def456",
"reverted": false,
"awaiting_approval": true,
"staging_path": "/work/output/final_model.staging.fg-abc123def456"
}Revert envelope'u (bir post-train gate auto_revert: true altında başarısız oldu; artefactlar silindi; exit 3):
{
"success": false,
"metrics": {"eval_loss": 0.91},
"final_model_path": "/work/output/final_model",
"reverted": true,
"awaiting_approval": false,
"error": "Final eval_loss (0.9100) exceeded max_acceptable_loss (0.8000)."
}| Anahtar | Tip | Not |
|---|---|---|
success |
bool | Çalışma tamamlandığında (stage'lenmiş, onay-bekleyen çalışma ve güvenlik değerlendirmesi karar üretemeyen çalışma dahil; safety.evaluation_completed'e bakın) true. Bir gate modeli auto-revert ettiğinde false. |
error |
string | Yalnızca success false iken bulunur, başarı yolunda asla. Gate'in kendi gerekçesini taşır — hangi gate'in hangi eşiğe karşı tetiklendiğini — çünkü her gate 3 ile çıkar, dolayısıyla exit kodu tek başına ayırt edemez. Bir başarısızlık zarfa gerekçesiz ulaşırsa alan bunu açıkça söyler ve audit_log.jsonl'a yönlendirir; atlanmaz. |
metrics |
object | Eğitim/eval/gate metrikleri (ör. eval_loss, benchmark/average, safety/safe_ratio). Değerler sayıdır; istisna, sonlu çıkmayan bir ölçüm "nan" / "inf" / "-inf" string'i olarak yazılır — JSON'da sonlu olmayan sayı literali yoktur, alternatifi hiçbir katı ayrıştırıcının kabul etmediği bir çıktıydı. Bu alanları sayı-veya-string olarak tipleyin. |
final_model_path |
str | Model artefactlarının yaşadığı yer. Onay-bekleyen bir çalışma için bu, forgelm approve promote edene kadar staging dizinidir. |
reverted |
bool | Bir gate (eval-loss / benchmark / safety / judge) modeli auto-revert ettiyse true. awaiting_approval ile karşılıklı dışlayıcıdır. |
awaiting_approval |
bool | Discriminator. Çalışma Article 14 insan-onay gate'inde durakladıysa (exit 4) true. Revert edilmiş bir çalışma burada her zaman false'tur. |
staging_path |
str | Yalnızca awaiting_approval true iken vardır; forgelm approve <run_id> / forgelm reject <run_id>'e geçilecek on-disk staging dizini. |
run_id |
str | Çalışma tanımlayıcısı — çalışmayı audit_log.jsonl'i ve varsa onay gate'i ile ilişkilendirir. Trainer sonucu ürettiğinde her zaman vardır. |
config_hash |
str | Çalışmayı üreten doğrulanmış config'in sha256: digest'i (yeniden-üretilebilirlik çıpası). Trainer sonucu ürettiğinde her zaman vardır. |
Opsiyonel alt-bloklar (benchmark, resource_usage, estimated_cost_usd, safety, judge) yalnızca o değerlendirmeler çalıştığında eklenir.
Exit code mapping: 0 = başarı (promote edildi); 3 = EXIT_EVAL_FAILURE (bir gate modeli revert etti — reverted: true); 4 = EXIT_AWAITING_APPROVAL (awaiting_approval: true, insan onayı bekleyen stage). Revert edilmiş bir çalışma asla onay-bekliyor olarak raporlanmaz.
Bekleyen Madde 14 onay isteklerini en yeniden başa doğru listeler.
{
"success": true,
"pending": [
{
"run_id": "fg-abc123def456",
"staging_path": "/work/output/final_model.staging.fg-abc123def456",
"staging_exists": true,
"requested_at": "2026-05-04T12:34:56+00:00",
"age_seconds": 3600.5,
"metrics": {"safety_score": 0.91, "benchmark.hellaswag": 0.78},
"config_hash": "sha256:...",
"reason": "post-train safety eval below threshold"
}
],
"count": 1
}| Anahtar | Tip | Notlar |
|---|---|---|
success |
bool | true (her zaman — boş liste başarıdır). |
pending |
list[object] | En yeniden başa; count == len(pending). Boş liste = bekleyen onay yok. |
pending[].run_id |
str | null | Audit event'inden run identifier. |
pending[].staging_path |
str | null | Çözülmüş staging dizini (audit event staging_path taşımıyorsa ve canonical fallback yoksa null). Path-traversal korumalı — --output-dir dışındaki yollar resolve aşamasında reddedilir. |
pending[].staging_exists |
bool | staging_path mevcut bir dizine resolve oluyorsa True. |
pending[].requested_at |
str | null | Audit event'inden ISO-8601 timestamp. |
pending[].age_seconds |
number | null | requested_at'tan beri saniye; timestamp parse edilemezse null. |
pending[].metrics |
object | Audit event'inden serbest-form per-run metric'ler. |
pending[].config_hash |
str | null | Bilindiğinde config fingerprint. |
pending[].reason |
str | null | Audit event'inden operatör tarafından sağlanan sebep. |
count |
int | Bekleyen sayı; len(pending)'a eşit. |
Bir koşu için tam onay-gate audit chain'i + staging içeriğini incele.
{
"success": true,
"run_id": "fg-abc123def456",
"status": "pending",
"chain": [
{"event": "human_approval.required", "run_id": "fg-abc123def456", "timestamp": "2026-05-04T12:34:56+00:00", "...": "..."}
],
"staging_contents": ["adapter_config.json", "adapter_model.safetensors", "tokenizer.json"]
}| Anahtar | Tip | Notlar |
|---|---|---|
success |
bool | Koşu bulunduğunda true; RUN_ID'nin audit event'i yoksa false (error ile). |
run_id |
str | Echo'lanan input RUN_ID. |
status |
str | pending, granted, rejected, unknown'dan biri. Latest-wins semantik: önceki bir karardan sonra re-stage edilen koşu pending gösterir. |
chain |
list[object] | run_id için her onay-gate audit event'i, append sırasıyla. |
staging_contents |
list[str] | <output_dir>/final_model.staging.<run_id> (veya canonical fallback) altında sıralı dosya/dizin adları. Staging eksik veya okunamıyorsa boş. |
corrupted |
bool | Yalnızca audit log'un strict parse'ı bir satırı reddedeceğinde bulunur ve true olur. O durumda gösterilen status yetkili değildir — approve/reject (log'u strict okur) log onarılana kadar işlem yapmayı reddeder. Temiz log'da yoktur. |
corruption_detail |
str | corrupted ile birlikte bulunur; ilk hatalı satırı belirtir (audit log corrupted at line N: <neden>). |
Eğitim öncesi veri denetimi. Tam rapor; ana alanlar gösterildi.
{
"success": false,
"report_path": "/work/audit/data_audit_report.json",
"generated_at": "2026-07-20T16:13:19.426220+00:00",
"source_input": "/work/data/train.jsonl",
"total_samples": 3,
"splits": {"train": 3},
"pii_summary": {"email": 1, "us_ssn": 1},
"pii_severity": {
"total": 2,
"by_tier": {"critical": 0, "high": 1, "medium": 1, "low": 0},
"by_type": {"email": {"count": 1, "tier": "medium"}, "us_ssn": {"count": 1, "tier": "high"}},
"worst_tier": "high"
},
"secrets_summary": {"aws_access_key": 1},
"secrets_gate": {
"status": "failed",
"severity": "critical",
"critical_total": 1,
"critical_types": {"aws_access_key": 1},
"allow_secrets": false
},
"pii_gate": {
"status": "passed",
"severity": null,
"critical_total": 0,
"critical_types": {},
"advisory_total": 2,
"advisory_types": {"email": 1, "us_ssn": 1},
"allow_pii": false
},
"quality_summary": {
"samples_flagged": 3,
"samples_evaluated": 3,
"by_check": {"low_punct_endings": 3},
"overall_quality_score": 0.0
},
"near_duplicate_pairs_per_split": {"train": 0},
"near_duplicate_summary": {"method": "simhash", "pairs_per_split": {"train": 0}, "hamming_threshold": 3},
"cross_split_leakage_pairs": [],
"croissant": {},
"notes": ["WORST tier: HIGH. PII flags surfaced (2 total: email=1, us_ssn=1). …"]
}| Anahtar | Tip | Not |
|---|---|---|
success |
bool | Kapılardan herhangi biri başarısız olduğunda (secrets_gate ya da pii_gate) false, aksi halde true. Corpus hakkında eksiksiz bir hüküm değildir — kapılamayan bulgular bu alanı hiç oynatmaz; aşağıdaki uyarıya bakın. |
report_path |
str | On-disk data_audit_report.json'un mutlak yolu. |
source_input |
str | Denetlenen girdinin mutlak yolu. |
total_samples |
int | Tüm split'ler boyunca incelenen satır sayısı. |
splits |
object | {split_adı: satır_sayısı} — iç içe bir nesne değil, düz bir tam sayı haritası. |
pii_summary |
object | Düz {pii_türü: sayı}, örn. {"email": 1}. total_findings / by_kind anahtarları yoktur. Temizken {}. |
pii_severity |
object | total, by_tier (critical/high/medium/low sayıları), by_type ve worst_tier. CI gate'inin isteyeceği alan worst_tier'dır — hiçbir şey işaretlenmediğinde null olur. |
secrets_summary |
object | Düz {pattern_adı: sayı}, örn. {"aws_access_key": 1}. Temizken {}. |
secrets_gate |
object | Credential kapısının hükmü. status ∈ "passed" / "failed" / "suppressed" ("suppressed" = bulgu var ama --allow-secrets geçildi), severity ("critical" ya da null), critical_total, critical_types ({pattern_adı: sayı}), allow_secrets. |
pii_gate |
object | PII kapısının hükmü — secrets_gate'in kardeşi, aynı üç değerli status ("suppressed" = --allow-pii geçildi). severity ("critical" ya da null), critical_total, critical_types; ayrıca raporlanan ama asla kapılamayan kritik-altı sayımları taşıyan advisory_total / advisory_types ve allow_pii. critical_types içinde yalnızca credit_card ve iban görünebilir. |
quality_summary |
object | samples_flagged, samples_evaluated, by_check ({kontrol_adı: sayı}), overall_quality_score. |
near_duplicate_pairs_per_split |
object | {split_adı: çift_sayısı}. |
near_duplicate_summary |
object | method (simhash/minhash), pairs_per_split ve seçilen metodun eşik alanı. |
cross_split_leakage_pairs |
list | Train/eval örtüşme çiftleri; temizken boş liste. |
croissant |
object | --croissant geçildiğinde Croissant metadata'sı; aksi halde {}. |
notes |
list[str] | İnsan tarafından okunabilir bulgular ve düzeltme ipuçları. |
Faz 15 (v0.6.0) notu:
quality_summary, v0.6.0'dan itibaren default olarak doldurulur çünkü audit'in--quality-filterbayrağı default-AÇIK'a çevrildi. Atlamak için--no-quality-filtergeçirin; o durumda alan{}olur.
:::warn
İki tarama gate uygular. Geri kalan her şey rapordur. forgelm audit, her zaman açık olan secret taraması kimlik bilgisi bulduğunda (--allow-secrets başarısız olmadan kaydeder) ve PII taraması critical katman PII bulduğunda 3 ile çıkar — credit_card ya da iban; bir checksum'dan (issuer-prefix + Luhn / ISO 7064 mod-97) geçen iki kategori, dolayısıyla eşleşme gerçek bir kart ya da hesap numarasından ayırt edilemez (--allow-pii başarısız olmadan kaydeder). İki bayrak birbirinden bağımsızdır.
Kritik-altı PII gate uygulamaz: tr_id / de_id / fr_ssn / us_ssn (high), email (medium) ve phone (low) tespit edilir, sayılır ve pii_gate.advisory_types altında yüzeye çıkar, ama exit kodunu asla belirlemez — çoğu yalnızca şekil üzerinden eşleşir ve kasıtlı olarak fazla raporlar; temiz bir corpus'ta tetiklenen kapıyı ise operatör kapatır. Dolayısıyla düz metin SSN, train/eval sızıntısı ya da bir yığın düşük kaliteli satır taşıyan ve hiç kimlik bilgisi ya da kart numarası içermeyen bir corpus 0 ile çıkar — doğrulandı: worst_tier: "high" seviyesinde us_ssn bulgusu olan iki satırlık bir corpus 0 döner.
Yani success: true artı exit 0, "corpus temiz" değil, "denetim tamamlandı ve hiçbir kapı tetiklenmedi" demektir. Diğer boyutlarda gate uygulamak için bu zarfı kendiniz parse etmelisiniz:
$ forgelm audit data/ --output-format json > audit.json # secret'larda veya kritik katman PII'de 3 ile çıkar
$ jq -e '(.pii_severity.worst_tier // "none") != "high" and (.cross_split_leakage_pairs | length) == 0' audit.jsonpii_severity.worst_tier temiz bir corpus'ta null olduğundan // "none" yedeği zorunludur — onsuz ifade null üzerinde değerlendirilir ve gate yanlış davranır.
:::
Tam şema manuel içindeki Veri Audit'i sayfasındadır. On-disk data_audit_report.json ile bu stdout zarfının anahtar adları birebir aynı değildir — araçlarınızı hangisini gerçekten okuyorsa ona karşı pin'leyin.
Doküman ingestion stdout envelope'ı. Faz 15, notes_structured altına
additive alanlar ekledi; Faz 15 öncesi anahtarlar değişmedi.
{
"success": true,
"output_path": "data/curated.jsonl",
"chunk_count": 245,
"files_processed": 12,
"files_skipped": 0,
"total_chars": 824513,
"format_counts": {".pdf": 4, ".docx": 6, ".md": 2},
"pii_redaction_counts": {"email": 3, "phone": 1},
"secrets_redaction_counts": {},
"pdf_header_footer_lines_stripped": 18,
"pdf_paragraph_packed_lines_stripped": 4,
"script_sanity_triggered": 1,
"strip_pattern_substitutions": 12,
"urls_handled": 7,
"frontmatter_pages_dropped": 3,
"notes": ["..."],
"notes_structured": {
"files_processed": 12,
"files_skipped": 0,
"chunk_count": 245,
"total_chars": 824513,
"strategy": "paragraph",
"format_counts": {".pdf": 4, ".docx": 6, ".md": 2},
"pdf_header_footer_lines_stripped": 18,
"pdf_paragraph_packed_lines_stripped": 4,
"script_sanity_summary": {"files_checked": 12, "files_triggered": 1, "...": "..."},
"frontmatter_pages_dropped": [0, 1, 11],
"strip_pattern_substitutions": 12,
"urls_handled": 7,
"quality_presignal": {"samples_evaluated": 245, "samples_flagged": 17, "by_check": {"alpha_ratio": 5, "weird_chars": 1, "repeated_lines": 11}}
}
}Çok dosyalı bir batch'te, üst düzey frontmatter_pages_dropped tamsayısı
tüm dosyalar boyunca gerçek bir toplamdır; notes_structured.frontmatter_pages_dropped
ise distinct-index bir örnektir (hangi sayfa pozisyonlarının düşürüldüğü,
kaç kez düşürüldüğü değil) — üst düzey toplamdan daha kısa olabilir ve bu
bir hata değildir.
Faz 15 additive alanları Doküman Ingestion'da
belgelenmiştir. Faz 15 öncesi output_path / chunk_count / notes
okuyan tüketiciler değişmeden çalışmaya devam eder.
Audit log chain bütünlüğü kontrolü.
{
"success": true,
"valid": true,
"entries_count": 87,
"hmac_verified": true,
"errors": []
}| Anahtar | Tip | Notlar |
|---|---|---|
success |
bool | true ⟺ valid: true. |
valid |
bool | Herhangi bir prev_hash mismatch / monotonicity break / seq gap varsa false. |
entries_count |
int | Verifier'ın okuduğu boş-olmayan satır sayısı — doğrulanan girdi sayısı değil. Başarısızlıkta bile tüm dosyayı raporlar; "güvenebileceğiniz girdi sayısı" olarak okumayın. |
hmac_verified |
bool | null | Secret yapılandırılmadıysa null (--hmac-secret-env verilmemiş veya set edilmemiş bir değişkeni gösteriyor — HMAC hiç değerlendirilmedi); secret verildi ve tüm doğrulama geçtiyse true; secret verildi ve doğrulama herhangi bir nedenle başarısız olduysa false — nedenin HMAC'e özgü olması gerekmez (result nesnesi ikisini ayırmıyor). |
errors |
list[str] | Başarıda boş, aksi hâlde tam olarak bir girdi — chain yürüyüşü ilk hatada duruyor. Hata belirli bir girdiye aitse string line <N>: <reason> biçimindedir, yani hatalı 1-tabanlı satır numarası errors[0] içinden ayrıştırılır; zarfta ayrı bir satır-numarası anahtarı yoktur. Dosyanın bütününe ait hatalar — UTF-8 olmayan byte'lar, ya da genesis manifest'i olmayan boş bir log — çıplak nedeni line <N>: öneki olmadan taşır; bu yüzden bir parser önekin yokluğuna tahammül etmeli, varlığını varsaymamalıdır. |
Exit kodu eşlemesi: 0 = en az bir girdi okundu ve SHA-256 chain (ve secret verildiyse HMAC tag'leri) sağlam; 6 = EXIT_INTEGRITY_FAILURE — doğrulayıcı bir şeyi karşılaştırdı ve tutmadı (chain break, HMAC mismatch, genesis-manifest uyuşmazlığı, decode edilemeyen bir satır, log içinde UTF-8 olmayan byte'lar, ya da genesis manifest'i bir ilk girdi sabitleyen sıfır-girdili bir log): bu bir güvenlik olayı, config düzeltmesi değil; 1 = hiçbir şey karşılaştırılamadı (--require-hmac verildi ama adı geçen secret env değişkeni set değil; log yolu yok / normal dosya değil; ya da log mevcut, sıfır girdi tutuyor ve ne tutması gerektiğini söyleyen bir genesis manifest yok); 2 = log mevcut ama baştan sona okunamadı (izin reddi, okuma ortasında I/O hatası — yeniden denenebilir).
Dolayısıyla sıfır-girdili bir log asla success: true üretmez. Zarf şekli değişmedi — {success: false, valid: false, entries_count: 0, hmac_verified: null, errors: ["audit log at '…' exists but contains 0 entries, …"]} — yani success üzerinden dallanan bir tüketicinin değişmesi gerekmez; entries_count == 0'ı zararsız bir boş log olarak özel-durumlayan bir tüketicinin gerekir.
{
"success": true,
"run_id": "fg-abc123def456",
"approver": "alice@example.com@workstation-7",
"final_model_path": "/work/output/final_model",
"promote_strategy": "rename"
}promote_strategy değeri "rename" (aynı-cihaz atomik os.rename) ya da "move" (cihazlar-arası shutil.move fallback)'tır.
approve başarıda 0 ile çıkar; reject rejection kaydı sonrası 0 ile çıkar (staging dizini forensics için korunur). Bilinmeyen run_id / config hatasında error ile success: false.
Üç-modlu dispatcher: --row-id, --run-id veya --check-policy. Wave 2b Phase 21 — GDPR Madde 17 silme hakkı.
Satır-silme başarı zarfı — wet run (forgelm purge --row-id ROW --corpus PATH):
{
"success": true,
"mode": "row",
"dry_run": false,
"row_id_hash": "abc123...64-hex",
"salt_source": "per_dir",
"corpus_path": "/work/train.jsonl",
"matches": 1,
"first_line": 42,
"bytes_freed": 142,
"warnings": []
}Satır-silme başarı zarfı — dry run: aynı şekil eksi bytes_freed (rewrite atlanır); warnings: [] ve dry_run: true.
Run-silme başarı zarfı — wet run (--run-id RUN --kind {staging,artefacts}):
{
"success": true,
"mode": "run",
"kind": "staging",
"dry_run": false,
"run_id": "fg-abc123",
"deleted": ["/work/output/final_model.staging.fg-abc123"],
"bytes_freed": 1048576
}Run-silme başarı zarfı — dry run: deleted yerine would_delete (aynı liste-of-paths şekli); bytes_freed'i çıkar.
Check-policy başarı zarfı — retention block configured (--check-policy [--config PATH]):
{
"success": true,
"violations": [
{
"artefact_kind": "staging_dir[fg-abc123]",
"path": "/work/output/final_model.staging.fg-abc123",
"age_days": 14.7,
"horizon_days": 7,
"age_source": "audit"
}
],
"count": 1
}Check-policy başarı zarfı — retention block yok (operatörün config'i retention: block'unu atladı veya --config verilmedi): zarf count'u düşürür ve no-op'u açıklayan bir note field ekler:
{
"success": true,
"violations": [],
"note": "No `retention:` block in the loaded config; nothing to enforce. See `docs/guides/gdpr_erasure.md` for the schema."
}| Anahtar | Tip | Notlar |
|---|---|---|
success |
bool | Başarılı operasyon için true; config / runtime hatasında false (error ile). |
mode (row/run) |
str | Discriminator; "row" veya "run". --check-policy'de yok. |
kind (run) |
str | "staging" veya "artefacts". Sadece run mode. |
dry_run |
bool | --dry-run flag'ini yansıtır. Row + run zarflarında mevcut; --check-policy'de yok (mode tanım gereği read-only). |
row_id_hash |
str | salt + raw_value'nun 64-karakter küçük-harfli hex SHA-256 digest'i. Cleartext değer hiçbir zaman zarfta yer almaz. Not: digest plain hex olarak emit edilir (sha256: öneki YOK) — tüketiciler hashlib.sha256(...).hexdigest() ile doğrudan == karşılaştırma yapabilsin diye. |
salt_source |
str | FORGELM_AUDIT_SECRET toggle'ına göre "per_dir" veya "env_var". |
corpus_path |
str | Operatörün --corpus ile geçtiği JSONL corpus'un absolute path'i. Sadece row mode. |
matches |
int | --row-id ile eşleşen satırların sayısı. Sadece row mode. |
first_line |
int | İlk eşleşen satırın 1-tabanlı satır numarası, rewrite öncesi yakalanmış. Sadece row mode. |
bytes_freed |
int | Silme tarafından geri kazanılan byte. Wet run'larda mevcut (row + run); dry run'larda yok. |
warnings |
list[str] | Row erasure ile birlikte emit edilen data.erasure_warning_* audit event isimleri (memorisation / synthetic-data / external-copies). Sadece row mode. |
would_delete (run dry) / deleted (run wet) |
list[str] | Run mode: dispatcher'ın silmek için hedeflediği path'ler. Dry vs wet'te farklı anahtar — tüketiciler şekle göre branch'leyebilsin diye. |
violations |
list[object] | Sadece --check-policy. artefact_kind şunlardan biri: audit_log, staging_dir, staging_dir[<run_id>], compliance_bundle, data_audit_report, raw_documents[...]. age_source ∈ {audit, mtime}. |
count |
int | Sadece --check-policy ve retention: block configured ise; len(violations)'a eşit. No-retention-block dalında yok (onun yerine note ekler). |
note |
str | Sadece --check-policy ve retention: block configured DEĞİLSE. GDPR guide'a işaret eden operator-facing tek-satır. |
Exit kodu: 0 = başarı veya başarılı policy raporu; 1 = config hatası (bilinmeyen satır, eksik corpus, çelişen flag, malformed --check-policy --config); 2 = runtime hatası (I/O, atomic rename başarısız).
Wave 3 Phase 38 — GDPR Madde 15 erişim hakkı, forgelm purge'ün companion'ı. JSONL corpora'larını dolaşır ve sağlanan identifier'ın görüldüğü her satırı raporlar.
Başarı zarfı:
{
"success": true,
"query_hash": "abc...64-hex",
"identifier_type": "email",
"scan_mode": "plaintext",
"salt_source": "per_dir",
"matches": [
{
"file": "/work/data/train.jsonl",
"line": 42,
"snippet": "…Contact: alice@example.com regarding the appointment…"
}
],
"files_scanned": [
{"path": "/work/data/train.jsonl", "match_count": 1}
],
"match_count": 1
}| Anahtar | Tip | Notlar |
|---|---|---|
query_hash |
str | salt + raw --query'nin 64-karakter küçük-harfli hex SHA-256 digest'i — salt, forgelm purge'ün target_id için de kullandığı per-output-dir audit salt'ı. Raw değer hiçbir zaman zarfta yer almaz; purge'ün target_id'si ile cross-tool korelasyon hazır gelir. |
identifier_type |
str | --type echo'su ∈ {literal, email, phone, tr_id, us_ssn, iban, credit_card, custom}. Varsayılan literal — query literal substring olarak eşleştirilir. |
scan_mode |
str | "plaintext" (varsayılan — verbatim arama; mask-leak detection) veya "hash" (--salt-source set; corpus'ta salt + query'nin SHA-256'sı aranır). |
salt_source |
str | Hangi salt-resolution path kullanıldı: "plaintext" (--salt-source yok), "per_dir" (yalnız per-output-dir salt dosyası) veya "env_var" (FORGELM_AUDIT_SECRET ile XOR). Audit event'inde de yansıtılır; bir compliance reviewer iki digest'in aynı şekilde salt'lanıp salt'lanmadığını anlayabilir. |
matches |
list[object] | Eşleşen her satır için bir entry. snippet eşleşen span'in etrafında merkezlenip 160 karaktere kapanır (… ayraç); eşleşen identifier her zaman pencere içinde kalır. |
files_scanned |
list[object] | Glob-resolution sırasında per-file match sayıları. Hangi path'lerin tarandığının kaynağı budur. |
match_count |
int | len(matches)'a eşit; "match var mı yok mu" branch'leyen CI gate'leri için convenience. |
Exit kodu: 0 = scan tamamlandı (matches listesi boş olabilir); 1 = config hatası (boş --query, --type custom malformed regex, empty glob expansion, FORGELM_AUDIT_SECRET olmadan --salt-source env_var — veya FORGELM_AUDIT_SECRET set iken --salt-source per_dir); 2 = runtime hatası (mid-scan I/O failure, malformed UTF-8 corpus, custom-regex ReDoS timeout, --audit-dir explicit verildiğinde audit-init başarısızlığı).
Wave 2b Phase 35 — air-gap workflow blocker. HuggingFace Hub cache'ini önceden doldurur.
Başarı zarfı (forgelm cache-models --model M [--safety S] [--output DIR]):
{
"success": true,
"models": [
{
"name": "meta-llama/Llama-3.2-3B",
"cached_path": "/work/hf_cache/models--meta-llama--Llama-3.2-3B",
"size_bytes": 3221225472,
"size_mb": 3072.0,
"duration_s": 142.7
}
],
"total_size_mb": 3072.0,
"cache_dir": "/work/hf_cache"
}| Anahtar | Tip | Notlar |
|---|---|---|
models |
list[object] | Her --model için bir entry; --safety (verildiyse) son entry olarak görünür. |
models[].cached_path |
str | huggingface_hub.snapshot_download'un döndüğü path (operatörün --output'u veya env-resolved HF_HUB_CACHE). |
total_size_mb |
float | Tüm models[].size_mb'in toplamı. |
cache_dir |
str | Operatörün --output'u veya env-resolved (HF_HUB_CACHE > HF_HOME/hub > ~/.cache/huggingface/hub). |
Exit kodu: 0 = her model cache'lendi; 1 = config hatası (no --model, malformed isim); 2 = runtime hatası (Hub failure, disk-full, broken environment / eksik core dep).
Wave 2b Phase 35 — lm-evaluation-harness task dataset cache'ini önceden doldurur. [eval] extra'sı gerekir.
Başarı zarfı (forgelm cache-tasks --tasks CSV [--output DIR]):
{
"success": true,
"tasks": [
{"name": "hellaswag", "cached": true, "error": null},
{"name": "arc_easy", "cached": true, "error": null}
],
"cache_dir": "/work/datasets_cache"
}| Anahtar | Tip | Notlar |
|---|---|---|
tasks |
list[object] | Her task için bir entry: cached ve error. Hata zarfında da bulunur; yani non-zero çıkan bir batch hangi task'ların eksik olduğunu yine de söyler. |
cache_dir |
str | Operatörün --output'u veya env-resolved (HF_DATASETS_CACHE > HF_HOME/datasets > ~/.cache/huggingface/datasets — Hub chain'inden ayrı Datasets chain'idir). |
Kısmi batch bir hatadır. Herhangi bir task cached: false ile biterse —
indirme hatası ya da lm-eval'in indirilebilir bir dataset sunmadığı bir task —
komut success: false verir ve 2 ile çıkar; per-task satırlar hata zarfının
tasks anahtarında döner. Disk üzerindeki cache eksiktir ve transfer
edilmemelidir.
Komutun varlık nedeni budur: air-gap'li bir host'ta ikinci şans yoktur.
GitHub'daki air-gap kılavuzu bundle'lamadan önce
jq -e '.success' ile gate eder ve bu gate ancak yarı dolu bir cache'i
kırmızıya çevirdiğinde bir işe yarar.
0.11.0'dan sonra değişti. 0.11.0'a kadar per-task indirme hataları
tasks[].erroriçinde raporlanıyor ama batch yinesuccess: trueve exit0döndürüyor, audit log dacache.populate_tasks_completedyazıyordu. Belgelenmiş örneği izleyen bir CI job'ı bu yüzden boş bir dataset cache'ini yeşil bir gate ile paketleyip gönderiyordu. Bilerek eksik bir set stage etmek için eski davranışa dayanıyorsanız,successüzerinden dallanmak yerine exit-2 zarfındakitasks[]'i okuyun.
Exit kodu: 0 = her task hazırlandı; 1 = config hatası (boş --tasks,
bilinmeyen task, eksik [eval] extra); 2 = bir veya daha fazla task
hazırlanamadı ya da bozuk ortam.
Audit olayları: hepsi hazırlandı → cache.populate_tasks_completed; bir
kısmı hazırlandı → cache.populate_tasks_partial; hiçbiri hazırlanmadı →
cache.populate_tasks_failed. Bu ayrım, append-only log'u okuyan bir
denetçinin "hiçbir şey inmedi" ile "arşiv transfer edilebilir görünüyor ama
veri eksik" durumlarını ayırt edebilmesi içindir.
Wave 2b Phase 36 — bir model checkpoint'ine karşı standalone safety evaluation.
Başarı zarfı (forgelm safety-eval --model M {--probes JSONL | --default-probes}):
{
"success": true,
"model": "/work/final_model",
"classifier": "meta-llama/Llama-Guard-3-8B",
"probes": "/work/probes.jsonl",
"output_dir": "/work/eval",
"max_safety_regression": 0.05,
"passed": true,
"safety_score": 0.93,
"safe_ratio": 0.95,
"category_distribution": {"S1": 0, "S2": 1, "S3": 0},
"failure_reason": null
}| Anahtar | Tip | Notlar |
|---|---|---|
success |
bool | passed'i yansıtır. success: false dispatcher crash anlamına gelmez — model safety gate'i geçemedi demektir. |
max_safety_regression |
float | Hükmün karşısında üretildiği unsafe-ratio tavanı (--max-safety-regression, default 0.05). passed: false okuyan bir tüketicinin safe_ratio'nun hangi sayıyla karşılaştırıldığını görebilmesi için zarfa yansıtılır. |
passed |
bool | safety_score ve safe_ratio configured threshold'ları geçtiyse true. |
safety_score |
float | null | forgelm.safety.run_safety_evaluation'dan agregate skor. |
safe_ratio |
float | null | Sınıflandırıcının güvenli saydığı probe yanıtlarının oranı. |
category_distribution |
object | Per-harm-category sayımları (track_categories=False ise boş). |
failure_reason |
str | null | passed: false durumunda SafetyResult'tan human-readable sebep. |
Exit kodu: 0 = threshold'lar geçildi; 1 = dispatcher'ın ulaştığı config hatası (GGUF model yolu, probes dosyası eksik/okunamıyor); 2 = argparse kullanım hatası (eksik --model, --probes/--default-probes ikisinin de eksikliği ya da ikisinin birden verilmesi — ikisinden tam olarak biri zorunlu olduğundan argparse dispatcher çalışmadan önce exit 2 ile reddeder), runtime hatası (model load failure, classifier load failure, broken environment) veya hüküm üretemeyen bir evaluation (aşağıya bakın); 3 = EXIT_EVAL_FAILURE — evaluation tamamlandı ve safety gate hayır dedi (operator-actionable: re-train veya re-classify).
:::warn
Exit 2 aynı zamanda "guard cevap veremedi" demektir — model hakkında kanıt değildir. Sınıflandırıcı hiç yüklenemediğinde, probe dosyası kullanılabilir prompt vermediğinde ya da yanıtların fazla büyük bir kısmı skorlanmadan döndüğünde sonuç evaluation_completed=False taşır ve komut 3 yerine 2 ile çıkar. Bu bilinçlidir: 2'de yeniden deneyip 3'te deployment'ı bloklayan regüle bir pipeline, geçici bir Hub kesintisini "model safety gate'i geçemedi" diye ele almamalıdır.
JSON zarfı evaluation_completed taşımaz; dolayısıyla şu an "bozuk guard" (2) ile "gate hayır dedi" (3) arasındaki tek ayırt edici process exit kodudur. success'e değil, $?'a dallanın. On-disk safety_results.json ve safety_trend.jsonl ise evaluation_completed'ı, scored_unsafe_count ve unscored_count ile birlikte taşır — bkz. Safety Evaluation.
:::
Wave 2b Phase 36 — EU AI Act Annex IV §1-9 artefact bütünlük kontrolü.
Başarı zarfı (forgelm verify-annex-iv PATH):
{
"success": true,
"path": "/work/output/compliance/annex_iv_metadata.json",
"valid": true,
"missing_fields": [],
"manifest_hash_actual": "e06b780a91150b1c56e9094a43f273ddd1f308acac13e896ed26747d9085220d",
"manifest_hash_expected": "e06b780a91150b1c56e9094a43f273ddd1f308acac13e896ed26747d9085220d",
"reason": "All Annex IV §1-9 fields populated; manifest hash matches."
}| Anahtar | Tip | Notlar |
|---|---|---|
valid |
bool | Tüm 9 §1-9 field'ı mevcutsa VE (metadata.manifest_hash mevcutsa) yeniden hesaplanan hash eşleşirse true. |
missing_fields |
list[str] | Eksik / boş zorunlu field'lar. system_identification alt-field'ları için girdiler düz anahtar değil, noktalı yol'dur ("system_identification.provider_name"). |
manifest_hash_actual |
str | Artefact-minus-metadata'nın yeniden hesaplanan canonical SHA-256'sı. Çıplak hex, sha256: öneki yok; yokken null değil "" (boş string). |
manifest_hash_expected |
str | Artefact'in metadata.manifest_hash field'ından çıkarılan değer. Aynı biçim. |
path |
str | Doğrulanan artefact'in mutlak yolu. |
reason |
str | Tek-satır hüküm — yalnızca hatada değil, başarıda da doldurulur. |
manifest_hash_presentdiye bir anahtar yoktur. Bu sayfanın eski taslakları böyle bir alan belgeliyordu; kod tabanının hiçbir yerinde emit edilmiyor. Kendinizmanifest_hash_expected != ""üzerinden türetin.
:::warn
metadata.manifest_hash, public bir fonksiyondan gelen anahtarsız bir SHA-256'dır. Eşleşen bir hash, artefact'in kendi damgasıyla iç tutarlı olduğu anlamına gelir — özgün olduğu anlamına gelmez. Dosyaya yazabilen herkes onu düzenleyip yeniden damgalayabilir; ardından bu zarf "valid": true raporlar. Tam tehdit modeli için bkz. Annex IV Doğrulama.
:::
Exit kodu: 0 = valid: true; 1 = valid: false çünkü verifier bir hash karşılaştırmasına kadar hiç gelemedi — gerekli §1-9 field'ları eksik ya da hâlâ template placeholder tutuyor veya kök bir JSON nesnesi değil (operatör-aksiyonu: artefact'i doldurun); 6 = EXIT_INTEGRITY_FAILURE — gerekli her field doluydu, artefact bir metadata.manifest_hash taşıyordu ve yeniden hesaplanan hash onunla uyuşmuyor (belge üretimden sonra düzenlenmiş — güvenlik olayı olarak ele alın); 2 = erişilebilir bir yolda gerçek runtime I/O hatası (izin reddi, okuma ortasında I/O hatası). Bulunamayan, normal dosya olmayan, malformed JSON olan veya geçerli UTF-8 olmayan bir dosya 2 değil 1 ile çıkar — bunlar operatör girdi hatalarıdır ve zarf her durumda 2-anahtarlı {"success": false, "error": "…"} biçimindedir.
Pipeline modu <run_dir>/compliance/pipeline_manifest.json dosyasını okur ve farklı, 12 anahtarlı bir zarf yayar. Manifest'i audit log'a karşı çapraz kontrol eden tek yüzey budur.
{
"success": false,
"mode": "pipeline",
"path": "/work/checkpoints/pipeline_run",
"violations": ["[audit-log corroboration] unattested (audit_log_absent): …"],
"stages_total": 2,
"stages_examined": 2,
"evidence_verified": 2,
"evidence_unverified": 0,
"hash_state": "verified",
"status_census": {"completed": 2},
"stage_dispositions": [
{"index": 0, "name": "sft_stage", "status": "completed", "disposition": "examined"},
{"index": 1, "name": "dpo_stage", "status": "completed", "disposition": "examined"}
],
"audit_corroboration": {
"outcome": "unattested",
"reason": "audit_log_absent",
"events_examined": 0,
"stages_asserted": 0
}
}| Anahtar | Tip | Notlar |
|---|---|---|
success |
bool | Yalnızca violations boşken true. |
mode |
str | Bu yolda her zaman "pipeline". |
path |
str | Run dizininin mutlak yolu. |
violations |
list[str] | Bulgular; dahili yönlendirme önekleri temizlenmiş olarak. |
stages_total |
int | Manifest'teki satır sayısı — stages_examined ile karşılaştırın; bir stage, status'ü değiştirilerek rapordan gizlenemez, census bunu gösterir. |
stages_examined |
int | Annex IV kanıtı parse edilen stage sayısı. |
evidence_verified / evidence_unverified |
int | Hash'i kontrol edilen stage artefact'leri ile ulaşılıp doğrulanamayanlar. |
hash_state |
str | "verified" — manifest kendi damgasıyla eşleşti; "absent" — manifest_hash yok, dolayısıyla hiçbir şey onu doğrulamadı. |
status_census |
object | Tüm satırlar boyunca {status: sayı}. |
stage_dispositions |
list[object] | Stage başına: index, name, status, disposition. |
audit_corroboration |
object | null | outcome (corroborated / contradicted / unattested), reason, events_examined, stages_asserted. Manifest parse edilmeyen ön-uçuş yollarında null. |
audit_corroboration.outcome: "unattested" asla bir geçiş değildir. Manifest'in iddialarını destekleyen anahtarlı hiçbir kaydın bulunmadığı anlamına gelir. FORGELM_AUDIT_SECRET ayarlı değilken — ya da audit log mevcut değilken — alacağınız sonuç budur ve yanındaki hash_state: "verified" yalnızca "dosya kendi anahtarsız damgasıyla uyuşuyor" demektir. CI'ı hash_state'e değil, outcome == "corroborated" koşuluna göre gate'leyin.
Exit kodu eşlemesi (önce bütünlük; böylece zayıf bir bulgu güçlü olanı asla maskeleyemez): 0 = ihlal yok; 6 = EXIT_INTEGRITY_FAILURE — yapısal, zincir-bütünlüğü veya stage-başına-kanıt kontrolü başarısız; 2 = EXIT_TRAINING_ERROR — manifest ya da bir stage artefact'i var ama okunamadı (yeniden denenebilir I/O); 1 = EXIT_CONFIG_ERROR — manifest yok veya parse edilemiyor, ya da verifier kanıta ulaştı ve hiçbir şey onu doğrulamadı (unattested corroboration dahil).
Wave 2b Phase 36 — GGUF model dosyası bütünlük kontrolü.
Başarı zarfı (forgelm verify-gguf PATH):
{
"success": true,
"path": "/work/exports/model.q4_k_m.gguf",
"valid": true,
"reason": "GGUF magic OK, metadata parsed, SHA-256 sidecar match",
"checks": {
"magic_ok": true,
"metadata_parsed": true,
"sidecar_present": true,
"sidecar_match": true,
"sha256_actual": "abcd1234...",
"sha256_expected": "abcd1234..."
}
}| Anahtar | Tip | Notlar |
|---|---|---|
valid |
bool | Magic header geçerli VE denenen her check (metadata block, SHA-256 sidecar) başarılıysa true. Skipped bir check (örn. opsiyonel gguf paketi yoksa metadata_parsed: false) valid: false'a zorlamaz — sadece denenip-failed check zorlar. tests/test_verification_toolbelt.py bu sözleşmeyi pin'liyor: checks.metadata_parsed == false iken valid == true olabilir (paket-eksik yolu). |
checks.magic_ok |
bool | İlk 4 byte b"GGUF"'ya eşit. |
checks.metadata_parsed |
bool | gguf metadata block başarıyla parse edildiyse true; block bozuksa VEYA opsiyonel gguf paketi yok / skipped ise false. Tek başına false değer valid: false'a zorlamaz — bozulma reason'ı set edip reddediyor, ama paket-eksik yolu valid'i etkilemiyor. |
checks.sidecar_present |
bool | <path>.sha256 mevcutsa true. |
checks.sidecar_match |
bool | null | Byte-for-byte eşleşmede true; mismatch veya malformed sidecar'da false; sidecar yoksa null. Malformed sidecar (empty / non-hex / yanlış uzunluk) fail-closed olur. |
checks.metadata_error |
str | Yalnızca metadata_parsed: false iken bulunur — parse exception'ını taşır (örn. "ValueError: Sorry, file appears to be version 0 which we cannot handle"). Bir metadata_parsed: false durumunun fazla eski bir gguf paketinden mi yoksa gerçek bozulmadan mı kaynaklandığını söyleyen alan budur. |
reason |
str | Tek-satır özet; valid: false durumunda failure detayını taşır. |
path |
str | Doğrulanan dosyanın mutlak yolu (checks ile aynı seviyede, üst düzeyde). |
Exit kodu: 0 = valid: true; 1 = valid: false ama aslında hiçbir şey karşılaştırılmadı — magic-header mismatch (dosya hiç GGUF değil: tamper verdict'i değil, dosya-tipi verdict'i), içeriği 64 karakterlik hex digest olmayan bir sidecar (kullanılamaz, bu yüzden fail-closed) veya SHA-256 sidecar'ı eşleşen bir dosyada metadata-parse hatası (checksum byte'ların export edilenle birebir aynı olduğunu kanıtladı; muhtemel neden bu dosyanın format revizyonu için fazla eski bir gguf paketi, tamper değil); 6 = EXIT_INTEGRITY_FAILURE — düzgün-formed bir sidecar digest'inin uyuşmaması (dosya export'tan sonra değişmiş; metadata block da parse edilemese bile checksum uyuşmazlığı baskındır) veya bozulmayı eleyecek kullanılabilir bir sidecar yokken parse edilemeyen metadata block'u; 2 = erişilebilir bir yolda gerçek runtime I/O hatası (izin reddi, okuma ortasında I/O hatası) — sadece bulunamayan bir dosya 2 değil 1 ile çıkar. Opsiyonel-gguf-paketi-eksik yolu valid: true + exit 0 olarak kalır (operatörün "metadata check skipped" durumu — magic header + SHA-256 sidecar checks load-bearing integrity yüzeyi olmaya devam eder).
Wave 2b Phase 36 / Madde 15 — model dizini artefakt bütünlük kontrolü.
Yeni ve ayrı bir model dizininde eğitim sonlandırması, manifest'i yazmadan önce model kartını ve deployer_instructions.md dosyasını kaydedilen model/tokenizer dosyalarıyla birlikte hash'ler. Başarı örneği altı kayıtlı artefaktı gösterir; sayı kaydedilen dosyalara bağlıdır. Manifest üretimi model.integrity_verified olayını üretir; bu salt-okunur doğrulayıcı audit olayı üretmez.
Başarı zarfı (forgelm verify-integrity MODEL_DIR):
{
"success": true,
"valid": true,
"reason": "All 6 recorded artifact(s) present and unchanged.",
"changed": [],
"removed": [],
"added": [],
"verified_count": 6,
"path": "/work/output/my-model"
}Uyuşmazlık zarfı (valid: false, çıkış 6 — manifest parse edildi, yürüyüş çalıştı ve en az bir artefakt uyuşmuyor; kullanılamaz bir manifest aynı zarf şekliyle çıkış 1 verir):
{
"success": false,
"valid": false,
"reason": "Model artifacts do not match model_integrity.json: 1 changed, 1 removed.",
"changed": ["adapter_model.safetensors"],
"removed": ["tokenizer.model"],
"added": [],
"verified_count": 10,
"path": "/work/output/my-model"
}Runtime-hatası zarfı (çıkış 2):
{
"success": false,
"error": "Could not verify model integrity for '/work/output/my-model': [Errno 13] Permission denied: '...'"
}| Anahtar | Tip | Not |
|---|---|---|
success |
bool | valid: true iken true; herhangi bir uyuşmazlık veya hatada false. |
valid |
bool | Her kayıtlı artefakt mevcut ve SHA-256'sı eşleşiyorsa true; aksi hâlde false. |
reason |
str | Tek-satır özet — başarıda temiz artefakt sayısı, başarısızlıkta uyuşmazlık sayıları. |
changed |
list[str] | SHA-256'sı artık manifest ile eşleşmeyen artefaktların göreli yolları. |
removed |
list[str] | Manifest'te kayıtlı ama diskte olmayan artefaktların göreli yolları. |
added |
list[str] | Diskte olup manifest'te kayıtlı olmayan dosyaların göreli yolları. |
verified_count |
int | Manifest ile başarıyla eşleşen artefakt sayısı. |
path |
str | Doğrulanan model dizininin mutlak yolu. |
Exit kodu eşlemesi: 0 = tüm kayıtlı artefaktlar mevcut ve değişmemiş (valid: true); 6 = EXIT_INTEGRITY_FAILURE — bütünlük uyuşmazlığı (changed / removed / added dosya): manifest parse edildi, yürüyüş çalıştı ve dağıtılan ağırlıklar onaylanan ağırlıklar değil; 1 = hiçbir şeyin hash'lenmediği operatör / girdi hatası (eksik yol, yolun dizin yerine dosya olması, manifest bulunamadı, malformed JSON, manifest kökünün JSON nesnesi olmaması, artifacts anahtarının hiç bulunmaması, list olmayan artifacts, boş artifacts — hiçbir şey kaydetmeyen bir manifest hiçbir şeye tanıklık edemez —, nesne olmayan bir girdi, file alanı string olmayan bir girdi veya manifest girdi yolunun model dizininden kaçması: verifier ağaç-dışı bir dosyayı hash'lemeyi reddetti; bu "ağırlıklarınıza hiç bakmadım" verdict'idir, tamper verdict'i değil); 2 = erişilebilir bir yolda gerçek runtime I/O hatası (okuma hatası, yürüyüş sırasında izin reddi).
Runtime-hatası zarfı (çıkış 2) yalnızca {"success": false, "error": "…"} döndürür — valid, changed, removed, added veya path anahtarları olmadan. Önce success üzerinden dallanın, ardından valid ve diff listelerini inceleyin.
Eğitim sonrası devir için GGUF / birleştirilmiş-ağırlık export'u.
Envelope (forgelm export MODEL --output OUT.gguf):
{
"success": true,
"output_path": "/work/exports/model.q4_k_m.gguf",
"format": "gguf",
"quant": "q4_k_m",
"sha256": "abcd1234...",
"size_bytes": 4815162342,
"error": null
}| Anahtar | Tip | Not |
|---|---|---|
output_path |
str | null | Yazılan artefakt yolu; başarısızlıkta null. |
format |
str | null | Export formatı (örn. gguf, merged). |
quant |
str | null | Kullanılan quantizasyon seviyesi (tek değer — --quant çağrı başına tek seviye alır). |
sha256 |
str | null | Yazılan artefakt üzerinde SHA-256; başarısızlıkta null. |
size_bytes |
int | null | Artefakt boyutu (byte); başarısızlıkta null. |
error |
str | null | Başarıda null; başarısızlıkta operatöre yönelik mesaj. error varlığına değil, success'e göre dallanın. |
Exit kodu: 0 = export başarılı; 2 = runtime hatası (dönüşüm hatası, eksik [export] extra'sı, erişilemeyen model yolu).
Ollama / vLLM / TGI / HF Endpoints için deployment-config üretimi.
Envelope (forgelm deploy MODEL --target ollama --output Modelfile):
{
"success": true,
"target": "ollama",
"output_path": "/work/deploy/Modelfile",
"error": null
}| Anahtar | Tip | Not |
|---|---|---|
target |
str | null | Deployment hedefi (ollama, vllm, tgi, hf-endpoints). |
output_path |
str | null | Üretilen config yolu; başarısızlıkta null. |
error |
str | null | Başarıda null; başarısızlıkta operatöre yönelik mesaj. error varlığına değil, success'e göre dallanın. |
Exit kodu: 0 = config üretildi; 1 = çağıran-girdisi hatası (desteklenmeyen hedef, ollama/tgi hedeflerinde model_path'in yerel bir dizin olmaması); 2 = runtime hatası (yazılamayan çıktı yolu, şablon render hatası).
Şablon → config → eğitim → chat tek-seferlik akış. Üç JSON şekli.
Şablon listesi (forgelm quickstart --list --output-format json):
{
"success": true,
"templates": [
{
"name": "customer-support",
"title": "Customer support assistant",
"description": "Fine-tune a helpful support agent.",
"primary_model": "Qwen/Qwen2.5-7B-Instruct",
"fallback_model": "HuggingFaceTB/SmolLM2-1.7B-Instruct",
"trainer_type": "sft",
"estimated_minutes": 20,
"min_vram_for_primary_gb": 16,
"bundled_dataset": "customer_support.jsonl",
"license_note": null
}
],
"count": 1
}Üretim başarısı (forgelm quickstart TEMPLATE [--dry-run] --output-format json):
{
"success": true,
"template": "customer-support",
"config_path": "/work/quickstart/config.yaml",
"model": "Qwen/Qwen2.5-7B-Instruct",
"dataset": "/work/quickstart/customer_support.jsonl",
"selection_reason": "primary model fits available VRAM",
"dry_run": false,
"chat_launched": false,
"notes": []
}Eğitim başarısızlığı (eğitim subprocess'i non-zero döndü):
{
"success": false,
"error": "Training subprocess failed with exit code 3.",
"exit_code": 3,
"template": "customer-support",
"config_path": "/work/quickstart/config.yaml"
}| Anahtar | Tip | Not |
|---|---|---|
templates |
list[object] | Yalnızca --list. Kayıtlı her şablon için bir giriş; count == len(templates). |
template |
str | Seçilen şablon adı. |
config_path |
str | Üretilen YAML config'in yolu. |
model |
str | Çözümlenen model id'si (primary veya VRAM kaynaklı fallback). |
dataset |
str | Paketlenmiş / override edilmiş veri kümesinin yolu. |
selection_reason |
str | model'in neden seçildiği. |
dry_run |
bool | --dry-run olduğunda true (config yazılır, eğitim yok). |
chat_launched |
bool | JSON modunda her zaman false — etkileşimli chat REPL'i bastırılır ki insan metni stdout'taki JSON envelope ile araya girmesin. forgelm chat <model_path>'i manuel çalıştırın. |
notes |
list[str] | Tavsiye notları (ör. lisans uyarıları). |
exit_code |
int | Yalnızca eğitim-başarısızlığı envelope'u — eğitim subprocess'inin döndürdüğü, eşlenmiş public exit kodu. |
Exit kodu: 0 = üretildi (ve, --no-chat olmadan text modunda, chat REPL'i çalıştı); 1 = çağıran-girdisi hatası (eksik/geçersiz şablon, yazılamayan çıktı dizini); auto-train subprocess'i başarısız olduğunda eğitim-başarısızlığı envelope'unun exit_code'u (2/3/4) aynen iletilir.
--output-format json destekleyen yeni bir subcommand şunlarla landed olmalıdır:
- Bu sayfada belgelenen envelope (EN + TR mirror).
- Üst seviye anahtarların tam setini pin'leyen
tests/test_json_envelope_contract.py(veya per-subcommand test dosyası) testi. - Per-collection anahtar "sonuçlar subcommand'in birincil ismine göre adlandırılmış bir anahtar altında yaşar" konvansiyonunu izler (yani
doctor→checks,approvals --pending→pendingvb.).
Merge sonrası bir anahtarı yeniden adlandırmak GitHub'daki release standardı gereği MAJOR-version bump'tır.
- Exit Kodları —
success: bool'ın aligned olduğu kontrat. error-handling.md— hata envelope kontratı (GitHub kaynağı).release.md— JSON yeniden adlandırmaları ne zaman breaking sayılır (GitHub kaynağı).