@tencent-rtc/trtc-agent-skills 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/.cursor/rules/main.mdc +12 -0
  2. package/AGENTS.md +14 -104
  3. package/CLAUDE.md +15 -127
  4. package/CODEBUDDY.md +32 -118
  5. package/README.md +7 -5
  6. package/README.zh.md +7 -5
  7. package/bin/cli.js +133 -41
  8. package/hooks/__pycache__/cursor-adapter.cpython-313.pyc +0 -0
  9. package/hooks/cursor-adapter.py +45 -18
  10. package/hooks/hooks-cursor.json +5 -18
  11. package/hooks/hooks.json +6 -31
  12. package/knowledge-base/conference/web/index.yaml +143 -0
  13. package/knowledge-base/platform-slice-template.md +1041 -133
  14. package/knowledge-base/products.yaml +76 -0
  15. package/knowledge-base/scenario-spec.md +1316 -115
  16. package/knowledge-base/scenarios/conference/base/general-conference.md +22 -2
  17. package/knowledge-base/scenarios/conference/base/webinar-conference.md +14 -0
  18. package/knowledge-base/scenarios/conference/medical/1v1-video-consultation.md +19 -0
  19. package/knowledge-base/scenarios/conference/medical/medical-multidoctor-consultation.md +13 -0
  20. package/knowledge-base/scenarios/live/entertainment-live-room.md +12 -0
  21. package/knowledge-base/slice-spec.md +2377 -299
  22. package/knowledge-base/slices/conference/web/integration-audit.md +1 -1
  23. package/knowledge-base/slices/conference/web/login-auth.md +14 -1
  24. package/knowledge-base/tooling/aliases.yaml +92 -0
  25. package/knowledge-base/tooling/intent-signals.yaml +181 -0
  26. package/knowledge-base/tooling/symptom-keywords.yaml +21 -0
  27. package/package.json +1 -1
  28. package/skills/trtc/SKILL.md +202 -245
  29. package/skills/trtc/hooks/__pycache__/report_prompt.cpython-313.pyc +0 -0
  30. package/skills/{trtc-topic/guardrails → trtc/hooks}/gate_slice_read.py +12 -8
  31. package/skills/{trtc-topic/guardrails → trtc/hooks}/gate_slice_write.py +16 -12
  32. package/skills/{trtc-topic/guardrails → trtc/hooks}/stop_require_apply_evidence.py +22 -14
  33. package/skills/trtc/hooks/topic_phase_gate.py +161 -0
  34. package/skills/{trtc-topic → trtc}/runtime/README.md +2 -2
  35. package/skills/{trtc-onboarding/reference/reporting-protocol.md → trtc/runtime/REPORTING.md} +5 -5
  36. package/skills/{trtc-topic → trtc}/runtime/RUNTIME.md +5 -5
  37. package/skills/trtc/runtime/lib/__init__.py +0 -0
  38. package/skills/{trtc-topic → trtc}/runtime/package-lock.json +2 -2
  39. package/skills/{trtc-topic → trtc}/runtime/package.json +2 -2
  40. package/skills/{trtc-topic → trtc}/runtime/telemetry-bridge.mjs +1 -1
  41. package/skills/{trtc-topic/scripts → trtc/tools}/STATE-MACHINE-GUIDE.md +23 -23
  42. package/skills/trtc/tools/__init__.py +2 -0
  43. package/skills/trtc/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  44. package/skills/trtc/tools/__pycache__/query_classifier.cpython-313.pyc +0 -0
  45. package/skills/trtc/tools/__pycache__/reporting.cpython-313.pyc +0 -0
  46. package/skills/trtc/tools/__pycache__/search.cpython-313.pyc +0 -0
  47. package/skills/trtc/tools/__pycache__/session.cpython-313.pyc +0 -0
  48. package/skills/trtc/tools/apply.py +540 -0
  49. package/skills/trtc/tools/docs.py +712 -0
  50. package/skills/trtc/tools/docsbot.py +182 -0
  51. package/skills/trtc/tools/entry/render_ai_instructions.py +92 -0
  52. package/skills/trtc/tools/flow.py +1089 -0
  53. package/skills/{trtc-topic/scripts → trtc/tools}/init_slice_queue.py +5 -4
  54. package/skills/{trtc-topic/scripts → trtc/tools}/next_slice.py +5 -4
  55. package/skills/trtc/tools/query_classifier.py +301 -0
  56. package/skills/trtc/tools/reporting.py +447 -0
  57. package/skills/trtc/tools/search.py +817 -0
  58. package/skills/trtc/tools/session.py +1261 -0
  59. package/skills/trtc/tools/state_machine.py +690 -0
  60. package/skills/trtc-ai-service/README.md +195 -0
  61. package/skills/trtc-ai-service/README.zh-CN.md +193 -0
  62. package/skills/trtc-ai-service/SKILL.md +945 -0
  63. package/skills/trtc-ai-service/auto_adapters/README.md +40 -0
  64. package/skills/trtc-ai-service/auto_adapters/frontend-spa/README.md +27 -0
  65. package/skills/trtc-ai-service/auto_adapters/frontend-spa/angular/voice-agent.component.ts.tpl +131 -0
  66. package/skills/trtc-ai-service/auto_adapters/frontend-spa/manifest.yaml +57 -0
  67. package/skills/trtc-ai-service/auto_adapters/frontend-spa/react/VoiceAgent.tsx.tpl +142 -0
  68. package/skills/trtc-ai-service/auto_adapters/frontend-spa/vue/VoiceAgent.vue.tpl +121 -0
  69. package/skills/trtc-ai-service/auto_adapters/integration_templates/generic-backend.md +45 -0
  70. package/skills/trtc-ai-service/auto_adapters/integration_templates/generic-frontend.md +51 -0
  71. package/skills/trtc-ai-service/auto_adapters/integration_templates/generic-rest-api.md +93 -0
  72. package/skills/trtc-ai-service/auto_adapters/java-backend/README.md +25 -0
  73. package/skills/trtc-ai-service/auto_adapters/java-backend/manifest.yaml +30 -0
  74. package/skills/trtc-ai-service/auto_adapters/java-backend/quarkus/VoiceAgentFilter.java.tpl +64 -0
  75. package/skills/trtc-ai-service/auto_adapters/java-backend/springboot/VoiceAgentFilter.java.tpl +91 -0
  76. package/skills/trtc-ai-service/auto_adapters/manifest.yaml +43 -0
  77. package/skills/trtc-ai-service/auto_adapters/node-backend/README.md +25 -0
  78. package/skills/trtc-ai-service/auto_adapters/node-backend/express.js.tpl +40 -0
  79. package/skills/trtc-ai-service/auto_adapters/node-backend/fastify.js.tpl +27 -0
  80. package/skills/trtc-ai-service/auto_adapters/node-backend/koa.js.tpl +31 -0
  81. package/skills/trtc-ai-service/auto_adapters/node-backend/manifest.yaml +47 -0
  82. package/skills/trtc-ai-service/auto_adapters/python-backend/README.md +22 -0
  83. package/skills/trtc-ai-service/auto_adapters/python-backend/django.py.tpl +32 -0
  84. package/skills/trtc-ai-service/auto_adapters/python-backend/fastapi.py.tpl +35 -0
  85. package/skills/trtc-ai-service/auto_adapters/python-backend/flask.py.tpl +31 -0
  86. package/skills/trtc-ai-service/auto_adapters/python-backend/manifest.yaml +45 -0
  87. package/skills/trtc-ai-service/capabilities/__init__.py +43 -0
  88. package/skills/trtc-ai-service/capabilities/conversation-core/.env.example +29 -0
  89. package/skills/trtc-ai-service/capabilities/conversation-core/INTEGRATION.md +134 -0
  90. package/skills/trtc-ai-service/capabilities/conversation-core/INTERFACE_ADAPT.md +111 -0
  91. package/skills/trtc-ai-service/capabilities/conversation-core/QUICK_START.md +62 -0
  92. package/skills/trtc-ai-service/capabilities/conversation-core/manifest.yaml +250 -0
  93. package/skills/trtc-ai-service/capabilities/conversation-core/requirements.txt +6 -0
  94. package/skills/trtc-ai-service/capabilities/conversation-core/src/__init__.py +10 -0
  95. package/skills/trtc-ai-service/capabilities/conversation-core/src/_capability_loader.py +218 -0
  96. package/skills/trtc-ai-service/capabilities/conversation-core/src/agent.py +231 -0
  97. package/skills/trtc-ai-service/capabilities/conversation-core/src/credentials.py +132 -0
  98. package/skills/trtc-ai-service/capabilities/conversation-core/src/health.py +355 -0
  99. package/skills/trtc-ai-service/capabilities/conversation-core/src/log_filter.py +76 -0
  100. package/skills/trtc-ai-service/capabilities/conversation-core/src/modality.py +109 -0
  101. package/skills/trtc-ai-service/capabilities/conversation-core/src/server.py +312 -0
  102. package/skills/trtc-ai-service/capabilities/conversation-core/src/trtc_client.py +315 -0
  103. package/skills/trtc-ai-service/capabilities/conversation-core/src/usersig.py +90 -0
  104. package/skills/trtc-ai-service/capabilities/conversation-core/tests/test_skeleton.py +216 -0
  105. package/skills/trtc-ai-service/capabilities/conversation-core/web-demo/README.md +48 -0
  106. package/skills/trtc-ai-service/capabilities/conversation-core/web-demo/app.js +415 -0
  107. package/skills/trtc-ai-service/capabilities/conversation-core/web-demo/index.html +68 -0
  108. package/skills/trtc-ai-service/capabilities/conversation-core/web-demo/styles.css +136 -0
  109. package/skills/trtc-ai-service/capabilities/digital-human/README.md +31 -0
  110. package/skills/trtc-ai-service/capabilities/digital-human/manifest.yaml +64 -0
  111. package/skills/trtc-ai-service/capabilities/digital-human/src/__init__.py +2 -0
  112. package/skills/trtc-ai-service/capabilities/digital-human/src/router.py +43 -0
  113. package/skills/trtc-ai-service/capabilities/human-handoff/INTERFACE_ADAPT.md +353 -0
  114. package/skills/trtc-ai-service/capabilities/human-handoff/README.md +44 -0
  115. package/skills/trtc-ai-service/capabilities/human-handoff/manifest.yaml +227 -0
  116. package/skills/trtc-ai-service/capabilities/human-handoff/src/__init__.py +2 -0
  117. package/skills/trtc-ai-service/capabilities/human-handoff/src/adapters/__init__.py +9 -0
  118. package/skills/trtc-ai-service/capabilities/human-handoff/src/adapters/default_rest.py +242 -0
  119. package/skills/trtc-ai-service/capabilities/human-handoff/src/adapters/factory.py +89 -0
  120. package/skills/trtc-ai-service/capabilities/human-handoff/src/adapters/local_queue.py +258 -0
  121. package/skills/trtc-ai-service/capabilities/human-handoff/src/adapters/mock.py +132 -0
  122. package/skills/trtc-ai-service/capabilities/human-handoff/src/core/__init__.py +25 -0
  123. package/skills/trtc-ai-service/capabilities/human-handoff/src/core/intent_detector.py +75 -0
  124. package/skills/trtc-ai-service/capabilities/human-handoff/src/core/models.py +163 -0
  125. package/skills/trtc-ai-service/capabilities/human-handoff/src/core/service.py +192 -0
  126. package/skills/trtc-ai-service/capabilities/human-handoff/src/feedback_store.py +54 -0
  127. package/skills/trtc-ai-service/capabilities/human-handoff/src/ports/__init__.py +4 -0
  128. package/skills/trtc-ai-service/capabilities/human-handoff/src/ports/handoff_client.py +86 -0
  129. package/skills/trtc-ai-service/capabilities/human-handoff/src/queue.py +62 -0
  130. package/skills/trtc-ai-service/capabilities/human-handoff/src/router.py +201 -0
  131. package/skills/trtc-ai-service/capabilities/human-handoff/src/summary_link.py +77 -0
  132. package/skills/trtc-ai-service/capabilities/human-handoff/src/trigger.py +25 -0
  133. package/skills/trtc-ai-service/capabilities/knowledge-base/INTERFACE_ADAPT.md +297 -0
  134. package/skills/trtc-ai-service/capabilities/knowledge-base/README.md +51 -0
  135. package/skills/trtc-ai-service/capabilities/knowledge-base/data/faq.json +20 -0
  136. package/skills/trtc-ai-service/capabilities/knowledge-base/manifest.yaml +211 -0
  137. package/skills/trtc-ai-service/capabilities/knowledge-base/src/__init__.py +8 -0
  138. package/skills/trtc-ai-service/capabilities/knowledge-base/src/adapters/__init__.py +9 -0
  139. package/skills/trtc-ai-service/capabilities/knowledge-base/src/adapters/default_rest.py +209 -0
  140. package/skills/trtc-ai-service/capabilities/knowledge-base/src/adapters/factory.py +86 -0
  141. package/skills/trtc-ai-service/capabilities/knowledge-base/src/adapters/local_json.py +172 -0
  142. package/skills/trtc-ai-service/capabilities/knowledge-base/src/adapters/mock.py +91 -0
  143. package/skills/trtc-ai-service/capabilities/knowledge-base/src/core/__init__.py +12 -0
  144. package/skills/trtc-ai-service/capabilities/knowledge-base/src/core/models.py +77 -0
  145. package/skills/trtc-ai-service/capabilities/knowledge-base/src/core/scoring.py +73 -0
  146. package/skills/trtc-ai-service/capabilities/knowledge-base/src/core/service.py +78 -0
  147. package/skills/trtc-ai-service/capabilities/knowledge-base/src/ports/__init__.py +4 -0
  148. package/skills/trtc-ai-service/capabilities/knowledge-base/src/ports/kb_client.py +61 -0
  149. package/skills/trtc-ai-service/capabilities/knowledge-base/src/retriever.py +56 -0
  150. package/skills/trtc-ai-service/capabilities/knowledge-base/src/router.py +85 -0
  151. package/skills/trtc-ai-service/capabilities/session-summary/INTERFACE_ADAPT.md +99 -0
  152. package/skills/trtc-ai-service/capabilities/session-summary/README.md +47 -0
  153. package/skills/trtc-ai-service/capabilities/session-summary/data/test_session.json +18 -0
  154. package/skills/trtc-ai-service/capabilities/session-summary/manifest.yaml +165 -0
  155. package/skills/trtc-ai-service/capabilities/session-summary/src/__init__.py +2 -0
  156. package/skills/trtc-ai-service/capabilities/session-summary/src/adapters/__init__.py +5 -0
  157. package/skills/trtc-ai-service/capabilities/session-summary/src/adapters/base.py +31 -0
  158. package/skills/trtc-ai-service/capabilities/session-summary/src/adapters/default_rest.py +67 -0
  159. package/skills/trtc-ai-service/capabilities/session-summary/src/adapters/factory.py +51 -0
  160. package/skills/trtc-ai-service/capabilities/session-summary/src/adapters/local_json.py +42 -0
  161. package/skills/trtc-ai-service/capabilities/session-summary/src/adapters/mock.py +22 -0
  162. package/skills/trtc-ai-service/capabilities/session-summary/src/recorder.py +210 -0
  163. package/skills/trtc-ai-service/capabilities/session-summary/src/router.py +93 -0
  164. package/skills/trtc-ai-service/capabilities/session-summary/src/summarizer.py +163 -0
  165. package/skills/trtc-ai-service/capabilities/tool-calling/INTERFACE_ADAPT.md +158 -0
  166. package/skills/trtc-ai-service/capabilities/tool-calling/README.md +50 -0
  167. package/skills/trtc-ai-service/capabilities/tool-calling/data/tools.yaml +58 -0
  168. package/skills/trtc-ai-service/capabilities/tool-calling/examples/__init__.py +1 -0
  169. package/skills/trtc-ai-service/capabilities/tool-calling/examples/local_tools.py +101 -0
  170. package/skills/trtc-ai-service/capabilities/tool-calling/manifest.yaml +146 -0
  171. package/skills/trtc-ai-service/capabilities/tool-calling/src/__init__.py +8 -0
  172. package/skills/trtc-ai-service/capabilities/tool-calling/src/dispatcher.py +54 -0
  173. package/skills/trtc-ai-service/capabilities/tool-calling/src/registry.py +219 -0
  174. package/skills/trtc-ai-service/capabilities/tool-calling/src/router.py +50 -0
  175. package/skills/trtc-ai-service/references/business-contract-spec.md +263 -0
  176. package/skills/trtc-ai-service/scenarios/custom-builder/README.md +86 -0
  177. package/skills/trtc-ai-service/scenarios/custom-builder/output-templates/recipe.yaml.j2 +194 -0
  178. package/skills/trtc-ai-service/scenarios/custom-builder/prompts/q1-business-scenario.md +43 -0
  179. package/skills/trtc-ai-service/scenarios/custom-builder/prompts/q2-io-modality.md +57 -0
  180. package/skills/trtc-ai-service/scenarios/custom-builder/prompts/q3-ui-form.md +55 -0
  181. package/skills/trtc-ai-service/scenarios/custom-builder/prompts/q4-capabilities.md +78 -0
  182. package/skills/trtc-ai-service/scenarios/customer-service/README.md +114 -0
  183. package/skills/trtc-ai-service/scenarios/customer-service/recipe.yaml +154 -0
  184. package/skills/trtc-ai-service/scenarios/customer-service/sample-data/README.md +32 -0
  185. package/skills/trtc-ai-service/scenarios/customer-service/sample-data/faq-sample.json +37 -0
  186. package/skills/trtc-ai-service/scenarios/customer-service/system-prompt.template.md +94 -0
  187. package/skills/trtc-ai-service/scenarios/customer-service/ui/admin-board/app.js +347 -0
  188. package/skills/trtc-ai-service/scenarios/customer-service/ui/admin-board/index.html +125 -0
  189. package/skills/trtc-ai-service/scenarios/customer-service/ui/admin-board/styles.css +487 -0
  190. package/skills/trtc-ai-service/scenarios/customer-service/ui/admin-board/tokens.css +71 -0
  191. package/skills/trtc-ai-service/scenarios/customer-service/ui/design-system/DESIGN_GUIDELINES.md +370 -0
  192. package/skills/trtc-ai-service/scenarios/customer-service/ui/voice-customer-service/README.md +68 -0
  193. package/skills/trtc-ai-service/scenarios/customer-service/ui/voice-customer-service/app.js +1307 -0
  194. package/skills/trtc-ai-service/scenarios/customer-service/ui/voice-customer-service/data.js +40 -0
  195. package/skills/trtc-ai-service/scenarios/customer-service/ui/voice-customer-service/index.html +233 -0
  196. package/skills/trtc-ai-service/scenarios/customer-service/ui/voice-customer-service/mock-shop.json +21 -0
  197. package/skills/trtc-ai-service/scenarios/customer-service/ui/voice-customer-service/styles.css +603 -0
  198. package/skills/trtc-ai-service/scenarios/customer-service/ui/voice-customer-service/tokens.css +71 -0
  199. package/skills/trtc-ai-service/scenarios/customer-service/ui/widget-floating/agent-link.js +323 -0
  200. package/skills/trtc-ai-service/scenarios/customer-service/ui/widget-floating/app.js +458 -0
  201. package/skills/trtc-ai-service/scenarios/customer-service/ui/widget-floating/index.html +109 -0
  202. package/skills/trtc-ai-service/scenarios/customer-service/ui/widget-floating/styles.css +489 -0
  203. package/skills/trtc-ai-service/scenarios/customer-service/ui/widget-floating/tokens.css +59 -0
  204. package/skills/trtc-ai-service/scripts/add-capability.py +364 -0
  205. package/skills/trtc-ai-service/scripts/contract-adapt.py +334 -0
  206. package/skills/trtc-ai-service/scripts/detect-stack.py +40 -0
  207. package/skills/trtc-ai-service/scripts/lib/__init__.py +20 -0
  208. package/skills/trtc-ai-service/scripts/lib/adapter_codegen.py +509 -0
  209. package/skills/trtc-ai-service/scripts/lib/arbitrator.py +152 -0
  210. package/skills/trtc-ai-service/scripts/lib/contract_resolver.py +519 -0
  211. package/skills/trtc-ai-service/scripts/lib/credential_validators.py +253 -0
  212. package/skills/trtc-ai-service/scripts/lib/curl_parser.py +303 -0
  213. package/skills/trtc-ai-service/scripts/lib/degrader.py +140 -0
  214. package/skills/trtc-ai-service/scripts/lib/injector.py +347 -0
  215. package/skills/trtc-ai-service/scripts/lib/manifest_resolver.py +288 -0
  216. package/skills/trtc-ai-service/scripts/lib/openapi_parser.py +289 -0
  217. package/skills/trtc-ai-service/scripts/lib/stack_detector.py +159 -0
  218. package/skills/trtc-ai-service/scripts/lib/tokens_compile.py +204 -0
  219. package/skills/trtc-ai-service/scripts/post-install-patch.py +225 -0
  220. package/skills/trtc-ai-service/scripts/setup-credentials.py +393 -0
  221. package/skills/trtc-ai-service/scripts/verify-credentials.py +108 -0
  222. package/skills/trtc-ai-service/start.sh +111 -0
  223. package/skills/trtc-ai-service/tests/__init__.py +1 -0
  224. package/skills/trtc-ai-service/tests/test_arbitrator.py +64 -0
  225. package/skills/trtc-ai-service/tests/test_capability_overlay.py +85 -0
  226. package/skills/trtc-ai-service/tests/test_contract_resolver.py +190 -0
  227. package/skills/trtc-ai-service/tests/test_handoff_ports.py +195 -0
  228. package/skills/trtc-ai-service/tests/test_kb_ports.py +195 -0
  229. package/skills/trtc-ai-service/tests/test_manifest_resolver.py +95 -0
  230. package/skills/trtc-ai-service/tests/test_recipe_assembly.py +175 -0
  231. package/skills/trtc-ai-service/tests/test_stack_and_degrader.py +101 -0
  232. package/skills/trtc-ai-service/tests/test_verify_credentials.py +285 -0
  233. package/skills/trtc-ai-service/triggers.yaml +29 -0
  234. package/skills/trtc-conference/SKILL.md +324 -0
  235. package/skills/trtc-conference/flows/onboarding.md +205 -0
  236. package/skills/trtc-conference/flows/topic.md +474 -0
  237. package/skills/trtc-conference/flows/troubleshoot.md +85 -0
  238. package/skills/trtc-conference/hooks/pretooluse_require_business_decisions.py +213 -0
  239. package/skills/trtc-conference/playbooks/medical-quickstart.md +84 -0
  240. package/skills/trtc-conference/playbooks/official-roomkit.md +97 -0
  241. package/skills/trtc-conference/references/local-usersig/basic-info-config.ts +39 -0
  242. package/skills/trtc-conference/references/usersig-handling.md +134 -0
  243. package/skills/trtc-conference/templates/medical-consultation/src/config/lib-generate-test-usersig-es.min.d.ts +4 -0
  244. package/skills/trtc-conference/templates/medical-consultation/src/config/lib-generate-test-usersig-es.min.js +2 -0
  245. package/skills/trtc-conference/tests/__pycache__/test_conference_onboarding_contract.cpython-313-pytest-9.0.2.pyc +0 -0
  246. package/skills/trtc-conference/tests/__pycache__/test_conference_topic_flow_contract.cpython-313-pytest-9.0.2.pyc +0 -0
  247. package/skills/trtc-conference/tests/test_conference_index_contract.py +43 -0
  248. package/skills/trtc-conference/tests/test_conference_onboarding_contract.py +103 -0
  249. package/skills/trtc-conference/tests/test_conference_template_contract.py +25 -0
  250. package/skills/trtc-conference/tests/test_conference_topic_flow_contract.py +132 -0
  251. package/skills/trtc-conference/tools/apply_checks.py +328 -0
  252. package/skills/trtc-conference/verify_lib/__init__.py +0 -0
  253. package/skills/{trtc-apply/guardrails/apply_lib → trtc-conference/verify_lib}/rule_parser.py +1 -1
  254. package/skills/trtc-docs/SKILL.md +91 -119
  255. package/.cursor/rules/ui-mode.mdc +0 -99
  256. package/ai-instructions/base.md +0 -13
  257. package/ai-instructions/ui-mode.md +0 -93
  258. package/knowledge-base/index.yaml +0 -462
  259. package/skills/trtc/room-builder/SKILL.md +0 -133
  260. package/skills/trtc/room-builder/templates/scenarios/medical-consultation/README.md +0 -108
  261. package/skills/trtc/room-builder/tools/render_ai_instructions.py +0 -226
  262. package/skills/trtc-apply/SKILL.md +0 -97
  263. package/skills/trtc-onboarding/SKILL.md +0 -841
  264. package/skills/trtc-onboarding/reference/path-a1-demo.md +0 -103
  265. package/skills/trtc-onboarding/reference/path-a2-integrate.md +0 -737
  266. package/skills/trtc-onboarding/reference/path-b-troubleshoot.md +0 -186
  267. package/skills/trtc-onboarding/reference/path-c-expand.md +0 -43
  268. package/skills/trtc-onboarding/reference/supported-matrix.md +0 -100
  269. package/skills/trtc-search/SKILL.md +0 -228
  270. package/skills/trtc-topic/SKILL.md +0 -622
  271. package/skills/trtc-topic/scripts/apply.py +0 -581
  272. package/skills/trtc-topic/scripts/lib/state_machine.py +0 -328
  273. package/skills/trtc-topic/tests/README.md +0 -70
  274. package/skills/trtc-topic/tests/conftest.py +0 -72
  275. package/skills/trtc-topic/tests/test_apply_cli.py +0 -480
  276. package/skills/trtc-topic/tests/test_end_to_end.py +0 -305
  277. package/skills/trtc-topic/tests/test_finalize_session.py +0 -51
  278. package/skills/trtc-topic/tests/test_gates.py +0 -316
  279. package/skills/trtc-topic/tests/test_session_resolver.py +0 -260
  280. package/skills/trtc-topic/tests/test_state_machine.py +0 -414
  281. package/skills/trtc-topic/tests/test_stop_require_apply.py +0 -99
  282. package/skills/trtc-topic/tests/test_topic_skill_invariants.py +0 -130
  283. /package/skills/{trtc-topic → trtc}/runtime/lib/platforms.py +0 -0
  284. /package/skills/{trtc-topic → trtc}/runtime/telemetry_collector.py +0 -0
  285. /package/skills/{trtc-onboarding/reference → trtc/runtime}/usersig-handling.md +0 -0
  286. /package/skills/{trtc-topic/scripts → trtc/tools}/finalize_session.py +0 -0
  287. /package/skills/{trtc-apply/guardrails/apply_lib → trtc-ai-service/capabilities/conversation-core/tests}/__init__.py +0 -0
  288. /package/skills/{trtc-topic → trtc-conference}/references/execution-units.yaml +0 -0
  289. /package/skills/{trtc/room-builder/templates/scenarios/medical-consultation/src/config → trtc-conference/references/local-usersig}/lib-generate-test-usersig-es.min.d.ts +0 -0
  290. /package/skills/{trtc/room-builder/templates/scenarios/medical-consultation/src/config → trtc-conference/references/local-usersig}/lib-generate-test-usersig-es.min.js +0 -0
  291. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/docs/backend-contract.zh-CN.md +0 -0
  292. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/docs/integration.zh-CN.md +0 -0
  293. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/docs/theme.zh-CN.md +0 -0
  294. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/index.html +0 -0
  295. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/package.json +0 -0
  296. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/postcss.config.js +0 -0
  297. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/App.vue +0 -0
  298. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/ConsultationManagePanel.vue +0 -0
  299. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/LanguageSwitch.vue +0 -0
  300. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/LoadingSpinner.vue +0 -0
  301. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/MedicalAlert.vue +0 -0
  302. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/MedicalBusinessPanel.vue +0 -0
  303. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/MedicalButton.vue +0 -0
  304. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/MedicalConfirmDialog.vue +0 -0
  305. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/MedicalDataPanel.vue +0 -0
  306. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/MedicalRecordPanel.vue +0 -0
  307. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/components/PrescriptionPanel.vue +0 -0
  308. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/config/basic-info-config.ts +0 -0
  309. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/config/runtime-config.ts +0 -0
  310. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/env.d.ts +0 -0
  311. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/components/ConsultationChatPanel.vue +0 -0
  312. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/components/ConsultationMembersPanel.vue +0 -0
  313. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/components/ConsultationTranscriptionPanel.vue +0 -0
  314. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/components/ConsultationVideoStage.vue +0 -0
  315. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/components/InviteDoctorDialog.vue +0 -0
  316. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/components/KickMemberConfirmDialog.vue +0 -0
  317. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/types.ts +0 -0
  318. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/useConsultationChat.ts +0 -0
  319. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/useConsultationDevices.ts +0 -0
  320. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/useConsultationParticipants.ts +0 -0
  321. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/useConsultationPermissions.ts +0 -0
  322. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/features/consultation/utils.ts +0 -0
  323. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/i18n/en-US/index.ts +0 -0
  324. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/i18n/index.ts +0 -0
  325. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/i18n/medicalTranslate.ts +0 -0
  326. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/i18n/state.ts +0 -0
  327. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/i18n/zh-CN/index.ts +0 -0
  328. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/main.ts +0 -0
  329. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/mock/appointments.ts +0 -0
  330. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/mock/users.ts +0 -0
  331. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/router/index.ts +0 -0
  332. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/index.ts +0 -0
  333. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/integration/appointmentService.ts +0 -0
  334. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/integration/authService.ts +0 -0
  335. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/integration/launchContext.ts +0 -0
  336. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/integration/userService.ts +0 -0
  337. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/mock/appointmentService.ts +0 -0
  338. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/mock/authService.ts +0 -0
  339. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/mock/userService.ts +0 -0
  340. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/services/adapters/types.ts +0 -0
  341. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/shared/icons.ts +0 -0
  342. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/styles/index.css +0 -0
  343. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/styles/tailwind.css +0 -0
  344. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/styles/theme.css +0 -0
  345. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/utils/auth.ts +0 -0
  346. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/utils/format.ts +0 -0
  347. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/utils/navigation.ts +0 -0
  348. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/utils/session.ts +0 -0
  349. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/views/DoctorConsultationView.vue +0 -0
  350. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/views/DoctorDashboardView.vue +0 -0
  351. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/views/LoginView.vue +0 -0
  352. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/views/PatientConsultationFinishedView.vue +0 -0
  353. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/views/PatientConsultationView.vue +0 -0
  354. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/views/PatientSelectDoctorView.vue +0 -0
  355. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/src/views/PatientWaitingView.vue +0 -0
  356. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/tsconfig.json +0 -0
  357. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/tsconfig.node.json +0 -0
  358. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation/vite.config.ts +0 -0
  359. /package/skills/{trtc/room-builder/templates/scenarios → trtc-conference/templates}/medical-consultation//346/216/245/345/205/245/350/257/264/346/230/216.md" +0 -0
  360. /package/skills/{trtc-topic/runtime/lib → trtc-conference/tools}/__init__.py +0 -0
@@ -1,109 +1,513 @@
1
- # Scenario 文件写作规范(Spec
1
+ # Scenario 文件写作规范(Spec)
2
+ # Scenario 文件写作规范(Spec)
2
3
 
3
4
  > 本文档定义 `knowledge-base/scenarios/{scenario-id}.md` 的标准结构。
4
5
  > 新建场景文件按本规范写;老文件按本规范逐步对齐。
5
- > 配套:`slice-spec.md`(slice 级规范)、`index.yaml`(场景索引)。
6
+ > 配套:`slice-spec.md`(slice 级规范)、per-product platform index(场景/能力索引)。
6
7
 
7
8
  ---
8
9
 
9
10
  ## 一、scenario 文件的角色
10
11
 
11
- scenario 文件是 **topic skill 的场景剧本**。topic 接到一个场景 id 后,把这份文件当 ground truth,按它说的:
12
+ scenario 文件是 **topic skill 的场景剧本**。topic 接到一个场景 id 后,把这份文件当 ground truth,按它说的:
13
+ scenario 文件是 **topic skill 的场景剧本**。topic 接到一个场景 id 后,把这份文件当 ground truth,按它说的:
12
14
 
13
- - 列出场景包含哪些能力(slice
15
+ - 列出场景包含哪些能力(slice)
16
+ - 列出场景包含哪些能力(slice)
14
17
  - 决定是否让用户在"主链路 / 完整版"之间选 coverage
15
18
  - 走每一步 slice 集成
16
19
 
17
- → **写 scenario 文件 = 给 topic 提供执行剧本**,措辞应面向"AI 读这份文件后该做什么"。
20
+ → **写 scenario 文件 = 给 topic 提供执行剧本**,措辞应面向"AI 读这份文件后该做什么"。
21
+
22
+ **最终读者是 AI**:任何模糊词("一般来说""差不多""按业务考虑")都会让 topic 路由错误,选错场景或装上用户没要的能力。
23
+ → **写 scenario 文件 = 给 topic 提供执行剧本**,措辞应面向"AI 读这份文件后该做什么"。
24
+
25
+ **最终读者是 AI**:任何模糊词("一般来说""差不多""按业务考虑")都会让 topic 路由错误,选错场景或装上用户没要的能力。
18
26
 
19
27
  ---
20
28
 
21
- ## 二、两种场景形态:A vs B
29
+ ## 二、两种场景形态:A vs B
30
+ ## 二、两种场景形态:A vs B
22
31
 
23
- 每个场景按自身性质二选一形态,**不强制都要分层**。
32
+ 每个场景按自身性质二选一形态,**不强制都要分层**。
33
+ 每个场景按自身性质二选一形态,**不强制都要分层**。
24
34
 
25
35
  | 形态 | 适用场景 | 特征 | 用户是否参与 coverage 选择 |
26
36
  |---|---|---|---|
27
- | **A:单一完整能力** | 所有 slice 缺一不可:1v1 通话、秀场直播间、电商直播等 | 能力不可拆,少一个就不成场景 | 否 |
28
- | **B:主链路 + 可选增强** | 有清晰的"开箱可用最小集 + 推荐增强"边界:通用会议、协作工具等 | 主链路是默认,增强按需 | 是(minimal / complete 二选一,或可选模块多选) |
37
+ | **A:单一完整能力** | 所有 slice 缺一不可:1v1 通话、秀场直播间、电商直播等 | 能力不可拆,少一个就不成场景 | 否 |
38
+ | **B:主链路 + 可选增强** | 有清晰的"开箱可用最小集 + 推荐增强"边界:通用会议、协作工具等 | 主链路是默认,增强按需 | 是(minimal / complete 二选一,或可选模块多选) |
39
+ | **A:单一完整能力** | 所有 slice 缺一不可:1v1 通话、秀场直播间、电商直播等 | 能力不可拆,少一个就不成场景 | 否 |
40
+ | **B:主链路 + 可选增强** | 有清晰的"开箱可用最小集 + 推荐增强"边界:通用会议、协作工具等 | 主链路是默认,增强按需 | 是(minimal / complete 二选一,或可选模块多选) |
41
+
42
+ ### 形态 B 的两种 coverage 粒度
43
+ ### 形态 B 的两种 coverage 粒度
44
+
45
+ - **B-二选一(minimal / complete)**:增强项作为一个整体,用户在"主链路"和"完整版"之间二选一。写 `enhancement_level`。
46
+ - **B-多选(必装骨架 + 可选模块多选)**:增强项彼此独立、用户通常只要其中几项(典型如通用会议:要屏幕共享和预约,但不要美颜)。此时**必装骨架 always on,可选模块逐项多选,默认只勾选命中用户 `target_features` / 原始 prompt 的项**,结果写入 `confirmed_plan = 必装骨架 + 选中模块`。
47
+
48
+ ### B-多选的反模式判定
49
+
50
+ **禁止**把可选项独立的场景写成 Form A(整张 `slices:` 全集默认安装)——这正是"用户没要美颜却被装上美颜"(over-integration)的根因。
51
+
52
+ #### ❌ 反模式正例
53
+
54
+ 某 scenario 的可选项:屏幕共享、虚拟背景、美颜、白板、预约、录制
55
+ - 用户原始 prompt:"我要做团队会议,需要屏幕共享和预约"
56
+ - 错误处理:全部默认安装 → 用户拿到含美颜的代码 → 投诉"我没要美颜"
57
+ - 正确处理:必装骨架 always on;可选项中**仅勾选命中关键词的**(屏幕共享、预约);其余不进 `confirmed_plan`,代码里也不出现
58
+
59
+ #### B-多选的判据
60
+
61
+ 选这种粒度,当且仅当:
62
+ - 可选项之间**没有"要就全要"的耦合**
63
+ - 默认全装会给用户塞他没要的功能(over-integration)
64
+
65
+ ### 形态判断准则
66
+
67
+ 写 P1 之前先问自己——"如果不选这条增强,场景还能成立吗?"
68
+ - 能 → P1
69
+ - 不能 → P0
70
+ - 整个场景全部 slice 都"少一个就不成立" → 直接走 A 形态
71
+ - **B-二选一(minimal / complete)**:增强项作为一个整体,用户在"主链路"和"完整版"之间二选一。写 `enhancement_level`。
72
+ - **B-多选(必装骨架 + 可选模块多选)**:增强项彼此独立、用户通常只要其中几项(典型如通用会议:要屏幕共享和预约,但不要美颜)。此时**必装骨架 always on,可选模块逐项多选,默认只勾选命中用户 `target_features` / 原始 prompt 的项**,结果写入 `confirmed_plan = 必装骨架 + 选中模块`。
73
+
74
+ ### B-多选的反模式判定
75
+
76
+ **禁止**把可选项独立的场景写成 Form A(整张 `slices:` 全集默认安装)——这正是"用户没要美颜却被装上美颜"(over-integration)的根因。
29
77
 
30
- **形态 B 的两种 coverage 粒度:**
78
+ #### 反模式正例
31
79
 
32
- - **B-二选一(minimal / complete)**:增强项作为一个整体,用户在"主链路"和"完整版"之间二选一。写 `enhancement_level`。
33
- - **B-多选(必装骨架 + 可选模块多选)**:增强项彼此独立、用户通常只要其中几项(典型如通用会议:要屏幕共享和预约,但不要美颜)。此时**必装骨架 always on,可选模块逐项多选,默认只勾选命中用户 `target_features` / 原始 prompt 的项**,结果写入 `confirmed_plan = 必装骨架 + 选中模块`。
34
- - 选这种粒度的判据:可选项之间没有"要就全要"的耦合,且默认全装会给用户塞他没要的功能(over-integration)。
35
- - 反模式:把这类场景写成 Form A(整张 `slices:` 全集默认安装)——这正是"用户没要美颜却被装上美颜"的根因,**禁止**。
36
- - 章节写法见下方「形态 B:能力展示 + coverage」的多选变体说明;参考实现 `scenarios/conference/base/general-conference.md`。
80
+ scenario 的可选项:屏幕共享、虚拟背景、美颜、白板、预约、录制
81
+ - 用户原始 prompt:"我要做团队会议,需要屏幕共享和预约"
82
+ - 错误处理:全部默认安装 → 用户拿到含美颜的代码 → 投诉"我没要美颜"
83
+ - 正确处理:必装骨架 always on;可选项中**仅勾选命中关键词的**(屏幕共享、预约);其余不进 `confirmed_plan`,代码里也不出现
37
84
 
38
- 形态判断准则:
39
- - 写 P1 之前先问自己——"如果不选这条增强,场景还能成立吗?" 能 → P1;不能 → P0。
40
- - 整个场景全部 slice 都"少一个就不成立" → 直接走 A 形态,不必硬掰。
85
+ #### B-多选的判据
41
86
 
42
- 不确定时 default 走 A,将来发现确实有可选项再升级到 B。
87
+ 选这种粒度,当且仅当:
88
+ - 可选项之间**没有"要就全要"的耦合**
89
+ - 默认全装会给用户塞他没要的功能(over-integration)
90
+
91
+ ### 形态判断准则
92
+
93
+ 写 P1 之前先问自己——"如果不选这条增强,场景还能成立吗?"
94
+ - 能 → P1
95
+ - 不能 → P0
96
+ - 整个场景全部 slice 都"少一个就不成立" → 直接走 A 形态
97
+
98
+ 不确定时 default 走 A,将来发现确实有可选项再升级到 B。
99
+
100
+ ### 必填项语义三件套(形态选择)
101
+
102
+ - **违反后果**:形态选错(应 B 写成 A)→ 用户被装上没要的能力(over-integration 投诉)/ 应 A 写成 B → 用户漏装关键能力(场景跑不起来)
103
+ - **验证手段**:reviewer 走形态判断准则,逐条问 P1 candidate 是否"少了不成立"
104
+ - **绕过条件**:无
105
+ 不确定时 default 走 A,将来发现确实有可选项再升级到 B。
106
+
107
+ ### 必填项语义三件套(形态选择)
108
+
109
+ - **违反后果**:形态选错(应 B 写成 A)→ 用户被装上没要的能力(over-integration 投诉)/ 应 A 写成 B → 用户漏装关键能力(场景跑不起来)
110
+ - **验证手段**:reviewer 走形态判断准则,逐条问 P1 candidate 是否"少了不成立"
111
+ - **绕过条件**:无
43
112
 
44
113
  ---
45
114
 
46
115
  ## 三、必备章节
47
116
 
48
- 每个 active scenario 文件 **必须** 包含以下章节。命名可微调,章节角色和顺序不能动。带 (A) (B) 标记的章节按形态二选一写法。
117
+ 每个 active scenario 文件 **必须** 包含以下章节。命名可微调,**章节角色和顺序不能动**。带 (A) (B) 标记的章节按形态二选一写法。
49
118
 
50
- ### 1. `## 场景概述`
119
+ > 完整模板见第七节。
120
+ 每个 active scenario 文件 **必须** 包含以下章节。命名可微调,**章节角色和顺序不能动**。带 (A) (B) 标记的章节按形态二选一写法。
51
121
 
52
- 一段 2-4 行散文,回答三个问题:
53
- - 这个场景对应什么真实业务(举 1-2 个具体例子)
122
+ > 完整模板见第七节。
123
+
124
+ ### 章节 1:`## 场景概述` [必填]
125
+ ### 章节 1:`## 场景概述` [必填]
126
+
127
+ #### 1️⃣ 你必须写什么
128
+ 一段 2-4 行散文,回答三个问题:
129
+ - 这个场景对应什么真实业务(举 1-2 个具体例子)
130
+ #### 1️⃣ 你必须写什么
131
+ 一段 2-4 行散文,回答三个问题:
132
+ - 这个场景对应什么真实业务(举 1-2 个具体例子)
54
133
  - 用户做这种场景的核心诉求是什么
55
- - 与其他相似场景如何区分(边界划清)
134
+ - 与其他相似场景如何区分(边界划清)
135
+ - 与其他相似场景如何区分(边界划清)
136
+
137
+ **用途**:topic Step 1.5 展示给用户的"我帮你定位到了什么场景"的依据。
138
+ **用途**:topic Step 1.5 展示给用户的"我帮你定位到了什么场景"的依据。
139
+
140
+ #### 2️⃣ 写作模板
141
+ ```markdown
142
+ ## 场景概述
143
+
144
+ {场景中文名}对应 {真实业务 1}、{真实业务 2} 这类场景。
145
+ 用户的核心诉求是 {诉求 1},以及 {诉求 2}。
56
146
 
57
- **用途**:topic Step 1.5 展示给用户的"我帮你定位到了什么场景"的依据。
147
+ {相似场景 A} 的区别:{本场景特有的关键差异点}。
148
+ 与 {相似场景 B} 的区别:{差异点}。
149
+ ```
150
+
151
+ #### 3️⃣ ✅ 正例(摘自 entertainment-live-room)
152
+ ```markdown
153
+ ## 场景概述
154
+
155
+ 娱乐直播间对应秀场直播、才艺直播、聊天室直播等以「主播单方面输出 + 观众互动打赏」
156
+ 为核心的场景。用户的核心诉求是低延迟拉流、礼物动效、观众连麦上麦,以及主播工具栏
157
+ (美颜/滤镜/音效)。
158
+
159
+ 与「电商直播」的区别:不需要商品挂载、购物车、订单组件;
160
+ 与「视频会议」的区别:观众只能通过弹幕/礼物/连麦申请互动,不能主动发声。
161
+ ```
162
+
163
+ 为什么这是正例:
164
+ - ✅ 给了 3 个具体业务例子(秀场/才艺/聊天室),不是空泛的"直播"
165
+ - ✅ 列了 3-4 个核心诉求,新人能感知场景的特征
166
+ - ✅ 与 2 个相似场景划清边界,topic 路由时不会混淆
167
+
168
+ #### 4️⃣ ❌ 反例
169
+ ```markdown
170
+ ## 场景概述
171
+
172
+ 本场景介绍娱乐直播间的实现。用户可以直播,观众可以观看互动。
173
+ 功能比较丰富,支持各种业务需求。
174
+ ```
175
+
176
+ 为什么这是反例:
177
+ - ❌ "本场景介绍 xxx" = 元描述,无信息量
178
+ - ❌ "比较丰富""各种业务需求" = 模糊词
179
+ - ❌ 无具体业务例子、无边界划分
180
+ - → topic 拿到这种描述,无法判断用户的"直播需求"是该路由到本场景还是「电商直播」
181
+ - → review 直接打回
58
182
 
59
- ### 2. `## 能力清单` (A) 或 `## 能力分层` (B)
183
+ #### 5️⃣ 必填项语义三件套
184
+ - **违反后果**:场景概述模糊 → topic Step 1.5 路由到错误场景 → 用户拿到不匹配的集成方案
185
+ - **验证手段**:人工 review 三个问题逐条对照;字数 50-200 之间;包含 ≥2 个具体业务例子;包含 ≥1 个边界划分
186
+ - **绕过条件**:无
60
187
 
61
- **slice id 必须与 `index.yaml` 一致**。
188
+ ---
189
+
190
+ ### 章节 2:`## 能力清单` (A) 或 `## 能力分层` (B) [必填]
191
+ #### 2️⃣ 写作模板
192
+ ```markdown
193
+ ## 场景概述
194
+
195
+ {场景中文名}对应 {真实业务 1}、{真实业务 2} 这类场景。
196
+ 用户的核心诉求是 {诉求 1},以及 {诉求 2}。
197
+
198
+ 与 {相似场景 A} 的区别:{本场景特有的关键差异点}。
199
+ 与 {相似场景 B} 的区别:{差异点}。
200
+ ```
62
201
 
63
- #### 形态 A:能力清单
202
+ #### 3️⃣ ✅ 正例(摘自 entertainment-live-room)
203
+ ```markdown
204
+ ## 场景概述
64
205
 
206
+ 娱乐直播间对应秀场直播、才艺直播、聊天室直播等以「主播单方面输出 + 观众互动打赏」
207
+ 为核心的场景。用户的核心诉求是低延迟拉流、礼物动效、观众连麦上麦,以及主播工具栏
208
+ (美颜/滤镜/音效)。
209
+
210
+ 与「电商直播」的区别:不需要商品挂载、购物车、订单组件;
211
+ 与「视频会议」的区别:观众只能通过弹幕/礼物/连麦申请互动,不能主动发声。
212
+ ```
213
+
214
+ 为什么这是正例:
215
+ - ✅ 给了 3 个具体业务例子(秀场/才艺/聊天室),不是空泛的"直播"
216
+ - ✅ 列了 3-4 个核心诉求,新人能感知场景的特征
217
+ - ✅ 与 2 个相似场景划清边界,topic 路由时不会混淆
218
+
219
+ #### 4️⃣ ❌ 反例
220
+ ```markdown
221
+ ## 场景概述
222
+
223
+ 本场景介绍娱乐直播间的实现。用户可以直播,观众可以观看互动。
224
+ 功能比较丰富,支持各种业务需求。
225
+ ```
226
+
227
+ 为什么这是反例:
228
+ - ❌ "本场景介绍 xxx" = 元描述,无信息量
229
+ - ❌ "比较丰富""各种业务需求" = 模糊词
230
+ - ❌ 无具体业务例子、无边界划分
231
+ - → topic 拿到这种描述,无法判断用户的"直播需求"是该路由到本场景还是「电商直播」
232
+ - → review 直接打回
233
+
234
+ #### 5️⃣ 必填项语义三件套
235
+ - **违反后果**:场景概述模糊 → topic Step 1.5 路由到错误场景 → 用户拿到不匹配的集成方案
236
+ - **验证手段**:人工 review 三个问题逐条对照;字数 50-200 之间;包含 ≥2 个具体业务例子;包含 ≥1 个边界划分
237
+ - **绕过条件**:无
238
+
239
+ ---
240
+
241
+ ### 章节 2:`## 能力清单` (A) 或 `## 能力分层` (B) [必填]
242
+
243
+ **slice id 必须与对应的 per-product platform index 一致**。
244
+
245
+ #### 形态 A:能力清单
246
+
247
+ ##### 1️⃣ 你必须写什么
248
+ 列出本场景**全部** slice,每条用一句话说明 UI 上能直接用做按钮 label / 设置项标题的功能描述。
249
+
250
+ ##### 2️⃣ 写作模板
65
251
  ```markdown
66
252
  ## 能力清单
67
253
 
68
- - `<product>/<slice-id>` —— {一句话功能描述(中文,UI 上能直接用做按钮 label / 设置项标题)}
254
+ - `{product}/{slice-id}` —— {一句话功能描述,UI 上可用做按钮 label}
255
+ - `{product}/{slice-id}` —— {一句话功能描述,UI 上可用做按钮 label}
69
256
  - ...
70
257
  ```
71
258
 
72
- #### 形态 B:能力分层
259
+ ##### 3️⃣ ✅ 正例(摘自 1v1-video-call)
260
+ ```markdown
261
+ ## 能力清单
262
+
263
+ - `call/login-auth` —— 用户登录并完成 UserSig 校验
264
+ - `call/outgoing-call` —— 发起 1v1 视频呼叫,展示对方头像与昵称
265
+ - `call/incoming-call` —— 接收来电,显示接听/拒绝按钮
266
+ - `call/in-call-controls` —— 通话中工具栏(静音、切摄像头、挂断)
267
+ - `call/call-end` —— 通话结束页,展示通话时长
268
+ ```
269
+
270
+ 为什么这是正例:
271
+ - ✅ 每条都用 UI 可见的语言("接听/拒绝按钮""通话时长"),不用 SDK 术语
272
+ - ✅ slice id 用 backtick 包裹,可被 topic 机械提取
273
+ - ✅ 顺序贴近用户操作流(登录 → 呼叫 → 接听 → 通话 → 结束)
274
+
275
+ ##### 4️⃣ ❌ 反例
276
+ ```markdown
277
+ ## 能力清单
278
+
279
+ - `call/login-auth` —— 登录相关
280
+ - `call/outgoing-call` —— 实现呼叫功能
281
+ - 还有几个 slice,具体见 index.yaml
282
+ ```
283
+
284
+ 为什么这是反例:
285
+ - ❌ "登录相关""呼叫功能" = 模糊
286
+ - ❌ "见 index.yaml" = 偷懒,topic 拿不到信息
287
+ - ❌ "还有几个" = 不完整,topic 漏装能力
288
+ - → review 直接打回
73
289
 
290
+ #### 形态 B:能力分层
291
+ ##### 3️⃣ ✅ 正例(摘自 1v1-video-call)
292
+ ```markdown
293
+ ## 能力清单
294
+
295
+ - `call/login-auth` —— 用户登录并完成 UserSig 校验
296
+ - `call/outgoing-call` —— 发起 1v1 视频呼叫,展示对方头像与昵称
297
+ - `call/incoming-call` —— 接收来电,显示接听/拒绝按钮
298
+ - `call/in-call-controls` —— 通话中工具栏(静音、切摄像头、挂断)
299
+ - `call/call-end` —— 通话结束页,展示通话时长
300
+ ```
301
+
302
+ 为什么这是正例:
303
+ - ✅ 每条都用 UI 可见的语言("接听/拒绝按钮""通话时长"),不用 SDK 术语
304
+ - ✅ slice id 用 backtick 包裹,可被 topic 机械提取
305
+ - ✅ 顺序贴近用户操作流(登录 → 呼叫 → 接听 → 通话 → 结束)
306
+
307
+ ##### 4️⃣ ❌ 反例
308
+ ```markdown
309
+ ## 能力清单
310
+
311
+ - `call/login-auth` —— 登录相关
312
+ - `call/outgoing-call` —— 实现呼叫功能
313
+ - 还有几个 slice,具体见 index.yaml
314
+ ```
315
+
316
+ 为什么这是反例:
317
+ - ❌ "登录相关""呼叫功能" = 模糊
318
+ - ❌ "见 index.yaml" = 偷懒,topic 拿不到信息
319
+ - ❌ "还有几个" = 不完整,topic 漏装能力
320
+ - → review 直接打回
321
+
322
+ #### 形态 B:能力分层
323
+
324
+ ##### 1️⃣ 你必须写什么
325
+ 按 P0/P1 分层列出 slice。P1 必须标注「推荐默认勾选」字段。
326
+
327
+ ##### 2️⃣ 写作模板
328
+ ##### 1️⃣ 你必须写什么
329
+ 按 P0/P1 分层列出 slice。P1 必须标注「推荐默认勾选」字段。
330
+
331
+ ##### 2️⃣ 写作模板
74
332
  ```markdown
75
333
  ## 能力分层
76
334
 
77
- ### P0 主链路(必装)
335
+ ### P0 主链路(必装)
336
+ ### P0 主链路(必装)
78
337
 
79
- - `<product>/<slice-id>` —— {一句话}
338
+ - `{product}/{slice-id}` —— {一句话}
339
+ - `{product}/{slice-id}` —— {一句话}
80
340
  - ...
81
341
 
82
- ### P1 常见增强(可选)
342
+ ### P1 常见增强(可选)
343
+ ### P1 常见增强(可选)
83
344
 
84
- - `<product>/<slice-id>` —— {一句话}
85
- - 推荐默认勾选:是 / 否
345
+ - `{product}/{slice-id}` —— {一句话}
346
+ - 推荐默认勾选:是 / 否
347
+ - `{product}/{slice-id}` —— {一句话}
348
+ - 推荐默认勾选:是 / 否
86
349
  - ...
87
350
  ```
88
351
 
89
- **P1 字段说明(仅形态 B)**:
352
+ P1 字段说明:
353
+ P1 字段说明:
90
354
 
91
355
  | 字段 | 含义 | 取值 |
92
356
  |---|---|---|
93
- | `推荐默认勾选` | minimal coverage 时是否仍当作必装;complete 时是否预选 | 是 / 否 |
357
+ | `推荐默认勾选` | minimal coverage 时是否仍当作必装;complete 时是否预选 | 是 / 否 |
358
+ | `推荐默认勾选` | minimal coverage 时是否仍当作必装;complete 时是否预选 | 是 / 否 |
359
+
360
+ ##### 3️⃣ ✅ 正例(摘自 general-conference)
361
+ ```markdown
362
+ ## 能力分层
363
+
364
+ ### P0 主链路(必装)
94
365
 
95
- ### 3. `## 能力展示` (A) 或 `## 能力展示与 coverage 选择` (B)
366
+ - `conference/login-auth` —— 用户登录与身份认证
367
+ - `conference/room-lifecycle` —— 创建/加入/离开会议室
368
+ - `conference/in-room-controls` —— 会议中基础工具栏(静音、视频开关、挂断)
369
+
370
+ ### P1 常见增强(可选)
371
+
372
+ - `conference/screen-share` —— 屏幕共享
373
+ - 推荐默认勾选:是
374
+ - `conference/chat` —— 会议中文字聊天
375
+ - 推荐默认勾选:是
376
+ - `conference/recording` —— 云端录制
377
+ - 推荐默认勾选:否
378
+ - `conference/beauty-filter` —— 美颜滤镜
379
+ - 推荐默认勾选:否
380
+ ```
381
+
382
+ 为什么这是正例:
383
+ - ✅ P0 是"少一个就开不了会"的最小集
384
+ - ✅ P1 都是"没有也能开会,有了更好"
385
+ - ✅ 高频增强(屏幕共享/聊天)默认勾选,低频(录制/美颜)默认不勾
386
+
387
+ ##### 4️⃣ ❌ 反例
388
+ ```markdown
389
+ ## 能力分层
390
+
391
+ ### P0
392
+ - `conference/login-auth`
393
+ - `conference/room-lifecycle`
394
+ - `conference/screen-share` ← ❌ 屏幕共享不是必装,放 P1
395
+ - `conference/beauty-filter` ← ❌ 美颜更不该在 P0
396
+
397
+ ### P1
398
+ - `conference/recording`
399
+ - `conference/chat` ← ❌ 没标"推荐默认勾选"
400
+ ```
401
+
402
+ 为什么这是反例:
403
+ - ❌ P0 混入了非必装项 → 用户选 minimal 时被装上没要的能力
404
+ - ❌ P1 缺少"推荐默认勾选"字段 → topic 不知道怎么预选
405
+ - → over-integration 投诉根因
406
+ - → review 直接打回
407
+
408
+ #### 5️⃣ 必填项语义三件套(章节 2)
409
+
410
+ - **违反后果**:slice id 与 index.yaml 不一致 → topic 找不到 slice 文件 / P0/P1 划分错 → over-integration 或漏装
411
+ - **验证手段**:
412
+ ```bash
413
+ # slice id 一致性
414
+ python scripts/validate_scenario.py {file}
415
+ # 通过标准:
416
+ # - 本文件出现的所有 `{product}/{slice-id}` 都在 index.yaml 中存在
417
+ # - 形态 A:slices 数 ≥ 3
418
+ # - 形态 B:P0 ≥ 2,P1 ≥ 2,每个 P1 都有"推荐默认勾选"字段
419
+ ```
420
+ - **绕过条件**:无
421
+
422
+ ---
423
+
424
+ ### 章节 3:`## 能力展示` (A) 或 `## 能力展示与 coverage 选择` (B) [必填]
425
+ ##### 3️⃣ ✅ 正例(摘自 general-conference)
426
+ ```markdown
427
+ ## 能力分层
428
+
429
+ ### P0 主链路(必装)
430
+
431
+ - `conference/login-auth` —— 用户登录与身份认证
432
+ - `conference/room-lifecycle` —— 创建/加入/离开会议室
433
+ - `conference/in-room-controls` —— 会议中基础工具栏(静音、视频开关、挂断)
434
+
435
+ ### P1 常见增强(可选)
436
+
437
+ - `conference/screen-share` —— 屏幕共享
438
+ - 推荐默认勾选:是
439
+ - `conference/chat` —— 会议中文字聊天
440
+ - 推荐默认勾选:是
441
+ - `conference/recording` —— 云端录制
442
+ - 推荐默认勾选:否
443
+ - `conference/beauty-filter` —— 美颜滤镜
444
+ - 推荐默认勾选:否
445
+ ```
446
+
447
+ 为什么这是正例:
448
+ - ✅ P0 是"少一个就开不了会"的最小集
449
+ - ✅ P1 都是"没有也能开会,有了更好"
450
+ - ✅ 高频增强(屏幕共享/聊天)默认勾选,低频(录制/美颜)默认不勾
451
+
452
+ ##### 4️⃣ ❌ 反例
453
+ ```markdown
454
+ ## 能力分层
455
+
456
+ ### P0
457
+ - `conference/login-auth`
458
+ - `conference/room-lifecycle`
459
+ - `conference/screen-share` ← ❌ 屏幕共享不是必装,放 P1
460
+ - `conference/beauty-filter` ← ❌ 美颜更不该在 P0
461
+
462
+ ### P1
463
+ - `conference/recording`
464
+ - `conference/chat` ← ❌ 没标"推荐默认勾选"
465
+ ```
466
+
467
+ 为什么这是反例:
468
+ - ❌ P0 混入了非必装项 → 用户选 minimal 时被装上没要的能力
469
+ - ❌ P1 缺少"推荐默认勾选"字段 → topic 不知道怎么预选
470
+ - → over-integration 投诉根因
471
+ - → review 直接打回
472
+
473
+ #### 5️⃣ 必填项语义三件套(章节 2)
474
+
475
+ - **违反后果**:slice id 与 index.yaml 不一致 → topic 找不到 slice 文件 / P0/P1 划分错 → over-integration 或漏装
476
+ - **验证手段**:
477
+ ```bash
478
+ # slice id 一致性
479
+ python scripts/validate_scenario.py {file}
480
+ # 通过标准:
481
+ # - 本文件出现的所有 `{product}/{slice-id}` 都在 index.yaml 中存在
482
+ # - 形态 A:slices 数 ≥ 3
483
+ # - 形态 B:P0 ≥ 2,P1 ≥ 2,每个 P1 都有"推荐默认勾选"字段
484
+ ```
485
+ - **绕过条件**:无
486
+
487
+ ---
488
+
489
+ ### 章节 3:`## 能力展示` (A) 或 `## 能力展示与 coverage 选择` (B) [必填]
96
490
 
97
491
  **topic Step 1.5 直接照抄的展示模板**。包含展示文案 + (B 形态特有) AskUserQuestion 选项。
98
492
 
99
- #### 形态 A:能力展示
493
+ #### 形态 A:能力展示
494
+
495
+ ##### 1️⃣ 你必须写什么
496
+ topic 展示给用户的原话。A 形态不向用户提问 coverage,展示完直接进 Step 2。
497
+ #### 形态 A:能力展示
498
+
499
+ ##### 1️⃣ 你必须写什么
500
+ topic 展示给用户的原话。A 形态不向用户提问 coverage,展示完直接进 Step 2。
100
501
 
502
+ ##### 2️⃣ 写作模板
503
+ ##### 2️⃣ 写作模板
101
504
  ```markdown
102
505
  ## 能力展示
103
506
 
104
507
  ### 展示文案
105
508
 
106
- 我帮你定位到「{场景中文名}」场景,包含以下 {总数} 项能力:
509
+ 我帮你定位到「{场景中文名}」场景,包含以下 {总数} 项能力:
510
+ 我帮你定位到「{场景中文名}」场景,包含以下 {总数} 项能力:
107
511
 
108
512
  • {slice 1 中文名} (`{slice id}`)
109
513
  • {slice 2 中文名} (`{slice id}`)
@@ -112,29 +516,85 @@ scenario 文件是 **topic skill 的场景剧本**。topic 接到一个场景 id
112
516
  接下来开始集成。
113
517
  ```
114
518
 
115
- A 形态不向用户提问 coverage,topic 展示完直接进 Step 2。
519
+ ##### 3️⃣ 正例
520
+ ```markdown
521
+ ## 能力展示
522
+
523
+ ### 展示文案
116
524
 
117
- #### 形态 B:能力展示 + coverage
525
+ 我帮你定位到「1v1 视频通话」场景,包含以下 5 项能力:
118
526
 
527
+ • 登录与身份认证 (`call/login-auth`)
528
+ • 发起呼叫 (`call/outgoing-call`)
529
+ • 接收来电 (`call/incoming-call`)
530
+ • 通话中工具栏 (`call/in-call-controls`)
531
+ • 通话结束 (`call/call-end`)
532
+
533
+ 接下来开始集成。
534
+ ```
535
+
536
+ 为什么这是正例:
537
+ - ✅ 展示文案完整可抄,topic 不需要二次加工
538
+ - ✅ 中文名 + slice id 一一对应,且与「能力清单」一致
539
+
540
+ #### 形态 B:能力展示 + coverage(二选一)
541
+
542
+ ##### 1️⃣ 你必须写什么
543
+ 展示文案分 P0/P1,加 AskUserQuestion 选项映射表。
544
+
545
+ ##### 2️⃣ 写作模板
546
+ ##### 3️⃣ ✅ 正例
547
+ ```markdown
548
+ ## 能力展示
549
+
550
+ ### 展示文案
551
+
552
+ 我帮你定位到「1v1 视频通话」场景,包含以下 5 项能力:
553
+
554
+ • 登录与身份认证 (`call/login-auth`)
555
+ • 发起呼叫 (`call/outgoing-call`)
556
+ • 接收来电 (`call/incoming-call`)
557
+ • 通话中工具栏 (`call/in-call-controls`)
558
+ • 通话结束 (`call/call-end`)
559
+
560
+ 接下来开始集成。
561
+ ```
562
+
563
+ 为什么这是正例:
564
+ - ✅ 展示文案完整可抄,topic 不需要二次加工
565
+ - ✅ 中文名 + slice id 一一对应,且与「能力清单」一致
566
+
567
+ #### 形态 B:能力展示 + coverage(二选一)
568
+
569
+ ##### 1️⃣ 你必须写什么
570
+ 展示文案分 P0/P1,加 AskUserQuestion 选项映射表。
571
+
572
+ ##### 2️⃣ 写作模板
119
573
  ```markdown
120
574
  ## 能力展示与 coverage 选择
121
575
 
122
576
  ### 展示文案
123
577
 
124
- 我帮你定位到「{场景中文名}」场景,包含以下能力:
578
+ 我帮你定位到「{场景中文名}」场景,包含以下能力:
579
+ 我帮你定位到「{场景中文名}」场景,包含以下能力:
125
580
 
126
- 📋 主链路(必装,{P0 count} 项)
581
+ 📋 主链路(必装,{P0 count} 项)
582
+ 📋 主链路(必装,{P0 count} 项)
127
583
  • {P0 slice 1 中文名} (`{slice id}`)
128
- • {P0 slice 2 中文名} (`{slice id}`)
129
584
  ...
130
585
 
131
- 增强能力(可选,{P1 count} 项)
132
- • {P1 slice 1 中文名} (`{slice id}`) {如"推荐默认勾选 = 是",加 ✓}
586
+ 增强能力(可选,{P1 count} 项)
587
+ • {P1 slice 1 中文名} (`{slice id}`) {推荐默认勾选 = 是 → 加 ✓}
588
+ ➕ 增强能力(可选,{P1 count} 项)
589
+ • {P1 slice 1 中文名} (`{slice id}`) {推荐默认勾选 = 是 → 加 ✓}
133
590
  ...
134
591
 
135
- 集成哪种?
136
- 1) 主链路(最快,开箱可用基础{场景类型}
137
- 2) 完整版(含全部 {总数} 项能力,推荐)
592
+ 集成哪种?
593
+ 1) 主链路(最快,开箱可用基础{场景类型})
594
+ 2) 完整版(含全部 {总数} 项能力,推荐)
595
+ 集成哪种?
596
+ 1) 主链路(最快,开箱可用基础{场景类型})
597
+ 2) 完整版(含全部 {总数} 项能力,推荐)
138
598
 
139
599
  ### AskUserQuestion 选项
140
600
 
@@ -144,95 +604,647 @@ A 形态不向用户提问 coverage,topic 展示完直接进 Step 2。
144
604
  | 2 | 完整版 | `enhancement_level: complete` |
145
605
  ```
146
606
 
147
- **B-多选变体(必装骨架 + 可选模块多选)**:当增强项彼此独立、不应默认全装时,用这种写法替代上面的二选一表。章节里必须包含:
607
+ #### 形态 B-多选变体(必装骨架 + 可选模块多选)
608
+
609
+ ##### 1️⃣ 你必须写什么
610
+ 当增强项彼此独立、不应默认全装时,用这种写法替代二选一表。
611
+ #### 形态 B-多选变体(必装骨架 + 可选模块多选)
148
612
 
613
+ ##### 1️⃣ 你必须写什么
614
+ 当增强项彼此独立、不应默认全装时,用这种写法替代二选一表。
615
+
616
+ ##### 2️⃣ 写作模板
617
+ ##### 2️⃣ 写作模板
149
618
  ```markdown
150
619
  ## 能力展示与 coverage 选择
151
620
 
152
621
  ### 必装骨架(always on,不向用户提问)
153
- - `<product>/<skeleton-slice>` —— ...
622
+ - `{product}/{skeleton-slice-1}` —— ...
623
+ - `{product}/{skeleton-slice-2}` —— ...
624
+ - `{product}/{skeleton-slice-1}` —— ...
625
+ - `{product}/{skeleton-slice-2}` —— ...
154
626
 
155
627
  ### 可选模块(多选,默认只勾选命中用户需求的项)
156
- - `<product>/<optional-slice>` —— ...
628
+ - `{product}/{optional-slice-1}` —— ...
629
+ - `{product}/{optional-slice-2}` —— ...
630
+ - ...
631
+ - `{product}/{optional-slice-1}` —— ...
632
+ - `{product}/{optional-slice-2}` —— ...
633
+ - ...
157
634
 
158
635
  ### 执行规则(topic 必须遵守)
159
- 1. 预勾选 = 仅命中 `target_features` / 原始 prompt 的可选模块;其余默认不勾。
160
- 2. 展示文案(说明骨架默认装 + 已识别到的增强项)。
161
- 3. AskUserQuestion 多选(超 4 项分组拆问)。**每组必须包含「以上都不需要」选项(value=`none`),放在末尾,作为用户显式拒绝该组所有能力的出口。选中`none`时该组其他选项视为未勾选。**
162
- 4. `confirmed_plan = 必装骨架 + 选中模块`(唯一下游真源)。
163
- 5. 未选中的模块不得进 `confirmed_plan`,也不得在代码里顺手生成。
164
- 6. `enhancement_level` 仅兼容:全选 → complete,否则 → minimal。
636
+
637
+ 1. **预勾选**:仅命中 `target_features` / 原始 prompt 关键词的可选模块;其余默认不勾。
638
+ 2. **展示文案**:说明骨架默认装 + 已识别到的增强项。
639
+ 3. **AskUserQuestion 多选**:超 4 项分组拆问。**每组必须包含「以上都不需要」选项(value=`none`),放在末尾,作为用户显式拒绝该组所有能力的出口。选中`none`时该组其他选项视为未勾选。**
640
+ 4. **写入 session**:`confirmed_plan = 必装骨架 + 选中模块`(唯一下游真源)。
641
+ 5. **未选中模块绝不进 `confirmed_plan`**,也不得在代码里顺手生成。
642
+ 6. **`enhancement_level` 仅兼容**:全选 → complete;否则 → minimal。
643
+
644
+ ```
645
+
646
+ ##### 3️⃣ ✅ 正例(参考 conference/base/general-conference)
647
+ ```markdown
648
+ ### 必装骨架(always on)
649
+ - `conference/login-auth` —— 登录认证
650
+ - `conference/room-lifecycle` —— 房间生命周期
651
+ - `conference/in-room-controls` —— 基础工具栏
652
+
653
+ ### 可选模块(多选,默认只勾选命中用户需求的项)
654
+ - `conference/screen-share` —— 屏幕共享
655
+ - `conference/chat` —— 文字聊天
656
+ - `conference/recording` —— 云端录制
657
+ - `conference/beauty-filter` —— 美颜滤镜
658
+ - `conference/scheduled-meeting` —— 会议预约
659
+
660
+ ### 执行规则
661
+ 1. 预勾选:仅命中 target_features 中的可选模块。
662
+ 例:用户输入"团队会议要屏幕共享和预约" → 预勾选 screen-share + scheduled-meeting,
663
+ 其余默认不勾。
664
+ 2. AskUserQuestion 展示 5 个可选模块,用户可加选/取消。
665
+ 3. confirmed_plan = 骨架 3 项 + 用户最终选中的 N 项。
666
+ 4. 未选中的(如 beauty-filter)绝不出现在生成代码中。
667
+ ```
668
+
669
+ 为什么这是正例:
670
+ - ✅ 明确预勾选规则(关键词命中)
671
+ - ✅ 给了真实的"用户输入 → 预勾选结果"映射
672
+ - ✅ 强调"未选中的绝不出现"——堵死 over-integration
673
+
674
+ ##### 4️⃣ ❌ 反模式
675
+ ```markdown
676
+ ### 可选模块
677
+ - `conference/screen-share`
678
+ - `conference/beauty-filter`
679
+ - ...
680
+
681
+ ### 执行规则
682
+ - 默认全部安装,用户可以让我去掉不需要的。
683
+ ```
684
+
685
+ 为什么这是反例:
686
+ - ❌ "默认全部安装" = over-integration 根因
687
+ - ❌ "让用户去掉" = 把判断责任甩给用户
688
+ - ❌ 没有预勾选规则
689
+ - → 真实事故:某客户做团队会议,被装上美颜组件,投诉"我没要美颜"
690
+ - → review 直接打回
691
+
692
+ #### 5️⃣ 必填项语义三件套(章节 3)
693
+
694
+ - **违反后果**:展示文案与能力清单不一致 → topic 展示给用户的与实际集成的不一样;B-多选写成默认全装 → over-integration 投诉
695
+ - **验证手段**:
696
+ ```bash
697
+ python scripts/validate_scenario.py {file}
698
+ # 通过标准:
699
+ # - 展示文案中的 slice id 与「能力清单/分层」完全一致
700
+ # - 形态 B:必有 AskUserQuestion 选项表
701
+ # - B-多选:必有"未选中模块绝不进 confirmed_plan"的明文声明
702
+ ```
703
+ - **绕过条件**:无
704
+
705
+ ---
706
+
707
+ ### 章节 4:`## 前置条件` [必填]
708
+
709
+ #### 1️⃣ 你必须写什么
710
+ 集成前用户必须做的事(控制台配置、SDK 版本、账号开通、平台权限等)。topic Step 2 展示给用户。
711
+
712
+ 1. **预勾选**:仅命中 `target_features` / 原始 prompt 关键词的可选模块;其余默认不勾。
713
+ 2. **展示文案**:说明骨架默认装 + 已识别到的增强项。
714
+ 3. **AskUserQuestion 多选**:超 4 项分组拆问。**每组必须包含「以上都不需要」选项(value=`none`),放在末尾,作为用户显式拒绝该组所有能力的出口。选中`none`时该组其他选项视为未勾选。**
715
+ 4. **写入 session**:`confirmed_plan = 必装骨架 + 选中模块`(唯一下游真源)。
716
+ 5. **未选中模块绝不进 `confirmed_plan`**,也不得在代码里顺手生成。
717
+ 6. **`enhancement_level` 仅兼容**:全选 → complete;否则 → minimal。
718
+
165
719
  ```
166
720
 
167
- topic Step 1.5 会识别这种章节并按「执行规则」走,而不是把整张 `slices:` 当默认全集。
721
+ ##### 3️⃣ 正例(参考 conference/base/general-conference)
722
+ ```markdown
723
+ ### 必装骨架(always on)
724
+ - `conference/login-auth` —— 登录认证
725
+ - `conference/room-lifecycle` —— 房间生命周期
726
+ - `conference/in-room-controls` —— 基础工具栏
168
727
 
169
- ### 4. `## 前置条件`
728
+ ### 可选模块(多选,默认只勾选命中用户需求的项)
729
+ - `conference/screen-share` —— 屏幕共享
730
+ - `conference/chat` —— 文字聊天
731
+ - `conference/recording` —— 云端录制
732
+ - `conference/beauty-filter` —— 美颜滤镜
733
+ - `conference/scheduled-meeting` —— 会议预约
734
+
735
+ ### 执行规则
736
+ 1. 预勾选:仅命中 target_features 中的可选模块。
737
+ 例:用户输入"团队会议要屏幕共享和预约" → 预勾选 screen-share + scheduled-meeting,
738
+ 其余默认不勾。
739
+ 2. AskUserQuestion 展示 5 个可选模块,用户可加选/取消。
740
+ 3. confirmed_plan = 骨架 3 项 + 用户最终选中的 N 项。
741
+ 4. 未选中的(如 beauty-filter)绝不出现在生成代码中。
742
+ ```
170
743
 
171
- 集成前用户必须做的事(控制台配置、SDK 版本、账号开通、平台权限等)。topic Step 2 展示给用户。
744
+ 为什么这是正例:
745
+ - ✅ 明确预勾选规则(关键词命中)
746
+ - ✅ 给了真实的"用户输入 → 预勾选结果"映射
747
+ - ✅ 强调"未选中的绝不出现"——堵死 over-integration
172
748
 
749
+ ##### 4️⃣ ❌ 反模式
173
750
  ```markdown
174
- - 已开通 TRTC 服务并获取 SDKAppID 和 SecretKey
751
+ ### 可选模块
752
+ - `conference/screen-share`
753
+ - `conference/beauty-filter`
754
+ - ...
755
+
756
+ ### 执行规则
757
+ - 默认全部安装,用户可以让我去掉不需要的。
758
+ ```
759
+
760
+ 为什么这是反例:
761
+ - ❌ "默认全部安装" = over-integration 根因
762
+ - ❌ "让用户去掉" = 把判断责任甩给用户
763
+ - ❌ 没有预勾选规则
764
+ - → 真实事故:某客户做团队会议,被装上美颜组件,投诉"我没要美颜"
765
+ - → review 直接打回
766
+
767
+ #### 5️⃣ 必填项语义三件套(章节 3)
768
+
769
+ - **违反后果**:展示文案与能力清单不一致 → topic 展示给用户的与实际集成的不一样;B-多选写成默认全装 → over-integration 投诉
770
+ - **验证手段**:
771
+ ```bash
772
+ python scripts/validate_scenario.py {file}
773
+ # 通过标准:
774
+ # - 展示文案中的 slice id 与「能力清单/分层」完全一致
775
+ # - 形态 B:必有 AskUserQuestion 选项表
776
+ # - B-多选:必有"未选中模块绝不进 confirmed_plan"的明文声明
777
+ ```
778
+ - **绕过条件**:无
779
+
780
+ ---
781
+
782
+ ### 章节 4:`## 前置条件` [必填]
783
+
784
+ #### 1️⃣ 你必须写什么
785
+ 集成前用户必须做的事(控制台配置、SDK 版本、账号开通、平台权限等)。topic Step 2 展示给用户。
786
+
787
+ #### 2️⃣ 写作模板
788
+ #### 2️⃣ 写作模板
789
+ ```markdown
790
+ ## 前置条件
791
+
792
+ - 已开通 {产品名} 服务并获取 {SDKAppID / SecretKey / 其他凭证}
793
+ ## 前置条件
794
+
795
+ - 已开通 {产品名} 服务并获取 {SDKAppID / SecretKey / 其他凭证}
175
796
  - {平台} SDK 版本 ≥ {version}
176
797
  - {权限 / 配置 / 其他}
798
+ - {该场景特有的前置:如套餐版本、白名单、回调域名等}
799
+ - {该场景特有的前置:如套餐版本、白名单、回调域名等}
177
800
  ```
178
801
 
179
- ### 5. `## 验收 Checklist`
802
+ #### 3️⃣ 正例(摘自 general-conference)
803
+ ```markdown
804
+ ## 前置条件
180
805
 
181
- 集成完成后用户用来自检"我这套真的跑起来了吗"的清单。topic Step 完成后展示。
806
+ - 已开通 TRTC 服务并获取 SDKAppID 和 SecretKey
807
+ - Web SDK 版本 ≥ 5.4.3(含 RoomKit Vue3 包)
808
+ - HTTPS 域名(摄像头/麦克风权限要求)
809
+ - 浏览器:Chrome ≥ 86 / Safari ≥ 14 / Edge ≥ 86
810
+ - 若使用云端录制 → 需在控制台开通"云录制"套餐(基础版不支持)
811
+ ```
812
+
813
+ 为什么这是正例:
814
+ - ✅ 列了控制台、SDK 版本、传输层、浏览器、套餐 5 类前置
815
+ - ✅ 给出具体版本号,不是"较新版本"
816
+ - ✅ 标注了套餐限制(常见踩坑)
182
817
 
818
+ #### 4️⃣ ❌ 反例
183
819
  ```markdown
184
- - [ ] 用户能登录并进入会议
820
+ ## 前置条件
821
+
822
+ - 需要 TRTC 账号
823
+ - SDK 版本要够新
824
+ - 浏览器要支持 WebRTC
825
+ ```
826
+
827
+ 为什么这是反例:
828
+ - ❌ "够新""支持" = 模糊
829
+ - ❌ 缺套餐、域名、控制台开通信息
830
+ - → 用户照抄会卡在某个未明示的前置上
831
+
832
+ #### 5️⃣ 必填项语义三件套
833
+ - **违反后果**:前置缺失 → 用户照集成步骤跑下来在某一步突然报错 → 排查 1+ 小时定位到没开套餐 / 域名不是 HTTPS
834
+ - **验证手段**:必须含 ≥4 类前置(控制台、SDK 版本、平台权限/配置、套餐);版本号必须是具体数字
835
+ - **绕过条件**:场景极简(如纯前端 demo)无控制台/套餐要求 → 在 PR 说明
836
+
837
+ ---
838
+
839
+ ### 章节 5:`## 验收 Checklist` [必填]
840
+
841
+ #### 1️⃣ 你必须写什么
842
+ 集成完成后用户用来自检"我这套真的跑起来了吗"的清单。
843
+ **这是 SuperPowers「验证门」机制在 scenario 层的落地**——没跑过 checklist 不允许声称完成。
844
+
845
+ topic Step 完成后展示。
846
+
847
+ #### 2️⃣ 写作模板
848
+ ```markdown
849
+ ## 验收 Checklist
850
+
851
+ ### 基础联通
852
+ - [ ] 用户能登录并进入{场景实体}
853
+ - [ ] {基础设备/连接} 可以正常打开关闭
854
+
855
+ ### 核心流程
856
+ - [ ] {本场景特有的核心动作 1} 能跑通
857
+ - [ ] {本场景特有的核心动作 2} 能跑通
858
+
859
+ ### 异常处理
860
+ - [ ] {失败分支 1} 时 UI 有可见反馈
861
+ - [ ] {失败分支 2} 时不会卡住或静默失败
862
+
863
+ ### 业务行为
864
+ - [ ] {场景特有的业务正确性,如"主播离开时观众看到提示"}
865
+ ```
866
+
867
+ #### 3️⃣ ✅ 正例(摘自 1v1-video-call)
868
+ #### 3️⃣ ✅ 正例(摘自 general-conference)
869
+ ```markdown
870
+ ## 前置条件
871
+
872
+ - 已开通 TRTC 服务并获取 SDKAppID 和 SecretKey
873
+ - Web SDK 版本 ≥ 5.4.3(含 RoomKit Vue3 包)
874
+ - HTTPS 域名(摄像头/麦克风权限要求)
875
+ - 浏览器:Chrome ≥ 86 / Safari ≥ 14 / Edge ≥ 86
876
+ - 若使用云端录制 → 需在控制台开通"云录制"套餐(基础版不支持)
877
+ ```
878
+
879
+ 为什么这是正例:
880
+ - ✅ 列了控制台、SDK 版本、传输层、浏览器、套餐 5 类前置
881
+ - ✅ 给出具体版本号,不是"较新版本"
882
+ - ✅ 标注了套餐限制(常见踩坑)
883
+
884
+ #### 4️⃣ ❌ 反例
885
+ ```markdown
886
+ ## 前置条件
887
+
888
+ - 需要 TRTC 账号
889
+ - SDK 版本要够新
890
+ - 浏览器要支持 WebRTC
891
+ ```
892
+
893
+ 为什么这是反例:
894
+ - ❌ "够新""支持" = 模糊
895
+ - ❌ 缺套餐、域名、控制台开通信息
896
+ - → 用户照抄会卡在某个未明示的前置上
897
+
898
+ #### 5️⃣ 必填项语义三件套
899
+ - **违反后果**:前置缺失 → 用户照集成步骤跑下来在某一步突然报错 → 排查 1+ 小时定位到没开套餐 / 域名不是 HTTPS
900
+ - **验证手段**:必须含 ≥4 类前置(控制台、SDK 版本、平台权限/配置、套餐);版本号必须是具体数字
901
+ - **绕过条件**:场景极简(如纯前端 demo)无控制台/套餐要求 → 在 PR 说明
902
+
903
+ ---
904
+
905
+ ### 章节 5:`## 验收 Checklist` [必填]
906
+
907
+ #### 1️⃣ 你必须写什么
908
+ 集成完成后用户用来自检"我这套真的跑起来了吗"的清单。
909
+ **这是 SuperPowers「验证门」机制在 scenario 层的落地**——没跑过 checklist 不允许声称完成。
910
+
911
+ topic Step 完成后展示。
912
+
913
+ #### 2️⃣ 写作模板
914
+ ```markdown
915
+ ## 验收 Checklist
916
+
917
+ ### 基础联通
918
+ - [ ] 用户能登录并进入{场景实体}
919
+ - [ ] {基础设备/连接} 可以正常打开关闭
920
+
921
+ ### 核心流程
922
+ - [ ] {本场景特有的核心动作 1} 能跑通
923
+ - [ ] {本场景特有的核心动作 2} 能跑通
924
+
925
+ ### 异常处理
926
+ - [ ] {失败分支 1} 时 UI 有可见反馈
927
+ - [ ] {失败分支 2} 时不会卡住或静默失败
928
+
929
+ ### 业务行为
930
+ - [ ] {场景特有的业务正确性,如"主播离开时观众看到提示"}
931
+ ```
932
+
933
+ #### 3️⃣ ✅ 正例(摘自 1v1-video-call)
934
+ ```markdown
935
+ ## 验收 Checklist
936
+
937
+ ### 基础联通
938
+ - [ ] 双方都能登录并完成 UserSig 校验
939
+ ## 验收 Checklist
940
+
941
+ ### 基础联通
942
+ - [ ] 双方都能登录并完成 UserSig 校验
185
943
  - [ ] 摄像头 / 麦克风可以正常打开关闭
186
- - [ ] {针对本场景的特有验收点}
187
- - [ ] {...}
944
+
945
+ ### 核心流程
946
+ - [ ] A 呼叫 B,B 端 5 秒内收到来电界面
947
+ - [ ] B 接听后,双方画面互通,延迟 < 500ms
948
+ - [ ] 任一方挂断,另一方在 2 秒内回到通话结束页
949
+
950
+ ### 异常处理
951
+ - [ ] B 不在线时,A 端展示"对方离线",不会一直转圈
952
+ - [ ] B 拒接时,A 端展示"对方拒接",回到主页
953
+ - [ ] 网络断开时,UI 展示"网络异常"提示,不静默失败
954
+
955
+ ### 业务行为
956
+ - [ ] 通话时长正确(误差 < 1 秒)
957
+ - [ ] 双方挂断后,通话记录写入本地存储
958
+ ```
959
+
960
+ 为什么这是正例:
961
+ - ✅ 4 类清晰:基础/核心/异常/业务
962
+ - ✅ 每条带可量化标准("5 秒内""< 500ms""< 1 秒")
963
+ - ✅ 异常分支齐全(离线/拒接/断网)
964
+ - ✅ 业务行为不漏(时长、记录)
965
+
966
+ #### 4️⃣ ❌ 反例
967
+ ```markdown
968
+ ## 验收 Checklist
969
+
970
+ - [ ] 功能正常工作
971
+ - [ ] 没有报错
972
+ - [ ] 用户体验良好
973
+ ```
974
+
975
+ 为什么这是反例:
976
+ - ❌ "正常工作""体验良好" = 不可验证
977
+ - ❌ 没有量化标准
978
+ - ❌ 没有异常分支
979
+ - → 用户打勾后仍然有大量未发现的问题
980
+ - → review 直接打回
981
+
982
+ #### 5️⃣ 必填项语义三件套
983
+ - **违反后果**:checklist 模糊 → 用户打勾交付 → 上线后发现关键流程没跑通 → P1 故障
984
+ - **验证手段**:
985
+ - 4 类各 ≥1 条(基础联通 / 核心流程 / 异常处理 / 业务行为)
986
+ - 每条必须可量化或可观察(不出现"正常""良好""合适"等模糊词)
987
+ - `grep -E "正常|良好|合适|可以" {file}` 在 checklist 段落命中 0 次
988
+ - **绕过条件**:无
989
+
990
+ ---
991
+
992
+ ### 章节 6:`## 排障速查` [条件必填:本场景有跨 slice 故障模式]
993
+
994
+ #### 触发条件
995
+ 满足以下任一即必填:
996
+ - 本场景有 ≥3 个高频出错的"跨 slice"症状(单 slice 内的排障已在 slice 文件覆盖)
997
+ - 用户报障 ticket 中本场景占 top 5 之一
998
+
999
+ 不满足 → 整段删除,但建议至少留 1 条作为种子。
1000
+
1001
+ #### 1️⃣ 你必须写什么
1002
+ **不重复 slice 内的排障**,只列**跨 slice、属于场景级**的问题。
1003
+
1004
+ #### 2️⃣ 写作模板
1005
+ ```markdown
1006
+ ## 排障速查
1007
+
1008
+ | 症状 | 可能原因 | 排查方向 |
1009
+ |---|---|---|
1010
+ | {用户报的现象} | {跨 slice 的根因} | {要查哪几个 slice / 配置项} |
1011
+ | {现象} | {根因} | {方向} |
1012
+ | {现象} | {根因} | {方向} |
1013
+ ```
1014
+
1015
+ #### 3️⃣ ✅ 正例(摘自 general-conference)
1016
+ ```markdown
1017
+ ## 排障速查
1018
+
1019
+ | 症状 | 可能原因 | 排查方向 |
1020
+ |---|---|---|
1021
+ | 进得去房但是看不到别人画面 | 推流/拉流任一未启动 | 同时检查 `conference/publish` 推流状态 + `conference/subscribe` 拉流订阅 + 视频布局 slice 状态 |
1022
+ | 聊天发不出去 | 会控秩序禁聊 / chat slice 未初始化 | 检查 `conference/host-controls` 禁聊状态 + `conference/chat` 初始化 |
1023
+ | 屏幕共享黑屏 | 浏览器权限未授 / 抓屏 API 不支持 | 检查浏览器 getDisplayMedia 权限 + HTTPS 域名 |
1024
+ | 录制文件找不到 | 录制配置错误 / COS 未配 | 检查 `conference/recording` 配置 + 控制台 COS 绑定 |
1025
+ ```
1026
+
1027
+ 为什么这是正例:
1028
+ - ✅ 每条都跨 ≥2 个 slice / 配置项
1029
+ - ✅ "排查方向" 列引用具体 slice id,topic 可机械跳转
1030
+ - ✅ 不重复单 slice 内的排障(slice 内的"摄像头打不开"不会出现在这)
1031
+
1032
+ #### 4️⃣ ❌ 反例
1033
+ ```markdown
1034
+ ## 排障速查
1035
+
1036
+ - 出问题先重启
1037
+ - 看错误码
1038
+ - 联系技术支持
188
1039
  ```
189
1040
 
190
- ### 6. `## 排障速查`(可选但强烈建议)
1041
+ 为什么这是反例:
1042
+ - ❌ 不是表格
1043
+ - ❌ "重启""看错误码" = 万能但无效的话术
1044
+ - ❌ "联系技术支持" = 兜底没意义
1045
+ - → 等于没写
1046
+
1047
+ #### 5️⃣ 必填项语义三件套
1048
+ - **违反后果**:跨 slice 故障无场景级排障 → 用户报"进房后没画面",AI 只能查单 slice → 漏掉是另一个 slice 的状态问题 → 排查 1+ 小时
1049
+ - **验证手段**:必须是表格;每条"排查方向"列引用 ≥2 个 slice id 或配置项;不出现"重启""联系技术支持"等空洞词
1050
+ - **绕过条件**:不满足触发条件 → 可省
1051
+
1052
+ ### 核心流程
1053
+ - [ ] A 呼叫 B,B 端 5 秒内收到来电界面
1054
+ - [ ] B 接听后,双方画面互通,延迟 < 500ms
1055
+ - [ ] 任一方挂断,另一方在 2 秒内回到通话结束页
1056
+
1057
+ ### 异常处理
1058
+ - [ ] B 不在线时,A 端展示"对方离线",不会一直转圈
1059
+ - [ ] B 拒接时,A 端展示"对方拒接",回到主页
1060
+ - [ ] 网络断开时,UI 展示"网络异常"提示,不静默失败
1061
+
1062
+ ### 业务行为
1063
+ - [ ] 通话时长正确(误差 < 1 秒)
1064
+ - [ ] 双方挂断后,通话记录写入本地存储
1065
+ ```
1066
+
1067
+ 为什么这是正例:
1068
+ - ✅ 4 类清晰:基础/核心/异常/业务
1069
+ - ✅ 每条带可量化标准("5 秒内""< 500ms""< 1 秒")
1070
+ - ✅ 异常分支齐全(离线/拒接/断网)
1071
+ - ✅ 业务行为不漏(时长、记录)
1072
+
1073
+ #### 4️⃣ ❌ 反例
1074
+ ```markdown
1075
+ ## 验收 Checklist
191
1076
 
192
- 把场景下高频出错的 3-5 个症状 排查路径列出。**不重复 slice 内的排障**,只列**跨 slice、属于场景级的**问题。
1077
+ - [ ] 功能正常工作
1078
+ - [ ] 没有报错
1079
+ - [ ] 用户体验良好
1080
+ ```
193
1081
 
194
- 例如通用会议场景:
195
- - "进得去房但是看不到别人画面" 检查推流 + 拉流 + 视频布局三个 slice 的状态
196
- - "聊天发不出去" → 检查会控秩序是否禁聊 + room-chat slice 状态
1082
+ 为什么这是反例:
1083
+ - "正常工作""体验良好" = 不可验证
1084
+ - 没有量化标准
1085
+ - ❌ 没有异常分支
1086
+ - → 用户打勾后仍然有大量未发现的问题
1087
+ - → review 直接打回
1088
+
1089
+ #### 5️⃣ 必填项语义三件套
1090
+ - **违反后果**:checklist 模糊 → 用户打勾交付 → 上线后发现关键流程没跑通 → P1 故障
1091
+ - **验证手段**:
1092
+ - 4 类各 ≥1 条(基础联通 / 核心流程 / 异常处理 / 业务行为)
1093
+ - 每条必须可量化或可观察(不出现"正常""良好""合适"等模糊词)
1094
+ - `grep -E "正常|良好|合适|可以" {file}` 在 checklist 段落命中 0 次
1095
+ - **绕过条件**:无
1096
+
1097
+ ---
1098
+
1099
+ ### 章节 6:`## 排障速查` [条件必填:本场景有跨 slice 故障模式]
1100
+
1101
+ #### 触发条件
1102
+ 满足以下任一即必填:
1103
+ - 本场景有 ≥3 个高频出错的"跨 slice"症状(单 slice 内的排障已在 slice 文件覆盖)
1104
+ - 用户报障 ticket 中本场景占 top 5 之一
1105
+
1106
+ 不满足 → 整段删除,但建议至少留 1 条作为种子。
1107
+
1108
+ #### 1️⃣ 你必须写什么
1109
+ **不重复 slice 内的排障**,只列**跨 slice、属于场景级**的问题。
1110
+
1111
+ #### 2️⃣ 写作模板
1112
+ ```markdown
1113
+ ## 排障速查
1114
+
1115
+ | 症状 | 可能原因 | 排查方向 |
1116
+ |---|---|---|
1117
+ | {用户报的现象} | {跨 slice 的根因} | {要查哪几个 slice / 配置项} |
1118
+ | {现象} | {根因} | {方向} |
1119
+ | {现象} | {根因} | {方向} |
1120
+ ```
1121
+
1122
+ #### 3️⃣ ✅ 正例(摘自 general-conference)
1123
+ ```markdown
1124
+ ## 排障速查
1125
+
1126
+ | 症状 | 可能原因 | 排查方向 |
1127
+ |---|---|---|
1128
+ | 进得去房但是看不到别人画面 | 推流/拉流任一未启动 | 同时检查 `conference/publish` 推流状态 + `conference/subscribe` 拉流订阅 + 视频布局 slice 状态 |
1129
+ | 聊天发不出去 | 会控秩序禁聊 / chat slice 未初始化 | 检查 `conference/host-controls` 禁聊状态 + `conference/chat` 初始化 |
1130
+ | 屏幕共享黑屏 | 浏览器权限未授 / 抓屏 API 不支持 | 检查浏览器 getDisplayMedia 权限 + HTTPS 域名 |
1131
+ | 录制文件找不到 | 录制配置错误 / COS 未配 | 检查 `conference/recording` 配置 + 控制台 COS 绑定 |
1132
+ ```
1133
+
1134
+ 为什么这是正例:
1135
+ - ✅ 每条都跨 ≥2 个 slice / 配置项
1136
+ - ✅ "排查方向" 列引用具体 slice id,topic 可机械跳转
1137
+ - ✅ 不重复单 slice 内的排障(slice 内的"摄像头打不开"不会出现在这)
1138
+
1139
+ #### 4️⃣ ❌ 反例
1140
+ ```markdown
1141
+ ## 排障速查
1142
+
1143
+ - 出问题先重启
1144
+ - 看错误码
1145
+ - 联系技术支持
1146
+ ```
1147
+
1148
+ 为什么这是反例:
1149
+ - ❌ 不是表格
1150
+ - ❌ "重启""看错误码" = 万能但无效的话术
1151
+ - ❌ "联系技术支持" = 兜底没意义
1152
+ - → 等于没写
1153
+
1154
+ #### 5️⃣ 必填项语义三件套
1155
+ - **违反后果**:跨 slice 故障无场景级排障 → 用户报"进房后没画面",AI 只能查单 slice → 漏掉是另一个 slice 的状态问题 → 排查 1+ 小时
1156
+ - **验证手段**:必须是表格;每条"排查方向"列引用 ≥2 个 slice id 或配置项;不出现"重启""联系技术支持"等空洞词
1157
+ - **绕过条件**:不满足触发条件 → 可省
197
1158
 
198
1159
  ---
199
1160
 
200
1161
  ## 四、可选章节
201
1162
 
202
- 按需写,不强制:
1163
+ 按需写,不强制:
1164
+ 按需写,不强制:
203
1165
 
204
- - `## 子场景命中差异` —— 同一场景下不同子形态(如"日常团队会议" vs "培训会议")的 slice 增减建议
1166
+ - `## 子场景命中差异` —— 同一场景下不同子形态(如"日常团队会议" vs "培训会议")的 slice 增减建议
1167
+ - `## 子场景命中差异` —— 同一场景下不同子形态(如"日常团队会议" vs "培训会议")的 slice 增减建议
205
1168
  - `## 跨产品依赖` —— 本场景依赖其他产品 SDK 时的说明
206
- - `## 设计取舍` —— 为什么这个场景这么拆、和兄弟场景的边界(给后续 scenario 作者看的设计笔记)
1169
+ - `## 设计取舍` —— 为什么这个场景这么拆、和兄弟场景的边界(给后续 scenario 作者看的设计笔记)
1170
+ - `## 设计取舍` —— 为什么这个场景这么拆、和兄弟场景的边界(给后续 scenario 作者看的设计笔记)
207
1171
 
208
1172
  ---
209
1173
 
210
1174
  ## 五、字段一致性检查
211
1175
 
212
- 写完 scenario 文件,检查:
1176
+ 写完 scenario 文件,**必须**检查以下一致性。**任何一项不一致 = 不可合并**。
1177
+ 写完 scenario 文件,**必须**检查以下一致性。**任何一项不一致 = 不可合并**。
213
1178
 
214
1179
  | 检查项 | 哪两处必须一致 |
215
1180
  |---|---|
216
- | slice id 列表 | `index.yaml` `scenarios.<id>.slices` 数组 ↔ 本文件「能力清单」(A) 或 「能力分层」(B) 总和 |
1181
+ | slice id 列表 | `per-product platform index` 中对应场景条目的 `slices` 数组 ↔ 本文件「能力清单」(A) 或 「能力分层」(B) 总和 |
217
1182
  | 中文名 | 「能力清单 / 能力分层」中的 slice 名 ↔ 「能力展示」展示文案中的 slice 名 |
218
1183
  | `推荐默认勾选 = 是`(仅 B) | 必须在「能力展示」展示文案的 ✓ 标记列表 |
219
1184
 
220
- 未来可加 `scripts/validate_scenario.py` 自动跑这些检查。
1185
+ ### 必填项语义三件套(一致性)
1186
+
1187
+ - **违反后果**:不一致 → topic 展示给用户的与实际集成的不一样 → 用户拿到的代码与说明书对不上 → 投诉
1188
+ - **验证手段**:`python scripts/validate_scenario.py {file}` 退出码 0
1189
+ - **绕过条件**:无
1190
+
1191
+ ---
1192
+
1193
+ ## 六、Scenario DoD(提交合并前)
1194
+
1195
+ 研发写完 scenario 后,对照清单逐条打勾。**任何一项未满足 = 未完成,不允许提 PR**。
1196
+
1197
+ > ⚠️ 仅打勾不跑命令 = 视为未验证。每条标了"验证命令"的项,必须在 PR 描述粘贴命令输出。
1198
+
1199
+ ### 通用 DoD
1200
+
1201
+ - [ ] 形态选择(A/B)依据「形态判断准则」走过一遍,在 PR 描述写明依据
1202
+ - [ ] `场景概述` 含 ≥2 个具体业务例子 + ≥1 个边界划分
1203
+ - [ ] `能力清单/能力分层` 中所有 slice id 与 index.yaml 一致
1204
+ 验证:`python scripts/validate_scenario.py {file}` 退出码 0
1205
+ - [ ] `能力展示` 中的 slice 名与「能力清单/能力分层」一致
1206
+ - [ ] `前置条件` 含 ≥4 类(控制台/SDK 版本/权限/套餐)且版本号是具体数字
1207
+ - [ ] `验收 Checklist` 4 类各 ≥1 条,无模糊词
1208
+ 验证:`grep -E "正常|良好|合适|可以" {file}` 在 checklist 段命中 0 次
1209
+ - [ ] 触发"排障速查"条件 → 必有该章节,每条排查方向引用 ≥2 个 slice id
1210
+
1211
+ ### 形态 A 专属 DoD
1212
+
1213
+ - [ ] 所有 slice 都"少一个就不成立"(写在 PR 描述)
1214
+ - [ ] `能力展示` 末尾"接下来开始集成"原话保留(topic 路由所需)
1215
+
1216
+ ### 形态 B 专属 DoD
1217
+
1218
+ - [ ] P0 ≥ 2 条,每条都"少一个就开不了机/进不了场"
1219
+ - [ ] P1 ≥ 2 条,每条都标注"推荐默认勾选:是/否"
1220
+ - [ ] AskUserQuestion 选项表完整(选项 / label / 写入 session 三列)
1221
+
1222
+ ### 形态 B-多选专属 DoD
1223
+
1224
+ - [ ] 必装骨架 ≥ 2 条,可选模块 ≥ 3 条
1225
+ - [ ] 「执行规则」段落必含 6 条规则(预勾选/展示/提问/写入/未选不出现/兼容)
1226
+ - [ ] 「执行规则」明文出现"未选中模块绝不进 `confirmed_plan`"或等价句
1227
+ 验证:`grep -E "未选中.*绝不进|未选中.*不得" {file}` 命中 ≥1
1228
+ - [ ] 给出 ≥1 个真实"用户输入 → 预勾选结果"映射示例
221
1229
 
222
1230
  ---
223
1231
 
224
- ## 六、模板骨架
1232
+ ## 七、模板骨架
225
1233
 
226
- ### A 形态模板(单一完整能力)
1234
+ ### A 形态模板(单一完整能力)
1235
+ ### A 形态模板(单一完整能力)
227
1236
 
228
- 适合:1v1-video-call、entertainment-live-room 等场景所有 slice 缺一不可的情况。
1237
+ 适合:1v1-video-call、entertainment-live-room 等场景所有 slice 缺一不可的情况。
1238
+ 适合:1v1-video-call、entertainment-live-room 等场景所有 slice 缺一不可的情况。
229
1239
 
230
1240
  ```markdown
231
- # {场景中文名}{scenario-id}
1241
+ # {场景中文名}({scenario-id})
1242
+ # {场景中文名}({scenario-id})
232
1243
 
233
1244
  ## 场景概述
234
1245
 
235
- {2-4 行散文}
1246
+ {2-4 行散文,含 ≥2 个具体业务例子 + ≥1 个边界划分}
1247
+ {2-4 行散文,含 ≥2 个具体业务例子 + ≥1 个边界划分}
236
1248
 
237
1249
  ## 能力清单
238
1250
 
@@ -244,7 +1256,8 @@ topic Step 1.5 会识别这种章节并按「执行规则」走,而不是把整
244
1256
 
245
1257
  ### 展示文案
246
1258
 
247
- 我帮你定位到「{场景中文名}」场景,包含以下 {总数} 项能力:
1259
+ 我帮你定位到「{场景中文名}」场景,包含以下 {总数} 项能力:
1260
+ 我帮你定位到「{场景中文名}」场景,包含以下 {总数} 项能力:
248
1261
 
249
1262
  • {slice 1 中文名} (`{slice id}`)
250
1263
  • {slice 2 中文名} (`{slice id}`)
@@ -254,27 +1267,57 @@ topic Step 1.5 会识别这种章节并按「执行规则」走,而不是把整
254
1267
 
255
1268
  ## 前置条件
256
1269
 
257
- - {条件 1}
258
- - {条件 2}
1270
+ - 已开通 {产品名} 服务并获取 {凭证}
1271
+ - {平台} SDK 版本 ≥ {version}
1272
+ - {权限 / 配置}
1273
+ - {套餐 / 白名单}
1274
+ - 已开通 {产品名} 服务并获取 {凭证}
1275
+ - {平台} SDK 版本 ≥ {version}
1276
+ - {权限 / 配置}
1277
+ - {套餐 / 白名单}
259
1278
 
260
1279
  ## 验收 Checklist
261
1280
 
262
- - [ ] {验收点 1}
263
- - [ ] {验收点 2}
1281
+ ### 基础联通
1282
+ - [ ] {联通项 1}
1283
+
1284
+ ### 核心流程
1285
+ - [ ] {核心动作 1}
1286
+
1287
+ ### 异常处理
1288
+ - [ ] {异常分支 1}
1289
+
1290
+ ### 业务行为
1291
+ - [ ] {业务正确性 1}
1292
+ ### 基础联通
1293
+ - [ ] {联通项 1}
1294
+
1295
+ ### 核心流程
1296
+ - [ ] {核心动作 1}
1297
+
1298
+ ### 异常处理
1299
+ - [ ] {异常分支 1}
1300
+
1301
+ ### 业务行为
1302
+ - [ ] {业务正确性 1}
264
1303
 
265
1304
  ## 排障速查
266
1305
 
267
1306
  | 症状 | 可能原因 | 排查方向 |
268
1307
  |---|---|---|
269
- | {症状 1} | {原因} | {slice / 配置项} |
1308
+ | {症状 1} | {原因} | {引用 ≥2 个 slice id} |
1309
+ | {症状 1} | {原因} | {引用 ≥2 个 slice id} |
270
1310
  ```
271
1311
 
272
- ### B 形态模板(主链路 + 可选增强)
1312
+ ### B 形态模板(主链路 + 可选增强,二选一)
1313
+ ### B 形态模板(主链路 + 可选增强,二选一)
273
1314
 
274
- 适合:general-conference、协作工具等有清晰 P0/P1 边界的场景。
1315
+ 适合:有清晰 P0/P1 边界、增强项可整体作为"完整版"打包的场景。
1316
+ 适合:有清晰 P0/P1 边界、增强项可整体作为"完整版"打包的场景。
275
1317
 
276
1318
  ```markdown
277
- # {场景中文名}{scenario-id}
1319
+ # {场景中文名}({scenario-id})
1320
+ # {场景中文名}({scenario-id})
278
1321
 
279
1322
  ## 场景概述
280
1323
 
@@ -282,36 +1325,46 @@ topic Step 1.5 会识别这种章节并按「执行规则」走,而不是把整
282
1325
 
283
1326
  ## 能力分层
284
1327
 
285
- ### P0 主链路(必装)
1328
+ ### P0 主链路(必装)
1329
+ ### P0 主链路(必装)
286
1330
 
287
1331
  - `{product}/{slice-id-1}` —— {一句话}
288
1332
  - `{product}/{slice-id-2}` —— {一句话}
289
1333
 
290
- ### P1 常见增强(可选)
1334
+ ### P1 常见增强(可选)
1335
+ ### P1 常见增强(可选)
291
1336
 
292
1337
  - `{product}/{slice-id-3}` —— {一句话}
293
- - 推荐默认勾选:是
1338
+ - 推荐默认勾选:是
1339
+ - 推荐默认勾选:是
294
1340
  - `{product}/{slice-id-4}` —— {一句话}
295
- - 推荐默认勾选:否
1341
+ - 推荐默认勾选:否
1342
+ - 推荐默认勾选:否
296
1343
 
297
1344
  ## 能力展示与 coverage 选择
298
1345
 
299
1346
  ### 展示文案
300
1347
 
301
- 我帮你定位到「{场景中文名}」场景,包含以下能力:
1348
+ 我帮你定位到「{场景中文名}」场景,包含以下能力:
1349
+ 我帮你定位到「{场景中文名}」场景,包含以下能力:
302
1350
 
303
- 📋 主链路(必装,{P0 count} 项)
1351
+ 📋 主链路(必装,{P0 count} 项)
1352
+ 📋 主链路(必装,{P0 count} 项)
304
1353
  • {P0 slice 1 中文名} (`{slice id}`)
305
1354
  • ...
306
1355
 
307
- 增强能力(可选,{P1 count} 项)
1356
+ 增强能力(可选,{P1 count} 项)
1357
+ ➕ 增强能力(可选,{P1 count} 项)
308
1358
  • {P1 slice 1 中文名} (`{slice id}`) ✓
309
1359
  • {P1 slice 2 中文名} (`{slice id}`)
310
1360
  • ...
311
1361
 
312
- 集成哪种?
313
- 1) 主链路(最快,开箱可用基础{场景类型}
314
- 2) 完整版(含全部 {总数} 项能力,推荐)
1362
+ 集成哪种?
1363
+ 1) 主链路(最快,开箱可用基础{场景类型})
1364
+ 2) 完整版(含全部 {总数} 项能力,推荐)
1365
+ 集成哪种?
1366
+ 1) 主链路(最快,开箱可用基础{场景类型})
1367
+ 2) 完整版(含全部 {总数} 项能力,推荐)
315
1368
 
316
1369
  ### AskUserQuestion 选项
317
1370
 
@@ -322,29 +1375,177 @@ topic Step 1.5 会识别这种章节并按「执行规则」走,而不是把整
322
1375
 
323
1376
  ## 前置条件
324
1377
 
325
- - {条件 1}
326
- - {条件 2}
1378
+ { A 形态}
327
1379
 
328
1380
  ## 验收 Checklist
329
1381
 
330
- - [ ] {验收点 1}
331
- - [ ] {验收点 2}
1382
+ {同 A 形态,4 类齐全}
332
1383
 
333
1384
  ## 排障速查
334
1385
 
335
- | 症状 | 可能原因 | 排查方向 |
336
- |---|---|---|
337
- | {症状 1} | {原因} | {slice / 配置项} |
1386
+ {同 A 形态}
1387
+ ```
1388
+
1389
+ ### B-多选模板(必装骨架 + 可选模块多选)
1390
+
1391
+ 适合:可选项彼此独立、不应默认全装的场景(如通用会议)。
1392
+
1393
+ ```markdown
1394
+ # {场景中文名}({scenario-id})
1395
+
1396
+ ## 场景概述
1397
+
1398
+ {2-4 行散文}
1399
+
1400
+ ## 能力分层
1401
+
1402
+ ### 必装骨架(always on)
1403
+
1404
+ - `{product}/{skeleton-slice-1}` —— {一句话}
1405
+ - `{product}/{skeleton-slice-2}` —— {一句话}
1406
+
1407
+ ### 可选模块(用户多选)
1408
+
1409
+ - `{product}/{optional-slice-1}` —— {一句话}
1410
+ - `{product}/{optional-slice-2}` —— {一句话}
1411
+ - ...
1412
+
1413
+ ## 能力展示与 coverage 选择
1414
+
1415
+ ### 必装骨架(always on,不向用户提问)
1416
+ - `{product}/{skeleton-slice-1}` —— ...
1417
+ - `{product}/{skeleton-slice-2}` —— ...
1418
+
1419
+ ### 可选模块(多选,默认只勾选命中用户需求的项)
1420
+ - `{product}/{optional-slice-1}` —— ...
1421
+ - `{product}/{optional-slice-2}` —— ...
1422
+ - ...
1423
+
1424
+ ### 执行规则(topic 必须遵守)
1425
+
1426
+ 1. 预勾选 = 仅命中 `target_features` / 原始 prompt 关键词的可选模块;
1427
+ 其余默认不勾。
1428
+ 2. 展示文案(说明骨架默认装 + 已识别到的增强项)。
1429
+ 3. AskUserQuestion 多选(超 4 项分组拆问)。
1430
+ 4. 写 `confirmed_plan = 必装骨架 + 选中模块`(唯一下游真源)。
1431
+ 5. 未选中的模块**绝不进** `confirmed_plan`,代码里也不得顺手生成。
1432
+ 6. `enhancement_level` 仅兼容:全选 → complete,否则 → minimal。
1433
+
1434
+ ### 预勾选示例
1435
+ - 用户输入 "{真实例 1}" → 预勾选 {模块 A}、{模块 B}
1436
+ - 用户输入 "{真实例 2}" → 预勾选 {模块 C}
1437
+
1438
+ ## 前置条件
1439
+
1440
+ {同 A 形态}
1441
+ {同 A 形态}
1442
+
1443
+ ## 验收 Checklist
1444
+
1445
+ {同 A 形态,4 类齐全}
1446
+
1447
+ ## 排障速查
1448
+
1449
+ {同 A 形态}
1450
+ ```
1451
+
1452
+ ### B-多选模板(必装骨架 + 可选模块多选)
1453
+
1454
+ 适合:可选项彼此独立、不应默认全装的场景(如通用会议)。
1455
+
1456
+ ```markdown
1457
+ # {场景中文名}({scenario-id})
1458
+
1459
+ ## 场景概述
1460
+
1461
+ {2-4 行散文}
1462
+
1463
+ ## 能力分层
1464
+
1465
+ ### 必装骨架(always on)
1466
+
1467
+ - `{product}/{skeleton-slice-1}` —— {一句话}
1468
+ - `{product}/{skeleton-slice-2}` —— {一句话}
1469
+
1470
+ ### 可选模块(用户多选)
1471
+
1472
+ - `{product}/{optional-slice-1}` —— {一句话}
1473
+ - `{product}/{optional-slice-2}` —— {一句话}
1474
+ - ...
1475
+
1476
+ ## 能力展示与 coverage 选择
1477
+
1478
+ ### 必装骨架(always on,不向用户提问)
1479
+ - `{product}/{skeleton-slice-1}` —— ...
1480
+ - `{product}/{skeleton-slice-2}` —— ...
1481
+
1482
+ ### 可选模块(多选,默认只勾选命中用户需求的项)
1483
+ - `{product}/{optional-slice-1}` —— ...
1484
+ - `{product}/{optional-slice-2}` —— ...
1485
+ - ...
1486
+
1487
+ ### 执行规则(topic 必须遵守)
1488
+
1489
+ 1. 预勾选 = 仅命中 `target_features` / 原始 prompt 关键词的可选模块;
1490
+ 其余默认不勾。
1491
+ 2. 展示文案(说明骨架默认装 + 已识别到的增强项)。
1492
+ 3. AskUserQuestion 多选(超 4 项分组拆问)。
1493
+ 4. 写 `confirmed_plan = 必装骨架 + 选中模块`(唯一下游真源)。
1494
+ 5. 未选中的模块**绝不进** `confirmed_plan`,代码里也不得顺手生成。
1495
+ 6. `enhancement_level` 仅兼容:全选 → complete,否则 → minimal。
1496
+
1497
+ ### 预勾选示例
1498
+ - 用户输入 "{真实例 1}" → 预勾选 {模块 A}、{模块 B}
1499
+ - 用户输入 "{真实例 2}" → 预勾选 {模块 C}
1500
+
1501
+ ## 前置条件
1502
+
1503
+ {同 A 形态}
1504
+
1505
+ ## 验收 Checklist
1506
+
1507
+ {同 A 形态}
1508
+ {同 A 形态}
1509
+
1510
+ ## 排障速查
1511
+
1512
+ {同 A 形态}
1513
+ {同 A 形态}
338
1514
  ```
339
1515
 
340
1516
  ---
341
1517
 
342
- ## 七、对老文件的迁移建议
1518
+ ## 八、对老文件的迁移建议
1519
+ ## 八、对老文件的迁移建议
1520
+
1521
+ 老文件不强制立刻按 spec 重写。建议路径:
1522
+ 老文件不强制立刻按 spec 重写。建议路径:
1523
+
1524
+ 1. **`general-conference.md`** → 走 B 形态(B-多选)。原文已有"P0 默认会议骨架 / P1 按需补命中"结构,只需补「能力展示与 coverage 选择(多选变体)」「验收 Checklist」两节,其他内容可移到「设计取舍」可选章节。
1525
+ 1. **`general-conference.md`** → 走 B 形态(B-多选)。原文已有"P0 默认会议骨架 / P1 按需补命中"结构,只需补「能力展示与 coverage 选择(多选变体)」「验收 Checklist」两节,其他内容可移到「设计取舍」可选章节。
1526
+
1527
+ 2. **`entertainment-live-room.md`** → 走 A 形态。原文按"主播端流程 / 观众端流程 / 阶段一 / 阶段二"组织,先按 spec 改为「能力清单」「能力展示」+ 验收 Checklist;流程描述可保留为「子场景命中差异」可选章节。
1528
+ 2. **`entertainment-live-room.md`** → 走 A 形态。原文按"主播端流程 / 观众端流程 / 阶段一 / 阶段二"组织,先按 spec 改为「能力清单」「能力展示」+ 验收 Checklist;流程描述可保留为「子场景命中差异」可选章节。
1529
+
1530
+ 3. **新建场景** → 直接走 spec,按形态选 A / B / B-多选模板。
343
1531
 
344
- 老文件不强制立刻按 spec 重写。建议路径:
1532
+ ---
1533
+
1534
+ ## 附录:验证脚本清单
1535
+
1536
+ 本 spec 引用的所有 `python scripts/xxx.py` 必须真实存在,否则三件套是空头支票。
1537
+
1538
+ | 脚本 | 作用 |
1539
+ |------|------|
1540
+ | `validate_scenario.py` | 检查 slice id 一致性 + 形态字段完整 + B-多选明文声明 |
1541
+ 3. **新建场景** → 直接走 spec,按形态选 A / B / B-多选模板。
1542
+
1543
+ ---
345
1544
 
346
- 1. **`general-conference.md`** → 走 B 形态。原文里已有"P0 默认会议骨架 / P1 按需补命中"分层结构,只需补「能力展示与 coverage 选择」「验收 Checklist」两节,其他内容可移到「设计取舍」可选章节。
1545
+ ## 附录:验证脚本清单
347
1546
 
348
- 2. **`entertainment-live-room.md`** A 形态。原文按"主播端流程 / 观众端流程 / 阶段一 / 阶段二"组织,先按 spec 改为「能力清单」「能力展示」+ 验收 Checklist;流程描述可保留为「子场景命中差异」可选章节。
1547
+ spec 引用的所有 `python scripts/xxx.py` 必须真实存在,否则三件套是空头支票。
349
1548
 
350
- 3. **新建场景** 直接走 spec,按形态选 A 或 B 模板。
1549
+ | 脚本 | 作用 |
1550
+ |------|------|
1551
+ | `validate_scenario.py` | 检查 slice id 一致性 + 形态字段完整 + B-多选明文声明 |