Hedef kitle: EU AI Act Madde 14 insan-gözetim kapısını ifa eden ForgeLM operatörleri ve ortaya çıkan
human_approval.granted/human_approval.rejectedaudit satırını doğrulayan denetçiler. Ayna: approve_subcommand.md
forgelm approve ve forgelm reject, EU AI Act Madde 14 insan-gözetim terminal-karar subcommand'larıdır (Phase 9). Eğitim koşusu kod 4 (EXIT_AWAITING_APPROVAL) ile çıktığında, diskte final_model.staging/ ve zincirde human_approval.required event'iyle duraklar; yetkili reviewer ardından approve (terfi için) veya reject (atmak için) çalıştırır.
Listeleme tamamlayıcısı için bkz. approvals_subcommand.md. Deployer akışı (CI koşusu 4 ile çıkar → reviewer'a haber gider → CLI çağrısı → audit) için bkz. ../guides/human_approval_gate.md.
forgelm approve run_id --output-dir DIR [--comment TEXT]
[--output-format {text,json}]
forgelm reject run_id --output-dir DIR [--comment TEXT]
[--output-format {text,json}]
İki subcommand da positional run_id alır (--run-id flag'i YOK). Bu, forgelm/cli/subcommands/_approve.py içindeki CLI yüzeyiyle ve ../qms/access_control.md §6'daki forgelm approve <run-id> cookbook'uyla eşleşir.
| Argüman / flag | Zorunlu | Açıklama |
|---|---|---|
run_id (positional) |
evet | human_approval.required event'iyle yayılan run id (örn. fg-abc123def456). |
--output-dir DIR |
evet | audit_log.jsonl ve final_model.staging/ içeren training output dizini. |
--comment TEXT |
hayır | Granted / rejected event'ına yazılan opsiyonel reviewer yorumu. reject üzerinde önerilir; auditor gerekçeyi görsün. |
--output-format {text,json} |
hayır (varsayılan text) |
json, CI tüketicileri için stdout'a tam olarak bir yapısal nesne yazdırır. |
forgelm.cli.subcommands._approve._run_approve_cmd içinde uygulanır:
audit_log.jsonl'in okunabilir olduğunu doğrular._find_human_approval_required_eventüzerindenrun_idiçin eşleşenhuman_approval.requiredevent'ini bulur.- Aynı
run_idiçin terminal karar (granted/rejected) zaten varsa reddeder (_find_human_approval_decision_event) — re-approve'a izin yok. - Event'teki
staging_path'inoutput_diriçinde çözüldüğünü doğrular (_staging_path_inside_output_dirdefence-in-depth — HMAC olmadan tampered audit log absolute veya..-traversal path planting'i yapabilirdi). - Atomik rename'den ÖNCE
AuditLogger(output_dir, run_id=run_id)kurar; böylece operatör-kimliği çözümlemesinden gelenEXIT_CONFIG_ERROR, terfi etmiş bir modeligrantedevent'i olmadan bırakmaz (Madde 12 kayıt-tutma bütünlüğü). final_model.staging[.<run_id>]/'ifinal_model/'e atomik olarak rename eder.gate="final_model",run_id,approver(_resolve_approver_identityile çözüldü),comment,promote_strategytaşıyanhuman_approval.granted'i yayar.notify_successwebhook yaşam döngüsü event'ini fırlatır.
forgelm.cli.subcommands._approve._run_reject_cmd içinde uygulanır:
approveile aynı audit-log / required-event / önceki-karar-yok doğrulaması.- Staging dizinini korur; reddedilen artefact'lar forensik inceleme için erişilebilir kalır.
gate="final_model",run_id,approver,comment,staging_pathtaşıyanhuman_approval.rejected'i yayar.notify_failurewebhook yaşam döngüsü event'ini fırlatır.
Staging dizini silinmez — operatörler red kaydı zincire girdikten sonra forgelm purge --run-id <id> --kind staging ile explicit olarak temizler.
İki subcommand da onaylayanın kimliğini forgelm.cli.subcommands._approve._resolve_approver_identity üzerinden çözer:
FORGELM_OPERATORenv var (en yüksek öncelik — explicit operatör tanımlama).getpass.getuser()(OS-raporlu kullanıcı adı).- İkisi de başarısızsa
"anonymous".
Madde 14 segregation of duties. Onaylayanın FORGELM_OPERATOR'ı eğiticininkinden farklı OLMALIDIR (ISO 27001:2022 A.5.3, SOC 2 CC1.5). ForgeLM farkı zorunlu kılmaz — bu deployer-tarafı IdP kontrolüdür — ancak audit zinciri her ikisini de kaydeder; auditor ../qms/access_control.md §6'daki jq -rs cookbook'uyla ihlalleri tespit edebilir:
jq -rs '
(map(select(.event == "training.started"))) as $trainers |
map(select(.event == "human_approval.granted"))[] |
. as $a |
$trainers[] |
select(.run_id == $a.run_id and .operator == $a.operator) |
[.run_id, .operator] | @tsv
' ./outputs/audit_log.jsonlYazdırılan herhangi bir satır segregation-of-duties ihlalidir.
İki event de audit_event_catalog.md'deki ortak zarfı taşır. Katalog satırları kolaylık için burada da listelenir.
| Event | Ne zaman yayılır | Anahtar payload |
|---|---|---|
human_approval.granted |
Operatör duraklatılan kapıyı forgelm approve ile onayladı. |
gate, approver, comment, run_id, promote_strategy |
human_approval.rejected |
Operatör duraklatılan kapıyı forgelm reject ile reddetti. |
gate, approver, comment, run_id, staging_path |
Eşleşen human_approval.required event'i kapı ilk açıldığında trainer tarafından yayılır (gate, reason, metrics, staging_path, run_id taşır).
| Kod | Anlamı |
|---|---|
| 0 | Karar kaydedildi; approve üzerinde staging dizini final_model/'e terfi etti. |
| 1 | Config hatası: audit_log.jsonl okunamaz veya bozuk, run_id için eşleşen human_approval.required event'i yok, önceki terminal karar zaten mevcut (re-approve / re-reject blok'lu), staging_path output_dir dışına kaçıyor, final_model/ zaten var (terfi edilemez), staging dizini eksik, FORGELM_OPERATOR çözülemiyor (AuditLogger'dan ConfigError). |
| 2 | Runtime hatası: atomic-rename başarısızlığı (os.replace sırasında OSError). |
Kod 3 (EXIT_EVAL_FAILURE) ve 4 (EXIT_AWAITING_APPROVAL) bu subcommand'ın yüzeyinin parçası değildir — kod 4 zaten operatörü buraya getiren input sinyalidir.
approve (başarı) — _run_approve_cmd'den yayılır:
{
"success": true,
"run_id": "fg-abc123def456",
"approver": "alice@acme.example",
"final_model_path": "outputs/run42/final_model",
"promote_strategy": "rename"
}reject (başarı) — _run_reject_cmd'den yayılır:
{
"success": true,
"run_id": "fg-abc123def456",
"approver": "alice@acme.example",
"staging_path": "outputs/run42/final_model.staging.fg-abc123def456",
"comment": "S5'te eşik kayması; daha sıkı regresyon toleransıyla yeniden eğitin."
}Hata (her ikisi, _output_error_and_exit tarafından):
{
"success": false,
"error": "Run 'fg-abc123def456' already has a terminal decision ('human_approval.granted'). Refusing to record another decision — re-approve is not allowed."
}Alan-düzeyi notlar.
approve,comment'ı JSON zarfında yansıtmaz (yorum, stdout'a değil,human_approval.grantedaudit event payload'ına yazılır).reject,--commentverilmediğinde boş string yansıtır.promote_strategyaynı-cihaz promote'ta"rename", cross-device fallback'te (shutil.move)"move"; audit event payload'ı bu değeri aynalar.
approvals_subcommand.md— keşif tamamlayıcısı (--pending/--show RUN_ID).../guides/human_approval_gate.md— deployer akışı.audit_event_catalog.md— zarf spec'i ile birlikte tam event sözlüğü.../qms/access_control.md§6 — segregation-of-duties cookbook.../usermanuals/tr/compliance/human-oversight.md— operatör-yüzlü kullanıcı kılavuzu sayfası.