Find Hours

Budget reconciliation, effort only

The one-line idea

When a new out-of-scope ask lands, find the hours you already have before asking for more.

\[\textbf{Net findable} = \big(\textstyle\sum\text{Planned} + \text{Contingency}\big) - \textstyle\sum\text{EAC}\]

  • Under-run slack: planned effort you are forecast not to spend (planned − EAC, floored at 0)
  • Contingency: the management reserve

Only the residual becomes a change order.

Hours / effort only. Synthetic data. We say participant, not subject.

Where the numbers come from

Column Source of record
Planned SOW / budget grid in CTMS
Actual to date Timesheet system
% complete, EAC Your estimate + progress tracker
Change order Contract: lead biostat + PM review, sponsor sign-off, SOW amended

The tool never invents a number. You transcribe current figures in, so the reconciliation is attributable.

What to do with a new ask

Yes

Partly / No

Yes

Partly / No

Yes

No

New ask:
estimate effort

Under-run slack
covers it?

Reallocate
slack

Contingency
covers rest?

Draw the
reserve

Defer /
re-sequence?

Free planned
hours

Change order:
PM + sponsor

Absorbed

The live roll-up

850
Planned
513
Spent
831
EAC
40
Contingency
59
Net findable

( 850 + 40 ) − 831 = 59 h you can redirect before a change order.

Planned vs forecast

Ask 45 h, absorbable

Ask 45 h → Absorbable internally
19 h under-run slack + 26 h contingency + 0 h residual
Contingency left: 14 h

Fully covered from what you already hold: no residual, 14 h of reserve still in hand.

Ask 90 h, change order

Ask 90 h → Change order needed: 31 h
19 h under-run slack + 40 h contingency + 31 h residual
Contingency left: 0 h

Slack and the full reserve are exhausted. The 31 h residual is genuine new scope: it goes to the change-order process. The tool drafts the hours-only note; pricing is handled downstream by the PM.

Run it / build it

shiny::runApp("budget_reconciliation/shiny")
# install.packages(c("shiny","bslib","DT","ggplot2"))

Synthetic data. Hours / effort only. A change order is a named-human, contracted decision.