Golden Paths
Last reviewed · content updated
IntermediateWhat you'll learn
~20 min- Turn one-off modernization wins into a paved road new teams inherit by default
- Build a wrapper module library with pinned, vendored dependencies
- Express environments as a baseline plus per-environment diff, never as copies
The question after the victory lap
Lessons 1 through 15 modernized an estate. Here is the question that decides whether it stays modernized: when the next team at Meridian needs a web app with a database next quarter, what do they do?
If the answer is “read the wiki, copy the FieldDesk repo, adapt as needed,” entropy wins: each copy drifts, each adaptation forgets a control, and in three years someone runs this training’s assessment against a jungle of divergent snowflakes that were all born modern. The alternative has a name — platform engineering — and a governing idea: the golden path, where the easy way and the right way are the same way.
(This lesson is the overview; the DevSecOps Foundations training goes deeper on every mechanism here — wrapper mechanics, template governance, policy wiring, and running the paved road as a product.)
The wrapper library
The estate’s infrastructure needs are repetitive: app + database + identity + telemetry, in five flavors. A wrapper module library captures each flavor once, with the organization’s decisions baked in:
modules/ web-app/ # App Service + managed identity + App Insights + the # Lesson 4.1 hardening defaults (headers, identity, telemetry) sql-db/ # managed database + private endpoint + audit logging ON container-app/ # the Lesson 2.3 shape: KV references, scale rules, probes storage/ # versioning, soft delete, no public blobs - not optional aks-exception/ # the Lesson 2.4 shape - exists, documented, rarely consumedThree properties make a library a platform rather than a snippet folder:
- Wrappers over verified upstream, never raw resources. Teams consume
modules/web-app, which internally uses well-maintained upstream modules — reviewed once, by the platform team, for everyone. - Versions pinned and vendored. Every module dependency is version-locked and the source vendored into the estate’s own repository. Builds are reproducible in five years, immune to upstream deletion, and — critically for Meridian’s world — installable in an air-gapped enclave from the vendored copy alone. “The registry was down” stops being a deploy risk.
- Compliance defaults inside the wrapper. The audit-logging-on, public-access-off, TLS-floor decisions live in the module, annotated with the control IDs they satisfy (Lesson 6.4 consumes those annotations). A team cannot forget a control they never had to remember.
Environments as baseline + diff
The second platform pattern kills the classic config-drift disease. Not five parallel environment files that started as copies — a hierarchy:
config/ baseline.yaml # strict defaults: encryption on, public access off, # audit on, minimum TLS - the SECURE posture is the base dev.yaml # diff: smaller SKUs, relaxed alerting thresholds test.yaml # diff: prod-shaped SKUs, synthetic data flags prod.yaml # diff: scale, retention, alert routing - and that's allEach environment declares only its difference from baseline. Two consequences worth the price of admission: an environment cannot silently lack a control (it inherits the strict default unless it explicitly overrides — and the override is a visible, reviewable diff), and “what is different about prod?” is answered by reading one short file instead of diffing five long ones. Note the polarity: the baseline is the strict posture, and dev relaxes downward visibly — never a loose baseline that prod is supposed to remember to tighten.
The paved road, end to end
Library plus hierarchy plus a scaffolder gives the next team their answer:
Scaffold a new internal service from the golden path:- modules/web-app + modules/sql-db, wired with workload identity (Lesson 6.1)- config inherited from baseline; dev diff only- CI from the standard template: policy gates (Lesson 6.3), federated identity, the fleet registry entry (Lesson 5.3) generated and committed- The Lesson 4.1 hardening checklist pre-satisfied by module defaults, with the exceptions list emptyDay one, the new service is on the road: identity federated, controls inherited, registry entry written. The team’s creative energy goes into their actual problem — which is the entire point. And the road is products, not police: teams can leave it (the ladder’s tests still apply — maybe they genuinely need the aks-exception module), but leaving is a visible, justified decision in the register, not a quiet copy-paste divergence.
A golden path nobody maintains becomes the thing teams route around, and then you have snowflakes plus resentment. The platform library is a product with an owner-team (Lesson 5.3’s registry applies to it, tier: critical), a deprecation policy, and its consumers as customers. Budget it like the load-bearing asset it is — it is the mechanism by which “way more automation” compounds instead of fragmenting.
A new team needs Postgres with slightly different tuning than modules/sql-db provides. They propose copying the module's internals into their repo and adjusting. What does the platform pattern say?
Key takeaway
Modernization sticks when the easy way is the right way: a wrapper library with pinned, vendored dependencies and compliance baked in; environments as a strict baseline plus visible diffs; a scaffolder that puts new teams on the road by default; and a real owner treating the road as a product. This is the delivery mechanism for estate-wide automation — and the substrate Lessons 6.3 and 6.4 enforce against.