[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6WM89T67SS4EBKYVNS2QQF5":3,"skill-same:01M6WM89T67SS4EBKYVNS2QQF5":60},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":39,"commitSha":40,"skillDirectory":41,"forksCount":42,"repositoryHtmlUrl":43,"repositoryHomepageUrl":6,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":45,"install":46,"resources":59},"01M6WM89T67SS4EBKYVNS2QQF5","smoke-test-local",null,"Reproduce WorldArchitect.AI CI smoke-test failures in a clean local environment.","jleechanorg\u002Fjleechan-skills","jleechanorg","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F221404966?v=4","01M6C1VJ99XG950X1DWPEBCBGX","01M6C1VJDK5YVDNT3362RT5WSB",6,"MIT","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fworldarchitect\u002Fskills\u002Fsmoke-test-local\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33],"test","smoke test local","smoke","smoke test","local","test local","ci","reproduce","environment","worldarchitect","clean","2026-11-10 10:12:30",false,"---\nname: smoke-test-local\ndescription: Reproduce WorldArchitect.AI CI smoke-test failures in a clean local environment.\n---\n\n# Running Smoke Tests Locally\n\n**Purpose**: Reproduce CI smoke test failures locally, especially for `mcp_smoke_test.sh` \u002F SCENARIO 7 streaming contracts.\n\n## Why tests pass locally but fail in CI\n\nGitHub Actions runners are **ephemeral** — fresh VM, empty cache on every job. The main traps:\n\n| Difference | Local | CI (GitHub Actions) |\n|---|---|---|\n| fastembed ONNX model | Cached in `\u002Ftmp\u002Ffastembed_cache\u002F` from prior runs | Not cached → download fails → classifier falls back to `MODE_CHARACTER` |\n| OS | macOS (`\u002Fvar\u002Ffolders\u002F…`) | Ubuntu Linux (`\u002Ftmp\u002F…`) |\n| Services | Real service test or an offline-only harness check | Use the current `testing_mcp\u002FAGENTS.md` contract for `testing_mcp\u002F`; mocks belong in permitted offline test directories |\n| Secrets | Existing process environment or an approved secure credential store | GitHub Secrets injected by workflow |\n\nThe `$PROJECT_ROOT\u002FDockerfile` pre-downloads the fastembed model at build time (line 12) so Cloud Run containers always have it. The CI smoke runner starts plain gunicorn — no Docker, no pre-downloaded model.\n\n---\n\n## Option 1: Nuke fastembed cache (fastest, classifier-specific)\n\nDo not run the historical `scripts\u002Fmcp_smoke_test.sh` mock invocation as\nacceptance evidence. For an offline classifier\u002Fcache check, locate a deterministic\ntest in a permitted offline test directory and follow that directory's runner\ninstructions; do not use mock mode for tests under `testing_mcp\u002F` or `testing_ui\u002F`.\nResolve the project root and follow `testing_mcp\u002FAGENTS.md` before any test whose\nentrypoint or helper lives under `testing_mcp\u002F`.\n\n---\n\n## Option 2: Reproduce the CI environment\n\nInspect the current workflow file and use its actual container image, commands,\nand test target. The former generic Docker recipe invoked a mocked `testing_mcp`\nsmoke path and is not valid acceptance evidence; do not reuse it. When the claim\nis an offline deterministic classifier\u002Fcache behavior, use an allowed offline\ntest target. For service, auth, provider, or UI claims, use the scoped\n`testing_mcp\u002FAGENTS.md` or `testing_ui\u002FCLAUDE.md` contract and preserve its real\nservice requirements.\n\n---\n\n## Option 3: `act` (run the actual workflow YAML locally)\n\n```bash\nact issue_comment -e .github\u002Ftest-events\u002Fsmoke-comment.json\n```\n\n**When to use**: Debugging the workflow YAML itself — `if:` conditions, step ordering, output passing between steps. NOT for debugging test logic (too much setup friction).\n\n**Limitations**:\n- If the workflow requires secrets, supply them only through an existing approved secure credential store or process environment supported by the tool. Never create, read, or use a `.env` file for secrets. If no supported secure input is available, use the authorized CI workflow or report this local route unavailable.\n- Use an already available `act` binary; this workflow does not authorize installing tools.\n- Pulls large runner image (~1-18GB)\n- Complex event payloads needed to hit the right trigger branch in `mcp-smoke-tests.yml`\n\n---\n\n## Historical CI failure patterns — verify before applying\n\nThe examples below preserve prior incident context; they are not current\nimplementation instructions or permission to add a mock path. Recheck the current\nsource and follow root-cause-first guidance before proposing a fix. Any mock-based\ntest located under `testing_mcp\u002F` or `testing_ui\u002F` is not valid acceptance proof;\noffline mocks belong in allowed deterministic test directories.\n\n| Symptom | Root cause | Fix |\n|---|---|---|\n| `god_streaming_contract: FAIL - god mode stream done payload missing god_mode_response` | Streaming endpoint bypasses `_load_campaign_and_continue_story` mock check → calls real Gemini API → no `god_mode_response` in response | Add `MOCK_SERVICES_MODE` short-circuit in `continue_story_streaming` (fixed in `5b2cccb79`) |\n| `CLASSIFIER: Initialization failed after 3 attempts: NO_SUCHFILE model_optimized.onnx` | fastembed model not cached; downloads to ephemeral `\u002Ftmp` | Use `FASTEMBED_CACHE_PATH=~\u002F.cache\u002Ffastembed` + pre-warm step (fixed in `ac2965ef3`) |\n| All streaming contracts: `expected at least 2 chunk events, saw 0` | Entity tracking list-vs-dict bug causes `client_error` SSE event before any chunks | `_coerce_npc_entry_to_dict` guard in `_tier_entities` |\n| Auth 401 on remote preview | Real test-account authentication is missing or invalid | Verify the dedicated test account and server logs. For `testing_mcp\u002F` runs, keep `TESTING_AUTH_BYPASS=false` and `ALLOW_TEST_AUTH_BYPASS=false`; report missing real-auth prerequisites instead of enabling bypass |\n\n---\n\n## Relevant files\n\n- `scripts\u002Fmcp_smoke_test.sh` — main orchestrator; starts local Flask server if no `MCP_SERVER_URL`\n- `.github\u002Fworkflows\u002Fmcp-smoke-tests.yml` — CI workflow; mock + fallback jobs\n- `testing_mcp\u002Ftest_smoke.py` — SCENARIO 7: streaming chunk timing contracts\n- `$PROJECT_ROOT\u002Fmocks\u002Fmock_llm_service.py` — mock LLM responses for `MOCK_SERVICES_MODE=true`\n- `$PROJECT_ROOT\u002Fintent_classifier.py` — FastEmbed classifier; `_FASTEMBED_CACHE_DIR` constant\n- `$PROJECT_ROOT\u002FDockerfile` — pre-downloads fastembed model at build time (line 12)\n- `$PROJECT_ROOT\u002Fllm_service.py:_build_mock_streaming_text` — mock response for streaming path in mock mode\n- `$PROJECT_ROOT\u002Fllm_service.py:continue_story_streaming` — streaming path; has `MOCK_SERVICES_MODE` check before provider selection\n\n## Architecture: mock mode and streaming endpoints\n\nThe non-streaming endpoint (`\u002Fapi\u002Fcampaigns\u002F\u003Cid>\u002Finteraction`) calls `world_logic._load_campaign_and_continue_story` which checks `MOCK_SERVICES_MODE` and redirects to `continue_story` (non-streaming) when true.\n\nThe streaming endpoint (`\u002Fapi\u002Fcampaigns\u002F\u003Cid>\u002Finteraction\u002Fstream`) calls `streaming_orchestrator.stream_story_with_game_state` → `llm_service.continue_story_streaming` **directly**, bypassing the `_load_campaign_and_continue_story` mock check. So `MOCK_SERVICES_MODE` must also be checked inside `continue_story_streaming`.\n","# Running Smoke Tests Locally\n\n**Purpose**: Reproduce CI smoke test failures locally, especially for `mcp_smoke_test.sh` \u002F SCENARIO 7 streaming contracts.\n\n## Why tests pass locally but fail in CI\n\nGitHub Actions runners are **ephemeral** — fresh VM, empty cache on every job. The main traps:\n\n| Difference | Local | CI (GitHub Actions) |\n|---|---|---|\n| fastembed ONNX model | Cached in `\u002Ftmp\u002Ffastembed_cache\u002F` from prior runs | Not cached → download fails → classifier falls back to `MODE_CHARACTER` |\n| OS | macOS (`\u002Fvar\u002Ffolders\u002F…`) | Ubuntu Linux (`\u002Ftmp\u002F…`) |\n| Services | Real service test or an offline-only harness check | Use the current `testing_mcp\u002FAGENTS.md` contract for `testing_mcp\u002F`; mocks belong in permitted offline test directories |\n| Secrets | Existing process environment or an approved secure credential store | GitHub Secrets injected by workflow |\n\nThe `$PROJECT_ROOT\u002FDockerfile` pre-downloads the fastembed model at build time (line 12) so Cloud Run containers always have it. The CI smoke runner starts plain gunicorn — no Docker, no pre-downloaded model.\n\n---\n\n## Option 1: Nuke fastembed cache (fastest, classifier-specific)\n\nDo not run the historical `scripts\u002Fmcp_smoke_test.sh` mock invocation as\nacceptance evidence. For an offline classifier\u002Fcache check, locate a deterministic\ntest in a permitted offline test directory and follow that directory's runner\ninstructions; do not use mock mode for tests under `testing_mcp\u002F` or `testing_ui\u002F`.\nResolve the project root and follow `testing_mcp\u002FAGENTS.md` before any test whose\nentrypoint or helper lives under `testing_mcp\u002F`.\n\n---\n\n## Option 2: Reproduce the CI environment\n\nInspect the current workflow file and use its actual container image, commands,\nand test target. The former generic Docker recipe invoked a mocked `testing_mcp`\nsmoke path and is not valid acceptance evidence; do not reuse it. When the claim\nis an offline deterministic classifier\u002Fcache behavior, use an allowed offline\ntest target. For service, auth, provider, or UI claims, use the scoped\n`testing_mcp\u002FAGENTS.md` or `testing_ui\u002FCLAUDE.md` contract and preserve its real\nservice requirements.\n\n---\n\n## Option 3: `act` (run the actual workflow YAML locally)\n\n```bash\nact issue_comment -e .github\u002Ftest-events\u002Fsmoke-comment.json\n```\n\n**When to use**: Debugging the workflow YAML itself — `if:` conditions, step ordering, output passing between steps. NOT for debugging test logic (too much setup friction).\n\n**Limitations**:\n- If the workflow requires secrets, supply them only through an existing approved secure credential store or process environment supported by the tool. Never create, read, or use a `.env` file for secrets. If no supported secure input is available, use the authorized CI workflow or report this local route unavailable.\n- Use an already available `act` binary; this workflow does not authorize installing tools.\n- Pulls large runner image (~1-18GB)\n- Complex event payloads needed to hit the right trigger branch in `mcp-smoke-tests.yml`\n\n---\n\n## Historical CI failure patterns — verify before applying\n\nThe examples below preserve prior incident context; they are not current\nimplementation instructions or permission to add a mock path. Recheck the current\nsource and follow root-cause-first guidance before proposing a fix. Any mock-based\ntest located under `testing_mcp\u002F` or `testing_ui\u002F` is not valid acceptance proof;\noffline mocks belong in allowed deterministic test directories.\n\n| Symptom | Root cause | Fix |\n|---|---|---|\n| `god_streaming_contract: FAIL - god mode stream done payload missing god_mode_response` | Streaming endpoint bypasses `_load_campaign_and_continue_story` mock check → calls real Gemini API → no `god_mode_response` in response | Add `MOCK_SERVICES_MODE` short-circuit in `continue_story_streaming` (fixed in `5b2cccb79`) |\n| `CLASSIFIER: Initialization failed after 3 attempts: NO_SUCHFILE model_optimized.onnx` | fastembed model not cached; downloads to ephemeral `\u002Ftmp` | Use `FASTEMBED_CACHE_PATH=~\u002F.cache\u002Ffastembed` + pre-warm step (fixed in `ac2965ef3`) |\n| All streaming contracts: `expected at least 2 chunk events, saw 0` | Entity tracking list-vs-dict bug causes `client_error` SSE event before any chunks | `_coerce_npc_entry_to_dict` guard in `_tier_entities` |\n| Auth 401 on remote preview | Real test-account authentication is missing or invalid | Verify the dedicated test account and server logs. For `testing_mcp\u002F` runs, keep `TESTING_AUTH_BYPASS=false` and `ALLOW_TEST_AUTH_BYPASS=false`; report missing real-auth prerequisites instead of enabling bypass |\n\n---\n\n## Relevant files\n\n- `scripts\u002Fmcp_smoke_test.sh` — main orchestrator; starts local Flask server if no `MCP_SERVER_URL`\n- `.github\u002Fworkflows\u002Fmcp-smoke-tests.yml` — CI workflow; mock + fallback jobs\n- `testing_mcp\u002Ftest_smoke.py` — SCENARIO 7: streaming chunk timing contracts\n- `$PROJECT_ROOT\u002Fmocks\u002Fmock_llm_service.py` — mock LLM responses for `MOCK_SERVICES_MODE=true`\n- `$PROJECT_ROOT\u002Fintent_classifier.py` — FastEmbed classifier; `_FASTEMBED_CACHE_DIR` constant\n- `$PROJECT_ROOT\u002FDockerfile` — pre-downloads fastembed model at build time (line 12)\n- `$PROJECT_ROOT\u002Fllm_service.py:_build_mock_streaming_text` — mock response for streaming path in mock mode\n- `$PROJECT_ROOT\u002Fllm_service.py:continue_story_streaming` — streaming path; has `MOCK_SERVICES_MODE` check before provider selection\n\n## Architecture: mock mode and streaming endpoints\n\nThe non-streaming endpoint (`\u002Fapi\u002Fcampaigns\u002F\u003Cid>\u002Finteraction`) calls `world_logic._load_campaign_and_continue_story` which checks `MOCK_SERVICES_MODE` and redirects to `continue_story` (non-streaming) when true.\n\nThe streaming endpoint (`\u002Fapi\u002Fcampaigns\u002F\u003Cid>\u002Finteraction\u002Fstream`) calls `streaming_orchestrator.stream_story_with_game_state` → `llm_service.continue_story_streaming` **directly**, bypassing the `_load_campaign_and_continue_story` mock check. So `MOCK_SERVICES_MODE` must also be checked inside `continue_story_streaming`.\n",{"name":5,"description":7},"main","8144f00ebafc4306264c63239e4b9fa42e48a90e","plugins\u002Fworldarchitect\u002Fskills\u002Fsmoke-test-local",0,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills","https:\u002F\u002Fgithub.com\u002Fjleechanorg","2026-11-11 22:19:36",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add jleechanorg\u002Fjleechan-skills --skill smoke-test-local",{"tool":52,"command":53},"bunx","bunx skills add jleechanorg\u002Fjleechan-skills --skill smoke-test-local",{"tool":55,"command":56},"pnpm","pnpm dlx skills add jleechanorg\u002Fjleechan-skills --skill smoke-test-local","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fworldarchitect\u002Fskills\u002Fsmoke-test-local\u002FSKILL.md",true,[],[61,79,101,115,129,145],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":34},"01M716Y5MTJ6GYJZ2ATXCJK8G4","instinct","Use when the user invokes \u002Finstinct or \u002Fin, or asks to \"message Instinct\", \"ask Instinct\", \"tell Instinct\", \"check Instinct\", or read replies from the configured peer assistant. iMessage first, WhatsApp Web as fallback.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Finstinct\u002FSKILL.md",[],[63,68,69,70,71,72,73,74,75,76,77,78],"user","when","replies","check","use","identity","whatsapp","gmail","read","message","ask",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":90,"publishedAt":34},"01M716Y4HF7FVVMJSA2CCVN5VF","hr","Compatibility alias for history-resume; produce the same fresh-state, provenance-aware resume briefing.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhr\u002FSKILL.md",[85],{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[81,91,92,93,94,95,96,97,98,99,100],"resume","compatibility","provenance","for","history","produce","alias","briefing","state","fresh",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":108,"publishedAt":34},"01M716Y1FFNFKFJYYKF8HQA6T8","history-resume","Resume briefing for the current repository branch or worktree using fresh state and admitted history sources.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhistory-resume\u002FSKILL.md",[107],{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},[95,91,109,110,68,111,98,112,94,113,114,99,100],"history resume","branch","analysis","repository","worktree","sources",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":34},"01M716XWXJ8EPHK4RH9T14TR85","grok","Alias for the canonical grokbot browser conversation workflow; \u002Fgrok talks to the Grok bot the same way \u002Fdot talks to Dot.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgrok\u002FSKILL.md",[],[117,122,123,124,94,125,97,126,127,128],"dot","bot","workflow","canonical","conversation","browser","grokbot",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":34},"01M70N9Q07DTE0EW5KFXMMMSJ0","codexa-bench","Compare `codexa` and normal `codex` on a fair split of comparable work by default; use `--strict` for duplicate runs of the exact same task.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcodexa-bench\u002FSKILL.md",[],[136,137,138,72,139,94,140,141,142,143,144],"codexa bench","work","split","default","duplicate","task","compare","normal","codex",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":149,"licenseFileUrl":150,"sourceHtmlUrl":151,"categories":152,"keywords":162,"publishedAt":34},"01M6C24S2X60SP8BBFGAEKPEGW","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FSKILL.md",[153,156,159],{"categoryNo":154,"categoryName":155,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":157,"categoryName":158,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":160,"categoryName":161,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000032","设计师",[163,164,165,72,166,167,168,68,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,69,187],"frontend","design","frontend design","generic","ui design","react","html","components","code","artifacts","ui","aesthetics","Production","web components","landing","applications","quality","web","css","create","examples","with","react components","web ui","pages"]