Every project moves a number mid-flight — the fabric needs 0.008 more, the power envelope tightens, a use case adds bandwidth. Without a process each change is a quiet edit and the books drift; with one, each change is a balanced entry with a reason, a cover and a signature.
Escalation runs in four steps. The owner proposes a cover first: trade, restructure or descope within their rows. If no cover fits, the integrator spends top margin and records the draw. If margin cannot cover it, the change board replans: cut scope, slip the use case, or grow the die budget as a recorded change entry that keeps the old burn-down chart and starts a new segment. If the board cannot agree, the decision escalates with the data, never with the volume — both options priced, both risks stated. Every approved change is one ledger entry: what moved, by how much, covered by what, signed by whom, on what date.
Step | Decides | Example |
|---|---|---|
Owner cover | Block owner | Fabric takes SBR slack of 0.002 |
Margin spend | Integrator | Draw 0.006 of area headroom (0.285 to 0.279) |
Replan | Change board | Grow die budget or cut the second DMA |
Escalate with data | Project lead | Both options priced with risks stated |
The script validates a change entry: the books balance (covers equal the move) and the approver matches the step.
authority = {"owner-cover": "block-owner", "margin-spend": "integrator",
"replan": "change-board", "escalate": "project-lead"}
def check(entry):
balanced = abs(sum(entry["covers"]) - entry["move"]) < 1e-9
return balanced and authority[entry["step"]] == entry["approver"]
change = {"row": "xbar-area", "move": 0.008, "covers": [0.002, 0.006],
"step": "margin-spend", "approver": "integrator"}
assert check(change)
# The check can fail: an unbalanced entry and a wrong approver are both rejected.
assert not check({**change, "covers": [0.002, 0.004]})
assert not check({**change, "approver": "block-owner"})
# Headroom falls by the margin part only: the 0.002 trade moves between rows.
ledger = {"headroom": 0.285}
ledger["headroom"] = round(ledger["headroom"] - change["covers"][1], 3)
assert abs(ledger["headroom"] - 0.279) < 0.0005
print(f"PASS: change balanced by {change['covers']}; headroom now {ledger['headroom']}")Every change entry balances: covers sum to the move, with no residual.
Approver matches the step; owner covers never spend top margin on their own authority.
The ledger version bumps on every entry, and consumers regenerate from the new version.
Sum the covers before reading the justification: an entry that does not balance is rejected whatever its story. Then check the approver: a margin spend signed by a block owner is an escalation that skipped its step. Both checks run in the script above; run it on every entry.
Version the ledger and regenerate from it: the header files, the decoder parameters and the verification assumptions all derive from the budget version the change entry bumps. A change recorded in the ledger but not regenerated into the consumers creates two truths — the approved numbers and the built numbers — and the next failure lands in the gap between them. The entry is only closed when every consumer names the new version.
Move 0.008 to the fabric row, covered by a 0.002 SBR trade plus a 0.006 headroom draw (0.285 to 0.279), approved by the integrator as a margin spend, ledger version bumped.