Guardrails
Apps should not re-implement injection, PII, and secret filters.
goose.maniak.ai · customer-clean demo runbook
Each demo is built so a customer can follow live output without reading the
code: why it matters → what to watch →
what proves it. Terminal harnesses print the same card.
Clone the repo, stay on the worker LAN, run from scripts/
or ./scripts/lab-menu.sh.
Pick a card. Run the one-liner. Keep eyes on the status line the harness highlights — green pass, red block. No slide deck required.
Full-screen terminal · run
./scripts/lab-menu.sh · open a number for the
story card · press r to run live.
Web diagrams: diagrams.html · Mermaid:
docs/flows.md.
Apps should not re-implement injection, PII, and secret filters.
One app URL; many models and providers behind it.
One chatty client can burn the team budget.
Turn any OpenAPI surface into agent tools in minutes.
Agents should not stitch multi-API workflows themselves.
Agents should not dual-connect every MCP server.
Same endpoint, different tools by Azure group — no per-user wiring.
Models need the same enterprise identity as tools.
Classic injection still hits AI endpoints.
Finance needs spend by app, not only by user.
./scripts/lab-menu.sh # story cards + run live ./scripts/test-workshop-phases.sh all # A safety → B routing → C MCP → E identity ./scripts/test-virtual-mcp.sh # federation showpiece ./scripts/test-cost-vk.sh clients # then open UI Cost Management
git clone https://github.com/sebbycorp/k8s-goose.git && cd k8s-goose # Feature menu — customer story cards + live run (recommended) ./scripts/lab-menu.sh # open number · r = run · s = story only ./scripts/lab-menu.sh diagrams # problem→solution in terminal ./scripts/lab-menu.sh pitch # 15‑min guided path ./scripts/lab-menu.sh prereqs # az / kubectl / LAN # 1) Multi-hop identity (passthrough → STS impersonation → Entra OBO) ./scripts/test-identity-hops.sh # 2) Entra OBO deep dive (Graph /me) ./scripts/test-entra-obo.sh # 3) Virtual MCP federation (open /mcp — multi-backend tools) ./scripts/test-virtual-mcp.sh # 4) MCP security (JWT + tool RBAC + rate limit) ./scripts/entra-mcp-groups.sh set platform ./scripts/test-mcp-security.sh all # 5) LLM P2C load balance + failover ./scripts/test-llm-lb-failover.sh all # 6) LLM smoke (all providers) ./scripts/test-llm-gateways.sh all # 7) Budgets / virtual keys ./scripts/test-budget-teams.sh status ./scripts/test-cost-vk.sh all
Lab map · pick a lane
On-LAN to 172.16.10.155 ·
az login (Entra demos) ·
kubectl context maniak-goose for cluster ops ·
Graph consent once for OBO:
./scripts/configure-entra-obo.sh
Feature menu (aligned with
docs.solo.io/agentgateway):
./scripts/lab-menu.sh
— pillars, explanations, and live runs.
Guided: pitch · diagrams (problem→solution) ·
groups · prereqs · help.
Web visuals: diagrams.html.
How identity survives multi-hop agent calls without collapsing into one token.
| Demo | Script / page | Endpoint | Proves |
|---|---|---|---|
| Identity hops | ./scripts/test-identity-hops.shidentity.html |
:30160/identity/passthrough:30160/identity/impersonate |
Passthrough Entra JWT vs STS impersonation (same sub, no act) + optional Graph OBO |
| Entra OBO | ./scripts/test-entra-obo.shmcp-gateway#entra-obo |
:30160/graph-me |
Middle-tier JWT → Entra jwt-bearer OBO → Graph /me |
| Elicitations | ./scripts/test-elicitation.shelicitations.html |
agentgateway-elicit NodePort /github-elicitUI /age/elicitations/ |
Runtime OAuth handshake; dedicated STS path (not OBO) |
| Demo | Script / page | Endpoint | Proves |
|---|---|---|---|
| Virtual MCP | ./scripts/test-virtual-mcp.shmcp-gateway.html |
:31606/mcp |
Federation: mcp-server-everything-3001_* + mcp-website-fetcher_* tools in one session (namespaced by target) |
| Virtual MCP — group RBAC | ./scripts/test-virtual-mcp-rbac.shmcp-gateway.html |
:31606/mcp-rbac |
CEL on jwt.groups filters tools/list: platform → everything + weather; sales → weather + echo only |
| MCP secure | ./scripts/test-mcp-security.shmcp-gateway.html |
:31606/mcp-secure |
Entra JWT · tool RBAC (platform/sales) · rate limit |
| Persona flip | ./scripts/entra-mcp-groups.sh set platform|sales |
— | Entra groups + Mcp.Admin / Mcp.User |
| Claude Code | ./scripts/claude-code-mcp-secure.sh |
same /mcp-secure |
Register goose-mcp-entra (project: k8s-goose) |
| Open MCP | — | :31606/mcp |
Federated demo servers (no client auth) |
| Demo | Script / page | Endpoint | Proves |
|---|---|---|---|
| Provider smokes | ./scripts/test-llm-gateways.sh allllm-gateway.html |
/openai · /grok · /spark · /anthropic · /gemini · /gpt56 |
Each provider path returns chat completion |
| P2C load balance | ./scripts/test-llm-lb-failover.sh lb#lb-failover |
:30160/llm-lb |
OpenAI gpt-5.5 + xAI grok in one priority group |
| Model failover | ./scripts/test-llm-lb-failover.sh failover… failover-force |
:30160/llm-failover |
Priority: gpt-5.5 → grok → claude + health eviction |
| AWS Bedrock smoke | ./scripts/test-bedrock.sh |
/bedrock |
Claude Sonnet 4.5 via Bedrock (us-east-2) · long-term API key (bearer), not SigV4 |
| Bedrock P2C load balance | ./scripts/test-bedrock-lb.sh |
:30160/bedrock-lb |
Nova Pro + Nova Lite + Llama 3.3 70B in one group · single bearer key |
| Bedrock failover | ./scripts/test-bedrock-failover.sh… failover-force |
:30160/bedrock-failover |
Priority: Sonnet 4.5 → Nova Pro → Llama 3.3 70B + health eviction (5xx/429, 15s) |
| Budgets / VK | ./scripts/test-budget-teams.sh./scripts/test-cost-vk.shdocs/budgets.md |
/budget-demo · /vk-openai |
Token/USD limits · virtual keys · UI Within/Exceeding |
FE enterprise workshop demos on goose — Entra only, no Figma/Auth0/Okta/Keycloak.
Diagrams: docs/flows.md ·
LLM flows ·
MCP flows.
flowchart TB S[test-workshop-phases.sh] --> A[Phase A safety + APIs] S --> B[Phase B routing + token RL] S --> C[Phase C OpenAPI + composable] S --> E[Phase E Entra JWT + WAF] A --> A1[/guard-demo] A --> A2[/enrich-demo] A --> A3[stream + embeddings] B --> B1[/route-by-model] B --> B2[/token-rl] C --> C1[/openapi-mcp] C --> C2[/composable] E --> E1[/secure-openai] E --> E2[/waf-demo]
| Phase | Script | Endpoint | Proves |
|---|---|---|---|
| A | ./scripts/test-workshop-phases.sh a |
/guard-demo · /enrich-demo · stream · /embeddings |
promptGuard · enrichment · SSE · embeddings |
| B | ./scripts/test-workshop-phases.sh b |
/route-by-model · /token-rl |
body.model routing · token 429 |
| C | ./scripts/test-workshop-phases.sh c |
:31606/openapi-mcp · /composable |
OpenAPI→MCP · multi-backend tool |
| E | ./scripts/test-workshop-phases.sh e |
/secure-openai · /waf-demo |
Entra on LLM · WAF first-pass |
./scripts/test-workshop-phases.sh all
./scripts/lab-menu.sh # workshop items under LLM / MCP
Architecture, sync waves, CRDs, budget story, full endpoint table.
Impersonation vs delegation vs Entra OBO; whoami claims proof.
Providers, budgets, virtual keys, LB/failover, config browser.
JWT · tool RBAC · rate limit · Entra OBO Graph demo.
STS URL-mode OAuth, Solo UI /age/elicitations, github-elicit.
Manifests and scripts live in
sebbycorp/k8s-goose.
Site is GitHub Pages from main (CNAME → goose.maniak.ai).
After push, allow a minute for Pages to refresh.