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:

MetricThis reportExpected (independent)Result
Open projects2424match
Completed projects1515match
Total recorded hours1019.251019.25match
Unmatched hours6.506.50match
Unresolved-status records11match

Reconciliation: every input row accounted for

Time entries (time_entries.csv)RowsHours
Rows received3001020.75
Less: exact duplicates removed (rule R2, see change log)11.50
Total recorded (after duplicate removal)2991019.25
  Matched to a project2971012.75
  Unmatched: project ID not in status export14.00
  Unmatched: project ID blank12.50
Projects (project_status.csv)Rows
Rows received40
  Open24
  Completed15
  Unresolved status (needs a decision)1
Accounted for40

Exception register: decisions needed

Nothing below was guessed or silently dropped. Each item stays open until the client decides.

IDTypeWhereRecordDetailHoursDecision needed
EX-01unmatched project idtime_entries.csv row 299TE-00297project_id P-1099 is not in project_status.csv4.00Is P-1099 a new project missing from the status export, or a mistyped ID?
EX-02missing keytime_entries.csv row 300TE-00298project_id is blank (2026-08-20, Staff E)2.50Which project should this entry be charged to?
EX-03conflicting statusproject_status.csv row 13P-1012marked Complete on 2026-08-14 but 2 time entries (4.50 h) dated after it: TE-00295 2026-08-19, TE-00296 2026-08-264.50Is P-1012 complete (late entries to be re-dated/billed) or reopened?

Changes applied by rule

WhereRecordFieldBeforeAfterRule
project_status.csv row 6P-1005statusopen OpenR1: normalised
project_status.csv row 25P-1024statusCOMPLETECompleteR1: normalised
time_entries.csv row 183TE-00058(whole row)TE-00058,P-1033,Staff B,2026-08-10,1.50,Analysis(removed)R2: removed exact duplicate of row 59

Rules used

Input fingerprints (SHA-256, first 12): project_status.csv 80b4c4caf83a · time_entries.csv eb00bd406dd1. Row-level detail: reconciled_time_entries.csv, reconciled_projects.csv, change_log.csv, exceptions.csv. This is a demonstration on fictional data. It shows the checks performed; it is not evidence of results for any real business.