Skip to content

Commit c133964

Browse files
Merge pull request #4 from patterncatalyst/feat/demo-cards-rename-keda-upgrade
feat: demo cards, smoke→demo rename, KEDA HTTP 0.15.0
2 parents 506addd + 8175d1a commit c133964

55 files changed

Lines changed: 1046 additions & 294 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎PRD.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ The reference ships ONE runnable example tree at
238238
printed; the script stops on first failure with a fix hint.
239239
- **`demos/walkthrough.sh`** — the five-act presenter walkthrough that
240240
exercises every cross-product behaviour the reference describes.
241-
- Per-component **`demos/smoke-*.sh`** scripts for verifying individual
241+
- Per-component **`demos/demo-*.sh`** scripts for verifying individual
242242
pieces without running the full walkthrough.
243243

244244
The verification model: each smoke script is its own gate (it returns

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ mesh** (deploy review-service → publish its contract → catalog it with
7171
lineage → back it all out), and the **contract canary** as a
7272
presenter-driven up/shift/down cycle.
7373

74-
Every claim is smoke-tested: 19 `smoke-*.sh` scripts cover each capability
74+
Every claim is demo-tested: 20 `demo-*.sh` scripts cover each capability
7575
end to end, verified order-independent (see
7676
`_plans/reconciliation.md` for what's been cluster-verified and when).
7777

‎_includes/header.html‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<a href="{{ '/docs/00-index/' | relative_url }}"
99
{% if page.url contains '/docs/' %}aria-current="page"{% endif %}>Start here</a>
1010
<a href="{{ '/docs/10-summary/' | relative_url }}">Summary</a>
11+
<a href="{{ '/demos/' | relative_url }}"
12+
{% if page.url == '/demos/' or page.url == '/setup/' %}aria-current="page"{% endif %}>Demos</a>
1113
<a href="https://github.com/{{ site.github_username }}/{{ site.github_repo }}"
1214
rel="noopener">GitHub ↗</a>
1315
</nav>

‎_plans/archive/capstone-decisions.md‎

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ Status values: **accepted**, **superseded by CAP-NNN**,
282282
`/health` (liveness), `/healthz` (readiness, checks Postgres), and
283283
startup schema creation — **no domain surface yet**. Domain endpoints
284284
arrive per-protocol in later iterations (REST/gRPC r23, GraphQL r24,
285-
Kafka r25). A generic **`demos/smoke-service.sh <name>`** builds, deploys,
285+
Kafka r25). A generic **`demos/demo-service.sh <name>`** builds, deploys,
286286
and asserts the probes for any scaffolded service. **notification-service
287287
gets the same `/health` surface** even though it will ultimately be
288288
Kafka-consumer-only, because a probe-able surface is useful for testing
@@ -977,7 +977,7 @@ first install.
977977
### Outcome (verified on Fedora 44, r27b)
978978

979979
Green first try. `ingest-openmetadata.sh` ran all three Jobs to completion and
980-
`smoke-om-lineage.sh` passed every assertion — both services, the three spine
980+
`demo-om-lineage.sh` passed every assertion — both services, the three spine
981981
entities, and the topic's one-upstream/one-downstream lineage. The flagged
982982
verification risk did **not** materialize: the OM 1.12.8 Postgres connector
983983
(`authType.password`, `sslMode: require` against CNPG), the bare Kafka connector
@@ -1017,7 +1017,7 @@ appropriate caution, not a deferred bug.
10171017
on a capstone service. The smoke hits the gateway (port-forwarded under
10181018
rootless podman, the §11 Option A), so no client needs meshing.
10191019
- **Weights as `__W_V1__`/`__W_V2__` placeholders** in `istio/routing.yaml`;
1020-
`smoke-canary.sh` substitutes them, so the same file drives 90/10, 50/50,
1020+
`demo-canary-verify.sh` substitutes them, so the same file drives 90/10, 50/50,
10211021
0/100 — the progressive-canary operation is just re-applying the
10221022
VirtualService.
10231023
- **Selector immutability handled explicitly.** The v1 Deployment's selector
@@ -1122,9 +1122,9 @@ graphql-gateway service:80, concurrency target 5, min 0 / max 3). Install via
11221122
"false"` so the injection-labeled namespace doesn't mesh them — keeping the
11231123
mesh scoped to order-service (CAP-024) and the autoscaling paths clear of Envoy.
11241124
The §17 stack-table line was corrected to "Scale graphql-gateway on HTTP load."
1125-
Two smokes prove the full 0→up→0 lifecycle: `demos/smoke-keda-kafka.sh` (produces
1125+
Two smokes prove the full 0→up→0 lifecycle: `demos/demo-keda-kafka.sh` (produces
11261126
a 500-message raw burst to create lag — the consumer auto-commits and skips
1127-
undecodable messages, so no Avro path is needed) and `demos/smoke-keda-http.sh`
1127+
undecodable messages, so no Avro path is needed) and `demos/demo-keda-http.sh`
11281128
(drives /health load through the interceptor to wake the gateway from zero).
11291129
Validated statically (bash -n, pyyaml parse, disjoint targets). Cluster-only
11301130
risk: KEDA + HTTP-add-on API/install specifics, flagged `VERIFY-POINT` in the
@@ -1230,7 +1230,7 @@ none visible offline.
12301230
request rate by response code from the mesh.
12311231
- **Files:** `observability/prometheus-values.yaml`,
12321232
`observability/grafana-values.yaml` (inline dashboard JSON),
1233-
`scripts/setup-observability.sh`, `demos/smoke-observability.sh`, §17 new
1233+
`scripts/setup-observability.sh`, `demos/demo-observability.sh`, §17 new
12341234
section "Seeing it: metrics with Prometheus and Grafana".
12351235
- **Consequences:**
12361236
- (+) The capstone is now observable for its scaling and mesh traffic without
@@ -1269,11 +1269,11 @@ none visible offline.
12691269
- **Grafana Tempo datasource** provisioned alongside Prometheus (uid=`tempo`,
12701270
url `http://tempo.observability:3200`).
12711271
- **Files:** `observability/tempo-values.yaml`, grafana-values.yaml (+Tempo
1272-
datasource), setup-observability.sh (+Tempo install), `demos/smoke-tracing.sh`,
1272+
datasource), setup-observability.sh (+Tempo install), `demos/demo-tracing.sh`,
12731273
§17 traces-backend paragraph.
12741274
- **Consequences:**
12751275
- (+) Leaner than the original sketch (one fewer component to run/debug).
1276-
- (+) Backend verifiable independently (smoke-tracing: Tempo ready + Grafana
1276+
- (+) Backend verifiable independently (demo-tracing: Tempo ready + Grafana
12771277
datasource provisioned/reachable).
12781278
- (−) No traces visible until r29c instruments a service — by design.
12791279
- (−) Chart-schema correctness (tempo values keys, OTLP receiver wiring) is
@@ -1320,7 +1320,7 @@ none visible offline.
13201320
extension, deliberately deferred.
13211321
- **Files:** services/graphql-gateway/Containerfile (OTEL install + wrapped CMD),
13221322
graphql-gateway values.yaml (`tracing:` block) + deployment.yaml (OTEL env),
1323-
demos/smoke-trace-flow.sh, §17 traces paragraph.
1323+
demos/demo-trace-flow.sh, §17 traces paragraph.
13241324
- **Consequences:**
13251325
- (+) A real distributed trace of the federated query, visible in Grafana's
13261326
Tempo explorer — the federation section made concrete.
@@ -1332,7 +1332,7 @@ none visible offline.
13321332
are instrumented too.
13331333
- (−) Unpinned OTEL package versions (bootstrap aligns instrumentation versions
13341334
to the installed SDK); pin for a fully reproducible image. Instrumentation
1335-
correctness and the Tempo search format are cluster-only — smoke-trace-flow's
1335+
correctness and the Tempo search format are cluster-only — demo-trace-flow's
13361336
trace-found check is therefore best-effort (the HTTP 200 is the hard part).
13371337
- **Export-protocol addendum (r29c.2):** the first cluster run proved the
13381338
instrumentation (all instrumentations installed, gateway 200) but Tempo had
@@ -1344,7 +1344,7 @@ none visible offline.
13441344
`opentelemetry-exporter-otlp` meta-package). Validated against a working
13451345
user-provided otel-lgtm reference (Java/Podman Compose) using exactly
13461346
`OTEL_EXPORTER_OTLP_ENDPOINT=http://lgtm:4318` + `PROTOCOL=http/protobuf`.
1347-
Also hardened smoke-trace-flow.sh: TraceQL (`q=`) search, not legacy `tags=`,
1347+
Also hardened demo-trace-flow.sh: TraceQL (`q=`) search, not legacy `tags=`,
13481348
plus a gateway-log capture right after the query (before KEDA scale-to-zero).
13491349
Lesson: http/protobuf is the robust OTLP default; gRPC needs the insecure flag.
13501350

@@ -1459,7 +1459,7 @@ get back to green instead of debugging a wall of red. Validated offline: `bash -
14591459
on both scripts; registry diff uses the same catalog API as build-image.sh.
14601460
Cluster-verify: run `cluster-up.sh` from a stopped/wedged state and confirm green.
14611461

1462-
- **r29b.1 addendum (CAP-028).** Hardened `smoke-tracing.sh` from a "backend is
1462+
- **r29b.1 addendum (CAP-028).** Hardened `demo-tracing.sh` from a "backend is
14631463
standing" check into an end-to-end ingest proof: it POSTs a synthetic OTLP/HTTP
14641464
JSON span to Tempo :4318 (random 16-byte trace id / 8-byte span id, ns
14651465
timestamps) and reads it back via TraceQL on :3200. This is the check whose
@@ -1531,7 +1531,7 @@ new OpenMetadata lineage node; cleanly reversible as a whole product) with its
15311531
- Chart aligned with the **r28 calibration** (requests 192Mi / limit 512Mi +
15321532
startupProbe 30x2s) — the scaffolder predates r28, so the generated chart was
15331533
bumped to avoid repeating the cold-start/OOM class.
1534-
- `demos/smoke-reviews.sh` asserts the full REST surface (probes, version, seeded
1534+
- `demos/demo-reviews.sh` asserts the full REST surface (probes, version, seeded
15351535
rows, create, fetch-by-id, sku filter).
15361536

15371537
**Explicitly temporary.** review-service is a *demonstration* data product, not a
@@ -1546,7 +1546,7 @@ image build (the Containerfile's `poetry export` step needs it).
15461546

15471547
**Consequences.** Offline-validated: `py_compile` all modules; values.yaml
15481548
parses; deployment braces 24/24 with startupProbe; smoke `bash -n`. Cluster-verify:
1549-
`./demos/smoke-reviews.sh` green against the running capstone.
1549+
`./demos/demo-reviews.sh` green against the running capstone.
15501550
## CAP-033 — Phase A (part 2): discovery, catalog, and the replayable demo
15511551

15521552
**Status:** decided, shipped r33 (offline-validated; cluster-verify pending).
@@ -1837,7 +1837,7 @@ order-service connects on its next retry and goes `2/2` — closing the bring-up
18371837

18381838
**Context.** The canary was scaffolded at r26 (CAP-024): `istio/routing.yaml`
18391839
(Gateway + weighted VirtualService with `__W_V1__/__W_V2__` + DestinationRule
1840-
v1/v2 subsets), `smoke-canary.sh` (deploys v2, drives 90/10→50/50, asserts the
1840+
v1/v2 subsets), `demo-canary-verify.sh` (deploys v2, drives 90/10→50/50, asserts the
18411841
split), `istio/order-service-v2.yaml` (v2 = same image, `API_VERSION=v2`), and
18421842
the `/version` canary signal (v2 reports `api_version=v2` + an additive
18431843
`currency` field). Phase B's job was to make it actually run on the current
@@ -1857,7 +1857,7 @@ annotations and resources are overlay-local and had to be brought into line.)
18571857
rendered chart env exactly).
18581858
* **Add `demos/demo-canary.sh up|shift|down`** — the presenter-facing,
18591859
repeatable, backable-out counterpart to the verification-facing
1860-
smoke-canary.sh. `up [w1 w2]` deploys v2 + opens the split (default 90/10);
1860+
demo-canary-verify.sh. `up [w1 w2]` deploys v2 + opens the split (default 90/10);
18611861
`shift w1 w2` moves it (50/50, 0/100, …); `down` drains to v1, removes the
18621862
Gateway/VirtualService/DestinationRule and the v2 Deployment, restoring a
18631863
v1-only baseline. This is the "repeatable / backable-out" the roadmap asked
@@ -1867,13 +1867,13 @@ annotations and resources are overlay-local and had to be brought into line.)
18671867
keep drifting from the v1 chart (this is the second time: it missed CAP-037/038).
18681868
Noted option for later: parametrize the order-service chart so v2 is a second
18691869
helm release (`--set version=v2,apiVersion=v2`) with the shared Service rendered
1870-
once — eliminating the overlay. Deferred (it changes smoke-canary and revisits
1870+
once — eliminating the overlay. Deferred (it changes demo-canary-verify and revisits
18711871
CAP-024's overlay choice); the alignment above is the right scope for tonight.
18721872

18731873
**Consequences.** Offline-validated: v2 manifest parses with all three alignments;
18741874
demo-canary.sh `bash -n` clean and its `down` targets exactly the objects
18751875
routing.yaml creates; `/version` confirmed to emit v2 + currency. Cluster-verify:
1876-
`./demos/smoke-canary.sh` lands the 90/10 and 50/50 splits in-band, and
1876+
`./demos/demo-canary-verify.sh` lands the 90/10 and 50/50 splits in-band, and
18771877
`demo-canary.sh up → shift → down` cycles cleanly. A+B together demonstrate the
18781878
data-mesh value from the API/contract perspective (add a product, then evolve its
18791879
contract under canary).
@@ -1991,7 +1991,7 @@ the capstone's EXISTING `observability`-namespace Prometheus
19911991
(`prometheus-server.observability`), Grafana (`grafana.observability`), and Tempo
19921992
(`tempo.observability:3100`). Single observability stack, no second TSDB. Kiali
19931993
is additive and isolated: it runs after `setup-istio.sh` + `setup-observability.sh`
1994-
and touches nothing they own. Verification is `demos/smoke-kiali.sh` (Ready +
1994+
and touches nothing they own. Verification is `demos/demo-kiali.sh` (Ready +
19951995
config wired to capstone Prometheus + `/healthz` + `/api/namespaces` lists
19961996
`capstone` + a best-effort graph-API probe).
19971997

@@ -2010,11 +2010,11 @@ without touching the Istio install.
20102010
ConfigMap patch is a JSON merge on `data."config.yaml"` only (preserves the
20112011
addon's labels/metadata; idempotent). Cluster-verify (pending): run
20122012
`setup-istio.sh` → `setup-observability.sh` → `setup-kiali.sh`, then
2013-
`smoke-kiali.sh` should PASS and, after a traffic-generating demo, the Kiali
2013+
`demo-kiali.sh` should PASS and, after a traffic-generating demo, the Kiali
20142014
graph (namespace `capstone`) should show the products and their edges with the
20152015
canary split. VERIFY-POINT: the addon ConfigMap is assumed to be named `kiali`
20162016
with key `config.yaml`; if the installed Kiali/Istio version differs, adjust the
2017-
patch in `setup-kiali.sh` and the config check in `smoke-kiali.sh`.
2017+
patch in `setup-kiali.sh` and the config check in `demo-kiali.sh`.
20182018

20192019
## CAP-043 — Phase E presenter walkthrough: orchestrator over the existing demos
20202020

@@ -2057,8 +2057,8 @@ up automatically.
20572057

20582058
**Context.** With Phase E shipped (CAP-043, the `walkthrough.sh` orchestrator),
20592059
two acts hit a class of failure that was unfair to the operator: lineage
2060-
(`smoke-om-lineage.sh`) failed because ingestion hadn't been run, and topology
2061-
(`smoke-kiali.sh`) failed because Kiali wasn't installed. Both were
2060+
(`demo-om-lineage.sh`) failed because ingestion hadn't been run, and topology
2061+
(`demo-kiali.sh`) failed because Kiali wasn't installed. Both were
20622062
documented-but-manual steps from earlier iterations (Kiali only existed as
20632063
CAP-042; `ingest-openmetadata.sh` was always a footer recommendation in
20642064
bootstrap rather than a step bootstrap ran). The walkthrough's preflight could
@@ -2122,7 +2122,7 @@ ready, returns 502, KEDA then scales the gateway back down within its
21222122
the env-var name is `KEDA_HTTP_*` *without* the `INTERCEPTOR_` infix).
21232123
- The `autoscaling.keda.sh/paused-replicas` annotation (works on KEDA's core
21242124
`ScaledObject`, not on the HTTP add-on's `HTTPScaledObject`).
2125-
- A pre-warm GET in `smoke-trace-flow.sh` (the warmup succeeded in waking the
2125+
- A pre-warm GET in `demo-trace-flow.sh` (the warmup succeeded in waking the
21262126
gateway, but KEDA HTTP scaled it back down between the warmup and the real
21272127
POST faster than the script could send the second request).
21282128

@@ -2148,7 +2148,7 @@ story than "everything scales to zero", which papers over the cold-start cost
21482148
of synchronous interfaces.
21492149

21502150
**Consequences.** Offline-validated: YAML loads, smoke script lints. The
2151-
pre-warm code added to `smoke-trace-flow.sh` during the failed cold-start
2151+
pre-warm code added to `demo-trace-flow.sh` during the failed cold-start
21522152
debugging is reverted (no longer needed; with `min: 1` the gateway is warm).
21532153
Cluster-verify pending: with the updated HTTPScaledObject applied, the
21542154
walkthrough's trace act runs to completion on the first attempt. Follow-up
@@ -2213,8 +2213,8 @@ commits on `main`) so any inadvertent breakage of the four working acts
22132213
`external-push` pointing at `interceptorRoute: "graphql-gateway"`.
22142214
* `scripts/bootstrap-capstone.sh` — applies the two new manifests instead
22152215
of the one old.
2216-
* `demos/smoke-keda-http.sh` and `demos/smoke-trace-flow.sh` — comment and
2217-
fail-message updates; `smoke-trace-flow.sh` curl timeout bumped from 30s
2216+
* `demos/demo-keda-http.sh` and `demos/demo-trace-flow.sh` — comment and
2217+
fail-message updates; `demo-trace-flow.sh` curl timeout bumped from 30s
22182218
to 90s to give the 60s readiness budget room.
22192219

22202220
**Narrative implications** (deck/tutorial copy that benefits from this).

‎_plans/archive/capstone-roadmap.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ data-mesh value proposition *from the API/consumer perspective*.
2626

2727
## Phase B — v1→v2 canary as a repeatable walkthrough
2828

29-
Finish the v1→v2 story already started (`order-service-v2`, `smoke-canary.sh`):
29+
Finish the v1→v2 story already started (`order-service-v2`, `demo-canary-verify.sh`):
3030
a genuinely different v2 (the new field from Phase A is a natural differentiator),
3131
the weighted Istio VirtualService, and verification that traffic splits. Framed
3232
as a **repeatable, backable-out walkthrough** so it can be demoed live and reset.

0 commit comments

Comments
 (0)