@sokeai/cli 1.0.75 → 1.0.77

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 (124) hide show
  1. package/README.md +7 -7
  2. package/package.json +1 -1
  3. package/scripts/build-binaries.sh +1 -1
  4. package/scripts/e2e-test.sh +75 -3
  5. package/skills/SKILL.md +18 -1
  6. package/skills/soke-ai-coach-director/CHANGELOG.md +203 -0
  7. package/skills/soke-ai-coach-director/README.md +123 -0
  8. package/skills/soke-ai-coach-director/SKILL.md +221 -0
  9. package/skills/soke-ai-coach-director/coaching/knowledge-packager/knowledge-packager.md +91 -0
  10. package/skills/soke-ai-coach-director/coaching/prompt-engineer/parts/part2-roles.md +97 -0
  11. package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-engineer/parts/part3-flow.md +3 -3
  12. package/skills/soke-ai-coach-director/coaching/prompt-engineer/prompt-engineer.md +76 -0
  13. package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-optimizer/prompt-optimizer.md +77 -58
  14. package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/workbuddy.md +2 -3
  15. package/skills/soke-ai-coach-director/platform/interaction.md +103 -0
  16. package/skills/{ai-coach-director → soke-ai-coach-director}/platform/publish-gate.md +3 -3
  17. package/skills/{ai-coach-director → soke-ai-coach-director}/platform/resource-finalizer.md +10 -35
  18. package/skills/{ai-coach-director → soke-ai-coach-director}/platform/soke-ai-training/soke-ai-training.md +33 -3
  19. package/skills/soke-ai-coach-director/platform/sync-engine.md +39 -0
  20. package/skills/{ai-coach-director → soke-ai-coach-director}/references/change-log-partwise-refactor.md +1 -1
  21. package/skills/soke-ai-coach-director/references/env-check.md +146 -0
  22. package/skills/soke-ai-coach-director/references/exec-common.md +126 -0
  23. package/skills/soke-ai-coach-director/references/exec-handbook.md +621 -0
  24. package/skills/soke-ai-coach-director/references/exec-part1.md +86 -0
  25. package/skills/soke-ai-coach-director/references/exec-part2.md +145 -0
  26. package/skills/soke-ai-coach-director/references/exec-part3.md +91 -0
  27. package/skills/soke-ai-coach-director/references/exec-part4.md +187 -0
  28. package/skills/soke-ai-coach-director/references/gate-check-matrix.md +46 -0
  29. package/skills/soke-ai-coach-director/references/micro-tune-labels.md +30 -0
  30. package/skills/soke-ai-coach-director/references/platform-api-pitfalls.md +49 -0
  31. package/skills/soke-ai-coach-director/references/role-resource-matching.md +45 -0
  32. package/skills/{ai-coach-director → soke-ai-coach-director}/references/self-improvement-examples.md +2 -0
  33. package/skills/soke-ai-coach-director/references/self-learning-engine.md +489 -0
  34. package/skills/soke-ai-coach-director/references/subs/part1/SOP.md +17 -0
  35. package/skills/soke-ai-coach-director/references/subs/part2/SOP.md +34 -0
  36. package/skills/soke-ai-coach-director/references/subs/part3/SOP.md +27 -0
  37. package/skills/soke-ai-coach-director/references/subs/part4/SOP.md +31 -0
  38. package/skills/soke-ai-coach-director/references/subs/publish/SOP.md +81 -0
  39. package/skills/soke-ai-coach-director/references/subs/tune/SOP.md +92 -0
  40. package/skills/soke-ai-coach-director/references/verified-cli-cheatsheet.md +56 -0
  41. package/skills/{ai-coach-director → soke-ai-coach-director}/scripts/activator.sh +0 -0
  42. package/skills/{ai-coach-director → soke-ai-coach-director}/scripts/error-detector.sh +0 -0
  43. package/skills/{ai-coach-director → soke-ai-coach-director}/scripts/extract-skill.sh +0 -0
  44. package/skills/soke-ai-coach-director/scripts/gate_check.py +112 -0
  45. package/skills/soke-ai-coach-director/scripts/validate_operations.py +403 -0
  46. package/skills/soke-certificate/SKILL.md +717 -0
  47. package/skills/soke-course/README.md +12 -2
  48. package/skills/soke-course/SKILL.md +12 -10
  49. package/skills/soke-course/references/course-list-courses.md +49 -84
  50. package/skills/soke-course/references/intent-cases.md +8 -8
  51. package/skills/soke-course/references/sop-full-workflow.md +11 -6
  52. package/skills/soke-course/references/sop-publish-check.md +3 -1
  53. package/skills/soke-course/references/subs/publish/SOP.md +34 -4
  54. package/skills/soke-course/references/subs/query/SOP.md +9 -7
  55. package/skills/soke-course/references/subs/settings/SOP.md +87 -25
  56. package/skills/soke-exam-question-pool/SKILL.md +80 -112
  57. package/skills/soke-task/SKILL.md +32 -10
  58. package/skills/soke-training-demand/SKILL.md +150 -43
  59. package/skills/ai-coach-director/SKILL.md +0 -1563
  60. package/skills/ai-coach-director/coaching/prompt-engineer/parts/part2-roles.md +0 -317
  61. package/skills/ai-coach-director/coaching/prompt-engineer/prompt-engineer.md +0 -244
  62. package/skills/ai-coach-director/platform/interaction.md +0 -315
  63. package/skills/ai-coach-director/platform/sync-engine.md +0 -1101
  64. package/skills/ai-coach-director/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277_/346/240/207/345/207/206/347/237/245/350/257/206/345/272/223.md +0 -199
  65. package/skills/ai-coach-director/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277/347/237/245/350/257/206/345/272/223.md +0 -388
  66. package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/tuv-knowledge-base.md +0 -125
  67. package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/tuv-p03-first-call-scenario-prompt.md +0 -428
  68. package/skills/ai-coach-director/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204P03/351/231/252/347/273/203/346/211/247/350/241/214/346/226/271/346/241/210_20260610.md +0 -225
  69. package/skills/ai-coach-director/references/cases/create//346/237/220/345/234/260/346/226/271/351/223/266/350/241/214//346/237/220/345/234/260/346/226/271/351/223/266/350/241/214/345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277AI/351/231/252/347/273/203/346/265/213/350/257/225/347/224/250/344/276/213/345/220/210/351/233/206.md +0 -525
  70. package/skills/ai-coach-director/references/cases/create//347/211/251/346/265/201/350/241/214/344/270/232//347/211/251/346/265/201/350/241/214/344/270/232-/345/210/235/346/254/241/346/213/234/350/256/277/351/246/231/347/262/276/351/246/231/346/226/231/345/256/242/346/210/267.md +0 -146
  71. package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2061_/346/226/260/345/223/201/346/216/250/351/224/200_20260701.md +0 -230
  72. package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2062_/345/202/254/350/217/234/345/256/211/346/212/232_20260701.md +0 -257
  73. package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203_/346/240/207/346/235/2063_/345/267/256/350/257/204/345/233/236/350/256/277_20260701.md +0 -259
  74. package/skills/ai-coach-director/references/cases/create//351/205/222/345/272/227/351/244/220/351/245/256//351/205/222/345/272/227/351/244/220/351/245/256AI/351/231/252/347/273/203/345/234/272/346/231/257/346/226/271/346/241/210_20260701.md +0 -452
  75. package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/345/256/242/346/210/267/347/241/256/350/256/244/345/217/215/351/246/210/350/241/250.md +0 -133
  76. package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215_v1.md +0 -333
  77. package/skills/ai-coach-director/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215_v2_Part1-Part5.md +0 -649
  78. package/skills/ai-coach-director/references/env-check.md +0 -167
  79. package/skills/ai-coach-director/references/platform-api-pitfalls.md +0 -232
  80. package/skills/ai-coach-director/references/role-resource-matching.md +0 -349
  81. package/skills/ai-coach-director/references/verified-cli-cheatsheet.md +0 -203
  82. /package/skills/{ai-coach-director → soke-ai-coach-director}/assets/ERRORS-TEMPLATE.md +0 -0
  83. /package/skills/{ai-coach-director → soke-ai-coach-director}/assets/FEATURE_REQUESTS-TEMPLATE.md +0 -0
  84. /package/skills/{ai-coach-director → soke-ai-coach-director}/assets/LEARNINGS-TEMPLATE.md +0 -0
  85. /package/skills/{ai-coach-director → soke-ai-coach-director}/assets/SKILL-TEMPLATE.md +0 -0
  86. /package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-engineer/parts/part1-basic.md +0 -0
  87. /package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-engineer/parts/part4-scoring.md +0 -0
  88. /package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/prompt-engineer/parts/part5-constraints.md +0 -0
  89. /package/skills/{ai-coach-director → soke-ai-coach-director}/coaching/role-profiler/role-profiler.md +0 -0
  90. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/README.md +0 -0
  91. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/qclaw.md +0 -0
  92. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/wukong.md +0 -0
  93. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/adapters/zework.md +0 -0
  94. /package/skills/{ai-coach-director → soke-ai-coach-director}/platform/api-fallback.md +0 -0
  95. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/345/256/242/346/210/267/350/247/222/350/211/262/346/250/241/346/235/277/345/272/223.md" +0 -0
  96. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203Bad Case/346/240/267/346/234/254/345/272/223.md" +0 -0
  97. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/345/210/233/345/273/272/351/227/256/351/242/230/345/272/223.md" +0 -0
  98. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/345/234/272/346/231/257/345/210/206/347/261/273/345/272/223.md" +0 -0
  99. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/345/256/242/346/210/267/346/235/220/346/226/231/346/270/205/345/215/225/344/270/216/350/256/277/350/260/210/351/242/230/345/272/223.md" +0 -0
  100. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/345/276/256/350/260/203/351/227/256/351/242/230/345/272/223.md" +0 -0
  101. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/346/212/200/346/234/257/350/276/271/347/225/214/344/270/216/346/216/222/351/232/234/345/272/223.md" +0 -0
  102. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215/346/250/241/345/235/227/345/272/223.md" +0 -0
  103. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/346/225/260/346/215/256/346/214/207/346/240/207/344/270/216/347/234/213/346/235/277/345/217/243/345/276/204/345/272/223.md" +0 -0
  104. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/346/265/213/350/257/225/347/224/250/344/276/213/345/272/223.md" +0 -0
  105. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/350/257/204/345/210/206/346/240/207/345/207/206/347/273/204/344/273/266/345/272/223.md" +0 -0
  106. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/231/252/347/273/203/351/241/271/347/233/256/346/241/210/344/276/213/345/244/215/347/233/230/345/272/223.md" +0 -0
  107. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/AI/351/241/276/345/256/242/350/247/222/350/211/262/346/250/241/346/213/237_GoodCase_BadCase_20260701.md" +0 -0
  108. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/224/265/350/257/235/347/272/246/350/256/277//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/345/256/242/346/210/267/346/235/220/346/226/231/346/261/207/346/200/273_2026-05-19_1341.md" +0 -0
  109. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267/347/237/245/350/257/206/345/272/223/347/224/237/346/210/220_20260615.md" +0 -0
  110. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267//346/226/260/350/203/275/346/272/220/350/275/246/344/270/273/350/264/267/351/231/252/347/273/203/346/217/220/347/244/272/350/257/215/347/224/237/346/210/220_20260615.md" +0 -0
  111. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204//346/237/220/345/233/275/351/231/205/346/243/200/346/265/213/346/234/272/346/236/204/351/231/252/347/273/203/346/211/247/350/241/214/346/226/271/346/241/210/344/272/244/344/273/230/350/256/260/345/275/225_20260610.md" +0 -0
  112. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/create//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206//351/231/214/346/213/234/344/277/241/346/201/257/346/224/266/351/233/206_/346/217/220/347/244/272/350/257/215/346/220/255/345/273/272_20260622.md" +0 -0
  113. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_V1.1_20260616.md" +0 -0
  114. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_V1.2_20260616.md" +0 -0
  115. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215_/345/216/213/347/274/251/347/211/210_V2.0_20260616.md" +0 -0
  116. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/347/263/273/345/210/227//344/274/201/344/270/232/345/256/266/347/216/213/346/200/273/346/217/220/347/244/272/350/257/215/344/274/230/345/214/226_20260616.md" +0 -0
  117. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277AI/351/231/252/347/273/203/347/263/273/347/273/237_/346/265/213/350/257/225/345/217/215/351/246/210/346/261/207/346/200/273_2026-06-01.md" +0 -0
  118. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277KYC/344/277/241/344/273/273/345/200/274/347/246/201/344/273/244_2026-06-09_0932.md" +0 -0
  119. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277KYC/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v2_20260608.md" +0 -0
  120. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v1.1.md" +0 -0
  121. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215_/344/274/230/345/214/226/347/211/210_v1.2.md" +0 -0
  122. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases/micro-tune//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/347/263/273/345/210/227//345/206/234/346/210/267/345/274/240/350/200/201/346/235/277/346/217/220/347/244/272/350/257/215/344/274/230/345/214/226_V2_/350/257/212/346/226/255/344/272/244/344/273/230_20260609.md" +0 -0
  123. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases//345/233/233/345/244/247/345/234/272/346/231/257_GoodCase_BadCase_20260701.md" +0 -0
  124. /package/skills/{ai-coach-director → soke-ai-coach-director}/references/cases//346/241/210/344/276/213/345/272/223/350/241/245/345/205/205_2026-06-24.md" +0 -0
@@ -0,0 +1,86 @@
1
+ # Part1 · 基础信息(创建场景)
2
+
3
+ > v2.41 从 exec-handbook.md 拆分。通用约束见 `exec-common.md`。
4
+
5
+ ---
6
+
7
+ ## 必做操作清单
8
+
9
+ | # | 操作 | CLI 命令 | 产物 |
10
+ |---|------|---------|------|
11
+ | 1 | 创建场景 | `soke-cli +create-scenario --request-file /tmp/part1.json` | `scenario_id` |
12
+ | 2 | 回读验证 | `soke-cli +get-scenario --scenario-id <id>` | name/description/key_points/tags 一致 |
13
+
14
+ > Part1 走**创建链路**,不是 preview/apply 更新链路。没有 operations 数组。
15
+
16
+ ---
17
+
18
+ ## 完整 JSON 模板(part1-create.json)
19
+
20
+ ```json
21
+ {
22
+ "name": "<场景名称,1-100 字符>",
23
+ "description": "<场景描述全文,完整搬运不缩略>",
24
+ "tags": ["标签1", "标签2", "标签3"],
25
+ "key_points": "1) 考核点1;2) 考核点2;3) 考核点3",
26
+ "scene_lang": "简体中文",
27
+ "scenario_cover": "https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png"
28
+ }
29
+ ```
30
+
31
+ ### 字段硬规则
32
+
33
+ | 字段 | 类型 | 固定值/约束 | 高频错误 |
34
+ |------|------|------------|---------|
35
+ | `name` | string | 1-100 字符,≤15 字推荐 | 空字符串 |
36
+ | `description` | string | Part1 场景描述全文,禁缩略 | 只写首句摘要 |
37
+ | `tags` | string[] | 3-5 个数组元素 | ❌ 逗号分隔字符串 |
38
+ | `key_points` | **string** | 多条用分号/编号拼成**单字符串** | ❌ 写成数组(平台会接受但字段为空) |
39
+ | `scene_lang` | string | 固定 `"简体中文"`(永不随场景变) | ❌ `"zh-CN"` / `"中文"` |
40
+ | `scenario_cover` | string | 固定默认图 URL | ❌ 占位/本地路径 |
41
+
42
+ ---
43
+
44
+ ## 提交前断言
45
+
46
+ ```python
47
+ assert isinstance(data["name"], str) and 1 <= len(data["name"]) <= 100
48
+ assert isinstance(data["description"], str) and len(data["description"]) >= 20
49
+ assert isinstance(data["tags"], list) and 3 <= len(data["tags"]) <= 5
50
+ assert isinstance(data["key_points"], str) and len(data["key_points"]) > 0
51
+ assert data["scene_lang"] == "简体中文"
52
+ assert data["scenario_cover"] == "https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png"
53
+ ```
54
+
55
+ ---
56
+
57
+ ## 反面案例
58
+
59
+ ```json
60
+ ❌ 案例 A:key_points 写成数组(平台接受但字段为空)
61
+ { "key_points": ["快速吸引", "精准推介", "展后跟进"] }
62
+
63
+ ❌ 案例 B:tags 写成逗号分隔字符串
64
+ { "tags": "展会拓客,B2B销售,快速识别" }
65
+
66
+ ❌ 案例 C:scene_lang 写成 zh-CN
67
+ { "scene_lang": "zh-CN" }
68
+
69
+ ❌ 案例 D:封面留空或写占位 URL
70
+ { "scenario_cover": "" }
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 创建后回读校验
76
+
77
+ ```python
78
+ assert result["name"] == part1_create["name"]
79
+ assert result["description"] == part1_create["description"]
80
+ assert result["tags"] == part1_create["tags"]
81
+ assert result["key_points"] == part1_create["key_points"]
82
+ assert result["scenario_id"] not in (None, "")
83
+ ```
84
+
85
+ - `scenario_id` 为空 → 视为创建失败,**禁止进入 Part2**
86
+ - `key_points` 回读为空 → 检查 part1-create.json 是否误写成数组
@@ -0,0 +1,145 @@
1
+ # Part2 · AI 角色设定(双操作同步锁)
2
+
3
+ > v2.41 从 exec-handbook.md 拆分。通用约束见 `exec-common.md`。
4
+
5
+ ---
6
+
7
+ ## 必做操作清单
8
+
9
+ | # | operation.type | 作用 | 不可省略 |
10
+ |---|---------------|------|---------|
11
+ | 1 | `update_basic` | 写入 OS 整体设定 A1-A7 全文到 `ai_roles_overall_description` | ✅ 遗漏会导致平台无 OS,角色退化为普通对话 |
12
+ | 2 | `replace_ai_roles` | 写入所有角色数据到 `ai_roles[]` | ✅ 遗漏会导致平台有 OS 无角色 |
13
+
14
+ **两操作必须全部 applied=true 才算 Part2 完成**。可在同一批 operations 数组提交(OS 在前、roles 在后),也可分两次 apply。
15
+
16
+ ---
17
+
18
+ ## OS(ai_roles_overall_description)写作结构(v2.42 内联,禁再读 part2-roles.md)
19
+
20
+ OS 是单字符串,≥500 字符,≤3000 字符。按以下 7 段顺序拼接(A1-A7),每段一个自然段:
21
+
22
+ ```
23
+ A1 核心身份:你是"高保真人类社交模拟器"兼"隐形考核官",扮演具复杂社会属性、非理性情绪的特定角色,抛弃"乐于助人"的 AI 出厂设置,通过真实对话考核学员的沟通/销售能力。
24
+
25
+ A2 动态状态机:回复前更新 Trust_Level(信任值0-100,<20冷淡/>80成交信号)、Patience_Gauge(耐心条随轮次衰减)、Fact_Anchoring(事实锚点严禁幻觉修改)。
26
+
27
+ A3 双层逻辑:理性真值(后台精确算计)→感性表述(前台拟人化),永远不要轻易痛快答应。
28
+
29
+ A4 行为规范:语言熵增(倒装/重复/断句/口语填充);心理防御(面子机制/逻辑谬误/信息非对称);禁AI式服务、禁格式化输出、禁事实漂移;学员说违规夸大词("绝对""100%")时触发信任崩塌反击。
30
+
31
+ A5 信息挤牙膏:开场只表达表层诉求,被问才透露深层信息;学员单次回复超100字时抓核心痛点重复质疑,但明确回答过的问题不能假装没听见。
32
+
33
+ A6 隐形考核:随机挖坑测试(故意说错数据)、施压测试(突变条件)。
34
+
35
+ A7 导演模式:死局/结束/输入"复盘"时跳出角色,以金牌导师身份复盘,格式【关键死因/成功点】【心理揭秘】【金样板话术】。
36
+ ```
37
+
38
+ 按场景材料填充每段细节(话术风格/行业背景/红线),但**结构必须保持 A1-A7 顺序**。
39
+
40
+ ---
41
+
42
+ ## 完整 JSON 模板(part2-operations.json)
43
+
44
+ ```json
45
+ [
46
+ {
47
+ "type": "update_basic",
48
+ "data": {
49
+ "ai_roles_overall_description": "<A1-A7 OS 全文,单字符串,≥500 字符,禁摘要/禁'参见 Part2'>"
50
+ }
51
+ },
52
+ {
53
+ "type": "replace_ai_roles",
54
+ "data": {
55
+ "roles": [
56
+ {
57
+ "scenario_role_id": "role_<角色短码>",
58
+ "customization_level": "full",
59
+ "is_custom_role": true,
60
+ "customized_fields": ["name", "description", "communication_style", "background", "personality_type", "personality", "tags", "knowledge_level", "taboos_objections", "avatar", "voice_id", "source_type"],
61
+ "template_id": null,
62
+ "template_name": null,
63
+ "template_version": null,
64
+ "role_data": {
65
+ "name": "<角色名>",
66
+ "description": "<角色描述>",
67
+ "communication_style": "<沟通风格>",
68
+ "background": "<四段深度画像全文:我是谁/我的困扰/我的过往经历/我今天的心态>",
69
+ "personality_type": "<MBTI 单值,如 ISFJ>",
70
+ "personality": "<性格描述>",
71
+ "tags": ["标签1", "标签2"],
72
+ "knowledge_level": ["小白"],
73
+ "taboos_objections": ["禁忌1", "禁忌2"],
74
+ "avatar": "<后台资源匹配的 URL,禁手工预设>",
75
+ "voice_id": "<后台资源匹配的 ID,禁手工预设>",
76
+ "source_type": "custom"
77
+ }
78
+ }
79
+ ]
80
+ }
81
+ }
82
+ ]
83
+ ```
84
+
85
+ ---
86
+
87
+ ## 字段硬规则
88
+
89
+ | 字段 | 类型 | 约束 |
90
+ |------|------|------|
91
+ | `ai_roles_overall_description` | string | ≥500 字符;A1-A7 全文拼接,不摘要 |
92
+ | `roles[]` | array | 非空,2-5 个角色 |
93
+ | `roles[].role_data.avatar/voice_id` | string | 后台 `+list-role-avatars/+list-role-voices` 匹配;**禁手工预设** |
94
+ | `roles[].role_data.knowledge_level` | string[] | 数组枚举(如 `["小白"]`),禁长句 |
95
+ | `roles[].role_data.tags` | string[] | 2-4 个 |
96
+ | `roles[].role_data.taboos_objections` | string[] | 列表项 |
97
+ | 外壳字段位置 | - | `customization_level/is_custom_role/customized_fields/scenario_role_id/template_id/template_name/template_version` 必须在 `role_data` **外层**;⚠️ `source_type` 例外——必须在 `role_data` **内**(`role_data.source_type="custom"`),外壳写 source_type 会触发"角色数据异常";⚠️ `created_at`/`updated_at` **禁传**——由平台自动生成,写字符串时间戳会触发"角色数据异常" |
98
+
99
+ ---
100
+
101
+ ## 提交前断言
102
+
103
+ ```python
104
+ op_os = next(o for o in operations if o["type"] == "update_basic")
105
+ os_text = op_os["data"]["ai_roles_overall_description"]
106
+ assert isinstance(os_text, str) and len(os_text) >= 500
107
+
108
+ op_roles = next(o for o in operations if o["type"] == "replace_ai_roles")
109
+ roles = op_roles["data"]["roles"]
110
+ assert isinstance(roles, list) and len(roles) >= 1
111
+ for r in roles:
112
+ for outer_key in ["scenario_role_id", "customization_level", "is_custom_role",
113
+ "customized_fields",
114
+ "template_id", "template_name", "template_version"]:
115
+ assert outer_key in r, f"缺少外壳字段: {outer_key}"
116
+ assert r["template_id"] is None and r["template_name"] is None and r["template_version"] is None
117
+ assert len(r["customized_fields"]) >= 10
118
+ assert "name" in r["customized_fields"]
119
+ assert "source_type" not in r
120
+ rd = r["role_data"]
121
+ assert rd["avatar"] and rd["voice_id"]
122
+ assert isinstance(rd["knowledge_level"], list)
123
+ assert rd.get("source_type") == "custom"
124
+ for shell_field in ["customization_level", "is_custom_role", "customized_fields",
125
+ "scenario_role_id", "created_at", "updated_at",
126
+ "template_id", "template_name", "template_version"]:
127
+ assert shell_field not in rd, f"{shell_field} 误入 role_data"
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 反面案例
133
+
134
+ ```json
135
+ ❌ 案例 A:遗漏操作 1(OS)—— 只提交 replace_ai_roles
136
+ → 平台 ai_roles_overall_description=null,角色无 OS 约束,行为退化为普通对话
137
+
138
+ ❌ 案例 B:外壳字段误放入 role_data
139
+ { "role_data": { "customization_level": "full", "name": "李晓琳" } }
140
+ → 平台报"角色数据异常",avatar/voice_id 均为空
141
+
142
+ ❌ 案例 C:avatar/voice_id 手工预设
143
+ { "role_data": { "avatar": "https://xxx placeholder.png" } }
144
+ → 应该由后台 +list-role-avatars 匹配
145
+ ```
@@ -0,0 +1,91 @@
1
+ # Part3 · 流程设置
2
+
3
+ > v2.41 从 exec-handbook.md 拆分。通用约束见 `exec-common.md`。
4
+
5
+ ---
6
+
7
+ ## 必做操作清单
8
+
9
+ | # | operation.type | 作用 |
10
+ |---|---------------|------|
11
+ | 1 | `update_basic` | 写入 `opening_dialogue`(开场语全文)+ `opening_dialogue_type: 1` |
12
+ | 2 | 每环节一个 `add_conversation_step` | 写入对话 SOP 环节 |
13
+
14
+ > 🔒 **原子性约束**:开场语 + 所有环节必须在**同一批 operations 数组的同一次 apply** 中提交,禁止拆分多次 apply。
15
+
16
+ ---
17
+
18
+ ## 完整 JSON 模板(part3-operations.json)
19
+
20
+ ```json
21
+ [
22
+ {
23
+ "type": "update_basic",
24
+ "data": {
25
+ "opening_dialogue": "<开场语完整原文>",
26
+ "opening_dialogue_type": 1
27
+ }
28
+ },
29
+ {
30
+ "type": "add_conversation_step",
31
+ "data": {
32
+ "step_name": "<环节名>",
33
+ "student_objective": "<学员目标,与 Part1 考核点一一对应>",
34
+ "ai_task": "<AI 任务,含 IF-THEN + 进入条件 + 角色行为 + 退出条件>",
35
+ "max_rounds": 5,
36
+ "sort_order": "1"
37
+ }
38
+ }
39
+ ]
40
+ ```
41
+
42
+ ---
43
+
44
+ ## 字段硬规则
45
+
46
+ | 字段 | 类型 | 约束 | 高频错误 |
47
+ |------|------|------|---------|
48
+ | `opening_dialogue_type` | **number** | 固定 `1`(整数,非字符串) | ❌ `"AI智能生成"` / `"1"` |
49
+ | `opening_dialogue` | string | 开场语完整原文 | ❌ 缩略 |
50
+ | `add_conversation_step.data.sort_order` | **string** | `"1"`、`"2"`(字符串) | ❌ 数字 1 |
51
+ | `ai_task` | string | 含 IF-THEN + 进入条件 + 角色行为 + 退出条件 | ❌ 缺 IF-THEN / 缺退出条件 |
52
+ | `max_rounds` | number | 整数 3-10 | ❌ 字符串 / 超范围 |
53
+
54
+ ---
55
+
56
+ ## 提交前断言
57
+
58
+ ```python
59
+ op_open = next(o for o in operations if o["type"] == "update_basic")
60
+ assert op_open["data"]["opening_dialogue_type"] == 1 # 数字,不是字符串
61
+ assert isinstance(op_open["data"]["opening_dialogue"], str) and len(op_open["data"]["opening_dialogue"]) > 20
62
+
63
+ steps = [o for o in operations if o["type"] == "add_conversation_step"]
64
+ assert 3 <= len(steps) <= 7
65
+ for i, s in enumerate(steps):
66
+ d = s["data"]
67
+ for k in ["step_name", "student_objective", "ai_task", "max_rounds", "sort_order"]:
68
+ assert d.get(k) not in (None, "", []), f"step{i} missing {k}"
69
+ assert isinstance(d["sort_order"], str), f"step{i} sort_order 必须是字符串"
70
+ assert isinstance(d["max_rounds"], int) and 3 <= d["max_rounds"] <= 10
71
+ assert "IF" in d["ai_task"].upper() and "退出" in d["ai_task"]
72
+ ```
73
+
74
+ ---
75
+
76
+ ## 反面案例
77
+
78
+ ```json
79
+ ❌ 案例 A:opening_dialogue_type 写字符串
80
+ { "opening_dialogue_type": "1" }
81
+ → 422 报错:opening_dialogue_type 必须是 1 或 2
82
+
83
+ ❌ 案例 B:sort_order 写数字
84
+ { "sort_order": 1 }
85
+ → 应该是 "1"(字符串)
86
+
87
+ ❌ 案例 C:拆分多次 apply(违反原子性)
88
+ 第 1 次 apply:只提交开场语
89
+ 第 2 次 apply:提交对话环节
90
+ → 违反原子性约束,应同一批 operations
91
+ ```
@@ -0,0 +1,187 @@
1
+ # Part4 · 评分标准(双层包装锁)+ Part5 合并应用(v2.43)
2
+
3
+ > v2.41 从 exec-handbook.md 拆分。通用约束见 `exec-common.md`。
4
+ > **v2.43 变更**:Part5 固定配置不再单独确认/apply——Part4 弹窗确认后,Part4+Part5 两个 operation **合并一批 apply**(part4-operations.json 数组含两个元素)。**exec-part5.md 已删除,Part5 全部规则并入本文件(v2.43.1)。**
5
+ > **展示规则**:聊天正文必须**完整展示 Part4 + Part5 两段**——Part4 展示维度名+权重+一票否决,紧接 Part5 用编号列表完整展示 6 项固定配置。**禁止把 Part5 压缩成一行摘要省略展示**。
6
+
7
+ ---
8
+
9
+ ## 必做操作清单
10
+
11
+ | # | operation.type | 作用 |
12
+ |---|---------------|------|
13
+ | 1 | `replace_scoring_criteria_config` | 写入评分标准(含 5 维度+权重+一票否决) |
14
+ | 2 | `update_basic`(Part5 固定配置,v2.43 并入同批) | 6 项固定值:min/max_practice_duration=0 / max_practice_attempts=10 / passing_score=60 / completion_rule="all_steps" / ai_assistance_enabled=true / pass_difficulty=2 |
15
+
16
+ **弹窗引导语**(≤2 行):`以上是 Part4 评分标准 + Part5 教练配置(6 项固定值),是否确认写入?`
17
+
18
+ **聊天正文展示模板**(Part4 之后紧接 Part5,编号列表,不可省略):
19
+
20
+ ```
21
+ **Part4 评分标准**(合计 100 分)
22
+ | 维度 | 权重 | 一票否决 |
23
+ |---|---|---|
24
+ | <维度1> | <w1> | 有/无 |
25
+ | ... | ... | ... |
26
+
27
+ **Part5 教练配置**(6 项固定值)
28
+ 1. 练习时长:不限
29
+ 2. 最大练习次数:10 次
30
+ 3. 通关分数:60 分
31
+ 4. 完成规则:全环节完成
32
+ 5. AI 辅助:开启
33
+ 6. 通关难度:2
34
+ ```
35
+
36
+ > ⚠️ **6 项固定配置禁按场景调整**(原 exec-part5.md 规则,v2.43.1 并入)。字段名以实际成功发布的版本为准。Part5 不再同步 `closing_dialogue` / `golden_dialogue_description` / `key_points`(这些已在 Part1/Part3 同步)。
37
+
38
+ ---
39
+
40
+ ## 完整 JSON 模板(part4-operations.json)
41
+
42
+ ```json
43
+ [
44
+ {
45
+ "type": "replace_scoring_criteria_config",
46
+ "data": {
47
+ "config": {
48
+ "customization_level": "full",
49
+ "is_custom_criteria": true,
50
+ "customized_fields": ["criteria_data"],
51
+ "scenario_criteria_id": "criteria_<场景短码>",
52
+ "criteria_data": {
53
+ "name": "<评分标准名称,8-20 字>",
54
+ "description": "<评分标准描述全文>",
55
+ "source_type": "enterprise",
56
+ "total_weight": 100,
57
+ "tags": ["标签1", "标签2"],
58
+ "dimensions": [
59
+ {
60
+ "id": "dim_<code>",
61
+ "code": "<英文 code>",
62
+ "name": "<维度名>",
63
+ "description": "<维度描述>",
64
+ "weight": 25,
65
+ "scoring_rule": "<评分规则全文,含一票否决嵌入末尾>",
66
+ "criteria": ["评分点1", "评分点2"],
67
+ "sort_order": 1
68
+ }
69
+ ]
70
+ }
71
+ }
72
+ }
73
+ },
74
+ {
75
+ "type": "update_basic",
76
+ "data": {
77
+ "min_practice_duration": 0,
78
+ "max_practice_duration": 0,
79
+ "max_practice_attempts": 10,
80
+ "passing_score": 60,
81
+ "completion_rule": "all_steps",
82
+ "ai_assistance_enabled": true,
83
+ "pass_difficulty": 2
84
+ }
85
+ }
86
+ ]
87
+ ```
88
+
89
+ ---
90
+
91
+ ## 双层包装锁
92
+
93
+ | 层级 | 位置 | 字段 |
94
+ |------|------|------|
95
+ | **第 1 层(config 外壳)** | `data.config` | `customization_level` / `is_custom_criteria` / `customized_fields` / `scenario_criteria_id` / `criteria_data` |
96
+ | **第 2 层(criteria_data 内核)** | `data.config.criteria_data` | `name` / `description` / `source_type` / `total_weight` / `tags` / `dimensions[]` |
97
+
98
+ **双层缺一不可**。常见错误:只包 `config` 漏 `criteria_data`(平台会接受但存储结构错误,后续查询/weight 校验/同步都异常)。
99
+
100
+ ---
101
+
102
+ ## 🔒 UI 展示硬要求
103
+
104
+ **以下字段 API 存储时不强制,但平台 UI 展示时必需——缺失会导致 UI 上看不到 Part4 数据**:
105
+
106
+ | 字段 | 位置 | 必需值示例 |
107
+ |------|------|-----------|
108
+ | `customization_level` | `criteria_data` 顶层 | `"full"` |
109
+ | `is_custom_criteria` | `criteria_data` 顶层 | `true` |
110
+ | `customized_fields` | `criteria_data` 顶层 | `["criteria_data"]` |
111
+ | `scenario_criteria_id` | `criteria_data` 顶层 | `"criteria_<场景短码>_v1"` |
112
+ | `total_weight` | `criteria_data` 顶层 | `100` |
113
+ | `tags` | `criteria_data` 顶层 | 与 Part1 场景标签一致 |
114
+ | `dimensions[].id` | 每个维度 | `"dim_<code>"` |
115
+ | `dimensions[].sort_order` | 每个维度 | 数字 1、2、3... |
116
+
117
+ > ⚠️ **历史教训**:API 接受只包 `criteria_data.dimensions` 的简化结构(存储成功),但平台 UI 会显示"无评分标准"。必须在 `criteria_data` 顶层补全上述 6 个字段,每个维度补 `id` 和 `sort_order`。
118
+
119
+ ---
120
+
121
+ ## 字段硬规则
122
+
123
+ | 字段 | 类型 | 约束 | 高频错误 |
124
+ |------|------|------|---------|
125
+ | `dimensions[].sort_order` | **number** | 整数 1、2、3 | ❌ 字符串(与 Part3 `sort_order` 相反) |
126
+ | `dimensions[].weight` | number | 整数,所有维度合 = 100 | ❌ 不等于 100 |
127
+ | `dimensions[].criteria` | string[] | 至少 2 个评分点 | ❌ 单条 / 逗号字符串 |
128
+ | `dimensions[].scoring_rule` | string | 一票否决嵌入末尾 | ❌ 全局 one_vote_veto 字段 |
129
+ | `dimensions[].code` | string | 英文语义编码 | ❌ 中文 |
130
+
131
+ ---
132
+
133
+ ## 提交前断言
134
+
135
+ ```python
136
+ op = operations[0]
137
+ assert op["type"] == "replace_scoring_criteria_config"
138
+
139
+ config = op["data"]["config"]
140
+ assert "criteria_data" in config, "缺第 2 层 criteria_data 包装"
141
+
142
+ cd = config["criteria_data"]
143
+ for k in ["name", "description", "source_type", "total_weight", "tags", "dimensions"]:
144
+ assert cd.get(k) not in (None, "", []), f"criteria_data.{k} 空/缺失"
145
+
146
+ assert cd["source_type"] == "enterprise"
147
+ assert cd["total_weight"] == 100
148
+
149
+ dims = cd["dimensions"]
150
+ assert len(dims) >= 2
151
+ assert sum(d["weight"] for d in dims) == 100, "权重总和不等于 100"
152
+ for i, d in enumerate(dims):
153
+ for k in ["id", "code", "name", "description", "weight", "scoring_rule", "criteria"]:
154
+ assert d.get(k) not in (None, "", []), f"dim{i} missing {k}"
155
+ assert isinstance(d["sort_order"], int), f"dim{i} sort_order 必须是数字"
156
+ assert isinstance(d["criteria"], list) and len(d["criteria"]) >= 2
157
+ assert d["code"].isascii(), f"dim{i} code 必须是英文"
158
+
159
+ # Part5 固定配置(v2.43 并入同批)
160
+ op5 = operations[1]
161
+ assert op5["type"] == "update_basic"
162
+ d5 = op5["data"]
163
+ assert d5["min_practice_duration"] == 0 and d5["max_practice_duration"] == 0
164
+ assert d5["max_practice_attempts"] == 10
165
+ assert d5["passing_score"] == 60
166
+ assert d5["completion_rule"] == "all_steps"
167
+ assert d5["ai_assistance_enabled"] is True
168
+ assert d5["pass_difficulty"] == 2
169
+ ```
170
+
171
+ ---
172
+
173
+ ## 反面案例
174
+
175
+ ```json
176
+ ❌ 案例 A:只包 config 漏 criteria_data(平台会接受但存储错误)
177
+ { "type": "replace_scoring_criteria_config", "data": { "config": { "name": "...", "dimensions": [...] } } }
178
+ → 平台存为 {name, dimensions} 散在根,与正确结构不一致
179
+
180
+ ❌ 案例 B:dimensions.sort_order 写字符串
181
+ { "sort_order": "1" }
182
+ → 应该是数字 1(注意 Part3 是字符串,Part4 是数字)
183
+
184
+ ❌ 案例 C:一票否决写在全局
185
+ { "one_vote_veto": [...] }
186
+ → 应该嵌入各维度 scoring_rule 末尾
187
+ ```
@@ -0,0 +1,46 @@
1
+ # AI 陪练 Gate Check 矩阵
2
+
3
+ > 各阶段/Part 结束时对照检查。🔴 阻塞(必须修复)/ 🟡 警告(建议修复)。Part1-5 逐项字段校验已在各 Part SOP 自查清单与 exec-handbook 断言中定义,本文件聚焦发布前汇总闸门。
4
+ >
5
+ > **v2.39 闸门精简规则**:Step 7 的 12 项中,9 项与 Part1-5 自检清单完全重叠(标注「↔PartN自检」)。Part 自检全部通过后,这 9 项**自动视为通过**,不再重复检查。闸门仅补查 3 项(标注「⚡仅闸门」)。
6
+
7
+ ## Step 7 创建质量闸门(12 项,全部通过才进 Step 8)
8
+
9
+ | # | 检查项 | 严重度 | v2.39 精简 |
10
+ |---|--------|--------|------------|
11
+ | 1 | 材料完整(含业务场景+话术素材) | 🔴 | ↔Part1自检(自检通过则跳过) |
12
+ | 2 | 场景类型判定已确认 | 🔴 | ↔Step2确认(已确认则跳过) |
13
+ | 3 | 角色行为化(无空泛画像) | 🔴 | ↔Part2自检(自检通过则跳过) |
14
+ | 4 | 信息释放规则明确 | 🔴 | ↔Part2自检(自检通过则跳过) |
15
+ | 5 | 每环节含进入/退出条件 | 🔴 | ↔Part3自检(自检通过则跳过) |
16
+ | 6 | 评分可识别(维度↔考核点对应) | 🔴 | ↔Part4自检(自检通过则跳过) |
17
+ | 7 | 练习配置匹配固定模板 | 🔴 | ↔Part4+5 合并自检(v2.43.1,exec-part4.md 断言区) |
18
+ | 8 | Part 内容完整展示 | 🔴 | ⚡仅闸门(需检查展示记录) |
19
+ | 9 | Part2 角色 background 四段完整 | 🔴 | ↔Part2自检(自检通过则跳过) |
20
+ | 10 | Part4 权重和 = 100 | 🔴 | ↔Part4自检(自检通过则跳过) |
21
+ | 11 | 测试用例 | 🟡 | ⚡仅闸门(可选,不阻塞) |
22
+ | 12 | 整体设定 ≤ 3000 字 | 🟡 | ⚡仅闸门(需统计字数) |
23
+
24
+ > **v2.39 批量校验脚本缩减**:Part 自检全部通过后,闸门批量校验从 16 个断言缩减为 7 个(4 项发布闸门 + 3 项补查项)。
25
+
26
+ ## Step 8 发布闸门(资源兜底,任一缺失禁止发布)
27
+
28
+ | # | 检查项 | 严重度 |
29
+ |---|--------|--------|
30
+ | 1 | 封面 = 固定默认图 | 🔴 |
31
+ | 2 | 全部 avatar 非空 URL | 🔴 |
32
+ | 3 | 全部 voice_id 非空 ID | 🔴 |
33
+ | 4 | 无"角色数据异常" | 🔴 |
34
+
35
+ ## 微调闸门(8 项)
36
+
37
+ | # | 检查项 | 严重度 |
38
+ |---|--------|--------|
39
+ | 1 | 有证据 | 🟡 |
40
+ | 2 | 已技术分流 | 🔴 |
41
+ | 3 | 已打标签(F/I/O/L/E/S/R/K/T/D) | 🔴 |
42
+ | 4 | 修改决策 | 🔴 |
43
+ | 5 | 标注改稿 | 🔴 |
44
+ | 6 | 复测方案 | 🔴 |
45
+ | 7 | 版本记录建议 | 🟡 |
46
+ | 8 | 整体设定 ≤ 3000 字 | 🟡 |
@@ -0,0 +1,30 @@
1
+ # 微调诊断标签完整定义
2
+
3
+ > 由 SKILL.md「微调诊断标签」节引用。微调型任务必须打标签后才能进入修改建议。
4
+ > 核心原则:**没有标签,不进入修改建议。**
5
+
6
+ | 标签 | 含义 | 判定要点 |
7
+ |------|------|---------|
8
+ | **F** | 格式违规 | 括号动作、Markdown语法、后台痕迹外显 |
9
+ | **I** | 信息释放违规 | 开场透露全部症状/底线/背景 |
10
+ | **O** | 角色OOC | 太热情/太攻击/说出不该说的术语 |
11
+ | **P** | 指令执行度违规 | AI实际行为与提示词行为指令不一致 |
12
+ | **N** | 对话自然度违规 | 模板化、万能回应、句式单一、过渡生硬 |
13
+ | **L** | 逻辑违规 | 信任值异常、价格防线过早松动 |
14
+ | **E** | 结束违规 | 提前结束、成交后继续追问 |
15
+ | **S** | 场景规则违规 | 违反药房/合规/B2B场景规则 |
16
+ | **R** | 评分规则问题 | 评分项抽象、目标错位、无法识别间接达成 |
17
+ | **K** | 知识/合规问题 | 产品知识错误、禁用话术未触发 |
18
+ | **T** | 技术/体验问题 | ASR/TTS/权限/跳转 |
19
+ | **D** | 数据/看板问题 | 指标口径错误、数据污染 |
20
+
21
+ ## 诊断分析顺序
22
+
23
+ 必须严格按此顺序执行:
24
+
25
+ ```
26
+ T排障 → O拟真 → P指令执行 → N自然度 → I信息释放/K知识 → E结束/S场景 → L逻辑/F格式 → R评分
27
+ ```
28
+
29
+ - **P 在第 3 位**:先确认角色没崩(O),再查指令执行度(P),避免角色OOC导致P误判
30
+ - **N 在第 4 位**:先确认行为指令合规(P),再查表达是否自然(N)。模板化"好的""了解了"等万能回应属于 N 违规而非 O 或 F 问题
@@ -0,0 +1,49 @@
1
+ # 平台 API 踩坑清单(致命陷阱速查)
2
+
3
+ > 已验证的致命陷阱,优先级高于历史示例。命令速查见 `verified-cli-cheatsheet.md`。
4
+
5
+ ## 🔴 4 条致命陷阱(踩了必坏)
6
+
7
+ ### 1. Part2 角色外壳字段放错层级 → "角色数据异常"
8
+
9
+ 每个角色的**外壳**必须包含以下字段(与 `role_data` 同级,**不可**写进 `role_data` 内):
10
+ `scenario_role_id` / `customization_level="full"` / `is_custom_role=true` / `customized_fields` / `template_id=null` / `template_name=null` / `template_version=null`。
11
+
12
+ > ⚠️ **`created_at`/`updated_at` 禁传(2026-08-18 实测)**:外壳若传字符串时间戳(如 `"2026-08-18T05:41:14Z"`),会触发「角色数据异常」,导致 `role_data` 全字段置空(name 变成"角色数据异常")。这两个字段由平台自动生成,生成 `part2-operations.json` 时**一律省略**,不要写入外壳。exec-handbook 旧断言要求外壳含 created_at/updated_at 是错误结论,以本条为准。
13
+
14
+ - `customized_fields` 必须列全 12 个字段名:`["name","description","communication_style","background","personality_type","personality","tags","knowledge_level","taboos_objections","avatar","voice_id","source_type"]`,只写 `["role_data"]` 会导致静默不持久化。
15
+ - `source_type="custom"` 在 `role_data` **内**(外壳不写 source_type)。
16
+ - `avatar` 用头像 URL(`+list-role-avatars` 的 `url`),`voice_id` 用声音 ID(`+list-role-voices` 的 `id`)。
17
+ - `knowledge_level` 必须是数组,不是字符串。
18
+
19
+ ### 2. Part4 shell 字段放错层级 → UI 不显示评分
20
+
21
+ `data.config` 顶层必须含 4 个 shell 字段:`scenario_criteria_id` / `customization_level="full"` / `is_custom_criteria=true` / `customized_fields=["criteria_data"]`,**不能放进 `criteria_data` 内**。`criteria_data` 内只放:`name` / `description` / `dimensions` / `total_weight` / `source_type="enterprise"` / `status=1` / `tags`。每个维度含 `id`(dim_{code}) 和 `sort_order`(数字)。
22
+
23
+ ### 3. add_conversation_step 数据不持久化(CLI bug)+ apply 禁止用于验证(v2.37 教训)
24
+
25
+ `add_conversation_step` apply 返回成功但 `+get-scenario` 回读 `conversation_steps: []`(CLI v1.0.65+ 已知 bug,`replace_conversation_steps` 被 422 拒绝)。处理:仍按标准语义用 `add_conversation_step` 先试,回读为空则判定持久化缺陷,改走 MentorAI Web 后台手动补录。不阻断发布。
26
+
27
+ > ⚠️ **v2.37 教训(2026-08-18 升舱场景事故)**:质量闸门阶段误用 `+apply-scenario-update`(operations-file=part3-operations.json)当验证用,导致 `add_conversation_step` **重复添加**(4 环节变 8 环节),不得不查快照→回滚→重新 get 验证,浪费 3-5 积分。
28
+ > **规则**:apply 是**写入操作**,不是读取操作。验证数据用 `+get-scenario`。apply 后只从返回值提取 `updated_at`(`tail -1` 或 Python 提取),**不回显 operations/snapshot_id**,**不用 apply 回读环节**。
29
+
30
+ ### 4. +create-scenario 只存基础字段
31
+
32
+ `+create-scenario --request-file` 仅持久化 `name/description/tags/key_points/scene_lang/scenario_cover`;`ai_roles`/`scoring_criteria_config`/`conversation_steps`/练习配置全部被忽略。必须创建后逐 Part 用 `+apply-scenario-update` 写入。
33
+
34
+ ## ⚠️ 高频坑(速查)
35
+
36
+ - **沙箱**:所有 soke-cli 命令设 `dangerouslyDisableSandbox: true`(Go 二进制受限)。
37
+ - **子命令**:统一 `soke-cli ai-training +...`,不省略 `ai-training`。
38
+ - **operations 格式**:裸数组 `[{type,data},...]`,不套 `{"operations":[...]}`。
39
+ - **apply 参数**:`--idempotency-key`(apply 必传,preview 不传)、`--reason`(两者必传)。
40
+ - **乐观锁**:每次 preview/apply 前 `+get-scenario` 重取最新 `updated_at`。
41
+ - **验收**:apply 后 `+get-scenario --raw` 逐字段核对目标字段;preview/apply 成功≠平台最终解析正常。
42
+ - **JSON 中文引号**:用 Python `json.dump(ensure_ascii=False)` 写入,禁 heredoc/echo(全角双引号会报错)。
43
+ - **类型**:Part3 `max_rounds` 整数、`sort_order` 字符串 `"1"`;Part4 `sort_order` 数字 `1`(两者相反)。
44
+ - **Part1 必填**:`key_points` 是字符串(非数组)、`scene_lang="简体中文"`、`scenario_cover` 固定默认图 `https://newsokeeditorcdn.soke.cn/public/ai/cover/lingshou_daogou.png`。
45
+ - **身份字段**:`corp_id/user_id/implementation_corp_id` 禁写请求体,不作选租户依据。
46
+
47
+ ## 推荐顺序
48
+
49
+ 环境检测 → Step1 写固定封面 → 每 Part 前 `get-scenario` → preview → apply → `get-scenario --raw` 验收。回读异常先查:Part2 查 avatar/外壳/customized_fields/background(background=null 最常见);Part4 查三层嵌套与元数据字段;Part5 只查练习配置字段。