@@ -181,6 +181,26 @@ function liveEvidenceFailures(row: TokenEfficiencyRow): string[] {
181181 return failures ;
182182}
183183
184+ function liveUsageShapeFailures (
185+ scenarioId : string ,
186+ runtime : RuntimeId ,
187+ usage : RuntimeParityCell [ "usage" ] ,
188+ ) : string [ ] {
189+ const failures : string [ ] = [ ] ;
190+ for ( const key of [ "inputTokens" , "outputTokens" , "totalTokens" ] as const ) {
191+ const value : unknown = usage [ key ] ;
192+ if (
193+ typeof value !== "number" ||
194+ ! Number . isFinite ( value ) ||
195+ ! Number . isInteger ( value ) ||
196+ value < 0
197+ ) {
198+ failures . push ( `${ scenarioId } ${ runtime } live usage ${ key } must be a non-negative integer` ) ;
199+ }
200+ }
201+ return failures ;
202+ }
203+
184204export function buildTokenEfficiencyReport (
185205 params : BuildTokenEfficiencyReportParams ,
186206) : TokenEfficiencyReport {
@@ -218,8 +238,16 @@ export function buildTokenEfficiencyReport(
218238 } ) ,
219239 ) ;
220240 const aggregate = buildAggregate ( rows ) ;
221- const failures = rows . flatMap ( ( row ) => {
222- const rowFailures = liveUsage ? liveEvidenceFailures ( row ) : [ ] ;
241+ const failures = rows . flatMap ( ( row , index ) => {
242+ const result = parityResults [ index ] ;
243+ const rowFailures =
244+ liveUsage && result
245+ ? [
246+ ...liveUsageShapeFailures ( row . scenarioId , "openclaw" , result . cells . openclaw . usage ) ,
247+ ...liveUsageShapeFailures ( row . scenarioId , "codex" , result . cells . codex . usage ) ,
248+ ...liveEvidenceFailures ( row ) ,
249+ ]
250+ : [ ] ;
223251 if ( row . flagged ) {
224252 rowFailures . push (
225253 `${ row . scenarioId } token delta=${ formatPercent ( row . deltaPercent ) } exceeds ${ thresholdPercent . toFixed ( 1 ) } % Codex increase threshold` ,
0 commit comments