PeopleOps Console Reconciliation
You are an HR ops controller working a "PeopleOps Console" task. The portal holds
deliberately conflicting records for the same fact (several leave records, draft
vs submitted payroll, several audit events per case). Your job is to pick the
authoritative record, list the excluded losers, apply the business rules,
and emit a JSON answer that matches the task's answer_template.json exactly.
The scoring is on the answer JSON, so two things matter equally: getting the
right record/decision, and reporting it with the template's normalized enum
labels (not free-text). Lists are sets of IDs.
Standard operating procedure
- Read the task assets. Read the prompt, then
input/payloads/answer_template.json (or the path the prompt gives). The template
is the contract: every key, the type of each field, and for enum fields the
allowed_values you are permitted to emit. Plan to fill exactly those keys.
- Reach the API. Read the task's
environment_access.md for the base URL, then
GET /health to confirm it is up. The web-UI login is not needed — call the JSON
API directly with curl -s.
- Identify the task shape from the prompt and follow the matching playbook in
references/playbooks.md:
- A — Onboarding closeout verification (leave + payroll for an employee)
- B — Case folder + formal-notice review
- C — Leave source-precedence validation for an employee
- D — Payroll assignment + accrual readiness for an employee
- E — Recruitment outcome reconciliation for an opening
A task may combine shapes; run each relevant playbook and merge the fields.
- Pull only the named entity's records. Look entities up by their specific IDs
(
?q=<ID>, the /<id> detail route, or /api/audit?case_id=<CASE-ID>). See the
endpoint map and field shapes in references/api.md.
- Apply the business-judgment rules in
references/rules.md to select the
authoritative record, compute exclusions, test folder readiness, detect notice
defects, choose the controlling/supporting audit event, and apply the
approval-vs-closeout gate.
- Assemble the JSON, map every decision to the template's enum label, double-
check every required key is present and typed correctly, then return only the
JSON (no markdown, no commentary).
The core mental model: precedence and exclusion
Almost every field is one of: "which record is authoritative?", "which records are
excluded?", or "what does that imply?". The precedence ladder (full detail in
references/rules.md):
- Approved / Submitted record of the correct type for the period → authoritative.
- Employee profile summary (
/api/employees row) → convenience summary, can be
stale, loses to an approved/submitted assignment.
- Case summary text → weakest, never authoritative alone.
- Draft / Superseded / voided / obsolete → always excluded, even if a profile
summary agrees with them. Excluded-ID list fields collect every loser as a set.
For leave, the controlling row is the record_type: "Leave assignment" that is
Approved/Submitted — not an HRMS leave ledger or People Ops adjustment worksheet
row. For payroll, it is the Submitted Salary assignment; the Draft is excluded.
Reading the authoritative answer from records (not guessing)
- Audit
detail text is authoritative for result labels and for which record
won. It often literally says "QA result: . controls/matches ...".
Read the label and map it to the template enum; don't infer a different one.
- Notice quality lives in the notice/message packet (
quality + defects[]),
not in the case summary. Copy the defect codes verbatim.
- Folder readiness is a set comparison of
required_files/required_tags
against files/tags; the folder-checklist attachment and folder.tag_missing
audit just restate the gaps.
- Escalation owner / SLA must be read verbatim from the named audit package's
detail (or its linked policy). Never invent a number or reuse one from another
task — each package has its own.
Output conventions
- The JSON must match
answer_template.json exactly: same keys, correct types
(string/integer/number/boolean/list[...]/enum).
- For
enum and list[enum] fields, emit only a value from that field's
allowed_values. These normalized labels (defect codes, gate labels, status,
scope, source, result, action labels) are the output contract — prefer them over
any free-text reasoning.
- List fields are sets: include every member, no duplicates; order is not
meaningful but include each ID once. Array fields like candidate lists contain IDs
only.
- Numbers are raw numbers (e.g. a
2026-04 period implies an effective_date of
2026-04-01; a cost total is the arithmetic sum of every cost-ledger line).
- Return only the JSON object — no markdown fences, no explanation — when the prompt
says so.
Common pitfalls
- Using a draft or superseded record because it is newest. Recency does not beat
approval/submission; drafts are excluded and go in the excluded list.
- Treating a worksheet/adjustment leave row as the entitlement. Only the
Leave assignment record type is the controlling leave source.
- Trusting the profile summary. It can carry a stale policy even when its balance
looks right; the approved assignment still controls and
profile_policy_ignored is true.
- Deciding notice quality or candidate outcome from the case summary. Use the
notice packet and the committee decision + offer respectively.
- Including off-scope audit events in a scoped decision. A
folder.*/notice.*
event is excluded from a leave/payroll-precedence decision (and vice versa); put it
in excluded_audit_event_ids.
- Letting an approval imply closeout. Approval is sufficient only when records are
clean; a defective folder or notice forces a hold.
- Free-text enum values. If your label is not in
allowed_values, it is wrong —
map it to the closest allowed normalized label.
- Enumerating collections to "explore". Query only the named entity's records;
unfiltered list browsing is out of scope.
References
references/api.md — endpoint map, scope discipline, and field shapes.
references/rules.md — the full source-precedence, folder, notice, audit, gate,
recruitment, and escalation rules with the normalized vocabularies.
references/playbooks.md — step-by-step query sequences per task shape.
1---2name: peopleops-console-reconciliation-23description: Solve PeopleOps Console HR-lifecycle reconciliation tasks against the local JSON API (employees, cases, payroll/leave ledgers, recruitment, documents, messages/notices, audit events). Use this whenever a task asks you to verify an onboarding closeout, validate leave or payroll source precedence, review a case folder and formal notice, reconcile a recruitment outcome packet, or pick the controlling audit event for an employee/case/opening — i.e. any prompt that says "use the authoritative submitted/approved record not the draft", "fill in the answer template", references EMP-/CASE-/REQ-/PAY-/LA-/OFFER-/AUD- IDs, or wants normalized business labels rather than free text. Reach for it even when the prompt only describes the scenario without naming the console explicitly.4---56# PeopleOps Console Reconciliation78You are an HR ops controller working a "PeopleOps Console" task. The portal holds9**deliberately conflicting** records for the same fact (several leave records, draft10vs submitted payroll, several audit events per case). Your job is to pick the11**authoritative** record, list the **excluded** losers, apply the business rules,12and emit a JSON answer that matches the task's `answer_template.json` exactly.1314The scoring is on the answer JSON, so two things matter equally: getting the15**right record/decision**, and reporting it with the template's **normalized enum16labels** (not free-text). Lists are **sets** of IDs.1718## Standard operating procedure19201. **Read the task assets.** Read the prompt, then21 `input/payloads/answer_template.json` (or the path the prompt gives). The template22 is the contract: every key, the `type` of each field, and for `enum` fields the23 `allowed_values` you are permitted to emit. Plan to fill exactly those keys.242. **Reach the API.** Read the task's `environment_access.md` for the base URL, then25 `GET /health` to confirm it is up. The web-UI login is not needed — call the JSON26 API directly with `curl -s`.273. **Identify the task shape** from the prompt and follow the matching playbook in28 `references/playbooks.md`:29 - A — Onboarding closeout verification (leave + payroll for an employee)30 - B — Case folder + formal-notice review31 - C — Leave source-precedence validation for an employee32 - D — Payroll assignment + accrual readiness for an employee33 - E — Recruitment outcome reconciliation for an opening34 A task may combine shapes; run each relevant playbook and merge the fields.354. **Pull only the named entity's records.** Look entities up by their specific IDs36 (`?q=<ID>`, the `/<id>` detail route, or `/api/audit?case_id=<CASE-ID>`). See the37 endpoint map and field shapes in `references/api.md`.385. **Apply the business-judgment rules** in `references/rules.md` to select the39 authoritative record, compute exclusions, test folder readiness, detect notice40 defects, choose the controlling/supporting audit event, and apply the41 approval-vs-closeout gate.426. **Assemble the JSON**, map every decision to the template's enum label, double-43 check every required key is present and typed correctly, then return only the44 JSON (no markdown, no commentary).4546## The core mental model: precedence and exclusion4748Almost every field is one of: "which record is authoritative?", "which records are49excluded?", or "what does that imply?". The precedence ladder (full detail in50`references/rules.md`):5152- **Approved / Submitted** record of the correct type for the period → authoritative.53- **Employee profile summary** (`/api/employees` row) → convenience summary, can be54 stale, loses to an approved/submitted assignment.55- **Case summary** text → weakest, never authoritative alone.56- **Draft / Superseded / voided / obsolete** → always excluded, even if a profile57 summary agrees with them. Excluded-ID list fields collect every loser as a set.5859For leave, the controlling row is the `record_type: "Leave assignment"` that is60Approved/Submitted — not an `HRMS leave ledger` or `People Ops adjustment` worksheet61row. For payroll, it is the `Submitted` `Salary assignment`; the `Draft` is excluded.6263## Reading the authoritative answer from records (not guessing)6465- **Audit `detail` text is authoritative** for result labels and for which record66 won. It often literally says "QA result: <label>. <record> controls/matches ...".67 Read the label and map it to the template enum; don't infer a different one.68- **Notice quality lives in the notice/message packet** (`quality` + `defects[]`),69 not in the case summary. Copy the defect codes verbatim.70- **Folder readiness is a set comparison** of `required_files`/`required_tags`71 against `files`/`tags`; the folder-checklist attachment and `folder.tag_missing`72 audit just restate the gaps.73- **Escalation owner / SLA** must be read verbatim from the named audit package's74 `detail` (or its linked policy). Never invent a number or reuse one from another75 task — each package has its own.7677## Output conventions7879- The JSON must match `answer_template.json` **exactly**: same keys, correct types80 (`string`/`integer`/`number`/`boolean`/`list[...]`/`enum`).81- For `enum` and `list[enum]` fields, emit only a value from that field's82 `allowed_values`. These normalized labels (defect codes, gate labels, status,83 scope, source, result, action labels) are the output contract — prefer them over84 any free-text reasoning.85- List fields are **sets**: include every member, no duplicates; order is not86 meaningful but include each ID once. Array fields like candidate lists contain IDs87 only.88- Numbers are raw numbers (e.g. a `2026-04` period implies an `effective_date` of89 `2026-04-01`; a cost total is the arithmetic sum of every cost-ledger line).90- Return only the JSON object — no markdown fences, no explanation — when the prompt91 says so.9293## Common pitfalls9495- **Using a draft or superseded record because it is newest.** Recency does not beat96 approval/submission; drafts are excluded and go in the excluded list.97- **Treating a worksheet/adjustment leave row as the entitlement.** Only the98 `Leave assignment` record type is the controlling leave source.99- **Trusting the profile summary.** It can carry a stale policy even when its balance100 looks right; the approved assignment still controls and101 `profile_policy_ignored` is true.102- **Deciding notice quality or candidate outcome from the case summary.** Use the103 notice packet and the committee decision + offer respectively.104- **Including off-scope audit events in a scoped decision.** A `folder.*`/`notice.*`105 event is excluded from a leave/payroll-precedence decision (and vice versa); put it106 in `excluded_audit_event_ids`.107- **Letting an approval imply closeout.** Approval is sufficient only when records are108 clean; a defective folder or notice forces a hold.109- **Free-text enum values.** If your label is not in `allowed_values`, it is wrong —110 map it to the closest allowed normalized label.111- **Enumerating collections to "explore".** Query only the named entity's records;112 unfiltered list browsing is out of scope.113114## References115116- `references/api.md` — endpoint map, scope discipline, and field shapes.117- `references/rules.md` — the full source-precedence, folder, notice, audit, gate,118 recruitment, and escalation rules with the normalized vocabularies.119- `references/playbooks.md` — step-by-step query sequences per task shape.