Git, CI/CD & GitOpsCXVI · Governance Without BureaucracyDiscipline
The least bureaucratic controls — the discipline
What you'll learn
- Apply the five-property test to every control: named loss, sized mechanism, measured friction, named owner, expiry date
- Identify the failure mode of each missing property
- Recognise the structural properties that keep a control programme a control programme
- Run a quarterly governance review that drops, shrinks, or retains every control
Prerequisites
Verified against Git 2.55.x teaching target; 2.40+ minimum · GitHub Actions continuous service; Aug 2026 documentation baseline · Argo CD v3.5.x teaching target; v3.0+ minimum · Flux v2.9.x · Sigstore Cosign v3.1.x · SLSA v1.2 · OCI Distribution Specification v1.1 · Git LFS v3.7.1 · Kubernetes (cross-course target) 1.36.x
The discipline of the least bureaucratic controls is five properties, all five, on every control: named loss, sized mechanism, measured friction, named owner, expiry date. A control missing any one of the five is a bureaucracy in waiting. This lesson teaches the test, the failure modes, and the quarterly governance review that keeps the programme on the right side of the line.
The five-property test
Every control in the programme is scored against five properties. A control with all five is a control; a control missing any one is a bureaucracy in waiting, or already a bureaucracy.
flowchart TB
C["Control"] --> P1["1. Named loss:\nwhat does this prevent?"]
C --> P2["2. Sized mechanism:\nsmallest check that prevents"]
C --> P3["3. Measured friction:\ncost in seconds / hours / cycle time"]
C --> P4["4. Named owner:\nwho reviews and can drop the control"]
C --> P5["5. Expiry date:\nwhen does this control retire"]
P1 --> R["Control:\nall five present"]
P2 --> R
P3 --> R
P4 --> R
P5 --> R
The properties, one at a time.
1. Named loss. The control exists because a specific loss was named in writing. “We prevent unreviewed changes reaching production.” “We prevent images with critical CVEs being deployed.” “We prevent unencrypted S3 buckets from being created.” Without a named loss, the control is a ritual.
2. Sized mechanism. The mechanism is the smallest thing that prevents the loss. A review is sized to the risk (one reviewer for routine; two for risky). A policy is sized to the threat (one rule per loss, not ten). A bigger mechanism prevents the loss and more; a bigger mechanism imposes more friction.
3. Measured friction. The cost of the control is measured. Reviewer-hours per quarter. CI seconds per build. Cycle-time added per PR. The measurement is recorded; the owner reads the measurement.
4. Named owner. The control has an owner whose job is to track the named loss and the measured friction. The owner is named in CODEOWNERS or in the policy header. The owner can drop or shrink the control without escalating to a committee.
5. Expiry date. The control has a date at which it is reviewed for retirement. “This rule was added to block CVE-2024-3094; it expires on 2026-12-31 unless the threat persists.” The expiry date is in the policy header; the quarterly review honours the expiry.
The failure modes of missing properties
Each missing property produces a characteristic failure mode. The diagnosis is local; the fix is mechanical.
| Missing property | Failure mode | Fix |
|---|---|---|
| Named loss | Control outlives its purpose; no one knows what it prevents | Write the named loss into the policy header |
| Sized mechanism | Mechanism overreaches; engineers bypass with lorem-ipsum compliance | Shrink the rule to the smallest thing that prevents the loss |
| Measured friction | Cost dwarfs benefit; control persists because no one noticed | Instrument the control; record cost quarterly |
| Named owner | No one tracks the control; no one can drop it | Name the owner in CODEOWNERS or policy header |
| Expiry date | Control persists after threat has passed; bypassed by emergency exception | Add expiry date; honour at quarterly review |
flowchart LR
P["Missing property"] --> FM["Failure mode"]
P1["No named loss"] --> FM1["Ritual:\nno one knows what it prevents"]
P2["No sized mechanism"] --> FM2["Overreach:\nengineers bypass"]
P3["No measured friction"] --> FM3["Hidden cost:\ncost dwarfs benefit"]
P4["No named owner"] --> FM4["Drift:\nno one tracks"]
P5["No expiry date"] --> FM5["Persistence:\nthreat has passed"]
FM --> FIX["Mechanical fix"]
FM1 --> FIX1["Write the named loss"]
FM2 --> FIX2["Shrink the mechanism"]
FM3 --> FIX3["Instrument the cost"]
FM4 --> FIX4["Name the owner"]
FM5 --> FIX5["Add and honour expiry"]
The quarterly governance review
The five-property test is run quarterly. The review is the discipline that keeps the programme on the right side of the line: every control is scored; a control missing a property is either fixed (the property is added) or retired (the control is dropped). The review has a single deliverable: a table of controls, the property each one has, and a decision for every property that is missing.
flowchart LR
Q["Quarterly review"] --> LIST["List every control"]
LIST --> SCORE["Score against five properties"]
SCORE -->|"missing property"| FIX["Fix:\nadd the property"]
SCORE -->|"cannot fix"| DROP["Drop the control"]
SCORE -->|"all five"| KEEP["Keep"]
FIX --> DOC["Document in review log"]
DROP --> DOC
KEEP --> DOC
The review is run by the named owners. The platform team reviews the pipeline-level controls; the security team reviews the policy-as-code controls; the infrastructure team reviews the IAM and network controls. The review log is committed to the repository; the log is auditable.
The anti-patterns to avoid
The five-property test is the positive discipline. The negative discipline is the set of anti-patterns the team must recognise and reject.
- The deck. A 30-slide governance deck that names the controls but has no artefacts in the repo. The deck is communication, not a programme.
- The committee. A change advisory board that approves every change but has no policy-as-code gate. The committee is procedural over mechanical loss.
- The blanket rule. A single policy file that applies to every change regardless of risk. The blanket rule is unsized.
- The permanent rule. A control added in 2020 that has not been reviewed since. The permanent rule has no expiry.
- The orphan. A control whose owner has left the team and CODEOWNERS has not been updated. The orphan has no owner.
Each anti-pattern is the same failure mode with a different label: a control missing one or more of the five properties. The fix is the same in every case: add the missing property or drop the control.
Production discipline
- Score every control against the five properties quarterly. The score is in the review log.
- Fix or retire every control missing a property within the quarter. The review is actionable or it is a ceremony.
- Write the named loss in the policy header. The header is the first thing the auditor reads.
- Name the owner in CODEOWNERS or the policy header. The owner is the structural accountable.
- Honour the expiry date. A control that has expired and has not been renewed is dropped.
Cross-course references
- This course, Part CXVI-01 frames the trade-off; this lesson operationalises the trade-off into five properties.
- This course, Part CXV (OperatingModel) names the roles who run the quarterly review (security team, platform team, infrastructure team).
- Terraform for Production Sysadmins - Part IX (DeliveryPipeline) covers the same five-property test applied to Terraform plan checks.
Quiz
Knowledge check · 4 questions
Q1. A control has been in place for four years. The policy file names the loss, names the owner, and is sized to the threat. The cost is not measured. The expiry date is the day the rule was added. What does the five-property test diagnose?
Q2. A governance review that scores every control against the five properties but does not act on the gaps (no control is fixed or retired) is a structural governance review.
Q3. Name the five properties of the least bureaucratic control.
Q4. Run the five-property test against every control, identify the gaps, and recommend the action for each gap.
Team T has six controls in production. (1) Branch protection: requires two approvals; loss named in a wiki page (not the policy file); no cost measurement; owner is the security team; no expiry. (2) Conftest policy that fails on unencrypted S3 buckets in Terraform plans; loss named in policy header; rule sized to a single bucket property; cost is 4 seconds per plan; owner is the platform team; expiry 'until S3 encryption is default'. (3) Quarterly IAM access review: no loss named; rule not sized; cost is one engineer-week per quarter; no owner; no expiry. (4) Mandatory peer review on every PR: loss named 'unreviewed changes'; sized to one peer; cost not measured; owner is the engineering manager; expiry 'review in one year'. (5) Kyverno policy that denies privileged containers: loss named; sized; cost is 1 second per admission; owner is the security team; expiry 'review in two years'. (6) Pre-deploy CAB meeting: no loss named; no size; cost is two engineer-hours per deploy; no owner; no expiry.
Passing score: 75%. Answers are checked in this browser.