PeopleOps Console — Lifecycle Control Skill
You answer People Ops / ERP-HR verification tasks by reading a remote HTTP API,
applying a fixed set of business rules, and returning ONE JSON object whose keys
and enum values exactly match the task's answer_template.json.
0. Operating contract (read first)
- The answer template is the spec. Output every key it lists, with the right
type, and for
enum/list[enum]fields use ONLY theallowed_valuesstrings verbatim. Never invent labels or write free-text explanations into label fields. - Each field is scored independently (partial credit). So: (1) lock in every field that the data states literally before reasoning about interpretive ones, and (2) a wrong enum only costs that field — but vague/over-broad list fields bleed points, so keep lists tight and justified.
- IDs are copied verbatim from the API (assignment ids, offer ids, audit ids, approval ids, candidate ids, batch ids). Never paraphrase or reformat them.
- Dates are full calendar dates
YYYY-MM-DD(take the date part of the record's effective/updated timestamp). Do NOT substitute the monthlyperiodstring (YYYY-MM) for aneffective_date.
1. Remote API workflow
Base service exposes read-only JSON endpoints (no auth; login text in prompts is flavor). Typical calls:
GET /api/summaryand/api/manifest— orient: counts, departments, modules.GET /api/employees?q=<id|name>— profile summary (department, balance, status).GET /api/payroll-ledgers?q=<emp_id>— leave assignments AND salary assignments AND accrual/adjustment rows live here together; filter mentally byrecord_typeandstatus.GET /api/cases(summaries) thenGET /api/cases/{case_id}for the FULL record:approvals,attachments,comments,audit_events,policy_refs.GET /api/policies//api/policies/{id}— the authoritative precedence rules.GET /api/documents?q=— folderrequired_files/files,required_tags/tags,ready.GET /api/messages?q=— formal-notice messages withqualityanddefects.GET /api/recruitment?q=— openings, candidates,offer_register,cost_ledger,notice_packets,payroll_precheck_records.GET /api/audit?q=&case_id=and/api/audit/{id}— QA results;case_idfilter returns exactly the events for one case.GET /api/attachments/{id}— raw notice/checklist body text.
Always cross-reference: an employee's authoritative state is spread across employees, payroll-ledgers, policies, cases, documents, messages, and audit. When an audit QA event names a specific controlling record, that naming is decisive — use that exact id, its policy, and its numbers.
2. Source-precedence business rules
Leave entitlement precedence
- The latest Approved or Submitted leave assignment for the period controls. Draft, voided, superseded/obsolete records are excluded — even when the employee profile summary disagrees. (An approved assignment overrides a stale profile summary.)
- Among multiple valid assignments, the latest dated Approved/Submitted one wins;
prefer the annual leave-assignment row (e.g.
record_type: Leave assignment) over month-scoped ledger adjustments unless the task asks for an adjustment. excluded_leave_ids/ excluded records = EVERY non-controlling leave row (both superseded and draft), not just one.- Normalized labels:
leave_source=leave_assignment_historywhen you read the assignment ledger (not the profile or case summary).leave_precedence_source=approved_assignment_current_periodwhen the controller is an Approved row for the period.precedence_source=approved_assignment_over_profilewhen overriding a stale profile;profile_policy_ignored = true;audit_result = profile_summary_stale; remediationnext_action = update_employee_summary.
Payroll / salary precedence
- Use the current Submitted salary assignment. Draft planning assignments do NOT affect payroll readiness or accruals and must be excluded.
payroll_status/payroll_source_status=submitted;draft_exclusion_rule=exclude_draft_assignment;excluded_payroll_ids/excluded_assignment_id= the draft (and any superseded) row.base_salaryandeffective_datecome from the Submitted row (full date).- Accruals: a batch is ready when the Submitted assignment matches the accrual
batch and QA says so —
accrual_ready = true,control_result = ready_with_monitoring,audit_scope = payroll_assignment_readiness.
General draft/submitted/approved/superseded ordering
Authority for "what is effective": Approved/Submitted > everything; Draft and Superseded/voided/obsolete are always excluded from the effective state and listed as the excluded ids.
3. Folder readiness & document checklist
- A folder is ready ONLY when all
required_filesAND allrequired_tagsare present. Compare the document'srequired_filesvsfilesandrequired_tagsvstags. missing_files= required_files not in files (list them exactly).- Missing FILE and missing TAG are SEPARATE blockers. If the required tag is
present,
required_tag_present = trueandfolder_required_tag_action = no_tag_action; only useadd_required_tagwhen a required tag is absent. closeout_blockerslists only the categories actually failing:missing_required_files,missing_required_tags,defective_formal_notice— include each only if true.
4. Formal-notice defects
- Notice quality comes from inspecting the notice packet/message:
notice_qualityisvalidordefective; copy thedefectscodes verbatim intonotice_defects. Defect codes seen:missing_ack_deadline,missing_appeal_instructions,missing_waitlist_status,missing_correct_policy. - Treat the notice-quality evidence source as
notice_packet_inspection(inspect the formal-notice packet body), notmessage_notice_inspectionorcase_summary_only, even when the defect is logged in a message. - Remediation: a defective notice ->
notice_remediation_action = reissue_defective_noticesandnext_action = block_close_and_reissue_notice. - Remote-work international-exception notices (per the Remote Work Policy) must contain: executive approval, time limits, tax equalization, VPN-only access, quarterly compliance review, appeal instructions, and an acknowledgement deadline. A missing element is a defect.
5. Closeout gate & final control result
approval_closeout_gateis data-driven, not a constant:- clean records, no folder/notice defects ->
approval_sufficient_when_records_clean. - any folder or notice defect ->
approval_not_sufficient_when_folder_or_notice_defective.
- clean records, no folder/notice defects ->
final_control_result:- clean ->
approve_closeout(andcloseout_action = approve_onboarding_close). - folder/notice defects ->
hold_for_folder_and_notice_defects. - submitted-and-matching payroll/accrual ->
ready_with_monitoring.
- clean ->
evidence_source_orderfor closeout reviews =approval_history_folder_notice_audit.records_remediation_ownerfor routing remediation =People Ops Compliance(compliance owns remediation routing; do not default to the uploader/Records).
6. Audit correlation & scope (high-value, easy to get wrong)
audit_event_id= the QA event whose topic matches the decision (leave event for a leave task, payroll event for a payroll task, notice event for a notice task), scoped to the case under review.supporting_audit_event_ids= the SAME-CASE event(s) on the decision's topic.excluded_audit_event_ids= ONLY the SAME-CASE adjacent off-topic events (e.g. the folder/tag event when the decision is about leave; the doc/notice events from sibling cases that a naive reader might mis-attribute).- DO NOT dump the entire audit log or unrelated other-case/other-topic events into the excluded list — that is penalized. Keep it to the few genuinely adjacent, easily-confused events.
audit_scopematches the decision:leave_source_precedence_only,payroll_assignment_readiness, ordocument_notice_findings_only.- A cross-module escalation package (an audit event that "opens a package" and
lists related event ids with a control owner and remediation clock) is its own
thing: its related events and owner apply to the escalation, not to a single
per-entity decision. For a single, non-escalation case set
escalation_action = no_actionrather than echoingnext_action.
7. Recruitment reconciliation
- Outcomes come from
committee_decision+ the offer register, i.e.candidate_status_source = interview_feedback_and_offerandcandidate_outcome_control = committee_decision_with_offer_confirmation. selected_candidate(Selected),waitlisted_candidates,rejected_candidatesfrom committee decisions; arrays hold candidate IDs only.- Offer: take
offer_id,offer_base_salary, andselected_offer_status(accepted/draft/withdrawn/none) from the offer register for the selected candidate. recruitment_cost_total= sum of the target opening'scost_ledgerline items ONLY. "All campaign ledger items" means all lines of THAT campaign — do not sum other openings.cost_source = recruitment_cost_ledger.- Notice follow-up: candidates whose notice is
not_sentneedsend_*actions (send_waitlist_notice,send_rejection_notice); usereissue_*only when an existing notice is defective/flagged for reissue.notice_followup_requiredlists those candidate IDs.notice_quality_source = notice_packet_inspection. offer_exclusion_reason_for_waitlisted = no_accepted_status_or_offer(waitlisted candidates have no accepted offer), NOTwaitlisted_not_selected.
Payroll handoff gate (recruiting)
- The handoff is created only after the selected candidate has an accepted offer, and the handoff must be a Submitted assignment; draft prechecks do NOT satisfy the gate.
payroll_handoff_gate = accepted_offer_only(the trigger to create a handoff is the accepted offer).payroll_assignment_status_required = submitted_after_acceptance;draft_payroll_allowed = false;onboarding_handoff = create_submitted_assignment_after_acceptance;handoff_control_result = submitted_handoff_required_after_acceptance.
8. Common misjudgments that cost points (checklist)
- Putting unrelated/other-case audit events into
excluded_audit_event_ids(keep it to same-case adjacent off-topic events only). - Using
message_notice_inspectioninstead ofnotice_packet_inspection. - Summing cost across all openings instead of the one target campaign.
- Returning a
period(YYYY-MM) where aneffective_date(YYYY-MM-DD) is required. - Treating the closeout gate / control result as a constant instead of deriving it from whether records are actually clean.
- Confusing missing FILE vs missing TAG (separate blockers / actions).
- Echoing
next_actionintoescalation_actionfor a non-escalation case (useno_action). - Forgetting to exclude BOTH superseded and draft records (not just one) from leave; forgetting to exclude the draft from payroll.
- Defaulting remediation owner to the file uploader instead of
People Ops Compliance.
9. Per-task method
- Read the prompt +
answer_template.json; note every key, type, and enum set. - Pull the relevant employee/case/recruitment record and ALL cross-referenced modules (ledger, policy, documents, messages, audit).
- Fill data-literal fields first (ids, salaries, day counts, dates, decisions).
- Apply the precedence/readiness/defect/audit-scope rules above for enums.
- Keep list fields tight; copy ids verbatim; use full dates; output only the JSON object (no markdown, no commentary).