The payroll gate
Nothing posts until the batch proves itself.
Each pay period arrives as one file and faces fifteen control checks before a single row reaches a member’s record. The two verdicts below are the reconciliation engine’s actual output on two fictional SMERS batches, transcribed from the running demo. One clears. One carries a zero-earnings contribution and an inflated withholding, so the gate quarantines it.
SYNTHETIC DATA
Sample Municipal Employees Retirement System (SMERS)
Two fictional payroll batches
No real member data
Verdict, computed by the reconciliation gate
Batch 2026-06-19-biweekly-demo
Posting allowed
Posting allowed. Batch is eligible for member-ledger import.
- Control checks
- 15 of 15 passed
- Blocking exceptions
- 0
- Named override
- Not required
- Import status
- reconciled
- Employee + employer
- $1,662.15
- Report hash
- f94095c1f356
Batch 2026-07-03-biweekly-demo
Posting blocked
Posting blocked. A named admin override and immutable audit event are required.
- Control checks
- 10 of 15 passed
- Blocking exceptions
- 5
- Named override
- Required
- Import status
- quarantined
- Employee + employer
- $1,707.15
- Report hash
- 904485f76e3c
Blocked means blocked. There is no path in this demo that posts these rows. The exception report is hashed either way, so the record of a refusal is as durable as the record of a clean import.
Fifteen controls, each with a readable result
Schema, signature, money footings, configured contribution rates, roster binding, headcount, and the bank remittance must all reconcile before a row can reach a member.
The fifteen control checks, shown against the corrupted synthetic batch 2026-07-03-biweekly-demo. Contribution rows were rechecked against the plan’s configured 7.00% employee and 14.00% employer rates. Ten passed. Five blocked the batch.
| Control check | Result |
| Schema version | ✓ passed |
| Source hash format | ✓ passed Checks the shape of the declared digest, not the file bytes. Recomputing the hash server-side is on the production list below. |
| Detached signature status | ✓ passed Reads the status the sender declares. Cryptographic verification arrives with the production payroll transport. |
| Row count footing | ✓ passed |
| Earnings footing | ≠ blocking Header pensionable earnings must equal row total. |
| Employee contribution footing | ≠ blocking Header employee contributions must equal row total. |
| Employer contribution footing | ✓ passed |
| Duplicate employee row | ✓ passed |
| Member match | ✓ passed |
| Member identifier match | ✓ passed |
| Zero earnings with contribution | ≠ blocking Contribution row cannot be rate-validated because pensionable earnings are zero. |
| Employee contribution rate | ≠ blocking Employee contribution does not match pensionable earnings times plan rate. |
| Employer contribution rate | ✓ passed |
| Headcount tie-out | ✓ passed |
| Bank remittance tie-out | ≠ blocking ACH must tie to employee plus employer contributions. |
Wide table. Scroll sideways inside it to see the result column.
The exception names exactly what failed
Every exception carries the expected and the actual amount in integer cents, and the full report gets a SHA-256 hash. A negative delta means the file reported more than its rows contain.
Blocking exceptions on synthetic batch 2026-07-03-biweekly-demo, with expected and actual amounts as the gate recorded them. Amounts in parentheses are negative.
| Exception | Expected (USD) | Actual (USD) | Delta (USD) |
| Earnings footing | $7,915.00 | $3,820.00 | negative ($4,095.00) |
| Employee contribution footing | $554.05 | $599.05 | $45.00 |
| Zero earnings with contribution | n/a | n/a | n/a |
| Employee contribution rate | $267.40 | $312.40 | $45.00 |
| Bank remittance tie-out | $1,707.15 | $1,712.15 | $5.00 |
| Blocking exceptions | 5 | | |
Wide table. Scroll sideways inside it to see the expected, actual, and delta columns.
One stable file shape. Transport still gated.
A payroll adapter reshapes the city’s export into one contrib_v1 batch per pay period, carrying schema version pensionos-payroll-v1. A named, versioned file contract means the city payroll office signs up to one shape, and a change to that shape is a version number instead of an email. A pay-period id imports once; corrections are reversal and replacement under a new id, never a silent overwrite. This demo proves the contract and the gate. It does not claim a production file transport exists.