Skip to content

docs(usermanuals): rewrite the GDPR / KVKK page to what ForgeLM does - #986

Closed
cemililik wants to merge 1 commit into
developmentfrom
docs/wave0-gdpr-page-claims
Closed

cemililik wants to merge 1 commit into
developmentfrom
docs/wave0-gdpr-page-claims

Conversation

@cemililik

@cemililik cemililik commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

The user-manual GDPR / KVKK page promised more than the code delivers, in the place a data-protection officer would read first. It said that identifiable subjects are removed before training, that "no specific person's data is recoverable from the model" and that "the audit report confirms this". This rewrites the page to what ForgeLM does, in English and Turkish.

Related issues

Refs #101 — the documentation half for this page. The website strings that repeat the same claims (site/js/translations.js, six locales) are a separate change and #101 stays open for them.

Changes — each row shows what it said and what it says now

Where Said Now says
PII masking "By the time data lands in JSONL, identifiable subjects are removed" masks eight identifier formats (email, phone, card, IBAN, TR/DE/FR/US national IDs); names, addresses, free text are not detected; the patterns lean towards missing a borderline match; coverage is partial
Example an ingestion: pii_mask: YAML block the real command, forgelm ingest … --pii-mask (the YAML block does not exist; the schema-drift guard skips unknown top-level keys, which is how it passed)
Audit report rows attributed to source documents, SHA-256 manifest for tamper-evidence counts and summaries, the audit's own metadata and an optional Croissant card; no source attribution, no manifest; the report is not written to the audit log (erasure and access requests are)
Retention "auto-delete originals", "record the intended TTL in the audit log" horizons are reported, not enforced: forgelm purge --check-policy lists what is overdue and always exits 0; nothing is deleted or logged for it
Reverse-PII "No matches found in masked data. … no specific person's data is recoverable from the model. The audit report confirms this." zero matches is a valid answer about the files you scanned, nothing more; the raw sources and the model are not covered
Memorisation "Detect memorisation: the audit step flags rows that overlap with known PII patterns" memorisation is not measured; ForgeLM does not test whether a trained model reproduces a string
International transfers "Set international_transfers.enabled: true" there is no such setting; record the safeguards in your DPIA

The access and erasure sections now point at commands that exist: forgelm reverse-pii to find a subject's identifier in the files you give it, forgelm purge --row-id to remove rows (both write to the audit log), and the raw sources searched separately.

What this changes for a deployer

A DPIA or an audit response can no longer cite this page for "personal data is removed before training" or "the model cannot reproduce a person's data". That is the point: the page now states what the detectors cover and that the coverage is partial. Please read the new wording of the first and last rows; it is yours to approve.

Not done here

  • The site strings (home.*, features.* and the privacy copy in six locales).
  • Whether ForgeLM should ever measure memorisation.

Type

  • Documentation

Testing

  • The full CLAUDE.md gauntlet from a clean worktree of this branch: exit 0 (bilingual parity, code-block parity, anchors, usermanual self-contained links, schema drift, YAML snippets).

Checklist

  • English and Turkish mirrors updated together (Turkish wording needs the owner's review)
  • CHANGELOG entry under [Unreleased]

🤖 Generated with Claude Code

Summary by Sourcery

Rewrite the GDPR/KVKK documentation in English and Turkish to accurately describe ForgeLM’s compliance capabilities, limitations, and operator responsibilities.

Enhancements:

  • Align the English and Turkish GDPR/KVKK user-manual pages with ForgeLM’s actual capabilities and limitations, including partial PII masking coverage, audit-report contents, retention behavior, and the lack of model memorisation measurement.
  • Document the supported commands and responsibilities for data-subject access, erasure, raw-source searches, retention checks, and international-transfer safeguards.

Documentation:

  • Replace nonexistent configuration examples and unsupported compliance claims with the actual forgelm ingest, forgelm reverse-pii, forgelm purge, and retention-policy workflows.
  • Clarify that masking, audits, and reverse-PII scans do not guarantee removal of personal data or anonymity of trained models.

Chores:

  • Add a CHANGELOG entry for the corrected GDPR/KVKK documentation.

The page promised more than the code delivers, in the place a data-protection officer would read first:

- "By the time data lands in JSONL, identifiable subjects are removed" and "no specific person's data is recoverable from
  the model. The audit report confirms this." ForgeLM masks eight identifier formats (email, phone, card, IBAN and the
  TR/DE/FR/US national IDs); names, addresses and free text are not detected, the patterns are tuned to miss borderline
  matches, and nothing measures what a trained model remembers.
- "Detect memorisation: the audit step flags rows that overlap with known PII patterns" described PII detection as if it
  were memorisation detection.
- The audit report was said to attribute rows to source documents and to carry a SHA-256 manifest. It does neither
  (it records counts and summaries, the audit's own metadata, and an optional Croissant card) and is not written to the
  audit log.
- `retention` was said to "auto-delete originals" and to "record the intended TTL in the audit log". The horizons are
  only reported by `forgelm purge --check-policy`, which always exits 0.
- An `ingestion: pii_mask:` YAML block and an `international_transfers.enabled` setting were shown; neither exists
  (the schema-drift guard skips unknown top-level keys, which is how they passed).

The access and erasure sections now point at what exists: `forgelm reverse-pii` to find a subject's identifier in the
files you give it, `forgelm purge --row-id` to remove rows (both write to the audit log), and the raw sources searched
separately. English and Turkish.

A reader can no longer cite this page for "personal data is removed before training" or "the model cannot reproduce a
person's data". The page now says what the detectors cover and that coverage is partial.

Refs #101

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sourcery-ai

sourcery-ai Bot commented Oct 18, 2026

Copy link
Copy Markdown

Sorry @cemililik, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 13 hours and 27 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@coderabbitai

coderabbitai Bot commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

Next included review available in 30 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 3 included reviews currently available. Your 48 included PR review attempts over the past 7 days set your current allowance at 3 reviews per hour.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: bd049bd4-5c70-4861-a3bb-c26cdb2b778e
📥 Commits

Reviewing files that changed from the base of the PR and between 56b4f0d and 984002f.

📒 Files selected for processing: 3
  • CHANGELOG.md
  • docs/usermanuals/en/compliance/gdpr.md
  • docs/usermanuals/tr/compliance/gdpr.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai

sourcery-ai Bot commented Oct 18, 2026

Copy link
Copy Markdown

Reviewer's Guide

Rewrites the English and Turkish GDPR/KVKK manual pages to match ForgeLM’s actual behavior, emphasizing partial identifier masking, non-enforced retention, limited audit evidence, command-based access and erasure workflows, and the absence of model memorisation guarantees; records the documentation correction in the changelog.

Sequence diagram for data subject access and erasure

sequenceDiagram
    actor DataSubject
    participant Operator
    participant JSONL
    participant AuditLog
    DataSubject->>Operator: Request access or erasure
    Operator->>JSONL: reverse-pii --query
    JSONL-->>Operator: Matching rows, or zero matches
    alt Erasure requested
        Operator->>JSONL: purge --row-id --corpus
        JSONL->>AuditLog: Record erasure
        AuditLog-->>Operator: Hash-chained audit entry
    end
Loading

Flow diagram for partial PII masking and audit scope

flowchart LR
    Sources[Raw source documents] --> Ingest[forgelm ingest --pii-mask]
    Ingest --> Masked[Masked JSONL]
    Masked --> Audit[forgelm audit]
    Audit --> Report[data_audit_report.json]
    Masked -. Names, addresses, free text may remain .-> Masked
    Report -. Counts and summaries only .-> Scope[No source attribution or hash manifest]
Loading

Flow diagram for retention policy reporting

flowchart LR
    Config[Retention horizons] --> Check[forgelm purge --check-policy]
    Check --> Report[Lists overdue artefacts]
    Check --> Exit[Always exits 0]
    Report --> Storage[Storage layer deletes overdue artefacts]
    Check -. No automatic deletion or audit-log entry .-> Storage
Loading

File-Level Changes

Change Details Files
Reframed the GDPR/KVKK guidance to accurately describe ForgeLM’s partial PII-masking and audit capabilities.
  • Documented the eight supported identifier formats and explicitly excluded names, addresses, and other free-text personal data.
  • Replaced the nonexistent YAML configuration example with the actual forgelm ingest --pii-mask command.
  • Clarified that audit reports contain counts, summaries, metadata, and optional Croissant data, but no source attribution or hash manifest.
  • Added the distinction between reporting retention-policy violations and enforcing deletion.
  • Updated access and erasure workflows to use forgelm reverse-pii and forgelm purge, including audit-log behavior.
  • Removed claims that zero reverse-PII matches prove model-level erasure or anonymity, and stated that memorisation is not measured.
  • Removed the nonexistent international-transfer setting and directed deployers to document safeguards in their DPIA.
docs/usermanuals/en/compliance/gdpr.md
docs/usermanuals/tr/compliance/gdpr.md
Updated release documentation to record the corrected compliance guidance.
  • Added an Unreleased changelog entry summarizing the corrected masking, audit, retention, data-subject-request, memorisation, and transfer claims.
CHANGELOG.md

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@cemililik

Copy link
Copy Markdown
Collaborator Author

Superseded by #1000: the wave-0 fixes are combined by theme into five pull requests to cut the review load. This branch's commits are included there unchanged apart from the CHANGELOG.md merge; the branch stays on the remote.

@cemililik cemililik closed this Oct 18, 2026
cemililik added a commit that referenced this pull request Oct 18, 2026
… six-language site copy, described as the code behaves (#1000)

## Summary

Compliance- and privacy-facing wording corrected to what the code does,
plus the six-language site copy that repeated the same claims. Six
earlier branches combined into one pull request, replacing #983, #986,
#988 and #991 (to be closed as superseded) and two branches that were
never opened. **This is compliance wording; please read the before/after
tables.**

## ⚠️ Localization exception

`docs/standards/localization.md` keeps German, French, Spanish and
Chinese as deferred tiers and says not to machine-translate them. At the
owner's decision I **wrote the DE / FR / ES / ZH site strings myself**,
with no native review. English and Turkish are authoritative; the other
four need a native reader before they can be trusted. A follow-up issue
for that is drafted, not yet filed.

## Related issues

Refs #73, #99, #90, #94, #101, #87, #114, #75, #86, #89, #92, #98, #110,
#112. The code halves stay open: whether the gate should ever compare
trainer and approver, failing closed on a missing safety verdict
(breaking), attaching SBOMs to the release.

## Changes

| Theme | Said | Now says |
|---|---|---|
| **Segregation of duties** (ISO 27001 / SOC 2 mappings, SoA, SOP,
deployer guide, manual) | the approval gate "enforces trainer ≠
approver", "dual-controlled" | it **records** trainer and approver
identities and does not compare them; both are self-asserted; keeping
them different people is the deployer's control.
`require_human_approval` is not enforced for strict tiers by
`ConfigError` (it only is when safety evaluation is off) |
| **GDPR / KVKK manual page** | identifiable subjects are removed; "no
specific person's data is recoverable from the model"; an
`international_transfers` setting; audit report with source attribution
and SHA-256 manifest; retention "auto-deletes originals" | eight
identifier formats are masked, names and free text are not; the report
is counts and summaries, not written to the audit log; retention is
reported, not enforced; memorisation is not measured |
| **No-verdict safety evaluation** (8 documents + TR) | exit 0 ⇒ every
gate passed; classifier load failure halts the run; classification
errors count as unsafe | a safety evaluation that produced no verdict
(`evaluation_completed: false`) keeps the model and exits 0 (4 with the
approval gate) regardless of `auto_revert`; code unchanged |
| **SBOM** (reference, SOP, guides, manuals, mappings) | `gh release
download …`; "re-emit from the git tag"; "licence extraction in SBOM" |
workflow-run artifacts, 90-day retention; `gh run download`; the file is
the CI runner's `pip list` (test tooling included, no dependency graph,
no licences) |
| **Article 12 / 14** (audit-event catalogue, audit-log and
human-oversight pages) | the audit log is "mandated by Article 12"; the
gate "implements" Article 14 | the log is development-time evidence that
supports Annex IV; Article 12 logging and Article 14 in-use oversight
belong to the deployed system |
| **Site, six languages** | benchmark failure "fails (exit 3)";
"dual-controlled"; Slack/Teams/Discord; "PII redacted"; "satisfying the
access-request side of the GDPR"; wizard "Enforce automatic deletion";
"SHA-256 manifest"; DeepSpeed "presets" | exit 3 only with `auto_revert:
true`; records the approver; Slack-format, Teams and Discord need a
relay; common formats masked, names not detected; reverse-pii finds only
what is literally in the scanned files; retention mode reserved; SHA-256
sidecar; bring your own DeepSpeed JSON |

The site GGUF strings describe the `.sha256` sidecar, the retention
strings the reserved mode, and the DeepSpeed strings the preset caveat;
they match the GGUF, code and docs pull requests, so **merge those
first**. A new site test keeps the retired phrases out of English,
Turkish and the HTML (mutation-checked).

### What this changes for a deployer

A DPIA or audit response can no longer cite ForgeLM for: segregation of
duties being enforced, personal data being removed or unrecoverable from
the model, the SBOM being on the release page, or the audit log being
the Article 12 mechanism.

## Type

- [x] Documentation (and site copy)

## Testing

- The full `CLAUDE.md` gauntlet from a clean worktree of this branch:
exit 0. (An earlier run failed `tests/test_turkish_glossary_terms.py`
because the Article 12 rewrite wrote "Ek IV" instead of "Annex IV",
fixed here, then two timing-based regex linearity tests failed while two
gauntlets ran at once; they pass alone and in this final run.)
- `node --test tests/site/*.test.cjs`: 81 pass; English ↔ Turkish keys
in lockstep.

## Checklist

- [x] English and Turkish updated together (Turkish wording needs the
owner's review)
- [ ] DE / FR / ES / ZH reviewed by a native speaker — **not done**
- [x] CHANGELOG entries under `[Unreleased]`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant