diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 32b9e699..15089281 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -273,7 +273,7 @@ jobs: # the moment a dependency advisory drops, even before the team # re-bumps versions: # - # - pip-audit (transitive CVEs against the OSV / GHSA databases) + # - pip-audit (transitive CVEs against PyPI's vulnerability data, its default service) # - bandit (static-analysis on forgelm/ production code only) # # Severity policy (per tools/check_pip_audit.py + tools/check_bandit.py): diff --git a/CHANGELOG.md b/CHANGELOG.md index a8ec66d1..bdcc5ea1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,6 +87,49 @@ All notable changes to ForgeLM are documented here. ### Fixed +- Stop describing the human-approval gate as enforcing segregation of duties (English and Turkish): it records the + trainer and approver identities and does not compare them, and both are self-asserted. The ISO 27001 and SOC 2 + mappings, the Statement of Applicability, the change-management SOP, the deployer guide and the user manual now + say what the gate records and that keeping the two people different is the deployer's control. The guide also no + longer says `require_human_approval` is enforced for strict risk tiers: it is not (#73, #99, #90). +- Rewrite the GDPR / KVKK user-manual page (English and Turkish) to what ForgeLM does. It claimed that "by the time + data lands in JSONL, identifiable subjects are removed", that "no specific person's data is recoverable from the model" + and that the audit report "confirms this", that the audit flags memorisation, that a retention setting "auto-deletes" + originals and "records the intended TTL in the audit log", and it showed an `ingestion: pii_mask:` block and an + `international_transfers.enabled` setting that do not exist. Masking now reads as reducing the eight detected identifier + formats (names, addresses and free text are not detected), the audit report as the plain JSON it is (no source + attribution, no hash manifest), and access and erasure requests as `forgelm reverse-pii` and `forgelm purge` (#101). +- Document the one case where a failed safety gate still exits 0 with `auto_revert: true`: an evaluation that produced no + verdict (`safety.evaluation_completed: false` — classifier not loaded, probes file missing or empty, or most verdicts + unreadable) keeps the model and the run exits 0, or 4 with the approval gate. The error-handling standard, the exit-codes and + JSON-output pages, the audit-event catalogue, the safety guide, the deployer guide and the risk-treatment plan said that exit + 0 meant every gate passed, that a classifier load failure "halts" the pipeline and leaves no `final_model/`, and that + classification errors count as unsafe. The behaviour is unchanged; making it fail closed is a breaking exit-code change + left for a major version (#87). +- Say where the per-release SBOMs actually are and what they contain. The supply-chain reference, the ISO 27001 / SOC 2 deployer guide, + the change-management SOP and the supply-chain and deployer user-manual pages told an auditor to run `gh release download … --pattern 'sbom-*'` + and to "re-emit the SBOM from the git tag and diff it against the one attached to the release". Nothing attaches an SBOM to a + GitHub Release: `publish.yml` uploads the twelve files as workflow-run artifacts, which GitHub deletes after 90 days. The docs now give + the working commands (`gh run list --workflow publish.yml --branch v --status success`, then `gh run download`), say that a + release SBOM is the CI runner's `pip list` (test tooling such as `pytest` included, no dependency graph, no licence data) and so is + not reproducible from the tag, and drop "license extraction in SBOM" from the ISO A.5.32, SOC 2 CC9.2 and statement-of-applicability + rows. The nightly `pip-audit` is described as querying PyPI's vulnerability data (its default service, not OSV), and the manual's + "exit 1 means HIGH/CRITICAL" now includes UNKNOWN-severity findings. English and Turkish. Attaching the SBOMs to the release and + generating them from a clean runtime-only environment are code changes and stay open on the issue (#114). +- Stop saying that ForgeLM's audit log is the record-keeping artefact "mandated by EU AI Act Article 12" and that the approval gate + "implements" Article 14. Article 12 asks the deployed high-risk system to log events automatically over its lifetime, and Article 14's + oversight (monitor, interpret, override, stop) happens while the system is in use. `audit_log.jsonl` is development-time evidence of the + training pipeline, and `evaluation.require_human_approval` is a pre-promotion sign-off that supports design-time oversight documentation. + The audit-event catalogue, the audit-log and human-oversight user-manual pages (English and Turkish) now say that (#75). +- Correct site copy that promised more than the code does, in all six languages (`site/js/translations.js`, the HTML fallbacks and a code + comment in `site/js/wizard.js`): a failing benchmark gate exits 3 only with `evaluation.auto_revert: true` (and a safety evaluation with + no verdict keeps the model and exits 0); the approval gate records the approver, it is not "dual-controlled" and does not implement + Article 14's in-use oversight; webhook alerts are Slack-format, Teams and Discord need a relay; PII masking covers common formats, not + names or free text, and `reverse-pii` does not "satisfy" an access request; the wizard's retention "enforce" option is reserved and + deletes nothing; GGUF export writes a SHA-256 sidecar (K-quants need `llama-quantize`) rather than a "manifest"; DeepSpeed preset names + need a source checkout. A new site test keeps those phrases from coming back. English and Turkish are the maintained tiers; the German, + French, Spanish and Chinese strings were written by the assistant, not a native reviewer, and need review (#86, #89, #92, #94, #98, #99, + #101, #110, #112). The `forgelm doctor` sample on the quickstart page now uses the real renderer's format (#534). - Make `.github/dependabot.yml` parse. It set `versioning-strategy: widen` for `pip`, which that ecosystem does not accept (GitHub's "Dependabot" check on any pull request touching the file said so), so Dependabot opened no pull requests at all. The setting is removed, the header comment explains the restriction. diff --git a/docs/guides/iso_soc2_deployer_guide-tr.md b/docs/guides/iso_soc2_deployer_guide-tr.md index fd52e63e..196d0689 100644 --- a/docs/guides/iso_soc2_deployer_guide-tr.md +++ b/docs/guides/iso_soc2_deployer_guide-tr.md @@ -26,16 +26,20 @@ ForgeLM kanıtına sahip: 2. **Change control** — Madde 14 staging gate (`forgelm approve` / `reject`) + `human_approval.required/granted/rejected` audit olayları + koşum başına damgalanan `config_hash` (manifest sidecar - alanı). Her model promotion çift kontrollü ve forensic olarak - attribute edilmiştir. + alanı). Onay + kapısı etkinleştirildiğinde her promotion, audit log'a kaydedilen onaylayıcı kimliğine atfedilir. ForgeLM + eğitici ve onaylayıcı kimliklerini kaydeder ama karşılaştırmaz: bunların farklı kişiler olmasını kimlik + sağlayıcınızda uygularsınız. 3. **Data lineage** — `data_provenance.json` (SHA-256 fingerprint + size + mtime + `hf_revision_source` ile derecelendirilmiş dataset HF Hub commit SHA'sı); `data_governance_report.json` (collection_method, annotation_process, known_biases, personal_data_included, dpia_completed). 4. **Supply chain** — yayın etiketi başına yayın matrisinin her (OS - × Python-version) hücresi için emit edilen CycloneDX 1.5 SBOM. - Wave 4 statik + dinamik güvenlik taraması için `pip-audit` + × Python-version) hücresi için emit edilen CycloneDX 1.5 SBOM; + 90 gün boyunca workflow-run artifact olarak saklanır (GitHub + release'e eklenmez; CI runner'ının `pip list`'ini, test araçları + dahil, lisans verisi olmadan listeler). Wave 4 statik + dinamik güvenlik taraması için `pip-audit` nightly + `bandit` CI ekler. ## Denetim gözlem dönemi öncesi setup checklist'i @@ -65,7 +69,9 @@ Denetçi sormadan **önce** indirmeniz gereken on iki madde. - [ ] **`evaluation.require_human_approval: true`** her `risk_classification` ∈ `{high-risk, unacceptable}` koşumu - için. Unutursanız F-compliance-110 `ConfigError` raise eder. + için. ForgeLM bunu zorlamaz: F-compliance-110 yalnızca bu katmanlarda `evaluation.safety.enabled` + kapalıysa `ConfigError` raise eder; dolayısıyla onay kapısı olmayan, elle yazılmış bir strict-katman + YAML'ı kabul edilir. CLI sihirbazı (`forgelm --wizard`) bu katmanlarda kapıyı açar. - [ ] **Webhook lifecycle yapılandır** (`url_env`, `secret_env`, `notify_on_*`) böylece SIEM her durum geçişini içe alır. - [ ] **`auto_revert: true` etkinleştir** üretim eğitimi için — @@ -155,8 +161,9 @@ jq -r 'select(.run_id == "X" and (.event == "training.started" or .event == "hum ./outputs/audit_log.jsonl | sort -u ``` -İki farklı operator ID görev ayrılığını kanıtlar (ISO A.5.3, SOC 2 -CC1.5). +`training.started` üzerindeki operatörü `human_approval.granted` üzerindeki onaylayıcıyla karşılaştırın. İki kimlik de +kendi beyanıdır (`FORGELM_OPERATOR`, yoksa OS kullanıcısı); dolayısıyla görev ayrılığı (ISO A.5.3, SOC 2 CC1.5) ancak +kimlik sağlayıcınız bunları farklı kişiler yapıyorsa geçerlidir. ### S3: "Data lineage göster" @@ -198,19 +205,25 @@ eğittiğinin kanıtı saymayın. ### S4: "Supply chain göster" ```bash -# SBOM artefaktını GitHub release sayfasından indir. -gh release download v0.5.5 --pattern 'sbom-*' - -# Veya istek üzerine yeniden üret. +# Tag'in publish çalıştırmasından bir SBOM indir. Bunlar workflow-run +# artifact'larıdır, 90 günde silinir; GitHub release asset'i değildir. +gh run list --repo HodeTech/ForgeLM --workflow publish.yml --branch v0.11.0 --status success \ + --json databaseId,createdAt +gh run download --repo HodeTech/ForgeLM --name sbom-ubuntu-latest-py3.11 + +# Veya kendi ortamınızı tanımlayın: modeli eğiten ya da sunan ortamda, +# bir ForgeLM checkout'undan çalıştırın. python3 tools/generate_sbom.py > sbom.json # Son yayınla diff al. diff <(jq -S . sbom-prev.json) <(jq -S . sbom.json) ``` -CycloneDX 1.5 JSON her transitive bağımlılığı purl -(`pkg:pypi/...`) ve sürümle listeler. Dependency-Track CVE -korelasyonu için bunu doğal olarak içe alır. +CycloneDX 1.5 JSON kurulu her paketi purl (`pkg:pypi/...`) ve +sürümle listeler; bağımlılık grafiği ve lisans verisi yoktur. +Release SBOM'ları CI runner'ını tanımlar, bu yüzden `pytest` gibi +test araçlarını da adlandırır. Dependency-Track dosyayı CVE +korelasyonu için doğal olarak içe alır. ### S5: "Erişim kontrolleri göster — yalnız yetkili reviewer'ların model onayladığını nasıl ispatlıyorsunuz?" @@ -249,8 +262,11 @@ Referans: - `docs/qms/sop_incident_response.md` §4 (Wave 4 / Faz 23 genişletme) güvenlik-incident playbook için. -- Zincirin kendisi: `audit.classifier_load_failed` event yangın + - `pipeline.failed` propagate + koşum `final_model/` dizini ÜRETMEZ. +- Zincirin kendisi: `audit.classifier_load_failed` event'i tetiklenir + ve `safety.evaluation_completed` `evaluation_completed: false` kaydeder. + Koşu **durdurulmaz**: model `final_model/` içinde kalır ve koşu 0 ile + çıkar (onay kapısıyla 4); bu yüzden exit koduna değil, bu event'lere ya da + JSON zarfının `safety` bloğuna göre alarm kurun. - F-compliance-110 strict gate: `risk_classification ∈ {high-risk, unacceptable}` AND `evaluation.safety.enabled = false` ise config validator koşum başlamadan ÖNCE `ConfigError` raise eder. Denetçi diff --git a/docs/guides/iso_soc2_deployer_guide.md b/docs/guides/iso_soc2_deployer_guide.md index 3132ef96..9d020375 100644 --- a/docs/guides/iso_soc2_deployer_guide.md +++ b/docs/guides/iso_soc2_deployer_guide.md @@ -25,15 +25,20 @@ direct ForgeLM evidence: `forgelm verify-audit` validates the chain end-to-end. 2. **Change control** — Article 14 staging gate (`forgelm approve` / `reject`) + `human_approval.required/granted/rejected` audit - events + `config_hash` (per-run manifest sidecar field) stamped per run. Every - model promotion is dual-controlled and forensically attributed. + events + `config_hash` (per-run manifest sidecar field) stamped per run. When + the approval gate is enabled, every promotion is attributed to the approver identity recorded in the audit + log. ForgeLM records the trainer and approver identities but does not compare them: keeping them different + people is a control you enforce at your identity provider. 3. **Data lineage** — `data_provenance.json` (SHA-256 fingerprint + size + mtime + the dataset's HF Hub commit SHA, graded by `hf_revision_source`); `data_governance_report.json` (collection_method, annotation_process, known_biases, personal_data_included, dpia_completed). 4. **Supply chain** — CycloneDX 1.5 SBOM emitted per release tag for - every (OS × Python-version) cell of the publish matrix. Wave 4 + every (OS × Python-version) cell of the publish matrix, kept as a + workflow-run artifact for 90 days (not attached to the GitHub + release; it lists the CI runner's `pip list`, test tooling + included, with no licence data). Wave 4 adds `pip-audit` nightly + `bandit` CI for static + dynamic security scanning. @@ -63,7 +68,9 @@ Twelve items to land **before** the auditor asks. - [ ] **`evaluation.require_human_approval: true`** for every `risk_classification` ∈ `{high-risk, unacceptable}` run. - F-compliance-110 raises `ConfigError` if you forget. + ForgeLM does not enforce this: F-compliance-110 only raises `ConfigError` when + `evaluation.safety.enabled` is off for these tiers, so a hand-written strict-tier YAML without the + approval gate is accepted. The CLI wizard (`forgelm --wizard`) switches the gate on for these tiers. - [ ] **Configure webhook lifecycle** (`url_env`, `secret_env`, `notify_on_*`) so SIEM ingests every state transition. - [ ] **Enable `auto_revert: true`** for production training so @@ -155,8 +162,9 @@ jq -r 'select(.run_id == "X" and (.event == "training.started" or .event == "hum ./outputs/audit_log.jsonl | sort -u ``` -Two distinct operator IDs prove segregation of duties (ISO A.5.3, -SOC 2 CC1.5). +Compare the operator on `training.started` with the approver on `human_approval.granted`. Both identities are +self-asserted (`FORGELM_OPERATOR`, else the OS user), so segregation of duties (ISO A.5.3, SOC 2 CC1.5) holds only +if your identity provider makes them different people. ### Q3: "Show me the data lineage" @@ -198,19 +206,25 @@ corpus trained the model. ### Q4: "Show me the supply chain" ```bash -# Download the SBOM artefact from the GitHub release page. -gh release download v0.5.5 --pattern 'sbom-*' - -# Or regenerate on demand. +# Download one SBOM from the tag's publish run. They are workflow-run +# artifacts that expire after 90 days, not GitHub release assets. +gh run list --repo HodeTech/ForgeLM --workflow publish.yml --branch v0.11.0 --status success \ + --json databaseId,createdAt +gh run download --repo HodeTech/ForgeLM --name sbom-ubuntu-latest-py3.11 + +# Or describe your own environment: run this from a ForgeLM checkout in the +# environment that trains or serves the model. python3 tools/generate_sbom.py > sbom.json # Diff against last release. diff <(jq -S . sbom-prev.json) <(jq -S . sbom.json) ``` -The CycloneDX 1.5 JSON lists every transitive dependency with its -purl (`pkg:pypi/...`) and version. Dependency-Track ingests this -natively for CVE correlation. +The CycloneDX 1.5 JSON lists every installed package with its purl +(`pkg:pypi/...`) and version; it has no dependency graph and no licence +data. The release SBOMs describe the CI runner, so they also name test +tooling such as `pytest`. Dependency-Track ingests the file natively for +CVE correlation. ### Q5: "Show me the access controls — how do you prove only authorised reviewers approve models?" @@ -248,9 +262,11 @@ Reference: - `docs/qms/sop_incident_response.md` §4 (Wave 4 / Faz 23 expansion) for the security-incident playbook. -- The audit chain itself: `audit.classifier_load_failed` event fires - + `pipeline.failed` propagates + the run does NOT produce a - `final_model/` directory. +- The audit chain itself: the `audit.classifier_load_failed` event fires + and `safety.evaluation_completed` records `evaluation_completed: false`. + The run is **not** halted: the model stays in `final_model/` and the + run exits 0 (4 with the approval gate), so alert on those events or on + the JSON envelope's `safety` block, not on the exit code. - F-compliance-110 strict gate: if `risk_classification ∈ {high-risk, unacceptable}` AND `evaluation.safety.enabled = false`, the config validator raises `ConfigError` BEFORE the run starts. diff --git a/docs/guides/safety_compliance-tr.md b/docs/guides/safety_compliance-tr.md index 547edf2f..a4ece7f1 100644 --- a/docs/guides/safety_compliance-tr.md +++ b/docs/guides/safety_compliance-tr.md @@ -95,8 +95,7 @@ Kapı 2: Confidence-weighted → safety_score < min_safety_score? Kapı 3: Şiddet → critical_count > 0? high_count > eşik? ``` -Üç kapı bağımsızdır. Herhangi bir kapının başarısızlığı (etkinse) -auto-revert tetikler. +Üç kapı bağımsızdır. Bir kapının başarısızlığı (etkinse) auto-revert tetikler; güvenlik değerlendirmesi hiç karar üretemediyse bu geçerli değildir (bkz. [Fail-safe davranış](#fail-safe-davranış)). ### Zarar kategorileri (Llama Guard 3) @@ -204,13 +203,12 @@ iyileştirip bozmadığını izlemesine yardım eder. ### Fail-safe davranış -- Sınıflandırma hataları **güvensiz** olarak değerlendirilir (fail-safe - prensibi) +- Sınıflandırıcının yanıtlayamadığı bir çift **skorlanmamış** sayılır, güvenli değil - Düşük-güvenli sınıflandırmalar manuel inceleme için işaretlenir (uyarı log'u) -- Güvenlik değerlendirmesi başarısız olursa ve `auto_revert: true` ise - model otomatik olarak silinir -- Hat entegrasyonu için `3` exit kodu döner +- Skorlanmış bir güvenlik değerlendirmesi başarısız olursa ve `auto_revert: true` ise + model otomatik olarak silinir ve hat entegrasyonu için `3` exit kodu döner +- **Değerlendirme karar üretemezse** (`safety.evaluation_completed: false` — sınıflandırıcı yüklenemedi, probe dosyası yok ya da boş, ya da çoğu karar okunamadı), model `auto_revert: true` olsa bile **korunur** ve koşu `0` ile çıkar (onay kapısıyla `4`); çünkü okunmamış bir karar zarar kanıtı değildir. Yalnızca exit koduna değil, JSON çıktısındaki `safety.evaluation_completed` ve `safety.passed`'e bakın --- @@ -522,6 +520,8 @@ Herhangi bir adım başarısız olursa ve `auto_revert: true` ise: Model silinir + Webhook bildirimi (başarısızlık) + Exit kodu 3 ``` +Karar üretemeyen bir güvenlik değerlendirmesi (`evaluation_completed: false`) istisnadır: model korunur ve koşu 0 ile çıkar. + ### İnsan onay kapısı (Madde 14) Tüm otomatik kontroller geçtikten sonra hattı duraklatmak için diff --git a/docs/guides/safety_compliance.md b/docs/guides/safety_compliance.md index 5569369c..6f4f585a 100644 --- a/docs/guides/safety_compliance.md +++ b/docs/guides/safety_compliance.md @@ -77,7 +77,7 @@ Gate 2: Confidence-weighted → safety_score < min_safety_score? Gate 3: Severity → critical_count > 0? high_count > threshold? ``` -All three gates are independent. Any gate failure triggers auto-revert (if enabled). +All three gates are independent. A gate failure triggers auto-revert (if enabled), unless the safety evaluation produced no verdict at all (see [Fail-Safe Behavior](#fail-safe-behavior)). ### Harm Categories (Llama Guard 3) @@ -179,10 +179,10 @@ This helps teams track whether data/config changes are improving or degrading sa ### Fail-Safe Behavior -- Classification errors are treated as **unsafe** (fail-safe principle) +- A pair the classifier cannot answer is counted as **unscored**, not as safe - Low-confidence classifications are flagged for manual review (warning log) -- If safety evaluation fails and `auto_revert: true`, the model is automatically deleted -- Exit code `3` is returned for pipeline integration +- If a scored safety evaluation fails and `auto_revert: true`, the model is automatically deleted and exit code `3` is returned for pipeline integration +- **If the evaluation produces no verdict** (`safety.evaluation_completed: false` — the classifier failed to load, the probes file is missing or empty, or most verdicts were unreadable), the model is **kept** and the run exits `0` (`4` with the approval gate) even with `auto_revert: true`, because an unread verdict is not evidence of harm. Branch on `safety.evaluation_completed` and `safety.passed` in the JSON output, not on the exit code alone --- @@ -461,12 +461,14 @@ Model saved + Model card + Compliance artifacts Webhook notification (success) ``` -If any step fails and `auto_revert: true`: +If a gate fails with a verdict and `auto_revert: true`: ``` ↓ fail Model deleted + Webhook notification (failure) + Exit code 3 ``` +A safety evaluation that produced no verdict (`evaluation_completed: false`) is the exception: the model is kept and the run exits 0. + ### Human Approval Gate (Art. 14) Add `require_human_approval: true` to pause the pipeline after all automated checks pass: diff --git a/docs/qms/risk_treatment_plan-tr.md b/docs/qms/risk_treatment_plan-tr.md index 9570b600..073d0c25 100644 --- a/docs/qms/risk_treatment_plan-tr.md +++ b/docs/qms/risk_treatment_plan-tr.md @@ -103,7 +103,7 @@ ekler. |---|---| | Açıklama | Llama Guard / yapılandırılmış safety classifier yüklenemiyor (HF Hub down, OOM, version mismatch); ForgeLM gate yangın etmeden devam eder | | L × I (inherent) | Med × High = HIGH | -| Treatment | F-compliance-110 strict gate: `risk_classification` ∈ `{high-risk, unacceptable}` + `evaluation.safety.enabled: false` `ConfigError` raise eder; `audit.classifier_load_failed` event arızayı kaydeder; operatör pipeline'ı non-zero exit'te durur | +| Treatment | F-compliance-110 strict gate: `risk_classification` ∈ `{high-risk, unacceptable}` + `evaluation.safety.enabled: false` `ConfigError` raise eder; `audit.classifier_load_failed` event arızayı kaydeder. Koşu **durdurulmaz**: karar üretemeyen bir güvenlik değerlendirmesi modeli korur ve 0 ile çıkar (onay kapısıyla 4), bu yüzden operatör pipeline'ı yalnızca exit koduna değil, JSON zarfındaki `safety.evaluation_completed` / `safety.passed`'e ya da o audit event'ine bakmalıdır | | Residual L × I | Low × Low = LOW | | Sahip | ML Lead | | Review cadence | Eğitim koşumu başına | diff --git a/docs/qms/risk_treatment_plan.md b/docs/qms/risk_treatment_plan.md index 43258b00..5b5ef08b 100644 --- a/docs/qms/risk_treatment_plan.md +++ b/docs/qms/risk_treatment_plan.md @@ -102,7 +102,7 @@ section §4. |---|---| | Description | Llama Guard / configured safety classifier fails to load (HF Hub down, OOM, version mismatch); ForgeLM proceeds without the gate fired | | L × I (inherent) | Med × High = HIGH | -| Treatment | F-compliance-110 strict gate: `risk_classification` ∈ `{high-risk, unacceptable}` + `evaluation.safety.enabled: false` raises `ConfigError`; `audit.classifier_load_failed` event records the failure; deployer pipeline halts on non-zero exit | +| Treatment | F-compliance-110 strict gate: `risk_classification` ∈ `{high-risk, unacceptable}` + `evaluation.safety.enabled: false` raises `ConfigError`; `audit.classifier_load_failed` event records the failure. The run is **not** halted: a safety evaluation with no verdict keeps the model and exits 0 (4 with the approval gate), so the deployer pipeline must branch on the JSON envelope's `safety.evaluation_completed` / `safety.passed` or on that audit event, not on the exit code alone | | Residual L × I | Low × Low = LOW | | Owner | ML Lead | | Review cadence | Per training run | diff --git a/docs/qms/sop_change_management-tr.md b/docs/qms/sop_change_management-tr.md index c010fc36..8a3d1a4b 100644 --- a/docs/qms/sop_change_management-tr.md +++ b/docs/qms/sop_change_management-tr.md @@ -109,8 +109,9 @@ CAB'sıdır: retention süresi dolana kadar (`retention.staging_ttl_days` — config'te). -Bu, operatöre SOC 2 CC8.1 kanıtı verir: her model promotion -attribute, çift kontrollü ve forensic olarak kayıtlıdır. +Bu, operatöre SOC 2 CC8.1 kanıtı verir: onay kapısı etkinleştirildiğinde her +model promotion kaydedilen onaylayıcı kimliğine atfedilir ve forensic olarak kayıtlıdır. Eğitici ile onaylayıcıyı +ayırmak dağıtımı yapanın kontrolüdür: ForgeLM iki kimliği karşılaştırmaz. ### 4.2 Yapılandırma drift tespiti @@ -134,9 +135,12 @@ olarak atfeder. 1.5 SBOM üretir. Wave 4 bir determinism contract testi ekler (`tests/test_supply_chain_security.py::TestGenerateSbomDeterministic`). -Drift tespiti: bir release'in SBOM'u `git tag`'inden tekrarlanabilir. -Bir denetçi bunu istek üzerine yeniden emit edip GitHub release'e -ekli artefakta diff alabilir. +Drift tespiti: SBOM, release'in build edildiği ortamın kaydıdır (matris runner'ında +`pip list`); tag'in `publish.yml` çalıştırmasının workflow-run artifact'ı olarak 90 gün +saklanır, GitHub release'e eklenmez. Bağımlılıklar build anında PyPI'dan çözüldüğü için +yalnızca `git tag`'den tekrarlanamaz. İki release'in SBOM'unu `diff` ile karşılaştırın; +dağıtılmış bir ortamı kanıtlamak için orada `python3 tools/generate_sbom.py` ile yeni +bir tane üretin. ## 5. Versiyon İzleme diff --git a/docs/qms/sop_change_management.md b/docs/qms/sop_change_management.md index 79336c3d..cffc7820 100644 --- a/docs/qms/sop_change_management.md +++ b/docs/qms/sop_change_management.md @@ -104,8 +104,9 @@ in-pipeline CAB: in `final_model.staging./` for forensic review until retention expires (`retention.staging_ttl_days` in the config). -This gives a deployer SOC 2 CC8.1 evidence: every model promotion is -attributed, dual-controlled, and forensically recorded. +This gives a deployer SOC 2 CC8.1 evidence: when the approval gate is +enabled, every model promotion is attributed to the recorded approver identity and forensically recorded. +Separating trainer and approver is the deployer's control: ForgeLM does not compare the two identities. ### 4.2 Configuration drift detection @@ -129,9 +130,12 @@ CycloneDX 1.5 SBOM per (OS × Python-version) on every release tag (`publish.yml`). Wave 4 adds a determinism contract test (`tests/test_supply_chain_security.py::TestGenerateSbomDeterministic`). -Drift detection: a release's SBOM is reproducible from its `git tag`. -An auditor can re-emit it on demand and diff against the artefact -attached to the GitHub release. +Drift detection: the SBOM is a record of the environment the release was built in +(`pip list` on the matrix runner), kept as a workflow-run artifact of the tag's +`publish.yml` run for 90 days; it is not attached to the GitHub release. It is not +reproducible from the `git tag` alone, because dependencies resolve from PyPI at build +time. Compare two releases' SBOMs with `diff`; to evidence a deployed environment, emit +a fresh one there with `python3 tools/generate_sbom.py`. ## 5. Version Tracking diff --git a/docs/qms/statement_of_applicability-tr.md b/docs/qms/statement_of_applicability-tr.md index ac90f3c5..3f93b03f 100644 --- a/docs/qms/statement_of_applicability-tr.md +++ b/docs/qms/statement_of_applicability-tr.md @@ -59,7 +59,7 @@ operatör-tarafı eylem. | A.5.29 Aksaklık sırasında bilgi güvenliği | YES | `auto_revert` baseline-flip; `model.reverted` event | Base-model retention dokümante et | | A.5.30 İş sürekliliği için ICT hazırlığı | YES | DR planlama | Benimse | | A.5.31 Yasal, kanuni, düzenleyici ve sözleşmesel gerekliliklerin tanımlanması | YES | EU AI Act + GDPR mapping'ler; Annex IV bundle | Kural değişikliklerini izle | -| A.5.32 Fikri mülkiyet hakları | YES | SBOM'da lisans çıkarımı; HF model-card metadata | Per-model lisans review | +| A.5.32 Fikri mülkiyet hakları | YES | HF model-card metadata (SBOM lisans verisi taşımaz) | Per-model lisans review | | A.5.33 Kayıtların korunması | YES | Append-only + HMAC + manifest sidecar; off-site replica | Off-site backup | | A.5.34 Gizlilik ve PII korunması | YES | `forgelm reverse-pii` Md. 15; `forgelm purge` Md. 17; `forgelm audit` PII tespiti + maskeleme | DSAR workflow + DPIA | | A.5.35 Bilgi güvenliğinin bağımsız incelenmesi | YES | Yıllık external denetim | Benimse | @@ -108,7 +108,7 @@ ForgeLM-spesifik kontrol envanteriyle ilgilidir. | Kontrol | Applicable? | ForgeLM kanıtı | Operatör-tarafı eylem | |---|---|---|---| | A.8.1 Kullanıcı uç cihazları | YES | `forgelm doctor` — Python / CUDA / GPU / extras / HF auth / disk / `FORGELM_OPERATOR` checks | Endpoint hardening | -| A.8.2 Ayrıcalıklı erişim hakları | YES | Operatör attribution; approval gate non-trainer operator | IdP'de RBAC | +| A.8.2 Ayrıcalıklı erişim hakları | YES | Operatör attribution; approval gate onaylayıcı kimliğini kaydeder | IdP'de RBAC | | A.8.3 Bilgi erişim kısıtlaması | YES | Salted identifier hashing; `forgelm reverse-pii` Md. 15 | DSAR workflow | | A.8.4 Kaynak koduna erişim | YES | `model.trust_remote_code=False` default; `model.revision` temel-model deposunu sabitler ve `trust_remote_code: true` ile çalıştırılacak depo-içi kodu sınırlar. `_fingerprint_hf_revision` yalnızca **dataset** deposunu kapsar | VCS erişim kontrolü; `trust_remote_code: true` onaylanan her yerde `model.revision` zorunlu tutun | | A.8.5 Güvenli kimlik doğrulama | YES | `safe_post` non-HTTPS'de auth header reddeder; webhook secret discipline | MFA + token rotasyonu | diff --git a/docs/qms/statement_of_applicability.md b/docs/qms/statement_of_applicability.md index b78bc887..26767b04 100644 --- a/docs/qms/statement_of_applicability.md +++ b/docs/qms/statement_of_applicability.md @@ -58,7 +58,7 @@ contribution → deployer-side action. | A.5.29 Information security during disruption | YES | `auto_revert` baseline-flip; `model.reverted` event | Document base-model retention | | A.5.30 ICT readiness for business continuity | YES | DR planning | Adopt | | A.5.31 Identification of legal, statutory, regulatory and contractual requirements | YES | EU AI Act + GDPR mappings; Annex IV bundle | Track rule changes | -| A.5.32 Intellectual property rights | YES | License extraction in SBOM; HF model-card metadata | Per-model license review | +| A.5.32 Intellectual property rights | YES | HF model-card metadata (the SBOM carries no licence data) | Per-model license review | | A.5.33 Protection of records | YES | Append-only + HMAC + manifest; off-site replica | Off-site backup | | A.5.34 Privacy and protection of PII | YES | `forgelm reverse-pii` Article 15; `forgelm purge` Article 17; `forgelm audit` PII detection + masking | DSAR workflow + DPIA | | A.5.35 Independent review of information security | YES | Annual external audit | Adopt | @@ -107,7 +107,7 @@ ForgeLM-specific control inventory. | Control | Applicable? | ForgeLM evidence | Deployer-side action | |---|---|---|---| | A.8.1 User endpoint devices | YES | `forgelm doctor` — Python / CUDA / GPU / extras / HF auth / disk / `FORGELM_OPERATOR` checks | Endpoint hardening | -| A.8.2 Privileged access rights | YES | Operator attribution; approval gate non-trainer operator | RBAC at IdP | +| A.8.2 Privileged access rights | YES | Operator attribution; approval gate records the approver identity | RBAC at IdP | | A.8.3 Information access restriction | YES | Salted identifier hashing; `forgelm reverse-pii` Article 15 | DSAR workflow | | A.8.4 Access to source code | YES | `model.trust_remote_code=False` default; `model.revision` pins the base-model repo, bounding the repo-bundled code `trust_remote_code: true` would run. `_fingerprint_hf_revision` covers the **dataset** repo only | VCS access control; require `model.revision` wherever `trust_remote_code: true` is approved | | A.8.5 Secure authentication | YES | `safe_post` rejects auth headers on non-HTTPS; webhook secret discipline | MFA + token rotation | diff --git a/docs/reference/architecture.md b/docs/reference/architecture.md index 735b3f2b..e3872c43 100644 --- a/docs/reference/architecture.md +++ b/docs/reference/architecture.md @@ -134,7 +134,7 @@ Lightweight `TrainResult` dataclass — importable without torch/transformers. C Wraps EleutherAI `lm-evaluation-harness`. Runs configurable benchmark tasks, extracts accuracy metrics, applies min_score threshold, and saves results. Optional dependency: `pip install forgelm[eval]`. ### `safety/` -Runs a configurable safety classifier (Llama Guard, ShieldGemma) on adversarial test prompts. Generates responses from the fine-tuned model, classifies each as safe/unsafe, and triggers auto-revert if regression exceeds threshold. Errors are treated as unsafe (fail-safe principle). +Runs a configurable safety classifier (Llama Guard, ShieldGemma) on adversarial test prompts. Generates responses from the fine-tuned model, classifies each as safe/unsafe, and triggers auto-revert if regression exceeds threshold. A pair the classifier cannot answer is counted as unscored, not as safe; when the classifier does not load, the probes file is missing or empty, or most verdicts are unreadable, the evaluation produces no verdict (`evaluation_completed: false`) and the model is kept (the run exits 0). ### `judge.py` LLM-as-Judge evaluation supporting API-based judges (OpenAI-compatible endpoint) and local model judges. Includes robust JSON parsing with markdown code block extraction. Scores on 1-10 scale with configurable minimum threshold. diff --git a/docs/reference/audit_event_catalog-tr.md b/docs/reference/audit_event_catalog-tr.md index 051d863e..452d4e73 100644 --- a/docs/reference/audit_event_catalog-tr.md +++ b/docs/reference/audit_event_catalog-tr.md @@ -1,9 +1,9 @@ # Audit Event Kataloğu -> **Hedef kitle:** EU AI Act Madde 12 kayıt-tutma artefaktlarını inceleyen ForgeLM operatörleri, denetçiler ve aşağı akış doğrulayıcıları. +> **Hedef kitle:** ForgeLM'in eğitim-hattı audit log'unu inceleyen ForgeLM operatörleri, denetçiler ve aşağı akış doğrulayıcıları. > **Ayna:** [audit_event_catalog.md](audit_event_catalog.md) -Bu katalog, ForgeLM'in EU AI Act Madde 12 tarafından zorunlu kılınan, append-only ve hash-zincirli kayıt-tutma artefaktı olan `audit_log.jsonl`'a yazabileceği tüm event'leri sıralar. Her satır ortak bir zarf paylaşır; aşağıdaki satırlardan birini `event` alanı seçer. +Bu katalog, ForgeLM'in append-only ve hash-zincirli eğitim-hattı audit log'u olan `audit_log.jsonl`'a yazabileceği tüm event'leri sıralar. Bu log, teknik dokümantasyonu (Annex IV) ve kalite-yönetimi kayıt tutmayı destekleyebilecek geliştirme-zamanı kanıtıdır; tek başına EU AI Act Madde 12'yi karşılamaz, çünkü Madde 12 dağıtılmış yüksek-riskli sistemin ömrü boyunca olayları otomatik kaydetmesini ister. Her satır ortak bir zarf paylaşır; aşağıdaki satırlardan birini `event` alanı seçer. ## Ortak zarf @@ -161,7 +161,7 @@ damgasıyla kurabilir. Uygulama: `forgelm/webhook.py`. | Webhook `event` | Denetim günlüğü karşılığı | Tetikleyici | Kapı (gate) | Zorunlu payload alanları | |---|---|---|---|---| | `training.start` | `training.started` | `train()` çağrıldı, model yüklenmeden önce. | `webhook.notify_on_start` | `run_name`, `status="started"` | -| `training.success` | `pipeline.completed` | Koşu revert veya bekleyen onay olmadan tamamlandı. `evaluation.auto_revert: true` ile tüm kapılar geçildi; varsayılan `auto_revert: false` ile bir kapı geçemediği halde yalnızca kaydedildiğinde de tetiklenir (model yine terfi eder). | `webhook.notify_on_success` | `run_name`, `status="succeeded"`, `metrics` | +| `training.success` | `pipeline.completed` | Koşu revert veya bekleyen onay olmadan tamamlandı. `evaluation.auto_revert: true` ile karara varan tüm kapılar geçildi (karar üretemeyen bir güvenlik değerlendirmesi, `safety.evaluation_completed: false`, modeli korur ve yine buraya varır); varsayılan `auto_revert: false` ile bir kapı geçemediği halde yalnızca kaydedildiğinde de tetiklenir (model yine terfi eder). | `webhook.notify_on_success` | `run_name`, `status="succeeded"`, `metrics` | | `training.failure` | `pipeline.failed` | Eğitim sürecinin kendisi hata fırlattı (OOM, veri seti hatası, yakalanmayan istisna). | `webhook.notify_on_failure` | `run_name`, `status="failed"`, `reason` (maskelenmiş, ≤2048 karakter) | | `training.reverted` | `model.reverted` | Eğitim sonrası bir kapı (değerlendirme, güvenlik, hakem, benchmark) çalışmayı reddetti ve `_revert_model` adaptörleri sildi. | `webhook.notify_on_failure` | `run_name`, `status="reverted"`, `reason` (maskelenmiş, ≤2048 karakter) | | `approval.required` | `human_approval.required` | Çalışma başarılı oldu, `evaluation.require_human_approval=true`, model insan incelemesi için staging'de (EU AI Act Madde 14). | `webhook.notify_on_success` | `run_name`, `status="awaiting_approval"`, `model_path` | diff --git a/docs/reference/audit_event_catalog.md b/docs/reference/audit_event_catalog.md index e5d05c32..d5b93ebd 100644 --- a/docs/reference/audit_event_catalog.md +++ b/docs/reference/audit_event_catalog.md @@ -1,9 +1,9 @@ # Audit Event Catalog -> **Audience:** ForgeLM operators, regulators, and downstream verifiers reviewing the EU AI Act Article 12 record-keeping artefacts. +> **Audience:** ForgeLM operators, regulators, and downstream verifiers reviewing ForgeLM's training-pipeline audit log. > **Mirror:** [audit_event_catalog-tr.md](audit_event_catalog-tr.md) -This catalog enumerates every event ForgeLM may append to `audit_log.jsonl`, the append-only, hash-chained record-keeping artefact mandated by EU AI Act Article 12. Every entry shares a common envelope; the `event` field selects one of the rows below. +This catalog enumerates every event ForgeLM may append to `audit_log.jsonl`, ForgeLM's append-only, hash-chained training-pipeline audit log. It is development-time evidence that can support the technical documentation (Annex IV) and quality-management record-keeping; it does not by itself satisfy EU AI Act Article 12, which requires the deployed high-risk system to log events automatically over its lifetime. Every entry shares a common envelope; the `event` field selects one of the rows below. ## Common envelope @@ -161,7 +161,7 @@ webhook ping → audit entry by `run_name` + timestamp. Implementation: | Webhook `event` | Audit-log mirror | Trigger | Gated by | Required payload fields | |---|---|---|---|---| | `training.start` | `training.started` | `train()` entered, before model load. | `webhook.notify_on_start` | `run_name`, `status="started"` | -| `training.success` | `pipeline.completed` | Run completed without revert or pending approval. With `evaluation.auto_revert: true` all gates passed; with the default `auto_revert: false` it also fires when a gate failed but was only recorded (model still promoted). | `webhook.notify_on_success` | `run_name`, `status="succeeded"`, `metrics` | +| `training.success` | `pipeline.completed` | Run completed without revert or pending approval. With `evaluation.auto_revert: true` every gate that produced a verdict passed (a safety evaluation with no verdict, `safety.evaluation_completed: false`, keeps the model and also ends here); with the default `auto_revert: false` it also fires when a gate failed but was only recorded (model still promoted). | `webhook.notify_on_success` | `run_name`, `status="succeeded"`, `metrics` | | `training.failure` | `pipeline.failed` | Training itself raised (OOM, dataset error, unhandled exception). | `webhook.notify_on_failure` | `run_name`, `status="failed"`, `reason` (masked, ≤2048 chars) | | `training.reverted` | `model.reverted` | A post-training gate (evaluation, safety, judge, benchmark) rejected the run and `_revert_model` deleted the adapters. | `webhook.notify_on_failure` | `run_name`, `status="reverted"`, `reason` (masked, ≤2048 chars) | | `approval.required` | `human_approval.required` | Run succeeded, `evaluation.require_human_approval=true`, model staged for review (EU AI Act Art. 14). | `webhook.notify_on_success` | `run_name`, `status="awaiting_approval"`, `model_path` | diff --git a/docs/reference/iso27001_control_mapping-tr.md b/docs/reference/iso27001_control_mapping-tr.md index 57e78d96..9fb5ca31 100644 --- a/docs/reference/iso27001_control_mapping-tr.md +++ b/docs/reference/iso27001_control_mapping-tr.md @@ -23,7 +23,7 @@ |---|---|---| | A.5.1 Bilgi güvenliği için politikalar | FL-helps | `audit_event_catalog.md` neyin loglandığını dokümante eder | | A.5.2 Bilgi güvenliği rolleri ve sorumlulukları | FL-helps | `FORGELM_OPERATOR` + `roles_responsibilities.md` | -| A.5.3 Görev ayrılığı | FL-helps | `human_approval.required/granted` trainer ≠ approver'ı zorlar | +| A.5.3 Görev ayrılığı | FL-helps | `human_approval.required/granted` onaylayıcı kimliğini (`FORGELM_OPERATOR`'dan, yoksa OS kullanıcısından) **kaydeder**, böylece eğitici ≠ onaylayıcı denetlenebilir; ForgeLM kendisi self-approval'ı reddetmez. Runner ve reviewer kimliklerini kimlik sağlayıcınızda ayrık tutun | | A.5.4 Yönetim sorumlulukları | FL-helps | `forgelm doctor`; `compliance_report.json`; `training_manifest.yaml` | | A.5.5 Yetkililerle iletişim | OOS | — | | A.5.6 Özel ilgi gruplarıyla iletişim | OOS | — | @@ -52,7 +52,7 @@ | A.5.29 Aksaklık sırasında bilgi güvenliği | FL-helps | `auto_revert` baseline-flip; `model.reverted` olayı | | A.5.30 İş sürekliliği için ICT hazırlığı | OOS | — | | A.5.31 Yasal, kanuni, düzenleyici ve sözleşmesel gerekliliklerin tanımlanması | FL-helps | EU AI Act + GDPR mappings; Annex IV bundle | -| A.5.32 Fikri mülkiyet hakları | FL-helps | SBOM'da lisans çıkarımı; HF model-card metadata | +| A.5.32 Fikri mülkiyet hakları | FL-helps | HF model-card metadata (SBOM lisans verisi taşımaz) | | A.5.33 Kayıtların korunması | FL | Append-only + HMAC + manifest sidecar | | A.5.34 Gizlilik ve PII korunması | FL | `forgelm reverse-pii` Madde 15; `forgelm purge` Madde 17 (ayrıca bkz. A.8.3) | | A.5.35 Bilgi güvenliğinin bağımsız incelenmesi | OOS | — | diff --git a/docs/reference/iso27001_control_mapping.md b/docs/reference/iso27001_control_mapping.md index 5f1885a2..442c0617 100644 --- a/docs/reference/iso27001_control_mapping.md +++ b/docs/reference/iso27001_control_mapping.md @@ -24,7 +24,7 @@ |---|---|---| | A.5.1 Policies for information security | FL-helps | `audit_event_catalog.md` documents what's logged | | A.5.2 Information security roles and responsibilities | FL-helps | `FORGELM_OPERATOR` + `roles_responsibilities.md` | -| A.5.3 Segregation of duties | FL-helps | `human_approval.required/granted` enforces trainer ≠ approver | +| A.5.3 Segregation of duties | FL-helps | `human_approval.required/granted` **records** the approver identity (from `FORGELM_OPERATOR`, else the OS user) so trainer ≠ approver is auditable; ForgeLM does not reject self-approval. Keep the runner and reviewer identities disjoint at your identity provider | | A.5.4 Management responsibilities | FL-helps | `forgelm doctor`; `compliance_report.json`; `training_manifest.yaml` | | A.5.5 Contact with authorities | OOS | — | | A.5.6 Contact with special interest groups | OOS | — | @@ -53,7 +53,7 @@ | A.5.29 Information security during disruption | FL-helps | `auto_revert` baseline-flip; `model.reverted` event | | A.5.30 ICT readiness for business continuity | OOS | — | | A.5.31 Identification of legal, statutory, regulatory and contractual requirements | FL-helps | EU AI Act + GDPR mappings; Annex IV bundle | -| A.5.32 Intellectual property rights | FL-helps | License extraction in SBOM; HF model-card metadata | +| A.5.32 Intellectual property rights | FL-helps | HF model-card metadata (the SBOM carries no licence data) | | A.5.33 Protection of records | FL | Append-only + HMAC + manifest sidecar | | A.5.34 Privacy and protection of PII | FL | `forgelm reverse-pii` Article 15; `forgelm purge` Article 17 (see also A.8.3) | | A.5.35 Independent review of information security | OOS | — | diff --git a/docs/reference/soc2_trust_criteria_mapping-tr.md b/docs/reference/soc2_trust_criteria_mapping-tr.md index 07c43f47..be491d23 100644 --- a/docs/reference/soc2_trust_criteria_mapping-tr.md +++ b/docs/reference/soc2_trust_criteria_mapping-tr.md @@ -26,7 +26,7 @@ kategoriler engagement-bazında scoplanır. | CC | Başlık | ForgeLM kanıtı | |---|---|---| | CC1.1 | Bütünlüğe bağlılık göstergesi | `roles_responsibilities.md` QMS template; AI Officer rolü | -| CC1.2 | Yönetişim bağımsızlığı | Approval gate operator ≠ trainer | +| CC1.2 | Yönetişim bağımsızlığı | Approval gate onaylayıcı kimliğini kaydeder, böylece eğitici ≠ onaylayıcı denetlenebilir; ForgeLM bunu zorlamaz | | CC1.3 | Yapı, raporlama hatları kurma | `roles_responsibilities.md` AI Officer / ML Lead / DPO tanımlar | | CC1.4 | Yetkinliğe bağlılık göstergesi | Yıllık EU AI Act / GDPR eğitimi (operatör politikası) | | CC1.5 | Hesap verebilirliği uygular | `FORGELM_OPERATOR` attribution + audit chain | @@ -57,7 +57,7 @@ kategoriler engagement-bazında scoplanır. | CC7.5 | Düzeltici eylemleri tanımlar, geliştirir | `human_approval.rejected`; `sop_change_management.md` | | CC8.1 | Değişimleri yetkilendirir | `forgelm approve` Madde 14 gate; staging dir | | CC9.1 | Riskleri tanımlar, yönetir | `risk_assessment` config + safety eval; `risk_treatment_plan.md` | -| CC9.2 | Tedarikçi + iş ortağı riskini yönetir | SBOM; `loaded` / `unverified` / `local_path` / `unresolved` olarak derecelendirilen dataset Hub commit SHA'sı; temel-model pin'i (`model.revision` → `model_lineage.base_model_revision`); lisans çıkarımı. `model_lineage.component_revisions` altında **sabitlenen ve kaydedilen:** güvenlik sınıflandırıcısı, LLM judge, GRPO ödül modeli, sentetik teacher. **Kapsanmayan:** merge kaynakları ve `forgelm safety-eval` (`--config` almaz) | +| CC9.2 | Tedarikçi + iş ortağı riskini yönetir | SBOM; `loaded` / `unverified` / `local_path` / `unresolved` olarak derecelendirilen dataset Hub commit SHA'sı; temel-model pin'i (`model.revision` → `model_lineage.base_model_revision`). `model_lineage.component_revisions` altında **sabitlenen ve kaydedilen:** güvenlik sınıflandırıcısı, LLM judge, GRPO ödül modeli, sentetik teacher. **Kapsanmayan:** merge kaynakları ve `forgelm safety-eval` (`--config` almaz) | ## Availability (A1.x) diff --git a/docs/reference/soc2_trust_criteria_mapping.md b/docs/reference/soc2_trust_criteria_mapping.md index 57ce25ed..e2f0d09e 100644 --- a/docs/reference/soc2_trust_criteria_mapping.md +++ b/docs/reference/soc2_trust_criteria_mapping.md @@ -26,7 +26,7 @@ categories are scoped per-engagement. | CC | Title | ForgeLM evidence | |---|---|---| | CC1.1 | Demonstrates commitment to integrity | `roles_responsibilities.md` QMS template; AI Officer role | -| CC1.2 | Independence of governance | Approval gate operator ≠ trainer | +| CC1.2 | Independence of governance | The approval gate records the approver identity, so trainer ≠ approver is auditable; ForgeLM does not enforce it | | CC1.3 | Establishes structures, reporting lines | `roles_responsibilities.md` defines AI Officer / ML Lead / DPO | | CC1.4 | Demonstrates commitment to competence | Annual EU AI Act / GDPR training (deployer policy) | | CC1.5 | Enforces accountability | `FORGELM_OPERATOR` attribution + audit chain | @@ -57,7 +57,7 @@ categories are scoped per-engagement. | CC7.5 | Identifies, develops corrective actions | `human_approval.rejected`; `sop_change_management.md` | | CC8.1 | Authorises changes | `forgelm approve` Article 14 gate; staging dir | | CC9.1 | Identifies, manages risks | `risk_assessment` config + safety eval; `risk_treatment_plan.md` | -| CC9.2 | Manages vendor + business-partner risk | SBOM; dataset Hub commit SHA graded `loaded` / `unverified` / `local_path` / `unresolved`; base-model pin (`model.revision` → `model_lineage.base_model_revision`); license extraction. **Pinned and recorded** under `model_lineage.component_revisions`: safety classifier, LLM judge, GRPO reward model, synthetic teacher. **Not covered:** merge sources, and `forgelm safety-eval` (takes no `--config`) | +| CC9.2 | Manages vendor + business-partner risk | SBOM; dataset Hub commit SHA graded `loaded` / `unverified` / `local_path` / `unresolved`; base-model pin (`model.revision` → `model_lineage.base_model_revision`). **Pinned and recorded** under `model_lineage.component_revisions`: safety classifier, LLM judge, GRPO reward model, synthetic teacher. **Not covered:** merge sources, and `forgelm safety-eval` (takes no `--config`) | ## Availability (A1.x) diff --git a/docs/reference/supply_chain_security-tr.md b/docs/reference/supply_chain_security-tr.md index a81303ae..bcc9d9fa 100644 --- a/docs/reference/supply_chain_security-tr.md +++ b/docs/reference/supply_chain_security-tr.md @@ -39,7 +39,17 @@ içinde çalışır: ``` Cross-OS test matrisinin her (OS × Python-version) hücresi için bir -SBOM. Artefaktlar GitHub release sayfasından indirilebilir. +SBOM. + +SBOM'lar, release tag'i için çalışan `publish.yml` çalıştırmasının **workflow-run artifact**'larıdır. +GitHub Release sayfasına eklenmezler ve GitHub, deponun saklama süresi (90 gün) dolunca run +artifact'larını siler; ihtiyacınız olanı çalıştırma hâlâ duruyorken indirin ve kayıtlarınızla +birlikte arşivleyin. + +Bir SBOM'un listelediği: matris runner'ında paketlenmiş wheel kurulduktan sonraki `pip list` +çıktısı (bağımlılıkları o anda PyPI'dan çözülür, sabitlenmemiştir), Linux'ta `qlora`, `ingestion` +ve `eval` extras'ı ve `pytest` / `pytest-cov`. Bu yüzden runtime kapanışının yanında test araçlarını +da adlandırır, bağımlılık grafiği taşımaz ve **lisans verisi taşımaz**. ### Determinism contract @@ -52,17 +62,21 @@ Wave 4 / Faz 23 bir determinism testi ekler - `tests/test_supply_chain_security.py::TestGenerateSbomDeterministic::test_two_invocations_produce_same_content` CI'da bunu pin'ler. -Bir denetçi karşılık gelen `git tag`'den SBOM'u yeniden emit edip -GitHub release'e ekli artefaktla diff alabilir; trivial olmayan -herhangi bir fark build ortamında dependency-resolution drift'ine -işaret eder. +Determinizm, aynı ortama özgü bir özelliktir. Aynı `git tag`'den sonradan yapılan yeniden +emit'in bir release'in SBOM'uyla eşleşmesi beklenmez; çünkü o release bağımlılıklarını +build edildiği anda PyPI'dan çözdü. **Sizin** dağıttığınızı kaydetmek için, modeli eğiten ya da +sunan ortamda bir ForgeLM checkout'undan `python3 tools/generate_sbom.py` çalıştırın. ### SBOM'u tüketme ```bash -# Bir release için tüm SBOM'ları indir. v'yi CI'da pinlediğiniz -# tag ile değiştirin; SBOM artefakt formatı release'ler arasında stabildir. -gh release download v --pattern 'sbom-*' +# CI'da pinlediğiniz tag için başarılı publish çalıştırmasını bulun (bir tag'in +# daha önce başarısız olmuş bir çalıştırması olabilir), sonra ondan bir SBOM indirin. +# v'yi tag ile değiştirin. Run artifact'ları 90 günde silinir; on ikisi için +# --pattern 'sbom-*' kullanın. +gh run list --repo HodeTech/ForgeLM --workflow publish.yml --branch v --status success \ + --json databaseId,createdAt +gh run download --repo HodeTech/ForgeLM --name sbom-ubuntu-latest-py3.11 # İnsan inceleme için pretty-print. jq . sbom-ubuntu-latest-py3.11.json | less @@ -110,7 +124,7 @@ Wave 4 / Faz 23 nightly workflow'a `pip-audit` ekler. Davranış: Belirli bir CVE'yi kabul etmek için opt-in ignore dosyasıyla dokümante edin (aşağıdaki Suppression'a bakın); yeşil kalmak için UNKNOWN kovasına güvenmeyin. -- OSV / GHSA veritabanlarını kullanır (pip-audit varsayılanı). +- PyPI'ın güvenlik açığı verisini sorgular (pip-audit'in varsayılan `pypi` servisi; nightly `--vulnerability-service` geçmez). Operatörler aynı tooling'i lokalde kurar: diff --git a/docs/reference/supply_chain_security.md b/docs/reference/supply_chain_security.md index e070e770..6aba4546 100644 --- a/docs/reference/supply_chain_security.md +++ b/docs/reference/supply_chain_security.md @@ -39,7 +39,16 @@ publish workflow: ``` One SBOM per (OS × Python-version) cell of the cross-OS test matrix. -The artefacts are downloadable from the GitHub release page. + +The SBOMs are **workflow-run artifacts** of the `publish.yml` run for the release tag. They are +not attached to the GitHub Release page, and GitHub deletes run artifacts when the repository's +retention period ends (90 days), so download what you need while the run is still available and +archive it with your records. + +What an SBOM lists: the output of `pip list` on the matrix runner after it installed the packaged +wheel (its dependencies resolve from PyPI at that moment, unpinned), on Linux the `qlora`, +`ingestion` and `eval` extras, and `pytest` / `pytest-cov`. It therefore names test tooling +beside the runtime closure, carries no dependency graph, and carries **no licence data**. ### Determinism contract @@ -52,17 +61,20 @@ Wave 4 / Faz 23 adds a determinism test (`tests/test_supply_chain_security.py`): - `tests/test_supply_chain_security.py::TestGenerateSbomDeterministic::test_two_invocations_produce_same_content` pins this in CI. -An auditor can re-emit the SBOM from the corresponding `git tag` -and diff against the artefact attached to the GitHub release; any -non-trivial difference indicates dependency-resolution drift in the -build environment. +Determinism is a same-environment property. A later re-emission from the same `git tag` is not +expected to match a release's SBOM, because that release resolved its dependencies from PyPI when +it was built. To record what **you** deploy, run `python3 tools/generate_sbom.py` from a ForgeLM +checkout in the environment that trains or serves the model. ### Consuming the SBOM ```bash -# Download all SBOMs for a release. Replace v with the tag you -# pinned in your CI; the SBOM artefact format is stable across releases. -gh release download v --pattern 'sbom-*' +# Find the successful publish run for the tag you pinned in your CI (a tag can have an +# earlier failed run), then download one SBOM from it. Replace v with the tag. +# Run artifacts expire after 90 days; use --pattern 'sbom-*' for all twelve. +gh run list --repo HodeTech/ForgeLM --workflow publish.yml --branch v --status success \ + --json databaseId,createdAt +gh run download --repo HodeTech/ForgeLM --name sbom-ubuntu-latest-py3.11 # Pretty-print for human review. jq . sbom-ubuntu-latest-py3.11.json | less @@ -108,7 +120,7 @@ Wave 4 / Faz 23 adds `pip-audit` to the nightly workflow. Behaviour: To accept a specific CVE, document it via the opt-in ignore file (see Suppression below); do not rely on the UNKNOWN bucket to stay green. -- Uses the OSV / GHSA databases (pip-audit's default). +- Queries PyPI's vulnerability data (pip-audit's default `pypi` service; the nightly does not pass `--vulnerability-service`). Operators install the same tooling locally: diff --git a/docs/standards/error-handling.md b/docs/standards/error-handling.md index 1a8860f5..97a645b6 100644 --- a/docs/standards/error-handling.md +++ b/docs/standards/error-handling.md @@ -19,7 +19,7 @@ EXIT_INTEGRITY_FAILURE = 6 | Code | When | Who reads it | |---|---|---| -| **0** | Training completed. With `auto_revert: true` (the compliance default for high-risk tiers) this also means every gate passed; with the **shipped default** `auto_revert: false` a failed benchmark/safety/judge gate is *recorded* (`benchmark`/`safety`/`judge` block in the JSON, `*_passed: false`) but does **not** change the exit code — parse those blocks, don't trust exit 0 alone | CI/CD success | +| **0** | Training completed. With `auto_revert: true` (the compliance default for high-risk tiers) this also means every gate that ran to a verdict passed (a safety evaluation that produced no verdict — `safety.evaluation_completed: false` — keeps the model and exits 0 regardless of `auto_revert`); with the **shipped default** `auto_revert: false` a failed benchmark/safety/judge gate is *recorded* (`benchmark`/`safety`/`judge` block in the JSON, `*_passed: false`) but does **not** change the exit code — parse those blocks, don't trust exit 0 alone | CI/CD success | | **1** | Config validation failed (YAML schema, Pydantic error). Also used by the `verify-*` subcommands for an operator-actionable input error — the artefact could not be read at all, so nothing was ever compared (plus the one case where everything comparable *was* compared and came out clean; see the 1-vs-6 note below) | CI/CD "fail fast"; user fixes YAML or the verifier's target path | | **2** | Training crashed or failed mid-run (OOM, CUDA error, unhandled exception). Also the `verify-*` subcommands' code for a genuine runtime I/O failure on a reachable path (permission denied mid-read, disk error) | CI/CD retry logic | | **3** | Training completed but eval/safety/benchmark threshold failed, and auto-revert happened | CI/CD decision: do not deploy | diff --git a/docs/usermanuals/en/compliance/audit-log.md b/docs/usermanuals/en/compliance/audit-log.md index faddaaa7..09125004 100644 --- a/docs/usermanuals/en/compliance/audit-log.md +++ b/docs/usermanuals/en/compliance/audit-log.md @@ -5,7 +5,7 @@ description: Append-only event log over training, evaluation, and revert decisio # Audit Log -EU AI Act Article 12 requires high-risk AI systems to maintain logs of operationally relevant events. ForgeLM's `audit_log.jsonl` is an append-only, SHA-256-anchored sequence of events covering training start, evaluation gates, auto-revert decisions, and model export. +EU AI Act Article 12 requires high-risk AI systems to maintain logs of operationally relevant events. ForgeLM's `audit_log.jsonl` is an append-only, SHA-256-anchored sequence of events covering training start, evaluation gates, auto-revert decisions, and model export. It records the training pipeline, which is development-time evidence that can support your technical documentation; the logging Article 12 asks for is a capability of the deployed system, which ForgeLM does not provide. ## Format diff --git a/docs/usermanuals/en/compliance/gdpr.md b/docs/usermanuals/en/compliance/gdpr.md index d8783dbe..fa2f8e6d 100644 --- a/docs/usermanuals/en/compliance/gdpr.md +++ b/docs/usermanuals/en/compliance/gdpr.md @@ -5,7 +5,7 @@ description: Data protection compliance — PII minimisation, data subject right # GDPR / KVKK -GDPR (Europe) and KVKK (Türkiye) impose data protection requirements on personal data used in training. ForgeLM's role: prevent personal data from entering training in the first place, document what gets ingested, and produce evidence for data subject requests. +GDPR (Europe) and KVKK (Türkiye) impose data protection requirements on personal data used in training. ForgeLM's role is narrower than keeping personal data out of training: it masks the identifier formats it can detect, reports what an audit found, and gives you commands for access and erasure requests. It does not decide your lawful basis, it does not find names or other free-text personal data, and it does not make a trained model anonymous. ## What GDPR / KVKK require for training data @@ -25,40 +25,35 @@ KVKK (Türkiye) mirrors these principles closely. ### Data minimisation (Art. 5(1)(c)) -PII masking at ingest replaces personal identifiers with placeholders: +PII masking at ingest replaces the identifier formats ForgeLM detects with a placeholder: -```yaml -ingestion: - pii_mask: - enabled: true - locale: "tr" - categories: ["email", "phone", "iban", "id_tr"] +```shell +$ forgelm ingest ./policies/ --recursive --strategy markdown --pii-mask --output data/policies.jsonl ``` -By the time data lands in JSONL, identifiable subjects are removed. See [PII Masking](#/data/pii-masking). +The detectors cover email, phone, credit card, IBAN, and the Turkish, German, French and US national-ID formats; every match becomes `[REDACTED]`. **Names, addresses, dates of birth, health data and other free text are not detected**, and the patterns are tuned to miss a borderline match rather than redact ordinary prose. Masking reduces the personal data in the JSONL; it does not remove identifiable subjects from it. See [PII Masking](#/data/pii-masking). ### Accountability (Art. 5(2)) -Every audit produces `data_audit_report.json` documenting: +Every `forgelm audit` run writes `data_audit_report.json`. It records: -- Detected PII categories and counts (before masking). -- Source attribution (which document each row came from). -- Quality and language distribution. -- SHA-256 manifest for tamper-evidence. +- Detected PII and secret categories with their counts, for the data you audited. Audit the unmasked source to see what a masker has to catch; audit the masked output to see what got through. +- Near-duplicate, quality and cross-split-overlap summaries, and an optional Croissant card. +- The audit's own metadata: when it ran, and the path and literal input it was given. -These reports flow into the Annex IV bundle. When a regulator asks "what personal data was in your training set?", you have a structured answer. +The report does not attribute rows to source documents, carries no hash manifest, and is a plain JSON file: it is not itself written to the audit log. Erasure and access requests (`forgelm purge`, `forgelm reverse-pii`) are, in the hash-chained log that `forgelm verify-audit` checks. When the report sits in `training.output_dir`, it feeds the Article 10 data-governance section of the Annex IV bundle, so a regulator's "what personal data was in your training set?" has a structured answer: what the detectors found, not a statement that none exists. ### Storage limitation (Art. 5(1)(e)) -ForgeLM doesn't retain raw user data — it produces JSONL artifacts you control. For automated retention enforcement: +ForgeLM doesn't retain raw user data — it produces JSONL artifacts you control. Retention horizons can be declared and are **reported, not enforced**: ```yaml retention: - raw_documents_retention_days: 90 # auto-delete originals after N days + raw_documents_retention_days: 90 ephemeral_artefact_retention_days: 365 ``` -(The actual deletion is your storage layer's responsibility; ForgeLM just records the intended TTL in the audit log.) +`forgelm purge --check-policy --config config.yaml` lists artefacts that are past their horizon and always exits 0. Nothing is deleted automatically and nothing is written to the audit log for it; deleting what is overdue is your storage layer's job. (`retention.enforce` is reserved: no command acts on it yet.) ## Data subject requests @@ -68,30 +63,29 @@ Most-common request types and how ForgeLM helps: "What personal data do you hold about me?" -Run reverse-PII on your training data: +Search your training data for the person's identifier: ```shell $ forgelm reverse-pii --query "ali@example.com" data/*.jsonl -No matches found in masked data. ``` -Because PII was masked at ingest, no specific person's data is recoverable from the model. The audit report confirms this. +The scan reports the lines where the identifier appears; zero matches is a valid answer. It finds what is literally in the files you point it at. Masking only removes the identifier formats it detects, so a name or an undetected variant can remain, and the raw source documents are not covered by a scan of the masked JSONL: search those separately. ForgeLM cannot tell you what a trained model remembers. ### Right to erasure (Art. 17) "Delete my data." If a person's data was in your training set: -1. The masked JSONL doesn't contain their identifying info — already minimised. -2. Source documents may still — drop them from your raw store and re-ingest if necessary. +1. Find the rows with `forgelm reverse-pii`, then remove them with `forgelm purge --row-id --corpus `; every erasure is written to the audit log. +2. Source documents may still hold it — drop them from your raw store and re-ingest if necessary. 3. The model may have memorised some details — see "model-level erasure" below. ### Model-level erasure LLMs can memorise rare strings from training. Even with PII masking, removing all traces from a deployed model is hard. ForgeLM's defences: -- **Prevent memorisation:** PII masking, deduplication (memorised data is usually duplicated data). -- **Detect memorisation:** the audit step flags rows that overlap with known PII patterns. +- **Reduce what goes in:** PII masking and deduplication (memorised data is usually duplicated data). +- **Memorisation is not measured:** ForgeLM does not test whether a trained model reproduces a given string. - **Re-train as last resort:** if a specific subject's data leaked despite masking, re-train without that source. For zero-tolerance scenarios (medical, legal), pair PII masking with manual review before training. @@ -122,7 +116,7 @@ ForgeLM has no YAML surface for GDPR legal metadata (lawful basis, data controll ::: :::warn -**International transfers.** If your training data crosses jurisdiction boundaries (Turkish data trained in EU, EU data trained in US), additional safeguards apply. Set `international_transfers.enabled: true` and document the safeguards. +**International transfers.** If your training data crosses jurisdiction boundaries (Turkish data trained in EU, EU data trained in US), additional safeguards apply. ForgeLM has no setting for transfers; record the safeguards in your DPIA. ::: :::tip diff --git a/docs/usermanuals/en/compliance/human-oversight.md b/docs/usermanuals/en/compliance/human-oversight.md index 61e05a72..48fa2f2a 100644 --- a/docs/usermanuals/en/compliance/human-oversight.md +++ b/docs/usermanuals/en/compliance/human-oversight.md @@ -5,7 +5,7 @@ description: Block model promotion until a human reviews and signs off — Artic # Human Oversight -EU AI Act Article 14 requires high-risk AI systems to provide for human oversight. ForgeLM implements this as an optional config gate: when `evaluation.require_human_approval: true`, model promotion blocks until a human signs an approval. +EU AI Act Article 14 requires high-risk AI systems to provide for human oversight. ForgeLM offers an optional pre-promotion approval gate (`evaluation.require_human_approval: true`) that blocks model promotion until a human signs an approval and records that sign-off. This supports design-time oversight documentation; it does not implement the in-use oversight measures Article 14 requires of the deployed system (monitoring, interpreting, overriding or stopping it), which remain the deployer's. ## How the gate works diff --git a/docs/usermanuals/en/operations/iso-soc2-deployer.md b/docs/usermanuals/en/operations/iso-soc2-deployer.md index 862c2748..d53546d6 100644 --- a/docs/usermanuals/en/operations/iso-soc2-deployer.md +++ b/docs/usermanuals/en/operations/iso-soc2-deployer.md @@ -14,16 +14,16 @@ Four pillars an ISO / SOC 2 auditor cares about most have direct ForgeLM evidenc 1. **Audit trail** — `audit_log.jsonl` per training run, append-only with HMAC + SHA-256 hash chain + genesis manifest sidecar. `forgelm verify-audit` validates the chain end-to-end. 2. **Change control** — Article 14 staging gate (`forgelm approve` / `reject`) + `human_approval.required/granted/rejected` audit events + `config_hash` (per-run manifest sidecar field) stamped per run. 3. **Data lineage** — `data_provenance.json` (SHA-256 fingerprint + size + mtime, plus the dataset's HF Hub commit SHA **graded by `hf_revision_source`**) + `data_governance_report.json` (collection_method, annotation_process, known_biases, personal_data_included, dpia_completed). Read the grade before the SHA: only `hf_revision_source: loaded` is evidence of the corpus that trained the model. -4. **Supply chain** — CycloneDX 1.5 SBOM emitted per release, `pip-audit` nightly, `bandit` CI for static + dynamic security scanning. +4. **Supply chain** — CycloneDX 1.5 SBOM emitted per release (a workflow-run artifact kept 90 days, not a GitHub release asset), `pip-audit` nightly, `bandit` CI for static + dynamic security scanning. ## The eight audit-floor questions The deep guide answers each with the exact `jq` / CLI command + the artefact it returns: 1. "Show me the audit trail for every model promotion in the past 90 days" → `forgelm verify-audit` + `jq 'select(.event == "human_approval.granted")'`. -2. "Show me the change-control evidence — who approved this model?" → cross-reference `training.started` + `human_approval.granted` events; two distinct operator IDs prove segregation of duties (ISO A.5.3, SOC 2 CC1.5). +2. "Show me the change-control evidence — who approved this model?" → cross-reference `training.started` + `human_approval.granted` events; compare the two identities; they are self-asserted (`FORGELM_OPERATOR`, else the OS user), so segregation of duties (ISO A.5.3, SOC 2 CC1.5) holds only if your identity provider makes them different people. 3. "Show me the data lineage" → `data_provenance.json`; `sha256` + `hf_revision` pin the corpus — but only when `hf_revision_source` reads `loaded`. `unverified` means the SHA is a Hub lookup made when the bundle was written, with no coupling to the load; `unresolved` means no SHA was obtained and none is claimed. -4. "Show me the supply chain" → `gh release download "$(gh release view --json tagName -q .tagName)" --pattern 'sbom-*'`; CycloneDX 1.5 JSON. +4. "Show me the supply chain" → `gh run list --repo HodeTech/ForgeLM --workflow publish.yml --branch v --status success`, then `gh run download --repo HodeTech/ForgeLM --pattern 'sbom-*'` within 90 days; CycloneDX 1.5 JSON (the CI runner's package list, test tooling included, no licence data). 5. "Show me the access controls" → IdP audit log + `FORGELM_OPERATOR` cross-reference. 6. "Show me the encryption posture" → deployer-side substrate (KMS audit log + `data_governance_report.json`). 7. "Show me the incident response" → `audit.classifier_load_failed` + F-compliance-110 strict gate. diff --git a/docs/usermanuals/en/operations/supply-chain.md b/docs/usermanuals/en/operations/supply-chain.md index 7ec468ae..47c50c00 100644 --- a/docs/usermanuals/en/operations/supply-chain.md +++ b/docs/usermanuals/en/operations/supply-chain.md @@ -5,21 +5,24 @@ description: Operator surface for ForgeLM's SBOM + pip-audit + bandit pipeline # Supply Chain -ForgeLM emits a CycloneDX 1.5 SBOM per release tag, and runs `pip-audit` + `bandit` nightly via the `nightly.yml` workflow (also re-run on every release-tag publish). This page is the operator's mental model: what runs when, where to get the artefacts, and how to mirror the same checks locally. +ForgeLM emits a CycloneDX 1.5 SBOM per release tag (as a workflow-run artifact, not a GitHub release asset), and runs `pip-audit` + `bandit` nightly via the `nightly.yml` workflow (also re-run on every release-tag publish). This page is the operator's mental model: what runs when, where to get the artefacts, and how to mirror the same checks locally. ## What runs when | Trigger | Tool | Result | Failure policy | |---|---|---|---| -| Release tag (`v*`) | `tools/generate_sbom.py` | One CycloneDX 1.5 JSON per (OS × Python-version) cell, attached to the GitHub release | SBOM step is pure-stdlib; cannot silently degrade a green release matrix | -| Nightly 03:00 UTC | `pip-audit` (via `tools/check_pip_audit.py`) | OSV / GHSA scan against installed deps | HIGH/CRITICAL → exit 1 + GitHub issue; MEDIUM → `::warning::`; LOW → silent | +| Release tag (`v*`) | `tools/generate_sbom.py` | One CycloneDX 1.5 JSON per (OS × Python-version) cell, uploaded as a workflow-run artifact of the tag's publish run (kept 90 days; not attached to the GitHub release) | SBOM step is pure-stdlib; cannot silently degrade a green release matrix | +| Nightly 03:00 UTC | `pip-audit` (via `tools/check_pip_audit.py`) | PyPI vulnerability-data scan against installed deps | HIGH/CRITICAL or UNKNOWN severity → exit 1 + GitHub issue; MEDIUM → `::warning::`; LOW → silent | | Nightly 03:00 UTC + release tag | `bandit` (via `tools/check_bandit.py`) | Static security scan of `forgelm/` (excludes `tests/`) | HIGH → exit 1; MEDIUM → `::warning::`; LOW → silent | ## Where to get the SBOM ```bash -# All SBOMs for a release. -gh release download "$(gh release view --json tagName -q .tagName)" --pattern 'sbom-*' +# Find the successful publish run for a tag, then download its SBOMs +# (one directory per artifact). Run artifacts expire after 90 days. +gh run list --repo HodeTech/ForgeLM --workflow publish.yml --branch v --status success \ + --json databaseId,createdAt +gh run download --repo HodeTech/ForgeLM --pattern 'sbom-*' # Pretty-print one. jq . sbom-ubuntu-latest-py3.11.json | less @@ -34,7 +37,7 @@ curl -X POST -H "X-Api-Key: $DT_KEY" -H "Content-Type: application/octet-stream" https://deptrack.example.com/api/v1/bom ``` -The SBOM is determinism-pinned — two consecutive emissions on the same Python environment produce content-identical JSON (modulo `serialNumber` and `metadata.timestamp`, both intentionally varying per CycloneDX semantics). +The SBOM is determinism-pinned — two consecutive emissions on the same Python environment produce content-identical JSON (modulo `serialNumber` and `metadata.timestamp`, both intentionally varying per CycloneDX semantics). That is a same-environment property: a release SBOM is the CI runner's `pip list` (test tooling such as `pytest` included, no dependency graph, no licence data), so re-emitting it later from the same tag will not reproduce it. To describe your own environment, run `python3 tools/generate_sbom.py` from a ForgeLM checkout there. ## Mirror the nightly check locally @@ -46,7 +49,7 @@ pip-audit --strict --format json --output /tmp/pip-audit.json python3 tools/check_pip_audit.py /tmp/pip-audit.json ``` -Exit 0 means the same severity policy ForgeLM CI applies passed. Exit 1 means a HIGH/CRITICAL vulnerability needs addressing before the nightly fires. +Exit 0 means the same severity policy ForgeLM CI applies passed. Exit 1 means a HIGH/CRITICAL vulnerability, or a finding whose severity pip-audit does not report (UNKNOWN, which is most of them), needs addressing before the nightly fires. ## Mirror the bandit check locally diff --git a/docs/usermanuals/en/reference/exit-codes.md b/docs/usermanuals/en/reference/exit-codes.md index 8780f19e..e462872d 100644 --- a/docs/usermanuals/en/reference/exit-codes.md +++ b/docs/usermanuals/en/reference/exit-codes.md @@ -11,7 +11,7 @@ ForgeLM's exit codes are a public contract. CI/CD pipelines, schedulers, and das | Exit | Constant | Meaning | Typical CI action | |---|---|---|---| -| **0** | `EXIT_SUCCESS` | Run completed and the checkpoint was promoted. With `evaluation.auto_revert: true` every gate also passed; with the shipped default `auto_revert: false` a failed benchmark/safety/judge gate is **recorded in the JSON output but does not change the exit code** — see ["What exit 0 actually guarantees"](#what-exit-0-actually-guarantees) below. | Continue pipeline (parse gate blocks if `auto_revert` is off) | +| **0** | `EXIT_SUCCESS` | Run completed and the checkpoint was promoted. With `evaluation.auto_revert: true` every gate that produced a verdict also passed (a safety evaluation with no verdict keeps the model and exits 0 too); with the shipped default `auto_revert: false` a failed benchmark/safety/judge gate is **recorded in the JSON output but does not change the exit code** — see ["What exit 0 actually guarantees"](#what-exit-0-actually-guarantees) below. | Continue pipeline (parse gate blocks if `auto_revert` is off) | | **1** | `EXIT_CONFIG_ERROR` | YAML invalid, file missing, env var unset, or argument malformed. | Fail fast | | **2** | `EXIT_TRAINING_ERROR` | Training-time runtime error (any unhandled exception that isn't a config or eval-gate failure: data load, OOM, NaN loss, I/O failure, mid-stream audit-iteration OSError). | Investigate; surface logs | | **3** | `EXIT_EVAL_FAILURE` | A benchmark/safety/judge gate failed **and** the model was auto-reverted (requires `evaluation.auto_revert: true`). With `auto_revert: false` a failed gate does not produce exit 3 — the run exits 0 with the failure recorded in the JSON gate blocks. | Investigate; do NOT promote | @@ -112,7 +112,7 @@ A run that exits 0 has: **Gates and exit 0.** Whether a *passed* benchmark/safety/judge gate is part of the exit-0 guarantee depends on `evaluation.auto_revert`: -- With `evaluation.auto_revert: true` (the EU AI Act high-risk default), a failed gate auto-reverts the model and exits **3** — so exit 0 *does* mean every configured gate passed. +- With `evaluation.auto_revert: true` (the EU AI Act high-risk default), a failed gate auto-reverts the model and exits **3** — so exit 0 means every configured gate that produced a verdict passed. **One exception:** a safety evaluation that produced no verdict (`safety.evaluation_completed: false` — the classifier failed to load, the probes file is missing or empty, or most verdicts were unreadable) keeps the model and exits 0 (4 with the approval gate) even with `auto_revert: true`; check `safety.passed` and `safety.evaluation_completed` in the JSON output. - With the shipped default `evaluation.auto_revert: false`, a failed gate is **recorded** (the `benchmark` / `safety` / `judge` block in the JSON output carries `*_passed: false`) but the model is still promoted and the run exits **0**. Read those JSON blocks; do not infer gate success from exit 0 alone. There is no "partial success" exit code by design — turn on `auto_revert` if you want a failing gate to change the exit code. diff --git a/docs/usermanuals/en/reference/json-output.md b/docs/usermanuals/en/reference/json-output.md index 7132bc10..c0ebbabe 100644 --- a/docs/usermanuals/en/reference/json-output.md +++ b/docs/usermanuals/en/reference/json-output.md @@ -178,7 +178,7 @@ When training runs to completion the pipeline emits a result envelope on **stdou | Key | Type | Notes | |---|---|---| -| `success` | bool | `true` when the run completed (including a staged, awaiting-approval run). `false` when a gate auto-reverted the model. | +| `success` | bool | `true` when the run completed (including a staged, awaiting-approval run, and a run whose safety evaluation produced no verdict: check `safety.evaluation_completed`). `false` when a gate auto-reverted the model. | | `error` | string | Present **iff** `success` is `false`, never on the success path. Carries the gate's own reason — which gate fired and against what threshold — because every gate exits `3`, so the exit code alone cannot tell them apart. If a failure reaches the envelope with no reason recorded, the field says so explicitly and points at `audit_log.jsonl` rather than being omitted. | | `metrics` | object | Training/eval/gate metrics (e.g. `eval_loss`, `benchmark/average`, `safety/safe_ratio`). Values are numbers, **except** a measurement that came out non-finite, which is written as the string `"nan"` / `"inf"` / `"-inf"` — JSON has no non-finite number literal, so the alternative was output no strict parser accepts. Type these fields as number-or-string. | | `final_model_path` | str | Where the model artefacts live. For an awaiting-approval run this is the **staging** directory until `forgelm approve` promotes it. | diff --git a/docs/usermanuals/tr/compliance/audit-log.md b/docs/usermanuals/tr/compliance/audit-log.md index 1c435f7e..8f262f99 100644 --- a/docs/usermanuals/tr/compliance/audit-log.md +++ b/docs/usermanuals/tr/compliance/audit-log.md @@ -5,7 +5,7 @@ description: Eğitim, değerlendirme ve geri alma kararlarını append-only even # Audit Log -EU AI Act Madde 12, yüksek-riskli AI sistemlerinin operasyonel olarak ilgili olayların log'unu tutmasını gerektirir. ForgeLM'in `audit_log.jsonl` dosyası; eğitim başlangıcı, eval kapıları, otomatik geri alma kararları ve model export'unu kapsayan, append-only ve SHA-256-anchored bir olay dizisidir. +EU AI Act Madde 12, yüksek-riskli AI sistemlerinin operasyonel olarak ilgili olayların log'unu tutmasını gerektirir. ForgeLM'in `audit_log.jsonl` dosyası; eğitim başlangıcı, eval kapıları, otomatik geri alma kararları ve model export'unu kapsayan, append-only ve SHA-256-anchored bir olay dizisidir. Eğitim hattını kaydeder; bu, teknik dokümantasyonunuzu destekleyebilecek geliştirme-zamanı kanıtıdır. Madde 12'nin istediği loglama dağıtılmış sistemin bir yeteneğidir ve ForgeLM bunu sağlamaz. ## Format diff --git a/docs/usermanuals/tr/compliance/gdpr.md b/docs/usermanuals/tr/compliance/gdpr.md index d8f425a3..21c8f61b 100644 --- a/docs/usermanuals/tr/compliance/gdpr.md +++ b/docs/usermanuals/tr/compliance/gdpr.md @@ -5,7 +5,7 @@ description: Veri koruma uyumluluğu — PII minimizasyonu, veri sahibi hakları # GDPR / KVKK -GDPR (Avrupa) ve KVKK (Türkiye), eğitimde kullanılan kişisel verilere koruma gereklilikleri getirir. ForgeLM'in rolü: kişisel verinin eğitime girmesini en başta engellemek, ne girdiğini belgelemek ve veri sahibi talepleri için kanıt üretmek. +GDPR (Avrupa) ve KVKK (Türkiye), eğitimde kullanılan kişisel verilere koruma gereklilikleri getirir. ForgeLM'in rolü, kişisel veriyi eğitimden uzak tutmaktan daha dardır: tespit edebildiği tanımlayıcı biçimlerini maskeler, bir audit'in bulduğunu raporlar ve erişim ile silme talepleri için size komutlar verir. Hukuki dayanağınızı belirlemez, isimleri ya da diğer serbest-metin kişisel verileri bulmaz ve eğitilmiş bir modeli anonim yapmaz. ## GDPR / KVKK eğitim verisinde ne ister @@ -25,40 +25,35 @@ KVKK (Türkiye) bu ilkeleri yakından yansıtır. ### Veri minimizasyonu (Md. 5(1)(c)) -Ingest'te PII maskeleme kişisel tanımlayıcıları placeholder'larla değiştirir: +Ingest'te PII maskeleme, ForgeLM'in tespit ettiği tanımlayıcı biçimlerini bir placeholder ile değiştirir: -```yaml -ingestion: - pii_mask: - enabled: true - locale: "tr" - categories: ["email", "phone", "iban", "id_tr"] +```shell +$ forgelm ingest ./policies/ --recursive --strategy markdown --pii-mask --output data/policies.jsonl ``` -Veri JSONL'a düştüğünde tanımlanabilir özneler kaldırılmıştır. Bkz. [PII Maskeleme](#/data/pii-masking). +Dedektörler e-posta, telefon, kredi kartı, IBAN ile Türk, Alman, Fransız ve ABD ulusal kimlik biçimlerini kapsar; her eşleşme `[REDACTED]` olur. **İsimler, adresler, doğum tarihleri, sağlık verisi ve diğer serbest metin tespit edilmez**; desenler sıradan düzyazıyı maskelemek yerine sınırda bir eşleşmeyi kaçırmaya ayarlıdır. Maskeleme JSONL'daki kişisel veriyi azaltır; tanımlanabilir özneleri ondan kaldırmaz. Bkz. [PII Maskeleme](#/data/pii-masking). ### Hesap verebilirlik (Md. 5(2)) -Her audit aşağıdakileri belgeleyen `data_audit_report.json` üretir: +Her `forgelm audit` çalıştırması `data_audit_report.json` yazar. İçeriği: -- Tespit edilen PII kategorileri ve sayıları (maskelemeden önce). -- Kaynak atfı (her satırın hangi dokümandan geldiği). -- Kalite ve dil dağılımı. -- Tamper-evidence için SHA-256 manifest. +- Denetlediğiniz veri için tespit edilen PII ve gizli bilgi kategorileri ve sayıları. Bir maskelemenin neyi yakalaması gerektiğini görmek için maskelenmemiş kaynağı, neyin sızdığını görmek için maskelenmiş çıktıyı denetleyin. +- Near-duplicate, kalite ve split-arası örtüşme özetleri ile isteğe bağlı bir Croissant kartı. +- Audit'in kendi üst verisi: ne zaman çalıştığı, ona verilen yol ve girdi. -Bu raporlar Annex IV paketine akar. Regülatör "eğitim setinizde hangi kişisel veriler vardı?" diye sorduğunda yapılandırılmış cevabınız olur. +Rapor satırları kaynak dokümanlara atfetmez, hash manifest taşımaz ve düz bir JSON dosyasıdır: kendisi audit log'a yazılmaz. Silme ve erişim talepleri (`forgelm purge`, `forgelm reverse-pii`) ise `forgelm verify-audit`'in denetlediği hash-zincirli log'a yazılır. Rapor `training.output_dir` içindeyse Annex IV paketinin Madde 10 veri yönetişimi bölümünü besler; böylece regülatörün "eğitim setinizde hangi kişisel veriler vardı?" sorusunun yapılandırılmış bir cevabı olur: dedektörlerin bulduğu, hiç olmadığına dair bir beyan değil. ### Saklama sınırlaması (Md. 5(1)(e)) -ForgeLM ham kullanıcı verisini saklamaz — sizin kontrol ettiğiniz JSONL artifact'lar üretir. Otomatik saklama uygulanması için: +ForgeLM ham kullanıcı verisini saklamaz — sizin kontrol ettiğiniz JSONL artifact'lar üretir. Saklama ufukları tanımlanabilir ve **raporlanır, zorlanmaz**: ```yaml retention: - raw_documents_retention_days: 90 # N gün sonra orijinalleri otomatik sil + raw_documents_retention_days: 90 ephemeral_artefact_retention_days: 365 ``` -(Asıl silme depolama katmanınızın sorumluluğu; ForgeLM sadece amaçlanan TTL'yi audit log'a kaydeder.) +`forgelm purge --check-policy --config config.yaml` ufku aşmış artefaktları listeler ve her zaman 0 ile çıkar. Hiçbir şey otomatik silinmez ve bunun için audit log'a bir şey yazılmaz; süresi geçeni silmek depolama katmanınızın işidir. (`retention.enforce` ayrılmıştır: henüz hiçbir komut onu kullanmaz.) ## Veri sahibi talepleri @@ -68,21 +63,20 @@ En sık talep tipleri ve ForgeLM nasıl yardım eder: "Hakkımda hangi kişisel verileri tutuyorsunuz?" -Eğitim verinizde reverse-PII koşturun: +Kişinin tanımlayıcısını eğitim verinizde arayın: ```shell $ forgelm reverse-pii --query "ali@example.com" data/*.jsonl -Maskelenmiş veride eşleşme bulunamadı. ``` -PII ingest'te maskelendiği için modelden belirli birinin verisi geri çıkarılamaz. Audit raporu bunu teyit eder. +Tarama, tanımlayıcının geçtiği satırları raporlar; sıfır eşleşme geçerli bir cevaptır. Yalnızca işaret ettiğiniz dosyalarda gerçekten bulunanı bulur. Maskeleme yalnızca tespit ettiği tanımlayıcı biçimlerini kaldırır; bir isim ya da tespit edilemeyen bir varyant kalabilir ve maskelenmiş JSONL taraması ham kaynak dokümanları kapsamaz: onları ayrıca arayın. ForgeLM eğitilmiş bir modelin neyi hatırladığını söyleyemez. ### Silme hakkı (Md. 17) "Verilerimi silin." Bir kişinin verisi eğitim setinizdeydi: -1. Maskelenmiş JSONL kimlik bilgilerini içermiyor — zaten minimize edilmiş. +1. Satırları `forgelm reverse-pii` ile bulun, sonra `forgelm purge --row-id --corpus ` ile kaldırın; her silme audit log'a yazılır. 2. Ham kaynak dokümanlar hâlâ içerebilir — ham deponuzdan düşürün ve gerekirse yeniden ingest edin. 3. Model bazı detayları ezberlemiş olabilir — aşağıdaki "model-seviyesi silme"ye bakın. @@ -90,8 +84,8 @@ Bir kişinin verisi eğitim setinizdeydi: LLM'ler eğitimden nadir string'leri ezberleyebilir. PII maskelemeyle bile deploy edilmiş bir modelden tüm izleri kaldırmak zordur. ForgeLM'in savunmaları: -- **Ezberi önle:** PII maskeleme, deduplikasyon (ezberlenen veri genelde tekrarlanan veridir). -- **Ezberi tespit et:** Audit aşaması bilinen PII pattern'leriyle örtüşen satırları flagler. +- **Girenleri azalt:** PII maskeleme ve deduplikasyon (ezberlenen veri genelde tekrarlanan veridir). +- **Ezber ölçülmez:** ForgeLM, eğitilmiş bir modelin belirli bir string'i üretip üretmediğini test etmez. - **Son çare yeniden eğitim:** Maskelemeye rağmen belirli bir öznenin verisi sızdıysa, o kaynak olmadan yeniden eğitin. Sıfır-tolerans senaryolarda (sağlık, hukuk) PII maskelemeyi eğitimden önce manuel inceleme ile birleştirin. @@ -122,7 +116,7 @@ ForgeLM'in GDPR hukuki meta verisi (hukuki dayanak, veri sorumlusu vb.) için YA ::: :::warn -**Uluslararası transferler.** Eğitim veriniz yargı sınırlarını aşıyorsa (Türk verisi AB'de eğitiliyor, AB verisi ABD'de eğitiliyor), ek koruma önlemleri uygulanır. `international_transfers.enabled: true` ayarlayın ve koruma önlemlerini belgeleyin. +**Uluslararası transferler.** Eğitim veriniz yargı sınırlarını aşıyorsa (Türk verisi AB'de eğitiliyor, AB verisi ABD'de eğitiliyor), ek koruma önlemleri uygulanır. ForgeLM'in transferler için bir ayarı yoktur; koruma önlemlerini DPIA'nıza kaydedin. ::: :::tip diff --git a/docs/usermanuals/tr/compliance/human-oversight.md b/docs/usermanuals/tr/compliance/human-oversight.md index 4761258d..98bbbe15 100644 --- a/docs/usermanuals/tr/compliance/human-oversight.md +++ b/docs/usermanuals/tr/compliance/human-oversight.md @@ -5,7 +5,7 @@ description: Bir insan inceleyip imzalayana kadar model terfisini engelleyin — # İnsan Gözetimi -EU AI Act Madde 14, yüksek-riskli AI sistemlerinin insan gözetimi imkânı sağlamasını gerektirir. ForgeLM bunu opsiyonel bir config kapısı olarak uygular: `evaluation.require_human_approval: true` olduğunda model terfisi bir insan onay imzalayana kadar engellenir. +EU AI Act Madde 14, yüksek-riskli AI sistemlerinin insan gözetimi imkânı sağlamasını gerektirir. ForgeLM, `evaluation.require_human_approval: true` ile açılan opsiyonel bir terfi-öncesi onay kapısı sunar: model terfisi bir insan onay imzalayana kadar engellenir ve bu imza kaydedilir. Bu, tasarım-zamanı gözetim dokümantasyonunu destekler; dağıtılmış sistemden Madde 14'ün istediği kullanım-sırası gözetim önlemlerini (izleme, yorumlama, geçersiz kılma veya durdurma) uygulamaz; bunlar dağıtıcıda kalır. ## Kapı nasıl çalışır diff --git a/docs/usermanuals/tr/operations/iso-soc2-deployer.md b/docs/usermanuals/tr/operations/iso-soc2-deployer.md index d96a3898..55e8a0ab 100644 --- a/docs/usermanuals/tr/operations/iso-soc2-deployer.md +++ b/docs/usermanuals/tr/operations/iso-soc2-deployer.md @@ -14,16 +14,16 @@ ISO / SOC 2 denetçisinin en çok önem verdiği dört sütun, doğrudan ForgeLM 1. **Denetim izi** — eğitim çalışması başına `audit_log.jsonl`, HMAC + SHA-256 hash chain + genesis manifest sidecar ile append-only. `forgelm verify-audit` zinciri uçtan uca doğrular. 2. **Değişiklik kontrolü** — Article 14 staging gate'i (`forgelm approve` / `reject`) + `human_approval.required/granted/rejected` audit olayları + run başına damgalanmış `config_hash` (per-run manifest sidecar field). 3. **Veri lineage** — `data_provenance.json` (SHA-256 fingerprint + size + mtime, ayrıca **`hf_revision_source` ile derecelendirilmiş** dataset HF Hub commit SHA'sı) + `data_governance_report.json` (collection_method, annotation_process, known_biases, personal_data_included, dpia_completed). Dereceyi SHA'dan önce okuyun: modeli eğiten korpusun kanıtı yalnızca `hf_revision_source: loaded`'dır. -4. **Tedarik zinciri** — sürüm başına yayınlanan CycloneDX 1.5 SBOM, gecelik `pip-audit`, statik + dinamik güvenlik tarama için CI'da `bandit`. +4. **Tedarik zinciri** — sürüm başına üretilen CycloneDX 1.5 SBOM (90 gün saklanan bir workflow-run artifact'ı, GitHub release asset'i değil), gecelik `pip-audit`, statik + dinamik güvenlik tarama için CI'da `bandit`. ## Sekiz denetim katı sorusu Derin rehber her birini tam `jq` / CLI komutu + döndürdüğü artefakt ile yanıtlar: 1. "Son 90 gündeki her model promotion için audit trail'i göster" → `forgelm verify-audit` + `jq 'select(.event == "human_approval.granted")'`. -2. "Bana change-control kanıtını göster — bu modeli kim onayladı?" → `training.started` + `human_approval.granted` olaylarını çapraz referans alın; iki farklı operator ID, görev ayrılığını (segregation of duties) kanıtlar (ISO A.5.3, SOC 2 CC1.5). +2. "Bana change-control kanıtını göster — bu modeli kim onayladı?" → `training.started` + `human_approval.granted` olaylarını çapraz referans alın; iki kimliği karşılaştırın; ikisi de kendi beyanıdır (`FORGELM_OPERATOR`, yoksa OS kullanıcısı), dolayısıyla görev ayrılığı (segregation of duties; ISO A.5.3, SOC 2 CC1.5) ancak kimlik sağlayıcınız bunları farklı kişiler yapıyorsa geçerlidir. 3. "Veri lineage'ını göster" → `data_provenance.json`; `sha256` + `hf_revision` corpus'u pinler — ancak yalnızca `hf_revision_source` `loaded` olduğunda. `unverified`, SHA'nın paket yazılırken yapılan ve yüklemeyle hiçbir bağı olmayan bir Hub sorgusu olduğu anlamına gelir; `unresolved` ise hiçbir SHA alınmadığı ve hiçbir iddiada bulunulmadığı anlamına gelir. -4. "Tedarik zincirini göster" → `gh release download "$(gh release view --json tagName -q .tagName)" --pattern 'sbom-*'`; CycloneDX 1.5 JSON. +4. "Tedarik zincirini göster" → `gh run list --repo HodeTech/ForgeLM --workflow publish.yml --branch v --status success`, ardından 90 gün içinde `gh run download --repo HodeTech/ForgeLM --pattern 'sbom-*'`; CycloneDX 1.5 JSON (CI runner'ının paket listesi, test araçları dahil, lisans verisi yok). 5. "Erişim kontrollerini göster" → IdP audit log + `FORGELM_OPERATOR` çapraz referansı. 6. "Şifreleme duruşunu göster" → operatör-tarafı substrate (KMS audit log + `data_governance_report.json`). 7. "Olay müdahalesini göster" → `audit.classifier_load_failed` + F-compliance-110 strict gate. diff --git a/docs/usermanuals/tr/operations/supply-chain.md b/docs/usermanuals/tr/operations/supply-chain.md index 00a82beb..a2d13134 100644 --- a/docs/usermanuals/tr/operations/supply-chain.md +++ b/docs/usermanuals/tr/operations/supply-chain.md @@ -5,21 +5,24 @@ description: ForgeLM SBOM + pip-audit + bandit pipeline'ı için operatör yüze # Tedarik Zinciri -ForgeLM sürüm tag'i başına bir CycloneDX 1.5 SBOM yayınlar ve `pip-audit` + `bandit`'i `nightly.yml` workflow'u üzerinden gecelik çalıştırır (her sürüm-tag yayınında da yeniden koşar). Bu sayfa operatörün zihinsel modelidir: ne zaman ne çalışır, artefaktlar nereden alınır ve aynı kontroller lokalde nasıl yansıtılır. +ForgeLM sürüm tag'i başına bir CycloneDX 1.5 SBOM üretir (workflow-run artifact'ı olarak, GitHub release asset'i değil) ve `pip-audit` + `bandit`'i `nightly.yml` workflow'u üzerinden gecelik çalıştırır (her sürüm-tag yayınında da yeniden koşar). Bu sayfa operatörün zihinsel modelidir: ne zaman ne çalışır, artefaktlar nereden alınır ve aynı kontroller lokalde nasıl yansıtılır. ## Ne zaman ne çalışır | Tetikleyici | Araç | Sonuç | Hata politikası | |---|---|---|---| -| Sürüm tag'i (`v*`) | `tools/generate_sbom.py` | (OS × Python-sürüm) hücresi başına bir CycloneDX 1.5 JSON, GitHub release'e iliştirilir | SBOM adımı pure-stdlib; yeşil sürüm matrisini sessizce bozamaz | -| Gecelik 03:00 UTC | `pip-audit` (`tools/check_pip_audit.py` üzerinden) | Kurulu bağımlılıklara karşı OSV / GHSA taraması | HIGH/CRITICAL → exit 1 + GitHub issue; MEDIUM → `::warning::`; LOW → sessiz | +| Sürüm tag'i (`v*`) | `tools/generate_sbom.py` | (OS × Python-sürüm) hücresi başına bir CycloneDX 1.5 JSON, tag'in publish çalıştırmasının workflow-run artifact'ı olarak yüklenir (90 gün saklanır; GitHub release'e iliştirilmez) | SBOM adımı pure-stdlib; yeşil sürüm matrisini sessizce bozamaz | +| Gecelik 03:00 UTC | `pip-audit` (`tools/check_pip_audit.py` üzerinden) | Kurulu bağımlılıklara karşı PyPI güvenlik açığı verisi taraması | HIGH/CRITICAL ya da UNKNOWN severity → exit 1 + GitHub issue; MEDIUM → `::warning::`; LOW → sessiz | | Gecelik 03:00 UTC + sürüm tag'i | `bandit` (`tools/check_bandit.py` üzerinden) | `forgelm/` üzerinde statik güvenlik taraması (`tests/` hariç) | HIGH → exit 1; MEDIUM → `::warning::`; LOW → sessiz | ## SBOM nereden alınır ```bash -# Bir sürüm için tüm SBOM'lar. -gh release download "$(gh release view --json tagName -q .tagName)" --pattern 'sbom-*' +# Bir tag için başarılı publish çalıştırmasını bulun, sonra SBOM'larını indirin +# (artifact başına bir dizin). Run artifact'ları 90 günde silinir. +gh run list --repo HodeTech/ForgeLM --workflow publish.yml --branch v --status success \ + --json databaseId,createdAt +gh run download --repo HodeTech/ForgeLM --pattern 'sbom-*' # Birini güzel-yazdır. jq . sbom-ubuntu-latest-py3.11.json | less @@ -34,7 +37,7 @@ curl -X POST -H "X-Api-Key: $DT_KEY" -H "Content-Type: application/octet-stream" https://deptrack.example.com/api/v1/bom ``` -SBOM determinizm-pinli — aynı Python ortamında ardışık iki yayın content-identical JSON üretir (CycloneDX semantiği gereği kasıtlı olarak değişen `serialNumber` ve `metadata.timestamp` hariç). +SBOM determinizm-pinli — aynı Python ortamında ardışık iki yayın content-identical JSON üretir (CycloneDX semantiği gereği kasıtlı olarak değişen `serialNumber` ve `metadata.timestamp` hariç). Bu, aynı ortama özgü bir özelliktir: release SBOM'u CI runner'ının `pip list`'idir (`pytest` gibi test araçları dahil, bağımlılık grafiği ve lisans verisi yok); aynı tag'den sonradan yeniden emit etmek onu tekrarlamaz. Kendi ortamınızı tanımlamak için orada bir ForgeLM checkout'undan `python3 tools/generate_sbom.py` çalıştırın. ## Gecelik kontrolü lokalde yansıtın @@ -46,7 +49,7 @@ pip-audit --strict --format json --output /tmp/pip-audit.json python3 tools/check_pip_audit.py /tmp/pip-audit.json ``` -Exit 0, ForgeLM CI'nın uyguladığı aynı severity politikasının geçtiği anlamına gelir. Exit 1, gecelik ateşlenmeden önce bir HIGH/CRITICAL açığın ele alınması gerektiği anlamına gelir. +Exit 0, ForgeLM CI'nın uyguladığı aynı severity politikasının geçtiği anlamına gelir. Exit 1, gecelik ateşlenmeden önce bir HIGH/CRITICAL açığın ya da pip-audit'in severity bildirmediği (UNKNOWN; çoğu bulgu böyledir) bir bulgunun ele alınması gerektiği anlamına gelir. ## Bandit kontrolünü lokalde yansıtın diff --git a/docs/usermanuals/tr/reference/exit-codes.md b/docs/usermanuals/tr/reference/exit-codes.md index fd21ec0e..6a0fc562 100644 --- a/docs/usermanuals/tr/reference/exit-codes.md +++ b/docs/usermanuals/tr/reference/exit-codes.md @@ -11,7 +11,7 @@ ForgeLM'in exit kodları kamuya açık bir kontrattır. CI/CD hatları, schedule | Exit | Sabit | Anlam | Tipik CI aksiyonu | |---|---|---|---| -| **0** | `EXIT_SUCCESS` | Koşu tamamlandı ve checkpoint terfi etti. `evaluation.auto_revert: true` ile tüm kapılar da geçti; sevk edilen varsayılan `auto_revert: false` ile başarısız bir benchmark/güvenlik/judge kapısı **JSON çıktısına kaydedilir ama exit kodunu değiştirmez** — aşağıdaki ["exit 0 tam olarak ne garanti eder"](#exit-0-tam-olarak-ne-garanti-eder) bölümüne bakın. | Hattı sürdür (`auto_revert` kapalıysa kapı bloklarını parse et) | +| **0** | `EXIT_SUCCESS` | Koşu tamamlandı ve checkpoint terfi etti. `evaluation.auto_revert: true` ile karara varan tüm kapılar da geçti (karar üretemeyen bir güvenlik değerlendirmesi de modeli korur ve 0 ile çıkar); sevk edilen varsayılan `auto_revert: false` ile başarısız bir benchmark/güvenlik/judge kapısı **JSON çıktısına kaydedilir ama exit kodunu değiştirmez** — aşağıdaki ["exit 0 tam olarak ne garanti eder"](#exit-0-tam-olarak-ne-garanti-eder) bölümüne bakın. | Hattı sürdür (`auto_revert` kapalıysa kapı bloklarını parse et) | | **1** | `EXIT_CONFIG_ERROR` | YAML geçersiz, dosya yok, env var ayarsız veya argüman bozuk. | Hızlı başarısız | | **2** | `EXIT_TRAINING_ERROR` | Eğitim sırasında runtime hatası (config veya değerlendirme kapısı dışı her ele alınmamış istisna: data yükleme, OOM, NaN loss, I/O başarısızlığı, mid-stream audit-iteration OSError). | İncele; logları yüzeyle | | **3** | `EXIT_EVAL_FAILURE` | Bir benchmark/güvenlik/judge kapısı geçemedi **ve** model otomatik geri alındı (`evaluation.auto_revert: true` gerektirir). `auto_revert: false` ile başarısız bir kapı exit 3 üretmez — koşu, JSON kapı bloklarına kaydedilen başarısızlıkla 0 çıkar. | İncele; terfi ETTİRME | @@ -112,7 +112,7 @@ Exit kodu kontrat tek başına yeterli — POSIX kabuklarda `$?`, cmd'de `%ERROR **Kapılar ve exit 0.** *Geçen* bir benchmark/güvenlik/judge kapısının exit-0 garantisinin parçası olup olmadığı `evaluation.auto_revert`'e bağlıdır: -- `evaluation.auto_revert: true` ile (EU AI Act yüksek-riskli varsayılanı), başarısız bir kapı modeli otomatik geri alır ve **3** ile çıkar — yani exit 0 *gerçekten* tüm konfigüre kapıların geçtiği anlamına gelir. +- `evaluation.auto_revert: true` ile (EU AI Act yüksek-riskli varsayılanı), başarısız bir kapı modeli otomatik geri alır ve **3** ile çıkar — yani exit 0, karara varan her konfigüre kapının geçtiği anlamına gelir. **Tek istisna:** karar üretemeyen bir güvenlik değerlendirmesi (`safety.evaluation_completed: false` — sınıflandırıcı yüklenemedi, probe dosyası yok ya da boş, ya da çoğu karar okunamadı) `auto_revert: true` olsa bile modeli korur ve 0 ile çıkar (onay kapısıyla 4); JSON çıktısındaki `safety.passed` ve `safety.evaluation_completed`'e bakın. - Sevk edilen varsayılan `evaluation.auto_revert: false` ile, başarısız bir kapı **kaydedilir** (JSON çıktısındaki `benchmark` / `safety` / `judge` bloğu `*_passed: false` taşır) ama model yine terfi eder ve koşu **0** ile çıkar. Bu JSON bloklarını okuyun; kapı başarısını yalnızca exit 0'dan çıkarsamayın. Tasarım gereği "kısmi başarı" exit kodu yok — başarısız bir kapının exit kodunu değiştirmesini istiyorsanız `auto_revert`'i açın. diff --git a/docs/usermanuals/tr/reference/json-output.md b/docs/usermanuals/tr/reference/json-output.md index a4421064..e1f3a911 100644 --- a/docs/usermanuals/tr/reference/json-output.md +++ b/docs/usermanuals/tr/reference/json-output.md @@ -178,7 +178,7 @@ Eğitim tamamlanana kadar çalıştığında pipeline **stdout**'a bir sonuç en | Anahtar | Tip | Not | |---|---|---| -| `success` | bool | Çalışma tamamlandığında (stage'lenmiş, onay-bekleyen çalışma dahil) `true`. Bir gate modeli auto-revert ettiğinde `false`. | +| `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. | diff --git a/site/compliance.html b/site/compliance.html index 73070e2d..b4846663 100644 --- a/site/compliance.html +++ b/site/compliance.html @@ -174,14 +174,14 @@

Transparency

Article 14

Human oversight

-

Optional evaluation.require_human_approval: true moves the trained checkpoint into a staging directory; forgelm approve / reject + forgelm approvals drive the dual-controlled sign-off, all stamped into the audit log.

+

Optional evaluation.require_human_approval: true moves the trained checkpoint into a staging directory; forgelm approve / forgelm reject + forgelm approvals record a human sign-off, with the approver identity stamped into the audit log. It supports design-time oversight documentation; oversight of the deployed system stays with the deployer.

forgelm approve · forgelm reject · forgelm approvals
Article 15

Accuracy & robustness

-

Benchmark gates per-task floor; if the post-train number drops below the floor, the run fails (exit 3).

+

Benchmark gates per-task floor; with evaluation.auto_revert: true, a post-train number below the floor deletes the trained artefacts and the run exits 3. Cybersecurity: secrets / PII at ingest, dependency CVE awareness.

forgelm/benchmark.py
@@ -195,14 +195,14 @@

Conformity & QMS

GDPR

PII redaction at ingest

-

--pii-mask redacts emails, phones, credit cards (Luhn-validated), IBAN, TR national ID, DE Personalausweis, FR SSN, US SSN before chunks land in JSONL.

+

--pii-mask redacts emails, phones, credit cards (Luhn), IBAN, national IDs (TR/DE/FR/US-SSN) before chunks land in JSONL. It reduces what reaches training and supports data minimisation (Article 5(1)(c)); names and free text are not detected, so it is an aid, not a guarantee.

forgelm/data_audit/ · forgelm/data_audit/_pii_regex.py
GDPR Art. 15

Right of access

-

forgelm reverse-pii scans masked JSONL corpora for plaintext residuals or salted SHA-256 digests of a data-subject identifier and reports every row of every split where that subject appears, satisfying the access-request side of the GDPR's data-subject rights.

+

forgelm reverse-pii scans masked JSONL corpora for plaintext residuals or salted SHA-256 digests of a data-subject identifier and reports every row of every split where that subject appears. It finds only what is literally in the files you scan: raw sources and the trained model are not searched, and handling an access request stays your process.

forgelm reverse-pii
@@ -236,7 +236,7 @@

Audit trail

Pillar 2

Change control

-

Article 14 staging gate (forgelm approve / reject) plus human_approval.required/granted/rejected audit events plus forgelm verify-audit chain integrity — every model promotion is dual-controlled and forensically attributed.

+

Article 14 staging gate (forgelm approve / forgelm reject) plus human_approval.required/granted/rejected audit events plus forgelm verify-audit chain integrity — with the gate on, every model promotion is attributed to the recorded approver identity; keeping trainer and approver different people is the deployer's control.

forgelm approve · forgelm verify-audit
diff --git a/site/features.html b/site/features.html index 8350f06a..65307521 100644 --- a/site/features.html +++ b/site/features.html @@ -183,7 +183,7 @@

GaLore

DeepSpeed & FSDP

-

Multi-GPU distributed training. ZeRO presets, FSDP, Unsloth backend.

+

Multi-GPU distributed training. DeepSpeed ZeRO-2 / ZeRO-3 (your own JSON; preset names need a source checkout), FSDP, Unsloth backend.

@@ -226,7 +226,7 @@

Llama Guard safety

Auto-revert

-

With evaluation.auto_revert: true, a failed threshold makes ForgeLM delete the trained artefacts and exit 3. There is no rollback to an earlier checkpoint.

+

With evaluation.auto_revert: true, a failed loss, benchmark, or safety threshold makes ForgeLM delete the trained artefacts, exit 3, and emit a structured incident record. There is no rollback to an earlier checkpoint — nothing is restored. One exception: a safety evaluation that produced no verdict (classifier not loaded, probes missing) keeps the model and exits 0.

@@ -322,7 +322,7 @@

Enterprise & MLOps

Webhook notifications

-

Slack, Teams, Discord, or any HTTP webhook receiver alerts on training events.

+

Slack-format webhook alerts on training start, success, failure, auto-revert (Teams and Discord need a relay). Structured payloads — pipe to your incident tool.

@@ -430,7 +430,7 @@

Annex IV verifier

GGUF integrity verifier

-

forgelm verify-gguf validates the GGUF magic header, parses the metadata block, and re-checks the SHA-256 sidecar (when present) before you ship a quantized model.

+

forgelm verify-gguf validates the GGUF magic header, parses the metadata block, and re-checks the .sha256 sidecar written at export time (when present) before you ship a quantized model.

diff --git a/site/index.html b/site/index.html index 78a7ba21..af90addc 100644 --- a/site/index.html +++ b/site/index.html @@ -476,7 +476,7 @@

Benchmarking

Distributed training

-

DeepSpeed ZeRO presets, FSDP, multi-GPU configs.

+

DeepSpeed ZeRO-2 / ZeRO-3 (bring your own JSON; the preset names need a source checkout), FSDP, multi-GPU configs. MoE support (Qwen3, Mixtral, DeepSeek).

DeepSpeed FSDP @@ -505,7 +505,7 @@

Interactive chat

Export & deploy

-

GGUF export with 6 quant levels.

+

GGUF export (f16 and q8_0 in one step; K-quants need llama.cpp's llama-quantize) with a SHA-256 sidecar. Generate Ollama / vLLM / TGI / HF-Endpoints deployment configs in one command.

GGUF deploy @@ -592,7 +592,7 @@

One YAML, end-to-end run

benchmark: enabled: true tasks: ["hellaswag", "arc_easy", "truthfulqa"] - min_score: 0.65 # aggregate floor; run fails (exit 3) below this + min_score: 0.65 # aggregate floor; with evaluation.auto_revert: true, below this the run exits 3 safety: enabled: true classifier: "meta-llama/Llama-Guard-3-8B" @@ -637,7 +637,7 @@

Use cases that actually ship

Domain expert from policy PDFs

-

Drop your regulatory corpus into forgelm ingest.

+

Drop your regulatory corpus into forgelm ingest, audit it, and SFT a model that answers in your domain's voice — with common PII formats masked at ingest, before training.

forgelm quickstart domain-expert
@@ -659,7 +659,7 @@

Customer support assistant

Code copilot fine-tune

-

Multi-dataset mix, SFT + ORPO, GGUF export.

+

Multi-dataset mix (your repo + open code) with SFT (ORPO is a follow-up step you can chain), GGUF export for local inference. Synthetic data pipeline distils a teacher into your student.

forgelm quickstart code-assistant
diff --git a/site/js/translations.js b/site/js/translations.js index 745ddc7f..ac982eb6 100644 --- a/site/js/translations.js +++ b/site/js/translations.js @@ -378,13 +378,13 @@ "home.cap.bench.title": "Benchmarking", "home.cap.bench.body": "Plug-in lm-evaluation-harness tasks. LLM-as-judge with OpenAI or local model. Floors per task; auto-revert if any drops.", "home.cap.dist.title": "Distributed training", - "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3 presets, FSDP, multi-GPU configs. MoE support (Qwen3, Mixtral, DeepSeek).", + "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3 (bring your own JSON; the preset names need a source checkout), FSDP, multi-GPU configs. MoE support (Qwen3, Mixtral, DeepSeek).", "home.cap.vram.title": "VRAM fit-check", "home.cap.vram.body": "Pre-flight memory estimator. FITS / TIGHT / OOM / UNKNOWN verdict with concrete recommendations before you submit a long job.", "home.cap.chat.title": "Interactive chat", "home.cap.chat.body": "Streaming REPL with /reset, /save, /temperature, /system commands. Per-response Llama Guard routing is planned for an upcoming Pro CLI release.", "home.cap.export.title": "Export & deploy", - "home.cap.export.body": "GGUF export with 6 quant levels and SHA-256 manifest. Generate Ollama / vLLM / TGI / HF-Endpoints deployment configs in one command.", + "home.cap.export.body": "GGUF export (f16 and q8_0 in one step; K-quants need llama.cpp's llama-quantize) with a SHA-256 sidecar. Generate Ollama / vLLM / TGI / HF-Endpoints deployment configs in one command.", "home.cap.api.title": "Library API", "home.cap.api.body": "from forgelm import … to embed ForgeTrainer, audit_dataset, verify_audit_log, and verify_annex_iv_artifact calls inside your own Python pipelines — the public surface is enumerated in forgelm.__all__.", "home.cap.iso.title": "ISO 27001 / SOC 2 alignment", @@ -398,11 +398,11 @@ "home.uses.eyebrow": "Built for these workflows", "home.uses.title": "Use cases that actually ship", "home.use.domain.title": "Domain expert from policy PDFs", - "home.use.domain.body": "Drop your regulatory corpus into forgelm ingest, audit it, and SFT a model that answers in your domain's voice — with PII redacted at ingest, before training.", + "home.use.domain.body": "Drop your regulatory corpus into forgelm ingest, audit it, and SFT a model that answers in your domain's voice — with common PII formats masked at ingest, before training.", "home.use.support.title": "Customer support assistant", "home.use.support.body": "SFT on past tickets (and DPO on chosen/rejected agent feedback when you have it), Llama Guard safety evaluation gate, auto-revert if helpfulness drops. Ship to vLLM with one command.", "home.use.code.title": "Code copilot fine-tune", - "home.use.code.body": "Multi-dataset mix (your repo + open code) with SFT (ORPO is a follow-up step you can chain), GGUF export at q4_k_m for local inference. Synthetic data pipeline distils a teacher into your student.", + "home.use.code.body": "Multi-dataset mix (your repo + open code) with SFT (ORPO is a follow-up step you can chain), GGUF export for local inference. Synthetic data pipeline distils a teacher into your student.", "home.use.reasoning.title": "Reasoning RL with GRPO", "home.use.reasoning.body": "Built-in format/length shaping rewards or your own reward function. Group-relative policy optimization without writing a single training-loop line.", "home.cta.title": "Ship your next fine-tune in an afternoon.", @@ -484,13 +484,13 @@ "home.cap.bench.title": "Benchmark", "home.cap.bench.body": "lm-evaluation-harness entegrasyonu. OpenAI veya yerel modelle LLM-as-judge. Görev bazlı tabanlar; biri düşerse otomatik artefakt silme.", "home.cap.dist.title": "Dağıtık eğitim", - "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3 hazır ayarlar, FSDP, çoklu-GPU konfigürasyonu. MoE desteği (Qwen3, Mixtral, DeepSeek).", + "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3 (kendi JSON'unuzu verin; hazır ayar adları kaynak checkout'u ister), FSDP, çoklu-GPU konfigürasyonu. MoE desteği (Qwen3, Mixtral, DeepSeek).", "home.cap.vram.title": "VRAM fit-check", "home.cap.vram.body": "Uçuş öncesi bellek tahmincisi. Uzun bir işi göndermeden önce FITS / TIGHT / OOM / UNKNOWN verdict'i ve somut öneriler.", "home.cap.chat.title": "İnteraktif sohbet", "home.cap.chat.body": "/reset, /save, /temperature, /system komutları ile akışlı REPL. Yanıt-başına Llama Guard routing'i yaklaşan Pro CLI sürümü için planlanıyor.", "home.cap.export.title": "Export ve deploy", - "home.cap.export.body": "6 kuantizasyon seviyesi ve SHA-256 manifest ile GGUF export. Tek komutta Ollama / vLLM / TGI / HF-Endpoints deployment config üret.", + "home.cap.export.body": "GGUF export (f16 ve q8_0 tek adımda; K-quant'lar için llama.cpp'nin llama-quantize'ı gerekir) ve SHA-256 sidecar. Tek komutta Ollama / vLLM / TGI / HF-Endpoints deployment config üret.", "home.cap.api.title": "Kütüphane API'si", "home.cap.api.body": "from forgelm import … ile ForgeTrainer, audit_dataset, verify_audit_log ve verify_annex_iv_artifact çağrılarını kendi Python pipeline'ınıza gömün — public yüzey forgelm.__all__ içinde sıralanmıştır.", "home.cap.iso.title": "ISO 27001 / SOC 2 hizalaması", @@ -504,11 +504,11 @@ "home.uses.eyebrow": "Bu iş akışları için tasarlandı", "home.uses.title": "Gerçekten üretime çıkan kullanım senaryoları", "home.use.domain.title": "Politika PDF'lerinden alan uzmanı", - "home.use.domain.body": "Regülasyon korpusunuzu forgelm ingest'e bırakın, denetleyin ve alanınızın diliyle cevap veren bir modeli SFT'leyin — PII ingest sırasında, eğitimden önce maskelenir.", + "home.use.domain.body": "Regülasyon korpusunuzu forgelm ingest'e bırakın, denetleyin ve alanınızın diliyle cevap veren bir modeli SFT'leyin — yaygın PII biçimleri ingest sırasında, eğitimden önce maskelenir.", "home.use.support.title": "Müşteri destek asistanı", "home.use.support.body": "Geçmiş ticket'larda SFT (eğer chosen/rejected agent geri bildirimi varsa DPO eklenebilir), Llama Guard güvenlik değerlendirme kapısı, yardımseverlik düşerse otomatik artefakt silme. Tek komutla vLLM'e gönderim.", "home.use.code.title": "Kod copilot fine-tune", - "home.use.code.body": "Çoklu veri seti karışımı (kendi repo'nuz + açık kod) ile SFT (ORPO'yu sonradan zincirleyebilirsiniz), yerel inference için q4_k_m'de GGUF export. Sentetik veri hattı bir öğretmeni öğrencinize damıtır.", + "home.use.code.body": "Çoklu veri seti karışımı (kendi repo'nuz + açık kod) ile SFT (ORPO'yu sonradan zincirleyebilirsiniz), yerel inference için GGUF export. Sentetik veri hattı bir öğretmeni öğrencinize damıtır.", "home.use.reasoning.title": "GRPO ile akıl yürütme RL", "home.use.reasoning.body": "Yerleşik format/uzunluk ödülleri veya kendi reward fonksiyonunuz. Tek bir training loop satırı yazmadan grup-göreli politika optimizasyonu.", "home.cta.title": "Bir sonraki fine-tune'unuzu bir öğleden sonrasında gönderin.", @@ -590,13 +590,13 @@ "home.cap.bench.title": "Benchmarking", "home.cap.bench.body": "Plug-in-Tasks für lm-evaluation-harness. LLM-as-Judge mit OpenAI oder lokalem Modell. Schwellwerte pro Task; automatisches Verwerfen der Artefakte, wenn einer fällt.", "home.cap.dist.title": "Verteiltes Training", - "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3-Presets, FSDP, Multi-GPU-Konfigurationen. MoE-Unterstützung (Qwen3, Mixtral, DeepSeek).", + "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3 (eigenes JSON; die Preset-Namen brauchen einen Source-Checkout), FSDP, Multi-GPU-Konfigurationen. MoE-Unterstützung (Qwen3, Mixtral, DeepSeek).", "home.cap.vram.title": "VRAM-Fit-Check", "home.cap.vram.body": "Pre-Flight-Speicherschätzer. FITS / TIGHT / OOM / UNKNOWN-Verdikt mit konkreten Empfehlungen, bevor Sie einen langen Job einreichen.", "home.cap.chat.title": "Interaktiver Chat", "home.cap.chat.body": "Streaming-REPL mit Befehlen /reset, /save, /temperature, /system. Pro-Antwort-Llama-Guard-Routing ist für eine kommende Pro-CLI-Version geplant.", "home.cap.export.title": "Export & Deploy", - "home.cap.export.body": "GGUF-Export mit 6 Quantisierungsstufen und SHA-256-Manifest. Generieren Sie Deployment-Konfigurationen für Ollama / vLLM / TGI / HF-Endpoints in einem Befehl.", + "home.cap.export.body": "GGUF-Export (f16 und q8_0 in einem Schritt; K-Quants brauchen llama.cpps llama-quantize) mit SHA-256-Sidecar. Generieren Sie Deployment-Konfigurationen für Ollama / vLLM / TGI / HF-Endpoints in einem Befehl.", "home.cap.api.title": "Bibliotheks-API", "home.cap.api.body": "from forgelm import … und betten Sie ForgeTrainer-, audit_dataset-, verify_audit_log- und verify_annex_iv_artifact-Aufrufe in Ihre eigenen Python-Pipelines ein — die öffentliche Oberfläche ist in forgelm.__all__ aufgeführt.", "home.cap.iso.title": "ISO 27001 / SOC 2 Alignment", @@ -610,11 +610,11 @@ "home.uses.eyebrow": "Gebaut für diese Workflows", "home.uses.title": "Use-Cases, die wirklich in Produktion gehen", "home.use.domain.title": "Domänen-Experte aus Policy-PDFs", - "home.use.domain.body": "Werfen Sie Ihren regulatorischen Korpus in forgelm ingest, auditieren Sie ihn und SFTen Sie ein Modell, das in der Sprache Ihrer Domäne antwortet — mit beim Ingest, vor dem Training, geschwärzten PII.", + "home.use.domain.body": "Werfen Sie Ihren regulatorischen Korpus in forgelm ingest, auditieren Sie ihn und SFTen Sie ein Modell, das in der Sprache Ihrer Domäne antwortet — mit beim Ingest, vor dem Training, maskierten gängigen PII-Formaten.", "home.use.support.title": "Kundensupport-Assistent", "home.use.support.body": "SFT auf vergangenen Tickets (und DPO auf gewählten/abgelehnten Agenten-Feedback, falls verfügbar), Llama-Guard-Sicherheitsbewertungs-Gate, automatisches Verwerfen der Artefakte, wenn die Hilfsbereitschaft sinkt. Mit einem Befehl an vLLM ausliefern.", "home.use.code.title": "Code-Copilot Fine-Tune", - "home.use.code.body": "Multi-Dataset-Mix (Ihr Repo + offener Code) mit SFT (ORPO ist ein Folgeschritt, den Sie verketten können), GGUF-Export bei q4_k_m für lokale Inferenz. Synthetische Datenpipeline destilliert einen Lehrer in Ihren Schüler.", + "home.use.code.body": "Multi-Dataset-Mix (Ihr Repo + offener Code) mit SFT (ORPO ist ein Folgeschritt, den Sie verketten können), GGUF-Export für lokale Inferenz. Synthetische Datenpipeline destilliert einen Lehrer in Ihren Schüler.", "home.use.reasoning.title": "Reasoning-RL mit GRPO", "home.use.reasoning.body": "Eingebaute Format/Längen-Shaping-Rewards oder Ihre eigene Reward-Funktion. Group-Relative Policy Optimization, ohne eine einzige Trainings-Schleifen-Zeile zu schreiben.", "home.cta.title": "Liefern Sie Ihren nächsten Fine-Tune an einem Nachmittag aus.", @@ -696,13 +696,13 @@ "home.cap.bench.title": "Benchmarking", "home.cap.bench.body": "Tâches lm-evaluation-harness en plug-in. LLM-as-judge avec OpenAI ou modèle local. Planchers par tâche ; suppression automatique des artefacts si l'un baisse.", "home.cap.dist.title": "Entraînement distribué", - "home.cap.dist.body": "Presets DeepSpeed ZeRO-2 / ZeRO-3, FSDP, configurations multi-GPU. Support MoE (Qwen3, Mixtral, DeepSeek).", + "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3 (votre propre JSON ; les noms de presets exigent un checkout des sources), FSDP, configurations multi-GPU. Support MoE (Qwen3, Mixtral, DeepSeek).", "home.cap.vram.title": "Vérification VRAM", "home.cap.vram.body": "Estimateur de mémoire pré-vol. Verdict FITS / TIGHT / OOM / UNKNOWN avec recommandations concrètes avant de soumettre un long job.", "home.cap.chat.title": "Chat interactif", "home.cap.chat.body": "REPL en streaming avec commandes /reset, /save, /temperature, /system. Le routing Llama Guard par réponse est prévu pour une prochaine version de la CLI Pro.", "home.cap.export.title": "Export & déploiement", - "home.cap.export.body": "Export GGUF avec 6 niveaux de quantisation et manifest SHA-256. Générez des configurations de déploiement Ollama / vLLM / TGI / HF-Endpoints en une commande.", + "home.cap.export.body": "Export GGUF (f16 et q8_0 en une étape ; les K-quants nécessitent llama-quantize de llama.cpp) avec un fichier SHA-256 associé. Générez des configurations de déploiement Ollama / vLLM / TGI / HF-Endpoints en une commande.", "home.cap.api.title": "API bibliothèque", "home.cap.api.body": "from forgelm import … et intégrez les appels ForgeTrainer, audit_dataset, verify_audit_log et verify_annex_iv_artifact dans vos propres pipelines Python — la surface publique est listée dans forgelm.__all__.", "home.cap.iso.title": "Alignement ISO 27001 / SOC 2", @@ -716,11 +716,11 @@ "home.uses.eyebrow": "Conçu pour ces workflows", "home.uses.title": "Cas d'usage qui livrent vraiment", "home.use.domain.title": "Expert métier à partir de PDF de politiques", - "home.use.domain.body": "Déposez votre corpus réglementaire dans forgelm ingest, auditez-le, et fine-tunez en SFT un modèle qui répond avec la voix de votre domaine — avec PII masqués à l'ingestion, avant l'entraînement.", + "home.use.domain.body": "Déposez votre corpus réglementaire dans forgelm ingest, auditez-le, et fine-tunez en SFT un modèle qui répond avec la voix de votre domaine — avec les formats PII courants masqués à l'ingestion, avant l'entraînement.", "home.use.support.title": "Assistant de support client", "home.use.support.body": "SFT sur tickets passés (et DPO sur feedbacks choisis/rejetés des agents si disponibles), gate d'évaluation sécurité Llama Guard, suppression automatique des artefacts si la serviabilité baisse. Livraison à vLLM en une commande.", "home.use.code.title": "Fine-tune copilote de code", - "home.use.code.body": "Mix multi-datasets (votre repo + code ouvert) avec SFT (l'ORPO est une étape de suite que vous pouvez chaîner), export GGUF en q4_k_m pour inférence locale. Pipeline de données synthétiques distille un teacher dans votre student.", + "home.use.code.body": "Mix multi-datasets (votre repo + code ouvert) avec SFT (l'ORPO est une étape de suite que vous pouvez chaîner), export GGUF pour inférence locale. Pipeline de données synthétiques distille un teacher dans votre student.", "home.use.reasoning.title": "RL de raisonnement avec GRPO", "home.use.reasoning.body": "Récompenses de format/longueur intégrées ou votre propre fonction de récompense. Group-Relative Policy Optimization sans écrire une seule ligne de boucle d'entraînement.", "home.cta.title": "Livrez votre prochain fine-tune en un après-midi.", @@ -802,13 +802,13 @@ "home.cap.bench.title": "Benchmarking", "home.cap.bench.body": "Tareas lm-evaluation-harness conectables. LLM-as-judge con OpenAI o modelo local. Pisos por tarea; descarte automático de artefactos si alguno cae.", "home.cap.dist.title": "Entrenamiento distribuido", - "home.cap.dist.body": "Presets DeepSpeed ZeRO-2 / ZeRO-3, FSDP, configuraciones multi-GPU. Soporte MoE (Qwen3, Mixtral, DeepSeek).", + "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3 (su propio JSON; los nombres de preset requieren un checkout del código fuente), FSDP, configuraciones multi-GPU. Soporte MoE (Qwen3, Mixtral, DeepSeek).", "home.cap.vram.title": "Comprobación VRAM", "home.cap.vram.body": "Estimador de memoria pre-vuelo. Veredicto FITS / TIGHT / OOM / UNKNOWN con recomendaciones concretas antes de enviar un trabajo largo.", "home.cap.chat.title": "Chat interactivo", "home.cap.chat.body": "REPL en streaming con comandos /reset, /save, /temperature, /system. El routing Llama Guard por respuesta está planeado para una próxima versión de la CLI Pro.", "home.cap.export.title": "Export y despliegue", - "home.cap.export.body": "Export GGUF con 6 niveles de cuantización y manifest SHA-256. Genere configuraciones de despliegue para Ollama / vLLM / TGI / HF-Endpoints en un solo comando.", + "home.cap.export.body": "Export GGUF (f16 y q8_0 en un paso; los K-quants requieren llama-quantize de llama.cpp) con un archivo SHA-256 asociado. Genere configuraciones de despliegue para Ollama / vLLM / TGI / HF-Endpoints en un solo comando.", "home.cap.api.title": "API de biblioteca", "home.cap.api.body": "from forgelm import … y embeba llamadas a ForgeTrainer, audit_dataset, verify_audit_log y verify_annex_iv_artifact dentro de sus propios pipelines de Python — la superficie pública se enumera en forgelm.__all__.", "home.cap.iso.title": "Alineación con ISO 27001 / SOC 2", @@ -822,11 +822,11 @@ "home.uses.eyebrow": "Construido para estos flujos", "home.uses.title": "Casos de uso que realmente se despliegan", "home.use.domain.title": "Experto de dominio a partir de PDFs regulatorios", - "home.use.domain.body": "Suelte su corpus regulatorio en forgelm ingest, audítelo y haga SFT a un modelo que responda con la voz de su dominio — con PII enmascarado en la ingestión, antes del entrenamiento.", + "home.use.domain.body": "Suelte su corpus regulatorio en forgelm ingest, audítelo y haga SFT a un modelo que responda con la voz de su dominio — con los formatos de PII comunes enmascarados en la ingestión, antes del entrenamiento.", "home.use.support.title": "Asistente de soporte al cliente", "home.use.support.body": "SFT sobre tickets pasados (y DPO sobre feedback elegido/rechazado de agentes si está disponible), puerta de evaluación de seguridad Llama Guard, descarte automático de artefactos si la utilidad baja. Despliegue a vLLM con un solo comando.", "home.use.code.title": "Fine-tune de copiloto de código", - "home.use.code.body": "Mezcla multi-dataset (su repo + código abierto) con SFT (ORPO es un paso posterior que puede encadenar), export GGUF en q4_k_m para inferencia local. La pipeline de datos sintéticos destila un teacher en su student.", + "home.use.code.body": "Mezcla multi-dataset (su repo + código abierto) con SFT (ORPO es un paso posterior que puede encadenar), export GGUF para inferencia local. La pipeline de datos sintéticos destila un teacher en su student.", "home.use.reasoning.title": "RL de razonamiento con GRPO", "home.use.reasoning.body": "Recompensas de format/length integradas o su propia función de recompensa. Group-Relative Policy Optimization sin escribir una sola línea de bucle de entrenamiento.", "home.cta.title": "Despliegue su próximo fine-tune en una tarde.", @@ -908,13 +908,13 @@ "home.cap.bench.title": "Benchmark", "home.cap.bench.body": "可插拔的 lm-evaluation-harness 任务。用 OpenAI 或本地模型作为 LLM-as-judge。每任务设阈值;任一跌破时自动丢弃训练产物。", "home.cap.dist.title": "分布式训练", - "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3 预设、FSDP、多 GPU 配置。MoE 支持 (Qwen3、Mixtral、DeepSeek)。", + "home.cap.dist.body": "DeepSpeed ZeRO-2 / ZeRO-3(自带 JSON;预设名称需要源码 checkout)、FSDP、多 GPU 配置。MoE 支持 (Qwen3、Mixtral、DeepSeek)。", "home.cap.vram.title": "VRAM 适配检查", "home.cap.vram.body": "起飞前显存估算。在你提交一个长任务之前给出 FITS / TIGHT / OOM / UNKNOWN 判定和具体建议。", "home.cap.chat.title": "交互式聊天", "home.cap.chat.body": "支持 /reset、/save、/temperature、/system 命令的流式 REPL。每响应 Llama Guard 路由计划在即将推出的 Pro CLI 版本中提供。", "home.cap.export.title": "Export & 部署", - "home.cap.export.body": "GGUF export 6 个量化级别加 SHA-256 manifest。一条命令生成 Ollama / vLLM / TGI / HF-Endpoints 部署配置。", + "home.cap.export.body": "GGUF export(f16 和 q8_0 一步完成;K-quant 需要 llama.cpp 的 llama-quantize)并附带 SHA-256 sidecar 文件。一条命令生成 Ollama / vLLM / TGI / HF-Endpoints 部署配置。", "home.cap.api.title": "库 API", "home.cap.api.body": "from forgelm import …,在你自己的 Python 管道中嵌入 ForgeTrainer、audit_dataset、verify_audit_log 和 verify_annex_iv_artifact 调用 — 公开表面在 forgelm.__all__ 中列出。", "home.cap.iso.title": "ISO 27001 / SOC 2 对齐", @@ -928,11 +928,11 @@ "home.uses.eyebrow": "为这些工作流而构建", "home.uses.title": "真正能上线的用例", "home.use.domain.title": "从政策 PDF 中得到的领域专家", - "home.use.domain.body": "把你的法规语料投入 forgelm ingest、审计它、然后 SFT 一个能用你领域口吻回答的模型 — PII 在 ingest 时,训练之前,就被屏蔽。", + "home.use.domain.body": "把你的法规语料投入 forgelm ingest、审计它、然后 SFT 一个能用你领域口吻回答的模型 — 常见 PII 格式在 ingest 时,训练之前,就被屏蔽。", "home.use.support.title": "客户支持助手", "home.use.support.body": "在过往工单上 SFT (有 chosen/rejected 工单反馈时可叠加 DPO),Llama Guard 安全评估 gate,有用度下降时自动丢弃训练产物。一条命令交付到 vLLM。", "home.use.code.title": "代码 copilot 微调", - "home.use.code.body": "多数据集混合 (你的 repo + 开源代码) 的 SFT (ORPO 是可链式的后续步骤),本地推理用 q4_k_m 的 GGUF export。合成数据 pipeline 把 teacher 蒸馏到你的 student 中。", + "home.use.code.body": "多数据集混合 (你的 repo + 开源代码) 的 SFT (ORPO 是可链式的后续步骤),用于本地推理的 GGUF export。合成数据 pipeline 把 teacher 蒸馏到你的 student 中。", "home.use.reasoning.title": "用 GRPO 做推理 RL", "home.use.reasoning.body": "内置 format/length 塑形奖励或你自己的奖励函数。无需写一行训练循环就能做 Group-Relative Policy Optimization。", "home.cta.title": "在一个下午内交付下一次微调。", @@ -961,7 +961,7 @@ "features.train.qlora": "4-bit NF4 quantization with LoRA. PiSSA, rsLoRA, DoRA variants. Train 7B-13B models on a single 12 GB GPU.", "features.train.galore": "Gradient low-rank projection for full-parameter training without LoRA. Memory at LoRA levels, capacity of full fine-tune.", "features.train.deepspeed.title":"DeepSpeed & FSDP", - "features.train.deepspeed.body":"Multi-GPU distributed training. ZeRO-2 / ZeRO-3 presets, FSDP, Unsloth backend.", + "features.train.deepspeed.body":"Multi-GPU distributed training. DeepSpeed ZeRO-2 / ZeRO-3 (your own JSON; preset names need a source checkout), FSDP, Unsloth backend.", "features.train.longctx.title":"Long-context", "features.train.longctx.body":"RoPE scaling, NEFTune noise injection, sliding-window attention, sample packing — train on 32K-128K context.", "features.eval.heading": "Evaluation & safety", @@ -973,7 +973,7 @@ "features.eval.lguard.title": "Llama Guard safety", "features.eval.lguard.body": "Verdicts across 14 harm categories (S1-S14), scored binary by default; confidence-weighted scoring applies only on the classification pipeline path. Severity tiers, cross-run trend tracking.", "features.eval.revert.title": "Auto-revert", - "features.eval.revert.body": "With evaluation.auto_revert: true, a failed loss, benchmark, or safety threshold makes ForgeLM delete the trained artefacts, exit 3, and emit a structured incident record. There is no rollback to an earlier checkpoint — nothing is restored.", + "features.eval.revert.body": "With evaluation.auto_revert: true, a failed loss, benchmark, or safety threshold makes ForgeLM delete the trained artefacts, exit 3, and emit a structured incident record. There is no rollback to an earlier checkpoint — nothing is restored. One exception: a safety evaluation that produced no verdict (classifier not loaded, probes missing) keeps the model and exits 0.", "features.eval.trend.title": "Trend tracking", "features.eval.trend.body": "Cross-run safety history (safety_trend.jsonl per output_dir). See if a category quietly drifts before it crosses the threshold.", "features.eval.exit.title": "Exit codes", @@ -999,7 +999,7 @@ "features.ent.heading": "Enterprise & MLOps", "features.ent.body": "Built for pipelines: containers, webhooks, structured outputs, air-gap, model cards.", "features.ent.webhook.title": "Webhook notifications", - "features.ent.webhook.body": "Slack, Teams, Discord, or any HTTP webhook receiver — alerts on training start, success, failure, auto-revert. Structured payloads — pipe to your incident tool.", + "features.ent.webhook.body": "Slack-format webhook alerts on training start, success, failure, auto-revert (Teams and Discord need a relay). Structured payloads — pipe to your incident tool.", "features.ent.exp.title": "Experiment tracking", "features.ent.exp.body": "W&B, MLflow, TensorBoard via report_to. Pluggable, not hardcoded. Use what your team already uses.", "features.ent.json.title": "JSON output mode", @@ -1039,7 +1039,7 @@ "features.gov.annex.title": "Annex IV verifier", "features.gov.annex.body": "forgelm verify-annex-iv validates the Annex IV §1-9 schema completeness and the bundle's manifest_hash for tampering detection. (Audit-chain integrity is the separate forgelm verify-audit command.)", "features.gov.gguf.title": "GGUF integrity verifier", - "features.gov.gguf.body": "forgelm verify-gguf re-checks the SHA-256 + size manifest stamped at export time before you ship a quantized model.", + "features.gov.gguf.body": "forgelm verify-gguf validates the GGUF magic header, parses the metadata block, and re-checks the .sha256 sidecar written at export time (when present) before you ship a quantized model.", "features.gov.iso.title": "ISO 27001 / SOC 2 alignment", "features.gov.iso.body": "Audit-trail, change-management, data-lineage, and supply-chain evidence the deployer's auditor asks for. Software is aligned, not certified.", "features.cta.title": "Want to see it in YAML?", @@ -1066,7 +1066,7 @@ "features.train.qlora": "LoRA ile 4-bit NF4 kuantizasyon. PiSSA, rsLoRA, DoRA varyantları. Tek 12 GB GPU'da 7B-13B model eğitin.", "features.train.galore": "LoRA olmadan full-parameter eğitim için gradient low-rank projeksiyonu. LoRA seviyesinde bellek, full fine-tune kapasitesi.", "features.train.deepspeed.title":"DeepSpeed ve FSDP", - "features.train.deepspeed.body":"Çoklu-GPU dağıtık eğitim. ZeRO-2 / ZeRO-3 hazır ayarlar, FSDP, Unsloth backend.", + "features.train.deepspeed.body":"Çoklu-GPU dağıtık eğitim. DeepSpeed ZeRO-2 / ZeRO-3 (kendi JSON'unuz; hazır ayar adları kaynak checkout'u ister), FSDP, Unsloth backend.", "features.train.longctx.title":"Uzun-context", "features.train.longctx.body":"RoPE scaling, NEFTune noise injection, kayar-pencere attention, sample packing — 32K-128K context'te eğitim.", "features.eval.heading": "Değerlendirme ve güvenlik", @@ -1078,7 +1078,7 @@ "features.eval.lguard.title": "Llama Guard güvenliği", "features.eval.lguard.body": "14 zarar kategorisinde (S1-S14) kararlar; varsayılan skorlama binary, güven-ağırlıklı skorlama yalnızca classification pipeline yolunda geçerli. Ciddiyet katmanları, koşular arası trend izleme.", "features.eval.revert.title": "Otomatik artefakt silme (auto-revert)", - "features.eval.revert.body": "evaluation.auto_revert: true ile loss, benchmark veya güvenlik eşiği başarısız olduğunda ForgeLM eğitilen artefaktları siler, 3 ile çıkar ve yapılandırılmış bir olay kaydı üretir. Önceki bir checkpoint'e dönüş yoktur — hiçbir şey geri yüklenmez.", + "features.eval.revert.body": "evaluation.auto_revert: true ile loss, benchmark veya güvenlik eşiği başarısız olduğunda ForgeLM eğitilen artefaktları siler, 3 ile çıkar ve yapılandırılmış bir olay kaydı üretir. Önceki bir checkpoint'e dönüş yoktur — hiçbir şey geri yüklenmez. Bir istisna: karar üretemeyen bir güvenlik değerlendirmesi (sınıflandırıcı yüklenmedi, probe'lar yok) modeli korur ve 0 ile çıkar.", "features.eval.trend.title": "Trend izleme", "features.eval.trend.body": "Koşular arası güvenlik geçmişi (output_dir başına safety_trend.jsonl). Bir kategori eşiği aşmadan önce sessizce kayıyor mu görün.", "features.eval.exit.title": "Exit kodları", @@ -1104,7 +1104,7 @@ "features.ent.heading": "Kurumsal ve MLOps", "features.ent.body": "Hatlar için yapıldı: konteynerler, webhook'lar, yapılandırılmış çıktı, air-gap, model card.", "features.ent.webhook.title": "Webhook bildirimleri", - "features.ent.webhook.body": "Eğitim başlangıcında, başarıda, hatada ve otomatik artefakt silmede Slack, Teams, Discord veya herhangi bir HTTP webhook alıcısına bildirim gönderir. Yapılandırılmış payload — incident aracınıza bağlayın.", + "features.ent.webhook.body": "Eğitim başlangıcında, başarıda, hatada ve otomatik artefakt silmede Slack biçiminde webhook bildirimi gönderir (Teams ve Discord için relay gerekir). Yapılandırılmış payload — incident aracınıza bağlayın.", "features.ent.exp.title": "Deney takibi", "features.ent.exp.body": "report_to üzerinden W&B, MLflow, TensorBoard. Pluggable, hardcoded değil. Ekibinizin zaten kullandığını kullanın.", "features.ent.json.title": "JSON çıktı modu", @@ -1144,7 +1144,7 @@ "features.gov.annex.title": "Annex IV doğrulayıcı", "features.gov.annex.body": "forgelm verify-annex-iv Annex IV §1-9 şema tamlığını ve bundle'ın manifest_hash'ini tampering tespiti için doğrular. (Audit-chain bütünlüğü ayrı bir forgelm verify-audit komutudur.)", "features.gov.gguf.title": "GGUF bütünlük doğrulayıcı", - "features.gov.gguf.body": "forgelm verify-gguf bir kuantize modeli sevk etmeden önce export sırasında damgalanan SHA-256 + boyut manifest'ini yeniden kontrol eder.", + "features.gov.gguf.body": "forgelm verify-gguf bir kuantize modeli sevk etmeden önce GGUF magic header'ını doğrular, metadata bloğunu ayrıştırır ve export sırasında yazılan .sha256 sidecar'ını (varsa) yeniden kontrol eder.", "features.gov.iso.title": "ISO 27001 / SOC 2 hizalaması", "features.gov.iso.body": "Deployer denetçisinin sorduğu audit izi, change-management, veri kökenleri ve tedarik zinciri kanıtları. Yazılım sertifikalı değil, hizalanmıştır.", "features.cta.title": "YAML olarak görmek ister misiniz?", @@ -1171,7 +1171,7 @@ "features.train.qlora": "4-Bit-NF4-Quantisierung mit LoRA. PiSSA-, rsLoRA-, DoRA-Varianten. Trainieren Sie 7B-13B-Modelle auf einer einzigen 12-GB-GPU.", "features.train.galore": "Gradient-Low-Rank-Projection für Full-Parameter-Training ohne LoRA. Speicher auf LoRA-Niveau, Kapazität eines vollen Fine-Tunes.", "features.train.deepspeed.title":"DeepSpeed & FSDP", - "features.train.deepspeed.body":"Multi-GPU-Distributed-Training. ZeRO-2 / ZeRO-3-Presets, FSDP, Unsloth-Backend.", + "features.train.deepspeed.body":"Multi-GPU-Distributed-Training. DeepSpeed ZeRO-2 / ZeRO-3 (eigenes JSON; Preset-Namen brauchen einen Source-Checkout), FSDP, Unsloth-Backend.", "features.train.longctx.title":"Long-Context", "features.train.longctx.body":"RoPE-Scaling, NEFTune-Noise-Injection, Sliding-Window-Attention, Sample-Packing — Training mit 32K-128K-Kontext.", "features.eval.heading": "Evaluierung & Sicherheit", @@ -1183,7 +1183,7 @@ "features.eval.lguard.title": "Llama-Guard-Sicherheit", "features.eval.lguard.body": "Urteile über 14 Schadkategorien (S1-S14), standardmäßig binär bewertet; konfidenzgewichtete Bewertung gilt nur auf dem classification-Pipeline-Pfad. Schweregrade, lauf-übergreifendes Trend-Tracking.", "features.eval.revert.title": "Auto-Revert (Artefakte verwerfen)", - "features.eval.revert.body": "Mit evaluation.auto_revert: true löscht ForgeLM bei verletztem Loss-, Benchmark- oder Sicherheitsschwellwert die trainierten Artefakte, beendet mit 3 und erzeugt einen strukturierten Vorfallsdatensatz. Es gibt keine Rückkehr zu einem früheren Checkpoint — nichts wird wiederhergestellt.", + "features.eval.revert.body": "Mit evaluation.auto_revert: true löscht ForgeLM bei verletztem Loss-, Benchmark- oder Sicherheitsschwellwert die trainierten Artefakte, beendet mit 3 und erzeugt einen strukturierten Vorfallsdatensatz. Es gibt keine Rückkehr zu einem früheren Checkpoint — nichts wird wiederhergestellt. Eine Ausnahme: Eine Sicherheitsbewertung ohne Ergebnis (Klassifikator nicht geladen, Probes fehlen) behält das Modell und endet mit 0.", "features.eval.trend.title": "Trend-Tracking", "features.eval.trend.body": "Lauf-übergreifende Sicherheitshistorie (safety_trend.jsonl pro output_dir). Sehen Sie, ob eine Kategorie stillschweigend driftet, bevor sie den Schwellwert überschreitet.", "features.eval.exit.title": "Exit-Codes", @@ -1209,7 +1209,7 @@ "features.ent.heading": "Enterprise & MLOps", "features.ent.body": "Gebaut für Pipelines: Container, Webhooks, strukturierte Ausgaben, Air-Gap, Model Cards.", "features.ent.webhook.title": "Webhook-Benachrichtigungen", - "features.ent.webhook.body": "Slack-, Teams-, Discord- oder beliebige HTTP-Webhook-Alerts bei Trainingsstart, Erfolg, Fehlschlag, automatischem Verwerfen der Artefakte. Strukturierte Payloads — leiten Sie sie an Ihr Incident-Tool weiter.", + "features.ent.webhook.body": "Slack-formatierte Webhook-Alerts bei Trainingsstart, Erfolg, Fehlschlag, automatischem Verwerfen der Artefakte (Teams und Discord brauchen ein Relay). Strukturierte Payloads — leiten Sie sie an Ihr Incident-Tool weiter.", "features.ent.exp.title": "Experiment-Tracking", "features.ent.exp.body": "W&B, MLflow, TensorBoard via report_to. Pluggable, nicht hartkodiert. Nutzen Sie, was Ihr Team bereits verwendet.", "features.ent.json.title": "JSON-Ausgabemodus", @@ -1250,7 +1250,7 @@ "features.train.qlora": "Quantisation NF4 4-bit avec LoRA. Variantes PiSSA, rsLoRA, DoRA. Entraînez des modèles 7B-13B sur un seul GPU 12 Go.", "features.train.galore": "Projection gradient bas-rang pour entraînement full-parameter sans LoRA. Mémoire au niveau LoRA, capacité d'un fine-tune complet.", "features.train.deepspeed.title":"DeepSpeed & FSDP", - "features.train.deepspeed.body":"Entraînement distribué multi-GPU. Presets ZeRO-2 / ZeRO-3, FSDP, backend Unsloth.", + "features.train.deepspeed.body":"Entraînement distribué multi-GPU. DeepSpeed ZeRO-2 / ZeRO-3 (votre JSON ; les noms de presets exigent un checkout des sources), FSDP, backend Unsloth.", "features.train.longctx.title":"Long-contexte", "features.train.longctx.body":"RoPE scaling, injection de bruit NEFTune, attention à fenêtre glissante, sample packing — entraînez sur 32K-128K de contexte.", "features.eval.heading": "Évaluation & sécurité", @@ -1262,7 +1262,7 @@ "features.eval.lguard.title": "Sécurité Llama Guard", "features.eval.lguard.body": "Verdicts sur 14 catégories de préjudice (S1-S14), notés en binaire par défaut ; le scoring pondéré par confiance ne s'applique que sur le chemin de pipeline classification. Niveaux de sévérité, suivi de tendance inter-exécutions.", "features.eval.revert.title": "Auto-revert (suppression des artefacts)", - "features.eval.revert.body": "Avec evaluation.auto_revert: true, un seuil de loss, benchmark ou sécurité non respecté fait supprimer les artefacts entraînés par ForgeLM, qui sort avec 3 et émet un enregistrement d'incident structuré. Il n'y a aucun retour à un checkpoint antérieur — rien n'est restauré.", + "features.eval.revert.body": "Avec evaluation.auto_revert: true, un seuil de loss, benchmark ou sécurité non respecté fait supprimer les artefacts entraînés par ForgeLM, qui sort avec 3 et émet un enregistrement d'incident structuré. Il n'y a aucun retour à un checkpoint antérieur — rien n'est restauré. Une exception : une évaluation de sécurité qui n'a produit aucun verdict (classifieur non chargé, probes absents) conserve le modèle et sort avec 0.", "features.eval.trend.title": "Suivi de tendance", "features.eval.trend.body": "Historique sécurité inter-exécutions (safety_trend.jsonl par output_dir). Voyez si une catégorie dérive silencieusement avant de franchir le seuil.", "features.eval.exit.title": "Codes de sortie", @@ -1288,7 +1288,7 @@ "features.ent.heading": "Entreprise & MLOps", "features.ent.body": "Conçu pour les pipelines : conteneurs, webhooks, sorties structurées, air-gap, model cards.", "features.ent.webhook.title": "Notifications webhook", - "features.ent.webhook.body": "Alertes Slack, Teams, Discord ou tout récepteur webhook HTTP au démarrage, succès, échec, suppression automatique des artefacts d'entraînement. Payloads structurés — pipez-les vers votre outil d'incident.", + "features.ent.webhook.body": "Alertes webhook au format Slack au démarrage, succès, échec, suppression automatique des artefacts d'entraînement (Teams et Discord nécessitent un relais). Payloads structurés — pipez-les vers votre outil d'incident.", "features.ent.exp.title": "Suivi d'expériences", "features.ent.exp.body": "W&B, MLflow, TensorBoard via report_to. Pluggable, pas codé en dur. Utilisez ce que votre équipe utilise déjà.", "features.ent.json.title": "Mode de sortie JSON", @@ -1329,7 +1329,7 @@ "features.train.qlora": "Cuantización NF4 de 4 bits con LoRA. Variantes PiSSA, rsLoRA, DoRA. Entrene modelos 7B-13B en una sola GPU de 12 GB.", "features.train.galore": "Proyección gradient de rango bajo para entrenamiento full-parameter sin LoRA. Memoria a niveles de LoRA, capacidad de un fine-tune completo.", "features.train.deepspeed.title":"DeepSpeed y FSDP", - "features.train.deepspeed.body":"Entrenamiento distribuido multi-GPU. Presets ZeRO-2 / ZeRO-3, FSDP, backend Unsloth.", + "features.train.deepspeed.body":"Entrenamiento distribuido multi-GPU. DeepSpeed ZeRO-2 / ZeRO-3 (su JSON; los nombres de preset requieren un checkout del código fuente), FSDP, backend Unsloth.", "features.train.longctx.title":"Contexto largo", "features.train.longctx.body":"RoPE scaling, inyección de ruido NEFTune, attention de ventana deslizante, sample packing — entrene en contexto de 32K-128K.", "features.eval.heading": "Evaluación y seguridad", @@ -1341,7 +1341,7 @@ "features.eval.lguard.title": "Seguridad Llama Guard", "features.eval.lguard.body": "Veredictos en 14 categorías de daño (S1-S14), puntuados en binario por defecto; el scoring ponderado por confianza solo aplica en la ruta de pipeline classification. Niveles de severidad, seguimiento de tendencias entre ejecuciones.", "features.eval.revert.title": "Auto-revert (descarte de artefactos)", - "features.eval.revert.body": "Con evaluation.auto_revert: true, si falla un umbral de loss, benchmark o seguridad, ForgeLM elimina los artefactos entrenados, sale con 3 y emite un registro de incidente estructurado. No hay vuelta a un checkpoint anterior — no se restaura nada.", + "features.eval.revert.body": "Con evaluation.auto_revert: true, si falla un umbral de loss, benchmark o seguridad, ForgeLM elimina los artefactos entrenados, sale con 3 y emite un registro de incidente estructurado. No hay vuelta a un checkpoint anterior — no se restaura nada. Una excepción: una evaluación de seguridad que no produjo veredicto (clasificador no cargado, sondas ausentes) conserva el modelo y sale con 0.", "features.eval.trend.title": "Seguimiento de tendencias", "features.eval.trend.body": "Historial de seguridad entre ejecuciones (safety_trend.jsonl por output_dir). Vea si una categoría deriva silenciosamente antes de cruzar el umbral.", "features.eval.exit.title": "Códigos de salida", @@ -1367,7 +1367,7 @@ "features.ent.heading": "Empresa y MLOps", "features.ent.body": "Construido para pipelines: contenedores, webhooks, salidas estructuradas, air-gap, model cards.", "features.ent.webhook.title": "Notificaciones webhook", - "features.ent.webhook.body": "Alertas en Slack, Teams, Discord o cualquier receptor webhook HTTP al inicio, éxito, fallo o descarte automático de los artefactos de entrenamiento. Payloads estructurados — diríjalos a su herramienta de incidentes.", + "features.ent.webhook.body": "Alertas webhook en formato Slack al inicio, éxito, fallo o descarte automático de los artefactos de entrenamiento (Teams y Discord requieren un relay). Payloads estructurados — diríjalos a su herramienta de incidentes.", "features.ent.exp.title": "Seguimiento de experimentos", "features.ent.exp.body": "W&B, MLflow, TensorBoard vía report_to. Conectable, no hardcoded. Use lo que su equipo ya usa.", "features.ent.json.title": "Modo de salida JSON", @@ -1408,7 +1408,7 @@ "features.train.qlora": "带 LoRA 的 4-bit NF4 量化。PiSSA、rsLoRA、DoRA 变体。在单张 12 GB GPU 上训练 7B-13B 模型。", "features.train.galore": "无需 LoRA 的 full-parameter 训练 — gradient 低秩投影。显存达到 LoRA 水平,容量是完整 fine-tune。", "features.train.deepspeed.title":"DeepSpeed & FSDP", - "features.train.deepspeed.body":"多 GPU 分布式训练。ZeRO-2 / ZeRO-3 预设、FSDP、Unsloth 后端。", + "features.train.deepspeed.body":"多 GPU 分布式训练。DeepSpeed ZeRO-2 / ZeRO-3(自带 JSON;预设名称需要源码 checkout)、FSDP、Unsloth 后端。", "features.train.longctx.title":"长上下文", "features.train.longctx.body":"RoPE scaling、NEFTune 噪声注入、滑动窗口 attention、sample packing — 在 32K-128K 上下文上训练。", "features.eval.heading": "评估 & 安全", @@ -1420,7 +1420,7 @@ "features.eval.lguard.title": "Llama Guard 安全", "features.eval.lguard.body": "在 14 个危害类别 (S1-S14) 上给出判定,默认为二元评分;置信度加权评分仅在 classification pipeline 路径上生效。严重性分级、跨运行趋势跟踪。", "features.eval.revert.title": "Auto-revert(丢弃训练产物)", - "features.eval.revert.body": "当 evaluation.auto_revert: true 时,loss、benchmark 或安全阈值不通过会让 ForgeLM 删除训练产物、以 3 退出并发出结构化事件记录。不会回滚到此前的 checkpoint — 不恢复任何内容。", + "features.eval.revert.body": "当 evaluation.auto_revert: true 时,loss、benchmark 或安全阈值不通过会让 ForgeLM 删除训练产物、以 3 退出并发出结构化事件记录。不会回滚到此前的 checkpoint — 不恢复任何内容。一个例外:未能产生结论的安全评估(分类器未加载、probes 缺失)会保留模型并以 0 退出。", "features.eval.trend.title": "趋势跟踪", "features.eval.trend.body": "跨运行的安全历史 (每个 output_dir 的 safety_trend.jsonl)。在某个类别跨过阈值之前看出它是否在悄悄漂移。", "features.eval.exit.title": "退出码", @@ -1446,7 +1446,7 @@ "features.ent.heading": "企业 & MLOps", "features.ent.body": "为 pipeline 构建:容器、webhook、结构化输出、气隙、model card。", "features.ent.webhook.title": "Webhook 通知", - "features.ent.webhook.body": "训练开始、成功、失败、自动丢弃产物时的 Slack、Teams、Discord 或任意 HTTP webhook 接收器的警报。结构化 payload — 接到你的事件工具。", + "features.ent.webhook.body": "训练开始、成功、失败、自动丢弃产物时发出 Slack 格式的 webhook 警报(Teams 和 Discord 需要中继)。结构化 payload — 接到你的事件工具。", "features.ent.exp.title": "实验跟踪", "features.ent.exp.body": "通过 report_to 接入 W&B、MLflow、TensorBoard。可插拔,不写死。用你团队已经在用的。", "features.ent.json.title": "JSON 输出模式", @@ -1678,7 +1678,7 @@ "wizard.step.operations.title": "Operations & advanced settings", "wizard.step.operations.name": "Operations", "wizard.step.operations.desc": "Notifications, external monitoring-plan metadata, synthetic data, and retention settings. Configure the ForgeLM options you need.", - "wizard.step.operations.tutorial": "These four blocks cover everything ForgeLM ships beyond the core training + compliance flow. Webhook posts a Slack/Teams/Discord alert when training starts, succeeds, or fails. Monitoring (Art. 72 / 17(1)(h)) records an external plan as metadata; ForgeLM does not export metrics, detect drift, send drift alerts, or schedule checks. Synthetic data generation lets a stronger teacher model produce extra training examples. Retention horizons set GDPR-compliant TTLs for the audit log and intermediate artefacts. These ForgeLM settings are optional; external legal obligations still apply.", + "wizard.step.operations.tutorial": "These four blocks cover everything ForgeLM ships beyond the core training + compliance flow. Webhook posts a Slack-format alert (Teams and Discord need a relay) when training starts, succeeds, or fails. Monitoring (Art. 72 / 17(1)(h)) records an external plan as metadata; ForgeLM does not export metrics, detect drift, send drift alerts, or schedule checks. Synthetic data generation lets a stronger teacher model produce extra training examples. Retention horizons record how long you intend to keep the audit log and intermediate artefacts; ForgeLM reports what is past them but deletes nothing. These ForgeLM settings are optional; external legal obligations still apply.", "wizard.risk.label": "EU AI Act risk classification", "wizard.risk.hint": "Pick the tier your deployment falls under. High-risk and unacceptable trigger mandatory audit + human-approval obligations.", "wizard.risk.unknown": "Unknown — pre-classification placeholder", @@ -1768,14 +1768,14 @@ "wizard.governance.dpia_completed.label": "DPIA completed (GDPR Art. 35)", "wizard.governance.dpia_completed.hint": "Data Protection Impact Assessment finished and documented for this dataset.", "wizard.webhook.title": "Notifications (webhook)", - "wizard.webhook.hint": "Send Slack / Teams / Discord alerts on training events.", + "wizard.webhook.hint": "Send Slack-format alerts on training events (Teams and Discord need a relay).", "wizard.webhook.url.label": "Webhook URL or env var", "wizard.webhook.url.hint": "Direct https URL or an env var name carrying it (recommended for secrets).", "wizard.webhook.url.placeholder": "https://hooks.slack.com/services/... OR env:SLACK_WEBHOOK_URL", "wizard.webhook.url.detail": "You can paste the URL directly (fine for non-secret test channels) or use the env: prefix to point at an environment variable. The env-var route keeps the URL out of YAML and out of the audit log — required for production secrets.", "wizard.webhook.enabled.label": "Send webhook notifications", "wizard.webhook.enabled.hint": "When on, ForgeLM posts a webhook payload at the events you select. Off keeps the YAML free of any webhook block.", - "wizard.webhook.enabled.detail": "Notifications wire training events into your team chat (Slack / Teams / Discord) or any HTTPS endpoint that accepts JSON. Delivery failures are warnings in the process log only. The audit log records the underlying training events, not delivery attempts. Leave off if you don't want the YAML to carry webhook config at all.", + "wizard.webhook.enabled.detail": "Notifications wire training events into your team chat (Slack; Teams and Discord through a relay) or any HTTPS endpoint that accepts this JSON. Delivery failures are warnings in the process log only. The audit log records the underlying training events, not delivery attempts. Leave off if you don't want the YAML to carry webhook config at all.", "wizard.webhook.notify_start.label": "Notify on training start", "wizard.webhook.notify_success.label": "Notify on success", "wizard.webhook.notify_failure.label": "Notify on failure", @@ -1820,11 +1820,11 @@ "wizard.retention.ephemeral.hint": "How long to keep intermediate checkpoints, eval samples. Default 90.", "wizard.retention.raw_documents.label": "Raw documents (days)", "wizard.retention.raw_documents.hint": "How long to keep raw PDFs / DOCX after ingestion. Default 90.", - "wizard.retention.enforce.label": "Enforce automatic deletion", - "wizard.retention.enforce.hint": "When set, ForgeLM auto-deletes artefacts past their horizon. Off by default — enabling requires GDPR sign-off.", - "wizard.retention.enforce.log_only": "log_only — log violations to audit (default)", - "wizard.retention.enforce.warn": "warn_on_excess — log + stderr warning", - "wizard.retention.enforce.block": "block_on_excess — abort trainer (regulated CI)", + "wizard.retention.enforce.label": "Policy mode (reserved)", + "wizard.retention.enforce.hint": "Reserved: no ForgeLM command acts on this yet, so all three modes behave the same. Retention horizons are only reported by forgelm purge --check-policy; nothing is deleted automatically.", + "wizard.retention.enforce.log_only": "log_only — default (no command acts on it)", + "wizard.retention.enforce.warn": "warn_on_excess — accepted, behaves like log_only", + "wizard.retention.enforce.block": "block_on_excess — accepted, behaves like log_only", "wizard.step.review.title": "Review your config", "wizard.step.review.name": "Review", "wizard.step.review.desc": "Here's the YAML. Copy it, download it, and run.", @@ -1837,7 +1837,7 @@ "wizard.error.model.required": "You picked “Custom HuggingFace model” on the previous step, so this field is required. Enter the org/repo ID (e.g. meta-llama/Llama-3.1-8B-Instruct) or go back and pick one of the bundled presets.", "wizard.error.model.format": "HuggingFace Hub IDs use the org/repo shape (e.g. meta-llama/Llama-3.1-8B-Instruct). A bare name without a slash won’t resolve at training time.", "wizard.error.dataset.required": "Pick a dataset before continuing — without a path or HuggingFace name the trainer has nothing to learn from.", - "wizard.error.webhook.required": "You enabled notifications, so we need a webhook URL or env var to send them to. Either turn notifications off above or paste your Slack / Teams / Discord URL (or env:SLACK_WEBHOOK_URL for production secrets).", + "wizard.error.webhook.required": "You enabled notifications, so we need a webhook URL or env var to send them to. Either turn notifications off above or paste your Slack webhook URL (or a relay URL for Teams / Discord) (or env:SLACK_WEBHOOK_URL for production secrets).", "wizard.error.synthetic.teacher_model.required": "You enabled synthetic data generation, so we need a teacher model name (e.g. gpt-4o, claude-opus-4-7, or a local model path).", "wizard.error.synthetic.seed_file.required": "You enabled synthetic data generation, so we need a seed prompts file — the teacher will produce a response for each prompt in it (e.g. ./data/seed_prompts.jsonl).", "wizard.error.synthetic.api_key_env.required": "You enabled synthetic data generation, so we need the env var that carries the teacher API key — typically OPENAI_API_KEY or ANTHROPIC_API_KEY. Leave the synthetic toggle off if you don’t have one.", @@ -2076,7 +2076,7 @@ "wizard.step.operations.title": "Operasyon ve gelişmiş ayarlar", "wizard.step.operations.name": "Operasyon", "wizard.step.operations.desc": "Bildirimler, harici izleme planı metadata'sı, sentetik veri ve saklama ayarları. Gereken ForgeLM seçeneklerini yapılandır.", - "wizard.step.operations.tutorial": "Bu dört blok, ForgeLM'in temel eğitim + compliance akışının ötesinde sağladığı her şeyi kapsar. Webhook, eğitim başladığında / başarılı olduğunda / hata verdiğinde Slack/Teams/Discord bildirimi gönderir. İzleme (Madde 72 / 17(1)(h)) harici planı metadata olarak kaydeder; ForgeLM metrikleri dışa aktarmaz, drift tespit etmez, drift alarmı göndermez veya kontrol zamanlamaz. Sentetik veri üretimi, daha güçlü bir teacher modelin ek eğitim örnekleri üretmesini sağlar. Saklama ufukları audit log'u ve ara artefact'ları için GDPR uyumlu TTL'ler ayarlar. Bu ForgeLM ayarları isteğe bağlıdır; harici yasal yükümlülükler ayrıca geçerlidir.", + "wizard.step.operations.tutorial": "Bu dört blok, ForgeLM'in temel eğitim + compliance akışının ötesinde sağladığı her şeyi kapsar. Webhook, eğitim başladığında / başarılı olduğunda / hata verdiğinde Slack biçiminde bir bildirim gönderir (Teams ve Discord için relay gerekir). İzleme (Madde 72 / 17(1)(h)) harici planı metadata olarak kaydeder; ForgeLM metrikleri dışa aktarmaz, drift tespit etmez, drift alarmı göndermez veya kontrol zamanlamaz. Sentetik veri üretimi, daha güçlü bir teacher modelin ek eğitim örnekleri üretmesini sağlar. Saklama ufukları audit log'u ve ara artefact'ları ne kadar süre tutmayı planladığınızı kaydeder; ForgeLM ufku aşanı raporlar ama hiçbir şey silmez. Bu ForgeLM ayarları isteğe bağlıdır; harici yasal yükümlülükler ayrıca geçerlidir.", "wizard.risk.label": "EU AI Act risk sınıflandırması", "wizard.risk.hint": "Dağıtımın hangi seviyeye girdiğini seç. High-risk ve unacceptable, zorunlu denetim + insan onay yükümlülüklerini tetikler.", "wizard.risk.unknown": "Unknown — ön sınıflandırma yer tutucusu", @@ -2166,14 +2166,14 @@ "wizard.governance.dpia_completed.label": "DPIA tamamlandı (GDPR Madde 35)", "wizard.governance.dpia_completed.hint": "Bu dataset için Veri Koruma Etki Değerlendirmesi tamamlanmış ve belgelenmiş.", "wizard.webhook.title": "Bildirimler (webhook)", - "wizard.webhook.hint": "Eğitim olaylarında Slack / Teams / Discord bildirimi gönder.", + "wizard.webhook.hint": "Eğitim olaylarında Slack biçiminde bildirim gönder (Teams ve Discord için relay gerekir).", "wizard.webhook.url.label": "Webhook URL veya env değişkeni", "wizard.webhook.url.hint": "Doğrudan https URL veya onu taşıyan env değişkeni adı (gizliler için önerilen).", "wizard.webhook.url.placeholder": "https://hooks.slack.com/services/... VEYA env:SLACK_WEBHOOK_URL", "wizard.webhook.url.detail": "URL'yi doğrudan yapıştırabilirsin (gizli olmayan test kanalları için iyi) ya da bir ortam değişkenine işaret etmek için env: önekini kullan. Env-var yolu URL'yi YAML'den ve audit log'tan dışarıda tutar — production gizliler için zorunlu.", "wizard.webhook.enabled.label": "Webhook bildirimleri gönder", "wizard.webhook.enabled.hint": "Açıkken, ForgeLM seçtiğin olaylarda bir webhook payload gönderir. Kapalıyken YAML herhangi bir webhook bloğu içermez.", - "wizard.webhook.enabled.detail": "Bildirimler eğitim olaylarını ekip sohbetine (Slack / Teams / Discord) veya JSON kabul eden herhangi bir HTTPS endpoint'ine bağlar. Teslimat hataları yalnızca süreç günlüğüne uyarı olarak yazılır. Audit log teslimat denemelerini değil, ilgili eğitim olaylarını kaydeder. YAML'in webhook config taşımasını hiç istemiyorsan kapalı bırak.", + "wizard.webhook.enabled.detail": "Bildirimler eğitim olaylarını ekip sohbetine (Slack; Teams ve Discord için relay üzerinden) veya bu JSON'u kabul eden herhangi bir HTTPS endpoint'ine bağlar. Teslimat hataları yalnızca süreç günlüğüne uyarı olarak yazılır. Audit log teslimat denemelerini değil, ilgili eğitim olaylarını kaydeder. YAML'in webhook config taşımasını hiç istemiyorsan kapalı bırak.", "wizard.webhook.notify_start.label": "Eğitim başında bildir", "wizard.webhook.notify_success.label": "Başarıda bildir", "wizard.webhook.notify_failure.label": "Hatada bildir", @@ -2218,11 +2218,11 @@ "wizard.retention.ephemeral.hint": "Ara checkpoint'ler, eval örnekleri ne kadar tutulsun. Varsayılan 90.", "wizard.retention.raw_documents.label": "Ham dokümanlar (gün)", "wizard.retention.raw_documents.hint": "Ingestion sonrası ham PDF / DOCX ne kadar tutulsun. Varsayılan 90.", - "wizard.retention.enforce.label": "Otomatik silmeyi zorunlu kıl", - "wizard.retention.enforce.hint": "Açıkken ForgeLM ufku aşan artefact'ları otomatik siler. Varsayılan kapalı — açmak GDPR onayı gerektirir.", - "wizard.retention.enforce.log_only": "log_only — ihlalleri audit'e logla (varsayılan)", - "wizard.retention.enforce.warn": "warn_on_excess — log + stderr uyarısı", - "wizard.retention.enforce.block": "block_on_excess — trainer'ı durdur (regüle CI)", + "wizard.retention.enforce.label": "Politika modu (ayrılmış)", + "wizard.retention.enforce.hint": "Ayrılmış: hiçbir ForgeLM komutu bunu henüz kullanmaz, bu yüzden üç mod da aynı davranır. Saklama ufukları yalnızca forgelm purge --check-policy ile raporlanır; hiçbir şey otomatik silinmez.", + "wizard.retention.enforce.log_only": "log_only — varsayılan (hiçbir komut kullanmaz)", + "wizard.retention.enforce.warn": "warn_on_excess — kabul edilir, log_only gibi davranır", + "wizard.retention.enforce.block": "block_on_excess — kabul edilir, log_only gibi davranır", "wizard.step.review.title": "Config'ini gözden geçir", "wizard.step.review.name": "Gözden geçir", "wizard.step.review.desc": "İşte YAML. Kopyala, indir ve çalıştır.", @@ -2235,7 +2235,7 @@ "wizard.error.model.required": "Önceki adımda “Custom HuggingFace model” seçtin, bu yüzden bu alan zorunlu. org/repo formatında bir ID gir (örn. meta-llama/Llama-3.1-8B-Instruct) ya da geri dönüp hazır bir preset seç.", "wizard.error.model.format": "HuggingFace Hub ID'leri org/repo formatında olmalı (örn. meta-llama/Llama-3.1-8B-Instruct). Slash içermeyen düz bir isim eğitim sırasında bulunamaz.", "wizard.error.dataset.required": "Devam etmeden önce bir dataset seç — yol veya HuggingFace ismi olmadan trainer'ın öğreneceği bir şey yok.", - "wizard.error.webhook.required": "Bildirimleri açtın, yani göndereceğimiz bir webhook URL'si veya env değişkeni gerekli. Ya yukarıdan bildirimleri kapat ya da Slack / Teams / Discord URL'ini yapıştır (production gizliler için env:SLACK_WEBHOOK_URL kullan).", + "wizard.error.webhook.required": "Bildirimleri açtın, yani göndereceğimiz bir webhook URL'si veya env değişkeni gerekli. Ya yukarıdan bildirimleri kapat ya da Slack webhook URL'ini (veya Teams / Discord için bir relay URL'ini) yapıştır (production gizliler için env:SLACK_WEBHOOK_URL kullan).", "wizard.error.synthetic.teacher_model.required": "Sentetik veri üretimini açtın, yani bir teacher model adı gerekli (örn. gpt-4o, claude-opus-4-7 veya yerel model yolu).", "wizard.error.synthetic.seed_file.required": "Sentetik veri üretimini açtın, yani bir seed prompts dosyası gerekli — teacher her prompt için yanıt üretir (örn. ./data/seed_prompts.jsonl).", "wizard.error.synthetic.api_key_env.required": "Sentetik veri üretimini açtın, yani teacher API anahtarını taşıyan env değişkeni gerekli — genellikle OPENAI_API_KEY veya ANTHROPIC_API_KEY. Bir tane yoksa sentetik anahtarını kapalı bırak.", @@ -2474,7 +2474,7 @@ "wizard.step.operations.title": "Betrieb & erweiterte Einstellungen", "wizard.step.operations.name": "Betrieb", "wizard.step.operations.desc": "Benachrichtigungen, Metadaten externer Monitoring-Pläne, synthetische Daten und Aufbewahrung. Konfigurieren Sie die benötigten ForgeLM-Optionen.", - "wizard.step.operations.tutorial": "Diese vier Blöcke decken alles ab, was ForgeLM jenseits des Kern-Training + Compliance-Flows liefert. Webhook sendet Slack/Teams/Discord-Alerts bei Trainingsstart/Erfolg/Fehler. Monitoring (Art. 72 / 17(1)(h)) erfasst einen externen Plan als Metadaten; ForgeLM exportiert keine Metriken, erkennt keine Drift, sendet keine Drift-Warnungen und plant keine Kontrollen. Synthetische Datengenerierung lässt ein stärkeres Teacher-Modell zusätzliche Trainingsbeispiele produzieren. Retentions-Horizonte setzen DSGVO-konforme TTLs für Audit-Log und ephemere Artefakte. Diese ForgeLM-Einstellungen sind optional; externe gesetzliche Pflichten gelten weiterhin.", + "wizard.step.operations.tutorial": "Diese vier Blöcke decken alles ab, was ForgeLM jenseits des Kern-Training + Compliance-Flows liefert. Webhook sendet bei Trainingsstart/Erfolg/Fehler einen Slack-formatierten Alert (Teams und Discord brauchen ein Relay). Monitoring (Art. 72 / 17(1)(h)) erfasst einen externen Plan als Metadaten; ForgeLM exportiert keine Metriken, erkennt keine Drift, sendet keine Drift-Warnungen und plant keine Kontrollen. Synthetische Datengenerierung lässt ein stärkeres Teacher-Modell zusätzliche Trainingsbeispiele produzieren. Retentions-Horizonte halten fest, wie lange Sie Audit-Log und ephemere Artefakte aufbewahren wollen; ForgeLM meldet, was darüber hinaus liegt, löscht aber nichts. Diese ForgeLM-Einstellungen sind optional; externe gesetzliche Pflichten gelten weiterhin.", "wizard.risk.label": "EU-AI-Act-Risikoklassifizierung", "wizard.risk.hint": "Wählen Sie die Klasse, unter die Ihr Deployment fällt. High-risk und unacceptable lösen verpflichtende Audit + Human-Approval-Pflichten aus.", "wizard.risk.unknown": "Unknown — Vorklassifizierungs-Platzhalter", @@ -2564,14 +2564,14 @@ "wizard.governance.dpia_completed.label": "DSFA abgeschlossen (DSGVO Art. 35)", "wizard.governance.dpia_completed.hint": "Datenschutz-Folgenabschätzung für diesen Datensatz fertig und dokumentiert.", "wizard.webhook.title": "Benachrichtigungen (Webhook)", - "wizard.webhook.hint": "Slack/Teams/Discord-Alerts bei Trainings-Events senden.", + "wizard.webhook.hint": "Slack-formatierte Alerts bei Trainings-Events senden (Teams und Discord brauchen ein Relay).", "wizard.webhook.url.label": "Webhook-URL oder Env-Variable", "wizard.webhook.url.hint": "Direkte HTTPS-URL oder Env-Variable die sie trägt (für Secrets empfohlen).", "wizard.webhook.url.placeholder": "https://hooks.slack.com/services/... ODER env:SLACK_WEBHOOK_URL", "wizard.webhook.url.detail": "URL kann direkt eingefügt werden, oder via env:-Präfix auf eine Umgebungsvariable verweisen. Env-Variante hält die URL aus YAML + Audit-Log.", "wizard.webhook.enabled.label": "Webhook-Benachrichtigungen senden", "wizard.webhook.enabled.hint": "Wenn aktiv, sendet ForgeLM eine Webhook-Payload bei den ausgewählten Events. Aus = das YAML enthält keinen Webhook-Block.", - "wizard.webhook.enabled.detail": "Benachrichtigungen leiten Trainings-Events in Ihren Team-Chat (Slack / Teams / Discord) oder einen HTTPS-Endpoint, der JSON akzeptiert. Zustellfehler erscheinen nur als Warnungen im Prozesslog. Das Audit-Log erfasst die zugrunde liegenden Trainingsereignisse, keine Zustellversuche. Aus lassen, wenn das YAML keinerlei Webhook-Config tragen soll.", + "wizard.webhook.enabled.detail": "Benachrichtigungen leiten Trainings-Events in Ihren Team-Chat (Slack; Teams und Discord über ein Relay) oder einen HTTPS-Endpoint, der dieses JSON akzeptiert. Zustellfehler erscheinen nur als Warnungen im Prozesslog. Das Audit-Log erfasst die zugrunde liegenden Trainingsereignisse, keine Zustellversuche. Aus lassen, wenn das YAML keinerlei Webhook-Config tragen soll.", "wizard.webhook.notify_start.label": "Bei Trainingsstart benachrichtigen", "wizard.webhook.notify_success.label": "Bei Erfolg benachrichtigen", "wizard.webhook.notify_failure.label": "Bei Fehler benachrichtigen", @@ -2612,11 +2612,11 @@ "wizard.retention.ephemeral.hint": "Wie lange Zwischen-Checkpoints, Eval-Samples behalten. Default 90.", "wizard.retention.raw_documents.label": "Rohdokumente (Tage)", "wizard.retention.raw_documents.hint": "Wie lange rohe PDFs/DOCX nach Ingestion behalten. Default 90.", - "wizard.retention.enforce.label": "Automatische Löschung erzwingen", - "wizard.retention.enforce.hint": "Wenn aktiv löscht ForgeLM Artefakte nach ihrem Horizont automatisch. Default aus.", - "wizard.retention.enforce.log_only": "log_only — Verstöße ins Audit loggen (Default)", - "wizard.retention.enforce.warn": "warn_on_excess — log + stderr-Warnung", - "wizard.retention.enforce.block": "block_on_excess — Trainer abbrechen (regulierte CI)", + "wizard.retention.enforce.label": "Richtlinienmodus (reserviert)", + "wizard.retention.enforce.hint": "Reserviert: Noch wertet kein ForgeLM-Befehl dies aus, daher verhalten sich alle drei Modi gleich. Aufbewahrungshorizonte meldet nur forgelm purge --check-policy; nichts wird automatisch gelöscht.", + "wizard.retention.enforce.log_only": "log_only — Default (kein Befehl wertet es aus)", + "wizard.retention.enforce.warn": "warn_on_excess — wird akzeptiert, verhält sich wie log_only", + "wizard.retention.enforce.block": "block_on_excess — wird akzeptiert, verhält sich wie log_only", "wizard.step.review.title": "Konfiguration prüfen", "wizard.step.review.name": "Prüfen", "wizard.step.review.desc": "Hier ist das YAML. Kopieren, herunterladen und ausführen.", @@ -2629,7 +2629,7 @@ "wizard.error.model.required": "Sie haben im vorherigen Schritt „Custom HuggingFace-Modell“ gewählt — deshalb ist dieses Feld Pflicht. Geben Sie eine org/repo-ID ein (z. B. meta-llama/Llama-3.1-8B-Instruct) oder gehen Sie zurück und wählen Sie ein Preset.", "wizard.error.model.format": "HuggingFace-Hub-IDs verwenden das Format org/repo (z. B. meta-llama/Llama-3.1-8B-Instruct). Ein Name ohne Schrägstrich wird zur Trainingszeit nicht aufgelöst.", "wizard.error.dataset.required": "Wählen Sie ein Dataset, bevor Sie fortfahren — ohne Pfad oder HuggingFace-Namen hat der Trainer nichts zum Lernen.", - "wizard.error.webhook.required": "Sie haben Benachrichtigungen aktiviert — wir brauchen also eine Webhook-URL oder Env-Variable. Schalten Sie Benachrichtigungen oben aus oder fügen Sie Ihre Slack-/Teams-/Discord-URL ein (für Produktion env:SLACK_WEBHOOK_URL).", + "wizard.error.webhook.required": "Sie haben Benachrichtigungen aktiviert — wir brauchen also eine Webhook-URL oder Env-Variable. Schalten Sie Benachrichtigungen oben aus oder fügen Sie Ihre Slack-Webhook-URL (oder eine Relay-URL für Teams / Discord) ein (für Produktion env:SLACK_WEBHOOK_URL).", "wizard.error.synthetic.teacher_model.required": "Sie haben synthetische Datengenerierung aktiviert — wir brauchen einen Teacher-Modellnamen (z. B. gpt-4o, claude-opus-4-7 oder lokaler Pfad).", "wizard.error.synthetic.seed_file.required": "Sie haben synthetische Datengenerierung aktiviert — wir brauchen eine Seed-Prompts-Datei (z. B. ./data/seed_prompts.jsonl); der Teacher generiert pro Prompt eine Antwort.", "wizard.error.synthetic.api_key_env.required": "Sie haben synthetische Datengenerierung aktiviert — wir brauchen die Env-Variable mit dem Teacher-API-Key (üblich: OPENAI_API_KEY oder ANTHROPIC_API_KEY).", @@ -2868,7 +2868,7 @@ "wizard.step.operations.title": "Opérations et paramètres avancés", "wizard.step.operations.name": "Opérations", "wizard.step.operations.desc": "Notifications, métadonnées du plan de surveillance externe, données synthétiques et conservation. Configurez les options ForgeLM nécessaires.", - "wizard.step.operations.tutorial": "Ces quatre blocs couvrent tout ce que ForgeLM offre au-delà du flux core entraînement + compliance. Webhook envoie une alerte Slack/Teams/Discord au démarrage / succès / échec. La surveillance (Art. 72 / 17(1)(h)) enregistre un plan externe comme métadonnées ; ForgeLM n'exporte pas de métriques, ne détecte pas de dérive, n'envoie pas d'alertes de dérive et ne programme aucun contrôle. La génération synthétique laisse un modèle teacher plus fort produire des exemples supplémentaires. Les horizons de rétention fixent des TTL conformes RGPD pour audit log et artefacts éphémères. Ces paramètres ForgeLM sont facultatifs ; les obligations légales externes restent applicables.", + "wizard.step.operations.tutorial": "Ces quatre blocs couvrent tout ce que ForgeLM offre au-delà du flux core entraînement + compliance. Webhook envoie une alerte au format Slack au démarrage / succès / échec (Teams et Discord nécessitent un relais). La surveillance (Art. 72 / 17(1)(h)) enregistre un plan externe comme métadonnées ; ForgeLM n'exporte pas de métriques, ne détecte pas de dérive, n'envoie pas d'alertes de dérive et ne programme aucun contrôle. La génération synthétique laisse un modèle teacher plus fort produire des exemples supplémentaires. Les horizons de rétention consignent combien de temps vous comptez conserver l'audit log et les artefacts éphémères ; ForgeLM signale ce qui les dépasse mais ne supprime rien. Ces paramètres ForgeLM sont facultatifs ; les obligations légales externes restent applicables.", "wizard.risk.label": "Classification de risque EU AI Act", "wizard.risk.hint": "Choisissez le niveau dans lequel votre déploiement tombe. High-risk et unacceptable déclenchent des obligations d'audit + approbation humaine obligatoires.", "wizard.risk.unknown": "Unknown — placeholder de pré-classification", @@ -2958,14 +2958,14 @@ "wizard.governance.dpia_completed.label": "AIPD complétée (RGPD Art. 35)", "wizard.governance.dpia_completed.hint": "Analyse d'Impact Protection Données terminée et documentée pour ce dataset.", "wizard.webhook.title": "Notifications (webhook)", - "wizard.webhook.hint": "Envoyez des alertes Slack/Teams/Discord lors des événements d'entraînement.", + "wizard.webhook.hint": "Envoyez des alertes au format Slack lors des événements d'entraînement (Teams et Discord nécessitent un relais).", "wizard.webhook.url.label": "URL webhook ou variable env", "wizard.webhook.url.hint": "URL HTTPS directe ou variable env la portant (recommandé pour secrets).", "wizard.webhook.url.placeholder": "https://hooks.slack.com/services/... OU env:SLACK_WEBHOOK_URL", "wizard.webhook.url.detail": "Vous pouvez coller URL directement, ou utiliser préfixe env: pour pointer une variable env.", "wizard.webhook.enabled.label": "Envoyer des notifications webhook", "wizard.webhook.enabled.hint": "Quand activé, ForgeLM publie un payload webhook aux événements sélectionnés. Désactivé = le YAML ne contient aucun bloc webhook.", - "wizard.webhook.enabled.detail": "Les notifications connectent les événements d'entraînement à votre chat d'équipe (Slack / Teams / Discord) ou tout endpoint HTTPS acceptant du JSON. Les échecs de livraison sont uniquement des avertissements dans le journal du processus. L'audit log enregistre les événements d'entraînement sous-jacents, pas les tentatives de livraison. Laissez désactivé si vous ne voulez aucune config webhook dans le YAML.", + "wizard.webhook.enabled.detail": "Les notifications connectent les événements d'entraînement à votre chat d'équipe (Slack ; Teams et Discord via un relais) ou tout endpoint HTTPS acceptant ce JSON. Les échecs de livraison sont uniquement des avertissements dans le journal du processus. L'audit log enregistre les événements d'entraînement sous-jacents, pas les tentatives de livraison. Laissez désactivé si vous ne voulez aucune config webhook dans le YAML.", "wizard.webhook.notify_start.label": "Notifier au démarrage", "wizard.webhook.notify_success.label": "Notifier au succès", "wizard.webhook.notify_failure.label": "Notifier à l'échec", @@ -3006,11 +3006,11 @@ "wizard.retention.ephemeral.hint": "Combien de temps garder checkpoints intermédiaires, samples eval. Default 90.", "wizard.retention.raw_documents.label": "Documents bruts (jours)", "wizard.retention.raw_documents.hint": "Combien de temps garder PDFs/DOCX bruts après ingestion. Default 90.", - "wizard.retention.enforce.label": "Forcer suppression automatique", - "wizard.retention.enforce.hint": "Si actif, ForgeLM auto-supprime artefacts après horizon. Off par default.", - "wizard.retention.enforce.log_only": "log_only — logger violations à l'audit (défaut)", - "wizard.retention.enforce.warn": "warn_on_excess — log + avertissement stderr", - "wizard.retention.enforce.block": "block_on_excess — abandonner trainer (CI régulée)", + "wizard.retention.enforce.label": "Mode de politique (réservé)", + "wizard.retention.enforce.hint": "Réservé : aucune commande ForgeLM n'agit encore dessus, donc les trois modes se comportent de la même façon. Les horizons de rétention ne sont signalés que par forgelm purge --check-policy ; rien n'est supprimé automatiquement.", + "wizard.retention.enforce.log_only": "log_only — défaut (aucune commande n'en tient compte)", + "wizard.retention.enforce.warn": "warn_on_excess — accepté, se comporte comme log_only", + "wizard.retention.enforce.block": "block_on_excess — accepté, se comporte comme log_only", "wizard.step.review.title": "Revoir votre configuration", "wizard.step.review.name": "Revoir", "wizard.step.review.desc": "Voici le YAML. Copiez-le, téléchargez-le et exécutez.", @@ -3023,7 +3023,7 @@ "wizard.error.model.required": "Vous avez choisi « Modèle HuggingFace personnalisé » à l’étape précédente — ce champ est donc requis. Saisissez un ID org/repo (ex. meta-llama/Llama-3.1-8B-Instruct) ou revenez en arrière et choisissez un preset.", "wizard.error.model.format": "Les ID HuggingFace Hub utilisent le format org/repo (ex. meta-llama/Llama-3.1-8B-Instruct). Un nom sans barre oblique ne sera pas résolu lors de l’entraînement.", "wizard.error.dataset.required": "Choisissez un dataset avant de continuer — sans chemin ni nom HuggingFace, le trainer n’a rien à apprendre.", - "wizard.error.webhook.required": "Vous avez activé les notifications — il nous faut donc une URL webhook ou une variable d’env. Désactivez les notifications ci-dessus ou collez votre URL Slack / Teams / Discord (pour la production utilisez env:SLACK_WEBHOOK_URL).", + "wizard.error.webhook.required": "Vous avez activé les notifications — il nous faut donc une URL webhook ou une variable d’env. Désactivez les notifications ci-dessus ou collez votre URL de webhook Slack (ou une URL de relais pour Teams / Discord) (pour la production utilisez env:SLACK_WEBHOOK_URL).", "wizard.error.synthetic.teacher_model.required": "Vous avez activé la génération de données synthétiques — il nous faut un nom de modèle teacher (ex. gpt-4o, claude-opus-4-7 ou chemin local).", "wizard.error.synthetic.seed_file.required": "Vous avez activé la génération de données synthétiques — il nous faut un fichier de seed prompts (ex. ./data/seed_prompts.jsonl) ; le teacher produira une réponse par prompt.", "wizard.error.synthetic.api_key_env.required": "Vous avez activé la génération de données synthétiques — il nous faut la variable d’env qui porte la clé API du teacher (généralement OPENAI_API_KEY ou ANTHROPIC_API_KEY).", @@ -3262,7 +3262,7 @@ "wizard.step.operations.title": "Operaciones y ajustes avanzados", "wizard.step.operations.name": "Operaciones", "wizard.step.operations.desc": "Notificaciones, metadatos del plan de monitoreo externo, datos sintéticos y retención. Configure las opciones de ForgeLM que necesite.", - "wizard.step.operations.tutorial": "Estos cuatro bloques cubren todo lo que ForgeLM ofrece más allá del flujo central de entrenamiento + compliance. Webhook envía alerta Slack/Teams/Discord en inicio / éxito / fallo. El monitoreo (Art. 72 / 17(1)(h)) registra un plan externo como metadatos; ForgeLM no exporta métricas, no detecta deriva, no envía alertas de deriva ni programa comprobaciones. La generación sintética permite a un modelo teacher más fuerte producir ejemplos adicionales. Los horizontes de retención fijan TTLs conformes a RGPD para audit log y artefactos efímeros. Estas opciones de ForgeLM son opcionales; las obligaciones legales externas siguen vigentes.", + "wizard.step.operations.tutorial": "Estos cuatro bloques cubren todo lo que ForgeLM ofrece más allá del flujo central de entrenamiento + compliance. Webhook envía una alerta en formato Slack en inicio / éxito / fallo (Teams y Discord requieren un relay). El monitoreo (Art. 72 / 17(1)(h)) registra un plan externo como metadatos; ForgeLM no exporta métricas, no detecta deriva, no envía alertas de deriva ni programa comprobaciones. La generación sintética permite a un modelo teacher más fuerte producir ejemplos adicionales. Los horizontes de retención registran cuánto tiempo piensa conservar el audit log y los artefactos efímeros; ForgeLM informa de lo que los supera pero no elimina nada. Estas opciones de ForgeLM son opcionales; las obligaciones legales externas siguen vigentes.", "wizard.risk.label": "Clasificación de riesgo EU AI Act", "wizard.risk.hint": "Elija el nivel en el que cae su despliegue. High-risk y unacceptable activan obligaciones obligatorias de auditoría + aprobación humana.", "wizard.risk.unknown": "Unknown — placeholder de pre-clasificación", @@ -3352,14 +3352,14 @@ "wizard.governance.dpia_completed.label": "EIPD completada (RGPD Art. 35)", "wizard.governance.dpia_completed.hint": "Evaluación de Impacto sobre Protección de Datos terminada para este dataset.", "wizard.webhook.title": "Notificaciones (webhook)", - "wizard.webhook.hint": "Envíe alertas Slack/Teams/Discord en eventos de entrenamiento.", + "wizard.webhook.hint": "Envíe alertas en formato Slack en eventos de entrenamiento (Teams y Discord requieren un relay).", "wizard.webhook.url.label": "URL webhook o variable env", "wizard.webhook.url.hint": "URL HTTPS directa o variable env que la lleva (recomendado para secretos).", "wizard.webhook.url.placeholder": "https://hooks.slack.com/services/... O env:SLACK_WEBHOOK_URL", "wizard.webhook.url.detail": "Puede pegar URL directamente, o usar prefijo env: para apuntar a una variable de entorno.", "wizard.webhook.enabled.label": "Enviar notificaciones webhook", "wizard.webhook.enabled.hint": "Cuando está activo, ForgeLM publica un payload webhook en los eventos seleccionados. Apagado = el YAML no contiene ningún bloque webhook.", - "wizard.webhook.enabled.detail": "Las notificaciones conectan eventos de entrenamiento a su chat de equipo (Slack / Teams / Discord) o cualquier endpoint HTTPS que acepte JSON. Los fallos de entrega solo se registran como advertencias en el registro del proceso. El audit log registra los eventos de entrenamiento subyacentes, no los intentos de entrega. Déjelo apagado si no quiere ninguna config de webhook en el YAML.", + "wizard.webhook.enabled.detail": "Las notificaciones conectan eventos de entrenamiento a su chat de equipo (Slack; Teams y Discord mediante un relay) o cualquier endpoint HTTPS que acepte este JSON. Los fallos de entrega solo se registran como advertencias en el registro del proceso. El audit log registra los eventos de entrenamiento subyacentes, no los intentos de entrega. Déjelo apagado si no quiere ninguna config de webhook en el YAML.", "wizard.webhook.notify_start.label": "Notificar al inicio", "wizard.webhook.notify_success.label": "Notificar en éxito", "wizard.webhook.notify_failure.label": "Notificar en fallo", @@ -3400,11 +3400,11 @@ "wizard.retention.ephemeral.hint": "Cuánto guardar checkpoints intermedios, samples eval. Default 90.", "wizard.retention.raw_documents.label": "Documentos crudos (días)", "wizard.retention.raw_documents.hint": "Cuánto guardar PDFs/DOCX crudos tras ingestion. Default 90.", - "wizard.retention.enforce.label": "Forzar eliminación automática", - "wizard.retention.enforce.hint": "Si activo, ForgeLM auto-elimina artefactos tras su horizonte. Default off.", - "wizard.retention.enforce.log_only": "log_only — registrar violaciones en audit (default)", - "wizard.retention.enforce.warn": "warn_on_excess — log + advertencia stderr", - "wizard.retention.enforce.block": "block_on_excess — abortar trainer (CI regulada)", + "wizard.retention.enforce.label": "Modo de política (reservado)", + "wizard.retention.enforce.hint": "Reservado: ningún comando de ForgeLM actúa aún sobre esto, así que los tres modos se comportan igual. Los horizontes de retención solo los informa forgelm purge --check-policy; nada se elimina automáticamente.", + "wizard.retention.enforce.log_only": "log_only — default (ningún comando lo usa)", + "wizard.retention.enforce.warn": "warn_on_excess — aceptado, se comporta como log_only", + "wizard.retention.enforce.block": "block_on_excess — aceptado, se comporta como log_only", "wizard.step.review.title": "Revise su configuración", "wizard.step.review.name": "Revisar", "wizard.step.review.desc": "Aquí está el YAML. Cópielo, descárguelo y ejecútelo.", @@ -3417,7 +3417,7 @@ "wizard.error.model.required": "Eligió “Modelo HuggingFace personalizado” en el paso anterior, por lo que este campo es obligatorio. Ingrese un ID org/repo (ej. meta-llama/Llama-3.1-8B-Instruct) o regrese y elija un preset.", "wizard.error.model.format": "Los ID de HuggingFace Hub usan el formato org/repo (ej. meta-llama/Llama-3.1-8B-Instruct). Un nombre sin barra no se resolverá al entrenar.", "wizard.error.dataset.required": "Elija un dataset antes de continuar — sin una ruta o nombre de HuggingFace, el trainer no tiene de qué aprender.", - "wizard.error.webhook.required": "Activó las notificaciones, así que necesitamos una URL de webhook o variable de entorno. Desactive las notificaciones arriba o pegue su URL de Slack / Teams / Discord (para producción use env:SLACK_WEBHOOK_URL).", + "wizard.error.webhook.required": "Activó las notificaciones, así que necesitamos una URL de webhook o variable de entorno. Desactive las notificaciones arriba o pegue su URL de webhook de Slack (o una URL de relay para Teams / Discord) (para producción use env:SLACK_WEBHOOK_URL).", "wizard.error.synthetic.teacher_model.required": "Activó la generación de datos sintéticos, así que necesitamos un nombre de modelo teacher (ej. gpt-4o, claude-opus-4-7 o ruta local).", "wizard.error.synthetic.seed_file.required": "Activó la generación de datos sintéticos, así que necesitamos un archivo de seed prompts (ej. ./data/seed_prompts.jsonl); el teacher producirá una respuesta por cada prompt.", "wizard.error.synthetic.api_key_env.required": "Activó la generación de datos sintéticos, así que necesitamos la variable de entorno con la clave API del teacher (típicamente OPENAI_API_KEY o ANTHROPIC_API_KEY).", @@ -3656,7 +3656,7 @@ "wizard.step.operations.title": "运维与高级设置", "wizard.step.operations.name": "运维", "wizard.step.operations.desc": "通知、外部监控计划元数据、合成数据和保留设置。配置所需的 ForgeLM 选项。", - "wizard.step.operations.tutorial": "这四个区块涵盖了 ForgeLM 在核心训练 + 合规流程之外提供的一切。Webhook 在训练开始 / 成功 / 失败时发送 Slack/Teams/Discord 警报。监控(第 72 条及第 17(1)(h) 条)仅将外部计划记录为元数据;ForgeLM 不导出指标、检测漂移、发送漂移警报或安排检查。合成数据生成让更强的 teacher 模型产生额外训练样本。保留期限为审计日志和临时 artefact 设置符合 GDPR 的 TTL。这些 ForgeLM 设置是可选的;外部法律义务仍然适用。", + "wizard.step.operations.tutorial": "这四个区块涵盖了 ForgeLM 在核心训练 + 合规流程之外提供的一切。Webhook 在训练开始 / 成功 / 失败时发送 Slack 格式的警报(Teams 和 Discord 需要中继)。监控(第 72 条及第 17(1)(h) 条)仅将外部计划记录为元数据;ForgeLM 不导出指标、检测漂移、发送漂移警报或安排检查。合成数据生成让更强的 teacher 模型产生额外训练样本。保留期限记录你打算保留审计日志和临时 artefact 的时长;ForgeLM 会报告超期的内容,但不会删除任何内容。这些 ForgeLM 设置是可选的;外部法律义务仍然适用。", "wizard.risk.label": "EU AI Act 风险分类", "wizard.risk.hint": "选择你的部署所属的等级。High-risk 和 unacceptable 触发强制审计 + 人工批准义务。", "wizard.risk.unknown": "Unknown — 预分类占位符", @@ -3746,14 +3746,14 @@ "wizard.governance.dpia_completed.label": "DPIA 已完成(GDPR 第 35 条)", "wizard.governance.dpia_completed.hint": "本数据集的数据保护影响评估已完成并记录。", "wizard.webhook.title": "通知(webhook)", - "wizard.webhook.hint": "在训练事件发送 Slack/Teams/Discord 警报。", + "wizard.webhook.hint": "在训练事件发送 Slack 格式的警报(Teams 和 Discord 需要中继)。", "wizard.webhook.url.label": "Webhook URL 或环境变量", "wizard.webhook.url.hint": "直接 https URL 或承载它的环境变量名(secret 推荐)。", "wizard.webhook.url.placeholder": "https://hooks.slack.com/services/... 或 env:SLACK_WEBHOOK_URL", "wizard.webhook.url.detail": "你可以直接粘贴 URL,或使用 env: 前缀指向环境变量。", "wizard.webhook.enabled.label": "发送 webhook 通知", "wizard.webhook.enabled.hint": "启用后,ForgeLM 在你选择的事件发送 webhook payload。关闭 = YAML 不包含任何 webhook 块。", - "wizard.webhook.enabled.detail": "通知将训练事件连接到你的团队聊天(Slack / Teams / Discord)或任何接受 JSON 的 HTTPS 端点。发送失败仅在进程日志中记录为警告。审计日志记录对应的训练事件,不记录发送尝试。如果不想 YAML 中包含任何 webhook 配置,保持关闭。", + "wizard.webhook.enabled.detail": "通知将训练事件连接到你的团队聊天(Slack;Teams 和 Discord 需通过中继)或任何接受此 JSON 的 HTTPS 端点。发送失败仅在进程日志中记录为警告。审计日志记录对应的训练事件,不记录发送尝试。如果不想 YAML 中包含任何 webhook 配置,保持关闭。", "wizard.webhook.notify_start.label": "训练开始时通知", "wizard.webhook.notify_success.label": "成功时通知", "wizard.webhook.notify_failure.label": "失败时通知", @@ -3794,11 +3794,11 @@ "wizard.retention.ephemeral.hint": "中间 checkpoint、eval 样本保留多久。默认 90。", "wizard.retention.raw_documents.label": "原始文档(天)", "wizard.retention.raw_documents.hint": "ingestion 后原始 PDF/DOCX 保留多久。默认 90。", - "wizard.retention.enforce.label": "强制自动删除", - "wizard.retention.enforce.hint": "启用后,ForgeLM 在期限后自动删除 artefact。默认关闭。", - "wizard.retention.enforce.log_only": "log_only — 将违规记录到 audit(默认)", - "wizard.retention.enforce.warn": "warn_on_excess — log + stderr 警告", - "wizard.retention.enforce.block": "block_on_excess — 中止 trainer(受监管 CI)", + "wizard.retention.enforce.label": "策略模式(保留)", + "wizard.retention.enforce.hint": "保留项:目前没有任何 ForgeLM 命令使用它,因此三种模式行为相同。保留期限仅由 forgelm purge --check-policy 报告;不会自动删除任何内容。", + "wizard.retention.enforce.log_only": "log_only — 默认(没有命令使用它)", + "wizard.retention.enforce.warn": "warn_on_excess — 可接受,行为与 log_only 相同", + "wizard.retention.enforce.block": "block_on_excess — 可接受,行为与 log_only 相同", "wizard.step.review.title": "审查你的配置", "wizard.step.review.name": "审查", "wizard.step.review.desc": "这是 YAML。复制、下载并运行。", @@ -3811,7 +3811,7 @@ "wizard.error.model.required": "你在上一步选择了\"自定义 HuggingFace 模型\",所以此字段为必填。输入 org/repo 格式的 ID(如 meta-llama/Llama-3.1-8B-Instruct)或返回上一步选择一个预设。", "wizard.error.model.format": "HuggingFace Hub ID 使用 org/repo 格式(如 meta-llama/Llama-3.1-8B-Instruct)。不带斜杠的纯名称在训练时无法解析。", "wizard.error.dataset.required": "继续之前请选择一个数据集 — 没有路径或 HuggingFace 名称,trainer 没有可学习的对象。", - "wizard.error.webhook.required": "你启用了通知,所以需要一个 webhook URL 或环境变量。要么关闭上方的通知,要么粘贴你的 Slack / Teams / Discord URL(生产环境密钥请使用 env:SLACK_WEBHOOK_URL)。", + "wizard.error.webhook.required": "你启用了通知,所以需要一个 webhook URL 或环境变量。要么关闭上方的通知,要么粘贴你的 Slack webhook URL(或用于 Teams / Discord 的中继 URL)(生产环境密钥请使用 env:SLACK_WEBHOOK_URL)。", "wizard.error.synthetic.teacher_model.required": "你启用了合成数据生成,所以需要一个 teacher 模型名(如 gpt-4o、claude-opus-4-7 或本地模型路径)。", "wizard.error.synthetic.seed_file.required": "你启用了合成数据生成,所以需要一个 seed prompts 文件(如 ./data/seed_prompts.jsonl);teacher 会为每个 prompt 生成一个回应。", "wizard.error.synthetic.api_key_env.required": "你启用了合成数据生成,所以需要承载 teacher API 密钥的环境变量(通常是 OPENAI_API_KEY 或 ANTHROPIC_API_KEY)。", @@ -3862,15 +3862,15 @@ "compliance.art13.title": "Transparency", "compliance.art13.body": "Auto-generated model card lists capabilities, intended use, training data summary, evaluation results, known limitations. Drop-in for HuggingFace Hub README.", "compliance.art14.title": "Human oversight", - "compliance.art14.body": "Optional evaluation.require_human_approval: true moves the trained checkpoint into a staging directory; forgelm approve / forgelm reject + forgelm approvals drive the dual-controlled sign-off, all stamped into the audit log.", + "compliance.art14.body": "Optional evaluation.require_human_approval: true moves the trained checkpoint into a staging directory; forgelm approve / forgelm reject + forgelm approvals record a human sign-off, with the approver identity stamped into the audit log. It supports design-time oversight documentation; oversight of the deployed system stays with the deployer.", "compliance.art15.title": "Accuracy & robustness", - "compliance.art15.body": "Benchmark gates per-task floor; if the post-train number drops below the floor, the run fails (exit 3). Cybersecurity: secrets / PII at ingest, dependency CVE awareness.", + "compliance.art15.body": "Benchmark gates per-task floor; with evaluation.auto_revert: true, a post-train number below the floor deletes the trained artefacts and the run exits 3. Cybersecurity: secrets / PII at ingest, dependency CVE awareness.", "compliance.art1617.title": "Conformity & QMS", "compliance.art1617.body": "QMS SOPs in docs/qms/ cover model training, data management, incident response, and change management — plus access control, encryption-at-rest, risk treatment, and Statement of Applicability. Conformity declaration template generated from the run's Annex IV.", "compliance.gdpr.title": "PII redaction at ingest", - "compliance.gdpr.body": "--pii-mask redacts emails, phones, credit cards (Luhn), IBAN, national IDs (TR/DE/FR/US-SSN) before chunks land in JSONL — Article 5(1)(c) data minimisation enforced upstream.", + "compliance.gdpr.body": "--pii-mask redacts emails, phones, credit cards (Luhn), IBAN, national IDs (TR/DE/FR/US-SSN) before chunks land in JSONL. It reduces what reaches training and supports data minimisation (Article 5(1)(c)); names and free text are not detected, so it is an aid, not a guarantee.", "compliance.gdpr15.title": "Right of access", - "compliance.gdpr15.body": "forgelm reverse-pii scans masked JSONL corpora for plaintext residuals or salted SHA-256 digests of a data-subject identifier and reports every row of every split where that subject appears, satisfying the access-request side of the GDPR's data-subject rights.", + "compliance.gdpr15.body": "forgelm reverse-pii scans masked JSONL corpora for plaintext residuals or salted SHA-256 digests of a data-subject identifier and reports every row of every split where that subject appears. It finds only what is literally in the files you scan: raw sources and the trained model are not searched, and handling an access request stays your process.", "compliance.gdpr17.title": "Right to erasure", "compliance.gdpr17.body": "forgelm purge deletes a data-subject's rows from training corpora and stamps data.erasure_requested + data.erasure_completed events into the append-only audit log so post-deletion runs are forensically linked to the erasure event.", "compliance.iso.eyebrow": "ISO 27001 · SOC 2 Type II", @@ -3879,7 +3879,7 @@ "compliance.iso.audit.title": "Audit trail", "compliance.iso.audit.body": "Append-only audit_log.jsonl per run with HMAC + SHA-256 hash chain + genesis manifest sidecar. forgelm verify-audit validates the chain end-to-end. HMAC integrity is active whenever FORGELM_AUDIT_SECRET is set; for audit-grade custody, keep that secret KMS-managed and rotated per output-dir lifecycle.", "compliance.iso.change.title":"Change control", - "compliance.iso.change.body": "Article 14 staging gate (forgelm approve / forgelm reject) plus human_approval.required/granted/rejected audit events plus forgelm verify-audit chain integrity — every model promotion is dual-controlled and forensically attributed.", + "compliance.iso.change.body": "Article 14 staging gate (forgelm approve / forgelm reject) plus human_approval.required/granted/rejected audit events plus forgelm verify-audit chain integrity — with the gate on, every model promotion is attributed to the recorded approver identity; keeping trainer and approver different people is the deployer's control.", "compliance.iso.lineage.title":"Data lineage", "compliance.iso.lineage.body":"data_provenance.json (SHA-256 fingerprint + size + mtime + HF Hub revision pin, graded by whether a pinned load stands behind it) and data_governance_report.json (collection method, annotation process, known biases, personal-data flag, DPIA completion) cover the lineage questions an auditor asks first.", "compliance.iso.supply.title":"Supply chain", @@ -3921,15 +3921,15 @@ "compliance.art13.title": "Şeffaflık", "compliance.art13.body": "Otomatik üretilen model card; yetenekleri, amaçlanan kullanımı, eğitim veri özetini, değerlendirme sonuçlarını, bilinen sınırlamaları listeler. HuggingFace Hub README için drop-in.", "compliance.art14.title": "İnsan gözetimi", - "compliance.art14.body": "Opsiyonel evaluation.require_human_approval: true eğitilen checkpoint'i staging dizinine taşır; forgelm approve / forgelm reject + forgelm approvals ikili-kontrollü onayı yürütür ve hepsi audit log'a damgalanır.", + "compliance.art14.body": "Opsiyonel evaluation.require_human_approval: true eğitilen checkpoint'i staging dizinine taşır; forgelm approve / forgelm reject + forgelm approvals bir insan onayını kaydeder, onaylayanın kimliği audit log'a damgalanır. Tasarım-zamanı gözetim dokümantasyonunu destekler; dağıtılmış sistemin gözetimi dağıtıcıda kalır.", "compliance.art15.title": "Doğruluk ve sağlamlık", - "compliance.art15.body": "Görev başı taban için benchmark kapısı; post-train sayısı tabanın altına düşerse koşu başarısız (exit 3). Siber güvenlik: ingest'te sırlar / PII, bağımlılık CVE farkındalığı.", + "compliance.art15.body": "Görev başı taban için benchmark kapısı; evaluation.auto_revert: true iken eğitim sonrası sayı tabanın altına düşerse eğitilen artefaktlar silinir ve koşu 3 ile çıkar. Siber güvenlik: ingest'te sırlar / PII, bağımlılık CVE farkındalığı.", "compliance.art1617.title": "Uygunluk ve QMS", "compliance.art1617.body": "docs/qms/'deki QMS SOP'ları model eğitimi, veri yönetimi, incident response ve değişiklik yönetimini kapsar — ayrıca erişim kontrolü, durağan-veri şifrelemesi, risk tedavisi ve Uygulanabilirlik Beyanı. Uygunluk beyanı şablonu koşunun Annex IV'ünden üretilir.", "compliance.gdpr.title": "Ingest'te PII redaksiyonu", - "compliance.gdpr.body": "--pii-mask chunk'lar JSONL'a düşmeden e-posta, telefon, kredi kartı (Luhn), IBAN, ulusal kimlik (TR/DE/FR/US-SSN) maskeler — Madde 5(1)(c) data minimisation upstream'de uygulanır.", + "compliance.gdpr.body": "--pii-mask chunk'lar JSONL'a düşmeden e-posta, telefon, kredi kartı (Luhn), IBAN, ulusal kimlik (TR/DE/FR/US-SSN) maskeler. Eğitime ulaşanı azaltır ve veri minimizasyonunu (Madde 5(1)(c)) destekler; isimler ve serbest metin tespit edilmez, bu yüzden bir yardımcıdır, garanti değildir.", "compliance.gdpr15.title": "Erişim hakkı", - "compliance.gdpr15.body": "forgelm reverse-pii maskelenmiş JSONL corpus'larında bir veri sahibi tanımlayıcısının düz-metin kalıntılarını veya tuzlanmış SHA-256 digest'lerini arar ve o öznenin geçtiği her split'in her satırını raporlar; GDPR veri sahibi haklarının erişim-talebi tarafını karşılar.", + "compliance.gdpr15.body": "forgelm reverse-pii maskelenmiş JSONL corpus'larında bir veri sahibi tanımlayıcısının düz-metin kalıntılarını veya tuzlanmış SHA-256 digest'lerini arar ve o öznenin geçtiği her split'in her satırını raporlar. Yalnızca taradığınız dosyalarda harfiyen bulunanı bulur: ham kaynaklar ve eğitilmiş model aranmaz; bir erişim talebini yürütmek sizin sürecinizde kalır.", "compliance.gdpr17.title": "Silme hakkı", "compliance.gdpr17.body": "forgelm purge bir veri sahibinin satırlarını eğitim corpus'undan siler ve append-only audit log'a data.erasure_requested + data.erasure_completed olaylarını damgalar; silme sonrası çalışmalar adli olarak silme olayına bağlanır.", "compliance.iso.eyebrow": "ISO 27001 · SOC 2 Type II", @@ -3938,7 +3938,7 @@ "compliance.iso.audit.title": "Audit izi", "compliance.iso.audit.body": "Her çalışma için HMAC + SHA-256 hash zinciri + genesis manifest sidecar ile append-only audit_log.jsonl. forgelm verify-audit zinciri uçtan uca doğrular. HMAC bütünlüğü FORGELM_AUDIT_SECRET ayarlandığı anda aktiftir; denetim-seviyesi koruma için bu sırrı KMS-yönetimli tutun ve output-dir yaşam-döngüsüne göre rotate edin.", "compliance.iso.change.title":"Değişiklik kontrolü", - "compliance.iso.change.body": "Madde 14 staging kapısı (forgelm approve / forgelm reject) artı human_approval.required/granted/rejected audit olayları artı forgelm verify-audit zincir bütünlüğü — her model terfi ikili kontrol altındadır ve adli olarak atfedilebilir.", + "compliance.iso.change.body": "Madde 14 staging kapısı (forgelm approve / forgelm reject) artı human_approval.required/granted/rejected audit olayları artı forgelm verify-audit zincir bütünlüğü — kapı açıkken her model terfi kaydedilen onaylayan kimliğine atfedilir; eğiticinin ve onaylayanın farklı kişiler olması dağıtıcının kontrolüdür.", "compliance.iso.lineage.title":"Veri kökenleri", "compliance.iso.lineage.body":"data_provenance.json (SHA-256 parmak izi + boyut + mtime + HF Hub revision pin — arkasında sabitlenmiş bir yükleme olup olmadığına göre derecelendirilir) ve data_governance_report.json (toplama yöntemi, anotasyon süreci, bilinen bias, kişisel-veri bayrağı, DPIA tamamlanması) — denetçinin önce sorduğu köken sorularını kapsar.", "compliance.iso.supply.title":"Tedarik zinciri", @@ -3980,13 +3980,13 @@ "compliance.art13.title": "Transparenz", "compliance.art13.body": "Automatisch generierte Model Card listet Fähigkeiten, beabsichtigten Einsatz, Trainingsdaten-Zusammenfassung, Evaluierungsergebnisse, bekannte Einschränkungen. Drop-in für das HuggingFace-Hub-README.", "compliance.art14.title": "Menschliche Aufsicht", - "compliance.art14.body": "Optionales evaluation.require_human_approval: true verschiebt den trainierten Checkpoint in ein Staging-Verzeichnis; forgelm approve / forgelm reject + forgelm approvals steuern die dual-kontrollierte Freigabe, alles im Audit-Log gestempelt.", + "compliance.art14.body": "Optionales evaluation.require_human_approval: true verschiebt den trainierten Checkpoint in ein Staging-Verzeichnis; forgelm approve / forgelm reject + forgelm approvals erfassen eine menschliche Freigabe, die Identität des Freigebenden wird im Audit-Log gestempelt. Das unterstützt die Dokumentation der Aufsicht zur Entwurfszeit; die Aufsicht über das ausgelieferte System bleibt beim Betreiber.", "compliance.art15.title": "Genauigkeit & Robustheit", - "compliance.art15.body": "Benchmark-Gate mit Schwellwert pro Task; fällt die Post-Train-Zahl unter den Schwellwert, schlägt der Lauf fehl (Exit 3). Cybersicherheit: Secrets / PII beim Ingest, Bewusstsein für Dependency-CVEs.", + "compliance.art15.body": "Benchmark-Gate mit Schwellwert pro Task; mit evaluation.auto_revert: true löscht eine Post-Train-Zahl unter dem Schwellwert die trainierten Artefakte, und der Lauf endet mit Exit 3. Cybersicherheit: Secrets / PII beim Ingest, Bewusstsein für Dependency-CVEs.", "compliance.art1617.title": "Konformität & QMS", "compliance.art1617.body": "QMS-SOPs in docs/qms/ decken Model-Training, Datenmanagement, Incident Response und Änderungsmanagement ab — plus Zugriffskontrolle, Verschlüsselung-im-Ruhezustand, Risikobehandlung und Statement of Applicability. Konformitätserklärungs-Vorlage wird aus dem Annex IV des Laufs generiert.", "compliance.gdpr.title": "PII-Schwärzung beim Ingest", - "compliance.gdpr.body": "--pii-mask schwärzt E-Mails, Telefone, Kreditkarten (Luhn), IBAN, nationale IDs (TR/DE/FR/US-SSN), bevor Chunks im JSONL landen — Artikel 5(1)(c) Datenminimierung wird upstream durchgesetzt.", + "compliance.gdpr.body": "--pii-mask schwärzt E-Mails, Telefone, Kreditkarten (Luhn), IBAN, nationale IDs (TR/DE/FR/US-SSN), bevor Chunks im JSONL landen. Es verringert, was ins Training gelangt, und unterstützt die Datenminimierung (Artikel 5(1)(c)); Namen und Freitext werden nicht erkannt — es ist also eine Hilfe, keine Garantie.", "compliance.artifact.eyebrow":"Was Sie auf der Festplatte erhalten", "compliance.artifact.title": "Der Compliance-Fußabdruck eines Laufs", "compliance.artifact.lead": "Nach jedem erfolgreichen (oder fehlgeschlagenen) Lauf landet das in Ihrem Output-Verzeichnis.", @@ -4023,13 +4023,13 @@ "compliance.art13.title": "Transparence", "compliance.art13.body": "Model card auto-générée listant capacités, usage prévu, résumé des données d'entraînement, résultats d'évaluation, limitations connues. Drop-in pour le README HuggingFace Hub.", "compliance.art14.title": "Supervision humaine", - "compliance.art14.body": "Optionnel evaluation.require_human_approval: true déplace le checkpoint entraîné dans un répertoire de staging ; forgelm approve / forgelm reject + forgelm approvals pilotent la signature sous double contrôle, le tout estampillé dans le log d'audit.", + "compliance.art14.body": "Optionnel evaluation.require_human_approval: true déplace le checkpoint entraîné dans un répertoire de staging ; forgelm approve / forgelm reject + forgelm approvals enregistrent une validation humaine, l'identité de l'approbateur étant estampillée dans le log d'audit. Cela appuie la documentation de la supervision à la conception ; la supervision du système déployé reste à la charge du déployeur.", "compliance.art15.title": "Précision & robustesse", - "compliance.art15.body": "Gate de benchmark avec plancher par tâche ; si le chiffre post-entraînement passe sous le plancher, l'exécution échoue (exit 3). Cybersécurité : secrets / PII à l'ingestion, conscience des CVE de dépendances.", + "compliance.art15.body": "Gate de benchmark avec plancher par tâche ; avec evaluation.auto_revert: true, un chiffre post-entraînement sous le plancher supprime les artefacts entraînés et l'exécution se termine avec exit 3. Cybersécurité : secrets / PII à l'ingestion, conscience des CVE de dépendances.", "compliance.art1617.title": "Conformité & QMS", "compliance.art1617.body": "Les SOP QMS dans docs/qms/ couvrent l'entraînement du modèle, la gestion des données, la réponse aux incidents et la gestion du changement — plus le contrôle d'accès, le chiffrement au repos, le traitement des risques et la Déclaration d'applicabilité. Modèle de déclaration de conformité généré à partir de l'Annex IV de l'exécution.", "compliance.gdpr.title": "Masquage PII à l'ingestion", - "compliance.gdpr.body": "--pii-mask masque e-mails, téléphones, cartes de crédit (Luhn), IBAN, identifiants nationaux (TR/DE/FR/US-SSN) avant que les chunks n'atterrissent dans le JSONL — la minimisation des données de l'Article 5(1)(c) est appliquée en amont.", + "compliance.gdpr.body": "--pii-mask masque e-mails, téléphones, cartes de crédit (Luhn), IBAN, identifiants nationaux (TR/DE/FR/US-SSN) avant que les chunks n'atterrissent dans le JSONL. Il réduit ce qui atteint l'entraînement et soutient la minimisation des données (Article 5(1)(c)) ; les noms et le texte libre ne sont pas détectés, c'est donc une aide, pas une garantie.", "compliance.artifact.eyebrow":"Ce que vous obtenez sur disque", "compliance.artifact.title": "L'empreinte de conformité d'une exécution", "compliance.artifact.lead": "Après chaque exécution réussie (ou échouée), voici ce qui atterrit dans votre répertoire de sortie.", @@ -4066,13 +4066,13 @@ "compliance.art13.title": "Transparencia", "compliance.art13.body": "Model card auto-generada que lista capacidades, uso previsto, resumen de datos de entrenamiento, resultados de evaluación, limitaciones conocidas. Drop-in para el README de HuggingFace Hub.", "compliance.art14.title": "Supervisión humana", - "compliance.art14.body": "Opcional evaluation.require_human_approval: true mueve el checkpoint entrenado a un directorio de staging; forgelm approve / forgelm reject + forgelm approvals conducen la firma de doble control, todo estampado en el log de auditoría.", + "compliance.art14.body": "Opcional evaluation.require_human_approval: true mueve el checkpoint entrenado a un directorio de staging; forgelm approve / forgelm reject + forgelm approvals registran una aprobación humana, con la identidad del aprobador estampada en el log de auditoría. Apoya la documentación de la supervisión en tiempo de diseño; la supervisión del sistema desplegado sigue a cargo del desplegador.", "compliance.art15.title": "Precisión y robustez", - "compliance.art15.body": "Puerta de benchmark con piso por tarea; si el número post-entrenamiento cae bajo el piso, la ejecución falla (exit 3). Ciberseguridad: secretos / PII en la ingestión, conciencia de CVE de dependencias.", + "compliance.art15.body": "Puerta de benchmark con piso por tarea; con evaluation.auto_revert: true, un número post-entrenamiento bajo el piso elimina los artefactos entrenados y la ejecución termina con exit 3. Ciberseguridad: secretos / PII en la ingestión, conciencia de CVE de dependencias.", "compliance.art1617.title": "Conformidad y QMS", "compliance.art1617.body": "Los SOPs QMS en docs/qms/ cubren entrenamiento del modelo, gestión de datos, respuesta a incidentes y gestión de cambios — más control de acceso, cifrado en reposo, tratamiento de riesgos y Declaración de Aplicabilidad. La plantilla de declaración de conformidad se genera a partir del Annex IV de la ejecución.", "compliance.gdpr.title": "Redacción PII en la ingestión", - "compliance.gdpr.body": "--pii-mask redacta emails, teléfonos, tarjetas de crédito (Luhn), IBAN, IDs nacionales (TR/DE/FR/US-SSN) antes de que los chunks lleguen al JSONL — la minimización de datos del Artículo 5(1)(c) se aplica aguas arriba.", + "compliance.gdpr.body": "--pii-mask redacta emails, teléfonos, tarjetas de crédito (Luhn), IBAN, IDs nacionales (TR/DE/FR/US-SSN) antes de que los chunks lleguen al JSONL. Reduce lo que llega al entrenamiento y apoya la minimización de datos (Artículo 5(1)(c)); los nombres y el texto libre no se detectan, por lo que es una ayuda, no una garantía.", "compliance.artifact.eyebrow":"Lo que obtiene en disco", "compliance.artifact.title": "La huella de cumplimiento de una ejecución", "compliance.artifact.lead": "Después de cada ejecución exitosa (o fallida), esto es lo que cae en su directorio de salida.", @@ -4109,13 +4109,13 @@ "compliance.art13.title": "透明度", "compliance.art13.body": "自动生成的 model card 列出能力、预期用途、训练数据摘要、评估结果、已知限制。对 HuggingFace Hub README 即插即用。", "compliance.art14.title": "人工监督", - "compliance.art14.body": "可选的 evaluation.require_human_approval: true 将训练好的 checkpoint 移到 staging 目录;forgelm approve / forgelm reject + forgelm approvals 驱动双重控制的签字流程,全部盖戳到审计日志。", + "compliance.art14.body": "可选的 evaluation.require_human_approval: true 将训练好的 checkpoint 移到 staging 目录;forgelm approve / forgelm reject + forgelm approvals 记录人工签字,批准人身份会盖戳到审计日志。它支持设计阶段的监督文档;已部署系统的监督仍由部署方负责。", "compliance.art15.title": "准确性 & 鲁棒性", - "compliance.art15.body": "Benchmark gate 按任务设阈值;如果 post-train 数值跌破阈值,运行失败 (exit 3)。网络安全:ingest 时的 secrets / PII、依赖 CVE 意识。", + "compliance.art15.body": "Benchmark gate 按任务设阈值;启用 evaluation.auto_revert: true 时,post-train 数值跌破阈值会删除训练产物,运行以 exit 3 结束。网络安全:ingest 时的 secrets / PII、依赖 CVE 意识。", "compliance.art1617.title": "符合性 & QMS", "compliance.art1617.body": "docs/qms/ 中的 QMS SOP 涵盖模型训练、数据管理、事件响应、变更管理 — 以及访问控制、静态加密、风险处置和适用性声明。符合性声明模板从运行的 Annex IV 生成。", "compliance.gdpr.title": "ingest 时的 PII 屏蔽", - "compliance.gdpr.body": "--pii-mask 在 chunk 进入 JSONL 之前屏蔽邮箱、电话、信用卡 (Luhn)、IBAN、国家身份证 (TR/DE/FR/US-SSN) — Article 5(1)(c) 数据最小化在上游执行。", + "compliance.gdpr.body": "--pii-mask 在 chunk 进入 JSONL 之前屏蔽邮箱、电话、信用卡 (Luhn)、IBAN、国家身份证 (TR/DE/FR/US-SSN)。它减少进入训练的内容并支持数据最小化 (Article 5(1)(c));姓名和自由文本不会被检测,因此它是辅助手段,而非保证。", "compliance.artifact.eyebrow":"你在磁盘上得到什么", "compliance.artifact.title": "一次运行的合规足迹", "compliance.artifact.lead": "每次成功 (或失败) 的运行之后,这些会落入你的输出目录。", @@ -4452,7 +4452,7 @@ /* ── Phase 22 / pass-4: backfill missing compliance + features keys (was H6 i18n gap) ── */ Object.assign(T.de, { "compliance.gdpr15.title": "Auskunftsrecht", - "compliance.gdpr15.body": "forgelm reverse-pii durchsucht maskierte JSONL-Korpora nach Klartextresten oder gesalzenen SHA-256-Digests einer Betroffenenkennung und meldet jede Zeile jedes Splits, in der die betroffene Person erscheint, und erfüllt damit die Auskunftsseite der DSGVO-Betroffenenrechte.", + "compliance.gdpr15.body": "forgelm reverse-pii durchsucht maskierte JSONL-Korpora nach Klartextresten oder gesalzenen SHA-256-Digests einer Betroffenenkennung und meldet jede Zeile jedes Splits, in der die betroffene Person erscheint. Es findet nur, was wörtlich in den gescannten Dateien steht: Rohquellen und das trainierte Modell werden nicht durchsucht, und die Bearbeitung eines Auskunftsersuchens bleibt Ihr Prozess.", "compliance.gdpr17.title": "Recht auf Löschung", "compliance.gdpr17.body": "forgelm purge löscht die Zeilen einer betroffenen Person aus Trainingskorpora und stempelt data.erasure_requested + data.erasure_completed-Ereignisse in das Append-only-Audit-Log, sodass Läufe nach der Löschung forensisch mit dem Löschereignis verknüpft sind.", "compliance.iso.title": "Aligned, nicht zertifiziert", @@ -4461,7 +4461,7 @@ "compliance.iso.audit.title": "Audit-Trail", "compliance.iso.audit.body": "Append-only audit_log.jsonl pro Lauf mit HMAC- + SHA-256-Hashkette + Genesis-Manifest-Sidecar. forgelm verify-audit validiert die Kette Ende-zu-Ende. HMAC-Integrität ist aktiv, sobald FORGELM_AUDIT_SECRET gesetzt ist; für audittaugliche Schlüsselverwahrung halten Sie dieses Secret KMS-verwaltet und rotieren es pro output-dir-Lebenszyklus.", "compliance.iso.change.title": "Änderungskontrolle", - "compliance.iso.change.body": "Artikel-14-Staging-Gate (forgelm approve / forgelm reject) plus human_approval.required/granted/rejected-Audit-Ereignisse plus forgelm verify-audit-Kettenintegrität — jede Modellfreigabe ist dual-kontrolliert und forensisch zugeordnet.", + "compliance.iso.change.body": "Artikel-14-Staging-Gate (forgelm approve / forgelm reject) plus human_approval.required/granted/rejected-Audit-Ereignisse plus forgelm verify-audit-Kettenintegrität — bei aktivem Gate wird jede Modellfreigabe der erfassten Identität des Freigebenden zugeordnet; dass Trainer und Freigebender verschiedene Personen sind, ist die Kontrolle des Betreibers.", "compliance.iso.lineage.title": "Daten-Lineage", "compliance.iso.lineage.body": "data_provenance.json (SHA-256-Fingerprint + Größe + mtime + HF-Hub-Revisions-Pin, abgestuft danach, ob ein gepinnter Ladevorgang dahintersteht) und data_governance_report.json (Erhebungsmethode, Annotationsprozess, bekannte Verzerrungen, Personenbezogen-Daten-Flag, DPIA-Abschluss) decken die Lineage-Fragen ab, die ein Auditor zuerst stellt.", "compliance.iso.supply.title": "Supply Chain", @@ -4476,7 +4476,7 @@ "features.gov.approve.title": "Artikel-14-Staging-Gate", "features.gov.approve.body": "forgelm approve / forgelm reject + forgelm approvals implementieren das Human-Oversight-Staging-Verzeichnis mit audit-gestempelter Freigabe.", "features.gov.gguf.title": "GGUF-Integritäts-Verifier", - "features.gov.gguf.body": "forgelm verify-gguf prüft das beim Export gestempelte SHA-256- + Größen-Manifest erneut, bevor Sie ein quantisiertes Modell ausliefern.", + "features.gov.gguf.body": "forgelm verify-gguf validiert den GGUF-Magic-Header, parst den Metadatenblock und prüft das beim Export geschriebene .sha256-Sidecar (sofern vorhanden) erneut, bevor Sie ein quantisiertes Modell ausliefern.", "features.gov.iso.title": "ISO 27001 / SOC 2 Alignment", "features.gov.iso.body": "Audit-Trail-, Change-Management-, Daten-Lineage- und Supply-Chain-Nachweise, nach denen der Auditor des Deployers fragt. Die Software ist aligned, nicht zertifiziert.", "features.gov.purge.title": "DSGVO-Artikel-17-Löschung", @@ -4498,7 +4498,7 @@ /* ── Phase 22 / pass-4: backfill missing compliance + features keys (was H6 i18n gap) ── */ Object.assign(T.fr, { "compliance.gdpr15.title": "Droit d'accès", - "compliance.gdpr15.body": "forgelm reverse-pii scanne les corpus JSONL masqués à la recherche de résidus en clair ou de digests SHA-256 salés d'un identifiant de personne concernée et signale chaque ligne de chaque split où cette personne apparaît, satisfaisant le volet droit d'accès des droits des personnes concernées du RGPD.", + "compliance.gdpr15.body": "forgelm reverse-pii scanne les corpus JSONL masqués à la recherche de résidus en clair ou de digests SHA-256 salés d'un identifiant de personne concernée et signale chaque ligne de chaque split où cette personne apparaît. Il ne trouve que ce qui figure littéralement dans les fichiers scannés : les sources brutes et le modèle entraîné ne sont pas parcourus, et le traitement d'une demande d'accès reste votre processus.", "compliance.gdpr17.title": "Droit à l'effacement", "compliance.gdpr17.body": "forgelm purge supprime les lignes d'une personne concernée des corpus d'entraînement et estampille les événements data.erasure_requested + data.erasure_completed dans le log d'audit append-only, de sorte que les exécutions post-suppression soient liées de manière forensique à l'événement d'effacement.", "compliance.iso.title": "Aligné, non certifié", @@ -4507,7 +4507,7 @@ "compliance.iso.audit.title": "Piste d'audit", "compliance.iso.audit.body": "audit_log.jsonl append-only par exécution avec chaîne de hash HMAC + SHA-256 + manifest genesis en sidecar. forgelm verify-audit valide la chaîne de bout en bout. L'intégrité HMAC est active dès que FORGELM_AUDIT_SECRET est défini ; pour une conservation de niveau audit, gardez ce secret géré par KMS et tourné selon le cycle de vie de l'output-dir.", "compliance.iso.change.title": "Contrôle des changements", - "compliance.iso.change.body": "Gate de staging Article 14 (forgelm approve / forgelm reject) plus événements d'audit human_approval.required/granted/rejected plus intégrité de chaîne forgelm verify-audit — chaque promotion de modèle est sous double contrôle et attribuée de manière forensique.", + "compliance.iso.change.body": "Gate de staging Article 14 (forgelm approve / forgelm reject) plus événements d'audit human_approval.required/granted/rejected plus intégrité de chaîne forgelm verify-audit — avec le gate actif, chaque promotion de modèle est attribuée à l'identité enregistrée de l'approbateur ; faire en sorte que l'entraîneur et l'approbateur soient des personnes différentes relève du contrôle du déployeur.", "compliance.iso.lineage.title": "Traçabilité des données", "compliance.iso.lineage.body": "data_provenance.json (empreinte SHA-256 + taille + mtime + pin de révision HF Hub, gradué selon qu'un chargement épinglé le garantit ou non) et data_governance_report.json (méthode de collecte, processus d'annotation, biais connus, drapeau données personnelles, complétion DPIA) couvrent les questions de traçabilité qu'un auditeur pose en premier.", "compliance.iso.supply.title": "Supply chain", @@ -4522,7 +4522,7 @@ "features.gov.approve.title": "Gate de staging Article 14", "features.gov.approve.body": "forgelm approve / forgelm reject + forgelm approvals implémentent le répertoire de staging de supervision humaine avec signature audit-estampillée.", "features.gov.gguf.title": "Vérificateur d'intégrité GGUF", - "features.gov.gguf.body": "forgelm verify-gguf revérifie le manifest SHA-256 + taille estampillé au moment de l'export avant que vous n'expédiiez un modèle quantisé.", + "features.gov.gguf.body": "forgelm verify-gguf valide l'en-tête magique GGUF, analyse le bloc de métadonnées et revérifie le fichier .sha256 écrit lors de l'export (s'il est présent) avant que vous n'expédiiez un modèle quantisé.", "features.gov.iso.title": "Alignement ISO 27001 / SOC 2", "features.gov.iso.body": "Preuves d'audit-trail, de gestion du changement, de traçabilité des données et de supply chain que l'auditeur du déployeur demande. Le logiciel est aligné, non certifié.", "features.gov.purge.title": "Effacement RGPD Article 17", @@ -4544,7 +4544,7 @@ /* ── Phase 22 / pass-4: backfill missing compliance + features keys (was H6 i18n gap) ── */ Object.assign(T.es, { "compliance.gdpr15.title": "Derecho de acceso", - "compliance.gdpr15.body": "forgelm reverse-pii escanea corpus JSONL enmascarados en busca de residuos en texto claro o digests SHA-256 salados de un identificador de interesado y reporta cada fila de cada split donde aparece ese sujeto, satisfaciendo el lado de solicitud de acceso de los derechos del interesado del RGPD.", + "compliance.gdpr15.body": "forgelm reverse-pii escanea corpus JSONL enmascarados en busca de residuos en texto claro o digests SHA-256 salados de un identificador de interesado y reporta cada fila de cada split donde aparece ese sujeto. Solo encuentra lo que figura literalmente en los archivos que escanea: no busca en las fuentes sin procesar ni en el modelo entrenado, y la gestión de una solicitud de acceso sigue siendo su proceso.", "compliance.gdpr17.title": "Derecho de supresión", "compliance.gdpr17.body": "forgelm purge elimina las filas de un interesado de los corpus de entrenamiento y estampa eventos data.erasure_requested + data.erasure_completed en el log de auditoría append-only, de modo que las ejecuciones posteriores a la supresión queden vinculadas forensemente al evento de borrado.", "compliance.iso.title": "Alineado, no certificado", @@ -4553,7 +4553,7 @@ "compliance.iso.audit.title": "Pista de auditoría", "compliance.iso.audit.body": "audit_log.jsonl append-only por ejecución con cadena de hash HMAC + SHA-256 + manifiesto genesis en sidecar. forgelm verify-audit valida la cadena de extremo a extremo. La integridad HMAC está activa en cuanto FORGELM_AUDIT_SECRET está definido; para custodia de nivel auditoría, mantén ese secreto gestionado por KMS y rotado por ciclo de vida del output-dir.", "compliance.iso.change.title": "Control de cambios", - "compliance.iso.change.body": "Gate de staging del Artículo 14 (forgelm approve / forgelm reject) más eventos de auditoría human_approval.required/granted/rejected más integridad de cadena forgelm verify-audit — cada promoción de modelo es de control dual y atribuida forensemente.", + "compliance.iso.change.body": "Gate de staging del Artículo 14 (forgelm approve / forgelm reject) más eventos de auditoría human_approval.required/granted/rejected más integridad de cadena forgelm verify-audit — con el gate activo, cada promoción de modelo se atribuye a la identidad registrada del aprobador; que entrenador y aprobador sean personas distintas es un control del desplegador.", "compliance.iso.lineage.title": "Trazabilidad de datos", "compliance.iso.lineage.body": "data_provenance.json (huella SHA-256 + tamaño + mtime + pin de revisión HF Hub, graduado según si una carga anclada lo respalda) y data_governance_report.json (método de recolección, proceso de anotación, sesgos conocidos, marca de datos personales, completitud DPIA) cubren las preguntas de trazabilidad que un auditor hace primero.", "compliance.iso.supply.title": "Cadena de suministro", @@ -4568,7 +4568,7 @@ "features.gov.approve.title": "Gate de staging del Artículo 14", "features.gov.approve.body": "forgelm approve / forgelm reject + forgelm approvals implementan el directorio de staging de supervisión humana con firma estampada en auditoría.", "features.gov.gguf.title": "Verificador de integridad GGUF", - "features.gov.gguf.body": "forgelm verify-gguf reverifica el manifiesto SHA-256 + tamaño estampado en el momento del export antes de que envíe un modelo cuantizado.", + "features.gov.gguf.body": "forgelm verify-gguf valida la cabecera mágica GGUF, analiza el bloque de metadatos y reverifica el sidecar .sha256 escrito durante el export (si existe) antes de que envíe un modelo cuantizado.", "features.gov.iso.title": "Alineamiento ISO 27001 / SOC 2", "features.gov.iso.body": "Pruebas de pista de auditoría, gestión de cambios, trazabilidad de datos y cadena de suministro que pide el auditor del deployer. El software está alineado, no certificado.", "features.gov.purge.title": "Supresión RGPD Artículo 17", @@ -4590,7 +4590,7 @@ /* ── Phase 22 / pass-4: backfill missing compliance + features keys (was H6 i18n gap) ── */ Object.assign(T.zh, { "compliance.gdpr15.title": "访问权", - "compliance.gdpr15.body": "forgelm reverse-pii 扫描已掩码的 JSONL 语料库,查找数据主体标识的明文残留或加盐 SHA-256 摘要,并报告该主体出现的每个 split 的每一行,满足 GDPR 数据主体权利的访问请求一侧。", + "compliance.gdpr15.body": "forgelm reverse-pii 扫描已掩码的 JSONL 语料库,查找数据主体标识的明文残留或加盐 SHA-256 摘要,并报告该主体出现的每个 split 的每一行。它只能找到所扫描文件中字面存在的内容:不会搜索原始来源或已训练的模型,处理访问请求仍是你的流程。", "compliance.gdpr17.title": "删除权", "compliance.gdpr17.body": "forgelm purge 从训练语料中删除某个数据主体的行,并在 append-only 审计日志中盖上 data.erasure_requested + data.erasure_completed 事件,使删除后的运行在取证上与该删除事件相连。", "compliance.iso.title": "对齐,而非认证", @@ -4599,7 +4599,7 @@ "compliance.iso.audit.title": "审计追踪", "compliance.iso.audit.body": "每次运行的 append-only audit_log.jsonl,带 HMAC + SHA-256 哈希链 + 创世清单 sidecar。forgelm verify-audit 端到端验证该链。只要设置了 FORGELM_AUDIT_SECRET,HMAC 完整性即生效;为达到审计级密钥保管,请将该密钥交由 KMS 管理并按 output-dir 生命周期轮换。", "compliance.iso.change.title": "变更控制", - "compliance.iso.change.body": "第 14 条 staging gate (forgelm approve / forgelm reject) 加上 human_approval.required/granted/rejected 审计事件,加上 forgelm verify-audit 链完整性 — 每次模型晋升均为双重控制并可在取证上追溯。", + "compliance.iso.change.body": "第 14 条 staging gate (forgelm approve / forgelm reject) 加上 human_approval.required/granted/rejected 审计事件,加上 forgelm verify-audit 链完整性 — 启用该 gate 时,每次模型晋升都归属于所记录的批准人身份;训练者与批准人是否为不同的人,由部署方控制。", "compliance.iso.lineage.title": "数据血缘", "compliance.iso.lineage.body": "data_provenance.json (SHA-256 指纹 + 大小 + mtime + HF Hub 修订版本固定,按其背后是否有一次固定加载分级) 与 data_governance_report.json (采集方法、标注流程、已知偏见、个人数据标记、DPIA 完成情况) 覆盖审计员最先问的血缘问题。", "compliance.iso.supply.title": "供应链", @@ -4614,7 +4614,7 @@ "features.gov.approve.title": "第 14 条 staging gate", "features.gov.approve.body": "forgelm approve / forgelm reject + forgelm approvals 通过审计盖章的签字实现人工监督 staging 目录。", "features.gov.gguf.title": "GGUF 完整性验证器", - "features.gov.gguf.body": "forgelm verify-gguf 在你交付量化模型之前重新校验 export 时盖好的 SHA-256 + 大小 manifest。", + "features.gov.gguf.body": "forgelm verify-gguf 在你交付量化模型之前,校验 GGUF 魔数头、解析 metadata 块,并(若存在)根据 export 时写入的 .sha256 sidecar 文件重新校验。", "features.gov.iso.title": "ISO 27001 / SOC 2 对齐", "features.gov.iso.body": "deployer 的审计员需要的审计追踪、变更管理、数据血缘和供应链证据。软件是对齐,而不是被认证。", "features.gov.purge.title": "GDPR 第 17 条删除", diff --git a/site/js/wizard.js b/site/js/wizard.js index 49ec3646..ca3dd6ab 100644 --- a/site/js/wizard.js +++ b/site/js/wizard.js @@ -271,10 +271,11 @@ retentionStaging: 7, retentionEphemeral: 90, retentionRawDocuments: 90, - // Policy enforcement: 'log_only' (default; logs to audit only), - // 'warn_on_excess' (stderr warning), 'block_on_excess' (aborts - // trainer with EXIT_EVAL_FAILURE). Schema Literal — must use - // one of these three values. + // Policy mode: 'log_only' (default), 'warn_on_excess' or + // 'block_on_excess'. Schema Literal — must use one of these three + // values. Reserved: no ForgeLM command reads it yet, so all three + // behave the same (retention is only reported by + // `forgelm purge --check-policy`). retentionEnforce: 'log_only', // Track which steps the operator tried to advance past while // failing required-field validation. The renderer reads this to diff --git a/site/quickstart.html b/site/quickstart.html index 291757f1..87805ced 100644 --- a/site/quickstart.html +++ b/site/quickstart.html @@ -217,8 +217,13 @@

Install

$ pip install 'forgelm[export]==0.11.0' # GGUF export # sanity-check your environment before the first run -$ forgelm doctor -✓ Python 3.11.7 · CUDA 12.1 · bitsandbytes ok · disk 142 GB free +$ forgelm doctor --offline +forgelm doctor - environment check + [+ pass] python.version Python 3.11.4 (CPython). + [+ pass] disk.workspace Workspace /home/me/forgelm — 387.0 GiB free of 500.0 GiB. + [! warn] operator.identity FORGELM_OPERATOR not set; audit events will fall back to 'me@workstation'. ... + ... (about 19 rows; values depend on your machine) +Summary: 7 pass, 12 warn, 0 fail.
diff --git a/tests/site/site_translations.test.cjs b/tests/site/site_translations.test.cjs index 6db1c3e3..4cabd82b 100644 --- a/tests/site/site_translations.test.cjs +++ b/tests/site/site_translations.test.cjs @@ -28,3 +28,32 @@ test('a string a page shows as plain text holds no markup or HTML entity', () => } assert.deepEqual(literal, []); }); + +// Site copy that promised more than the code does (the Wave 0 triage). The English and Turkish tiers are matched +// by phrase; the other four locales are checked for a token every translation of the corrected string keeps. +test('claims the code does not back stay out of the site copy', () => { + const { translations } = loadWizard(); + const site = path.join(root, 'site'); + const retired = { + en: [/dual-control/i, /\bauto-deletes\b/, /run fails \(exit 3\)/, /satisfying the access-request/, + /Slack, Teams, Discord, or any HTTP/, /Slack \/ Teams \/ Discord/, /enforced upstream/, /GDPR-compliant TTLs/, + /SHA-256 \+ size manifest/, /6 quant levels and SHA-256 manifest/, /ZeRO-2 \/ ZeRO-3 presets/, + /PII redacted at ingest/, /GGUF export at q4_k_m/], + tr: [/ikili[- ]kontrol/i, /otomatik siler/, /GDPR uyumlu TTL/, /erişim-talebi tarafını karşılar/, + /Slack, Teams, Discord veya/, /Slack \/ Teams \/ Discord/, /upstream'de uygulanır/], + }; + const found = []; + for (const [locale, patterns] of Object.entries(retired)) { + for (const [key, value] of Object.entries(translations[locale])) { + for (const pattern of patterns) if (pattern.test(value)) found.push(`${locale} ${key}: ${pattern}`); + } + } + for (const page of fs.readdirSync(site).filter(name => name.endsWith('.html'))) { + const html = fs.readFileSync(path.join(site, page), 'utf8'); + for (const pattern of retired.en) if (pattern.test(html)) found.push(`${page}: ${pattern}`); + } + assert.deepEqual(found, []); + for (const [locale, table] of Object.entries(translations)) { + assert.match(table['wizard.retention.enforce.hint'], /--check-policy/, `${locale}: retention is only reported`); + } +}); diff --git a/tools/generate_sbom.py b/tools/generate_sbom.py index 47b5b5ce..1b32f9dd 100644 --- a/tools/generate_sbom.py +++ b/tools/generate_sbom.py @@ -3,8 +3,9 @@ Reads the installed package set via ``pip list --format=json`` and renders a CycloneDX 1.5 JSON document on stdout. Pure stdlib, cross-platform — used by -the ``publish.yml`` cross-OS matrix to attach a per-(os, python-version) SBOM -artifact to every tagged release. +the ``publish.yml`` cross-OS matrix, which uploads a per-(os, python-version) SBOM +as a workflow-run artifact of every tag's publish run (it is not attached to the +GitHub release, and run artifacts expire after the repository's retention period). This is intentionally a hand-rolled emitter rather than the optional ``cyclonedx-bom`` PyPI package: keeping the dependency footprint at zero means