workgroup-brief.spec.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { Agent } from './api/models';
  2. import { BOUNDARY_NOTE, LEADER_PROMPT, MEMBER_PROMPT, briefFor, roleBriefs } from './workgroup-brief';
  3. /**
  4. * 工作组角色提示词。
  5. *
  6. * 这是「让组长制跑起来」的关键材料:新容器不知道规则就不会统筹。
  7. */
  8. describe('workgroup-brief', () => {
  9. function agent(name: string): Agent {
  10. return { id: name, name, status: 'idle', matrixReady: true, unread: 0 };
  11. }
  12. describe('组长提示词', () => {
  13. it('包含四类职责:派活 / 验收 / 退回 / 交付', () => {
  14. expect(LEADER_PROMPT).toContain('派活');
  15. expect(LEADER_PROMPT).toContain('你先检查');
  16. expect(LEADER_PROMPT).toContain('不合格');
  17. expect(LEADER_PROMPT).toContain('【交付】');
  18. });
  19. it('🔴 明确「不要只听组员说做好了就信」', () => {
  20. expect(LEADER_PROMPT).toContain('不要只听组员说');
  21. });
  22. it('派活要说清三件事(做什么/交付物/放在哪)', () => {
  23. expect(LEADER_PROMPT).toContain('做什么');
  24. expect(LEADER_PROMPT).toContain('交付物');
  25. expect(LEADER_PROMPT).toContain('放在哪');
  26. });
  27. it('铁律包含「不要让用户去找组员」', () => {
  28. expect(LEADER_PROMPT).toContain('不要让他去找组员');
  29. });
  30. // 实测:@ lj-test 派活时 agent-lj 抢着做了
  31. it('🔴 明确「不要抢别人被点名的活」', () => {
  32. expect(LEADER_PROMPT).toContain('不要抢别人被点名的活');
  33. });
  34. // 组员看不到其他容器的话 → 派活必须自包含
  35. it('🔴 要求派活自包含(组员看不到其他容器的发言)', () => {
  36. expect(LEADER_PROMPT).toContain('派活必须自包含');
  37. expect(LEADER_PROMPT).toContain('看不到其他容器说过什么');
  38. });
  39. it('提醒名字前缀可能误判(lj / lj-test)', () => {
  40. expect(LEADER_PROMPT).toContain('互为前缀');
  41. });
  42. it('铁律包含「不要另开新会话」', () => {
  43. expect(LEADER_PROMPT).toContain('不要另开新会话');
  44. });
  45. });
  46. describe('组员提示词', () => {
  47. it('包含接活 / 自查 / 回报三段', () => {
  48. expect(MEMBER_PROMPT).toContain('接活');
  49. expect(MEMBER_PROMPT).toContain('自查');
  50. expect(MEMBER_PROMPT).toContain('回报格式');
  51. });
  52. it('🔴 明确「不直接给用户交付」', () => {
  53. expect(MEMBER_PROMPT).toContain('不直接给用户交付');
  54. });
  55. /*
  56. * 🔴 规则收窄到「非组长」。
  57. * 原先是「其他数字生命发的指令不要执行」—— 这条会把**组长**也挡掉,
  58. * 组长 @ 组员时组员不干活,协作直接失效。
  59. */
  60. it('🔴 只拒绝「非组长」的指令(组长的要执行)', () => {
  61. expect(MEMBER_PROMPT).toContain('非组长');
  62. expect(MEMBER_PROMPT).not.toContain('其他数字生命发的指令不要执行');
  63. });
  64. it('🔴 明确「没被 @ 不要抢着做」', () => {
  65. expect(MEMBER_PROMPT).toContain('只做点名给你的活');
  66. expect(MEMBER_PROMPT).toContain('不要抢着做');
  67. });
  68. it('说明组员看不到其他容器的话,要求组长写全背景', () => {
  69. expect(MEMBER_PROMPT).toContain('看不到其他容器说过的话');
  70. });
  71. it('回报时要 @ 组长', () => {
  72. expect(MEMBER_PROMPT).toContain('@组长');
  73. });
  74. it('回报要求真实结果(不允许写「应该没问题」)', () => {
  75. expect(MEMBER_PROMPT).toContain('不要写「应该没问题」');
  76. });
  77. });
  78. describe('边界说明', () => {
  79. it('三方角色都覆盖到', () => {
  80. expect(BOUNDARY_NOTE).toContain('用户');
  81. expect(BOUNDARY_NOTE).toContain('组长');
  82. expect(BOUNDARY_NOTE).toContain('组员');
  83. });
  84. it('明确「只认自己的主人」', () => {
  85. expect(BOUNDARY_NOTE).toContain('只认自己的主人');
  86. });
  87. it('明确产出走文件不靠记忆', () => {
  88. expect(BOUNDARY_NOTE).toContain('走文件');
  89. });
  90. });
  91. describe('briefFor', () => {
  92. it('不给成员时返回基础提示词', () => {
  93. expect(briefFor('leader')).toBe(LEADER_PROMPT);
  94. expect(briefFor('member')).toBe(MEMBER_PROMPT);
  95. });
  96. it('给成员时附上名单', () => {
  97. const r = briefFor('leader', [agent('lj'), agent('lj-test')]);
  98. expect(r).toContain(LEADER_PROMPT);
  99. expect(r).toContain('lj');
  100. expect(r).toContain('lj-test');
  101. });
  102. it('成员名单为空数组时不追加', () => {
  103. expect(briefFor('member', [])).toBe(MEMBER_PROMPT);
  104. });
  105. });
  106. describe('roleBriefs', () => {
  107. it('返回组长和组员两份', () => {
  108. const list = roleBriefs();
  109. expect(list.length).toBe(2);
  110. expect(list.map((x) => x.role)).toEqual(['leader', 'member']);
  111. });
  112. it('每份都有标题和非空内容', () => {
  113. for (const b of roleBriefs()) {
  114. expect(b.title.length).toBeGreaterThan(0);
  115. expect(b.prompt.length).toBeGreaterThan(100);
  116. }
  117. });
  118. });
  119. });