Reactive to the inbox, schedule-driven, and strictly compile-and-flag — nothing
this skill does is reversible-risk, because it never writes to the subject's
actual data.
Step 1 — Scan the inbox for DSARs
Search Gmail for new or unhandled data subject requests:
- Look for messages that reference access, deletion, erasure, "my data," or
GDPR/data-subject rights, in the legal/privacy inbox.
- Skip any thread already labeled as actioned by this agent (e.g.
dsar-compiled or dsar-flagged) — a fresh session must not reprocess a
request that's already sitting with legal.
- For each new thread, capture: requester name and email, what's being
requested (access, deletion, or both), any identity details supplied, and
the date the request arrived.
Step 2 — Verify the requester
Before touching any product data:
- Match the requester's email and any supplied identity details (full name,
account email, order or account ID) against the account records we hold.
- Treat a request as verified only when the identifying details line up
with a single, unambiguous account.
- If the match is weak, ambiguous, or the request supplies no verifiable
detail, do not proceed to Step 3. Compile a short note explaining what's
missing and flag it to {{legal_review_channel}} as unverified — legal (or
a follow-up request) decides how to proceed.
- Record the verification date — it starts the SLA clock.
Step 3 — Locate the subject's data (read-only)
For a verified request, query Postgres read-only across every table that can
be keyed to the subject, for example:
-- adapt table/column names to the actual schema
select * from users where id = :subject_id;
select * from orders where user_id = :subject_id;
select * from invoices where user_id = :subject_id;
select * from support_tickets where user_id = :subject_id;
select * from consent_records where user_id = :subject_id;
select * from login_history where user_id = :subject_id;
- Follow foreign keys outward until every table that stores something
identifiable to this person has been checked — a partial search is not
acceptable.
- Never issue anything but a read query. There is no delete or update path in
this workflow, regardless of what the request asks for.
- If a table can't be reached or a query fails, note it explicitly in the
report rather than silently omitting that source.
Step 4 — Compile the report
Create a new Google Doc (one per request), formatted as:
- Header — requester name/email, request type (access / deletion /
both), date received, date verified, SLA deadline (verified date +
{{sla_days}} days).
- Data inventory — one section per system/table, listing what was found
verbatim or summarized (large tables like login history can be
summarized with counts and date ranges instead of every row).
- Recommended action — fulfill the access request as compiled, or
proceed with deletion across the listed tables, with any caveats (e.g.
records legal must retain for a legal-hold or billing-compliance reason).
- Verification notes — how identity was confirmed.
Step 5 — Flag to legal and label the thread
- Post the Doc link, the requester's name, the request type, the SLA
deadline, and the recommended action to {{legal_review_channel}}.
- Label the Gmail thread as actioned (
dsar-compiled, or dsar-flagged if
verification failed) so the next day's sweep doesn't reprocess it.
- Stop here. Do not reply to the requester, do not run any deletion, and do
not mark the request as resolved — that's legal's call.
1---2name: dsar-fulfillment3description: Daily GDPR data-subject-access-request runbook. Verifies each incoming request from Gmail, locates the subject's data read-only across every relevant Postgres table, compiles an access-or-deletion report in Google Docs within the {{sla_days}}-day SLA, and flags it to {{legal_review_channel}} for a lawyer to approve. Never deletes data and never replies to the subject.4---56<skill name="dsar-fulfillment">78<overview>9Turn a GDPR data subject access or deletion request into a verified, complete10report before the statutory clock runs out, without ever taking the action the11request asks for. A daily cron re-prompts a fresh session: it checks Gmail for12new or unactioned DSARs, verifies each requester's identity, queries Postgres13read-only for every table keyed to that subject, compiles the findings as a14Google Doc, and flags the doc plus a recommended action to legal. Deletion and15the reply to the requester are always a human decision, made after this skill's16work is done.1718Reactive to the inbox, schedule-driven, and strictly compile-and-flag — nothing19this skill does is reversible-risk, because it never writes to the subject's20actual data.21</overview>2223<when-to-load>24- The daily cron fires the DSAR sweep.25- A human asks the agent to check for or process a data subject request.26- A prior flagged request needs its report re-verified or re-compiled.27</when-to-load>2829<workflow>3031## Step 1 — Scan the inbox for DSARs3233Search Gmail for new or unhandled data subject requests:3435- Look for messages that reference access, deletion, erasure, "my data," or36 GDPR/data-subject rights, in the legal/privacy inbox.37- Skip any thread already labeled as actioned by this agent (e.g.38 `dsar-compiled` or `dsar-flagged`) — a fresh session must not reprocess a39 request that's already sitting with legal.40- For each new thread, capture: requester name and email, what's being41 requested (access, deletion, or both), any identity details supplied, and42 the date the request arrived.4344## Step 2 — Verify the requester4546Before touching any product data:4748- Match the requester's email and any supplied identity details (full name,49 account email, order or account ID) against the account records we hold.50- Treat a request as **verified** only when the identifying details line up51 with a single, unambiguous account.52- If the match is weak, ambiguous, or the request supplies no verifiable53 detail, do not proceed to Step 3. Compile a short note explaining what's54 missing and flag it to {{legal_review_channel}} as **unverified** — legal (or55 a follow-up request) decides how to proceed.56- Record the verification date — it starts the SLA clock.5758## Step 3 — Locate the subject's data (read-only)5960For a verified request, query Postgres read-only across every table that can61be keyed to the subject, for example:6263```sql64-- adapt table/column names to the actual schema65select * from users where id = :subject_id;66select * from orders where user_id = :subject_id;67select * from invoices where user_id = :subject_id;68select * from support_tickets where user_id = :subject_id;69select * from consent_records where user_id = :subject_id;70select * from login_history where user_id = :subject_id;71```7273- Follow foreign keys outward until every table that stores something74 identifiable to this person has been checked — a partial search is not75 acceptable.76- Never issue anything but a read query. There is no delete or update path in77 this workflow, regardless of what the request asks for.78- If a table can't be reached or a query fails, note it explicitly in the79 report rather than silently omitting that source.8081## Step 4 — Compile the report8283Create a new Google Doc (one per request), formatted as:84851. **Header** — requester name/email, request type (access / deletion /86 both), date received, date verified, SLA deadline (verified date +87 {{sla_days}} days).882. **Data inventory** — one section per system/table, listing what was found89 verbatim or summarized (large tables like login history can be90 summarized with counts and date ranges instead of every row).913. **Recommended action** — fulfill the access request as compiled, or92 proceed with deletion across the listed tables, with any caveats (e.g.93 records legal must retain for a legal-hold or billing-compliance reason).944. **Verification notes** — how identity was confirmed.9596## Step 5 — Flag to legal and label the thread9798- Post the Doc link, the requester's name, the request type, the SLA99 deadline, and the recommended action to {{legal_review_channel}}.100- Label the Gmail thread as actioned (`dsar-compiled`, or `dsar-flagged` if101 verification failed) so the next day's sweep doesn't reprocess it.102- Stop here. Do not reply to the requester, do not run any deletion, and do103 not mark the request as resolved — that's legal's call.104105</workflow>106107<guardrails>108- **Read-only on subject data.** Every Postgres query in this workflow is a109 `SELECT`. No delete, no update, no matter what the request asks for.110- **Verify before you locate.** Never query for a subject's data on a request111 that hasn't passed identity verification.112- **Compile, don't decide.** The report always ends in a *recommended* action,113 never an executed one.114- **Never contact the requester.** The only outbound message this skill115 produces is the flag to {{legal_review_channel}}. The reply to the subject is116 written and sent by legal.117- **Deletion is never automatic.** Even an explicit erasure request only118 results in a recommendation in the doc. A lawyer approves it and someone119 else executes it, outside this workflow.120- **SLA is stated, not enforced by silence.** Every flag states the deadline121 explicitly, and calls out requests that are close to breaching it.122- **Secrets scoped.** Gmail, Postgres, and Google Docs credentials are123 injected at runtime by the connector, never written to disk or logged.124</guardrails>125126</skill>