We noticed the approval gate started to break down at a very specific moment: implementation no longer matched the approved plan.
Work had begun. An unexpected dependency appeared. Someone now had to decide whether the change could continue.
That decision was hard to reconstruct if the original approval, the revision and the final acceptance hadn’t been recorded separately. The team could no longer answer three basic questions reliably:
- What was approved?
- Who could approve it?
- Which changes required another decision?
A recorded plan gives implementation and review a common reference point. It doesn’t, by itself, show that planning improves delivery.
Record the intent, not the code structure
We found it useful to focus the plan on decisions expected to remain stable during implementation:
- intended behaviour
- relevant business rules
- system boundaries
- failure handling
- testing strategy
- evidence required for acceptance
Product and engineering participants agree the outcome and constraints. The implementer still decides how to meet them within the repository.
Without that agreement, reviewers have to reconstruct more of the requirement from the implementation. By then, the code has a way of anchoring the discussion. Replacing an unsuitable approach looks more expensive once it has been built than choosing a different approach before work starts.
There’s a limit, though.
A plan shouldn’t prescribe incidental code structure. Too much detail takes longer to review, becomes stale and restricts implementation choices that don’t affect the agreed outcome.
The approval gate therefore needs to record three separate decisions:
- Approve or reject the plan before implementation.
- Continue, pause or seek renewed approval when a material change appears.
- Accept or reject the completed change against the current approved plan.
Those aren’t interchangeable decisions. The control model needs an authorised role for each one rather than assuming that initial approval covers the whole lifecycle.
For each risk band, the rules should state:
- how the risk band is assigned
- who may approve the initial plan
- who may approve revisions
- who may give final acceptance
- whether the same role may make those decisions
- whether independent challenge is required
- whether implementation pauses while a revision is pending
- how unresolved disagreement is escalated
- what evidence final acceptance requires
A risk label on its own doesn’t tell anyone which controls apply.
Keep the decisions together
The table below is a proposed minimum record. It’s a template, not evidence that the control has operated.
| Stage | Field | Required entry |
|---|---|---|
| Identification | Work item | Identifier linking the plan to implementation |
| Planning | Intended behaviour | Observable outcome of the change |
| Planning | Business rules | Rules the implementation must preserve |
| Planning | Boundary | Included and excluded systems or components |
| Planning | Failure handling | Required behaviour when the operation fails |
| Planning | Acceptance conditions | Testable conditions for acceptance |
| Planning | Validation method | Tests, checks or inspection used as evidence |
| Classification | Risk band | Assigned classification |
| Initial approval | Plan approver | Role or person authorised for the assigned classification |
| Initial approval | Approval state | Draft, approved, rejected or superseded |
| Initial approval | Approval record | Decision, date and recorded location |
| Revision | Revision trigger | Material change requiring reassessment |
| Revision | Revision record | Changed field, reason, proposer and decision |
| Revision | Revision approver | Role or person authorised to decide the revision |
| Revision | Work status | Continue or pause while approval is pending |
| Implementation | Code reference | Link between the approved plan and implementing code |
| Validation | Acceptance evidence | Links to tests, checks and review findings |
| Final acceptance | Acceptance authority | Role or person authorised to accept the completed change |
| Final acceptance | Acceptance state | Pending, accepted or rejected |
| Final acceptance | Accepted plan version | Exact approved version used for final review |
Each approved version should link to the version it supersedes. If a record is missing, that gap should remain visible rather than being inferred from nearby entries.
This becomes particularly important when the plan changes. A material change affects either the approved intent or the basis on which it was approved.
| Area | Material change | Normally not material |
|---|---|---|
| Behaviour | An operation returns a different result for an accepted input | Internal refactoring preserves the same result |
| Boundary | The change writes to a component excluded by the plan | Code moves between files inside the approved component |
| Risk | New information meets the defined criteria for another risk band | An implementation detail changes without affecting the assigned criteria |
| Acceptance | A required test is removed, weakened or replaced with different evidence | The same acceptance condition is tested at a different internal layer |
| Failure handling | A specified rejection becomes a retry or partial success | Error construction changes while externally observable handling remains unchanged |
These examples show the decision test. They don’t define the risk bands. Each organisation still needs operational criteria for assigning risk and identifying authorised approvers.
When a material change appears, the lifecycle record should capture the affected field, the reason, the revised risk classification, the work status, the decision and the plan version being superseded.
Consider a synthetic example.
- A plan says that a component must reject invalid input without writing outside its declared boundary.
- Acceptance requires a test showing the rejection and confirming that no external write occurs.
- An authorised approver approves the plan under the assigned risk band.
- During implementation, the engineer finds that the proposed path requires a write to an excluded component.
- The engineer records the boundary change and requests reassessment.
- Work continues or pauses according to the rule for that risk band.
- The authorised revision approver accepts or rejects the new boundary.
- Code review checks the implementation and tests against the approved version.
- The authorised acceptance role records the final decision and links it to the evidence.
The external write is material because it changes the declared boundary. A local refactoring that preserves the rejection behaviour, boundary and acceptance test doesn’t require renewed approval.
Should the initial approval, revision approval and final acceptance come from one person or from separate roles? This example doesn’t answer that. The organisation’s authority rules have to do so.
Connect review to repository evidence
An approved plan reduces the amount of requirement discovery and business-rule interpretation needed during normal code review. It doesn’t remove either activity.
Review can still expose mistaken assumptions, missing requirements or dependencies that weren’t recognised during planning. Reviewers can ask:
- Does the implementation preserve the agreed behaviour and invariants?
- Are error paths handled as specified?
- Do the tests exercise every acceptance condition?
- Has the change stayed within its declared boundary?
- Is each material departure recorded and approved?
- Does the acceptance evidence refer to the current plan version?
If a finding changes behaviour, boundaries, risk or acceptance conditions, the plan needs reassessment. Otherwise, it can be handled as an implementation issue within the approved scope.
The repository also has to support the evidence named by the plan. Planning can’t make up for a validation process that can’t be reproduced or enforced.
| Repository control | Evidence it supports | Review question |
|---|---|---|
| Runtime pinning | Test results produced under the declared runtime | Was validation run with the recorded runtime version? |
| Continuous integration with observed checks | Recorded execution of required tests and checks | Did the required checks run against the accepted change? |
| One-command validation | A repeatable command covering the stated validation method | Can a reviewer repeat the required validation from the repository? |
| Default-branch protection | Enforcement of required checks before integration | Could the change enter the default branch without the recorded checks? |
A plan shouldn’t claim that evidence is repeatable unless the repository provides the mechanism needed to repeat it. The lifecycle record should connect the approved plan, implementing code, validation results, review findings and final acceptance decision.
Measurement is a separate problem
Comparisons between planned and unplanned work only make sense when every measure has an operational definition.
| Measure | Proposed definition |
|---|---|
| First-pass result | Whether the change meets all recorded acceptance conditions at its first formal acceptance review |
| Review finding | A recorded issue raised during review that requires a response or change |
| Finding classification | The defined category and severity assigned under the review process |
| Final acceptance result | Accepted or rejected against the current approved plan |
| Change size | The organisation’s declared sizing method, applied consistently to both cohorts |
| Change complexity | The organisation’s declared complexity method, applied consistently to both cohorts |
| Revision frequency | Number of approved-plan revisions per change |
| Approval latency | Time between submission for approval and the recorded decision |
| Missing data | A required field or record that is absent, unavailable or cannot be linked to the change |
Teams need to define sizing, complexity and severity schemes before collecting results. Classifying them afterwards risks inconsistent comparisons.
Ambiguous records shouldn’t be forced into a category. Record them as unknown and explain why. A missing approval or acceptance record isn’t evidence of rejection, acceptance or the absence of findings.
Reports should include:
- definitions and reporting period
- planned and unplanned cohort sizes
- risk band, repository and scope
- change size and complexity
- first-pass and final acceptance results
- finding counts and classifications
- revision frequency
- approval latency
- missing and ambiguous records
Work should be compared with other work that has similar risk, repository and scope characteristics. Where direct matching isn’t practical, results can be grouped by those factors, with size and complexity reported for each group.
That may reduce unsuitable comparisons. It can’t show causation.
This is still a proposed control model built around a synthetic record. It doesn’t include a real change record, repository artefacts, operational risk-band rules, defined outcome measures or source-backed separation of approval roles. No governance, change-management or software-assurance standard is cited because no supporting source was provided.
For the same reason, we can’t justify a percentage about delivery performance without its source, population, numerator, denominator and definition.
The model gives us a way to record intent and test a completed change against it. Whether that improves delivery remains unanswered. Only complete lifecycle records and consistently defined comparisons can tell us.
Talk to us
Building something adjacent to this?
Lender, broker, dealer group or technology partner — if this is the kind of problem you’re working on, we should compare notes.
support@autofintech.co.uk