Solution
Reference solution
A working solution consists of the seven files shipped under downloads/, applied against a local minikube cluster:
01-namespace.yaml— themanifoldNamespace that is the Manifold RuntimeEnvironment for this lab.02-consumer-pico.yaml— the single-shot consumer Pico Pod (hello-consumer-pico) that subscribes to thegreetingChannel and prints one Observation in reaction to one event.03-greeting-channel-service.yaml— the KubernetesServicethat realizes thegreetingChannel from the InteractionTopology (selects the consumer Pod).04-topology-configmap.yaml— the on-clusterConfigMapthat publishes the same Wrangler topology fragment inside the RuntimeEnvironment, including the explicit producer→consumerwiringentry.05-producer-pico.yaml— the single-shot producer Pico Pod (hello-producer-pico) that publishes exactly onehello.greetingevent onto thegreetingChannel and exits.topology.yaml— the authored Wrangler-style InteractionTopology fragment; declarative truth for what runs, including the producer→consumer wiring.verify.sh— the automatable verification script the walkthrough runs in Step 7.
Commands (recap)
Run from work/hello-two-picos/ after copying the manifests in place (see the walkthrough for the full setup):
kubectl apply -f 01-namespace.yaml
kubectl apply -f 02-consumer-pico.yaml
kubectl -n manifold wait --for=condition=Ready --timeout=60s pod/hello-consumer-pico
kubectl apply -f 03-greeting-channel-service.yaml
kubectl apply -f 04-topology-configmap.yaml
bash verify.shExpected output
The producer Pico prints one “sent” line, and the consumer Pico prints exactly one Observation line into its container logs:
pico[hello-producer-pico] sent: hello.greeting to hello-consumer-pico via channel 'greeting'
pico[hello-consumer-pico] observation: greeting from hello-producer-pico: Hello, Pico!
verify.sh applies the producer, waits for both Pods to Succeed, and asserts the Observation and “sent” lines match:
verify: OK — producer emitted one hello.greeting event and consumer produced one Observation 'pico[hello-consumer-pico] observation: greeting from hello-producer-pico: Hello, Pico!'
Why this satisfies the objectives
- Manifold as RuntimeEnvironment: The
manifoldNamespace is labelledoe.academy/runtime-environment=manifold,oe.academy/runtime-substrate=kubernetes, andoe.academy/interaction-topology=hello-two-picos; both Picos, the Channel Service, and the topology ConfigMap live under it, so lifecycle and cleanup are one-for-one with the Namespace. - Two named Picos:
02-consumer-pico.yamland05-producer-pico.yamleach host a distinct Pico Element (hello-consumer-picoandhello-producer-pico) as its own Pod under the same RuntimeEnvironment. - Wrangler-declared wiring relationship:
topology.yamldeclares one Channel (greeting), one subscription (hello-consumer-picoongreeting), one publication (hello-producer-picoongreeting), and one explicitwiringentry that names the producer→consumer relationship. The same fragment is published on-cluster as aConfigMapin04-topology-configmap.yaml. - One emit, one react: The producer Pico publishes exactly one
hello.greetingevent onto thegreetingChannel and exits; the consumer Pico consumes that one event and produces exactly one Observation in reaction.verify.shenforces both halves. - Runtime substrate stays Kubernetes: All commands are
kubectlandminikube; no non-Kubernetes runtime is introduced. This matches the Phase 7 constructive-realization contract and the approved architectural constraint that Kubernetes remains the RuntimeSubstrate for the Hello Pico roadmap.
Verification
You can verify the solution matches this reference by:
- Diffing your copy of each
downloads/*.yaml,topology.yaml, andverify.shagainst the versions in the source repository. They should be byte-identical. - Confirming
bash verify.shexits0with theverify: OKline. - Confirming
build/hello-two-picos/observation.txtcontains exactly the linepico[hello-consumer-pico] observation: greeting from hello-producer-pico: Hello, Pico!.
Variations
- Change the greeting: Edit the
valuefield of the JSON payload in05-producer-pico.yamland rerun the lab from Step 5 (delete and reapply02-consumer-pico.yamland05-producer-pico.yamlfirst — both Pods are single-shot). The consumer Pico will echo whatever value the producer emitted, attributed tohello-producer-pico. - Rename the Channel: Edit
channels[0].nameand thewiringentries intopology.yaml, the Servicemetadata.namein03-greeting-channel-service.yaml, and theCHANNEL_HOSTin05-producer-pico.yaml’snccommand to keep the three in sync. This is a good exercise in seeing how Wrangler’s declarative producer→consumer wiring lines up with Manifold’s realized Channel on Kubernetes. - Rename a Pico: Rename
hello-producer-picoorhello-consumer-picoconsistently acrosstopology.yaml,02-consumer-pico.yaml,05-producer-pico.yaml, and any labels and Observation-line expectations. This shows that the producer→consumer wiring is Pico-named, not Pod-named.
Multi-Pico topologies beyond two Picos and one Channel, Home Assistant as a Control Surface, a Python CLI as the main teaching surface, fleet orchestration, and non-Kubernetes runtimes are explicitly out of scope for this first multi-Pico runtime lab and its reference solution.