con un clic
e2e-testing
JSON-based end-to-end test format, runner, and mock provider
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
JSON-based end-to-end test format, runner, and mock provider
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
Automated quality check loops with escalation and fix sub-agents
Jujutsu (jj) skill for the ikigai project
How to write effective Ralph goals for Ikigai-driven workflows
Create and manage Ralph goals from Ikigai using the real ralph-pipeline scripts
Create repositories using the real ralph-pipeline repo-create script
Overview of the Ralph services and how they fit together in an Ikigai context
| name | e2e-testing |
| description | JSON-based end-to-end test format, runner, and mock provider |
End-to-end tests verify ikigai behavior through its control socket. For ikigai-ctl usage, see /load ikigai-ctl. For general headless interaction, see /load headless.
Tests live in tests/e2e/ as self-contained JSON files. Run order is defined by tests/e2e/index.json — a JSON array of test filenames in execution order.
| Mode | Backend | Steps | Assertions |
|---|---|---|---|
| mock | bin/mock-provider | all steps including mock_expect | assert + assert_mock |
| live | real provider (Anthropic, OpenAI, Google) | mock_expect steps skipped | assert only |
Tests are written once and run in either mode. In live mode, mock_expect steps are skipped and assert_mock is not evaluated.
{
"name": "human-readable test name",
"steps": [ ... ],
"assert": [ ... ],
"assert_mock": [ ... ]
}
name — describes what the test verifiessteps — ordered list of actions to executeassert — assertions checked in ALL modesassert_mock — assertions checked only in mock modesend_keys{"send_keys": "/model gpt-5-mini\\r"}
Include \\r to submit. See /load ikigai-ctl for escaping conventions.
read_framebuffer{"read_framebuffer": true}
Always read_framebuffer before asserting. Each capture replaces the previous one.
wait{"wait": 0.5}
/model, /clear): 0.5 secondswait_idle)wait_idleWait until the agent becomes idle or timeout elapses.
{"wait_idle": 10000}
timeout_ms (integer milliseconds)wait after sending prompts to the LLMmock_expectConfigure the mock provider's response queue. Skipped in live mode.
{"mock_expect": {"responses": [{"content": "The capital of France is Paris."}]}}
The responses array is a FIFO queue — each LLM request pops the next entry. Entries contain either content (text) or tool_calls (array), never both. Must appear before the send_keys that triggers the LLM call.
Assertions run against the most recent read_framebuffer capture.
containsAt least one row contains the given substring.
{"contains": "gpt-5-mini"}
not_containsNo row contains the given substring.
{"not_contains": "error"}
line_prefixAt least one row starts with the given prefix (after trimming leading whitespace).
{"line_prefix": "●"}
Direct execution, one tool call per step. Never use scripts or programmatic wrappers when the user asks you to run e2e tests. The scripted runner (tests/e2e/runner) exists for CI — when the user asks you to run tests, they want direct execution so they can observe every response.
mock-provider, live otherwisesend_keys: run ikigai-ctl send_keys "<value>"wait: sleep Nwait_idle: run ikigai-ctl wait_idle <value>, fail if exit code is 1read_framebuffer: run ikigai-ctl read_framebuffer, store resultmock_expect: in mock mode, curl -s 127.0.0.1:<port>/_mock/expect -d '<json>'; in live mode, skipassert always, assert_mock in mock mode only)Divide into chunks of 20, run sub-agents serially (shared instance — never parallel). Each sub-agent receives filenames and the full contents of this skill. Don't pre-read test files yourself.
read_framebuffer in a separate tool call{
"name": "no model indicator on fresh start",
"steps": [
{"read_framebuffer": true}
],
"assert": [
{"contains": "(no model)"}
]
}
{
"name": "basic chat completion via mock provider",
"steps": [
{"mock_expect": {"responses": [{"content": "The capital of France is Paris."}]}},
{"send_keys": "What is the capital of France?\\r"},
{"wait": 3},
{"read_framebuffer": true}
],
"assert": [
{"line_prefix": "●"}
],
"assert_mock": [
{"contains": "The capital of France is Paris."}
]
}