crewly 1.20.214 → 1.20.216

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 (183) hide show
  1. package/config/hooks/agent-status/report.sh +45 -6
  2. package/config/roles/team-leader/fragments/role-boundary.md +2 -1
  3. package/config/roles/team-leader/prompt.md +9 -5
  4. package/config/roles/team-leader/role-boundaries.md +3 -2
  5. package/config/roles/team-leader/tl-addon.md +9 -5
  6. package/config/skills/agent/core/ask-owner/SKILL.md +9 -2
  7. package/config/skills/agent/core/ask-owner/execute.sh +1 -1
  8. package/config/skills/agent/core/project-tickets/SKILL.md +44 -12
  9. package/config/skills/agent/core/project-tickets/execute.sh +46 -13
  10. package/config/skills/agent/core/project-tickets/execute.test.sh +19 -0
  11. package/config/skills/team-leader/delegate-task/SKILL.md +40 -0
  12. package/config/skills/team-leader/delegate-task/execute.sh +39 -1
  13. package/dist/backend/backend/src/constants.d.ts +101 -10
  14. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  15. package/dist/backend/backend/src/constants.js +119 -9
  16. package/dist/backend/backend/src/constants.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts +2 -1
  18. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
  19. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +26 -3
  20. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +10 -2
  22. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +17 -2
  24. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +2 -1
  26. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts.map +1 -1
  27. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +4 -2
  28. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js.map +1 -1
  29. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +32 -0
  31. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  32. package/dist/backend/backend/src/controllers/team/team-lead-share.controller.d.ts +27 -0
  33. package/dist/backend/backend/src/controllers/team/team-lead-share.controller.d.ts.map +1 -0
  34. package/dist/backend/backend/src/controllers/team/team-lead-share.controller.js +92 -0
  35. package/dist/backend/backend/src/controllers/team/team-lead-share.controller.js.map +1 -0
  36. package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
  37. package/dist/backend/backend/src/controllers/team/team.routes.js +4 -0
  38. package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
  39. package/dist/backend/backend/src/index.d.ts.map +1 -1
  40. package/dist/backend/backend/src/index.js +16 -0
  41. package/dist/backend/backend/src/index.js.map +1 -1
  42. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
  44. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  45. package/dist/backend/backend/src/services/decisions/decision-contract.d.ts +25 -1
  46. package/dist/backend/backend/src/services/decisions/decision-contract.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/decisions/decision-contract.js +39 -2
  48. package/dist/backend/backend/src/services/decisions/decision-contract.js.map +1 -1
  49. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/decisions/decision.service.js +17 -1
  51. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  52. package/dist/backend/backend/src/services/open-items/open-item-card.d.ts +26 -0
  53. package/dist/backend/backend/src/services/open-items/open-item-card.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/open-items/open-item-card.js +71 -1
  55. package/dist/backend/backend/src/services/open-items/open-item-card.js.map +1 -1
  56. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  57. package/dist/backend/backend/src/services/open-items/open-items.service.js +6 -3
  58. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  59. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +46 -1
  61. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
  62. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +35 -0
  63. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  64. package/dist/backend/backend/src/services/orc/work-item-destination.js +75 -2
  65. package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
  66. package/dist/backend/backend/src/services/project-tickets/autopilot-speed-command.d.ts +108 -0
  67. package/dist/backend/backend/src/services/project-tickets/autopilot-speed-command.d.ts.map +1 -0
  68. package/dist/backend/backend/src/services/project-tickets/autopilot-speed-command.js +223 -0
  69. package/dist/backend/backend/src/services/project-tickets/autopilot-speed-command.js.map +1 -0
  70. package/dist/backend/backend/src/services/project-tickets/autopilot-speed.wiring.d.ts +57 -0
  71. package/dist/backend/backend/src/services/project-tickets/autopilot-speed.wiring.d.ts.map +1 -0
  72. package/dist/backend/backend/src/services/project-tickets/autopilot-speed.wiring.js +90 -0
  73. package/dist/backend/backend/src/services/project-tickets/autopilot-speed.wiring.js.map +1 -0
  74. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +18 -4
  75. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  76. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +18 -4
  77. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  78. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +135 -14
  79. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +111 -18
  81. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  82. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +73 -4
  83. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +86 -7
  85. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
  86. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts +1 -1
  87. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts.map +1 -1
  88. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js +7 -0
  89. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js.map +1 -1
  90. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +104 -4
  91. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  92. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +424 -12
  93. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  94. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +2 -1
  96. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  97. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/slack/slack-initializer.js +10 -0
  99. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  100. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +7 -0
  101. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +25 -2
  103. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  104. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +23 -0
  105. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  106. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +74 -2
  107. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  108. package/dist/backend/backend/src/services/tl-delegation/lead-share.d.ts +108 -0
  109. package/dist/backend/backend/src/services/tl-delegation/lead-share.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/tl-delegation/lead-share.js +170 -0
  111. package/dist/backend/backend/src/services/tl-delegation/lead-share.js.map +1 -0
  112. package/dist/backend/backend/src/services/tl-delegation/lead-share.wiring.d.ts +32 -0
  113. package/dist/backend/backend/src/services/tl-delegation/lead-share.wiring.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/tl-delegation/lead-share.wiring.js +47 -0
  115. package/dist/backend/backend/src/services/tl-delegation/lead-share.wiring.js.map +1 -0
  116. package/dist/backend/backend/src/services/tl-delegation/tl-delegation.service.d.ts +207 -0
  117. package/dist/backend/backend/src/services/tl-delegation/tl-delegation.service.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/tl-delegation/tl-delegation.service.js +377 -0
  119. package/dist/backend/backend/src/services/tl-delegation/tl-delegation.service.js.map +1 -0
  120. package/dist/backend/backend/src/types/decision.types.d.ts +6 -1
  121. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  122. package/dist/backend/backend/src/types/decision.types.js +1 -1
  123. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +46 -4
  124. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  125. package/dist/backend/backend/src/types/ticket-autopilot.types.js +43 -2
  126. package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
  127. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +1 -1
  128. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  129. package/dist/backend/backend/src/types/v2/work-item.types.js +1 -0
  130. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  131. package/dist/backend/backend/src/utils/defaultPrompts.js +3 -3
  132. package/dist/backend/backend/src/utils/defaultPrompts.js.map +1 -1
  133. package/dist/backend/build-info.json +2 -2
  134. package/dist/cli/backend/src/constants.d.ts +101 -10
  135. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  136. package/dist/cli/backend/src/constants.js +119 -9
  137. package/dist/cli/backend/src/constants.js.map +1 -1
  138. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  139. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
  140. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  141. package/dist/cli/backend/src/services/decisions/decision-contract.d.ts +25 -1
  142. package/dist/cli/backend/src/services/decisions/decision-contract.d.ts.map +1 -1
  143. package/dist/cli/backend/src/services/decisions/decision-contract.js +39 -2
  144. package/dist/cli/backend/src/services/decisions/decision-contract.js.map +1 -1
  145. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  146. package/dist/cli/backend/src/services/decisions/decision.service.js +17 -1
  147. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  148. package/dist/cli/backend/src/services/open-items/open-item-card.d.ts +26 -0
  149. package/dist/cli/backend/src/services/open-items/open-item-card.d.ts.map +1 -1
  150. package/dist/cli/backend/src/services/open-items/open-item-card.js +71 -1
  151. package/dist/cli/backend/src/services/open-items/open-item-card.js.map +1 -1
  152. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  153. package/dist/cli/backend/src/services/open-items/open-items.service.js +6 -3
  154. package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
  155. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +35 -0
  156. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  157. package/dist/cli/backend/src/services/orc/work-item-destination.js +75 -2
  158. package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
  159. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  160. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +2 -1
  161. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  162. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +7 -0
  163. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  164. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +25 -2
  165. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  166. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +23 -0
  167. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  168. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +74 -2
  169. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  170. package/dist/cli/backend/src/types/decision.types.d.ts +6 -1
  171. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  172. package/dist/cli/backend/src/types/decision.types.js +1 -1
  173. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +46 -4
  174. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  175. package/dist/cli/backend/src/types/ticket-autopilot.types.js +43 -2
  176. package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
  177. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +1 -1
  178. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  179. package/dist/cli/backend/src/types/v2/work-item.types.js +1 -0
  180. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  181. package/frontend/dist/assets/{index-917db1b8.js → index-bc4e2a93.js} +274 -274
  182. package/frontend/dist/index.html +1 -1
  183. package/package.json +1 -1
@@ -123,9 +123,11 @@ export const TICKET_AUTOPILOT_CONSTANTS = {
123
123
  /** WorkItem type / `metadata.kind` of the goal replan the driver receives when nothing is left to triage */
124
124
  REPLAN_WORK_ITEM_TYPE: 'goal_replan',
125
125
  REPLAN_METADATA_KIND: 'goal_replan',
126
- /** Default and largest number of goal replans per project per local day (0 = off) */
127
- DEFAULT_REPLANS_PER_DAY: 1,
128
- REPLANS_PER_DAY_LIMIT: 5,
126
+ /**
127
+ * Largest explicit `replansPerDay` (0 = off). Absent, the speed mode's
128
+ * daily cap applies ({@link TICKET_AUTOPILOT_CONSTANTS.SPEED_MODES}).
129
+ */
130
+ REPLANS_PER_DAY_LIMIT: 12,
129
131
  /** Tickets closed (done / cancelled) this many days back are listed in the replan brief */
130
132
  REPLAN_CLOSED_LOOKBACK_DAYS: 7,
131
133
  /** Most closed tickets listed in the replan brief */
@@ -145,14 +147,79 @@ export const TICKET_AUTOPILOT_CONSTANTS = {
145
147
  REPLAN_TTL_HOURS_LIMIT: 48,
146
148
  /** A live replan older than this stops holding triage once there are tickets to triage (ms) */
147
149
  REPLAN_YIELD_AFTER_MS: 60 * 60 * 1000,
148
- /**
149
- * After a replan that opened no tickets: skip the next 2 days, then 4,
150
- * then 7 (doubling, capped). Reset by a new goal / OKR or a new ticket.
150
+ /*
151
+ * After a replan that opened no tickets the next one waits for the speed
152
+ * mode's `emptyReplanRetry` (1 h / next day / next week). Reset by a new
153
+ * goal / OKR or a new ticket.
151
154
  */
152
- REPLAN_BACKOFF_FIRST_DAYS: 2,
153
- REPLAN_BACKOFF_MAX_DAYS: 7,
154
155
  /** Goals-log entries older than this are not an active goal (days); OKRs keep their own status */
155
156
  REPLAN_GOAL_ACTIVE_DAYS: 30,
157
+ // --- Speed modes (specs/2026-10-04-autopilot-speed-modes.md) ---
158
+ /** Speed modes, slowest last */
159
+ SPEED_MODE_NAMES: ['rush', 'normal', 'chill'],
160
+ /** Mode of a project that never set one (every project before speed modes) */
161
+ DEFAULT_SPEED_MODE: 'normal',
162
+ /**
163
+ * What each mode supplies. Explicit settings win: `dailyBudgetTokens`
164
+ * (and boosts) over the mode's budget, `replansPerDay` over its daily cap.
165
+ *
166
+ * - `replanMinGapMs` — a replan never starts sooner than this after the last one
167
+ * - `replansPerDayCap` — hard cap per local day (the safety brake)
168
+ * - `selfReviewEveryMs` — cadence of the driver's self-review
169
+ * - `emptyReplanRetry` — after a replan that opened no tickets: retry this
170
+ * many hours later, or on the local day this many days after the replan's day
171
+ * - `dailyBudgetTokens` — the budget when the project sets none
172
+ */
173
+ SPEED_MODES: {
174
+ rush: {
175
+ replanMinGapMs: 60 * 60 * 1000,
176
+ replansPerDayCap: 12,
177
+ selfReviewEveryMs: 60 * 60 * 1000,
178
+ emptyReplanRetry: { unit: 'hours', amount: 1 },
179
+ dailyBudgetTokens: 50_000_000,
180
+ },
181
+ normal: {
182
+ replanMinGapMs: 3 * 60 * 60 * 1000,
183
+ replansPerDayCap: 4,
184
+ selfReviewEveryMs: 24 * 60 * 60 * 1000,
185
+ emptyReplanRetry: { unit: 'days', amount: 1 },
186
+ dailyBudgetTokens: 20_000_000,
187
+ },
188
+ chill: {
189
+ replanMinGapMs: 0,
190
+ replansPerDayCap: 1,
191
+ selfReviewEveryMs: 7 * 24 * 60 * 60 * 1000,
192
+ emptyReplanRetry: { unit: 'days', amount: 7 },
193
+ dailyBudgetTokens: 8_000_000,
194
+ },
195
+ },
196
+ /** WorkItem type / `metadata.kind` of the driver's self-review */
197
+ SELF_REVIEW_WORK_ITEM_TYPE: 'autopilot_self_review',
198
+ SELF_REVIEW_METADATA_KIND: 'autopilot_self_review',
199
+ /** A self-review still live after this long no longer holds the next one (a queued one is cancelled) */
200
+ SELF_REVIEW_LIVE_MAX_MS: 2 * 60 * 60 * 1000,
201
+ /** Longest self-review field accepted (chars) */
202
+ SELF_REVIEW_FIELD_MAX_CHARS: 600,
203
+ /** Self-reviews kept per project (newest last) */
204
+ SELF_REVIEW_HISTORY: 10,
205
+ /** Most characters of the goal quoted in the self-review brief */
206
+ SELF_REVIEW_GOAL_MAX_CHARS: 800,
207
+ /** A self-review older than this is not shown in the evening digest */
208
+ SELF_REVIEW_DIGEST_MAX_AGE_MS: 24 * 60 * 60 * 1000,
209
+ /** Stop reasons (why the autopilot is not producing work), most decisive first */
210
+ STOP_REASONS: ['paused', 'budget_reached', 'system_error', 'waiting_on_owner', 'no_ideas'],
211
+ /** Failed project WorkItems this recent count as a system error (ms) */
212
+ STOP_SYSTEM_ERROR_LOOKBACK_MS: 6 * 60 * 60 * 1000,
213
+ /** An autopilot WorkItem still queued this long is stuck delivery (a system error, ms) */
214
+ STOP_STUCK_DELIVERY_MS: 60 * 60 * 1000,
215
+ /** The metric line of a replan ticket (`Metric: <goal metric> → <expected effect>`) */
216
+ METRIC_LINE_PREFIX: 'Metric: ',
217
+ /** Shortest metric reference accepted (chars) */
218
+ METRIC_MIN_CHARS: 5,
219
+ /** Longest metric reference accepted (chars) */
220
+ METRIC_MAX_CHARS: 300,
221
+ /** How often the owner's speed DM command re-reads the project names (ms) */
222
+ SPEED_PROJECT_CACHE_REFRESH_MS: 60 * 1000,
156
223
  };
157
224
  /**
158
225
  * Safe restart: drain in-flight agent turns before a shutdown kills the PTYs,
@@ -5866,7 +5933,9 @@ export const DECISION_CONSTANTS = {
5866
5933
  QUESTION_MIN_CHARS: 8,
5867
5934
  /** Allowed option count */
5868
5935
  MIN_OPTIONS: 2,
5869
- MAX_OPTIONS: 3,
5936
+ MAX_OPTIONS: 5,
5937
+ /** Two yes/no asks on one ticket this close together that read as either/or are rejected (ms) */
5938
+ EITHER_OR_WINDOW_MS: 60 * 1000,
5870
5939
  /** Max characters of an option label (Slack button text max is 75) */
5871
5940
  OPTION_LABEL_MAX_CHARS: 40,
5872
5941
  /** Max characters of an option's optional detail line */
@@ -6030,6 +6099,47 @@ export const WORK_ITEM_DESTINATION_CONSTANTS = {
6030
6099
  /** The one line every prompt carries about where to answer */
6031
6100
  PROMPT_LINE: 'Answer where you were asked; a new topic goes in a new thread.',
6032
6101
  };
6102
+ /**
6103
+ * Team leads delegate instead of doing the work (crewly#1083,
6104
+ * specs/2026-10-04-tl-delegation.md): owner-thread hand-over, the execution
6105
+ * nudge, lead share of team tokens, and "no member fits" records.
6106
+ */
6107
+ export const TL_DELEGATION_CONSTANTS = {
6108
+ /** WorkItem.metadata / add-body field: the owner's Slack thread key a delegation answers */
6109
+ OWNER_THREAD_FIELD: 'ownerThread',
6110
+ /** A done item still lets its agent post in the owner's thread this long (ms) */
6111
+ DONE_THREAD_GRACE_MS: 60 * 60 * 1000,
6112
+ /** Claude Code tools that count as hands-on file edits */
6113
+ EDIT_TOOLS: ['Edit', 'Write', 'MultiEdit', 'NotebookEdit'],
6114
+ /** Edits in the window that trigger a nudge */
6115
+ EDIT_THRESHOLD: 6,
6116
+ /** Sliding window for counting edits (ms) */
6117
+ WINDOW_MS: 20 * 60 * 1000,
6118
+ /** At most one nudge per lead per this long (ms) */
6119
+ NUDGE_COOLDOWN_MS: 30 * 60 * 1000,
6120
+ /** A delegation this soon after a nudge counts as following it (ms) */
6121
+ FOLLOW_WINDOW_MS: 30 * 60 * 1000,
6122
+ /** Members named in a nudge */
6123
+ NUDGE_MAX_MEMBERS: 3,
6124
+ /** Tag that opens the nudge text */
6125
+ NUDGE_TAG: '[CREWLY-NUDGE]',
6126
+ /** Note tag on a WorkItem the lead kept because no member fits */
6127
+ NO_MEMBER_FITS_TAG: '[NO-MEMBER-FITS]',
6128
+ /** A lead share above this is flagged */
6129
+ FLAG_SHARE: 0.5,
6130
+ /** Below this many team tokens in the period a share is not flagged (too little to judge) */
6131
+ MIN_TEAM_TOKENS: 1_000_000,
6132
+ /** "This week" = the last N days */
6133
+ WEEK_DAYS: 7,
6134
+ /** State file in CREWLY_HOME (nudge counts, kept-work records) */
6135
+ STATE_FILENAME: 'tl-delegation.json',
6136
+ /** Kept-work records retained */
6137
+ MAX_RECORDS: 500,
6138
+ /** Max characters of a recorded reason / work line */
6139
+ MAX_TEXT_CHARS: 300,
6140
+ /** Accepted tool_name from the hook */
6141
+ TOOL_NAME_PATTERN: /^[A-Za-z0-9_-]{1,64}$/,
6142
+ };
6033
6143
  /**
6034
6144
  * Harness-owned reply routing (specs/2026-10-02-harness-owned-routing.md).
6035
6145
  */