In Depth · Multi-Project Platform Thinking

Multi-Project Platform Thinking

Study CGOA on a Monday and CBA on a Tuesday and it's easy to walk away with nine separate subject folders — GitOps vocabulary in one, Backstage plugins in another — instead of what they actually are: nine certifications built around one internal platform, each proving fluency in a different subsystem of the same machine for shipping and safely running change. This page draws that machine as one system instead of nine electives. It follows a single code change from the moment a developer requests a new service in a portal, through the GitOps engine that turns Git into a cluster's desired state, past a policy engine that can reject the change outright, across a service mesh that governs every packet it ever sends, into an observability stack that watches the whole thing happen — and shows exactly which certification owns which leg of that journey. Read the nine blueprints for the vocabulary. Read this page for the wiring diagram nobody hands you until after you've already passed all nine.

☺ Explain it like I'm 10

Picture Mission Control on launch day, zoomed in on nine different consoles, each showing one gauge — fuel pressure, cabin oxygen, radar, radio. Study only your own console and you'll memorize exactly what your gauge does, and never see what any of them are actually for. Zoom back out and it's obvious: none of those nine gauges is the mission. The mission is one rocket, going from the launch pad to orbit safely, and every console just watches one specific danger during one specific part of that trip — fuel before ignition, structural stress during ascent, life support the whole way up, all the way through. This page is the zoomed-out view: nine certification consoles, one launch, and the exact order each one gets to act in before the rocket is safely in orbit.

🦉Your host for this topic: Professor Owl — he draws the whole reference architecture before any single blueprint's CRD list, and no page on this shelf needs that instinct more than the one arguing all nine belong on the same diagram.

Five subsystems, not nine electives

☺ Like you're 10: Nine badges sounds like nine different classes. It's really five departments doing five different jobs, plus the building they all work inside.

The certifications hub already sorts these nine into six families by what part of the platform they cover — that page's job is the map. This page's job is the traffic: showing those families actually operating together, in order, on one real change, instead of sitting next to each other in a table. Strip the nine down to what they're really building and you get five working subsystems, not nine: a developer portal that's the human front door (CBA), a GitOps engine that turns a Git commit into a cluster's desired state and builds what it needs to get there (CGOA, CAPA), a policy engine that can reject a bad change before it's ever persisted (KCA), a service mesh and data plane that governs every packet between services once they're running (ICA, CCA), and an observability stack that watches the whole thing happen, continuously (OTCA, PCA). Underneath all five sits LFCS's Linux — not a sixth peer competing for a slot in the list, but the substrate every one of the other five is quietly a Linux process running on, the same way the certifications hub draws it as a foundation band rather than a sixth family box.

◆ Key idea

None of these five subsystems is optional in the sense that a real platform must run all of it — plenty of good platforms run three of the five on purpose, a point this page returns to at the end. What is true regardless of how many a given team runs: the five that exist in any real deployment always compose in the same order, because each one only gets to act at one specific moment in a change's life. That ordering, not the individual tool surfaces, is this page's actual subject.

This is the same instinct the platform-engineering discipline itself is built on — see Platform Engineering's treatment of a platform as one product, not a pile of adopted tools — applied here to one specific, concrete stack of nine CNCF projects instead of the abstract case for platform teams in general.

Walking one change through five subsystems

☺ Like you're 10: Follow one single delivery — one new service, requested once — all the way from a form to a running, watched, protected pod, and count how many different guards it passes on the way.

A developer opens the portal and fills out a "New Service" form — name, owning team, parent system. Backstage's scaffolder renders a skeleton with those answers already substituted into catalog-info.yaml, and opens a pull request into the repository the GitOps engine watches — the portal's whole job here is finished the instant that PR exists; everything from here on is a different subsystem's turn. A human reviews and merges it. That merge is the moment the change becomes desired state: the repository, not any person's memory, now says what should be running. Before the manifests reach a cluster, Argo Workflows builds, tests and packages the actual container image — the build-time half of the GitOps engine, and a genuinely separate job from what happens next. Argo CD's reconciler — the declare-time half — notices the new Application, diffs it against the live cluster, and starts applying it.

Every object Argo CD tries to write passes through Kyverno's two admission windows before it ever reaches etcd — mutate first, validate second — and a rule with failureAction: Enforce can reject the whole object outright, no rollback needed because nothing was ever persisted. Only past that gate does a Pod actually get scheduled. The moment it starts, it joins the service mesh's data plane — Istio and Cilium issue it a cryptographic identity, encrypt its traffic, and enforce whatever AuthorizationPolicy or CiliumNetworkPolicy applies, on every single packet it ever sends or receives, for as long as it's alive. And from its very first request, OpenTelemetry emits spans and Prometheus scrapes metrics — the one subsystem in this chain that never finishes, because it's still running the moment every other station has already done its one job and moved on.

One change, seven stations, one platform the same request lifecycle nine certifications each own one leg of ① Backstage developer requests a service 🦋 CBA ② Git commit becomes the desired state 🤖 CGOA ③ Argo Workflows build, test, package 🐙 CAPA ④ Argo CD reconciles the cluster 🤖 CAPA PR merge image reconciler applies the manifest ⑤ Kyverno mutate, then validate 🐢 KCA ⑥ Istio + Cilium identity, mTLS, routing 🦉🐦 ICA · CCA ⑦ OTel + Prometheus spans and metrics, continuously 🐘 OTCA · PCA admitted runs 🦥 Linux — every station above, on every node (LFCS) cgroups, systemd, and the kernel underneath all seven — not an eighth station observability informs the next change — the loop closes, it doesn't end

Notice the GitOps engine alone claims three of the seven stations, not because it's secretly three subsystems but because CAPA's own published domain weights already draw this exact seam: Argo Workflows is 36% of that exam and is almost entirely build-time competencies — steps, DAGs, artifacts — while Argo CD is 34% and is almost entirely declare-time competencies — Applications, sync policies, health. Git itself sits between them as the specification neither controller owns; it's the state store both read from and write to, not a service either one runs.

One manifest can carry instructions for four of the five subsystems at once, which is the most concrete way to see the platform as one thing rather than five:

# One Deployment template, four subsystems' worth of instructions —
# nothing below is Argo-specific config; each line is read by a
# DIFFERENT one of the certifications on this shelf.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: checkout
  namespace: prod
  labels:
    app.kubernetes.io/part-of: commerce        # Backstage's catalog (CBA) ties this
                                                  # workload back to a System entity
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: checkout
        istio.io/dataplane-mode: ambient         # Istio (ICA) — joins the mesh, no sidecar needed
      annotations:
        instrumentation.opentelemetry.io/inject-python: "true"  # OTel Operator (OTCA)
        prometheus.io/scrape: "true"                             # Prometheus (PCA)
        prometheus.io/port: "9464"
    spec:
      containers:
        - name: checkout
          image: registry.internal/checkout:sha-8f21a9c   # built by Argo Workflows
                                                              # (CAPA) before this file
                                                              # was ever committed
          resources:
            requests: { cpu: 100m, memory: 128Mi }   # Kyverno (KCA) rejects this object
            limits:   { cpu: "1",  memory: 512Mi }    # at admission if these two lines
                                                          # are missing — see below

Five control points on one timeline, not five overlapping tools

☺ Like you're 10: It looks like five different guards checking the same delivery truck five times. It's actually five different checkpoints on five different stretches of road — nobody re-checks what the last guard already cleared.

The reason none of this is redundant is that each subsystem gets exactly one moment in a change's life when it's even capable of acting, and those moments never overlap. Call it a control point: the specific instant a subsystem can still change the outcome, after which it's someone else's turn entirely. The portal isn't really a control point in this sense at all — it's the origin, the moment a human states intent, before any of the five enforcement-shaped subsystems get a say. From there, five real control points run in a fixed order, and skipping any one of them doesn't make the platform simpler — it just means nothing catches that particular class of problem, ever.

Six points on one timeline each owns a different moment — nothing here duplicates anything else time Origin Backstage · CBA a developer states intent Build Argo Workflows · CAPA before an artifact exists Declare Git + Argo CD CGOA / CAPA the instant it's committed Admit Kyverno · KCA the millisecond before etcd Run Istio + Cilium ICA / CCA every packet, continuously Observe OTel + Prometheus OTCA / PCA continuous, after the fact 🦥 Linux (LFCS) — not a seventh point on this line, the ground every point stands on, the whole time
Control pointFiresOwning certification(s)If this station didn't exist
BuildBefore an artifact existsCAPA (Argo Workflows)Untested, unbuilt code reaches the next station
DeclareThe instant a change is committedCGOA, CAPA (Argo CD)No single source of truth — nothing left to detect drift against
AdmitThe millisecond before etcdKCAA bad object lives in the cluster; it can only be cleaned up after, never prevented
RunEvery packet, continuously, for the object's whole lifeICA, CCANo enforced identity or encryption on live traffic, whatever the manifest said
ObserveContinuously, retrospectively queryableOTCA, PCAEvery other station could be doing its job correctly and nobody would know if it stopped
◆ Key idea

"When" a subsystem can act matters more than "what" it can configure. Kyverno and Prometheus both, in some sense, "watch" every object in the cluster — but Kyverno watches at the one moment it can still say no, and Prometheus watches after that decision is permanent and unchangeable. Confusing those two moments is exactly how a team ends up assuming a metric dashboard is a security control, or a policy engine is a monitoring tool.

Same shape, different layer: the design DNA these nine share

☺ Like you're 10: Nine different toolboxes turn out to share several of the exact same tools inside them — the same kind of loop, the same kind of form, the same kind of gate — just used for nine different jobs.

The nine tools aren't just adjacent in the request lifecycle — several of them are built out of the same small set of structural ideas, reused at a different layer each time. The closed-loop reconciler is the clearest case: Argo CD's control loop drives the whole Declare station, but it isn't the only reconciler on this shelf. Kyverno runs a separate background scan controller that periodically re-checks objects that already existed before a policy was installed, producing a PolicyReport the same way Argo CD produces a sync status — a second reconcile loop, at a different layer, closing a different gap. Cilium's per-node agent runs a third: continuously syncing its eBPF maps to whatever identity and network-policy state the Kubernetes API currently declares, the exact sensor-comparator-actuator shape from GitOps Philosophy, just enforcing packets instead of manifests.

The mutating admission webhook shows up twice for two genuinely unrelated jobs. Kyverno registers one to enforce policy — reject or rewrite an object before it's persisted. Istio's sidecar injector registers one for a completely different reason — add a proxy container to a pod at creation time. Same Kubernetes primitive, same admission-control phase, two certifications' worth of unrelated functionality riding the identical mechanism. And eBPF is the deepest shared substrate on this shelf: it's the whole story behind CCA's datapath, and it's also what Hubble uses to generate the network-flow visibility that feeds straight back into the observability station — one kernel primitive, funding two different families' worth of exam content.

⚠ One real exception, worth remembering on purpose

Not everything on this shelf is "just another CRD," and assuming so is a specific, common mistake. Backstage's catalog entities — Component, System, API, Group — are not Kubernetes custom resources, even on a shelf this Kubernetes-heavy. They live in Backstage's own database, populated by ingestion providers, governed by Backstage's own model, as The Backstage Portal Model covers in full. The portal is the one subsystem here that deliberately doesn't share this shelf's dominant pattern — which is exactly why it's drawn as the Origin, outside the timeline of Kubernetes-native control points, rather than as a sixth one.

Where cross-layer blindness actually bites

☺ Like you're 10: Three different guards can each honestly say "everything I checked looked fine" — and the truck can still be carrying something broken, because none of the three checked the same thing.

The failure mode nine separate blueprints never show you is the one where every subsystem is individually correct and the outcome is still broken. A Kyverno rule requiring resource limits sits in failureAction: Audit — someone flipped it during a demo months ago and never flipped it back. A Deployment with no limits block merges. Argo CD applies it, and its own dashboard reports Synced, Healthy — genuinely, correctly, from Argo CD's own vantage point, because the live cluster matches Git exactly. The pod schedules fine, joins the mesh fine, serves traffic fine, for a while. Then it gets OOMKilled under real load, restarts, gets OOMKilled again — and the only subsystem positioned to notice is the one watching continuously, after every other station has already finished its one job and moved on.

🦆 Dot's-eye view

"Argo CD's UI was green the entire time — Synced, Healthy, no drift. Kyverno's dashboard showed the rule existed and had a report. Nobody was lying to me. I'd studied each of those two tools well enough to trust each one's screen individually, and it took Prometheus's restart-count graph — a completely different subsystem, watching a completely different signal — to tell me the actual system was unhealthy. The bug wasn't in any one tool. It was in treating three true statements from three different subsystems as if they added up to one true statement about the whole platform."
(Composite, illustrative account — not a specific person's story.)

This is the concrete version of the abstract control-point table above: Admit and Observe are different stations on purpose, and a policy sitting in Audit mode doesn't merely weaken the Admit station — it silently turns the whole burden of catching that class of problem over to Observe, hours or days later, after the object is already running in production. Nothing about that failure required a single tool to be broken. It only required treating five subsystems' worth of "looks fine to me" as equivalent to one platform-wide "this is fine."

Draw your own map

☺ Like you're 10: The nine-badge shelf is a general map. The one worth actually memorizing is the smaller one for the stack you personally touch.

🦉 Owl's exercise · 15 min

Pick one real change your own team shipped in the last month — a feature, a fix, a config bump, doesn't matter which. On paper, list which of the five subsystems it actually passed through: did it go through a portal, or was the manifest hand-written? Did a policy engine have a real chance to block it, or was there nothing sitting at that gate? Did it cross a mesh, or does your stack not run one? Did anything actually watch it happen, or did you find out it broke from a person, not a dashboard? Circle every station that's genuinely present in your stack today. The uncircled stations aren't failures — they're an honest inventory of which of these nine certifications would change how your own platform actually behaves if you adopted them, versus which ones would just be a badge with no matching subsystem behind it.

Where the five-subsystem picture doesn't hold

☺ Like you're 10: Not every mission needs every console staffed. A short hop doesn't need the same crew as a trip to orbit.

Be honest about what this page is and isn't. It's a reference architecture — the shape a platform takes if it eventually needs everything all nine certifications teach — not a checklist every team is behind schedule for not implementing. Service Mesh Architecture's own closing section already makes the case in full for the Run station specifically: a small enough service count, watched closely enough by a small enough team, can genuinely not need a mesh at all, and adopting one anyway adds a whole distributed system's worth of failure modes for capabilities a simpler setup already covered. The same honesty applies to Origin — plenty of platforms run perfectly well on a README and a Slack channel instead of a Backstage instance, right up until the service count outgrows what any one person can hold in their head.

Passing all nine certifications on this shelf proves you understand every station on this page's diagrams. It does not prove your organization runs all five subsystems, and it's worth resisting the pull to treat "we should adopt everything I got badged in" as this page's takeaway. The actual skill this page is arguing for is smaller and more durable than that: given any platform — the one you already run, or one you're evaluating for a new job — being able to say, station by station, which of these five jobs is being done, which subsystem is doing it, and which stations are quietly missing. That question travels to a stack that's never heard of any of these nine tools by name. The tools change. The five jobs — origin, build, declare, admit, run, observe — mostly don't.

◆ The whole idea

Nine certifications, five jobs, one platform. Learn each blueprint for its own vocabulary — but the actual return on studying all nine together, rather than nine times separately, is being able to look at any real deployment and immediately see which of the five jobs is missing, weak, or silently duplicated, regardless of which specific tools happen to be sitting in each slot.

🎬 At Mission Control
🦊

Foxy: So if I actually pass all nine of these, have I basically built a platform?

🦉

Professor Owl: You've learned the ingredients, Foxy. Building the platform is deciding how they connect — and honestly, how few of them you actually need this year.

👺

Gizmo the Gremlin: Or — hot take — just cram each blueprint on its own, back to back, zero connections between them. Nine badges is nine badges either way! 😈

🤖

Recon the Robot: It's nine badges either way, Gizmo. It is not the same platform either way. My dashboard can say Synced and Healthy while three other stations are each quietly wrong.

🐢

Timmy the Turtle: And if my rule's sitting in Audit instead of Enforce, Recon's dashboard isn't lying to you — it's just answering a question that was never "is this actually safe."

🐘

Ellie the Elephant: Which is why I'm the one who finds out, later, when everyone else was individually correct and the total still added up to broken.

🦉

Professor Owl: Five jobs, in a fixed order, each of you owning exactly one. Learn where your station sits in that order, and the nine blueprints stop being nine separate stories.

🐢 Timmy's checkpoint

1. Name the five subsystems this page maps the nine certifications onto, and name the non-peer layer that sits underneath all five. 2. In the seven-station diagram, one subsystem claims three stations instead of one. Which subsystem, and why does CAPA's own domain-weight split already justify that? 3. What does this page mean by a "control point," and why is Backstage's portal called the Origin instead of being listed as one? 4. Name one structural design pattern that shows up in more than one of these nine tools, and name both places it appears. 5. In the cross-layer incident on this page, explain how Argo CD, an Audit-mode Kyverno rule, and Prometheus could each be individually correct about their own view while the system was still broken. 6. Why does this page warn against treating "adopt all five subsystems" as its takeaway?

Check your answers
  1. The developer portal (CBA), the GitOps engine (CGOA, CAPA), the policy engine (KCA), the service mesh / data plane (ICA, CCA), and the observability stack (OTCA, PCA). Underneath all five: Linux (LFCS) — the substrate every one of the other five runs on, not a sixth peer competing for a slot.
  2. The GitOps engine claims stations ②, ③ and ④ (Git, Argo Workflows, Argo CD). CAPA's own published domain weights already draw this seam: Argo Workflows (36%) is almost entirely build-time competencies, Argo CD (34%) is almost entirely declare-time competencies — the exam splits the same subsystem into two domains along exactly the line this page draws between the Build and Declare control points.
  3. A control point is the one specific moment a subsystem is actually capable of changing a change's outcome, after which it's a different subsystem's turn. Backstage's portal is where a human states intent, before any enforcement-shaped subsystem has had a chance to act — it can't reject or approve anything the way Kyverno or the mesh can, so it's the timeline's starting point (Origin), not one of its five enforcement stations.
  4. Any of: the closed-loop reconciler (Argo CD's sync loop, Kyverno's background scan controller, Cilium's per-agent eBPF-map sync); the mutating admission webhook (used by Kyverno for policy enforcement and by Istio's sidecar injector for proxy injection — same Kubernetes mechanism, two unrelated jobs); eBPF as a shared kernel substrate (Cilium's CCA-tested datapath, and Hubble's network-flow observability built on the same primitive).
  5. Argo CD reported Synced/Healthy correctly, because the live cluster genuinely matched what was in Git. The Kyverno rule genuinely existed and produced a report — it just never blocked anything, because it was in Audit rather than Enforce. Both statements were true from each subsystem's own vantage point; neither subsystem's job includes noticing that the object it approved would later get OOMKilled under load. Only Prometheus's continuous, after-the-fact observation — a genuinely different control point — was positioned to catch that outcome.
  6. Because passing all nine certifications proves understanding of every station, not that a given organization needs, or should run, every subsystem behind them. Service Mesh Architecture's own closing argument shows a mesh can genuinely not be worth its cost for a small enough team; the same logic applies to a dedicated portal. The durable skill isn't "run all five" — it's being able to name, for any real platform, which of the five jobs is present, which subsystem does it, and which are quietly missing.