Review — the human-in-the-loop queue
Every escalated column across all five sources, in one queue. The agent asks a question only when no hard check can pin the mapping — resolving one is a judgement call, not a rubber stamp, and the schema below requires a real reason for every decision.
0 of 12 remaining escalations block replay. All five sources currently replay — the human answered every question the agent needed answered.
The agent escalated 16 columns total across five sources. A human resolved 4 of them — and 4 of those were the ones actually blocking replay (a required field with no other covered candidate). The remaining 12stay escalated by design — the point of this queue is answering only what the pipeline needs, not rubber-stamping every column the agent wasn’t certain about. See the audit trail below for exactly which decisions those were and why.
Work queue
Blocking escalations sort first and are marked in red — this is the human’s actual work: the agent asked these questions, not the other 16 columns it already committed with hard evidence.
hris / start_date
does not block replayheuristic onlyAgent’s candidate: person.validFrom
Genuinely per-row date (240 distinct values across 254 rows), not a uniform export timestamp — this is the employee's own valid-from date, which person.validFrom is meant to capture as a real per-row fact. — escalated: only heuristic evidence supports this mapping
ats / accepted_on
does not block replaynoneAgent’s candidate: (no canonical home found)
Represents the date an offer was accepted, but there is no req.acceptedDate (or equivalent) in the canonical schema — only req.expectedStart exists, which is a distinct concept (planned start date, not acceptance date). Forcing this onto expectedStart would conflate two different dates, so it is left unmapped.
ats / expected_start
does not block replayheuristic onlyAgent’s candidate: req.expectedStart
Per-row date values matching the name and semantics of req.expectedStart (planned start date for the role). — escalated: only heuristic evidence supports this mapping
anaplan / Hdct
does not block replayheuristic onlyAgent’s candidate: approved_plan.requestedFte
Numeric headcount values (49, 95, 128) that are consistently higher than the paired 'Approved FTE' values for the same rows — consistent with a requested/asked-for headcount figure prior to approval, matching the optional requestedFte field. — escalated: only heuristic evidence supports this mapping
anaplan / Contractors Incl
does not block replaynoneAgent’s candidate: (no canonical home found)
A 'Y' flag indicating whether contractor headcount is included in the plan figures. No canonical field represents this boolean qualifier for approved_plan; there's no place in the schema to put it, so it's left unmapped rather than forced onto an unrelated field.
sheet_a / Q3 Ask (fte)
does not block replayheuristic onlyAgent’s candidate: approved_plan.requestedFte
Explicitly labeled as an 'ask' in fte units — the requested (not yet approved) fte for the period, matching requestedFte. — escalated: only heuristic evidence supports this mapping
sheet_a / Lvl
does not block replaynoneAgent’s candidate: (no canonical home found)
Values like IC4/IC3/IC2 are a person/req level, but approved_plan has no level field in the canonical schema — no counterpart to map to.
sheet_a / Loc
does not block replaynoneAgent’s candidate: (no canonical home found)
Location codes (US-SF, IE-DUB, PH-MNL) would fit a geo field, but approved_plan has no geo field in the canonical schema — no counterpart to map to.
sheet_a / Updated
does not block replaynoneAgent’s candidate: (no canonical home found)
Single constant date (cardinality 1) is an export-freshness/as-of stamp, not a per-row canonical value; validFrom/validTo are ingest metadata supplied by the caller, not something this proposal declares.
sheet_b / Band
does not block replaynoneAgent’s candidate: (no canonical home found)
Values (IC4, IC5, IC3, IC2, IC1) are job-level codes, but approved_plan has no level field in the canonical schema — there is no counterpart to map this to.
sheet_b / Site
does not block replaynoneAgent’s candidate: (no canonical home found)
Values (US-SF, IE-DUB, IN-BLR, PH-MNL) are geo/location codes, but approved_plan has no geo field in the canonical schema — there is no counterpart to map this to.
sheet_b / AsOf
does not block replaynoneAgent’s candidate: (no canonical home found)
Low-cardinality (2) date column reading as an export/as-of snapshot stamp rather than a per-row fact the plan carries — this is ingest metadata (recordedAt-equivalent) the caller supplies itself, not a value this proposal should map.
Audit trail
Every column a human has already resolved, per source — who decided, when, why, and the artifact version the decision produced.
hris
version bump: v1 → v2
employee_id → person.personId
was blocking replayDecision: approve · Decided by: thomas.peng · Decided at: 2026-07-12T17:00:00Z
employee_id is unique across all 254 hris rows (254 distinct values) and every value matches the E-#### identifier shape (E-1001 through E-3121, non-contiguous) that no other column in this export uses. But cardinality and shape are proxies, not proof: no referential-integrity check exists for personId (that check only ever runs against costCenterId columns) and no domain-membership check exists for it either (personId isn't a level/geo/org/cost-centre suffix and isn't declared as an enum), so nothing in the hard-check suite can ever confirm or refute this mapping — the schema check just needs some unique string, and any unique string would pass it. I approve it because employee_id is the column HRIS itself uses as the enterprise employee identifier, the join key that reconciles this export against payroll and against every downstream reference to a person. That's operational knowledge of how the source system is used, which lives outside the CSV and is exactly the kind of judgement a control total can never pin.
fte_pct → person.fte
was blocking replayDecision: approve · Decided by: thomas.peng · Decided at: 2026-07-12T17:00:00Z
fte_pct is numeric and takes only two values in this export (0.5, 1.0), sitting inside person.fte's declared [0,1] range — but the only hard check that ever sums a mapped numeric field against ground truth is control-total reconciliation, and checkControlTotals only ever sums approved_plan.approvedFte; it never inspects person records at all. A person.fte mapping therefore has zero hard-check coverage no matter what is mapped to it — type-plausibility only confirms 'this is a number', which a discount rate or a completion percentage would pass equally well. I approve it because fte_pct is HRIS's own fractional-headcount field, the exact number Finance already uses company-wide to answer 'how much of a head does this person represent' — that is operational knowledge of the source system, not something the ledger's own checks could ever derive.
ats
version bump: v1 → v2
req_id → req.reqId
was blocking replayDecision: approve · Decided by: thomas.peng · Decided at: 2026-07-12T17:00:00Z
req_id is unique across all 11 ats rows (REQ-5001 through REQ-7015) and follows a REQ-#### shape no other ats column shares. Exactly like a person identifier, there is no referential-integrity or domain-membership check that can ever touch a bare identifier column — the check suite only validates cost-centre joins and enumerable-domain membership, neither of which applies here. I approve it because req_id is the requisition number the ATS itself assigns, the value every downstream system (including HRIS once the req is filled) references by — that is a fact about how the ATS is operated, not something a schema or control total could ever pin.
anaplan
version bump: v1 → v2
Fiscal → approved_plan.fiscalPeriod
was blocking replayDecision: approve · Decided by: thomas.peng · Decided at: 2026-07-12T17:00:00Z
Fiscal reads 'FY26-Q3' on all three rows in this sample, and fiscalPeriod has no domain-membership check backing it — it isn't a level/geo/org/cost-centre suffix and it isn't declared as an enum in CANONICAL_FIELDS — so nothing in the hard-check suite ever validates its value regardless of how it's mapped; only the trivial type-plausibility check (is it a string) applies. I approve mapping Fiscal directly, rather than accepting the agent's implicit alternative of declaring it a constant, because Fiscal is a genuine per-row column in this source, not export metadata: a future Anaplan pull could legitimately span more than one fiscal period in a single export, and treating today's uniform value as a hardcoded constant would silently produce a wrong fiscalPeriod the day that happens. Anaplan explicitly reports this value per row for the plan it is submitting; that is the correct, durable mapping even though the current sample happens to be uniform, and it is a judgement about the shape of the export over time, not something any single-sample check could confirm.
sheet_a
No columns have been resolved by a human for this source yet — it replays on the agent’s own mapping alone.
sheet_b
No columns have been resolved by a human for this source yet — it replays on the agent’s own mapping alone.