@chorus-aidlc/chorus 0.17.3 → 0.18.1

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 (457) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +345 -341
  3. package/.next/standalone/.next/app-path-routes-manifest.json +35 -35
  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_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  42. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  46. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  47. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  50. package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
  51. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  53. package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
  54. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/admin.html +2 -2
  56. package/.next/standalone/.next/server/app/admin.rsc +2 -2
  57. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
  65. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
  79. package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -1
  84. package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
  98. package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
  101. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  104. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
  111. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
  114. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
  117. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
  120. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/events/notifications/route.js +1 -1
  130. package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/events/route.js +1 -1
  133. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  140. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
  146. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
  147. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  152. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js.nft.json +1 -1
  155. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
  157. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/api/mcp/route.js +1 -1
  160. package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  161. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  163. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  164. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  166. package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
  167. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
  169. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
  170. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  171. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
  172. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
  173. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
  175. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
  178. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
  179. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  180. package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
  181. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
  184. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
  185. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  186. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  187. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  189. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  193. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  195. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  196. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  197. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  198. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  199. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  201. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  203. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  204. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
  205. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  206. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  207. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  209. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
  210. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +1 -1
  211. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  213. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  215. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
  216. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  217. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  218. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
  219. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  220. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js.nft.json +1 -1
  221. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  222. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  223. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  224. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  225. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  227. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  228. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  230. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  231. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  233. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  234. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
  235. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  236. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  237. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
  238. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  239. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  240. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
  241. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  242. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  243. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
  244. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  245. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  246. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
  247. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  248. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  249. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
  250. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  251. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  252. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
  253. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/index.html +2 -2
  255. package/.next/standalone/.next/server/app/index.rsc +2 -2
  256. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  257. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  258. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  259. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  260. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  261. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  262. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  263. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  264. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  265. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  266. package/.next/standalone/.next/server/app/login.html +2 -2
  267. package/.next/standalone/.next/server/app/login.rsc +2 -2
  268. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  269. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  270. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  271. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  272. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  273. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  274. package/.next/standalone/.next/server/app/projects.html +2 -2
  275. package/.next/standalone/.next/server/app/projects.rsc +3 -3
  276. package/.next/standalone/.next/server/app/settings.html +2 -2
  277. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  278. package/.next/standalone/.next/server/app-paths-manifest.json +35 -35
  279. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  280. package/.next/standalone/.next/server/chunks/{5201.js → 1416.js} +2 -2
  281. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  282. package/.next/standalone/.next/server/chunks/{3630.js → 2195.js} +1 -1
  283. package/.next/standalone/.next/server/chunks/2460.js +1 -0
  284. package/.next/standalone/.next/server/chunks/2572.js +2 -2
  285. package/.next/standalone/.next/server/chunks/2758.js +1 -0
  286. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  287. package/.next/standalone/.next/server/chunks/3419.js +1 -1
  288. package/.next/standalone/.next/server/chunks/4066.js +1 -0
  289. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  290. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  291. package/.next/standalone/.next/server/chunks/5453.js +1 -1
  292. package/.next/standalone/.next/server/chunks/5489.js +1 -1
  293. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  294. package/.next/standalone/.next/server/chunks/6506.js +2 -2
  295. package/.next/standalone/.next/server/chunks/6737.js +1 -0
  296. package/.next/standalone/.next/server/chunks/679.js +1 -1
  297. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  298. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  299. package/.next/standalone/.next/server/chunks/7578.js +2 -2
  300. package/.next/standalone/.next/server/chunks/7675.js +1 -0
  301. package/.next/standalone/.next/server/chunks/7789.js +1 -0
  302. package/.next/standalone/.next/server/chunks/{1201.js → 8030.js} +2 -2
  303. package/.next/standalone/.next/server/chunks/920.js +1 -1
  304. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  305. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  306. package/.next/standalone/.next/server/chunks/9931.js +1 -1
  307. package/.next/standalone/.next/server/instrumentation.js +1 -1
  308. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  309. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  310. package/.next/standalone/.next/server/pages/404.html +2 -2
  311. package/.next/standalone/.next/server/pages/500.html +1 -1
  312. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  313. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  314. package/.next/standalone/.next/static/chunks/11595.f080a1d100972212.js +1 -0
  315. package/.next/standalone/.next/static/chunks/14628-283d3983d1fb36c9.js +1 -0
  316. package/.next/standalone/.next/static/chunks/{29305-f587e7e81bc0b200.js → 17562-56f932146e9e6c94.js} +4 -4
  317. package/.next/standalone/.next/static/chunks/25080-25ad29e64c855338.js +1 -0
  318. package/.next/standalone/.next/static/chunks/28698-7fb271ffc6e63a26.js +1 -0
  319. package/.next/standalone/.next/static/chunks/{95225-96b44da3ebd6ddad.js → 32736-aeaaa1e4c4d5529b.js} +1 -1
  320. package/.next/standalone/.next/static/chunks/33456.20313bd67a5c41cc.js +1 -0
  321. package/.next/standalone/.next/static/chunks/4860.3b555a398cdffb19.js +1 -0
  322. package/.next/standalone/.next/static/chunks/75257-99c0ce24b436847b.js +1 -0
  323. package/.next/standalone/.next/static/chunks/79919-0c6dcda1dd8646f0.js +1 -0
  324. package/.next/standalone/.next/static/chunks/91328-f501e3c3ca519a92.js +1 -0
  325. package/.next/standalone/.next/static/chunks/94643-e54eff17e941a93b.js +1 -0
  326. package/.next/standalone/.next/static/chunks/99373.b8a95d1bec5ad4e7.js +1 -0
  327. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-f3c6431432d42c7c.js +1 -0
  328. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-77b175e52a85f3cb.js → page-5d723f974bdad33b.js} +1 -1
  329. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-8d3b1f4d8b76d66c.js +1 -0
  330. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-57c698dea2fa6e29.js +1 -0
  331. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-69d3162667f85677.js → page-d2bb622855e746f1.js} +1 -1
  332. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-fc255dc3612032b9.js +1 -0
  333. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-a3f83031dfbafc81.js → page-f032ee8a80d1f56a.js} +1 -1
  334. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-46a0ddfd0421b0a8.js +1 -0
  335. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-3c7ff3a40a4615ac.js → page-3a83748ce0ae1c4f.js} +1 -1
  336. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-7b8e11fdc5b596d0.js → page-8af9bb9f96ab0258.js} +1 -1
  337. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b02939820affdae5.js +1 -0
  338. package/.next/standalone/.next/static/chunks/app/onboarding/page-d2c0c7951114e763.js +1 -0
  339. package/.next/standalone/.next/static/chunks/{webpack-dffb97a4feb8faba.js → webpack-de8a36d232a91d6b.js} +1 -1
  340. package/.next/standalone/.next/static/css/44f13b43a3de716d.css +1 -0
  341. package/.next/standalone/package.json +1 -1
  342. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +2 -2
  343. package/.next/standalone/public/chorus-plugin/agents/code-reviewer.md +1 -0
  344. package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +12 -3
  345. package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +4 -0
  346. package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
  347. package/.next/standalone/public/chorus-plugin/bin/on-post-submit-for-verify.sh +3 -3
  348. package/.next/standalone/public/chorus-plugin/bin/on-post-submit-proposal.sh +3 -3
  349. package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +2 -2
  350. package/.next/standalone/public/chorus-plugin/bin/on-pre-spawn-agent.sh +22 -9
  351. package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +39 -64
  352. package/.next/standalone/public/chorus-plugin/bin/on-subagent-start.sh +44 -29
  353. package/.next/standalone/public/chorus-plugin/bin/on-subagent-stop.sh +100 -29
  354. package/.next/standalone/public/chorus-plugin/bin/resolve-spec-mode.sh +107 -0
  355. package/.next/standalone/public/chorus-plugin/bin/test-syntax.sh +6 -2
  356. package/.next/standalone/public/chorus-plugin/bin/tests/test-resolver-drift.sh +46 -0
  357. package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity-negative.sh +328 -0
  358. package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity.sh +372 -0
  359. package/.next/standalone/public/chorus-plugin/bin/tests/test-spec-mode-resolution.sh +83 -0
  360. package/.next/standalone/public/chorus-plugin/bin/tests/test-subagent-session-name.sh +599 -0
  361. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  362. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +11 -6
  363. package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +1 -1
  364. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +14 -9
  365. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  366. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  367. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +27 -31
  368. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +11 -1
  369. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +14 -7
  370. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +6 -4
  371. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +10 -8
  372. package/.next/standalone/public/chorus-plugin/skills/spec-lite/SKILL.md +147 -0
  373. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +49 -34
  374. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-code-reviewer.json +1 -1
  375. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json +2 -1
  376. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-task-reviewer.json +1 -1
  377. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus.md +1 -1
  378. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  379. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +1 -1
  380. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +9 -7
  381. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  382. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  383. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +35 -27
  384. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +9 -1
  385. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +14 -7
  386. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +2 -2
  387. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +8 -8
  388. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-spec-lite/SKILL.md +147 -0
  389. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +39 -25
  390. package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +11 -6
  391. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  392. package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +41 -0
  393. package/.next/standalone/public/kiro-plugin/bin/on-post-submit-for-verify.sh +3 -3
  394. package/.next/standalone/public/kiro-plugin/bin/on-post-submit-proposal.sh +3 -3
  395. package/.next/standalone/public/kiro-plugin/bin/on-post-verify-task.sh +2 -2
  396. package/.next/standalone/public/kiro-plugin/bin/resolve-spec-mode.sh +107 -0
  397. package/.next/standalone/public/kiro-plugin/manifest.txt +2 -0
  398. package/.next/standalone/public/skill/chorus/SKILL.md +11 -1
  399. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -0
  400. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  401. package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +11 -1
  402. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +5 -2
  403. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  404. package/.next/standalone/public/skill/review-chorus/SKILL.md +5 -3
  405. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +4 -0
  406. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +23 -7
  407. package/README.ja.md +3 -3
  408. package/README.ko.md +3 -3
  409. package/README.md +3 -3
  410. package/README.zh.md +3 -3
  411. package/chorus.mjs +30 -2
  412. package/cli/agent-cli-config.mjs +323 -0
  413. package/cli/agent-launcher.mjs +44 -16
  414. package/cli/child-exit.mjs +77 -0
  415. package/cli/claude-spawner.mjs +26 -14
  416. package/cli/codex-spawner.mjs +27 -16
  417. package/cli/control-handler.mjs +104 -6
  418. package/cli/credentials.mjs +7 -0
  419. package/cli/daemon-config.mjs +14 -0
  420. package/cli/daemon-rest-client.mjs +98 -29
  421. package/cli/daemon.mjs +37 -7
  422. package/cli/dsh-managed-config.mjs +26 -28
  423. package/cli/dsh-spawner.mjs +27 -16
  424. package/cli/init/steps/credential-seed.mjs +1 -1
  425. package/cli/kiro-spawner.mjs +26 -16
  426. package/cli/launch-diagnostics.mjs +67 -0
  427. package/cli/login.mjs +17 -1
  428. package/cli/pi-spawner.mjs +23 -13
  429. package/cli/prompts.mjs +52 -2
  430. package/cli/spawner-select.mjs +6 -11
  431. package/package.json +1 -1
  432. package/.next/standalone/.next/server/chunks/1114.js +0 -1
  433. package/.next/standalone/.next/server/chunks/1155.js +0 -1
  434. package/.next/standalone/.next/server/chunks/6465.js +0 -1
  435. package/.next/standalone/.next/server/chunks/8105.js +0 -1
  436. package/.next/standalone/.next/server/chunks/8232.js +0 -1
  437. package/.next/standalone/.next/static/chunks/11595.f7c3ef5cd7fc8feb.js +0 -1
  438. package/.next/standalone/.next/static/chunks/33456.c81079032acc2966.js +0 -1
  439. package/.next/standalone/.next/static/chunks/45262-38b332523f00a223.js +0 -1
  440. package/.next/standalone/.next/static/chunks/46021-f5d072b0cbcb7fac.js +0 -1
  441. package/.next/standalone/.next/static/chunks/4860.f0cfb1201191ae88.js +0 -1
  442. package/.next/standalone/.next/static/chunks/66609-64a01d5cb415465b.js +0 -1
  443. package/.next/standalone/.next/static/chunks/79919-c5a2a3fd8f5f9204.js +0 -1
  444. package/.next/standalone/.next/static/chunks/94394-38194b81b489275c.js +0 -1
  445. package/.next/standalone/.next/static/chunks/94643-f1bdf37fb3bb6adb.js +0 -1
  446. package/.next/standalone/.next/static/chunks/96482-2b3bdb2544d72e5a.js +0 -1
  447. package/.next/standalone/.next/static/chunks/99373.3c23ac2efbd4db02.js +0 -1
  448. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-66328332f62c7371.js +0 -1
  449. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-87ceae13c4950fc9.js +0 -1
  450. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-45e95154e546460e.js +0 -1
  451. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-b7b2017e5be69564.js +0 -1
  452. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-8b06834ca0f663bb.js +0 -1
  453. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-efe5326c47aca9ca.js +0 -1
  454. package/.next/standalone/.next/static/chunks/app/onboarding/page-0ce33b9327fe3d8c.js +0 -1
  455. package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +0 -1
  456. /package/.next/standalone/.next/static/{wuqYN129vOIGymh_NEdZe → dot63ILT878Tloqi7Czj_}/_buildManifest.js +0 -0
  457. /package/.next/standalone/.next/static/{wuqYN129vOIGymh_NEdZe → dot63ILT878Tloqi7Czj_}/_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 ]