Your steel rate is four months old.Nobody has checked it in three years.
Both of those are true at once, and that is the failure an age column cannot show you. A firm that raises every rate four per cent each January has a basis that is dated today and founded on nothing. Every row reads fresh. This asks what the number rests on, and it gives every trade its own clock, because fourteen months on concrete and fourteen months on copper are not the same fact.
An age column is the wrong question in two directions at once.
Set it at twelve months and half your book is flagged for no reason while copper and steel rot inside the window. Set it at twenty-four and nothing is ever flagged. There is no single number that is right for concrete and right for a commodity that moves weekly.
Four per cent each January is the most common cost-basis maintenance practice in construction, and it is not maintenance. It produces a book where every rate was updated last month and not one of them has been compared to anything real since the year it was set.
Feeding closed jobs back into the basis only ever reaches the trades you recently built. The rate that has not moved in three years belongs to the scope you have not won in three years — and it is still in every bid you send.
Nineteen months reads CURRENT. Four months is gated.
Five trades running the same logic the shipped engine runs. The concrete rate is 19 months old and fine, because concrete is on a 24-month horizon. The steel rate is four months old and is what the gate is firing on, because nothing has ever checked it. Press the volatility button and watch an age change meaning without the number changing.
TR-02 is 19 months old and reads CURRENT. TR-01 is 4 months old and is gated. Age is not the question.
1 trade(s) past twice their own horizon: TR-03 (26m vs a 12m horizon) — the threshold is per trade, so this is late by its own clock
1 trade(s) inside their horizon that have never been market-tested, carrying $410,000: TR-01 — they read as current on the strength of a percentage nobody checked
- Fix first
- TR-01 — Market-tested, not escalated
- Bands
- 3 / 1 / 1
The heaviest trade on this board is four months old and it is what the gate is firing on. Its rate has never been checked against anything real — it presents as current on the strength of a percentage. Set Market-tested to 1 and that trigger releases; the verdict still holds, because a 26-month rate on a 12-month horizon is separately past twice its own clock. Press the volatility button on TR-02 and watch 19 months change meaning.


How the gate works, in one image
Ten trades, each carrying its own freshness horizon - one picture of why 19 months reads current on concrete, 17 reads stale on copper, and a four-month-old rate nobody tested is what you fix first.
View & embed the full diagramWhat it prints, on the 10-trade example that ships with it.
Verbatim stdout, not a mock-up. Zero dependencies, Python 3.8+, fully offline.
UNIT-COST BASIS FRESHNESS GATE - UCB-069 ============================================================================== TR-01 Structural steel erected volatile 6m 4m 410,000 75 CURRENT <- reads fresh, never tested TR-02 Cast-in-place concrete stable 24m 19m 285,000 100 CURRENT TR-03 Metal stud and drywall moving 12m 8m 196,000 83 CURRENT TR-04 Copper rough plumbing volatile 6m 17m 148,000 33 STALE <- past 2x its own horizon TR-05 Roofing membrane moving 12m 11m 132,000 75 CURRENT TR-06 Site earthwork stable 24m ? 224,000 83 AGING TR-07 Electrical rough-in moving 12m 26m 318,000 75 STALE <- past 2x its own horizon TR-08 Painting and coatings stable 24m 9m 64,000 100 CURRENT TR-09 Fire protection moving 12m 7m 88,000 92 CURRENT TR-10 Temporary facilities stable 24m 31m 41,000 - OUT OF SCOPE ------------------------------------------------------------------------------ TRADES IN SCOPE: 9 (CURRENT 6 / AGING 1 / STALE 2) Priced: $1,865,000 On a current basis: $1,175,000 63% of exposure Age against its own horizon, weighted by exposure: 1.18x (1 trade(s) excluded, no date: TR-06) Out of scope: 1 trade(s) - TR-10 GATE FIRED: 2 trade(s) past twice their own horizon: TR-04 (17m vs a 6m horizon), TR-07 (26m vs a 12m horizon) - the threshold is per trade, so this is late by its own clock GATE FIRED: 1 trade(s) inside their horizon that have never been market-tested, carrying $410,000: TR-01 - they read as current on the strength of a percentage nobody checked VERDICT: PRICING ON MEMORY Fix first: TR-01 - Market-tested, not escalated
Read the horizon column beside the age column. TR-02 is 19 months old and CURRENT; TR-04 is 17 months old and STALE. Neither of those is a mistake — one is a stable trade inside a 24-month window and the other is a volatile trade nearly three times past a six-month one. Then look at TR-01: four months old, the heaviest trade on the page, and it is what the instrument tells you to fix first.
Three rules the verdict is held to.
Stable, moving or volatile — 24, 12 or 6 months. The threshold varies by a property of the row, which nothing else in the RedHub catalog does, and it is the only honest way to grade a book that contains both cast-in-place concrete and copper. The horizons live in a config file you can change for your own trades.
The second trigger fires inside the horizon, precisely where the first cannot: a trade that presents as current and has never been checked against a live quote or a closed job's actual. It also closes the first trigger's escape route, because raising everything by a percentage is exactly how a book stops looking old.
A blank date caps the trade at AGING and stays out of the weighted age figure rather than being averaged in at a number nobody has. It fires neither trigger: not knowing when a rate moved is a different failure from having demonstrably let it rot, and the weighted share already charges it.
- Source of the rate namedrequired
- A quote, a closed job, a published index — you know which one this number came from. Required.
- Evidence retrievable
- You could produce that source today, without reconstructing it from memory.
- Market-tested, not escalatedrequired
- Checked against a live quote or a closed job's actual, rather than raised by a percentage. Required, and the second gate trigger.
- Escalation declared
- Where it was escalated, the factor and the date are recorded rather than absorbed into the number.
- What the rate includes is stated
- Labour, burden, equipment, waste — so two estimators apply it the same way.
- Owner named
- A named person maintains this trade's basis. A department does not.
Clear about the lane. No inflated promises.
- A deterministic gate over a trade basis register you maintain.
- A per-trade horizon, so a stable rate is not flagged beside a volatile one.
- A detector for the rate that reads current and has never been checked.
- An exposure-weighted read, so the heavy trade is not averaged away.
- Offline. Nothing is uploaded and nothing phones home.
- A cost database. It holds no rates and reaches no index.
- A judgement on whether your rates are high or low.
- A reader of your estimating software, your quotes or your job costs.
- A forecast of where any material price is going.
- A subscription to anything.
On the verdict name: EVERY RATE IS CURRENT AS DESCRIBED is a statement about the register as you filled it in. Nobody checked a rate.
The firm whose rates came from somewhere nobody remembers.
- Contractors whose basis is maintained by an annual escalation.
- Estimators who suspect one trade is carrying the losses and cannot prove it.
- Firms bidding scopes they have not actually built in years.
- Anybody about to buy a cost service and wanting to know what it has to fix.
- Give you a rate, or tell you what one should be.
- Read your estimating system or any published index.
- Predict where a material price is heading.
- Decide whether a variance was somebody's fault.
The rest of the number.
The register that cannot see what this one does. That grades the jobs you completed, so it only reaches trades you have recently built — and staleness hides in the ones you have not.
The other half of a soft number. This one finds the rates nobody has checked; that one finds the lines where there is no rate at all, only a placeholder.
Where a rate problem usually announces itself. A loss whose gap you attributed to unit rates is a claim about this register, and this is the instrument that checks it.
The questions estimators actually ask before opening their own rate table.
A verdict on the rates you price with: EVERY RATE IS CURRENT AS DESCRIBED, AGING, or PRICING ON MEMORY. Each trade is marked on six signals about what its rate rests on, and reads CURRENT, AGING or STALE against a freshness horizon it sets for itself. The roll-up is the share of your priced exposure sitting on a current basis. A worsen-only freshness gate forces the floor when any trade is past twice its own horizon, or when a trade inside its horizon has never been market-tested.
Because a concrete rate at fourteen months and a steel rate at fourteen months are not equally stale, and one global number is wrong for both at once. Each trade declares itself stable, moving or volatile, which sets a horizon of 24, 12 or 6 months. In the demo on this page a rate that is 19 months old reads CURRENT and one that is 17 months old reads STALE, because their horizons differ. This is the only gate in the RedHub catalog whose threshold varies by a property of the row.
It is the failure this product exists to catch, and no age check can see it. A firm that raises every rate four per cent each January has a basis that is dated today and founded on nothing: every age column reads fresh. So the second trigger fires precisely where the first cannot — inside the horizon — on any trade that has never been checked against a live quote or a closed job's actual. It also closes the first trigger's escape route, because escalating everything is exactly how a book stops looking old.
That one's register is jobs you completed, so it can only see the trades you have recently built. This one's register is the trades you price with, including the ones you have not built in two years — which is precisely where staleness hides. They come apart in both directions: a firm that closes out every job rigorously can still be pricing steel off a rate nothing has touched since the last time it did a steel job, and a firm that subscribes to a monthly cost service can have a perfectly current basis and never once compare an estimate to an actual.
Leave the date blank. That caps the trade at AGING — you cannot call a rate current when nobody knows when it moved — and it is excluded from the weighted age figure rather than averaged in at a number nobody has. It does not fire either trigger: not knowing is a different failure from having demonstrably let something rot, and a trade with no date does not present as current, which is what the escalation trap reads.
Because a stale rate on a trade carrying two per cent of the bid is untidy and the same rate on the trade carrying thirty per cent is the estimate. The roll-up is the share of priced dollars on a current basis. This is the same weighting the Allowance & Contingency Discipline Gate uses on a different subject, and it is stated rather than presented as new.
No, and it never could — it holds no cost data and reaches no index. It grades what each number rests on and how long ago that was. What your rates should be is a question for a quote, a closed job or a published source, and this instrument's whole point is asking whether you have consulted one of those recently.
A runnable Python engine and a live-formula .xlsx workbook that compute the same verdict from the same register, a basis-maintenance playbook and a market-testing guide, a ten-trade worked sample, and the config that holds the three horizons and the hard multiple so you can change them for your own trades and see what moves. Offline, deterministic, no account and nothing uploaded.
Recent is not the same
as checked.
One purchase, lifetime access, 12 months of updates. $69, once.
Honest boundary: a maintenance aid. It grades a register you fill in — it holds no cost data, reaches no index, and never says what a rate should be.
Sold by RedHub AI LLC · Secured by Stripe · redhub.ai