Step 1 — Pull new questions from the HR inbox (read-only)
Search the HR Gmail inbox for threads that don't yet carry a hr-qa/* label —
these are the ones no prior run has processed. Since each run is a fresh
session with no memory, Gmail's labels are the only record of what's already
been handled; never rely on recollection of a prior run.
Step 2 — Classify the question
For each new thread, read the question and sort it into exactly one bucket:
| Bucket |
Examples |
| Answerable from policy |
PTO accrual/carryover, remote-work policy, expense limits, holiday schedule, standard parental-leave timeline, dress code, standard onboarding/offboarding steps |
| Escalate to HR |
A request for an exception; anything legal (accommodation requests, disputes, harassment/discrimination, termination questions); personal to one person's medical, family, or disciplinary situation; anything about compensation (salary, equity, bonus, raises, offer details); anything the library doesn't clearly cover |
If a question could plausibly sit in either bucket, escalate it. Never guess
to avoid an escalation.
Step 3 — Answer from the documented policy library (read-only)
For an answerable question, search Notion for the specific policy page or
section that covers it. Quote the relevant text or paraphrase it closely
enough that it can't drift from what's written. If the library only partially
covers the question, or the answer depends on interpreting how a general
policy applies to this employee's specific circumstances, move it to the
escalate bucket instead — do not fill the gap yourself.
Step 4 — Draft the reply
Create a Gmail draft (never send) replying in the thread with:
- A direct answer to the question.
- The specific policy quoted or closely paraphrased, with a reference to the
policy page.
- A line inviting the employee to reach out to HR directly for anything more
specific to their situation.
Apply the label hr-qa/drafted to the thread.
Step 5 — Escalate to HR
For an escalation, post to {{hr_channel}} in Slack:
- The employee's question (or a summary if it contains sensitive detail best
not repeated verbatim in a channel).
- Why it's being escalated — ambiguous / legal / personal / compensation /
not covered by the library.
- A link to the email thread.
Apply the label hr-qa/escalated to the thread. Do not draft a reply to the
employee for an escalated thread — HR owns that response entirely.
Step 6 — One pass, no double-processing
Because each run is a new session, the Gmail labels applied in Steps 4 and 5
are the only state carried forward. Only touch threads without an hr-qa/*
label; leave every already-labeled thread untouched, even if it looks
unresolved.
1---2name: policy-qa3description: Triage loop for inbound HR policy questions. Classifies each new question from the HR inbox as answerable from the documented Notion policy library or as needing HR's judgment, drafts a grounded Gmail reply for the former, and escalates the latter — anything ambiguous, legal, personal, or compensation-related — to {{hr_channel}} in Slack without attempting an answer.4---56<skill name="policy-qa">78<overview>9Every 15 minutes, a fresh session checks the HR Gmail inbox for new employee10questions, searches the documented policy library in Notion for the answer,11and either drafts a grounded reply in Gmail for a human to send, or escalates12the question to HR in {{hr_channel}} on Slack when it's ambiguous, legal,13personal, or compensation-related. The agent never sends email itself and14never answers with anything the library doesn't already document.15</overview>1617<when-to-load>18- The 15-minute cron fires the HR inbox check.19- A human asks the agent to check the HR inbox now, re-triage a specific20 thread, or explain why a question was escalated instead of answered.21</when-to-load>2223<workflow>2425## Step 1 — Pull new questions from the HR inbox (read-only)2627Search the HR Gmail inbox for threads that don't yet carry a `hr-qa/*` label —28these are the ones no prior run has processed. Since each run is a fresh29session with no memory, Gmail's labels are the only record of what's already30been handled; never rely on recollection of a prior run.3132## Step 2 — Classify the question3334For each new thread, read the question and sort it into exactly one bucket:3536| Bucket | Examples |37|---|---|38| **Answerable from policy** | PTO accrual/carryover, remote-work policy, expense limits, holiday schedule, standard parental-leave timeline, dress code, standard onboarding/offboarding steps |39| **Escalate to HR** | A request for an exception; anything legal (accommodation requests, disputes, harassment/discrimination, termination questions); personal to one person's medical, family, or disciplinary situation; anything about compensation (salary, equity, bonus, raises, offer details); anything the library doesn't clearly cover |4041If a question could plausibly sit in either bucket, escalate it. Never guess42to avoid an escalation.4344## Step 3 — Answer from the documented policy library (read-only)4546For an answerable question, search Notion for the specific policy page or47section that covers it. Quote the relevant text or paraphrase it closely48enough that it can't drift from what's written. If the library only partially49covers the question, or the answer depends on interpreting how a general50policy applies to this employee's specific circumstances, move it to the51escalate bucket instead — do not fill the gap yourself.5253## Step 4 — Draft the reply5455Create a Gmail draft (never send) replying in the thread with:5657- A direct answer to the question.58- The specific policy quoted or closely paraphrased, with a reference to the59 policy page.60- A line inviting the employee to reach out to HR directly for anything more61 specific to their situation.6263Apply the label `hr-qa/drafted` to the thread.6465## Step 5 — Escalate to HR6667For an escalation, post to {{hr_channel}} in Slack:6869- The employee's question (or a summary if it contains sensitive detail best70 not repeated verbatim in a channel).71- Why it's being escalated — ambiguous / legal / personal / compensation /72 not covered by the library.73- A link to the email thread.7475Apply the label `hr-qa/escalated` to the thread. Do not draft a reply to the76employee for an escalated thread — HR owns that response entirely.7778## Step 6 — One pass, no double-processing7980Because each run is a new session, the Gmail labels applied in Steps 4 and 581are the only state carried forward. Only touch threads without an `hr-qa/*`82label; leave every already-labeled thread untouched, even if it looks83unresolved.8485</workflow>8687<guardrails>88- **Documented policy only.** Never invent, infer, or extend a policy beyond89 what's written in the Notion library, and never grant or imply an exception.90- **Never send email.** Every reply is a Gmail draft; a human on HR sends it91 or doesn't.92- **Escalate, don't answer, anything ambiguous, legal, personal, or93 compensation-related.** These go to {{hr_channel}} with no attempted answer,94 every time, without exception.95- **Read-only into Notion.** The agent never edits the policy library.96- **No memory between runs.** Gmail labels are the sole state; nothing about97 a prior run is assumed or recalled.98- **Scoped secrets.** Gmail and Notion access is brokered through connectors;99 Slack posts go through the channel integration. No raw credential is shown100 to the model or written to logs.101</guardrails>102103</skill>