Skip to content

Commit a1b792e

Browse files
committed
demos: Manim scenes 12–14, M12.2 recordings, docs + video-framework bundle
- Replace panel image hack with RegressionSuiteScene, ManagementGUIArchitectureScene, GUIExtensionScene - compose.sh / generate-all.sh / segments doc updates - Regenerated recordings and full-demo-with-m12-2; terminal tapes + narration tweaks - Regression/testing docs, demos README, AGENTS - Add documentation-generator/ (example bundle + video-framework templates) Made-with: Cursor
1 parent 529e1fa commit a1b792e

27 files changed

Lines changed: 963 additions & 76 deletions

AGENTS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Regression — iterate until complete
44

5+
Full **`run-regression*.sh`** is a **system / integration** suite for this repo (cluster-backed tiers optional). It is **not** the same as “every test on every application pull request” — see [docs/REGRESSION.md](docs/REGRESSION.md) for PR vs platform scope.
6+
57
Do **not** stop after a single partial test run. Follow **[docs/AGENT-REGRESSION.md](docs/AGENT-REGRESSION.md)**:
68

79
- Run **`bash scripts/run-regression-agent.sh`** (or **`run-regression-agent-full.sh`** if Results + DB must pass).

docs/REGRESSION.md

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ Single entrypoint: **`scripts/run-regression.sh`** (see `--help`). Run when gree
44

55
**Cursor / agents:** follow **[AGENT-REGRESSION.md](AGENT-REGRESSION.md)** — run **`scripts/run-regression-agent.sh`** (or **`run-regression-agent-full.sh`**) and **iterate with fixes until exit 0**, not a single partial run. Repo **[AGENTS.md](../AGENTS.md)** points here.
66

7+
## Application PR pipeline vs platform (system) regression
8+
9+
Do **not** confuse these:
10+
11+
| Scope | What runs | Typical trigger |
12+
|-------|-----------|-----------------|
13+
| **Application PR** (`stack-pr-test` on an **app** repo) | Stack-defined tests only — e.g. that app’s Newman/Playwright/Artillery as declared in `stacks/*.yaml`, against the intercept build. | Every PR on the **application** repository (when webhooks/Tekton are wired). |
14+
| **Platform regression** (`scripts/run-regression*.sh` on **this** repo) | **System / integration** tiers: Phase 1 + orchestrator + shared libs + GUI pytest, Playwright for **management-gui**, real **`stack-dag-verify`** PipelineRun, Newman against **orchestrator** API, optional Tekton Results, optional Kind E2E. | **Manual**, **scheduled**, **pre-release**, or **agent loop****not** “automatically on every pull request” unless *you* add GitHub Actions (or similar) to do so. |
15+
16+
So: **not all tests run on every PR.** The full regression driver is a **system test** bar for the platform; app PRs run a narrower, stack-scoped test stage.
17+
718
**Streaming / timestamps:** use **`scripts/run-regression-stream.sh`** — same arguments, prefixes each line with `[HH:MM:SS]` and preserves the real exit code (plain `| while read` does not).
819

920
**Port-forward prep:** [common.sh](../scripts/common.sh) defines **`free_tcp_port`**. Regression (**[run-regression.sh](../scripts/run-regression.sh)**) runs a **prep** step when `kubectl` works: frees **`ORCHESTRATOR_TEST_PORT`** (default **9091**) and **`RESULTS_API_LOCAL_PORT`** (default **8080**). Set **`REGRESSION_FREE_PORTS=0`** to skip that prep. [run-orchestrator-tests.sh](../scripts/run-orchestrator-tests.sh) also frees the orchestrator local port; [verify-results-in-db.sh](../scripts/verify-results-in-db.sh) frees **8080** (or **`RESULTS_API_LOCAL_PORT`**) before forwarding the Results API.
@@ -77,11 +88,11 @@ Environment:
7788
- `REGRESSION_DAG_VERIFY=auto|skip|yes`
7889
- `DAG_VERIFY_TIMEOUT` — seconds passed to `verify-dag-phase2.sh` `--timeout` (default **300** in regression).
7990

80-
## Suggested “complete regression” before doc work
91+
## Suggested regression cadence (not all on every PR)
8192

82-
1. `./scripts/run-regression.sh --local-only` on every commit / PR.
83-
2. On a cluster with Tekton + orchestrator: **`./scripts/run-regression.sh --cluster --require-dag-verify`** (ensures at least one **Succeeded** `stack-dag-verify` run, not only Newman side-effects).
84-
3. With Tekton Results: `--with-results-verify` or rely on **auto** when the API exists.
85-
4. `--kind-e2e` when changing bootstrap, intercepts, or Results integration.
93+
1. **Often (fast, no cluster):** `./scripts/run-regression.sh --local-only` — Phase 1 + pytest + vitest; good for frequent pushes; safe to wire into lightweight CI.
94+
2. **System bar (cluster):** **`./scripts/run-regression.sh --cluster --require-dag-verify`** when you need a real **Succeeded** `stack-dag-verify` and orchestrator Newman — treat as **integration / system** work: before releases, after big platform changes, on a schedule, or when agents/docs require proof — **not** as “must pass on every GitHub PR” unless you explicitly configure that.
95+
3. **With Tekton Results:** `--with-results-verify` or rely on **auto** when the API exists.
96+
4. **Kind E2E:** `--kind-e2e` when changing bootstrap, intercepts, or Results integration (heavy; occasional).
8697

8798
After the tiers you care about are green, update [milestones/milestone-8.md](../milestones/milestone-8.md) and related testing docs.

docs/TESTING-AND-REGRESSION-OVERVIEW.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
This document is the **story** behind how tekton-dag is verified end-to-end. Use it for **onboarding**, **release checklists**, and **video voiceover**. Operational detail lives in [REGRESSION.md](REGRESSION.md), [AGENT-REGRESSION.md](AGENT-REGRESSION.md), and [scripts/run-regression.sh](../scripts/run-regression.sh).
44

5+
**Scope:** An **application PR** only runs that stack’s declared tests inside **stack-pr-test**. The **`run-regression*.sh`** suites are **platform / system** checks (orchestrator, GUI, real PipelineRuns, Newman, Results). They are **not** all expected to run on every GitHub pull request unless you wire CI that way — see [REGRESSION.md](REGRESSION.md) § *Application PR pipeline vs platform (system) regression*.
6+
57
## Why regression is more than unit tests
68

79
| Layer | What it proves | Typical command / artifact |

docs/demos/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Demo video toolchain (M8 / M12.2)
22

3+
**Portable copy** for other repos: [`../../documentation-generator/video-framework/`](../../documentation-generator/video-framework/) (+ [`../../documentation-generator/example-demo-bundle/`](../../documentation-generator/example-demo-bundle/)). Canonical scripts stay here; refresh the copy when the framework changes.
4+
35
Regenerate narration, animations, terminal recordings, and composed MP4s:
46

57
```bash

docs/demos/animations/scenes.py

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,3 +1133,192 @@ def _svc_circle(self, label, color, pos, radius=0.40):
11331133
c = Circle(radius=radius, color=color, fill_opacity=0.12, stroke_width=2.5)
11341134
t = Text(label, font_size=12, color=color)
11351135
return VGroup(c, t).move_to(pos)
1136+
1137+
1138+
# ═════════════════════════════════════════════════════════════════════
1139+
# M12.2 — Segment 12: Full regression suite
1140+
# Audio: 12-regression-suite.mp3 (~39.4 s)
1141+
# Beats align with narration/12-regression-suite.md numbered script.
1142+
# ═════════════════════════════════════════════════════════════════════
1143+
class RegressionSuiteScene(Scene):
1144+
def construct(self):
1145+
self.camera.background_color = C_BG
1146+
t = 0.0
1147+
1148+
title = Text("Full regression suite", font_size=32, color=WHITE)
1149+
sub = Text("Verify in layers — unit tests alone are not enough", font_size=15, color=GREY)
1150+
sub.next_to(title, DOWN, buff=0.32)
1151+
self.play(FadeIn(title), FadeIn(sub), run_time=1.0)
1152+
t += 1.0
1153+
t = _wait_until(self, 8.0, t)
1154+
self.play(FadeOut(title), FadeOut(sub), run_time=0.45)
1155+
t += 0.45
1156+
1157+
h1 = Text("Without Kubernetes", font_size=14, color=C_GUI)
1158+
h1.move_to(LEFT * 3.6 + UP * 2.55)
1159+
h2 = Text("With cluster", font_size=14, color=C_ORCH)
1160+
h2.move_to(RIGHT * 3.6 + UP * 2.55)
1161+
self.play(FadeIn(h1), FadeIn(h2), run_time=0.5)
1162+
t += 0.5
1163+
1164+
left_col = VGroup(
1165+
Text("Phase 1 — stack YAML + registry", font_size=11, color=WHITE),
1166+
Text("pytest — orchestrator, libs, GUI backend", font_size=11, color=WHITE),
1167+
Text("vitest — baggage-node", font_size=11, color=WHITE),
1168+
).arrange(DOWN, aligned_edge=LEFT, buff=0.22).move_to(LEFT * 3.6 + UP * 0.55)
1169+
1170+
right_col = VGroup(
1171+
Text("stack-dag-verify PipelineRun", font_size=11, color=C_PR),
1172+
Text("Newman — orchestrator API", font_size=11, color=C_PR),
1173+
Text("Playwright — management GUI", font_size=11, color=C_PR),
1174+
Text("Tekton Results (optional)", font_size=10, color=GREY),
1175+
).arrange(DOWN, aligned_edge=LEFT, buff=0.18).move_to(RIGHT * 3.6 + UP * 0.35)
1176+
1177+
self.play(LaggedStart(FadeIn(left_col), FadeIn(right_col), lag_ratio=0.35), run_time=1.8)
1178+
t += 1.8
1179+
t = _wait_until(self, 26.0, t)
1180+
1181+
driver = Text("run-regression-agent.sh", font_size=15, color=C_HOOK)
1182+
driver.move_to(UP * 1.75)
1183+
hint = Text("Phase 2 passed · regression exit code 0", font_size=13, color=C_PR)
1184+
hint.next_to(driver, DOWN, buff=0.38)
1185+
self.play(FadeIn(driver), run_time=0.45)
1186+
t += 0.45
1187+
self.play(FadeIn(hint), run_time=0.45)
1188+
t += 0.45
1189+
t = _wait_until(self, 35.5, t)
1190+
1191+
self.play(*[FadeOut(m) for m in self.mobjects], run_time=0.45)
1192+
t += 0.45
1193+
fin = Text("Scripted bar clear — safe for docs / merge", font_size=20, color=C_PR)
1194+
self.play(FadeIn(fin), run_time=0.7)
1195+
t += 0.7
1196+
t = _wait_until(self, 39.5, t)
1197+
1198+
1199+
# ═════════════════════════════════════════════════════════════════════
1200+
# M12.2 — Segment 13: Management GUI architecture
1201+
# Audio: 13-management-gui-architecture.mp3 (~53.8 s)
1202+
# ═════════════════════════════════════════════════════════════════════
1203+
class ManagementGUIArchitectureScene(Scene):
1204+
def construct(self):
1205+
self.camera.background_color = C_BG
1206+
t = 0.0
1207+
1208+
title = Text("Management GUI architecture", font_size=28, color=C_GUI)
1209+
self.play(FadeIn(title), run_time=0.75)
1210+
t += 0.75
1211+
t = _wait_until(self, 9.5, t)
1212+
self.play(title.animate.scale(0.42).to_edge(UP, buff=0.18), run_time=0.45)
1213+
t += 0.45
1214+
1215+
cred = Text("Browser never holds cluster credentials", font_size=12, color=C_PR)
1216+
cred.move_to(UP * 2.35)
1217+
br = _box("Browser", GREY, w=1.45, h=0.58, fs=12)
1218+
vu = _box("Vue 3 SPA", C_VUE, w=1.55, h=0.58, fs=12)
1219+
apilbl = _box("/api/*", C_FLASK, w=1.25, h=0.58, fs=11)
1220+
fl = _box("Flask", C_FLASK, w=1.2, h=0.58, fs=12)
1221+
k8 = _box("Kubernetes", C_PIPE, w=1.65, h=0.58, fs=11)
1222+
row = VGroup(br, vu, apilbl, fl, k8).arrange(RIGHT, buff=0.28).move_to(UP * 0.75)
1223+
self.play(FadeIn(cred), LaggedStart(*[FadeIn(x) for x in row], lag_ratio=0.12), run_time=1.6)
1224+
t += 1.6
1225+
for i in range(len(row) - 1):
1226+
arr = Arrow(
1227+
row[i].get_right(), row[i + 1].get_left(), buff=0.06,
1228+
color=WHITE, stroke_width=2, max_tip_length_to_length_ratio=0.08,
1229+
)
1230+
self.play(Create(arr), run_time=0.12)
1231+
t += 0.12
1232+
t = _wait_until(self, 22.0, t)
1233+
1234+
team = Text("/api/teams/{team}/pipelineruns …", font_size=11, color=C_ORCH)
1235+
team.move_to(DOWN * 0.35)
1236+
self.play(FadeIn(team), run_time=0.45)
1237+
t += 0.45
1238+
t = _wait_until(self, 32.5, t)
1239+
1240+
views = VGroup(
1241+
_badge("Trigger", C_PR),
1242+
_badge("Monitor", C_ORCH),
1243+
_badge("DAG", C_NEO4J),
1244+
).arrange(RIGHT, buff=0.45).move_to(DOWN * 1.85)
1245+
cap = Text("Stack YAML resolved server-side · Vue Flow", font_size=11, color=GREY)
1246+
cap.next_to(views, DOWN, buff=0.28)
1247+
self.play(FadeIn(views), run_time=0.6)
1248+
t += 0.6
1249+
self.play(FadeIn(cap), run_time=0.35)
1250+
t += 0.35
1251+
t = _wait_until(self, 44.0, t)
1252+
1253+
helm = Text("Helm: namespace, RBAC, orchestrator endpoints", font_size=12, color=C_HELM)
1254+
helm.move_to(DOWN * 3.05)
1255+
self.play(FadeIn(helm), run_time=0.5)
1256+
t += 0.5
1257+
t = _wait_until(self, 53.9, t)
1258+
1259+
1260+
# ═════════════════════════════════════════════════════════════════════
1261+
# M12.2 — Segment 14: Extending the GUI for Tekton
1262+
# Audio: 14-gui-tekton-extension.mp3 (~59 s)
1263+
# ═════════════════════════════════════════════════════════════════════
1264+
class GUIExtensionScene(Scene):
1265+
def construct(self):
1266+
self.camera.background_color = C_BG
1267+
t = 0.0
1268+
1269+
title = Text("Extending the GUI for Tekton", font_size=28, color=WHITE)
1270+
self.play(FadeIn(title), run_time=0.75)
1271+
t += 0.75
1272+
t = _wait_until(self, 8.5, t)
1273+
self.play(FadeOut(title), run_time=0.4)
1274+
t += 0.4
1275+
1276+
lt = Text("Flask — add JSON route first", font_size=14, color=C_FLASK)
1277+
lt.move_to(LEFT * 3.6 + UP * 2.75)
1278+
rt = Text("Vue — Pinia + views", font_size=14, color=C_VUE)
1279+
rt.move_to(RIGHT * 3.6 + UP * 2.75)
1280+
self.play(FadeIn(lt), FadeIn(rt), run_time=0.45)
1281+
t += 0.45
1282+
1283+
left_body = VGroup(
1284+
Text("Wrap kubernetes client", font_size=11, color=GREY),
1285+
Text("Stable JSON for tables / charts", font_size=12, color=WHITE),
1286+
Text("pytest + mocks (same style as routes)", font_size=11, color=GREY),
1287+
).arrange(DOWN, aligned_edge=LEFT, buff=0.2).move_to(LEFT * 3.6 + UP * 0.95)
1288+
1289+
right_body = VGroup(
1290+
Text("Store: useApi + teamUrl()", font_size=12, color=WHITE),
1291+
Text("Router + view component", font_size=11, color=GREY),
1292+
Text("Playwright spec per flow", font_size=11, color=GREY),
1293+
).arrange(DOWN, aligned_edge=LEFT, buff=0.2).move_to(RIGHT * 3.6 + UP * 0.95)
1294+
1295+
self.play(FadeIn(left_body), run_time=0.85)
1296+
t += 0.85
1297+
t = _wait_until(self, 18.0, t)
1298+
self.play(FadeIn(right_body), run_time=0.85)
1299+
t += 0.85
1300+
t = _wait_until(self, 32.0, t)
1301+
1302+
bridge = Text("team-scoped reads", font_size=11, color=GREY_B)
1303+
bridge.move_to(UP * 0.95)
1304+
self.play(FadeIn(bridge), run_time=0.35)
1305+
t += 0.35
1306+
arr = Arrow(LEFT * 1.15 + UP * 0.95, RIGHT * 1.15 + UP * 0.95, buff=0.02, color=GREY_B)
1307+
self.play(Create(arr), run_time=0.25)
1308+
t += 0.25
1309+
t = _wait_until(self, 42.0, t)
1310+
1311+
qa = VGroup(
1312+
Text("pytest — API contracts", font_size=12, color=C_PR),
1313+
Text("Playwright — UI regressions", font_size=12, color=C_PR),
1314+
Text("Small PRs: schema, route, store, view, one E2E", font_size=11, color=WHITE),
1315+
).arrange(DOWN, aligned_edge=LEFT, buff=0.18).move_to(DOWN * 2.05)
1316+
self.play(FadeIn(qa), run_time=0.9)
1317+
t += 0.9
1318+
t = _wait_until(self, 52.0, t)
1319+
1320+
doc = Text("docs/MANAGEMENT-GUI-EXTENSION.md", font_size=12, color=C_HOOK)
1321+
doc.to_edge(DOWN, buff=0.32)
1322+
self.play(FadeIn(doc), run_time=0.45)
1323+
t += 0.45
1324+
t = _wait_until(self, 59.2, t)

0 commit comments

Comments
 (0)