Reusable workflow rules for solving Northwind PeopleOps Console lifecycle tasks against the
remote read-only JSON API. Covers onboarding closeout, leave source precedence, payroll
assignment & accrual readiness, recruitment reconciliation, and policy-case folder/notice review.
When to use
Use this skill whenever a task asks you to verify, reconcile, or audit an employee-lifecycle
record in the Northwind PeopleOps Console: approving onboarding close, determining authoritative
leave/payroll records, checking folder readiness and formal-notice quality, reconciling a
recruitment packet, or validating payroll/accrual readiness. The skill tells you which endpoints
to call, in what order, which records are authoritative, and which enum labels to emit.
Environment
API base: <remote-env-url> (read-only, no auth). Prefixed here as {BASE}.
Health: GET {BASE}/health.
The prompt's http://127.0.0.1:<port>/ and login creds refer to this same remote env; use
{BASE} for all API calls. The REST API under /api/* needs no auth.
Available GET endpoints
/api/manifest — module/endpoint map, dataset seed
/api/summary — live record counts and departments
/api/employees?q=&status= — employee profiles (leave balance lives here, but NOT the controlling policy)
/api/cases/<case_id> — FULL case detail (approvals list, attachments list, comments list, embedded audit_events list). RICHEST endpoint.
/api/policies and /api/policies/<id> — leave/payroll/folicy rule definitions
/api/payroll-ledgers?q=&status=&type= — contains BOTH "Leave assignment" AND "Salary assignment" record_types (also HRMS leave ledger / People Ops adjustment). This is the leave + payroll ledger.
/api/attachments/<attachment_id> — attachment text content (follow from case attachments)
Step-by-step SOP (endpoint calling order)
Orient.GET /api/manifest + /api/summary to confirm the dataset is live and see counts.
Identify the subject entity from the prompt: an employee_id (EMP-###), a case_id
(CASE-### / CASE-RW-###), or an opening_id (REQ-###).
Fetch the entity-specific records.
Employee/leave/payroll tasks: GET /api/employees?q=<id> (profile) AND
GET /api/payroll-ledgers?q=<id> (leave assignments + salary assignments). Filter the
ledger by record_type ("Leave assignment" vs "Salary assignment") and status.
Case/folder/notice tasks: GET /api/cases/<case_id> for full detail (approvals,
attachments, comments, audit_events). Then GET /api/documents and find the matching
folder by title/id; GET /api/messages (and /api/notifications) for the formal notice.
Recruitment tasks: GET /api/recruitment and select the opening whose opening_id matches.
Cross-reference supporting evidence.
GET /api/audit?q=<case_id> or <employee_id> for control audit events; drill
GET /api/audit/<audit_id> for detail.
GET /api/policies/<policy_id> for the rule text referenced in policy_refs.
GET /api/attachments/<id> for case attachment text.
Filter client-side if a q= query returns empty. The q= filter may not match on
employee_id; when a filtered call returns [], fetch the full list (e.g.
GET /api/audit with no params) and filter locally by case_id/employee_id.
Apply the business rules below to pick authoritative records, detect defects, and select
the audit scope.
Emit normalized enum labels exactly as spelled in the task's answer_template.json
(lowercase, underscores). Never free-text a value that has an enum equivalent.
Data-model gotchas
/api/payroll-ledgers is the single source for BOTH leave entitlement and salary. A "Leave
assignment" record carries the leave policy + days; a "Salary assignment" record carries
base_salary, effective_date (use its updated_at date, YYYY-MM-DD), and
accrual_batch_id. "HRMS leave ledger" and "People Ops adjustment" are NOT the authoritative
assignment type — only "Leave assignment"/"Salary assignment" record_type with Approved or
Submitted status controls.
/api/cases/<id> embeds audit_events, approvals, attachments, comments — read it
before querying the flat audit/messages endpoints.
/api/messages and /api/notifications return the identical formal-notice records.
Business rules (authoritative)
Leave source precedence — policy LEAVE-SRC-001
"The latest approved or submitted leave assignment for the period controls. Draft, voided, and
obsolete records are excluded even when profile summaries conflict."
An approved leave assignment overrides a stale employee profile summary when the ledger,
policy document, and audit detail confirm the assignment.
Authoritative fields come from the controlling Approved/Submitted "Leave assignment" record,
NOT the employee profile: effective_leave_policy = the assignment's policy_name;
annual_days/balance_days = its approved_leave_days.
leave_source / precedence_source = the assignment-history source, not the profile or case
summary. leave_precedence_source = approved_assignment_current_period.
profile_policy_ignored = true when the assignment overrides the profile. Audit result
profile_summary_stale => next_action = update_employee_summary.
Exclude Superseded/Draft/voided leave records (list them in excluded_leave_ids where the
template has that field).
base_salary, effective_date (the updated_at date, YYYY-MM-DD), and accrual_batch_id
come from the Submitted salary assignment. List the draft in excluded_assignment_id /
excluded_payroll_ids.
Accrual readiness: accrual_ready = true when the submitted assignment matches the accrual
batch (confirmed by a payroll.ready audit event). control_result =
ready_with_monitoring when the audit says so.
"Recruiting payroll handoff is created only after a selected candidate has an accepted offer.
The handoff must be submitted; draft prechecks do not satisfy the assignment gate."
draft_payroll_allowed = false. payroll_handoff_gate is gated on the accepted offer.
onboarding_handoff = create_submitted_assignment_after_acceptance when an accepted offer
exists and no submitted assignment is present yet.
Verify the exact enum intended for payroll_assignment_status_required and
handoff_control_result against the template (the _after_acceptance suffix appears in some
enum values; pick the variant consistent with the gate wording).
"A folder is not ready unless all required files and required tags shown in the folder
checklist are present."
folder_ready = (every required_files entry is in files) AND (every required_tags entry
is in tags).
missing_files = required_files NOT present in files (every one).
required_tag_present = (required_tags subset of tags); folder_required_tag_action =
add_required_tag if any required tag is missing, else no_tag_action.
closeout_blockers (list, only the ones that apply): missing_required_files,
missing_required_tags, defective_formal_notice.
Formal notices must contain: appeal instructions, acknowledgement deadline, and the
correct policy reference; waitlist notices must also state waitlist status.
notice_quality = valid if no defects, else defective; notice_defects = the defect list
(already provided on the message/notice-packet record).
Evidence source: for case notices use /api/messages => notice_evidence_source =
message_notice_inspection. For recruitment, notice packets live inside the
/api/recruitment opening object => notice_quality_source =
notice_packet_inspection.
Approval closeout gate
Approval is sufficient when records are clean (leave + payroll clean AND no folder/notice
defects) => approval_closeout_gate = approval_sufficient_when_records_clean.
Approval is NOT sufficient when the folder OR the notice is defective =>
approval_not_sufficient_when_folder_or_notice_defective.
final_control_result / control_result:
approve_closeout — leave + payroll clean and no folder/notice defects.
hold_for_folder_and_notice_defects — folder or notice defective.
leave_source_precedence_only — include leave audit events; EXCLUDE adjacent
document/notice audit events (e.g. a folder.tag_missing event on the same case).
document_notice_findings_only — include document/notice audit events; exclude adjacent
leave/payroll events.
payroll_assignment_readiness — include the payroll audit event.
audit_event_id = the single primary audit event supporting the review.
supporting_audit_event_ids = the audit event(s) that support THIS decision. Do NOT leave
it empty when a supporting audit exists — include the relevant event id(s) (including the
primary when it is the supporting one for that scope).
excluded_audit_event_ids = adjacent-scope audit events on the same case that must NOT
influence this decision.
Cross-module escalation packages (event: cross_module.escalation_package) bundle events from
multiple cases/scopes; do NOT pull their referenced events into a single per-case scope
decision.
Escalation owner
Folder/file defects => records_remediation_owner = Records (POL-DOCS-2026 owner; folder
attachments are uploaded by Records).
Cross-module escalation control owner = People Ops Compliance.
escalation_action = open_records_remediation for records/folder defects. This field is
DISTINCT from next_action — do not duplicate next_action into escalation_action.
next_action is the case's immediate step (e.g. block_close_and_reissue_notice for a
defective notice); escalation_action is the records-remediation escalation.
notice_remediation_action = reissue_defective_notices when a notice is defective; else
no_notice_action.
Cost-summing (recruitment)
recruitment_cost_total = the sum of ALL line items in the target opening's cost_ledger
(that opening only — do not include other openings' ledgers). Sum the amount field of every
cost_ledger entry.
Candidate outcomes (recruitment)
selected_candidate = the candidate with committee_decision = Selected AND an accepted
offer in offer_register.
waitlisted_candidates / rejected_candidates = the candidate IDs with the matching
committee_decision.
notice_followup_required = candidate IDs needing a notice action (send or reissue).
offer_exclusion_reason_for_waitlisted = reason the waitlisted candidate is excluded from the
offer/handoff. Two readings exist; verify against the offer register: the outcome-based reading
waitlisted_not_selected, and the handoff-gate reading no_accepted_status_or_offer (no
accepted offer => no handoff). Pick the one the template's surrounding fields imply.
cost_source = recruitment_cost_ledger.
Arrays must contain candidate IDs only (no names).
Exact answer fields by task shape
Onboarding closeout (leave + payroll setup) — e.g. EMP-104
Payroll assignment & accrual readiness — e.g. EMP-122
Fields: employee_id, salary_assignment_id, base_salary, effective_date (YYYY-MM-DD from
updated_at of the submitted assignment), excluded_assignment_id, accrual_ready,
accrual_batch_id, audit_event_id, control_result (ready_with_monitoring |
hold_for_folder_and_notice_defects | approve_closeout), payroll_source_status,
draft_exclusion_rule (exclude_draft_assignment | draft_allowed | exclude_superseded_only),
audit_scope.
Common misjudgments & exclusion rules (learned from low scores)
Empty supporting_audit_event_ids. Leaving it [] when a supporting audit event exists
loses points. Always list the audit event id(s) that support the decision (including the
primary one for that scope).
escalation_action duplicated as next_action. They are distinct fields. For a
folder-defect + notice-defect case: next_action = block_close_and_reissue_notice (the
case's immediate step), escalation_action = open_records_remediation (escalate the
folder/file issue to Records). Setting escalation_action = block_close_and_reissue_notice
was confirmed WRONG and lowered the score.
Using draft / superseded / obsolete records as authoritative. Only Approved or Submitted
"Leave assignment"/"Salary assignment" records control. Exclude drafts and superseded records
in the excluded_* fields.
Trusting the employee profile summary over the approved assignment. When the profile is
stale (audit says profile_summary_stale), profile_policy_ignored = true and the
assignment's policy/days win.
Counting a folder ready when files or tags are missing.folder_ready requires ALL
required_files AND ALL required_tags. List every absent required file in missing_files.
Pulling adjacent-scope audit events into a narrow-scope decision. For a leave-scope
decision, exclude the document/notice audit (e.g. folder.tag_missing); for a document/notice
decision, exclude leave/payroll audits. Cross-module escalation-package referenced events do
not belong in a per-case scope decision.
Summing cost ledgers across openings.recruitment_cost_total is only the target
opening's cost_ledger sum.
Payroll handoff for non-selected / non-accepted candidates. The handoff requires an
accepted offer from the SELECTED candidate only; waitlisted/rejected candidates get notice
follow-up, not a payroll assignment.
effective_date as a period string. Use the assignment's effective date YYYY-MM-DD
(from updated_at), not the period (YYYY-MM).
Recruitment handoff enum certainty. The _after_acceptance variants exist for several
payroll-handoff fields; confirm which variant each field expects against the template and
the policy wording rather than assuming all fields take the suffixed form.
Pre-submission checklist
Every answer field from the template is present; no extra/missing fields.
All enum values spelled EXACTLY as in answer_template.json (lowercase, underscores).
Leave/payroll: the approved/submitted assignment is the source; drafts/superseded are
excluded and listed in excluded_*_ids; base_salary/effective_leave_policy/annual_days
come from the controlling assignment.
Notice:notice_quality + notice_defects taken from /api/messages (case) or the
opening's notice_packets (recruitment); each required component checked
(ack deadline, appeal instructions, waitlist status, correct policy).
Audit:audit_event_id set; supporting_audit_event_ids non-empty when a supporting
audit exists; excluded_audit_event_ids lists only adjacent-scope events;
audit_scope matches the task.
Closeout:approval_closeout_gate, closeout_blockers, final_control_result, and
next_action are consistent with the defects found.
Escalation:records_remediation_owner, escalation_action (≠ next_action),
notice_remediation_action all set and distinct.
Recruitment: arrays contain candidate IDs only; recruitment_cost_total = sum of that
opening's cost_ledger; selected_candidate has an accepted offer; offer/handoff fields
consistent with the accepted-offer gate; draft_payroll_allowed = false.
JSON is valid; no markdown or explanatory text around it; boolean and number types correct.
1---2name: reflect-3-attempt-03-193description: HR Employee-Lifecycle Verification Skill4---5# HR Employee-Lifecycle Verification Skill67Reusable workflow rules for solving Northwind PeopleOps Console lifecycle tasks against the8remote read-only JSON API. Covers onboarding closeout, leave source precedence, payroll9assignment & accrual readiness, recruitment reconciliation, and policy-case folder/notice review.1011## When to use1213Use this skill whenever a task asks you to verify, reconcile, or audit an employee-lifecycle14record in the Northwind PeopleOps Console: approving onboarding close, determining authoritative15leave/payroll records, checking folder readiness and formal-notice quality, reconciling a16recruitment packet, or validating payroll/accrual readiness. The skill tells you which endpoints17to call, in what order, which records are authoritative, and which enum labels to emit.1819## Environment2021- API base: `<remote-env-url>` (read-only, no auth). Prefixed here as `{BASE}`.22- Health: `GET {BASE}/health`.23- The prompt's `http://127.0.0.1:<port>/` and login creds refer to this same remote env; use24 `{BASE}` for all API calls. The REST API under `/api/*` needs no auth.2526### Available GET endpoints27- `/api/manifest` — module/endpoint map, dataset seed28- `/api/summary` — live record counts and departments29- `/api/employees?q=&status=` — employee profiles (leave balance lives here, but NOT the controlling policy)30- `/api/cases?q=&status=&type=` — policy-case summaries31- `/api/cases/<case_id>` — FULL case detail (approvals list, attachments list, comments list, embedded audit_events list). RICHEST endpoint.32- `/api/policies` and `/api/policies/<id>` — leave/payroll/folicy rule definitions33- `/api/payroll-ledgers?q=&status=&type=` — contains BOTH "Leave assignment" AND "Salary assignment" record_types (also HRMS leave ledger / People Ops adjustment). This is the leave + payroll ledger.34- `/api/recruitment?q=` — openings, candidates, offer_register, cost_ledger, notice_packets, payroll_precheck_records, audit_event_id35- `/api/documents?q=` — lifecycle folders (files present, required_files, tags, required_tags, ready)36- `/api/messages?q=` — formal notice messages (defects, quality, ack deadline, appeal info)37- `/api/notifications?q=` — same formal-notice records as messages38- `/api/audit?q=&case_id=` — audit events (control results, owners, SLA)39- `/api/audit/<audit_id>` — single audit event detail40- `/api/attachments/<attachment_id>` — attachment text content (follow from case attachments)4142## Step-by-step SOP (endpoint calling order)43441. **Orient.** `GET /api/manifest` + `/api/summary` to confirm the dataset is live and see counts.452. **Identify the subject entity** from the prompt: an `employee_id` (EMP-###), a `case_id`46 (CASE-### / CASE-RW-###), or an `opening_id` (REQ-###).473. **Fetch the entity-specific records.**48 - Employee/leave/payroll tasks: `GET /api/employees?q=<id>` (profile) AND49 `GET /api/payroll-ledgers?q=<id>` (leave assignments + salary assignments). Filter the50 ledger by `record_type` ("Leave assignment" vs "Salary assignment") and `status`.51 - Case/folder/notice tasks: `GET /api/cases/<case_id>` for full detail (approvals,52 attachments, comments, audit_events). Then `GET /api/documents` and find the matching53 folder by title/id; `GET /api/messages` (and `/api/notifications`) for the formal notice.54 - Recruitment tasks: `GET /api/recruitment` and select the opening whose `opening_id` matches.554. **Cross-reference supporting evidence.**56 - `GET /api/audit?q=<case_id>` or `<employee_id>` for control audit events; drill57 `GET /api/audit/<audit_id>` for detail.58 - `GET /api/policies/<policy_id>` for the rule text referenced in `policy_refs`.59 - `GET /api/attachments/<id>` for case attachment text.605. **Filter client-side if a `q=` query returns empty.** The `q=` filter may not match on61 `employee_id`; when a filtered call returns `[]`, fetch the full list (e.g.62 `GET /api/audit` with no params) and filter locally by `case_id`/`employee_id`.636. **Apply the business rules below** to pick authoritative records, detect defects, and select64 the audit scope.657. **Emit normalized enum labels** exactly as spelled in the task's `answer_template.json`66 (lowercase, underscores). Never free-text a value that has an enum equivalent.6768### Data-model gotchas69- `/api/payroll-ledgers` is the single source for BOTH leave entitlement and salary. A "Leave70 assignment" record carries the leave policy + days; a "Salary assignment" record carries71 `base_salary`, `effective_date` (use its `updated_at` date, `YYYY-MM-DD`), and72 `accrual_batch_id`. "HRMS leave ledger" and "People Ops adjustment" are NOT the authoritative73 assignment type — only "Leave assignment"/"Salary assignment" `record_type` with Approved or74 Submitted `status` controls.75- `/api/cases/<id>` embeds `audit_events`, `approvals`, `attachments`, `comments` — read it76 before querying the flat audit/messages endpoints.77- `/api/messages` and `/api/notifications` return the identical formal-notice records.7879## Business rules (authoritative)8081### Leave source precedence — policy LEAVE-SRC-00182- "The latest approved or submitted leave assignment for the period controls. Draft, voided, and83 obsolete records are excluded even when profile summaries conflict."84- An **approved leave assignment overrides a stale employee profile summary** when the ledger,85 policy document, and audit detail confirm the assignment.86- Authoritative fields come from the controlling Approved/Submitted "Leave assignment" record,87 NOT the employee profile: `effective_leave_policy` = the assignment's `policy_name`;88 `annual_days`/`balance_days` = its `approved_leave_days`.89- `leave_source` / `precedence_source` = the assignment-history source, not the profile or case90 summary. `leave_precedence_source` = `approved_assignment_current_period`.91- `profile_policy_ignored` = `true` when the assignment overrides the profile. Audit result92 `profile_summary_stale` => `next_action` = `update_employee_summary`.93- Exclude Superseded/Draft/voided leave records (list them in `excluded_leave_ids` where the94 template has that field).9596### Payroll assignment source — policy PAY-SRC-001 (section 3.4)97- "Use the current submitted salary assignment. Draft planning assignments do not affect payroll98 readiness or accrual checks."99- `payroll_source_status` = `submitted`; `draft_exclusion_rule` = `exclude_draft_assignment`.100- `base_salary`, `effective_date` (the `updated_at` date, `YYYY-MM-DD`), and `accrual_batch_id`101 come from the **Submitted** salary assignment. List the draft in `excluded_assignment_id` /102 `excluded_payroll_ids`.103- Accrual readiness: `accrual_ready` = `true` when the submitted assignment matches the accrual104 batch (confirmed by a `payroll.ready` audit event). `control_result` =105 `ready_with_monitoring` when the audit says so.106107### Recruiting handoff gate — policy PAY-SRC-001 (section 4.2)108- "Recruiting payroll handoff is created only after a selected candidate has an accepted offer.109 The handoff must be submitted; draft prechecks do not satisfy the assignment gate."110- `draft_payroll_allowed` = `false`. `payroll_handoff_gate` is gated on the accepted offer.111- `onboarding_handoff` = `create_submitted_assignment_after_acceptance` when an accepted offer112 exists and no submitted assignment is present yet.113- `handoff_control_result` = `submitted_handoff_required_after_acceptance`.114- Verify the exact enum intended for `payroll_assignment_status_required` and115 `handoff_control_result` against the template (the `_after_acceptance` suffix appears in some116 enum values; pick the variant consistent with the gate wording).117118### Folder readiness — policy POL-DOCS-2026 (section 5.1)119- "A folder is not ready unless all required files and required tags shown in the folder120 checklist are present."121- `folder_ready` = (every `required_files` entry is in `files`) AND (every `required_tags` entry122 is in `tags`).123- `missing_files` = required_files NOT present in files (every one).124- `required_tag_present` = (required_tags subset of tags); `folder_required_tag_action` =125 `add_required_tag` if any required tag is missing, else `no_tag_action`.126- `closeout_blockers` (list, only the ones that apply): `missing_required_files`,127 `missing_required_tags`, `defective_formal_notice`.128129### Notice defect detection — policy HR-POL-014 (section 7.1)130- Formal notices must contain: **appeal instructions**, **acknowledgement deadline**, and the131 **correct policy** reference; waitlist notices must also state **waitlist status**.132- Defect enums: `missing_ack_deadline`, `missing_appeal_instructions`,133 `missing_waitlist_status`, `missing_correct_policy`.134- `notice_quality` = `valid` if no defects, else `defective`; `notice_defects` = the defect list135 (already provided on the message/notice-packet record).136- Evidence source: for case notices use `/api/messages` => `notice_evidence_source` =137 `message_notice_inspection`. For recruitment, notice packets live inside the138 `/api/recruitment` opening object => `notice_quality_source` =139 `notice_packet_inspection`.140141### Approval closeout gate142- Approval is **sufficient** when records are clean (leave + payroll clean AND no folder/notice143 defects) => `approval_closeout_gate` = `approval_sufficient_when_records_clean`.144- Approval is **NOT sufficient** when the folder OR the notice is defective =>145 `approval_not_sufficient_when_folder_or_notice_defective`.146- `final_control_result` / `control_result`:147 - `approve_closeout` — leave + payroll clean and no folder/notice defects.148 - `hold_for_folder_and_notice_defects` — folder or notice defective.149 - `ready_with_monitoring` — payroll assignment ready & matches accrual batch (monitor).150- `next_action`: `approve_onboarding_close` (clean), `block_close_and_reissue_notice` (defective151 notice blocks close), `open_records_remediation` (records to fix), `update_employee_summary`152 (stale profile).153154### Audit selection & scope155- Match the audit scope to the task:156 - `leave_source_precedence_only` — include leave audit events; **EXCLUDE adjacent157 document/notice audit events** (e.g. a `folder.tag_missing` event on the same case).158 - `document_notice_findings_only` — include document/notice audit events; exclude adjacent159 leave/payroll events.160 - `payroll_assignment_readiness` — include the payroll audit event.161- `audit_event_id` = the single primary audit event supporting the review.162- `supporting_audit_event_ids` = the audit event(s) that support THIS decision. **Do NOT leave163 it empty when a supporting audit exists** — include the relevant event id(s) (including the164 primary when it is the supporting one for that scope).165- `excluded_audit_event_ids` = adjacent-scope audit events on the same case that must NOT166 influence this decision.167- Cross-module escalation packages (`event: cross_module.escalation_package`) bundle events from168 multiple cases/scopes; do NOT pull their referenced events into a single per-case scope169 decision.170171### Escalation owner172- Folder/file defects => `records_remediation_owner` = `Records` (POL-DOCS-2026 owner; folder173 attachments are uploaded by Records).174- Cross-module escalation control owner = `People Ops Compliance`.175- `escalation_action` = `open_records_remediation` for records/folder defects. **This field is176 DISTINCT from `next_action`** — do not duplicate `next_action` into `escalation_action`.177 `next_action` is the case's immediate step (e.g. `block_close_and_reissue_notice` for a178 defective notice); `escalation_action` is the records-remediation escalation.179- `notice_remediation_action` = `reissue_defective_notices` when a notice is defective; else180 `no_notice_action`.181182### Cost-summing (recruitment)183- `recruitment_cost_total` = the **sum of ALL line items** in the target opening's `cost_ledger`184 (that opening only — do not include other openings' ledgers). Sum the `amount` field of every185 `cost_ledger` entry.186187### Candidate outcomes (recruitment)188- `selected_candidate` = the candidate with `committee_decision` = `Selected` AND an `accepted`189 offer in `offer_register`.190- `waitlisted_candidates` / `rejected_candidates` = the candidate IDs with the matching191 `committee_decision`.192- `candidate_status_source` = `interview_feedback_and_offer`; `candidate_outcome_control` =193 `committee_decision_with_offer_confirmation`.194- `selected_offer_status` = the offer's `status` (`accepted`/`draft`/`withdrawn`/`none`).195- Notice follow-up (from the opening's `notice_packets`):196 - Waitlisted: `send_waitlist_notice` (not sent) / `reissue_waitlist_notice_not_rejection`197 (defective or sent as rejection).198 - Rejected: `send_rejection_notice` (not sent) / `reissue_rejection_notice` (defective).199 - `notice_followup_required` = candidate IDs needing a notice action (send or reissue).200- `offer_exclusion_reason_for_waitlisted` = reason the waitlisted candidate is excluded from the201 offer/handoff. Two readings exist; verify against the offer register: the outcome-based reading202 `waitlisted_not_selected`, and the handoff-gate reading `no_accepted_status_or_offer` (no203 accepted offer => no handoff). Pick the one the template's surrounding fields imply.204- `cost_source` = `recruitment_cost_ledger`.205- Arrays must contain candidate IDs only (no names).206207## Exact answer fields by task shape208209### Onboarding closeout (leave + payroll setup) — e.g. EMP-104210Fields: `employee_id`, `effective_leave_policy`, `leave_source` (leave_assignment_history |211employee_profile_summary | case_summary_only), `annual_days`, `assignment_id`,212`excluded_leave_ids`, `payroll_assignment_id`, `base_salary`, `payroll_status` (submitted |213draft | superseded), `excluded_payroll_ids`, `closeout_action` (approve_onboarding_close |214block_close_and_reissue_notice | open_records_remediation), `leave_precedence_source`215(approved_assignment_current_period | profile_summary_current_period | case_summary_only),216`payroll_source_status`, `approval_closeout_gate`, `final_control_result`.217218### Folder + notice review — e.g. CASE-RW-221219Fields: `case_id`, `final_decision` (approved_with_conditions | approved | rejected | held),220`approval_authority`, `approval_event_id` (the approval_id), `folder_ready`, `missing_files`,221`required_tag_present`, `notice_quality` (valid | defective), `notice_defects` (list[enum]),222`audit_event_id`, `supporting_audit_event_ids`, `excluded_audit_event_ids`, `audit_scope`223(document_notice_findings_only | leave_source_precedence_only | payroll_assignment_readiness),224`next_action`, `approval_closeout_gate`, `closeout_blockers` (list[enum]),225`evidence_source_order` (approval_history_folder_notice_audit | folder_notice_audit | audit_only),226`folder_required_tag_action`, `notice_evidence_source` (notice_packet_inspection |227message_notice_inspection | case_summary_only), `escalation_action`, `records_remediation_owner`228(Records | People Ops Compliance | Payroll QA), `notice_remediation_action`, `final_control_result`.229230### Recruitment reconciliation — e.g. REQ-DA-77231Fields: `opening_id`, `selected_candidate`, `waitlisted_candidates`, `rejected_candidates`,232`offer_id`, `offer_base_salary`, `recruitment_cost_total`, `notice_followup_required`,233`onboarding_handoff`, `candidate_status_source`, `candidate_outcome_control`,234`selected_offer_status`, `cost_source`, `notice_quality_source`, `waitlisted_followup_action`,235`rejected_followup_action`, `payroll_handoff_gate`, `payroll_assignment_status_required`,236`draft_payroll_allowed`, `offer_exclusion_reason_for_waitlisted`, `handoff_control_result`.237238### Leave source precedence — e.g. EMP-118239Fields: `employee_id`, `effective_leave_policy`, `assignment_id`, `balance_days`,240`precedence_source` (approved_assignment_over_profile | employee_profile_summary |241case_summary_only), `profile_policy_ignored`, `audit_event_id`, `audit_result`242(profile_summary_stale | ready_with_monitoring | block_close), `next_action`243(update_employee_summary | open_records_remediation | no_action), `leave_precedence_source`,244`supporting_audit_event_ids`, `excluded_audit_event_ids`, `audit_scope`.245246### Payroll assignment & accrual readiness — e.g. EMP-122247Fields: `employee_id`, `salary_assignment_id`, `base_salary`, `effective_date` (YYYY-MM-DD from248updated_at of the submitted assignment), `excluded_assignment_id`, `accrual_ready`,249`accrual_batch_id`, `audit_event_id`, `control_result` (ready_with_monitoring |250hold_for_folder_and_notice_defects | approve_closeout), `payroll_source_status`,251`draft_exclusion_rule` (exclude_draft_assignment | draft_allowed | exclude_superseded_only),252`audit_scope`.253254## Common misjudgments & exclusion rules (learned from low scores)2552561. **Empty `supporting_audit_event_ids`.** Leaving it `[]` when a supporting audit event exists257 loses points. Always list the audit event id(s) that support the decision (including the258 primary one for that scope).2592. **`escalation_action` duplicated as `next_action`.** They are distinct fields. For a260 folder-defect + notice-defect case: `next_action` = `block_close_and_reissue_notice` (the261 case's immediate step), `escalation_action` = `open_records_remediation` (escalate the262 folder/file issue to Records). Setting `escalation_action` = `block_close_and_reissue_notice`263 was confirmed WRONG and lowered the score.2643. **Using draft / superseded / obsolete records as authoritative.** Only Approved or Submitted265 "Leave assignment"/"Salary assignment" records control. Exclude drafts and superseded records266 in the `excluded_*` fields.2674. **Trusting the employee profile summary over the approved assignment.** When the profile is268 stale (audit says `profile_summary_stale`), `profile_policy_ignored` = `true` and the269 assignment's policy/days win.2705. **Counting a folder ready when files or tags are missing.** `folder_ready` requires ALL271 required_files AND ALL required_tags. List every absent required file in `missing_files`.2726. **Pulling adjacent-scope audit events into a narrow-scope decision.** For a leave-scope273 decision, exclude the document/notice audit (e.g. `folder.tag_missing`); for a document/notice274 decision, exclude leave/payroll audits. Cross-module escalation-package referenced events do275 not belong in a per-case scope decision.2767. **Summing cost ledgers across openings.** `recruitment_cost_total` is only the target277 opening's `cost_ledger` sum.2788. **Payroll handoff for non-selected / non-accepted candidates.** The handoff requires an279 accepted offer from the SELECTED candidate only; waitlisted/rejected candidates get notice280 follow-up, not a payroll assignment.2819. **`effective_date` as a period string.** Use the assignment's effective date `YYYY-MM-DD`282 (from `updated_at`), not the `period` (`YYYY-MM`).28310. **Recruitment handoff enum certainty.** The `_after_acceptance` variants exist for several284 payroll-handoff fields; confirm which variant each field expects against the template and285 the policy wording rather than assuming all fields take the suffixed form.286287## Pre-submission checklist288289- [ ] Every answer field from the template is present; no extra/missing fields.290- [ ] All enum values spelled EXACTLY as in `answer_template.json` (lowercase, underscores).291- [ ] **Leave/payroll:** the approved/submitted assignment is the source; drafts/superseded are292 excluded and listed in `excluded_*_ids`; `base_salary`/`effective_leave_policy`/`annual_days`293 come from the controlling assignment.294- [ ] **Folder:** `folder_ready`, `missing_files` (all absent required files),295 `required_tag_present`, `folder_required_tag_action` are mutually consistent.296- [ ] **Notice:** `notice_quality` + `notice_defects` taken from `/api/messages` (case) or the297 opening's `notice_packets` (recruitment); each required component checked298 (ack deadline, appeal instructions, waitlist status, correct policy).299- [ ] **Audit:** `audit_event_id` set; `supporting_audit_event_ids` non-empty when a supporting300 audit exists; `excluded_audit_event_ids` lists only adjacent-scope events;301 `audit_scope` matches the task.302- [ ] **Closeout:** `approval_closeout_gate`, `closeout_blockers`, `final_control_result`, and303 `next_action` are consistent with the defects found.304- [ ] **Escalation:** `records_remediation_owner`, `escalation_action` (≠ `next_action`),305 `notice_remediation_action` all set and distinct.306- [ ] **Recruitment:** arrays contain candidate IDs only; `recruitment_cost_total` = sum of that307 opening's `cost_ledger`; `selected_candidate` has an accepted offer; offer/handoff fields308 consistent with the accepted-offer gate; `draft_payroll_allowed` = false.309- [ ] **Leave precedence:** `precedence_source`/`leave_precedence_source` = the assignment310 source; `profile_policy_ignored` correct; adjacent document/notice audit excluded.311- [ ] JSON is valid; no markdown or explanatory text around it; boolean and number types correct.
Run npx skillmds@latest add prism-shadow/reflect-3-attempt-03-19 in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
HR Employee-Lifecycle Verification Skill It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
prism-shadow (@prism-shadow) published this skill. Their other Agent Skills are listed on their SkillMD profile.