بنقرة واحدة
e2e-testing
JSON-based end-to-end test format, runner, and mock provider
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
JSON-based end-to-end test format, runner, and mock provider
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف 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."}
]
}