Lab Overview
The RHELS lab is a two-plane platform built for agentic platform-engineering work: agents plan infrastructure changes as GitHub issues, a peer reviews them, and a human authorizes execution.
The two planes
- Tooling plane — Docker Desktop Kubernetes on a Mac mini tooling host. Hosts
the CI agents (self-hosted runners), Argo CD for the tooling plane itself,
HashiCorp Vault, cert-manager, and Harbor / Loki / Tempo (live,
rhels/team#107) — plus the lab’s one identity store (OpenLDAP) and the front doors that give every service its name. See tooling-plane.md, identity.md, certificates.md. - Workload cluster — OpenShift 4.22 (CRC). Runs demo workloads in per-app namespaces, managed entirely by Argo CD via ApplicationSets from per-app IAC repos — plus the agent platform (MCP server, group-sync, PDI-backed request apps) and the log pipeline’s aggregator tier. See workload-cluster.md.
State as of 2026-10-24: every login in the lab resolves to the one LDAP directory; Vault is the secrets source of truth, with the Secrets Operator delivering into CRC; logs deliver to two Loki backends with a recurring, self-checking proof; certificates are Let’s Encrypt via DNS-01. The dedicated chapters (vault.md, observability.md, disaster-recovery.md) carry the detail.
Conventions
- BSN (Build Serial Number): every app is named
appDDDD, e.g.app1001. Seven characters, fixed format. See glossary.md. - One namespace per app-env:
app1001-dev,app1002-dev, … - One private IAC repo per app:
rhels/IAC.app1001,rhels/IAC.app1002, … - GitOps-only changes: the cluster is never hand-edited. Changes go through the app’s IAC repo; Argo CD reconciles.
- Issue-driven work: every work item is a GitHub issue; the agent drafts a plan, a peer agent reviews it, execution waits on the human’s authorization. See agent-protocol.md.
Where things come from
| Surface | Source | Published? |
|---|---|---|
| Showcase site | site/ built to audited dist/ from private source | Live inside the lab at the docs front door; the public GitHub Pages path is gated off, not live |
| Agent deep reference | site/src/content/docs/ (this collection) | Private — served only inside the lab, at /agent-docs/ on the same host, rendered in the showcase’s own theme |
Both surfaces are built from a sanitized, audited bundle and deployed
in-lab as one image (Argo CD app tooling-lab-docs; the publish path is
in cicd.md). Nothing in the private source tree may leak into
the showcase except through that pipeline (build-deploy.yml →
gitleaks → audit-bundle.py). The public GitHub Pages path (gh-pages
of rhels/lab-docs, https://rhels.github.io/lab-docs/) is not
live: the repo is private, the org is on the Free plan, Pages is
disabled, and the URL returns 404. Do not treat a public site as
published.
Current state snapshot
Machine-readable state lives in inventory.json, regenerated by
inventory/generate-inventory.py. It lists tooling-plane nodes, any remaining
planned items, workload-cluster operators and apps, monitoring, conventions,
the networking pattern, and the supply-chain stages (per-step status
live/blocked/audit; overall may be partial). Trust generated_at and
source (live or recorded) as freshness markers.