SYNTHETIC DATA · Synthetic example. Fictional data. Northwind Ops Consulting, its projects, clients and staff are invented for demonstration.
Project hours reconciliation, August 2026
Northwind Ops Consulting (fictional) · Inputs: project_status.csv and time_entries.csv · Generated 2026-09-29 08:47
Five agreed metrics
24Open projects
15Completed projects
1019.25Total recorded hours
6.50Unmatched hours
1Unresolved-status records
Each figure was compared with a separately computed expected value (different script, different method) before this report was allowed to be written:
| Metric | This report | Expected (independent) | Result |
|---|
| Open projects | 24 | 24 | match |
| Completed projects | 15 | 15 | match |
| Total recorded hours | 1019.25 | 1019.25 | match |
| Unmatched hours | 6.50 | 6.50 | match |
| Unresolved-status records | 1 | 1 | match |
Reconciliation: every input row accounted for
Exception register: decisions needed
Nothing below was guessed or silently dropped. Each item stays open until the client decides.
Changes applied by rule
Rules used
- R1 Status text is trimmed and case-normalised to Open or Complete. Any other value (including blank) is unresolved.
- R2 An exact duplicate time row (every column identical) is removed; the first occurrence is kept.
- R3 A time row whose project_id is blank, or not present in the status export, is unmatched. Its hours stay in total recorded hours and are reported as unmatched hours.
- R4 A project marked Complete with hours dated after its completion date, or with no completion date, is unresolved. It is not counted as open or completed until the client decides.
- R5 A project_id that appears more than once in the status export is unresolved.