PeopleOps Console Review
This skill answers HR lifecycle-governance tasks against a running PeopleOps
Console JSON API. Tasks fall into a small number of recurring shapes (leave
precedence, payroll/accrual readiness, folder + notice review, recruitment
reconciliation, audit-scope selection), all of which share the same data model,
the same source-precedence philosophy, and the same output contract: a single
JSON object whose keys and enum values exactly match the provided
answer_template.json.
Your answer is graded field-by-field against a gold answer. Two things decide
whether you pass: (1) picking the authoritative record and excluding the
losing ones, and (2) emitting the exact normalized enum label the template
allows — never free text, never a synonym you invented.
Golden rules (read first)
- The answer template is the contract. Open the task's
answer_template.json before doing anything else. Every output key must be
present, types must match (integer vs number, boolean, string,
list[string], list[enum]), and every enum / list[enum] field must use
one of its allowed_values verbatim. Do not add keys, omit keys, or
substitute free-text explanations for enum labels.
- Authoritative records win; drafts and stale records lose — and you must
name the losers. Most fields come in pairs: a "selected/effective" value
and an "excluded_*" list. The exclusion lists are graded too. Always identify
both the winner and the records it beat.
- Read controlling facts verbatim from the source of record. Normalized
result/owner/SLA values (e.g. an audit
detail string, a folder checklist,
a notice packet's defect list, a policy clause) are stated in the data. Read
them; do not guess. The audit detail text typically spells out the QA
result that maps directly to a control-result enum.
- Stay on scope. Audit-scope tasks require you to keep the controlling
event(s) and exclude adjacent off-topic audit events. A leave-precedence
decision excludes document/notice events; a document/notice decision excludes
leave/payroll events.
- Lists are sets. Order does not matter, but membership does. Include every
item that belongs and nothing that does not.
Environment
Read the task's environment_access.md for the base URL (a local host:port) and
verify the service first:
GET /health -> {"ok": true, ...}
All endpoints are GET and need no auth (login credentials in the prompt are for
the web UI only — use the API directly). The q parameter is a case-insensitive
substring match against any scalar field on that resource.
| Endpoint |
Use it for |
GET /api/manifest, GET /api/summary |
module/dataset overview, counts |
GET /api/employees?q=&status= |
employee profile (incl. leave_balance_days) |
GET /api/cases?q=&status=&type= |
case summaries |
GET /api/cases/<id> |
full case: approvals, attachments, comments, audit_events, policy_refs |
GET /api/policies?q= / /api/policies/<id> |
the business rules in prose (precedence, gates) |
GET /api/payroll-ledgers?q=&status=&type= |
both leave assignments and salary assignments live here |
GET /api/recruitment?q= |
opening: candidates, offer_register, cost_ledger, notice_packets, payroll_precheck_records |
GET /api/documents?q= |
folders: required_files, files, required_tags, tags, ready |
GET /api/messages?q= |
formal-notice messages with quality and defects |
GET /api/notifications?q= |
notification records |
GET /api/audit?q=&case_id= / /api/audit/<id> |
audit events: event, detail, case_id, employee_id |
GET /api/attachments/<id> |
raw attachment text |
Lookup discipline. Query by the specific IDs/names in the prompt (and the
records directly linked to them). Filter with q=, case_id=, status=, or a
detail endpoint. Do not page through entire collections to browse unrelated
entities — it is unnecessary and slows you down.
Important quirk: the payroll-ledgers endpoint holds every ledger row for
an entity, distinguished by a record_type field — leave assignments, salary
assignments, HRMS ledgers, People-Ops adjustments, etc. A q= on the numeric
part of an employee id returns all of them. Filter by record_type and status
yourself; do not assume one row.
Standard operating procedure
- Parse the template — list the output keys and, for each enum field, its
allowed labels. This tells you exactly what evidence you must go find.
- Identify the subject — employee id, case id, or opening id from the prompt.
- Pull the candidate records for that subject from the relevant endpoint(s).
- Apply source precedence to pick the authoritative record(s) and build the
exclusion list(s). (See "Source precedence" below.)
- Read controlling text — the audit
detail, folder checklist, notice
packet, and any referenced policy clause — and map it to the normalized enum
labels. The policy documents (/api/policies) often state the exact rule in
words; use them to justify your label choices.
- Apply the gate / scope rules for the task shape (see task-shape table).
- Assemble JSON matching the template exactly; double-check enum spellings
and that every
excluded_* / missing_* / *_followup_* list is complete.
For the detailed per-shape playbooks, decision tables, and the full mapping from
evidence to each enum label, read references/playbooks.md. For the precise
field-by-field reasoning that distinguishes winners from losers, read
references/field-rules.md. Consult them whenever a field's correct value
is not obvious from the data alone.
Source precedence (the core judgment)
The console deliberately seeds conflicting records so you must apply precedence.
The governing principle, stated in the leave/payroll source policies, is:
the latest approved or submitted record for the relevant period controls;
draft, voided, superseded, and obsolete records are excluded even when a profile
summary or case summary conflicts.
- Leave: prefer the row whose
record_type is the formal leave assignment
and whose status is Approved (or Submitted) for the current period.
Exclude Superseded and Draft assignment rows. An approved leave assignment
overrides a stale employee-profile summary — when it does, mark the profile
as ignored/stale and route the follow-up to update the summary. Do not pick
HRMS-ledger or People-Ops-adjustment rows when a proper leave assignment
exists; they are not the entitlement source.
- Payroll/salary: prefer the
Submitted salary assignment for the period.
Exclude Draft planning assignments (and Superseded ones). Draft prechecks
never satisfy a readiness or accrual gate.
- Recruitment outcomes: the committee decision plus the offer register
control — not a message status or a case summary. An offer must show an
accepted status to count as accepted.
Take the policy text and audit detail as the tie-breakers; they state which
source is authoritative for the period.
Folder readiness, notice defects, audit scope, gating
These four mechanics recur across the document/notice and closeout tasks:
- Folder readiness = set comparison. A folder is ready only if
required_files ⊆ files and required_tags ⊆ tags. missing_files is the
set difference required_files \ files (use the exact filenames from the
checklist). required_tag_present is whether required_tags ⊆ tags. The
folder's own ready flag should corroborate your set comparison.
- Notice quality + defects. Inspect the formal-notice packet/message (its
quality and defects fields, corroborated by the audit detail), not the
case summary. A notice is defective if it lists any defect. Emit defect codes
only from the template's normalized vocabulary — these are the only allowed
values and they are part of the output contract:
missing_ack_deadline, missing_appeal_instructions,
missing_waitlist_status, missing_correct_policy.
- Audit scope. Pick the controlling/supporting event(s) whose
event/
detail matches the task's subject, and put every adjacent off-scope event in
excluded_audit_event_ids. Map the subject to the scope label the template
offers (e.g. leave-precedence vs document/notice vs payroll-readiness scope).
An empty exclusion list is correct when there is no off-scope event.
- Approval-vs-closeout gating. An approval (even "approved with conditions")
authorizes the decision but does not by itself authorize closeout. The gate
is: approval is sufficient only when records are clean; if the folder is
incomplete or a notice is defective, approval is not sufficient — hold and
remediate. When records are clean and an approval exists, closeout proceeds.
See references/field-rules.md for how these feed the *_gate,
closeout_blockers, escalation_action, remediation-owner, and
final_control_result fields, and how to read an escalation package's owner/SLA
verbatim from its detail text.
Output conventions
- Emit exactly one JSON object, no markdown, no commentary, matching every key
in
answer_template.json.
enum / list[enum] fields use an allowed_values label verbatim.
- Respect numeric types:
integer where the template says integer, number
(which may be a float) where it says number. Salary/cost are numbers; day
counts are usually integers — but read the actual value, since adjustment rows
can be fractional.
recruitment_cost_total is the sum of all cost-ledger line amounts, read
from the cost ledger (not a case summary).
- Boolean fields (
folder_ready, required_tag_present, accrual_ready,
profile_policy_ignored, draft_payroll_allowed) are real true/false.
- List fields are sets — complete and free of off-scope members.
Common pitfalls
- Picking a
Draft or Superseded row because it is newest or has a bigger
number. Status precedence beats recency-of-edit.
- Forgetting to populate
excluded_* lists — they are graded.
- Choosing an HRMS-ledger / adjustment row over the formal leave assignment.
- Reading notice quality or candidate outcome from the case summary instead of
the notice packet / committee decision + offer register.
- Letting an approval auto-approve closeout while a folder or notice is defective.
- Leaking off-scope audit events into the scope decision.
- Emitting free-text or a near-synonym instead of the template's exact enum label.
1---2name: peopleops-console-review-23description: Use this skill whenever a task asks you to review, verify, reconcile, or validate something in an HR "PeopleOps Console" / People Ops lifecycle portal exposed as a JSON API — for example onboarding closeout, leave source precedence, payroll/accrual readiness, policy-case folder and formal-notice review, recruitment outcome reconciliation, or audit-scope selection. Trigger it any time the prompt names a PeopleOps Console, an employee/case/opening/ payroll-ledger/leave-assignment/audit record, and asks for a JSON answer that must use normalized business labels from an answer_template.json. It encodes the standard operating procedure: which endpoints to query, the source-precedence and gating rules, the notice-defect vocabulary, and how to produce output that exactly matches the template's enum contract.4---56# PeopleOps Console Review78This skill answers HR lifecycle-governance tasks against a running **PeopleOps9Console** JSON API. Tasks fall into a small number of recurring shapes (leave10precedence, payroll/accrual readiness, folder + notice review, recruitment11reconciliation, audit-scope selection), all of which share the same data model,12the same source-precedence philosophy, and the same output contract: **a single13JSON object whose keys and enum values exactly match the provided14`answer_template.json`.**1516Your answer is graded field-by-field against a gold answer. Two things decide17whether you pass: (1) picking the **authoritative** record and excluding the18losing ones, and (2) emitting the **exact normalized enum label** the template19allows — never free text, never a synonym you invented.2021## Golden rules (read first)22231. **The answer template is the contract.** Open the task's24 `answer_template.json` before doing anything else. Every output key must be25 present, types must match (`integer` vs `number`, `boolean`, `string`,26 `list[string]`, `list[enum]`), and every `enum` / `list[enum]` field must use27 one of its `allowed_values` verbatim. Do not add keys, omit keys, or28 substitute free-text explanations for enum labels.292. **Authoritative records win; drafts and stale records lose — and you must30 name the losers.** Most fields come in pairs: a "selected/effective" value31 and an "excluded_*" list. The exclusion lists are graded too. Always identify32 *both* the winner and the records it beat.333. **Read controlling facts verbatim from the source of record.** Normalized34 result/owner/SLA values (e.g. an audit `detail` string, a folder checklist,35 a notice packet's defect list, a policy clause) are stated in the data. Read36 them; do not guess. The audit `detail` text typically spells out the QA37 result that maps directly to a control-result enum.384. **Stay on scope.** Audit-scope tasks require you to keep the controlling39 event(s) and *exclude* adjacent off-topic audit events. A leave-precedence40 decision excludes document/notice events; a document/notice decision excludes41 leave/payroll events.425. **Lists are sets.** Order does not matter, but membership does. Include every43 item that belongs and nothing that does not.4445## Environment4647Read the task's `environment_access.md` for the base URL (a local host:port) and48verify the service first:4950```51GET /health -> {"ok": true, ...}52```5354All endpoints are GET and need no auth (login credentials in the prompt are for55the web UI only — use the API directly). The `q` parameter is a case-insensitive56substring match against any scalar field on that resource.5758| Endpoint | Use it for |59|---|---|60| `GET /api/manifest`, `GET /api/summary` | module/dataset overview, counts |61| `GET /api/employees?q=&status=` | employee profile (incl. `leave_balance_days`) |62| `GET /api/cases?q=&status=&type=` | case summaries |63| `GET /api/cases/<id>` | full case: `approvals`, `attachments`, `comments`, `audit_events`, `policy_refs` |64| `GET /api/policies?q=` / `/api/policies/<id>` | the business rules in prose (precedence, gates) |65| `GET /api/payroll-ledgers?q=&status=&type=` | **both** leave assignments and salary assignments live here |66| `GET /api/recruitment?q=` | opening: `candidates`, `offer_register`, `cost_ledger`, `notice_packets`, `payroll_precheck_records` |67| `GET /api/documents?q=` | folders: `required_files`, `files`, `required_tags`, `tags`, `ready` |68| `GET /api/messages?q=` | formal-notice messages with `quality` and `defects` |69| `GET /api/notifications?q=` | notification records |70| `GET /api/audit?q=&case_id=` / `/api/audit/<id>` | audit events: `event`, `detail`, `case_id`, `employee_id` |71| `GET /api/attachments/<id>` | raw attachment text |7273**Lookup discipline.** Query by the specific IDs/names in the prompt (and the74records directly linked to them). Filter with `q=`, `case_id=`, `status=`, or a75detail endpoint. Do not page through entire collections to browse unrelated76entities — it is unnecessary and slows you down.7778**Important quirk:** the `payroll-ledgers` endpoint holds *every* ledger row for79an entity, distinguished by a `record_type` field — leave assignments, salary80assignments, HRMS ledgers, People-Ops adjustments, etc. A `q=` on the numeric81part of an employee id returns all of them. Filter by `record_type` and `status`82yourself; do not assume one row.8384## Standard operating procedure85861. **Parse the template** — list the output keys and, for each enum field, its87 allowed labels. This tells you exactly what evidence you must go find.882. **Identify the subject** — employee id, case id, or opening id from the prompt.893. **Pull the candidate records** for that subject from the relevant endpoint(s).904. **Apply source precedence** to pick the authoritative record(s) and build the91 exclusion list(s). (See "Source precedence" below.)925. **Read controlling text** — the audit `detail`, folder checklist, notice93 packet, and any referenced policy clause — and map it to the normalized enum94 labels. The policy documents (`/api/policies`) often state the exact rule in95 words; use them to justify your label choices.966. **Apply the gate / scope rules** for the task shape (see task-shape table).977. **Assemble JSON** matching the template exactly; double-check enum spellings98 and that every `excluded_*` / `missing_*` / `*_followup_*` list is complete.99100For the detailed per-shape playbooks, decision tables, and the full mapping from101evidence to each enum label, read **`references/playbooks.md`**. For the precise102field-by-field reasoning that distinguishes winners from losers, read103**`references/field-rules.md`**. Consult them whenever a field's correct value104is not obvious from the data alone.105106## Source precedence (the core judgment)107108The console deliberately seeds conflicting records so you must apply precedence.109The governing principle, stated in the leave/payroll source policies, is:110**the latest approved or submitted record for the relevant period controls;111draft, voided, superseded, and obsolete records are excluded even when a profile112summary or case summary conflicts.**113114- **Leave:** prefer the row whose `record_type` is the formal *leave assignment*115 and whose `status` is `Approved` (or `Submitted`) for the current period.116 Exclude `Superseded` and `Draft` assignment rows. An approved leave assignment117 **overrides a stale employee-profile summary** — when it does, mark the profile118 as ignored/stale and route the follow-up to update the summary. Do not pick119 HRMS-ledger or People-Ops-adjustment rows when a proper leave *assignment*120 exists; they are not the entitlement source.121- **Payroll/salary:** prefer the `Submitted` salary assignment for the period.122 Exclude `Draft` planning assignments (and `Superseded` ones). Draft prechecks123 never satisfy a readiness or accrual gate.124- **Recruitment outcomes:** the committee decision plus the offer register125 control — not a message status or a case summary. An offer must show an126 `accepted` status to count as accepted.127128Take the policy text and audit `detail` as the tie-breakers; they state which129source is authoritative for the period.130131## Folder readiness, notice defects, audit scope, gating132133These four mechanics recur across the document/notice and closeout tasks:134135- **Folder readiness = set comparison.** A folder is ready only if136 `required_files ⊆ files` **and** `required_tags ⊆ tags`. `missing_files` is the137 set difference `required_files \ files` (use the exact filenames from the138 checklist). `required_tag_present` is whether `required_tags ⊆ tags`. The139 folder's own `ready` flag should corroborate your set comparison.140- **Notice quality + defects.** Inspect the formal-notice packet/message (its141 `quality` and `defects` fields, corroborated by the audit `detail`), not the142 case summary. A notice is `defective` if it lists any defect. Emit defect codes143 only from the template's normalized vocabulary — these are the only allowed144 values and they are part of the output contract:145 `missing_ack_deadline`, `missing_appeal_instructions`,146 `missing_waitlist_status`, `missing_correct_policy`.147- **Audit scope.** Pick the controlling/supporting event(s) whose `event`/148 `detail` matches the task's subject, and put every adjacent off-scope event in149 `excluded_audit_event_ids`. Map the subject to the scope label the template150 offers (e.g. leave-precedence vs document/notice vs payroll-readiness scope).151 An empty exclusion list is correct when there is no off-scope event.152- **Approval-vs-closeout gating.** An approval (even "approved with conditions")153 authorizes the decision but does **not** by itself authorize closeout. The gate154 is: *approval is sufficient only when records are clean*; if the folder is155 incomplete or a notice is defective, approval is **not** sufficient — hold and156 remediate. When records are clean and an approval exists, closeout proceeds.157158See `references/field-rules.md` for how these feed the `*_gate`,159`closeout_blockers`, `escalation_action`, remediation-owner, and160`final_control_result` fields, and how to read an escalation package's owner/SLA161verbatim from its detail text.162163## Output conventions164165- Emit exactly one JSON object, no markdown, no commentary, matching every key166 in `answer_template.json`.167- `enum` / `list[enum]` fields use an `allowed_values` label **verbatim**.168- Respect numeric types: `integer` where the template says integer, `number`169 (which may be a float) where it says number. Salary/cost are numbers; day170 counts are usually integers — but read the actual value, since adjustment rows171 can be fractional.172- `recruitment_cost_total` is the **sum of all cost-ledger line amounts**, read173 from the cost ledger (not a case summary).174- Boolean fields (`folder_ready`, `required_tag_present`, `accrual_ready`,175 `profile_policy_ignored`, `draft_payroll_allowed`) are real `true`/`false`.176- List fields are sets — complete and free of off-scope members.177178## Common pitfalls179180- Picking a `Draft` or `Superseded` row because it is newest or has a bigger181 number. Status precedence beats recency-of-edit.182- Forgetting to populate `excluded_*` lists — they are graded.183- Choosing an HRMS-ledger / adjustment row over the formal leave *assignment*.184- Reading notice quality or candidate outcome from the case summary instead of185 the notice packet / committee decision + offer register.186- Letting an approval auto-approve closeout while a folder or notice is defective.187- Leaking off-scope audit events into the scope decision.188- Emitting free-text or a near-synonym instead of the template's exact enum label.