You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
AWS emits ECS split cost allocation rows *in addition to* the parent EC2
instance rows they were derived from, so the two describe the same compute.
Intelligent Compute tags the instances themselves, so an IC run on the ECS
architecture matched both row classes and their costs were added together.
Measured on a real July 2026 CUR export: all 204 ECS-based IC runs were
affected, median overstatement 1.545x (worst 1.93x). AWS Batch was never
affected because it tags only the ECS task, so its instance rows carry no
run tag.
normalize now emits unblended_cost / split_cost / unused_cost as separate
fields, with single-basis cost / used_cost conveniences that prefer the
billed instance charge. This matters because IC split rows carry no
pipeline_process or task_hash labels (0 of 49,106 in the real export), so
they collapse into the same (run_id, '', '') group as the instance rows —
the bases are separable only as columns, never by row class after grouping.
The IC report now carries both figures per run: `cost` (cost of record,
with cost_basis instance|split) and `comparable_cost` (the ECS split basis,
null when absent). Cross-engine comparison views use comparable_cost and
omit runs lacking it, since split cost is amortized and unblended is not;
the instance-type breakdown keeps using the billed cost.
Verified end to end against the real export: instance basis $2,193.68 and
comparable basis $46.58 reproduce independent DuckDB measurements exactly,
where the old code reported $2,240.27.
Tests cover the shapes that had none: an IC run with both bases in one
group, an IC run with task-labelled split rows, a VM-architecture run with
the instance basis only, and a Batch run with the split basis only.
- JSONL is the primary handoff (`jsonl_bundle/`) for Fusion-friendly streaming
91
91
-`report_data.json` is the explicit boundary between aggregation and rendering
92
92
- When a CUR file is supplied but a run has no matching cost rows, aggregation sets `run_costs[].cost_status` to `propagating` (run finished < 24h ago, per `_COST_PROPAGATION_WINDOW_HOURS`, so CUR data likely hasn't landed) or `not_found` (older run, genuinely absent). The report renders `pending` / `no data` instead of a bare dash. Runs with matched cost are `available`; no CUR at all leaves `cost_status` null.
93
-
-**Intelligent Compute report cost basis.** The IC report (`benchmark_report_ic_aggregate.py`) wants ECS split cost allocation (used vs idle capacity) for *every* run — both Intelligent Compute and Batch. In practice Batch runs reliably carry split cost, but IC runs sometimes don't yet (we're still investigating why). When a run has genuine split cost (`split_cost_present`), `run_summary[].cost_basis` is `split` with `used_cost`/`unused_cost` populated; when it's absent we fall back to the unblended line-item cost — in practice this fallback only hits Intelligent Compute runs — so `cost_basis` is `blended` and used/unused are null. `cost` is always the billed total. It mirrors the benchmark report's `cost_status` (`available`/`propagating`/`not_found`/null). `normalize` emits `split_cost_present` (shared with the benchmark path). The report shows per-run cost-basis badges plus a Cost-section coverage note (how many runs had costs, and whether cost was split vs blended).
93
+
- **Two CUR cost bases, never summed.** AWS emits ECS split cost allocation rows *in addition to* the parent EC2 instance rows they were derived from, so the two describe the same compute. Intelligent Compute tags the instances themselves, so an IC run on the ECS architecture matches both classes — summing them overstated affected runs by ~1.5x (median, measured on a real export). AWS Batch tags only the task, so its instance rows carry no run tag and it was never affected. `normalize` therefore emits `unblended_cost`, `split_cost` and `unused_cost` as separate fields (plus single-basis `cost`/`used_cost` conveniences that prefer the billed instance charge). Note IC split rows carry no `pipeline_process`/`task_hash` labels, so they collapse into the same `(run_id, '', '')` group as the instance rows — the bases are separable only as columns, never by row class after grouping. The IC report exposes `cost` (cost of record, with `cost_basis` = `instance`|`split`) alongside `comparable_cost` (the split basis, null when absent); cross-engine comparison views use `comparable_cost` and omit runs lacking it, since split cost is amortized and unblended is not. `cost_status` (`available`/`propagating`/`not_found`/null) mirrors the benchmark report.
94
94
-`commit.gpgsign` must be true (SSH signing via 1Password)
95
95
- RTK `buildOutputFiltering` / `testOutputAggregation` can swallow nf-test output — disable to debug
96
96
-**Nextflow `include` statements in `main.nf` must be single-line.**`adamrtalbot/detect-nf-test-changes@v0.0.3` (used by CI) parses include lines and crashes on multi-line blocks. Write `include { A ; B ; C } from '...'` not multi-line blocks.
0 commit comments