For general contractors, subcontractors & estimating teams

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.

Get the Freshness Gate — $69one-time · instant download · yours to keep
Five deliverables · runnable
Runnable freshness engine (Python, zero-dep)
engine
Workbook — Dashboard · Trade Basis Register
xlsx
Cost-Basis Maintenance Playbook
docx
Market-Testing a Rate — field guide
docx
Worked 10-trade example register
csv
Run it against
The ten or fifteen trades that carry most of a typical bid
01.The Problem

An age column is the wrong question in two directions at once.

One threshold is wrong for every trade

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.

Escalation makes everything look fresh

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.

The trades you have not built are the stale ones

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.

02.See It Work

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.

Trade basis — click a row

TR-02 is 19 months old and reads CURRENT. TR-01 is 4 months old and is gated. Age is not the question.

Structural steel erected
TR-01 · $410,000
Source of the rate named·req
A quote, a closed job, a published index — you know which
Evidence retrievable
You could produce that source today
Market-tested, not escalated·req
Checked against something real, not raised by a percentage
Escalation declared
Where it was escalated, the factor and date are recorded
What the rate includes is stated
Labour, burden, equipment, waste — so two people apply it alike
Owner named
A named person maintains this trade's basis
Trade75 · CURRENT
Exposure on a current basis
59% ($783,000 of $1,325,000)
Age against its own horizon
1.13× (1 undated)
Freshness gate fired

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

Verdict
PRICING ON MEMORY
Fix first
TR-01 — Market-tested, not escalated
Bands
3 / 1 / 1
Get the kit — $69

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.

Diagram of the Unit-Cost Basis Freshness Gate: ten priced construction trades each carrying its own freshness horizon and marked current, aging or stale, two trades gated for being past twice their own horizon, a two-trigger freshness gate weighed by priced exposure, and a sample verdict reading PRICING ON MEMORY.
Shareable diagram

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 diagram
03.The Engine

What 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.

04.The Standard

Three rules the verdict is held to.

01
Every trade sets its own clock

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.

02
Recency is not freshness

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.

03
A date nobody has is not a failing grade

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.

Six signals per trade
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.
05.What This Is — And Isn't

Clear about the lane. No inflated promises.

What it is
  • 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.
What it is not
  • 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.

06.Who It's For

The firm whose rates came from somewhere nobody remembers.

Built for
  • 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.
It will not
  • 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.
08.Common Questions

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.

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