Northwind PeopleOps Verification
Core SOP
- Read the task prompt and
input/payloads/answer_template.jsonfirst. Extract the target IDs, required modules, field names, and every enumallowed_values; final JSON must use those labels exactly. - Query the local app by ID, not by broad browsing. Prefer the structured API over manual UI inspection, then use case/audit detail endpoints for evidence that list endpoints omit.
- Decide authoritative records from source status and scope. Exclude drafts, superseded/obsolete records, and adjacent out-of-scope audit events even when they are newer or easier to find.
- Fill every template field with the narrowest supported value. Use empty arrays for no evidence, booleans for actual computed state, numbers without commas, and JSON only.
- Before finalizing, check that every enum value appears in the template and that each list contains the requested item type only, such as candidate IDs only or filenames only.
Environment Use
Use the port from the task prompt:
BASE=http://127.0.0.1:<port>
curl --noproxy '*' -sS "$BASE/health"
The browser UI has left-nav modules for Dashboard, Employees, Recruitment, Leave, Payroll, Policy Cases, Documents, Messages, and Audit Log. If the UI prompts for login, use the provided PeopleOps credentials. In this environment the frontend API usually returns JSON directly and is faster than UI clicking.
Useful API patterns:
GET /api/employees?q=<employee_id_or_name>: employee profile summary. Treat as corroborating evidence unless the task/template says profile summary is authoritative.GET /api/payroll-ledgers?q=<employee_id>: leave assignments, salary assignments, payroll/accrual evidence. Filter byrecord_type,status,period, and IDs.GET /api/cases?q=<case_id_or_employee_id>: case queue summary.GET /api/cases/<case_id>: approvals, attachments/checklists, comments, case audit events, policy refs.GET /api/documents?q=<case_id_or_employee_id>: folder readiness, files, required files, tags, required tags.GET /api/messages?q=<case_id_or_candidate_or_opening>: formal notices, message status, quality, body, defects.GET /api/audit?q=<entity_id>andGET /api/audit/<audit_id>: audit events and details.GET /api/policies?q=<keyword>or/api/policies/<policy_id>: source-precedence and control policies.GET /api/recruitment?q=<opening_id>: candidates, committee decisions, offer register, cost ledger, notice packets, payroll precheck/handoff records. Related recruitment cases are often available as/api/cases/<opening_id>.
Make HTTP requests sequentially. If a localhost request briefly returns connection refused, run /health and retry the same targeted request instead of changing strategy.
Business Rules
Leave Source Precedence
- The authoritative leave policy/days come from the current-period leave assignment ledger when an assignment is
Approvedor otherwise submitted/approved as a final source. Use the assignmentledger_idas the assignment ID. - Draft, voided, obsolete, and superseded leave assignments are exclusions. Include their IDs in
excluded_leave_idsor equivalent fields when the template asks. - An approved current-period assignment overrides a stale employee profile summary. Use profile values only when no controlling assignment exists or when the template/evidence explicitly makes the profile current.
- Use assignment fields for leave days (
approved_leave_days, annual entitlement, or balance as requested), not draft worksheet values. Treat profile balance as corroboration, not precedence. - For leave audit questions, choose audit events whose detail is about leave source/profile mismatch. Put document, folder, or notice events in
excluded_audit_event_idswhen the prompt asks to exclude adjacent events. - Common normalized labels:
leave_source:leave_assignment_historywhen the ledger assignment controls;employee_profile_summaryonly when the profile is the current source;case_summary_onlyonly when no record evidence is available.precedence_source:approved_assignment_over_profilewhen approved assignment conflicts with profile.leave_precedence_source:approved_assignment_current_periodfor a current approved assignment;profile_summary_current_periodonly for current profile source.audit_scope:leave_source_precedence_onlyfor leave-source decisions.
Payroll And Accrual Readiness
- Current submitted salary assignment controls base salary and payroll readiness. Use the submitted salary assignment ID and salary; exclude draft and superseded salary assignments.
- Draft planning payroll records never satisfy payroll readiness, closeout, accrual, or recruitment handoff gates.
- If the template asks for
effective_dateand the salary record has a period plus timestamp rather than a separate effective date, use the effective period start date when supported by the record. - Accrual readiness requires submitted payroll assignment evidence plus an accrual batch/readiness signal or payroll-readiness audit evidence. Use
ready_with_monitoringonly for monitoring-ready states, not for case close approval. - Common normalized labels:
payroll_source_status:submittedfor the selected salary assignment;draftorsupersededonly when the selected source really has that status.draft_exclusion_rule:exclude_draft_assignmentwhen drafts are excluded.audit_scope:payroll_assignment_readinessfor payroll/accrual evidence.draft_payroll_allowed: usuallyfalseunless the template or policy explicitly allows drafts.
Folder, Notice, And Closeout Controls
- Approval history determines the approval decision and authority, but approval alone is not enough to close if required folder files/tags or formal notices are defective.
- Folder readiness is true only when every
required_filesitem is present infilesand everyrequired_tagsitem is present intags. Missing files/tags are blockers. - Formal notice quality comes from notice packet/message inspection and audit details, not just case status. Map defects to template enum values such as
missing_ack_deadline,missing_appeal_instructions,missing_waitlist_status, ormissing_correct_policy. - If folder or notice defects exist, use hold/block labels such as
block_close_and_reissue_notice,approval_not_sufficient_when_folder_or_notice_defective,hold_for_folder_and_notice_defects, and include the relevantcloseout_blockers. - If all authoritative records are clean, approval-close labels should be the sufficient/approve variants from the template, not remediation labels.
- Set
folder_required_tag_actiontoadd_required_tagonly when a required tag is missing; otherwise useno_tag_action. - Use
notice_remediation_action: reissue_defective_noticeswhen a formal notice is defective; useno_notice_actiononly when the notice is valid or no notice action is required. - For document/notice audit decisions, choose audit events about folder or notice findings and exclude leave/payroll audit events if the template asks.
Recruitment Reconciliation
- Candidate outcomes should come from committee/interview decision evidence plus offer register confirmation. Do not rely on message status alone when committee/offer evidence exists.
selected_candidaterequires a selected committee decision and an accepted offer when the template asks for final outcome. Waitlisted and rejected arrays contain candidate IDs only.offer_id, selected offer status, and offer salary come from the accepted offer register, not from case summaries or messages.recruitment_cost_totalis the sum of all recruiting campaign cost-ledgeramountlines. Do not omit small chargeback/screening lines.notice_followup_requiredshould include waitlisted/rejected candidates whose notice packet says not sent, defective, or requires a send/reissue action. Do not include the accepted selected candidate unless the packet requires a notice follow-up.- Recruiting payroll handoff is gated by an accepted selected offer. The handoff/precheck must be submitted; draft handoffs do not satisfy the gate.
- If there is an accepted selected offer but no submitted handoff/precheck, use the template's create/submitted-after-acceptance labels, such as
create_payroll_precheck,submitted_after_acceptance, andsubmitted_handoff_required_after_acceptancewhen those values are allowed. - Common normalized labels:
candidate_status_source:interview_feedback_and_offerwhen candidate review and offer register are available.candidate_outcome_control:committee_decision_with_offer_confirmationwhen committee decision and accepted offer align.cost_source:recruitment_cost_ledgerwhen summing cost lines.notice_quality_source:notice_packet_inspectionwhen notice packet records show follow-up.payroll_handoff_gate:accepted_offer_onlyunless the template/evidence requires a submitted assignment gate.
Field Normalization
- Use exact IDs from records: employee IDs, case IDs, assignment/ledger IDs, offer IDs, candidate IDs, message IDs, audit IDs, batch IDs, and document filenames.
excluded_*fields should contain records actively considered and rejected because they are draft, superseded, obsolete, voided, non-current, or outside the requested audit scope.supporting_audit_event_idscontains only audit events supporting the requested decision.excluded_audit_event_idscontains adjacent events that are real but irrelevant to that decision.audit_event_idshould be the primary event supporting the answer; when multiple events support the decision, also populatesupporting_audit_event_idsif present in the template.approval_event_idandapproval_authoritycome from case approval history, not comments or notice messages.folder_ready,required_tag_present,accrual_ready, and similar booleans must be computed from evidence, not copied from a high-level case status unless no lower-level evidence exists.- For status/source/gate/control fields, never invent prose. Select one of the template enum labels even if several labels sound similar.
Common Pitfalls
- Do not let a newer draft override an older approved/submitted record.
- Do not use employee profile leave policy when an approved assignment and audit/policy evidence say the profile is stale.
- Do not treat an approval as closeout-ready when a folder checklist or formal notice is defective.
- Do not count out-of-scope audit events as support. Leave audits, payroll audits, and document/notice audits answer different questions.
- Do not include names in candidate arrays when the prompt says arrays must contain candidate IDs only.
- Do not forget small recruitment cost ledger lines; sum every line under the opening.
- Do not use case summary alone when the task points to ledgers, policy viewer, notice packets, or audit detail.
- Do not return markdown, comments, trailing commas, or fields absent from the template.