Skip to content
Centriu
Centriu Oracle

LGPD Deletion Request Purge Scheduling Automation: Confirmed, and Never Actually Scheduled

Centriu Oracle lets a data subject request deletion of a project's data — a real right under Brazil's LGPD. The function handling that request, before this fix, replied to the caller with a confident, specific confirmation: the project archived, and a deletion scheduled for exactly 30 days later. Separately, the function's OWN source comment described persisting that intent to the database — a flag marking the deletion as pending, and the actual scheduled date — specifically so an independent, later-running purge job could find every project past its scheduled date and complete the deletion. The database write that actually ran did neither of those things: it updated only the project's phase to paused, never once writing the pending-deletion flag or the scheduled date the purge job's own query depends on to find the row in the first place. The 30-day date returned to the caller was computed by a separate line of code that ran AFTER the database write had already completed — meaning it was never even available to be included in that write to begin with. A data subject's genuine deletion request could receive a specific, confident confirmation of a schedule that was never actually placed anywhere the system's own automated purge process could ever find it — silently pending forever, with no error, unless someone happened to notice and intervene manually. Fixed by computing the 30-day scheduled date BEFORE the database write runs, and persisting the deletion intent, its request timestamp, and its scheduled date together in the exact same update that already archives the project.
Fields never written
Now findable by the purge job
Data deletion and retention configuration screen
Confirmed, and never actually scheduled.

A confirmation is only true if the thing it confirms is actually findable later

Replying to a request with a specific, confident confirmation — "scheduled for 30 days from now" — is exactly the right thing to tell someone who has just exercised a real right. The entire truth of that confirmation depends on a SEPARATE, later process — here, an independent purge job checking on its own schedule — being able to actually find the specific record the confirmation was about, using whatever data was actually saved at the moment of the original request. A confirmation message computed and returned to a caller, and a database write persisting the state that confirmation describes, are two genuinely separate steps — and a system can get the FIRST one completely right, in isolation, while never actually performing the second one at all, with nothing in the response itself revealing the gap.

How the underlying problem shows up before you fix it

A function's own code comment describes persisting a specific piece of state (a flag, a scheduled date) to the database — but the actual database write beneath that comment does not include the field the comment describes, updating only a different, narrower part of the same record.

A value returned to the CALLER of a function (here: a computed 30-day deletion date) is calculated by a line of code that runs AFTER the function's own database write has already executed — meaning that value was never actually available to be included in the write, regardless of what the write itself contains.

A separate, independently-scheduled process (a purge job, a reconciliation cron) is documented as relying on specific database fields to find the records it needs to act on — and if the process that is supposed to SET those fields never actually does, the dependent process has no rows to find, and produces no error, because from its own point of view there is simply nothing currently due.

A request meant to trigger a real, consequential action later (a data deletion, 30 days out) returns an immediate, confident success response — with no mechanism by which the person who made the request, or anyone else, would ever learn that the follow-through step silently never actually got scheduled.

The specific gap is invisible to ordinary testing of the request-handling function in isolation, because that function's own immediate response looks completely correct — the defect is only visible by checking the database state the function actually wrote, or by checking whether the SEPARATE, later purge process ever actually acts on the request.

How a deletion that was confirmed, but never actually scheduled, was closed

Centriu Oracle handles a data subject's request to delete a project's data by first soft-archiving it — setting its phase to paused, taking it out of any active workflow — and, per the function's own documented design, is meant to separately persist the INTENT to delete: a flag marking the deletion as pending, and the specific date, 30 days out, by which the deletion should actually be carried out. That persisted intent exists specifically because the actual, permanent deletion does not happen inside this function at all — it is handled by a completely separate process, run on its own schedule (a cron job or a manual operations review), whose own logic selects every project where the pending-deletion flag is set AND the scheduled date has already passed.

Before this fix, the function's own code comment described exactly this design — persisting the pending flag and the scheduled date specifically for that later purge process to find. The actual database update that ran, immediately below that comment, wrote only `{ phase: "pausado" }` — the project's phase, and nothing else. Neither the pending-deletion flag nor the scheduled deletion date was included in that write at all. Separately, a few lines further down in the same function, a 30-day date WAS computed — `const scheduled = new Date(); scheduled.setDate(scheduled.getDate() + 30)` — and returned to the caller as part of a confident response: `{ archived: true, deletionScheduledAt: scheduled.toISOString() }`. Because this calculation happened AFTER the database update had already run and already completed, the computed date was never in scope to be included in that write, regardless of what the write itself contained — the caller received a specific, correctly-formatted 30-day date, and the database never recorded that date, or any indication a deletion was pending, anywhere at all.

The practical consequence: a data subject exercising a real right under Brazil's LGPD to have their project's data deleted would receive an entirely plausible, specific confirmation — their project archived, a deletion scheduled 30 days out — while the system's own separate purge process, which finds its work specifically by querying for the pending-deletion flag and an elapsed scheduled date, would never once find this project, because neither of the two fields its query depends on was ever actually set. The request was genuinely, permanently pending, in the sense that nothing about it had been forgotten or lost — but it was pending in a place no running process was ever configured to look, indefinitely, unless a person happened to separately notice and manually intervene.

The fix reorders and completes the write. The 30-day scheduled date is now computed FIRST, before any database write runs, so it is genuinely available to be persisted rather than computed too late to matter. The database update is expanded from the single `phase` field to include `pending_lgpd_deletion: true`, `deletion_requested_at` (the current timestamp, recording exactly when the request itself was made), and `deletion_scheduled_at` (the real, computed 30-day date) — all three written together, in the same single update that already archives the project's phase, rather than the deletion intent being described only in a comment while never actually reaching the database. The function's own return value is unchanged in shape, but now reports a schedule that the database genuinely, verifiably reflects — the same value returned to the caller is the exact value the system's own separate purge process will later use to find and complete the request.

What is actually built today

Centriu Oracle's project-deletion request persists a genuine pending-deletion flag, a request timestamp, and a computed 30-day scheduled deletion date, all in the same database write that archives the project.

The 30-day scheduled date is computed before the database write runs, so the exact value returned to the caller is the exact value genuinely persisted — not two independently-computed values that happened to look the same.

The system's own separate, independently-scheduled purge process, which selects projects by a pending flag and an elapsed scheduled date, can now genuinely find every project whose deletion has actually been requested — the two database fields its own query depends on are reliably present.

A data subject's confirmation of a scheduled deletion now corresponds to a real, findable, persisted record — not a plausible response describing an intention that was never actually written anywhere the rest of the system could act on.

The project's own audit log continues to retain a record of the archival action within the legally-required retention period, unaffected by this fix — this correction is scoped specifically to the pending-deletion scheduling fields the purge process depends on.

A confirmed 30-day schedule, findable by nothing (illustrative framing of the actual measured finding)

Before the fix, a data subject requesting deletion of their project's data inside Centriu Oracle would receive a specific, confident confirmation: "archived, scheduled for deletion in 30 days." The project's phase genuinely changed. The two fields the system's own separate purge process actually queries for — a pending-deletion flag and a scheduled date — were never written at all, meaning that process, running on its own schedule weeks later, would find nothing to act on for this specific project, silently, indefinitely, with no error anywhere. After the fix, the identical request persists both fields in the same write, and the purge process genuinely finds and completes the deletion once the real, persisted 30-day date has passed.

What changes operationally

Centriu Oracle's project-deletion request now persists a genuine, findable pending-deletion flag and scheduled date in the same database write that archives the project, closing a gap where a data subject's confirmed deletion request could be permanently invisible to the system's own separate, independently-scheduled purge process — confirmed to the requester, but never actually queued for the follow-through step that would complete it.

When this is not the right fit

This automation governs Centriu Oracle's own internal LGPD project-deletion-request handling specifically — it does not change the 30-day retention window itself, which remains the module's own documented policy, and it does not change how the SEPARATE purge process that ultimately performs the deletion is scheduled or run; this fix ensures that process has the data it needs to find a genuine request in the first place.

Describing an intention in a comment vs. writing it to the database

Documenting an intended design in a code comment — persist a flag, persist a date, so a later process can find it — is valuable and correct as documentation of INTENT. It is not, on its own, a substitute for the actual database write matching that intent, and a comment describing behavior the code beneath it does not actually perform is arguably more dangerous than no comment at all, because it can read as confirmation the behavior exists to anyone reviewing the code without independently checking the database. Persisting the real fields the comment describes, in the same write the comment sits above, closes the gap between what the code claims to do and what it verifiably does.

Related systems

Main system: Centriu Oracle.

What it does NOT do

  • Does not change Centriu Oracle's 30-day retention window itself before permanent deletion — that remains the module's own documented policy; this fix ensures the scheduling data behind that window is actually persisted and findable.
  • Does not change how or when the SEPARATE purge process that performs the actual, permanent deletion runs — this fix ensures that process's own query (pending flag + elapsed scheduled date) has genuine data to find, rather than changing the process itself.
  • Does not retroactively locate or complete any deletion request made during the period this defect was live — a team with that specific historical concern would need its own manual review of projects marked archived without a corresponding pending-deletion flag from that window.
  • Does not change the project's own audit-log retention behavior, which remains subject to its own, separate legal retention requirements, unaffected by this fix.
  • Does not claim every LGPD-related workflow in Centriu Oracle shared this specific defect — this fix is scoped to the project-deletion request function described above.

Security and governance

Centriu Oracle's project-deletion request now persists a genuine, findable pending-deletion flag and scheduled date, ensuring a data subject's request under Brazil's LGPD (Law No. 13,709/2018) is actually queued for the automated purge process meant to complete it, rather than confirmed to the requester while remaining permanently invisible to that process. Full detail on access control and audit trails lives at /governanca and /iso.

Pricing and contracting

Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).

Frequently asked questions

Was any project actually deleted incorrectly because of this defect?

No — the defect was the opposite direction: a genuine deletion REQUEST could fail to ever actually be scheduled for the follow-through purge process, not an unintended deletion occurring.

Did the data subject receive a false confirmation?

The confirmation message itself was accurate in FORMAT (a specific 30-day date) but was not backed by a corresponding database write — the confirmation described a schedule that the system's own separate purge process could never actually find.

How does the automated purge process find requests to act on?

By querying for projects where a pending-deletion flag is set AND the scheduled deletion date has already passed — both of which are the exact two fields this fix now genuinely persists.

Why was the 30-day date computed after the database write in the original code?

The original code structure computed the archival write first, then calculated the return value afterward — meaning the date used in the response was never available at the moment the (incomplete) database write actually ran.

Can a deletion request from before this fix be recovered?

Not automatically — since the pending-deletion flag was never set for those requests, they are not distinguishable in the database from a project archived for an unrelated reason; a team with that concern would need its own manual review.

What does Centriu Oracle cost?

It is sold by subscription with a published starting price — exact current values are on the central pricing page.

See how Centriu Oracle actually schedules an LGPD deletion request

Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.

Sources

  1. Centriu Oracle — public product page — Centriu, 2026-07-20 · link(primária)
  2. Centriu Oracle — public factsheet (API, JSON) — Centriu, 2026-07-21 · link
  3. Law No. 13,709/2018 — Brazil’s General Data Protection Law (LGPD) — Presidência da República (Brazil), 2018-08-14 · link

Last material update on .

By · AI-assisted production, with human review

We value your privacy

We use cookies to improve your experience, analyze site usage and support our marketing. You can accept all cookies or manage your preferences. To learn more, see our Cookie Policy.