# Cobalt Operations Team: payroll register, payslip, benefits and leave documents

One payroll run end to end: the shifts that produced the hours, the register that turns them into gross, deductions and net, the payslip lines and two rendered payslips, the benefit schedule that explains one of the deductions, the leave balances, the bank payment file in both a readable CSV and a fixed-width form with its column map and COBOL copybook, the journal that posts it, and the employer cost and year-to-date summaries.

All parties, amounts and identifiers are fictional. Fixed snapshot: 2026-09-08. Every record is derived from the shared operating model `people-operations`, so identifiers join across this set and across the business-kit fixtures that use the same model.

## Reconciliation identities this set asserts

- Shift base pay sums to 9072.00, the gross pay on the register.
- gross_pay less income_tax, pension and health benefit equals net_pay on every employee and in total, 6649.44.
- The payslip lines, with deductions as negative amounts, sum to the same 6649.44.
- The bank payment file totals 6649.44, and the fixed-width form carries 664944 cents as its declared control total.
- The payroll journal balances at 10542.17 on each side.
- Employer contributions of 1470.17 appear in the journal and the cost summary and in no deduction column anywhere.
- entitlement less taken less approved future leave equals remaining on every employee, 1168 hours across the team, with pending requests excluded.

## Files

| File | Format | Validity | What it is |
| --- | --- | --- | --- |
| `payroll-register.csv` | csv | valid | Payroll register |
| `payroll-register.json` | json | valid | Payroll register JSON |
| `payroll-register.xlsx` | xlsx | valid | Payroll register workbook |
| `payroll-register-deductions-mismatch.csv` | csv | invalid | Payroll register whose deductions do not reconcile to net pay |
| `payslip-lines.csv` | csv | valid | Payslip lines for every employee |
| `pay-element-codes.csv` | csv | reference | Pay element code list |
| `payslip-EMP-03.pdf` | pdf | valid | Payslip PDF for EMP-03 |
| `payslip-EMP-08.pdf` | pdf | valid | Payslip PDF for EMP-08 |
| `benefit-plan-rates.csv` | csv | reference | Benefit plan rate card |
| `benefits-deduction-schedule.csv` | csv | valid | Benefit deduction schedule |
| `benefits-deduction-schedule.json` | json | valid | Benefit deduction schedule JSON |
| `leave-balances.csv` | csv | valid | Leave balances |
| `leave-requests.csv` | csv | valid | Leave request register |
| `leave-balances.xlsx` | xlsx | valid | Leave workbook |
| `timesheet-hours.csv` | csv | valid | Paid hours by shift |
| `timesheet-hours.xlsx` | xlsx | valid | Hours and payroll workbook |
| `employee-directory.csv` | csv | valid | Employee directory |
| `employee-directory.json` | json | valid | Employee directory JSON |
| `bank-payment-file.csv` | csv | valid | Bank payment file |
| `bank-payment-fixed-width.txt` | txt | valid | Fixed-width bank payment file |
| `bank-payment-layout.json` | json | reference | Fixed-width payment file column map |
| `bank-payment-copybook.txt` | txt | reference | COBOL copybook for the payment file |
| `payroll-journal.csv` | csv | valid | Payroll journal batch |
| `payroll-journal.json` | json | valid | Payroll journal batch JSON |
| `employer-cost-summary.csv` | csv | valid | Employer cost summary |
| `ytd-earnings.csv` | csv | valid | Year to date earnings |
| `payroll-summary.pdf` | pdf | valid | Payroll summary PDF |
| `payroll-reconciliation.json` | json | reference | Payroll reconciliation assertions |

## Deliberate defects

These files are broken on purpose. Each one is a single named mutation of a correct file in the same directory, so a parser under test can be checked against both.

- **`payroll-register-deductions-mismatch.csv`** Seven rows reconcile. EMP-05 does not: 1176.00 less 312.48 is 863.52, but the row states 922.32, an excess of 58.80, which is exactly the 0.05 pension deduction shown in the pension_employee column of the same row. The TOTAL row still adds up down every column, so a footer check passes and only the per-row identity catches it. The bank file would be 58.80 over.

## Notes and limits

- Everyone in this set is fictional. The names are the operating model's role labels, there is no address, date of birth or national identifier anywhere, and the bank sort code 000000 and sequential account numbers are reserved test values that route nowhere.
- Employer costs are the trap this set is built around. The employer pension, payroll tax and health contribution are real money but are not deductions; adding them to the deduction column understates net pay and adding them to gross overstates the payroll.
- A pending leave request is not a booking. remaining_hours subtracts approved future leave only, and the pending hours are reported in their own column.
- bank-payment-fixed-width.txt has no header and no delimiter. Read it by column position from bank-payment-layout.json and check the record length before slicing.
- The year-to-date file assumes five identical periods. That is a stated modelling assumption of this fixture, not a claim about a real pay history.
- Tax, pension and payroll tax rates are illustrative. These are import and reconciliation fixtures, not a payroll compliance engine and not tax advice.
