crewly 1.20.376 → 1.20.379

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 (96) hide show
  1. package/config/hooks/destructive-git-guard/guard.mjs +168 -9
  2. package/config/hooks/destructive-git-guard/local-gates.json +13 -0
  3. package/config/skills/agent/core/record-local-gate/SKILL.md +46 -0
  4. package/config/skills/agent/core/record-local-gate/execute.sh +87 -0
  5. package/config/skills/agent/core/record-local-gate/execute.test.sh +64 -0
  6. package/config/skills/agent/core/record-tl-verification/SKILL.md +39 -0
  7. package/config/skills/agent/core/record-tl-verification/execute.sh +71 -0
  8. package/config/skills/agent/core/record-tl-verification/execute.test.sh +56 -0
  9. package/dist/backend/backend/src/constants.d.ts +64 -0
  10. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  11. package/dist/backend/backend/src/constants.js +64 -0
  12. package/dist/backend/backend/src/constants.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/experiments/experiments.routes.d.ts +1 -1
  14. package/dist/backend/backend/src/controllers/experiments/experiments.routes.js +1 -1
  15. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts +17 -0
  16. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js +49 -0
  18. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.d.ts +2 -0
  20. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.js +5 -1
  22. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.js.map +1 -1
  23. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  24. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +7 -1
  25. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  26. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts.map +1 -1
  27. package/dist/backend/backend/src/controllers/trace/trace.controller.js +60 -7
  28. package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -1
  29. package/dist/backend/backend/src/index.d.ts.map +1 -1
  30. package/dist/backend/backend/src/index.js +23 -0
  31. package/dist/backend/backend/src/index.js.map +1 -1
  32. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  33. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +5 -0
  34. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  35. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +24 -1
  36. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -1
  37. package/dist/backend/backend/src/services/experiments/experiment.service.js +49 -0
  38. package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -1
  39. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +22 -0
  40. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  41. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +64 -3
  42. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  43. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +30 -2
  44. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +63 -7
  46. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  47. package/dist/backend/backend/src/services/project-tickets/ticket-routine-nudge.d.ts +59 -0
  48. package/dist/backend/backend/src/services/project-tickets/ticket-routine-nudge.d.ts.map +1 -0
  49. package/dist/backend/backend/src/services/project-tickets/ticket-routine-nudge.js +123 -0
  50. package/dist/backend/backend/src/services/project-tickets/ticket-routine-nudge.js.map +1 -0
  51. package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.d.ts +173 -0
  52. package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.d.ts.map +1 -0
  53. package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.js +263 -0
  54. package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.js.map +1 -0
  55. package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.loader.d.ts +35 -0
  56. package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.loader.d.ts.map +1 -0
  57. package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.loader.js +47 -0
  58. package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.loader.js.map +1 -0
  59. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.d.ts +20 -1
  60. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.js +30 -3
  62. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.js.map +1 -1
  63. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.d.ts +7 -0
  64. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.js +8 -1
  66. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.js.map +1 -1
  67. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts +39 -0
  68. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js +93 -2
  70. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts +13 -1
  72. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js +1 -0
  74. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js.map +1 -1
  75. package/dist/backend/backend/src/services/v3/owner-receipt/verified-spot-check.d.ts +110 -0
  76. package/dist/backend/backend/src/services/v3/owner-receipt/verified-spot-check.d.ts.map +1 -0
  77. package/dist/backend/backend/src/services/v3/owner-receipt/verified-spot-check.js +243 -0
  78. package/dist/backend/backend/src/services/v3/owner-receipt/verified-spot-check.js.map +1 -0
  79. package/dist/backend/backend/src/services/v3/owner-receipt/verified-spot-check.loader.d.ts +27 -0
  80. package/dist/backend/backend/src/services/v3/owner-receipt/verified-spot-check.loader.d.ts.map +1 -0
  81. package/dist/backend/backend/src/services/v3/owner-receipt/verified-spot-check.loader.js +45 -0
  82. package/dist/backend/backend/src/services/v3/owner-receipt/verified-spot-check.loader.js.map +1 -0
  83. package/dist/backend/backend/src/types/experiment.types.d.ts +14 -0
  84. package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -1
  85. package/dist/backend/backend/src/types/experiment.types.js.map +1 -1
  86. package/dist/backend/build-info.json +2 -2
  87. package/dist/cli/backend/src/constants.d.ts +64 -0
  88. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  89. package/dist/cli/backend/src/constants.js +64 -0
  90. package/dist/cli/backend/src/constants.js.map +1 -1
  91. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  92. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +5 -0
  93. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  94. package/frontend/dist/assets/{index-b4db6abe.js → index-19c47468.js} +76 -76
  95. package/frontend/dist/index.html +1 -1
  96. package/package.json +1 -1
@@ -8,8 +8,13 @@
8
8
  */
9
9
  /** What happened to one ask. */
10
10
  export type ReceiptOutcome =
11
- /** Ticket done */
11
+ /** Ticket done, and nothing says it closed by silence (the owner confirmed it, or it needed no OK) */
12
12
  'done'
13
+ /**
14
+ * Ticket done because nobody objected before the auto-accept deadline
15
+ * (#1316): accepted, never checked by the owner
16
+ */
17
+ | 'auto_accepted'
13
18
  /** Answered; waiting for the owner's OK (待验收) */
14
19
  | 'to_review'
15
20
  /** Someone is on it */
@@ -134,6 +139,11 @@ export interface ReceiptHighlight {
134
139
  summary: string;
135
140
  /** Deliverables found in the answer (the line prefers tickets that have some) */
136
141
  deliverableCount: number;
142
+ /**
143
+ * It closed because nobody objected in time, not because the owner
144
+ * confirmed it (#1316) — the line says so
145
+ */
146
+ acceptedBySilence: boolean;
137
147
  completedAt: string;
138
148
  }
139
149
  /**
@@ -192,6 +202,8 @@ export interface OwnerReceiptState {
192
202
  lastSentAt?: string;
193
203
  /** Local date (YYYY-MM-DD) of the last send, so one day gets one receipt */
194
204
  lastSentLocalDate?: string;
205
+ /** Local date (YYYY-MM-DD) the weekly pulls line last went out (#1387), so one week gets one line */
206
+ lastPullsLocalDate?: string;
195
207
  /** The one-time format ask (#856 follow-up), once it was asked */
196
208
  formatAsk?: ReceiptFormatAsk;
197
209
  }
@@ -1 +1 @@
1
- {"version":3,"file":"owner-receipt.types.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/v3/owner-receipt/owner-receipt.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,gCAAgC;AAChC,MAAM,MAAM,cAAc;AACxB,kBAAkB;AAChB,MAAM;AACR,iDAAiD;GAC/C,WAAW;AACb,uBAAuB;GACrB,aAAa;AACf,cAAc;GACZ,SAAS;AACX,mDAAmD;GACjD,SAAS;AACX,yBAAyB;GACvB,WAAW,CAAC;AAEhB,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAO5C,CAAC;AAEX,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACvC,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,4BAA4B;AAC5B,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,UAAU,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,oCAAoC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oEAAoE;AACpE,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtE,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,GAAG,kBAAkB,CAAC;IAC7C,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,KAAK,EAAE,oBAAoB,GAAG,WAAW,GAAG,UAAU,CAAC;IACvD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzF;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,cAAc,GAAG,mBAAmB,CAAA;CAAE,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,eAAe,GAAG,kBAAkB,CAAC;IAC7C,mEAAmE;IACnE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iCAAiC;AACjC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,mEAAmE;IACnE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACzC,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACzD,iEAAiE;IACjE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,QAAQ,EAAE,eAAe,CAAC;IAC1B,mFAAmF;IACnF,cAAc,EAAE,qBAAqB,EAAE,CAAC;IACxC,4EAA4E;IAC5E,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,kFAAkF;IAClF,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,mCAAmC;AACnC,MAAM,WAAW,oBAAoB;IACnC,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAEtE,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAQzD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,OAAO,GACb;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,oBAAoB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiB7E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,oBAAoB,CAM7D"}
1
+ {"version":3,"file":"owner-receipt.types.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/v3/owner-receipt/owner-receipt.types.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ import { OWNER_RECEIPT_CONSTANTS } from '../../../constants.js';
10
10
  /** All outcomes, in display order. */
11
11
  export const RECEIPT_OUTCOMES = [
12
12
  'done',
13
+ 'auto_accepted',
13
14
  'to_review',
14
15
  'in_progress',
15
16
  'blocked',
@@ -1 +1 @@
1
- {"version":3,"file":"owner-receipt.types.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/v3/owner-receipt/owner-receipt.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAiBhE,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD,MAAM;IACN,WAAW;IACX,aAAa;IACb,SAAS;IACT,SAAS;IACT,WAAW;CACH,CAAC;AAgMX,0BAA0B;AAC1B,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,EAAW;IACzC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA6B,EAC7B,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IAC3G,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,MAAM,IAAI,GAAyB,EAAE,GAAG,OAAO,EAAE,CAAC;IAClD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;QACnG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;QACpI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6DAA6D,EAAE,CAAC;QAC7H,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,uBAAuB,CAAC,YAAY;QAC1C,QAAQ,EAAE,uBAAuB,CAAC,gBAAgB;KACnD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"owner-receipt.types.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/v3/owner-receipt/owner-receipt.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAsBhE,sCAAsC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD,MAAM;IACN,eAAe;IACf,WAAW;IACX,aAAa;IACb,SAAS;IACT,SAAS;IACT,WAAW;CACH,CAAC;AAuMX,0BAA0B;AAC1B,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,EAAW;IACzC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA6B,EAC7B,KAAc;IAEd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IAC3G,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,MAAM,IAAI,GAAyB,EAAE,GAAG,OAAO,EAAE,CAAC;IAClD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;QACnG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;QACpI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6DAA6D,EAAE,CAAC;QAC7H,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,uBAAuB,CAAC,YAAY;QAC1C,QAAQ,EAAE,uBAAuB,CAAC,gBAAgB;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Verified-work spot-check (#1315, phase 1) — once a day, pick a few WorkItems
3
+ * that were verified in the last 24 hours and re-check that every file
4
+ * artifact recorded as their evidence still exists.
5
+ *
6
+ * Read-only: it never changes a WorkItem and never re-runs a command (that is
7
+ * a later phase). Evidence that is not a local file (URLs, commands, blocked
8
+ * reports) is counted as skipped, not as a pass or a failure. Pure apart from
9
+ * the injected file check and random source, so a day's sample is repeatable.
10
+ *
11
+ * @module services/v3/owner-receipt/verified-spot-check
12
+ */
13
+ import type { WorkItem } from '../../../types/v2/work-item.types.js';
14
+ /** One recorded artifact that is no longer there. */
15
+ export interface SpotCheckDiscrepancy {
16
+ /** WorkItem id (for the log and the API; the owner line does not show it) */
17
+ workItemId: string;
18
+ /** Team name, or the unknown-team label */
19
+ team: string;
20
+ /** The artifact path as recorded */
21
+ artifactPath: string;
22
+ }
23
+ /** Result of one spot-check run. */
24
+ export interface SpotCheckResult {
25
+ /** When the run was made (ISO) */
26
+ at: string;
27
+ /** Verified WorkItems in the window that had a local file artifact to look at */
28
+ eligible: number;
29
+ /** WorkItems picked */
30
+ sampled: number;
31
+ /** File artifacts looked at on the disk */
32
+ artifactsChecked: number;
33
+ /** Evidence entries not checked: URLs, commands, blocked reports, relative paths with no base */
34
+ skipped: number;
35
+ /** Of `skipped`: file artifacts inside a worktree the janitor already removed ("worktree cleaned") */
36
+ worktreeCleaned: number;
37
+ discrepancies: SpotCheckDiscrepancy[];
38
+ }
39
+ /** Inputs of {@link runSpotCheck}. */
40
+ export interface SpotCheckInput {
41
+ workItems: readonly WorkItem[];
42
+ now: Date;
43
+ /** Team name of an agent session, or null */
44
+ teamOf: (session: string) => string | null;
45
+ /** Whether a file or directory exists at an absolute path */
46
+ exists: (absolutePath: string) => Promise<boolean>;
47
+ /** Random number in [0, 1); default is a generator seeded by the day */
48
+ random?: () => number;
49
+ /** Items to pick (default {@link OWNER_RECEIPT_CONSTANTS}.VERIFIED_SPOT_CHECK.SAMPLE_SIZE) */
50
+ sampleSize?: number;
51
+ /** Home directory for `~/` paths */
52
+ homeDir?: string;
53
+ }
54
+ /** A recorded file artifact to look at. */
55
+ interface FileTarget {
56
+ raw: string;
57
+ /** Absolute path candidates, in order; empty = cannot be resolved */
58
+ candidates: string[];
59
+ }
60
+ /**
61
+ * Deterministic random source (mulberry32).
62
+ *
63
+ * @param seed - Any integer
64
+ * @returns Generator of numbers in [0, 1)
65
+ */
66
+ export declare function seededRandom(seed: number): () => number;
67
+ /**
68
+ * Seed for a calendar day, so a second run on the same day picks the same items.
69
+ *
70
+ * @param now - The run time
71
+ * @returns Integer seed
72
+ */
73
+ export declare function daySeed(now: Date): number;
74
+ /**
75
+ * Split a WorkItem's recorded evidence into file artifacts to look at and a
76
+ * count of entries that are not checked.
77
+ *
78
+ * @param wi - WorkItem
79
+ * @param homeDir - Home directory for `~/`
80
+ * @returns Targets and the skipped count
81
+ */
82
+ export declare function fileTargetsOf(wi: WorkItem, homeDir: string): {
83
+ targets: FileTarget[];
84
+ skipped: number;
85
+ };
86
+ /**
87
+ * The worktree root an absolute path lies in: the WorkItem's recorded
88
+ * worktree, else the directory after a known worktree marker.
89
+ *
90
+ * @param abs - Absolute artifact path
91
+ * @param wi - The WorkItem
92
+ * @returns The worktree root, or null when the path is outside any worktree
93
+ */
94
+ export declare function worktreeRootOf(abs: string, wi: WorkItem): string | null;
95
+ /**
96
+ * Run the spot-check.
97
+ *
98
+ * @param input - WorkItems, clock, team lookup, file check
99
+ * @returns What was sampled and what is missing
100
+ */
101
+ export declare function runSpotCheck(input: SpotCheckInput): Promise<SpotCheckResult>;
102
+ /**
103
+ * The owner line: always present, zero is said out loud. No WorkItem ids.
104
+ *
105
+ * @param r - The run
106
+ * @returns Slack mrkdwn, one to five lines
107
+ */
108
+ export declare function renderSpotCheck(r: SpotCheckResult): string;
109
+ export {};
110
+ //# sourceMappingURL=verified-spot-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-spot-check.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/v3/owner-receipt/verified-spot-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAGrE,qDAAqD;AACrD,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,gBAAgB,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,oBAAoB,EAAE,CAAC;CACvC;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC/B,GAAG,EAAE,IAAI,CAAC;IACV,6CAA6C;IAC7C,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC3C,6DAA6D;IAC7D,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,8FAA8F;IAC9F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,2CAA2C;AAC3C,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CASvD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAKzC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA+BvG;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAavE;AAeD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAmFlF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAU1D"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Verified-work spot-check (#1315, phase 1) — once a day, pick a few WorkItems
3
+ * that were verified in the last 24 hours and re-check that every file
4
+ * artifact recorded as their evidence still exists.
5
+ *
6
+ * Read-only: it never changes a WorkItem and never re-runs a command (that is
7
+ * a later phase). Evidence that is not a local file (URLs, commands, blocked
8
+ * reports) is counted as skipped, not as a pass or a failure. Pure apart from
9
+ * the injected file check and random source, so a day's sample is repeatable.
10
+ *
11
+ * @module services/v3/owner-receipt/verified-spot-check
12
+ */
13
+ import * as path from 'path';
14
+ import { fileURLToPath } from 'url';
15
+ import { OWNER_RECEIPT_CONSTANTS, WORKTREE_CONSTANTS } from '../../../constants.js';
16
+ import { artifactBaseDirs } from '../../task-pool/completion-evidence.service.js';
17
+ /**
18
+ * Deterministic random source (mulberry32).
19
+ *
20
+ * @param seed - Any integer
21
+ * @returns Generator of numbers in [0, 1)
22
+ */
23
+ export function seededRandom(seed) {
24
+ let a = seed >>> 0;
25
+ return () => {
26
+ a = (a + 0x6d2b79f5) >>> 0;
27
+ let t = a;
28
+ t = Math.imul(t ^ (t >>> 15), t | 1);
29
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
30
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
31
+ };
32
+ }
33
+ /**
34
+ * Seed for a calendar day, so a second run on the same day picks the same items.
35
+ *
36
+ * @param now - The run time
37
+ * @returns Integer seed
38
+ */
39
+ export function daySeed(now) {
40
+ const day = now.toISOString().slice(0, 10);
41
+ let h = 2166136261;
42
+ for (let i = 0; i < day.length; i++)
43
+ h = Math.imul(h ^ day.charCodeAt(i), 16777619);
44
+ return h >>> 0;
45
+ }
46
+ /**
47
+ * Split a WorkItem's recorded evidence into file artifacts to look at and a
48
+ * count of entries that are not checked.
49
+ *
50
+ * @param wi - WorkItem
51
+ * @param homeDir - Home directory for `~/`
52
+ * @returns Targets and the skipped count
53
+ */
54
+ export function fileTargetsOf(wi, homeDir) {
55
+ const evidence = wi.output?.['evidence'];
56
+ const targets = [];
57
+ let skipped = 0;
58
+ if (!Array.isArray(evidence))
59
+ return { targets, skipped };
60
+ const bases = artifactBaseDirs(wi);
61
+ for (const entry of evidence) {
62
+ const e = (typeof entry === 'object' && entry !== null ? entry : {});
63
+ const raw = e['type'] === 'artifact' && typeof e['path'] === 'string' ? e['path'].trim() : '';
64
+ if (!raw) {
65
+ skipped += 1; // a command or a blocked report
66
+ continue;
67
+ }
68
+ const scheme = /^([a-z][a-z0-9+.-]*:)\/\//i.exec(raw)?.[1]?.toLowerCase();
69
+ let local = raw;
70
+ if (scheme === 'file:') {
71
+ try {
72
+ local = fileURLToPath(raw);
73
+ }
74
+ catch {
75
+ skipped += 1;
76
+ continue;
77
+ }
78
+ }
79
+ else if (scheme) {
80
+ skipped += 1; // http(s) or another URL: not a file on this machine
81
+ continue;
82
+ }
83
+ else if (raw === '~' || raw.startsWith('~/')) {
84
+ local = path.join(homeDir, raw.slice(1));
85
+ }
86
+ targets.push({ raw, candidates: path.isAbsolute(local) ? [local] : bases.map((b) => path.resolve(b, local)) });
87
+ }
88
+ return { targets, skipped };
89
+ }
90
+ /**
91
+ * The worktree root an absolute path lies in: the WorkItem's recorded
92
+ * worktree, else the directory after a known worktree marker.
93
+ *
94
+ * @param abs - Absolute artifact path
95
+ * @param wi - The WorkItem
96
+ * @returns The worktree root, or null when the path is outside any worktree
97
+ */
98
+ export function worktreeRootOf(abs, wi) {
99
+ for (const base of artifactBaseDirsOfWorktree(wi)) {
100
+ if (abs === base || abs.startsWith(base + path.sep))
101
+ return base;
102
+ }
103
+ const norm = abs.split(path.sep).join('/');
104
+ for (const marker of OWNER_RECEIPT_CONSTANTS.VERIFIED_SPOT_CHECK.WORKTREE_MARKERS) {
105
+ const needle = `/${marker}/`;
106
+ const at = norm.indexOf(needle);
107
+ if (at < 0)
108
+ continue;
109
+ const rest = norm.slice(at + needle.length).split('/')[0];
110
+ if (rest)
111
+ return norm.slice(0, at + needle.length) + rest;
112
+ }
113
+ return null;
114
+ }
115
+ /**
116
+ * Recorded worktree paths of a WorkItem (`metadata.worktree.path` / `workdir`).
117
+ *
118
+ * @param wi - The WorkItem
119
+ * @returns Absolute paths
120
+ */
121
+ function artifactBaseDirsOfWorktree(wi) {
122
+ const wt = (wi.metadata ?? {})[WORKTREE_CONSTANTS.METADATA_KEY];
123
+ if (typeof wt !== 'object' || wt === null)
124
+ return [];
125
+ const rec = wt;
126
+ return ['path', 'workdir'].map((k) => rec[k]).filter((v) => typeof v === 'string' && path.isAbsolute(v));
127
+ }
128
+ /**
129
+ * Run the spot-check.
130
+ *
131
+ * @param input - WorkItems, clock, team lookup, file check
132
+ * @returns What was sampled and what is missing
133
+ */
134
+ export async function runSpotCheck(input) {
135
+ const C = OWNER_RECEIPT_CONSTANTS.VERIFIED_SPOT_CHECK;
136
+ const to = input.now.getTime();
137
+ const from = to - C.WINDOW_MS;
138
+ const homeDir = input.homeDir ?? '';
139
+ const eligible = [];
140
+ for (const wi of input.workItems) {
141
+ if (wi.status !== 'verified' || !wi.completedAt)
142
+ continue;
143
+ const t = Date.parse(wi.completedAt);
144
+ if (!Number.isFinite(t) || t < from || t > to)
145
+ continue;
146
+ const { targets, skipped } = fileTargetsOf(wi, homeDir);
147
+ if (targets.length === 0)
148
+ continue;
149
+ eligible.push({ wi, targets, skipped });
150
+ }
151
+ // Stable order first, so the same seed picks the same items.
152
+ eligible.sort((a, b) => a.wi.id.localeCompare(b.wi.id));
153
+ const rand = input.random ?? seededRandom(daySeed(input.now));
154
+ const picked = [...eligible];
155
+ for (let i = picked.length - 1; i > 0; i--) {
156
+ const j = Math.floor(rand() * (i + 1));
157
+ [picked[i], picked[j]] = [picked[j], picked[i]];
158
+ }
159
+ const sample = picked.slice(0, Math.max(0, input.sampleSize ?? C.SAMPLE_SIZE));
160
+ const result = {
161
+ at: input.now.toISOString(),
162
+ eligible: eligible.length,
163
+ sampled: sample.length,
164
+ artifactsChecked: 0,
165
+ skipped: 0,
166
+ worktreeCleaned: 0,
167
+ discrepancies: [],
168
+ };
169
+ for (const { wi, targets, skipped } of sample) {
170
+ result.skipped += skipped;
171
+ const team = (wi.target ? input.teamOf(wi.target) : null) ?? OWNER_RECEIPT_CONSTANTS.UNASSIGNED_TEAM;
172
+ for (const target of targets) {
173
+ if (target.candidates.length === 0) {
174
+ result.skipped += 1; // relative path and no project or worktree to resolve it against
175
+ continue;
176
+ }
177
+ result.artifactsChecked += 1;
178
+ let found = false;
179
+ for (const c of target.candidates) {
180
+ try {
181
+ if (await input.exists(c)) {
182
+ found = true;
183
+ break;
184
+ }
185
+ }
186
+ catch {
187
+ // an unreadable path counts as not found
188
+ }
189
+ }
190
+ if (!found) {
191
+ // The janitor removes worktrees after merge: a file inside a worktree
192
+ // that is itself gone was cleaned, not lost.
193
+ let cleaned = true;
194
+ for (const c of target.candidates) {
195
+ const root = worktreeRootOf(c, wi);
196
+ let rootGone = false;
197
+ if (root) {
198
+ try {
199
+ rootGone = !(await input.exists(root));
200
+ }
201
+ catch {
202
+ rootGone = false;
203
+ }
204
+ }
205
+ if (!rootGone) {
206
+ cleaned = false; // outside any worktree, or its worktree still exists: really missing
207
+ break;
208
+ }
209
+ }
210
+ if (cleaned) {
211
+ result.artifactsChecked -= 1;
212
+ result.skipped += 1;
213
+ result.worktreeCleaned += 1;
214
+ continue;
215
+ }
216
+ }
217
+ if (!found)
218
+ result.discrepancies.push({ workItemId: wi.id, team, artifactPath: target.raw });
219
+ }
220
+ }
221
+ return result;
222
+ }
223
+ /**
224
+ * The owner line: always present, zero is said out loud. No WorkItem ids.
225
+ *
226
+ * @param r - The run
227
+ * @returns Slack mrkdwn, one to five lines
228
+ */
229
+ export function renderSpotCheck(r) {
230
+ const d = r.discrepancies.length;
231
+ const noun = d === 1 ? 'discrepancy' : 'discrepancies';
232
+ const head = `*Spot-check of verified work:* ${r.sampled} sampled, ${d} ${noun}`;
233
+ if (r.sampled === 0)
234
+ return `${head} (nothing verified in the last day had a file to look at)`;
235
+ if (d === 0)
236
+ return head;
237
+ const max = OWNER_RECEIPT_CONSTANTS.VERIFIED_SPOT_CHECK.MAX_LISTED;
238
+ const lines = r.discrepancies.slice(0, max).map((x) => `• ${x.team}: \`${x.artifactPath}\` is gone`);
239
+ if (d > max)
240
+ lines.push(`• +${d - max} more`);
241
+ return [head, ...lines].join('\n');
242
+ }
243
+ //# sourceMappingURL=verified-spot-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-spot-check.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/v3/owner-receipt/verified-spot-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Loader for the verified-work spot-check (#1315): reads the WorkItems and the
3
+ * team index, checks files on the real disk, and hands them to the pure
4
+ * {@link runSpotCheck}.
5
+ *
6
+ * @module services/v3/owner-receipt/verified-spot-check.loader
7
+ */
8
+ import type { WorkItem } from '../../../types/v2/work-item.types.js';
9
+ import { type SpotCheckResult } from './verified-spot-check.js';
10
+ /** Where the loader reads from. */
11
+ export interface SpotCheckLoaderDeps {
12
+ listWorkItems: () => Promise<WorkItem[]>;
13
+ /** session → team name */
14
+ loadTeamIndex: () => Promise<Map<string, string>>;
15
+ /** File check, injectable for tests; default is `fs.stat` */
16
+ exists?: (absolutePath: string) => Promise<boolean>;
17
+ /** Random source, injectable for tests */
18
+ random?: () => number;
19
+ }
20
+ /**
21
+ * Build the `loadSpotCheck` dependency of the owner receipt service.
22
+ *
23
+ * @param deps - Data sources
24
+ * @returns Function that runs the spot-check as of `now`
25
+ */
26
+ export declare function createSpotCheckLoader(deps: SpotCheckLoaderDeps): (now: Date) => Promise<SpotCheckResult>;
27
+ //# sourceMappingURL=verified-spot-check.loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-spot-check.loader.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/v3/owner-receipt/verified-spot-check.loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE9E,mCAAmC;AACnC,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,0BAA0B;IAC1B,aAAa,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAiBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC,eAAe,CAAC,CAYxG"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Loader for the verified-work spot-check (#1315): reads the WorkItems and the
3
+ * team index, checks files on the real disk, and hands them to the pure
4
+ * {@link runSpotCheck}.
5
+ *
6
+ * @module services/v3/owner-receipt/verified-spot-check.loader
7
+ */
8
+ import * as fs from 'fs/promises';
9
+ import * as os from 'os';
10
+ import { runSpotCheck } from './verified-spot-check.js';
11
+ /**
12
+ * Whether anything exists at a path.
13
+ *
14
+ * @param p - Absolute path
15
+ * @returns True when `fs.stat` succeeds
16
+ */
17
+ async function statExists(p) {
18
+ try {
19
+ await fs.stat(p);
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ /**
27
+ * Build the `loadSpotCheck` dependency of the owner receipt service.
28
+ *
29
+ * @param deps - Data sources
30
+ * @returns Function that runs the spot-check as of `now`
31
+ */
32
+ export function createSpotCheckLoader(deps) {
33
+ return async (now) => {
34
+ const [workItems, teams] = await Promise.all([deps.listWorkItems(), deps.loadTeamIndex()]);
35
+ return runSpotCheck({
36
+ workItems,
37
+ now,
38
+ teamOf: (session) => teams.get(session) ?? null,
39
+ exists: deps.exists ?? statExists,
40
+ homeDir: os.homedir(),
41
+ ...(deps.random ? { random: deps.random } : {}),
42
+ });
43
+ };
44
+ }
45
+ //# sourceMappingURL=verified-spot-check.loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-spot-check.loader.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/v3/owner-receipt/verified-spot-check.loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAwB,MAAM,0BAA0B,CAAC;AAa9E;;;;;GAKG;AACH,KAAK,UAAU,UAAU,CAAC,CAAS;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,OAAO,KAAK,EAAE,GAAS,EAA4B,EAAE;QACnD,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAC3F,OAAO,YAAY,CAAC;YAClB,SAAS;YACT,GAAG;YACH,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;YAC/C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,UAAU;YACjC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE;YACrB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -152,6 +152,12 @@ export interface Experiment {
152
152
  ticket?: ExperimentTicketLink;
153
153
  /** Agent session (or `owner`) that created it — its prediction is recorded under this session */
154
154
  createdBy: string;
155
+ /**
156
+ * Agent session that watches the run without directing it (#1026). It and
157
+ * the creator get read-only access to an autopilot card's project stats,
158
+ * runs and traces while the card is planned or running.
159
+ */
160
+ supervisor?: string;
155
161
  /** Confidence recorded on the prediction (0..1) */
156
162
  confidence: number;
157
163
  status: ExperimentStatus;
@@ -185,6 +191,14 @@ export interface Experiment {
185
191
  autopilot?: ExperimentAutopilotScope;
186
192
  timeline: ExperimentEvent[];
187
193
  }
194
+ /**
195
+ * What an experiment supervisor may read of one autopilot project (#1026):
196
+ * `labels` null = the whole project, else only traces with one of these
197
+ * labels (lowercase).
198
+ */
199
+ export interface ExperimentSupervision {
200
+ labels: string[] | null;
201
+ }
188
202
  /** Persisted store. */
189
203
  export interface ExperimentStoreData {
190
204
  version: 1;
@@ -1 +1 @@
1
- {"version":3,"file":"experiment.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/experiment.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"experiment.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/experiment.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"experiment.types.js","sourceRoot":"","sources":["../../../../../backend/src/types/experiment.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmMH,mBAAmB;AACnB,MAAM,CAAC,MAAM,kBAAkB,GAAgC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE9E,oBAAoB;AACpB,MAAM,CAAC,MAAM,mBAAmB,GAAgC,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAE5G;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAU;IAC3C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,kBAAwC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAU;IAC3C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,mBAAyC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC"}
1
+ {"version":3,"file":"experiment.types.js","sourceRoot":"","sources":["../../../../../backend/src/types/experiment.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkNH,mBAAmB;AACnB,MAAM,CAAC,MAAM,kBAAkB,GAAgC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE9E,oBAAoB;AACpB,MAAM,CAAC,MAAM,mBAAmB,GAAgC,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAE5G;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAU;IAC3C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,kBAAwC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAU;IAC3C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,mBAAyC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC"}
@@ -1,4 +1,4 @@
1
1
  {
2
- "commit": "efb1809e4c7fe24a255318bb78f6ba9395a4988c",
3
- "builtAt": "2026-10-21T05:09:17.641Z"
2
+ "commit": "c731030d3bef63a4105605f4bdc0f8b5711f6d36",
3
+ "builtAt": "2026-10-21T12:10:51.826Z"
4
4
  }