Skip to main content

tce-examples

Create or extend tabbed code examples (TCEs) — the multi-language code blocks rendered by the clients-example shortcode. Use when a docs page needs client examples added, when auditing a command page for missing client coverage, when an example set needs a new step, or when a client needs backfilling into an existing set. Covers audit, parallel generation across clients, live testing, and Codex review.

Source facts

Repository
redis/docs
Last source activity
August 28, 2026 at 08:42
Detected SKILL.md language
English
Stars
85
Forks
368

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
36 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
tce-examples
description
Create or extend tabbed code examples (TCEs) — the multi-language code blocks rendered by the clients-example shortcode. Use when a docs page needs client examples added, when auditing a command page for missing client coverage, when an example set needs a new step, or when a client needs backfilling into an existing set. Covers audit, parallel generation across clients, live testing, and Codex review.
# Tabbed code examples (TCEs) Take a docs page that demonstrates Redis commands and produce working, tested examples for every supported client library, wired into the page with the `clients-example` shortcode. This is **AI-in-the-loop work.** The parsing is mechanical and already scripted (Phase 0); the code generation is not. Each client has real API differences, real return-shape differences, and real idioms — that judgment is yours. What the reference files give you is the durable facts, so you don't re-derive (or misremember) them. ## The client table **`build/example-test-harness/clients.tsv` is the single source of truth for client identity** — display names, component ids, API-mapping keys, `local_examples` directory aliases, filename conventions, and where each client is testable. Read it before you touch anything: ```bash column -t -s$'\t' build/example-test-harness/clients.tsv ``` Do not restate its contents in prose, in a brief, or in another table. The five duplicated client tables in the skill this replaced had all drifted from `config.toml`; that is the failure mode this file exists to prevent. ## Three file locations, one lifecycle An example lives in up to three places, and **which one you read from matters**: | Location | Role | Notes | |---|---|---| | `local_examples/<set>/<client>/` | **Staging** — tested, pending upstream merge | Usually the *most complete* version. Has steps the client repo doesn't. | | Client repo (`repo_path` in clients.tsv) | **Source of truth** — merged upstream | What the site build actually fetches. | | `tmp/clients/examples/<client>/` | **Test bed** — gitignored, transient | Where files get staged to run. Never author here. | > **Read `local_examples/` first.** If the file exists there it supersedes the client repo copy. > Starting from the client repo — or from a blank file — silently drops the pending steps. This > is the single most common way TCE work goes wrong. ## Phases Each phase has a gate. Don't skip them; the whole point of the ordering is that a mistake in Phase 1 gets multiplied by every agent in Phase 2. ### Phase 0 — Audit ```bash python3 .claude/skills/tce-examples/scripts/audit_page.py content/commands/hset.md ``` Wraps the repo's existing parsers (`build/components/cli_parser.py`, `build/components/markdown_parser.py`) so the four CLI source formats and the `> ` / `redis> ` / `127.0.0.1:6379> ` prompt handling stay correct without being restated here. Emits a human table plus `--json` for a machine-readable work plan: per CLI block, the source format, line range, commands, `set`/`step` if already wired, existing coverage from `data/examples.json`, and which clients are missing. **Gate:** you can name the set id, the step names, and the exact client list before writing code. ### Phase 1 — Reference implementation Write **one** client by hand — default `redis-py`, because Python surfaces design decisions most plainly. Test it (Phase 3 for that client alone). This fixes the step names, the command sequence, and the expected-output comments that every other client must match. **Gate: show the user the reference before Phase 2.** Its conventions propagate to a dozen parallel agents; a wrong step name here costs a dozen retrofits. ### Phase 2 — Parallel fan-out Spawn one subagent per remaining client, **all in a single message** so they run concurrently. Fill in `assets/brief-template.md` per agent. Each brief must carry: - The reference implementation file, and the step names as a closed list. - The client's row from `clients.tsv` (target path, filename, aliases). - The relevant `data/command-api-mapping/<COMMAND>.json` entries — the real signatures. Do not let an agent guess a method name. - The client's `assets/<assets>/*_TEST_PATTERNS.md` **and** its working sample. - **The most complete existing version of the file**, per the lifecycle table above, with an explicit instruction to extend rather than replace. - For C#: which flavor. See "The two C# clients" below — this is not optional context. Each agent returns `assets/report-template.md`. Read all of them before Phase 3: repeated questions mean the brief was ambiguous, and identical divergences across agents usually mean a convention is missing rather than that a dozen agents each erred. ### Phase 3 — Test ```bash redis-server --daemonize yes # scratch instance; the harness FLUSHes it build/example-test-harness/run.sh --fidelity cmds_hash ``` See `reference/testing.md` for both environments, what each client needs, and the known traps. **Gate:** every client PASS, or SKIP with a stated reason. A silent SKIP is a failure. ### Phase 4 — Codex review An independent reviewer with fresh context, invoked per client in parallel. Catches the class the harness structurally cannot: tests that pass while the expected-output comments are wrong, step names that drifted, an API the docs shouldn't showcase, scaffolding that leaks into the rendered page. Invocation and schema in `reference/testing.md`. **Gate:** no unresolved `severity: high`. ### Phase 5 — Retrofit Fix, then re-run Phases 3–4 for touched clients only. > **Verify each finding against the current file before editing it.** Reviewers work from a > snapshot; a parallel agent may have already fixed the thing being reported. `grep` for the > described pattern first — a one-second check that prevents reverting a good fix. ### Phase 6 — Wire into the docs 1. Place files at `local_examples/<set>/<client>/<filename>` per `clients.tsv`. 2. Add or update the shortcode. Use **named** parameters: `set`, `step`, `description`, `difficulty`, `buildsUpon`. The guidance in `for-ais-only/tcedocs/README.md` on writing descriptions and choosing difficulty is current and good — follow it there rather than guessing. 3. Rebuild and confirm the steps landed: ```bash python3 build/make.py jq '.<set> | keys' data/examples.json ``` **Gate:** `hugo serve`, open the page, confirm the right tabs appear, the correct step is highlighted, and no `REMOVE`/`HIDE` scaffolding is visible. ## Using the samples as templates Each `assets/<client>/sample_*` file is a **working, runnable** example — that's the point, it gives you a compilable starting shape. Two rules when working from one: 1. **Never copy the banner comment.** Each sample opens with a ~18-line header explaining the markers. Comment lines that are not inside a `HIDE` or `REMOVE` block are **published verbatim** into the rendered docs. A real example starts directly with `// EXAMPLE: <name>` on line 1, optionally `BINDER_ID` on line 2. 2. **Take the structure, not the step list.** Samples deliberately demonstrate several unrelated steps to show the range of patterns. A generated example normally covers one command page. Always read the matching `*_TEST_PATTERNS.md` alongside the sample — it carries the per-client traps (surefire include rules, Rust file placement, PHP test-base class, C# fixture API). ## Markers `EXAMPLE:`, `BINDER_ID`, `HIDE_START`/`HIDE_END`, `REMOVE_START`/`REMOVE_END`, `STEP_START <name>`/`STEP_END`. Full semantics — including what each does to the rendered output — are specified in `for-ais-only/tcedocs/SPECIFICATION.md`; read it there rather than working from memory. The structural pattern: ``` EXAMPLE marker → HIDE: imports + connection → REMOVE: pre-test cleanup → STEP: the example code, with `>>>` output comments → REMOVE: assertions → REMOVE: post-test cleanup → HIDE: disconnect ``` **Step naming:** one example per command page → the command name (`hmget`). Multiple → numbered (`scan1`, `scan2`). Lowercase, concise, and **identical across every client in the set**. ## The two C# clients `C#-Sync (NRedisStack)` and `C#-Sync (SE.Redis)` are not two codebases. Both are fed from the same `NRedisStack` repo directory, partitioned by a content filter in `data/components/`: - imports `using NRedisStack` → the **NRedisStack** tabs - does **not** import it → the **SE.Redis** tabs - `using NRedisStack.Tests` is excluded from that test — every file has it for fixtures So a single `.cs` file feeds one tab or the other, never both, and the deciding factor is an import line. Most command-page C# examples are SE.Redis-flavored, because plain hash/list/string commands don't need NRedisStack. Both flavors carry identical test scaffolding, so this is a **generation** distinction, not a testing one — the same runner handles both. Getting the flavor wrong puts a working, passing example in the wrong tab. Say which flavor you want in the brief, and check it in review. ## Validation checklist - [ ] Every client in the Phase 0 work plan implemented (not "all 12" — read `clients.tsv`) - [ ] Method signatures taken from `data/command-api-mapping/`, not guessed - [ ] Step names identical across clients, and matching the reference - [ ] Pre-existing steps preserved, not overwritten - [ ] Markers placed so no scaffolding or banner text reaches the rendered page - [ ] Expected-output comments (`>>>`) match what the client actually returns - [ ] Assertions and cleanup inside `REMOVE` blocks - [ ] Test keys deleted both before and after - [ ] C# files carry the intended flavor ## Guardrails - **Don't invent method names.** If `data/command-api-mapping/` lacks the command for a client, read the client source (see `.claude/skills/command-api-mapping/` for how) or omit that client and say so — don't guess a plausible signature. - **Don't add a client that doesn't support the command.** An empty or wrong tab is worse than an absent one. - **Don't edit `data/examples.json`.** It's generated by `build/make.py`. - **Don't author in `tmp/clients/`.** It's gitignored and transient; work lands in `local_examples/`.
View on GitHub