@chorus-aidlc/chorus 0.17.3 → 0.18.0

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 (443) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +327 -325
  3. package/.next/standalone/.next/app-path-routes-manifest.json +37 -37
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +27 -27
  6. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  46. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  50. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  51. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  54. package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
  55. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  57. package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
  58. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/admin.html +2 -2
  60. package/.next/standalone/.next/server/app/admin.rsc +2 -2
  61. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
  69. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
  83. package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
  100. package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
  103. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  106. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
  116. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
  122. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
  123. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/events/notifications/route.js +1 -1
  132. package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
  133. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/events/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  139. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  142. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
  143. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  145. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
  148. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
  149. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  151. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  154. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
  155. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js.nft.json +1 -1
  157. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/mcp/route.js +1 -1
  162. package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  163. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  168. package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
  174. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
  175. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  179. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
  180. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
  181. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
  186. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
  187. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  189. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  193. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  194. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  195. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  198. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  199. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  201. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  202. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  203. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  205. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  206. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
  207. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  209. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  210. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  211. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
  212. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +1 -1
  213. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  215. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  216. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  217. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
  218. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  219. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  220. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
  221. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  222. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js.nft.json +1 -1
  223. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  224. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  225. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  227. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  228. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  230. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  231. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  233. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  234. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  235. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  236. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
  237. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  238. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  239. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
  240. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  241. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  242. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
  243. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  245. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
  246. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  247. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  248. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
  249. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  250. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  251. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
  252. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  253. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  254. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
  255. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  256. package/.next/standalone/.next/server/app/index.html +2 -2
  257. package/.next/standalone/.next/server/app/index.rsc +2 -2
  258. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  259. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  260. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  261. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  262. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  263. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  264. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  265. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  267. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  268. package/.next/standalone/.next/server/app/login.html +2 -2
  269. package/.next/standalone/.next/server/app/login.rsc +2 -2
  270. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  271. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  272. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  273. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  274. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  275. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  276. package/.next/standalone/.next/server/app/projects.html +2 -2
  277. package/.next/standalone/.next/server/app/projects.rsc +3 -3
  278. package/.next/standalone/.next/server/app/settings.html +2 -2
  279. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  280. package/.next/standalone/.next/server/app-paths-manifest.json +37 -37
  281. package/.next/standalone/.next/server/chunks/109.js +1 -0
  282. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  283. package/.next/standalone/.next/server/chunks/1496.js +1 -0
  284. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  285. package/.next/standalone/.next/server/chunks/2572.js +1 -1
  286. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  287. package/.next/standalone/.next/server/chunks/3112.js +1 -1
  288. package/.next/standalone/.next/server/chunks/{1201.js → 3619.js} +2 -2
  289. package/.next/standalone/.next/server/chunks/{3630.js → 4810.js} +1 -1
  290. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  291. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  292. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  293. package/.next/standalone/.next/server/chunks/6506.js +2 -2
  294. package/.next/standalone/.next/server/chunks/6737.js +1 -0
  295. package/.next/standalone/.next/server/chunks/6753.js +3 -3
  296. package/.next/standalone/.next/server/chunks/679.js +1 -1
  297. package/.next/standalone/.next/server/chunks/731.js +1 -0
  298. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  299. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  300. package/.next/standalone/.next/server/chunks/7857.js +1 -0
  301. package/.next/standalone/.next/server/chunks/920.js +1 -1
  302. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  303. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  304. package/.next/standalone/.next/server/chunks/9931.js +1 -1
  305. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  306. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  307. package/.next/standalone/.next/server/pages/404.html +2 -2
  308. package/.next/standalone/.next/server/pages/500.html +1 -1
  309. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  310. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  311. package/.next/standalone/.next/static/chunks/11595.0afa1a540f681fb4.js +1 -0
  312. package/.next/standalone/.next/static/chunks/22705-324a191727ae45b7.js +1 -0
  313. package/.next/standalone/.next/static/chunks/33456.4a5f4712a7e78d8f.js +1 -0
  314. package/.next/standalone/.next/static/chunks/44216-3876e84f5b02d355.js +1 -0
  315. package/.next/standalone/.next/static/chunks/4860.5719e32b95be2d93.js +1 -0
  316. package/.next/standalone/.next/static/chunks/6528-a8a562ef7d26bb43.js +1 -0
  317. package/.next/standalone/.next/static/chunks/67439-7b339b28ed0ecfc6.js +1 -0
  318. package/.next/standalone/.next/static/chunks/79919-ae8bd8d8ec1e38ce.js +1 -0
  319. package/.next/standalone/.next/static/chunks/{46021-f5d072b0cbcb7fac.js → 82203-4ce5926624df7ed0.js} +1 -1
  320. package/.next/standalone/.next/static/chunks/94643-37ac7b8ef8ea5e75.js +1 -0
  321. package/.next/standalone/.next/static/chunks/99373.6c1509bfaf599741.js +1 -0
  322. package/.next/standalone/.next/static/chunks/99775-697e82ee04eac6b1.js +1 -0
  323. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-2fda722cdace8147.js +1 -0
  324. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-77b175e52a85f3cb.js → page-b45c42c536eff64b.js} +1 -1
  325. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-792aba7fd6b6daa3.js +1 -0
  326. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-800a979f12b73f27.js +1 -0
  327. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-69d3162667f85677.js → page-34de35f75aa71f6d.js} +1 -1
  328. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-a16002aa2a911619.js +1 -0
  329. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-a3f83031dfbafc81.js → page-e8030824994edf35.js} +1 -1
  330. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-4f7f1ddbaf79be8f.js +1 -0
  331. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-3c7ff3a40a4615ac.js → page-349b0977f3c6209a.js} +1 -1
  332. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-7b8e11fdc5b596d0.js → page-be43cb06112fce12.js} +1 -1
  333. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-6916e1abab42a6e6.js +1 -0
  334. package/.next/standalone/.next/static/chunks/app/onboarding/{page-0ce33b9327fe3d8c.js → page-c0090caae202eae5.js} +1 -1
  335. package/.next/standalone/.next/static/chunks/{webpack-dffb97a4feb8faba.js → webpack-cfb63dd1b416c92e.js} +1 -1
  336. package/.next/standalone/.next/static/css/75c761a5428611fa.css +1 -0
  337. package/.next/standalone/package.json +1 -1
  338. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +2 -2
  339. package/.next/standalone/public/chorus-plugin/agents/code-reviewer.md +1 -0
  340. package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +12 -3
  341. package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +4 -0
  342. package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
  343. package/.next/standalone/public/chorus-plugin/bin/on-post-submit-for-verify.sh +3 -3
  344. package/.next/standalone/public/chorus-plugin/bin/on-post-submit-proposal.sh +3 -3
  345. package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +2 -2
  346. package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +39 -64
  347. package/.next/standalone/public/chorus-plugin/bin/resolve-spec-mode.sh +107 -0
  348. package/.next/standalone/public/chorus-plugin/bin/tests/test-resolver-drift.sh +46 -0
  349. package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity-negative.sh +328 -0
  350. package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity.sh +372 -0
  351. package/.next/standalone/public/chorus-plugin/bin/tests/test-spec-mode-resolution.sh +83 -0
  352. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  353. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +11 -6
  354. package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +1 -1
  355. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +14 -9
  356. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  357. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  358. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +27 -31
  359. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +11 -1
  360. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +14 -7
  361. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +6 -4
  362. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +10 -8
  363. package/.next/standalone/public/chorus-plugin/skills/spec-lite/SKILL.md +147 -0
  364. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +49 -34
  365. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-code-reviewer.json +1 -1
  366. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json +2 -1
  367. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-task-reviewer.json +1 -1
  368. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus.md +1 -1
  369. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  370. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +1 -1
  371. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +9 -7
  372. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  373. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  374. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +35 -27
  375. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +9 -1
  376. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +14 -7
  377. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +2 -2
  378. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +8 -8
  379. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-spec-lite/SKILL.md +147 -0
  380. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +39 -25
  381. package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +11 -6
  382. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  383. package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +41 -0
  384. package/.next/standalone/public/kiro-plugin/bin/on-post-submit-for-verify.sh +3 -3
  385. package/.next/standalone/public/kiro-plugin/bin/on-post-submit-proposal.sh +3 -3
  386. package/.next/standalone/public/kiro-plugin/bin/on-post-verify-task.sh +2 -2
  387. package/.next/standalone/public/kiro-plugin/bin/resolve-spec-mode.sh +107 -0
  388. package/.next/standalone/public/kiro-plugin/manifest.txt +2 -0
  389. package/.next/standalone/public/skill/chorus/SKILL.md +11 -1
  390. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -0
  391. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  392. package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +11 -1
  393. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +5 -2
  394. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  395. package/.next/standalone/public/skill/review-chorus/SKILL.md +5 -3
  396. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +4 -0
  397. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +23 -7
  398. package/README.ja.md +3 -3
  399. package/README.ko.md +3 -3
  400. package/README.md +3 -3
  401. package/README.zh.md +3 -3
  402. package/cli/agent-cli-config.mjs +323 -0
  403. package/cli/agent-launcher.mjs +44 -16
  404. package/cli/claude-spawner.mjs +22 -13
  405. package/cli/codex-spawner.mjs +23 -15
  406. package/cli/credentials.mjs +7 -0
  407. package/cli/daemon-config.mjs +14 -0
  408. package/cli/daemon.mjs +32 -6
  409. package/cli/dsh-managed-config.mjs +26 -28
  410. package/cli/dsh-spawner.mjs +23 -15
  411. package/cli/init/steps/credential-seed.mjs +1 -1
  412. package/cli/kiro-spawner.mjs +22 -15
  413. package/cli/launch-diagnostics.mjs +67 -0
  414. package/cli/login.mjs +17 -1
  415. package/cli/pi-spawner.mjs +19 -12
  416. package/cli/prompts.mjs +52 -2
  417. package/cli/spawner-select.mjs +6 -11
  418. package/package.json +1 -1
  419. package/.next/standalone/.next/server/chunks/1114.js +0 -1
  420. package/.next/standalone/.next/server/chunks/1155.js +0 -1
  421. package/.next/standalone/.next/server/chunks/6465.js +0 -1
  422. package/.next/standalone/.next/server/chunks/8105.js +0 -1
  423. package/.next/standalone/.next/server/chunks/8232.js +0 -1
  424. package/.next/standalone/.next/static/chunks/11595.f7c3ef5cd7fc8feb.js +0 -1
  425. package/.next/standalone/.next/static/chunks/33456.c81079032acc2966.js +0 -1
  426. package/.next/standalone/.next/static/chunks/45262-38b332523f00a223.js +0 -1
  427. package/.next/standalone/.next/static/chunks/4860.f0cfb1201191ae88.js +0 -1
  428. package/.next/standalone/.next/static/chunks/66609-64a01d5cb415465b.js +0 -1
  429. package/.next/standalone/.next/static/chunks/79919-c5a2a3fd8f5f9204.js +0 -1
  430. package/.next/standalone/.next/static/chunks/94394-38194b81b489275c.js +0 -1
  431. package/.next/standalone/.next/static/chunks/94643-f1bdf37fb3bb6adb.js +0 -1
  432. package/.next/standalone/.next/static/chunks/95225-96b44da3ebd6ddad.js +0 -1
  433. package/.next/standalone/.next/static/chunks/96482-2b3bdb2544d72e5a.js +0 -1
  434. package/.next/standalone/.next/static/chunks/99373.3c23ac2efbd4db02.js +0 -1
  435. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-66328332f62c7371.js +0 -1
  436. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-87ceae13c4950fc9.js +0 -1
  437. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-45e95154e546460e.js +0 -1
  438. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-b7b2017e5be69564.js +0 -1
  439. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-8b06834ca0f663bb.js +0 -1
  440. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-efe5326c47aca9ca.js +0 -1
  441. package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +0 -1
  442. /package/.next/standalone/.next/static/{wuqYN129vOIGymh_NEdZe → IxKVu5zkFPTjSKAUR99yH}/_buildManifest.js +0 -0
  443. /package/.next/standalone/.next/static/{wuqYN129vOIGymh_NEdZe → IxKVu5zkFPTjSKAUR99yH}/_ssgManifest.js +0 -0
@@ -0,0 +1,372 @@
1
+ #!/usr/bin/env bash
2
+ # test-skill-harness-fidelity.sh — keep shipped skill/manifest/hook text from
3
+ # re-asserting claims that are false about the harnesses we ship to:
4
+ #
5
+ # 1. `TeamCreate` — a tool no harness in this repo exposes.
6
+ # 2. Five literal phrases promising a reviewer runs in the foreground / returns
7
+ # its VERDICT inline, on the surfaces where that is untrue.
8
+ # 3. `.chorus/specs/TEMPLATE` — a path that exists nowhere on disk.
9
+ # 4. A proposal-reviewer definition — or the Kiro orchestrator/steering prose that
10
+ # DESCRIBES the reviewers' tool grants — claiming the shell/Bash is unavailable:
11
+ # false on all seven surfaces, and the claim that produced the "file is
12
+ # missing" false positive this guard's check 4-6 exist to prevent.
13
+ # 5. A proposal-reviewer definition that does NOT carry the canonical read-only
14
+ # shell rule (allowed commands + the confirm-before-flagging obligation).
15
+ # 6. Tool grants contradicting that rule: `Bash` back in the Claude Code agent's
16
+ # `disallowedTools`, or `shell` dropped from Kiro's `tools`.
17
+ #
18
+ # SCOPE — read this before extending the guard. Checks 1-3 are a string blacklist,
19
+ # nothing more. They do NOT verify that the reviewer-wait contract or the
20
+ # round-qualified "read THIS round's VERDICT" instruction is present, correct, or
21
+ # even still in the file: deleting those paragraphs outright leaves all three checks
22
+ # green. That gate is held by review and by the acceptance criteria of the changes
23
+ # that write those paragraphs, not here. It also does NOT check that the spec-lite
24
+ # templates are inlined anywhere — deliberately, by owner decision.
25
+ #
26
+ # Checks 4-6 go one step further for the proposal-reviewer only (4 also covers the
27
+ # two Kiro docs that describe its grant to the orchestrator): 4 is a blacklist,
28
+ # but 5 REQUIRES two marker substrings and 6 inspects the two manifests that
29
+ # actually gate the capability. They still do not verify the full three-sentence
30
+ # wording — a surface could keep both markers while mangling the forbidden list.
31
+ #
32
+ # Bash 3.2 compatible.
33
+ set -u
34
+
35
+ # Repo root = four levels up from this script (tests → bin → chorus-plugin → public → repo).
36
+ ROOT="$(cd "$(dirname "$0")/../../../.." && pwd)"
37
+ # This guard and its negative-case harness both have to spell every blacklisted
38
+ # literal out in order to forbid / plant it, so both are excluded from their own
39
+ # scans. Nothing else is exempt — a violation hidden in these two files would go
40
+ # unseen, which is the same tradeoff every self-excluding linter makes.
41
+ SELF_REL="public/chorus-plugin/bin/tests/test-skill-harness-fidelity.sh"
42
+ SELF_REL2="public/chorus-plugin/bin/tests/test-skill-harness-fidelity-negative.sh"
43
+
44
+ if [ ! -d "$ROOT/public/chorus-plugin" ]; then
45
+ echo "FATAL: repo root looks wrong (no public/chorus-plugin under $ROOT)" >&2
46
+ exit 1
47
+ fi
48
+
49
+ PASS=0
50
+ FAIL=0
51
+
52
+ # --exclude-dir matches a directory BASENAME, not a path, so `worktrees` covers
53
+ # `.claude/worktrees/` (and any other worktrees dir) — intentionally broader.
54
+ EXCLUDES="--exclude-dir=node_modules --exclude-dir=dist --exclude-dir=cdk.out --exclude-dir=worktrees --exclude-dir=.git"
55
+
56
+ # Scan-error flag. This is a FILE, not a shell variable, on purpose: every call
57
+ # site invokes hits() inside `$( )`, which runs it in a subshell — a variable
58
+ # assignment there is discarded when the substitution ends, so the guard would
59
+ # print the error and still exit 0. A file survives the subshell.
60
+ SCAN_ERR_FILE="$(mktemp)"
61
+ trap 'rm -f "$SCAN_ERR_FILE"' EXIT
62
+
63
+ # hits <literal> <path>... — print repo-relative files containing the literal,
64
+ # minus this guard's own source (it necessarily spells every pattern out).
65
+ #
66
+ # A grep that cannot scan is NOT a pass. grep exits 0 on match, 1 on no match and
67
+ # >=2 on error (unreadable path, missing directory, a path mangled by word
68
+ # splitting). Swallowing stderr and treating >=2 like "no match" is how a guard
69
+ # reports PASS while having searched nothing — so the rc is inspected and recorded
70
+ # in SCAN_ERR_FILE, which fails the run at the end. Every call site must pass each
71
+ # path as its own quoted argument for the same reason.
72
+ hits() {
73
+ local _lit _out _rc _err
74
+ _lit="$1"; shift
75
+ _err="$(mktemp)"
76
+ # shellcheck disable=SC2086
77
+ _out="$(grep -rlIF $EXCLUDES -- "$_lit" "$@" 2>"$_err")"
78
+ _rc=$?
79
+ if [ "$_rc" -ge 2 ]; then
80
+ echo "$_lit" >> "$SCAN_ERR_FILE"
81
+ echo " ERROR scan failed for \"$_lit\" (grep rc=$_rc) — a failed scan is not a PASS:" >&2
82
+ sed 's/^/ /' "$_err" >&2
83
+ fi
84
+ rm -f "$_err"
85
+ [ -n "$_out" ] || return 0
86
+ printf '%s\n' "$_out" \
87
+ | sed "s|^$ROOT/||" \
88
+ | grep -v "^$SELF_REL\$" \
89
+ | grep -v "^$SELF_REL2\$" \
90
+ | sort
91
+ }
92
+
93
+ # file_has <literal> <abs-path> — rc 0 when the file contains the literal, rc 1
94
+ # when it does not, rc>=2 when grep could not scan (missing/unreadable file).
95
+ #
96
+ # Unlike hits(), this is called DIRECTLY in an `if`, never inside `$( )`: a scan
97
+ # error has to be recorded for the parent shell, and an assignment made inside a
98
+ # command substitution is discarded when it ends. SCAN_ERR_FILE is a file for the
99
+ # same reason (see above) and works either way; the `if` form also keeps the rc
100
+ # distinction between "absent" (1) and "could not look" (>=2), which matters here
101
+ # because checks 5-6 REQUIRE a substring — an unreadable file would otherwise be
102
+ # indistinguishable from a file that legitimately lacks it.
103
+ file_has() {
104
+ local _lit _path _rc _err
105
+ _lit="$1"; _path="$2"
106
+ _err="$(mktemp)"
107
+ grep -qIF -- "$_lit" "$_path" 2>"$_err"
108
+ _rc=$?
109
+ if [ "$_rc" -ge 2 ]; then
110
+ echo "$_lit @ $_path" >> "$SCAN_ERR_FILE"
111
+ echo " ERROR scan failed for \"$_lit\" in $_path (grep rc=$_rc) — a failed scan is not a PASS:" >&2
112
+ sed 's/^/ /' "$_err" >&2
113
+ fi
114
+ rm -f "$_err"
115
+ return "$_rc"
116
+ }
117
+
118
+ report() {
119
+ local _label _found
120
+ _label="$1"; _found="$2"
121
+ if [ -z "$_found" ]; then
122
+ PASS=$((PASS + 1)); echo " PASS $_label"
123
+ else
124
+ FAIL=$((FAIL + 1)); echo " FAIL $_label — found in:"
125
+ echo "$_found" | sed 's/^/ /'
126
+ fi
127
+ }
128
+
129
+ echo "skill/harness fidelity guard (checks 1-4 blacklist, 5-6 require — see header for what it does NOT cover):"
130
+ echo ""
131
+
132
+ # ── Check 1 — no TeamCreate anywhere in shipped files ────────────────────────
133
+ # packages/chorus-pi/test/{static.sh,README.md} name it in order to forbid it.
134
+ echo "Check 1 — no \`TeamCreate\` (no harness in this repo exposes it)"
135
+ FOUND=$(hits 'TeamCreate' "$ROOT/public" "$ROOT/plugins" "$ROOT/packages" \
136
+ | grep -v '^packages/chorus-pi/test/static\.sh$' \
137
+ | grep -v '^packages/chorus-pi/test/README\.md$')
138
+ report "no TeamCreate reference" "$FOUND"
139
+ echo ""
140
+
141
+ # ── Check 2 — no foreground / inline-VERDICT reviewer promise ────────────────
142
+ # Scoped to the surfaces where the promise is false: on Claude Code the sub-agent
143
+ # launch result is never the verdict, and Kiro/dsh word their waiting differently.
144
+ # packages/chorus-pi/ is EXCLUDED on purpose — its bundled `subagent` genuinely
145
+ # blocks and returns the VERDICT, so its skill says so truthfully.
146
+ # Literal phrases only. Do NOT add a proximity rule pairing `run_in_background`
147
+ # with "foreground"/"synchronous"/"inline": dsh legitimately keeps
148
+ # `run_in_background: false`, so such a rule would fail a correct tree.
149
+ echo "Check 2 — no foreground/inline-VERDICT reviewer promise (chorus-plugin, kiro-plugin, chorus-dsh)"
150
+ # Three separate quoted arguments, NOT one space-joined string: a repo checked out
151
+ # under a path containing a space (e.g. /Users/me/My Repos/Chorus) would have that
152
+ # string word-split into non-existent paths, grep would error, and the guard would
153
+ # have reported PASS having scanned nothing. Bash 3.2 has indexed arrays (only
154
+ # associative ones are 4+), so an array is fine here.
155
+ SCOPE2=("$ROOT/public/chorus-plugin" "$ROOT/public/kiro-plugin" "$ROOT/packages/chorus-dsh")
156
+ CHECK2_FAILED=0
157
+ # Bash 3.2: no arrays / no readarray — one literal per line, split on newlines.
158
+ PATTERNS_2='reviewer synchronously
159
+ returns the VERDICT inline
160
+ waits and returns the VERDICT
161
+ in **foreground**
162
+ (do NOT set run_in_background)'
163
+ OLD_IFS="$IFS"
164
+ IFS='
165
+ '
166
+ for pat in $PATTERNS_2; do
167
+ IFS="$OLD_IFS"
168
+ FOUND=$(hits "$pat" "${SCOPE2[@]}")
169
+ if [ -n "$FOUND" ]; then
170
+ CHECK2_FAILED=1
171
+ echo " FAIL literal \"$pat\" — found in:"
172
+ echo "$FOUND" | sed 's/^/ /'
173
+ fi
174
+ IFS='
175
+ '
176
+ done
177
+ IFS="$OLD_IFS"
178
+ if [ "$CHECK2_FAILED" -eq 0 ]; then
179
+ PASS=$((PASS + 1)); echo " PASS none of the 5 blacklisted literals present"
180
+ else
181
+ FAIL=$((FAIL + 1))
182
+ fi
183
+ echo ""
184
+
185
+ # ── Check 3 — no dangling .chorus/specs/TEMPLATE path ───────────────────────
186
+ echo "Check 3 — no \`.chorus/specs/TEMPLATE\` path (no such directory is shipped)"
187
+ FOUND=$(hits '.chorus/specs/TEMPLATE' "$ROOT/public" "$ROOT/plugins" "$ROOT/packages" "$ROOT/docs/SPEC_LITE.md")
188
+ report "no .chorus/specs/TEMPLATE reference" "$FOUND"
189
+ echo ""
190
+
191
+ # ── The seven proposal-reviewer definitions ─────────────────────────────────
192
+ # Enumerated explicitly and NOT globbed, on purpose: shipping an eighth surface
193
+ # without adding it here is then a visible omission in this list rather than a
194
+ # silent pass by a glob that never saw the new file. A path listed here but absent
195
+ # on disk is a FAILURE, never a skip.
196
+ #
197
+ # Checks 4-6 are file-scoped, so this script spelling its own literals out cannot
198
+ # self-match the way checks 1-3 could — no SELF_REL exemption is needed or wanted.
199
+ PR_FILES='public/chorus-plugin/agents/proposal-reviewer.md
200
+ plugins/chorus/skills/chorus-proposal-reviewer/SKILL.md
201
+ public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json
202
+ packages/chorus-pi/agents/chorus-proposal-reviewer.md
203
+ packages/chorus-dsh/skills/proposal-reviewer-chorus/SKILL.md
204
+ packages/openclaw-plugin/skills/proposal-reviewer/SKILL.md
205
+ public/skill/proposal-reviewer-chorus/SKILL.md'
206
+
207
+ # ── Files in check 4's scope ONLY ────────────────────────────────────────────
208
+ # The Kiro orchestrator's own prompt and the Kiro steering doc are not reviewer
209
+ # definitions — they DESCRIBE the reviewers' tool grants to the main agent that
210
+ # spawns them. A false "the reviewer has no shell" claim here misleads the
211
+ # orchestrator just as badly as one in the reviewer's own file, so they belong in
212
+ # the blacklist check. They must NOT be added to PR_FILES: check 5 requires the
213
+ # canonical rule verbatim, which is a reviewer-definition obligation, and check 6
214
+ # reads manifests neither of these files is.
215
+ # Same contract as PR_FILES: enumerated, not globbed, and a missing path FAILS.
216
+ CHECK4_EXTRA_FILES='public/kiro-plugin/.kiro/agents/chorus.md
217
+ public/kiro-plugin/.kiro/steering/chorus.md'
218
+
219
+ # ── Check 4 — no surface claims the reviewer's shell is unavailable ──────────
220
+ # These are the exact assertions the seven files carried before the fix. Each is
221
+ # long enough to be unambiguous: the truthful prose every surface DOES keep —
222
+ # "Any shell command beyond read-only inspection — no file writes …" — must not
223
+ # match, so no bare "shell"/"Bash" substring appears in this list.
224
+ echo "Check 4 — no proposal-reviewer surface (or Kiro orchestrator/steering doc) claims shell/Bash is unavailable"
225
+ PATTERNS_SHELL_DISABLED='Bash is disabled
226
+ no `shell`
227
+ cannot run shell
228
+ Do NOT run Bash
229
+ or run Bash commands
230
+ Running any shell commands'
231
+ CHECK4_FAILED=0
232
+ CHECK4_FILES=0
233
+ while IFS= read -r _rel; do
234
+ [ -n "$_rel" ] || continue
235
+ CHECK4_FILES=$((CHECK4_FILES + 1))
236
+ _abs="$ROOT/$_rel"
237
+ if [ ! -f "$_abs" ]; then
238
+ CHECK4_FAILED=1
239
+ echo " FAIL enumerated surface MISSING (not skipped): $_rel"
240
+ continue
241
+ fi
242
+ while IFS= read -r _pat; do
243
+ [ -n "$_pat" ] || continue
244
+ if file_has "$_pat" "$_abs"; then
245
+ CHECK4_FAILED=1
246
+ echo " FAIL shell-disabled claim \"$_pat\" — found in:"
247
+ echo " $_rel"
248
+ fi
249
+ done <<PATS4
250
+ $PATTERNS_SHELL_DISABLED
251
+ PATS4
252
+ done <<FILES4
253
+ $PR_FILES
254
+ $CHECK4_EXTRA_FILES
255
+ FILES4
256
+ if [ "$CHECK4_FAILED" -eq 0 ]; then
257
+ PASS=$((PASS + 1))
258
+ echo " PASS none of the 6 shell-disabled literals present in $CHECK4_FILES enumerated files"
259
+ else
260
+ FAIL=$((FAIL + 1))
261
+ fi
262
+ echo ""
263
+
264
+ # ── Check 5 — every surface carries the canonical read-only shell rule ───────
265
+ # Two markers, both required:
266
+ # * "READ-ONLY inspection only" — NOT "Bash is READ-ONLY", because Kiro's tool is
267
+ # named `shell` and its prompt reads "Shell is READ-ONLY inspection only".
268
+ # * "no installs, no test/build runs" — the forbidden list. Proposal review runs
269
+ # before any implementation exists, so test/build execution is out of scope here
270
+ # even though the task- and code-reviewer are allowed it.
271
+ # * "before flagging it as missing" — the existence-check obligation. Without it
272
+ # the capability grant alone does not stop the false positive this change fixes,
273
+ # since nothing obliges the reviewer to look before asserting a file is absent.
274
+ echo "Check 5 — every proposal-reviewer surface carries the canonical read-only rule"
275
+ CHECK5_FAILED=0
276
+ CHECK5_FILES=0
277
+ MARKERS_CANONICAL='READ-ONLY inspection only
278
+ no installs, no test/build runs
279
+ before flagging it as missing'
280
+ while IFS= read -r _rel; do
281
+ [ -n "$_rel" ] || continue
282
+ CHECK5_FILES=$((CHECK5_FILES + 1))
283
+ _abs="$ROOT/$_rel"
284
+ if [ ! -f "$_abs" ]; then
285
+ CHECK5_FAILED=1
286
+ echo " FAIL enumerated surface MISSING (not skipped): $_rel"
287
+ continue
288
+ fi
289
+ while IFS= read -r _marker; do
290
+ [ -n "$_marker" ] || continue
291
+ if ! file_has "$_marker" "$_abs"; then
292
+ CHECK5_FAILED=1
293
+ echo " FAIL canonical rule marker \"$_marker\" MISSING from:"
294
+ echo " $_rel"
295
+ fi
296
+ done <<MARK5
297
+ $MARKERS_CANONICAL
298
+ MARK5
299
+ done <<FILES5
300
+ $PR_FILES
301
+ FILES5
302
+ if [ "$CHECK5_FAILED" -eq 0 ]; then
303
+ PASS=$((PASS + 1))
304
+ echo " PASS all 3 canonical markers present in all $CHECK5_FILES enumerated surfaces"
305
+ else
306
+ FAIL=$((FAIL + 1))
307
+ fi
308
+ echo ""
309
+
310
+ # ── Check 6 — the two manifests that actually gate the capability ────────────
311
+ # Prose granting read-only shell is a lie if the harness never hands the tool over.
312
+ # Claude Code and Kiro are the only two surfaces that enforce tool access; the other
313
+ # five have no enforcement mechanism, so there is nothing to assert about them.
314
+ echo "Check 6 — tool grants match the rule (Claude Code \`disallowedTools\`, Kiro \`tools\`)"
315
+ CHECK6_FAILED=0
316
+ CC_AGENT="$ROOT/public/chorus-plugin/agents/proposal-reviewer.md"
317
+ if [ ! -f "$CC_AGENT" ]; then
318
+ CHECK6_FAILED=1
319
+ echo " FAIL Claude Code agent MISSING: public/chorus-plugin/agents/proposal-reviewer.md"
320
+ elif ! file_has 'disallowedTools:' "$CC_AGENT"; then
321
+ CHECK6_FAILED=1
322
+ echo " FAIL no \`disallowedTools:\` key in public/chorus-plugin/agents/proposal-reviewer.md"
323
+ echo " (the guard cannot certify Bash is absent from a list it cannot find)"
324
+ else
325
+ # The frontmatter list runs from `disallowedTools:` to the first line that is not
326
+ # a ` - item` entry. awk, not a YAML parser — this is a 6-line literal block.
327
+ # The key line itself is kept so YAML flow style (`disallowedTools: [Bash, Edit]`)
328
+ # is covered too, and the match is word-boundary rather than a whole-line `- Bash`
329
+ # so a quoted entry (`- "Bash"`) cannot slip through either.
330
+ # Blank lines and `#` comments INSIDE the list are skipped rather than treated as
331
+ # the end of it: YAML allows both, so exiting on one let `- Bash` placed after a
332
+ # comment sit in the deny list while this check reported PASS.
333
+ CC_BLOCK="$(awk '/^disallowedTools:/{f=1;print;next}
334
+ f&&/^[[:space:]]*$/{next}
335
+ f&&/^[[:space:]]*#/{next}
336
+ f&&/^[[:space:]]*-[[:space:]]/{print;next} f{exit}' "$CC_AGENT")"
337
+ if printf '%s\n' "$CC_BLOCK" | grep -qw 'Bash'; then
338
+ CHECK6_FAILED=1
339
+ echo " FAIL \`- Bash\` is back in \`disallowedTools\` of:"
340
+ echo " public/chorus-plugin/agents/proposal-reviewer.md"
341
+ fi
342
+ fi
343
+ KIRO_AGENT="$ROOT/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json"
344
+ if [ ! -f "$KIRO_AGENT" ]; then
345
+ CHECK6_FAILED=1
346
+ echo " FAIL Kiro agent MISSING: public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json"
347
+ else
348
+ # From the `"tools"` key to the line closing its array.
349
+ KIRO_BLOCK="$(awk '/"tools"[[:space:]]*:/{f=1} f{print; if (/\]/) exit}' "$KIRO_AGENT")"
350
+ if ! printf '%s\n' "$KIRO_BLOCK" | grep -qF '"shell"'; then
351
+ CHECK6_FAILED=1
352
+ echo " FAIL \`\"shell\"\` is not in the \`tools\` array of:"
353
+ echo " public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json"
354
+ fi
355
+ fi
356
+ if [ "$CHECK6_FAILED" -eq 0 ]; then
357
+ PASS=$((PASS + 1))
358
+ echo " PASS Claude Code does not disallow Bash; Kiro grants \`shell\`"
359
+ else
360
+ FAIL=$((FAIL + 1))
361
+ fi
362
+ echo ""
363
+
364
+ if [ -s "$SCAN_ERR_FILE" ]; then
365
+ FAIL=$((FAIL + 1))
366
+ echo " FAIL at least one grep could not scan its paths — see the ERROR lines above."
367
+ echo " A scan that never ran cannot certify anything; fix the paths and re-run."
368
+ echo ""
369
+ fi
370
+
371
+ echo "Results: $PASS check(s) passed, $FAIL failed"
372
+ [ "$FAIL" -eq 0 ]
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env bash
2
+ # test-spec-mode-resolution.sh — unit test for resolve-spec-mode.sh.
3
+ #
4
+ # resolve-spec-mode.sh is pure (env + filesystem only), so we drive it directly
5
+ # in subshells across the resolution matrix: explicit CHORUS_SPEC_MODE
6
+ # {lite, openspec, off, <invalid>} × OpenSpec {usable, missing, disabled} + unset.
7
+ # We simulate "OpenSpec usable" with a temp PROJECT_ROOT containing an openspec/
8
+ # dir plus a fake `openspec` on PATH; "missing" by dropping one of those; and
9
+ # "disabled" via CHORUS_OPENSPEC_MODE=off / CLAUDE_PLUGIN_OPTION_ENABLEOPENSPEC=false.
10
+ #
11
+ # Owner contract: explicit mode wins; UNSET → OpenSpec when usable, else lite.
12
+ # Bash 3.2 compatible (no associative arrays, no ${var,,}).
13
+ set -u
14
+
15
+ HERE="$(cd "$(dirname "$0")" && pwd)"
16
+ RESOLVER="${HERE}/../resolve-spec-mode.sh"
17
+ [ -f "$RESOLVER" ] || { echo "FATAL: resolver not found at $RESOLVER" >&2; exit 1; }
18
+
19
+ TMP="$(mktemp -d)"
20
+ trap 'rm -rf "$TMP"' EXIT
21
+
22
+ # A repo root WITH an openspec/ dir, and one WITHOUT.
23
+ ROOT_WITH="$TMP/with"; mkdir -p "$ROOT_WITH/openspec"
24
+ ROOT_WITHOUT="$TMP/without"; mkdir -p "$ROOT_WITHOUT"
25
+
26
+ # A fake `openspec` CLI on PATH; and a clean PATH that lacks openspec.
27
+ FAKEBIN="$TMP/bin"; mkdir -p "$FAKEBIN"
28
+ printf '#!/bin/sh\nexit 0\n' > "$FAKEBIN/openspec"; chmod +x "$FAKEBIN/openspec"
29
+ CLEAN_PATH="/usr/bin:/bin"
30
+ command -v openspec >/dev/null 2>&1 && [ -x "$(command -v openspec)" ] # informational only
31
+ # Sanity: ensure the clean PATH really lacks openspec, else the "missing CLI"
32
+ # cases would be invalid on this machine.
33
+ if PATH="$CLEAN_PATH" command -v openspec >/dev/null 2>&1; then
34
+ echo "FATAL: openspec is on the clean PATH ($CLEAN_PATH); cannot simulate missing CLI" >&2
35
+ exit 1
36
+ fi
37
+ PATH_WITH_CLI="$FAKEBIN:$CLEAN_PATH"
38
+
39
+ PASS=0; FAIL=0
40
+
41
+ # run <label> <expect_mode> <expect_active> <expect_fail:ok|fail> -- env assignments...
42
+ run() {
43
+ label="$1"; exp_mode="$2"; exp_active="$3"; exp_fail="$4"; shift 4
44
+ [ "$1" = "--" ] && shift
45
+ out="$(env -i HOME="$HOME" "$@" bash -c '
46
+ . "'"$RESOLVER"'" >/dev/null 2>&1
47
+ if [ -n "${SPEC_FAIL:-}" ]; then f=fail; else f=ok; fi
48
+ printf "%s|%s|%s" "${SPEC_MODE:-}" "${CHORUS_OPENSPEC_ACTIVE:-}" "$f"
49
+ ')"
50
+ want="${exp_mode}|${exp_active}|${exp_fail}"
51
+ if [ "$out" = "$want" ]; then
52
+ PASS=$((PASS+1)); printf ' PASS %s\n' "$label"
53
+ else
54
+ FAIL=$((FAIL+1)); printf ' FAIL %s\n want [%s] got [%s]\n' "$label" "$want" "$out"
55
+ fi
56
+ }
57
+
58
+ echo "spec-mode resolution matrix:"
59
+
60
+ # --- unset ---
61
+ run "unset + usable → openspec" openspec 1 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH"
62
+ run "unset + no openspec dir → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITHOUT"
63
+ run "unset + dir but no CLI → lite" lite 0 ok -- PATH="$CLEAN_PATH" PROJECT_ROOT="$ROOT_WITH"
64
+ run "unset + disabled(off) → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_OPENSPEC_MODE=off
65
+ run "unset + disabled(toggle) → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CLAUDE_PLUGIN_OPTION_ENABLEOPENSPEC=false
66
+
67
+ # --- explicit lite / off ---
68
+ run "lite + usable → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=lite
69
+ run "off + usable → off" off 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=off
70
+
71
+ # --- explicit openspec ---
72
+ run "openspec + usable → openspec" openspec 1 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=openspec
73
+ run "openspec + no dir → FAIL" openspec 0 fail -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITHOUT" CHORUS_SPEC_MODE=openspec
74
+ run "openspec + no CLI → FAIL" openspec 0 fail -- PATH="$CLEAN_PATH" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=openspec
75
+ run "openspec + disabled → FAIL" openspec 0 fail -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=openspec CHORUS_OPENSPEC_MODE=off
76
+
77
+ # --- invalid value falls back to default resolution ---
78
+ run "invalid + usable → openspec" openspec 1 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITH" CHORUS_SPEC_MODE=bogus
79
+ run "invalid + no dir → lite" lite 0 ok -- PATH="$PATH_WITH_CLI" PROJECT_ROOT="$ROOT_WITHOUT" CHORUS_SPEC_MODE=bogus
80
+
81
+ echo ""
82
+ echo "Results: $PASS passed, $FAIL failed"
83
+ [ "$FAIL" -eq 0 ]
@@ -4,7 +4,7 @@ description: Optional divergent-then-convergent dialogue for fuzzy ideas. Invoke
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.17.3"
7
+ version: "0.18.0"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus AI Agent collaboration platform — overview, common tools,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.17.3"
7
+ version: "0.18.0"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -344,9 +344,13 @@ To disable, reconfigure the plugin via `/plugin` settings or manually edit `~/.c
344
344
 
345
345
  When enabled, reviewers run as read-only sub-agents and post a VERDICT comment on the proposal/task/idea. Three possible outcomes: **PASS** (no issues), **PASS WITH NOTES** (minor non-blocking notes), or **FAIL** (BLOCKERs found). Results are advisory — they do not block approval, verification, or ship; the code-review gateway in particular is behavioral (it does not change the Idea's stored status). On a code-review FAIL, fix it via the `/chorus:quick-dev` workflow: `chorus_create_tasks` with `proposalUuid` set to the current approved proposal so the fix tasks attach to it. Group related small BLOCKERs into one cohesive task by default; split only materially large or independently testable fixes. Each fix task must self-check its acceptance criteria and pass independent task review plus admin verification. Re-run the gateway only after every fix task is successfully `done`; if there is a failed or cancelled fix task, stop and escalate instead. Disabling reduces token usage but removes the independent quality gate.
346
346
 
347
- ### 6. Enable OpenSpec Mode (Optional)
347
+ **First-principles alignment (a stage-tailored instruction in all three reviewers).** Each reviewer also checks, top-down, that the work still serves the *original Idea's intent*. It resolves the Idea from the entity under review (proposal-reviewer → the proposal's `inputUuids[0]`; task-reviewer → its proposal's `inputUuids[0]`; code-reviewer → the given `ideaUuid`), reads it with the existing `chorus_get_idea` + `chorus_get_elaboration` + `chorus_get_comments`, and builds the intent **baseline** from **human input only** — the Idea content + elaboration answers where `answeredBy.type == "user"` + comments where `author.type == "user"`. Agent-answered elaboration and agent-authored comments are audit context only: they cannot expand, shrink, or override the baseline. It flags **scope creep** (work beyond intent), **requirement loss / shrink** (intent dropped or reduced), or **semantic drift** (passes AC but misses the point). Unauthorized drift is a **BLOCKER → VERDICT: FAIL / reject**, downgraded to a cited `NOTE` only when traceable to a **human** authorization: a human-authored Idea comment (`author.type == "user"`), a human-answered elaboration entry (`answeredBy.type == "user"`), or an explicit human override at the gate. **An agent's own comment never authorizes**, so a drifting agent cannot self-clear. The alignment finding folds into the existing VERDICT; the dimension is skipped when the entity has no attached Idea.
348
348
 
349
- Opt-in spec-driven path: `/proposal`, `/develop`, `/yolo` write `proposal.md` / `design.md` / spec deltas on disk and mirror them into Chorus drafts. Fully optional — free-form authoring works without it. Activates only when all three hold: the `enableOpenSpec` toggle is on (default) and `CHORUS_OPENSPEC_MODE` ≠ `off`, an `openspec/` directory exists at the project root, and the `openspec` CLI is on `PATH`.
349
+ ### 6. Spec mode: OpenSpec (default when usable) vs spec-lite (fallback)
350
+
351
+ The SessionStart hook resolves one **spec mode** per session and prints a `## Spec Mode` section stating it. Resolution: an explicit `CHORUS_SPEC_MODE` (`lite`/`openspec`/`off`) wins; when unset, **OpenSpec is the default whenever it is usable** — the `enableOpenSpec` toggle on (default) and `CHORUS_OPENSPEC_MODE` ≠ `off`, an `openspec/` directory at the project root, and the `openspec` CLI on `PATH`. When OpenSpec is absent or disabled, the mode falls back to **spec-lite** — a Chorus-native, git-tracked model: a durable local spec `.chorus/specs/<slug>/spec.md` per capability (edited in place, **never synced** to Chorus), plus one dated folder per change effort `.chorus/specs/<slug>/<YYYY-MM-DD>-<change-slug>/` of plain-markdown docs named by Document type (`prd.md`, `tech_design.md`, …), each of those dated-folder docs mirrored 1:1 into a persistent Chorus Document (see the `spec-lite` skill). `CHORUS_SPEC_MODE=off` selects free-form (no spec artifact).
352
+
353
+ OpenSpec spec-driven path: `/proposal`, `/develop`, `/yolo` write `proposal.md` / `design.md` / spec deltas on disk and mirror them into Chorus drafts.
350
354
 
351
355
  **When the user wants it on** (e.g. they ran `/chorus enable openspec` after the `(OpenSpec off — …)` banner), actually **enable it for them** — run whichever steps are missing, don't just describe them:
352
356
 
@@ -355,9 +359,9 @@ npm i -g @fission-ai/openspec # 1. install the CLI if it's not on PATH (gl
355
359
  openspec init --tools claude # 2. scaffold openspec/ + wire up Claude Code's native commands/skills
356
360
  ```
357
361
 
358
- `openspec init` is interactive if you omit `--tools`; pass `--tools claude` to run it unattended. Chorus's detection only needs the `openspec/` directory, but wiring up Claude Code also gives OpenSpec its own commands + skills. The OpenSpec signal is read **once at SessionStart**, so it can't flip mid-session — after the steps succeed, tell the user to **re-launch the session**; the banner then reads `(OpenSpec Enabled)` and the stage skills fold in the `openspec-aware` skill automatically.
362
+ `openspec init` is interactive if you omit `--tools`; pass `--tools claude` to run it unattended. Chorus's detection only needs the `openspec/` directory, but wiring up Claude Code also gives OpenSpec its own commands + skills. The spec mode is resolved **once at SessionStart**, so it can't flip mid-session — after the steps succeed, tell the user to **re-launch the session**; the `## Spec Mode` section then reads `CHORUS_SPEC_MODE=openspec ()` and the stage skills fold in the `openspec-aware` skill automatically.
359
363
 
360
- To turn it off, flip `enableOpenSpec` to `false` or set `CHORUS_OPENSPEC_MODE=off` — the banner then reads a neutral `(OpenSpec off)`.
364
+ To turn OpenSpec off, flip `enableOpenSpec` to `false` or set `CHORUS_OPENSPEC_MODE=off` — the mode then falls back to **spec-lite** (or set `CHORUS_SPEC_MODE=off` for free-form). The `## Spec Mode` section always states the resolved mode + reason.
361
365
 
362
366
  ### 7. Daemon auto-start via `chorus agents add`
363
367
 
@@ -438,7 +442,8 @@ This is the core overview skill. For stage-specific workflows, use:
438
442
  | **Development** | `/develop` | Claim Tasks, report work, session & sub-agent management, Agent Teams integration |
439
443
  | **Review** | `/review` | Approve/reject Proposals, verify Tasks, project governance |
440
444
  | **Docs** | `/docs` | Consult the live Chorus documentation site to answer product-usage questions — UI workflow, agent/plugin setup, API/MCP, deployment, operations |
441
- | **OpenSpec mode** | `openspec-aware` | Opt-in **shared sub-procedure** invoked by `/proposal`, `/develop`, and `/yolo` whenever the user has the `openspec` CLI installed. Scaffolds `openspec/changes/<slug>/` on disk and mirrors files into Chorus document drafts via the `chorus-api.sh` wrapper. Skips silently in fallback mode. See `.claude/skills/openspec-aware/SKILL.md`. |
445
+ | **OpenSpec mode** | `openspec-aware` | **Shared sub-procedure** invoked by `/proposal`, `/develop`, and `/yolo` when the resolved spec mode is a usable OpenSpec (the default when `openspec/` + CLI present and not disabled). Scaffolds `openspec/changes/<slug>/` on disk and mirrors files into Chorus document drafts via the `chorus-api.sh` wrapper. No-op when the mode isn't a usable OpenSpec. See `.claude/skills/openspec-aware/SKILL.md`. |
446
+ | **spec-lite mode** | `spec-lite` | **Shared sub-procedure** and the fallback when OpenSpec isn't usable (or `CHORUS_SPEC_MODE=lite`). Durable local `.chorus/specs/<slug>/spec.md` (never synced) + dated per-change folders of Chorus-typed docs mirrored 1:1 into Chorus via `--arg-file`. No CLI/validation/archive. See `.claude/skills/spec-lite/SKILL.md`. |
442
447
 
443
448
  ### Getting Started
444
449
 
@@ -4,7 +4,7 @@ description: How to install, configure, and use the `chorus` CLI — install it,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.17.3"
7
+ version: "0.18.0"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, manage se
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.17.3"
7
+ version: "0.18.0"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -142,6 +142,10 @@ Each task and proposal includes a `commentCount` field — use it to decide whic
142
142
  >
143
143
  > In the no-OpenSpec fallback (no slug line, or no `openspec` CLI), edit the Document content directly via the existing MCP tool with no wrapper, no local file step.
144
144
 
145
+ > **Document update flow (spec-lite mode):** if the originating proposal `description` contains a locator line `Spec-lite: .chorus/specs/<slug>/<YYYY-MM-DD>-<change-slug>/`, the project's `prd` / `tech_design` / … Documents are **persistent mirrors** of the Chorus-typed docs in that **dated change folder** (`prd.md`, `tech_design.md`, …, named by Chorus Document type). Load the `spec-lite` skill (`skills/spec-lite/SKILL.md`). Locate the dated folder **deterministically** from that locator line (not by title/type, which isn't unique). Edit those `<type>.md` files in place (they are the source of truth for the change) and update the capability's durable `.chorus/specs/<slug>/spec.md` in place too — but **`spec.md` is never mirrored** (local only, no ids). Tick `- [ ]` acceptance points as work completes, then re-mirror each edited dated-folder file via `chorus mcp call chorus_pm_update_document … --arg-file content=.chorus/specs/<slug>/<YYYY-MM-DD>-<change-slug>/<type>.md` against its `documentUuid` (each update auto-increments the Document version = its modification history). No new tool/CLI — same `--arg-file` transport as OpenSpec. **Git history is the audit trail** (`git log -- .chorus/specs/<slug>/` for the whole capability — the durable `spec.md`'s diffs + each dated folder's change docs; `git log --follow -- <file>` to trace a single renamed file) — there is no changelog section to maintain.
146
+ >
147
+ > **Single-writer:** the folder is shared — in a multi-task wave, only the **orchestrator / main agent** edits + re-mirrors it; parallel workers report via `chorus_report_work` only. A non-orchestrator that must update it re-reads immediately before writing to detect conflicts.
148
+
145
149
  ### Step 5: Start Working
146
150
 
147
151
  **Sub-agent**: checkin to the task first:
@@ -223,21 +227,21 @@ chorus_submit_for_verify({
223
227
 
224
228
  > `to_verify` does NOT unblock downstream tasks — only `done` (after admin verification) does.
225
229
 
226
- > **Review Agent:** After `chorus_submit_for_verify`, the Chorus plugin's PostToolUse hook injects context instructing you to spawn `chorus:task-reviewer` — an independent, read-only review agent. You MUST spawn it yourself (it is NOT auto-launched). **Run it in foreground** (do NOT set `run_in_background`) wait for the VERDICT before proceeding. The reviewer posts a VERDICT comment on the task.
230
+ > **Review Agent:** After `chorus_submit_for_verify`, the Chorus plugin's PostToolUse hook injects context instructing you to spawn `chorus:task-reviewer` — an independent, read-only review agent. You MUST spawn it yourself (it is NOT auto-launched). Wait for it to complete in Claude Code, that means waiting for the sub-agent's completion notification; the launch result itself is never the verdict. The reviewer posts a VERDICT comment on the task.
227
231
 
228
- After the reviewer completes, read its VERDICT:
232
+ After the reviewer completes, read **this round's** VERDICT:
229
233
  ```
230
234
  chorus_get_comments({ targetType: "task", targetUuid: "<task-uuid>" })
231
235
  ```
232
- Find the most recent comment containing `VERDICT:` and act on it:
236
+ Find the `VERDICT:` comment posted **after you dispatched the reviewer** — not an older round's — and act on it. Do not advance the pipeline (verify or reopen) before you have read that comment:
233
237
 
234
238
  - **VERDICT: PASS** — All AC verified, no issues. Proceed to admin verification.
235
239
  - **VERDICT: PASS WITH NOTES** — All AC verified, minor notes. Proceed to admin verification (notes are non-blocking).
236
240
  - **VERDICT: FAIL** — BLOCKERs found. Do NOT verify. Fix the BLOCKERs listed in the reviewer's comment, then resubmit.
237
241
 
238
- If no new `VERDICT:` comment appears after the reviewer returns, it exhausted its `maxTurns` budget before posting. Respawn it ONCE with a concise-budget hint in the prompt: *"Stay within turn budget. Skip deep verification. Fetch task/proposal/comments, run only the core tests, and post your VERDICT comment within the first 12 turns."* If the second attempt still produces no VERDICT, review manually using the checklist and proceed.
242
+ If no new `VERDICT:` comment appears after the reviewer returns, check what it *did* post. A comment reporting that the round limit was reached, or any other explicit refusal to review, is a deliberate escalation to a human: STOP do not respawn, do not self-review, do not post a VERDICT of your own. If it posted nothing at all, respawn it ONCE, telling it to stay within its turn budget and reserve its last turns for the VERDICT, then apply this same check again to what the retry posts. An explicit refusal from the retry still means STOP; only a second true silence lets you review the task yourself as a read-only pass using the checklist and POST the VERDICT comment. **Absence is never a PASS.**
239
243
 
240
- > **Final code-review gateway (after the Idea's LAST task is verified):** when the task you just verified is the **last** task of its idea-rooted proposal, the feature is about to ship — the PostToolUse hook injects a reminder to spawn `chorus:code-reviewer` (gated by `enableCodeReviewer`, default on). Spawn it yourself in **foreground**, passing the `ideaUuid` + round number; it reviews the Idea's **aggregate** code change across all its tasks (cross-task integration, architecture, security, regression, feature-level coverage) and posts one `VERDICT` comment on the **idea**. `PASS` / `PASS WITH NOTES` → ship; `FAIL` → fix via `/chorus:quick-dev` (`chorus_create_tasks` with `proposalUuid` set to the current approved proposal so the fix tasks attach to it — do NOT reopen the verified tasks). Group related small BLOCKERs by default; split only materially large or independently testable fixes. Require AC self-check, independent task review, and admin verification for every fix task. Re-run aggregate review only after every fix is successfully `done`; a failed or cancelled fix stops the loop and escalates, bounded by `maxCodeReviewRounds`. Advisory/behavioral, like the other reviewers. Run it **before** any idea-completion report.
244
+ > **Final code-review gateway (after the Idea's LAST task is verified):** when the task you just verified is the **last** task of its idea-rooted proposal, the feature is about to ship — the PostToolUse hook injects a reminder to spawn `chorus:code-reviewer` (gated by `enableCodeReviewer`, default on). Spawn it yourself and wait for its completion notification, passing the `ideaUuid` + round number; then read THIS round's `VERDICT` comment on the idea before deciding. It reviews the Idea's **aggregate** code change across all its tasks (cross-task integration, architecture, security, regression, feature-level coverage) and posts one `VERDICT` comment on the **idea**. `PASS` / `PASS WITH NOTES` → ship; `FAIL` → fix via `/chorus:quick-dev` (`chorus_create_tasks` with `proposalUuid` set to the current approved proposal so the fix tasks attach to it — do NOT reopen the verified tasks). Group related small BLOCKERs by default; split only materially large or independently testable fixes. Require AC self-check, independent task review, and admin verification for every fix task. Re-run aggregate review only after every fix is successfully `done`; a failed or cancelled fix stops the loop and escalates, bounded by `maxCodeReviewRounds`. Advisory/behavioral, like the other reviewers. Run it **before** any idea-completion report.
241
245
 
242
246
  ### Step 9: Handle Review Feedback
243
247
 
@@ -293,9 +297,8 @@ When using Claude Code's Agent Teams to run multiple sub-agents in parallel, Cho
293
297
  chorus_checkin()
294
298
  chorus_list_tasks({ projectUuid: "<project-uuid>" })
295
299
 
296
- # 2. Create Claude Code team and spawn sub-agents
297
- TeamCreate({ team_name: "feature-x" })
298
-
300
+ # 2. Dispatch one sub-agent per unblocked task, issuing the whole wave in a
301
+ # SINGLE message so they run in parallel. There is no team object to create.
299
302
  # Pass only task UUIDs — plugin auto-injects session workflow
300
303
  Task({
301
304
  name: "frontend-worker",
@@ -307,6 +310,8 @@ Task({
307
310
  - Task UUID(s)
308
311
  - NO session UUID, NO workflow boilerplate — plugin auto-injects everything
309
312
 
313
+ > **Fallback:** if sub-agent dispatch is unavailable (no sub-agent primitive, permission denied) or sub-agents fail repeatedly, execute the wave's tasks sequentially as the main agent following Steps 1-9 above. Slower, same pipeline.
314
+
310
315
  ### Sub-Agent Workflow
311
316
 
312
317
  The plugin injects session UUID and workflow into the sub-agent's context automatically.
@@ -4,7 +4,7 @@ description: Chorus documentation router — consult the live Chorus docs site t
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.17.3"
7
+ version: "0.18.0"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Idea workflow — claim ideas, run elaboration rounds, and p
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.17.3"
7
+ version: "0.18.0"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---