# simple-private-codecollection An **educational, generation-rule-only** RunWhen CodeCollection. It ships **no** Robot Framework code of its own — instead it teaches how a private repository can define **discovery rules** and **SLX templates** that reuse a generic runtime already loaded by the RunWhen runner (in this case [`k8s-kubectl-cmd`](https://github.com/runwhen-contrib/rw-generic-codecollection/tree/main/codebundles/k8s-kubectl-cmd) from `rw-generic-codecollection`). ## What it demonstrates - How **workspace-builder** discovers a Kubernetes **Custom Resource** (a Crossplane `Bucket` from the Upbound GCP provider) via a generation rule. - How the resulting SLX points its `codeBundle.repoUrl` at a **different** code collection where the runtime actually lives. - How to compute a fractional **SLI** (0.0–1.0) from `.status.conditions[]` with `jq`, and how to emit a **detailed TaskSet** with per-condition issues via `RW.DynamicIssues`. ## Layout ``` codebundles/ gcp-bucket-crossplane-health/ # rules + templates only, no *.robot .runwhen/ generation-rules/gcp-bucket-crossplane-health.yaml templates/ gcp-bucket-crossplane-health-slx.yaml gcp-bucket-crossplane-health-sli.yaml gcp-bucket-crossplane-health-taskset.yaml docs/ 01-overview.md 02-generation-rules-only-pattern.md 03-crossplane-crd-discovery.md 04-generation-rule-walkthrough.md 05-slx-and-templates.md 06-runner-integration.md 07-validate-and-observe.md 08-current-limitations.md images/ # screenshots referenced from the chapters ``` ## Start here Open [`docs/01-overview.md`](docs/01-overview.md) and read the chapters in order. Each chapter has a short "What you'll do" preamble, an inline diagram or code snippet, and screenshot placeholders that we fill in as we iterate. ## Target environment This training example is wired for the RunWhen **airgap** environment (in-cluster workspace-builder in `runwhen-env-airgap-runner`, Gitea at `gitea.airgap.shared.runwhen.com`). The generation rule targets real Crossplane `Bucket` resources already present in that cluster (see [llm-storage.yaml](https://github.com/runwhen/infra-flux-nonprod-shared/blob/main/infrastructure/crossplane/llm-storage/llm-storage.yaml) and similar). The pattern applies to any RunWhen environment; only the `repoUrl` in the templates needs to change.