@zxyycom/vibe-check 0.0.2 → 0.0.3

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 (670) hide show
  1. package/README.md +36 -5
  2. package/dist/esm/check/check.mjs +4 -0
  3. package/dist/esm/check/check.mjs.map +1 -1
  4. package/dist/esm/check/flag-enablement.mjs +32 -0
  5. package/dist/esm/check/flag-enablement.mjs.map +1 -0
  6. package/dist/esm/check/handoff-provider-identity.mjs +18 -0
  7. package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
  8. package/dist/esm/check/inherited-collection.mjs +1 -1
  9. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  10. package/dist/esm/check/project-changes.mjs +2 -0
  11. package/dist/esm/check/project-changes.mjs.map +1 -0
  12. package/dist/esm/check/project-context.mjs +2 -0
  13. package/dist/esm/check/project-context.mjs.map +1 -0
  14. package/dist/esm/check-settlement/facts.mjs.map +1 -1
  15. package/dist/esm/check-settlement/record-store.mjs +1 -1
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/data-boundary/canonical-data.mjs +36 -7
  18. package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
  19. package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
  20. package/dist/esm/data-boundary/closed-values.mjs +28 -4
  21. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  22. package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
  23. package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
  24. package/dist/esm/data-boundary/project-path.mjs +19 -0
  25. package/dist/esm/data-boundary/project-path.mjs.map +1 -0
  26. package/dist/esm/index.mjs +12 -5
  27. package/dist/esm/index.mjs.map +1 -1
  28. package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
  29. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  30. package/dist/esm/package-checks/check-authoring.mjs +69 -0
  31. package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
  32. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
  33. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
  34. package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
  35. package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
  36. package/dist/esm/package-checks/command-check/contract.mjs +2 -0
  37. package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
  38. package/dist/esm/package-checks/command-check/execution.mjs +134 -0
  39. package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
  40. package/dist/esm/package-checks/command-check/options.mjs +284 -0
  41. package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
  42. package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
  43. package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
  44. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
  45. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  46. package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
  47. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  48. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
  50. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  54. package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
  55. package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
  56. package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
  57. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  58. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
  59. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
  60. package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
  61. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  62. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  63. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  64. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
  65. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
  66. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
  67. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
  68. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
  69. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  70. package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
  71. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  72. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
  73. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
  74. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
  75. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
  76. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
  77. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
  78. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
  79. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
  80. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
  81. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
  82. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
  83. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
  84. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
  85. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
  86. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
  87. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
  88. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
  89. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
  90. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
  91. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
  92. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
  93. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
  94. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
  95. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
  96. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
  97. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
  98. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
  99. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
  100. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
  101. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
  102. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
  103. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
  104. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
  105. package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
  106. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  107. package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
  108. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  109. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
  110. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
  111. package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
  112. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  113. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  114. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  115. package/dist/esm/package-checks/host-environment/git.mjs +11 -0
  116. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  117. package/dist/esm/package-checks/host-environment/path.mjs +1 -17
  118. package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
  119. package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
  120. package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
  121. package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
  122. package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
  123. package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
  124. package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
  125. package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
  126. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  127. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
  128. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
  129. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
  130. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
  131. package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
  132. package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
  133. package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
  134. package/dist/esm/package-checks/local-cache-options.mjs +28 -0
  135. package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
  136. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
  137. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
  138. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
  139. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
  140. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
  141. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  142. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
  143. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  144. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
  145. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
  146. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
  147. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
  148. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
  149. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  150. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
  151. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  152. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  153. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
  154. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
  155. package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
  156. package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
  157. package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
  158. package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
  159. package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
  160. package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
  161. package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
  162. package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
  163. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
  164. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
  165. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
  166. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
  167. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
  168. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
  169. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
  170. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
  171. package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
  172. package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
  173. package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
  174. package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
  175. package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
  176. package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
  177. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
  178. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
  179. package/dist/esm/package-checks/project-files/collection.mjs +23 -19
  180. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  181. package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
  182. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  183. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
  184. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  185. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
  186. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  187. package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
  188. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
  189. package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
  190. package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
  191. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
  192. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  193. package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
  194. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
  195. package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
  196. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
  197. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
  198. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
  199. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
  200. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
  201. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
  202. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
  203. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
  204. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
  205. package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
  206. package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
  207. package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
  208. package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
  209. package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
  210. package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
  211. package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  212. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
  213. package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  214. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
  215. package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  216. package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
  217. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
  218. package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
  219. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
  220. package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
  221. package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
  222. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
  223. package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
  224. package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
  225. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  226. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
  227. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
  228. package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
  229. package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
  230. package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
  231. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  232. package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
  233. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  234. package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
  235. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
  236. package/dist/esm/project-definition/project-changes.mjs +70 -0
  237. package/dist/esm/project-definition/project-changes.mjs.map +1 -0
  238. package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
  239. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  240. package/dist/esm/project-definition/project-definition.mjs +22 -15
  241. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  242. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
  243. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
  244. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
  245. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
  246. package/dist/esm/project-run/aggregation.mjs +42 -59
  247. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  248. package/dist/esm/project-run/changes/git.mjs +161 -0
  249. package/dist/esm/project-run/changes/git.mjs.map +1 -0
  250. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
  251. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
  252. package/dist/esm/project-run/check-execution/callback.mjs +3 -2
  253. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  254. package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
  255. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  256. package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
  257. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  258. package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
  259. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  260. package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
  261. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
  262. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
  263. package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
  264. package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
  265. package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
  266. package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
  267. package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
  268. package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
  269. package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
  270. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  271. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
  272. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
  273. package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
  274. package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
  275. package/dist/esm/project-run/completion/completion.mjs +18 -1
  276. package/dist/esm/project-run/completion/completion.mjs.map +1 -1
  277. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  278. package/dist/esm/project-run/controls/validation.mjs +7 -54
  279. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  280. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
  281. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
  282. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
  283. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
  284. package/dist/esm/project-run/invocation/candidate.mjs +17 -13
  285. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
  286. package/dist/esm/project-run/invocation/candidates.mjs +26 -0
  287. package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
  288. package/dist/esm/project-run/invocation/creation.mjs +7 -3
  289. package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
  290. package/dist/esm/project-run/invocation/execution.mjs +98 -0
  291. package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
  292. package/dist/esm/project-run/invocation/run.mjs +13 -112
  293. package/dist/esm/project-run/invocation/run.mjs.map +1 -1
  294. package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
  295. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
  296. package/dist/esm/project-run/outputs/status.mjs +12 -12
  297. package/dist/esm/project-run/outputs/status.mjs.map +1 -1
  298. package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
  299. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  300. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
  301. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  302. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
  303. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  304. package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
  305. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  306. package/dist/esm/project-run/project-context.mjs +2 -1
  307. package/dist/esm/project-run/project-context.mjs.map +1 -1
  308. package/dist/esm/project-run/result.mjs +2 -2
  309. package/dist/esm/project-run/result.mjs.map +1 -1
  310. package/dist/esm/project-run/run.mjs.map +1 -1
  311. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
  312. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
  313. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
  314. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
  315. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
  316. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
  317. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
  318. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
  319. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
  320. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
  321. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  322. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
  323. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
  324. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
  325. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
  326. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
  327. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
  328. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
  329. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
  330. package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
  331. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  332. package/docs/api-mechanics.md +147 -28
  333. package/docs/changelog.md +145 -2
  334. package/docs/checks/duplicate-detection.md +22 -3
  335. package/docs/checks/file-metrics.md +25 -6
  336. package/docs/checks/function-metrics.md +21 -2
  337. package/docs/checks/json-schema-validation.md +25 -4
  338. package/docs/checks/json-validation.md +24 -5
  339. package/docs/checks/maintenance-reminders.md +30 -6
  340. package/docs/checks/markdown-link-validation.md +24 -4
  341. package/docs/checks/markdown-lint.md +167 -0
  342. package/docs/checks/secret-detection.md +31 -7
  343. package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
  344. package/docs/guides/building-project-gate.md +706 -0
  345. package/docs/guides/callbacks.md +81 -22
  346. package/docs/guides/check-dependencies.md +41 -10
  347. package/docs/guides/collecting-project-files.md +7 -7
  348. package/docs/guides/command-check.md +155 -0
  349. package/docs/guides/data-boundaries.md +140 -0
  350. package/docs/guides/extending-check-lifecycle.md +77 -25
  351. package/docs/guides/finding-waivers.md +43 -1
  352. package/docs/guides/learned-scheduling.md +1 -1
  353. package/docs/guides/run-outputs.md +35 -9
  354. package/docs/guides/scheduling.md +15 -15
  355. package/docs/output.md +6 -5
  356. package/package.json +2 -1
  357. package/src/check/check.ts +332 -92
  358. package/src/check/flag-enablement.ts +76 -0
  359. package/src/check/handoff-provider-identity.ts +34 -0
  360. package/src/check/inherited-collection.ts +1 -1
  361. package/src/check/project-changes.ts +14 -0
  362. package/src/check/project-context.ts +11 -0
  363. package/src/check-settlement/facts.ts +1 -1
  364. package/src/check-settlement/record-store.ts +1 -1
  365. package/src/data-boundary/canonical-data.ts +36 -9
  366. package/src/data-boundary/canonical-json.ts +18 -1
  367. package/src/data-boundary/closed-values.ts +26 -6
  368. package/src/data-boundary/config-glob.ts +17 -0
  369. package/src/data-boundary/project-path.ts +21 -0
  370. package/src/index.ts +72 -11
  371. package/src/machine-output/v4/atomic-publication.ts +3 -1
  372. package/src/package-checks/check-authoring.ts +136 -0
  373. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
  374. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
  375. package/src/package-checks/command-check/command-check.ts +152 -0
  376. package/src/package-checks/command-check/contract.ts +168 -0
  377. package/src/package-checks/command-check/execution.ts +211 -0
  378. package/src/package-checks/command-check/options.ts +331 -0
  379. package/src/package-checks/command-check/transcript.ts +35 -0
  380. package/src/package-checks/duplicate-detection/default-check.ts +37 -6
  381. package/src/package-checks/duplicate-detection/execution.ts +2 -4
  382. package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
  383. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  384. package/src/package-checks/duplicate-detection/options.ts +6 -3
  385. package/src/package-checks/duplicate-detection/records.ts +1 -1
  386. package/src/package-checks/file-metrics/constructor.ts +29 -6
  387. package/src/package-checks/file-metrics/execution.ts +2 -4
  388. package/src/package-checks/file-metrics/finding-messages.ts +1 -1
  389. package/src/package-checks/file-metrics/options.ts +6 -3
  390. package/src/package-checks/file-metrics/records.ts +1 -1
  391. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  392. package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
  393. package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
  394. package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
  395. package/src/package-checks/function-metrics/analysis.ts +7 -2
  396. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
  397. package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
  398. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
  399. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
  400. package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
  401. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
  402. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
  403. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
  404. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
  405. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
  406. package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
  407. package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
  408. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
  409. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
  410. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
  411. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
  412. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
  413. package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
  414. package/src/package-checks/function-metrics/constructor.ts +30 -7
  415. package/src/package-checks/function-metrics/execution.ts +2 -4
  416. package/src/package-checks/function-metrics/finding-messages.ts +2 -2
  417. package/src/package-checks/function-metrics/measurement.ts +3 -1
  418. package/src/package-checks/function-metrics/options.ts +6 -3
  419. package/src/package-checks/function-metrics/records.ts +1 -1
  420. package/src/package-checks/host-environment/git.ts +11 -0
  421. package/src/package-checks/host-environment/path.ts +1 -20
  422. package/src/package-checks/host-environment/process/contract.ts +17 -9
  423. package/src/package-checks/host-environment/process/result.ts +48 -20
  424. package/src/package-checks/host-environment/process/runner.ts +8 -4
  425. package/src/package-checks/json-schema-validation/default-check.ts +38 -5
  426. package/src/package-checks/json-schema-validation/options.ts +4 -1
  427. package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
  428. package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
  429. package/src/package-checks/json-validation/default-check.ts +27 -6
  430. package/src/package-checks/json-validation/options.ts +4 -1
  431. package/src/package-checks/local-cache-options.ts +40 -0
  432. package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
  433. package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
  434. package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
  435. package/src/package-checks/markdown-link-validation/execution.ts +1 -1
  436. package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
  437. package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
  438. package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
  439. package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
  440. package/src/package-checks/markdown-link-validation/options.ts +6 -7
  441. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
  442. package/src/package-checks/markdown-lint/adapter.ts +167 -0
  443. package/src/package-checks/markdown-lint/default-check.ts +92 -0
  444. package/src/package-checks/markdown-lint/execution.ts +266 -0
  445. package/src/package-checks/markdown-lint/final-data.ts +33 -0
  446. package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
  447. package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
  448. package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
  449. package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
  450. package/src/package-checks/markdown-lint/options-validation.ts +50 -0
  451. package/src/package-checks/markdown-lint/options.ts +82 -0
  452. package/src/package-checks/markdown-lint/records.ts +132 -0
  453. package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
  454. package/src/package-checks/project-files/collection.ts +38 -22
  455. package/src/package-checks/project-files/config-glob.ts +1 -17
  456. package/src/package-checks/project-files/configuration.ts +1 -1
  457. package/src/package-checks/project-files/gitlink-revision.ts +4 -6
  458. package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
  459. package/src/package-checks/project-files/public-collection.ts +1 -1
  460. package/src/package-checks/project-files/revision-paths.ts +3 -3
  461. package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
  462. package/src/package-checks/secret-detection/default-check.ts +29 -6
  463. package/src/package-checks/secret-detection/execution.ts +2 -2
  464. package/src/package-checks/secret-detection/input-preparation.ts +64 -7
  465. package/src/package-checks/secret-detection/options.ts +5 -2
  466. package/src/package-checks/secret-detection/records.ts +1 -1
  467. package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
  468. package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
  469. package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
  470. package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
  471. package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
  472. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
  473. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
  474. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
  475. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
  476. package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
  477. package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
  478. package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
  479. package/src/project-definition/check-tree/authoring.ts +15 -8
  480. package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
  481. package/src/project-definition/check-tree/flag-conditions.ts +99 -0
  482. package/src/project-definition/check-tree/materialization.ts +12 -8
  483. package/src/project-definition/check-tree/resolution.ts +13 -15
  484. package/src/project-definition/declarative-snapshot.ts +9 -2
  485. package/src/project-definition/project-changes.ts +112 -0
  486. package/src/project-definition/project-definition-validation.ts +58 -10
  487. package/src/project-definition/project-definition.ts +41 -68
  488. package/src/project-definition/scheduler-policy.ts +6 -3
  489. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
  490. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
  491. package/src/project-run/aggregation.ts +51 -74
  492. package/src/project-run/changes/git.ts +206 -0
  493. package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
  494. package/src/project-run/check-execution/callback.ts +3 -2
  495. package/src/project-run/check-execution/dependencies.ts +120 -6
  496. package/src/project-run/check-execution/execution-finalization.ts +6 -4
  497. package/src/project-run/check-execution/execution-settlement.ts +88 -29
  498. package/src/project-run/check-execution/flag-controls.ts +22 -8
  499. package/src/project-run/check-execution/lifecycle.ts +14 -6
  500. package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
  501. package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
  502. package/src/project-run/check-execution/ready-check-execution.ts +97 -0
  503. package/src/project-run/check-execution/resolved-checks.ts +40 -219
  504. package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
  505. package/src/project-run/check-execution/terminal-result.ts +108 -29
  506. package/src/project-run/completion/completion.ts +17 -3
  507. package/src/project-run/controls/contract.ts +6 -16
  508. package/src/project-run/controls/validation.ts +7 -60
  509. package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
  510. package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
  511. package/src/project-run/invocation/candidate.ts +28 -15
  512. package/src/project-run/invocation/candidates.ts +56 -0
  513. package/src/project-run/invocation/creation.ts +7 -3
  514. package/src/project-run/invocation/execution.ts +136 -0
  515. package/src/project-run/invocation/run.ts +15 -179
  516. package/src/project-run/invocation/scheduler.ts +13 -6
  517. package/src/project-run/outputs/status.ts +15 -15
  518. package/src/project-run/progress-rendering/presentation.ts +35 -13
  519. package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
  520. package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
  521. package/src/project-run/progress-rendering/renderer.ts +10 -4
  522. package/src/project-run/project-context.ts +8 -4
  523. package/src/project-run/result.ts +5 -5
  524. package/src/project-run/run.ts +1 -1
  525. package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
  526. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
  527. package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
  528. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
  529. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
  530. package/src/project-run/task-scheduler/execution-state.ts +4 -4
  531. package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
  532. package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
  533. package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
  534. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
  535. package/src/project-run/task-scheduler/scheduler.ts +23 -6
  536. package/types/check/check.d.ts +178 -67
  537. package/types/check/flag-enablement.d.ts +42 -0
  538. package/types/check/handoff-provider-identity.d.ts +12 -0
  539. package/types/check/project-changes.d.ts +13 -0
  540. package/types/check/project-context.d.ts +10 -0
  541. package/types/check-settlement/facts.d.ts +1 -1
  542. package/types/data-boundary/canonical-data.d.ts +28 -5
  543. package/types/data-boundary/canonical-json.d.ts +18 -1
  544. package/types/data-boundary/closed-values.d.ts +17 -1
  545. package/types/data-boundary/config-glob.d.ts +5 -0
  546. package/types/data-boundary/project-path.d.ts +4 -0
  547. package/types/index.d.ts +27 -11
  548. package/types/package-checks/check-authoring.d.ts +45 -0
  549. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
  550. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
  551. package/types/package-checks/command-check/command-check.d.ts +48 -0
  552. package/types/package-checks/command-check/contract.d.ts +108 -0
  553. package/types/package-checks/command-check/execution.d.ts +7 -0
  554. package/types/package-checks/command-check/options.d.ts +11 -0
  555. package/types/package-checks/command-check/transcript.d.ts +8 -0
  556. package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
  557. package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
  558. package/types/package-checks/duplicate-detection/options.d.ts +4 -3
  559. package/types/package-checks/duplicate-detection/records.d.ts +1 -1
  560. package/types/package-checks/file-metrics/constructor.d.ts +5 -2
  561. package/types/package-checks/file-metrics/options.d.ts +4 -3
  562. package/types/package-checks/file-metrics/records.d.ts +1 -1
  563. package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
  564. package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
  565. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
  566. package/types/package-checks/function-metrics/constructor.d.ts +5 -2
  567. package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
  568. package/types/package-checks/function-metrics/options.d.ts +4 -3
  569. package/types/package-checks/function-metrics/records.d.ts +1 -1
  570. package/types/package-checks/host-environment/git.d.ts +2 -0
  571. package/types/package-checks/host-environment/path.d.ts +1 -3
  572. package/types/package-checks/host-environment/process/contract.d.ts +17 -9
  573. package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
  574. package/types/package-checks/json-schema-validation/options.d.ts +2 -1
  575. package/types/package-checks/json-validation/default-check.d.ts +4 -1
  576. package/types/package-checks/json-validation/options.d.ts +2 -1
  577. package/types/package-checks/local-cache-options.d.ts +9 -0
  578. package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
  579. package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
  580. package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
  581. package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
  582. package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
  583. package/types/package-checks/markdown-lint/execution.d.ts +24 -0
  584. package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
  585. package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
  586. package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
  587. package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
  588. package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
  589. package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
  590. package/types/package-checks/markdown-lint/options.d.ts +65 -0
  591. package/types/package-checks/markdown-lint/records.d.ts +39 -0
  592. package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
  593. package/types/package-checks/secret-detection/default-check.d.ts +4 -1
  594. package/types/package-checks/secret-detection/options.d.ts +3 -2
  595. package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
  596. package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
  597. package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
  598. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
  599. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
  600. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
  601. package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
  602. package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
  603. package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
  604. package/types/project-definition/check-tree/authoring.d.ts +5 -3
  605. package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
  606. package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
  607. package/types/project-definition/check-tree/resolution.d.ts +6 -4
  608. package/types/project-definition/declarative-snapshot.d.ts +4 -1
  609. package/types/project-definition/project-changes.d.ts +30 -0
  610. package/types/project-definition/project-definition.d.ts +15 -30
  611. package/types/project-definition/scheduler-policy.d.ts +3 -3
  612. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
  613. package/types/project-run/aggregation.d.ts +8 -6
  614. package/types/project-run/changes/git.d.ts +14 -0
  615. package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
  616. package/types/project-run/check-execution/dependencies.d.ts +3 -0
  617. package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
  618. package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
  619. package/types/project-run/check-execution/flag-controls.d.ts +1 -1
  620. package/types/project-run/check-execution/lifecycle.d.ts +9 -5
  621. package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
  622. package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
  623. package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
  624. package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
  625. package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
  626. package/types/project-run/check-execution/terminal-result.d.ts +13 -1
  627. package/types/project-run/completion/completion.d.ts +3 -1
  628. package/types/project-run/controls/contract.d.ts +6 -16
  629. package/types/project-run/invocation/candidates.d.ts +8 -0
  630. package/types/project-run/invocation/execution.d.ts +5 -0
  631. package/types/project-run/invocation/run.d.ts +2 -2
  632. package/types/project-run/outputs/status.d.ts +4 -4
  633. package/types/project-run/progress-rendering/presentation.d.ts +4 -3
  634. package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
  635. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
  636. package/types/project-run/progress-rendering/renderer.d.ts +4 -2
  637. package/types/project-run/project-context.d.ts +3 -3
  638. package/types/project-run/result.d.ts +3 -3
  639. package/types/project-run/run.d.ts +1 -1
  640. package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
  641. package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
  642. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
  643. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
  644. package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
  645. package/dist/esm/check/finding-presentation.mjs.map +0 -1
  646. package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
  647. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
  648. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
  649. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
  650. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
  651. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
  652. package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
  653. package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
  654. package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
  655. package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
  656. package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
  657. package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
  658. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
  659. package/types/package-checks/project-files/config-glob.d.ts +0 -5
  660. /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
  661. /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
  662. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
  663. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
  664. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
  665. /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
  666. /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
  667. /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
  668. /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
  669. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
  670. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"execution-state.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/execution-state.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementContext,\n SchedulerMeasurementHook\n} from \"../../project-definition/project-definition.ts\";\nimport type { PlannedTask, PlannedTaskGraph, PlannedTaskScope, TaskGraph } from \"./graph.ts\";\nimport {\n staticAdmissionSelectionPolicy,\n type AdmissionSelectionPolicy\n} from \"./admission-selection-policy.ts\";\nimport type { DiagnosticLogger } from \"../diagnostic-logging/logger.ts\";\nimport type { SchedulerSnapshot } from \"./scheduler-decision.ts\";\nimport type { AdmissionPolicyFaultCategory } from \"./scheduler-admission-decision.ts\";\nimport type { SchedulerPerformanceDiagnosticsInput } from \"./measurement/diagnostics.ts\";\nimport {\n compilePreparedAdmissionGraph,\n createAdmissionCoreFromSchedulerSnapshot,\n createInitialAdmissionCoreState,\n type AdmissionCoreEffect,\n type AdmissionCoreState\n} from \"./admission-core/core.ts\";\n\nexport type TaskSettlement<TResult> = Readonly<\n | { readonly kind: \"completed\"; readonly value: TResult }\n | { readonly kind: \"prerequisite-unsatisfied\"; readonly value: TResult }\n | { readonly kind: \"failed\"; readonly error: unknown }\n | { readonly kind: \"blocked\"; readonly dependencyIds: readonly string[] }\n | { readonly kind: \"cancelled-before-start\" }\n>;\n\nexport interface SettledTask<TResult> {\n readonly task: PlannedTask;\n readonly settlement: TaskSettlement<TResult>;\n}\n\nexport interface TaskExecutionContext {\n readonly signal: AbortSignal | undefined;\n}\n\nexport interface PreAdmissionTaskResult<TResult> {\n readonly taskId: string;\n readonly value: TResult;\n}\n\n/** Product-private effect hook used to prove that the real shell replays the shared core. */\nexport interface SchedulerAdmissionCoreEffect {\n readonly effect: AdmissionCoreEffect;\n readonly state: AdmissionCoreState;\n}\n\nexport interface TaskGraphRun<TResult> {\n readonly admissionPolicyFault: AdmissionPolicyFaultCategory | undefined;\n readonly cancelled: boolean;\n /** One entry per static graph Task, in static graph order. */\n readonly settlements: readonly SettledTask<TResult>[];\n /** Product-private terminal facts retained after terminal Hooks have been drained. */\n readonly terminalMeasurement?: SchedulerMeasurementContext;\n}\n\nexport interface RunTaskGraphOptions<TResult> {\n /** Product-private policy handoff; package consumers cannot author this through the public API. */\n readonly admissionPolicy?: AdmissionSelectionPolicy;\n readonly diagnosticLogger?: DiagnosticLogger;\n /** Explicit enabled-only handoff; no Scheduler behavior is inferred from a logger shape. */\n readonly performanceDiagnostics?: SchedulerPerformanceDiagnosticsInput;\n /** Runtime-only terminal consumers; their context is formed after Scheduler drain. */\n readonly measurementHooks?: readonly SchedulerMeasurementHook[];\n readonly onMeasurementHookFailure?: () => void;\n readonly onMeasurementHooksSettled?: () => void;\n /** Product-private test observer; no package consumer can supply this through `run`. */\n readonly onAdmissionCoreEffect?: (effect: SchedulerAdmissionCoreEffect) => void;\n readonly graph: TaskGraph;\n /** Product-private Task results formed without Scheduler admission in the current Run. */\n readonly preAdmissionTaskResults?: readonly PreAdmissionTaskResult<TResult>[];\n readonly maxParallel: number;\n readonly signal?: AbortSignal;\n readonly execute: (\n task: PlannedTask,\n context: TaskExecutionContext\n ) => TResult | Promise<TResult>;\n /** Maps a completed Task's opaque product value to prerequisite satisfaction. */\n readonly isPrerequisiteSatisfied?: (value: TResult) => boolean;\n /** Lets a product close a blocked Task before any terminal observer can be admitted. */\n readonly onTaskBlocked?: (task: PlannedTask, dependencyIds: readonly string[]) => void;\n}\n\nexport type RunningTaskCompletion<TResult> = Readonly<{\n readonly taskId: string;\n readonly settlement: TaskSettlement<TResult>;\n}>;\n\nexport interface RunningTask<TResult> {\n readonly task: PlannedTask;\n readonly completion: Promise<RunningTaskCompletion<TResult>>;\n}\n\nexport interface RuntimeScope {\n readonly scope: PlannedTaskScope;\n readonly activationTaskIds: ReadonlySet<string>;\n isActive: boolean;\n}\n\nexport interface SchedulerState<TResult> {\n /** The shared immutable legality/transition state; Task and Promise ownership remains below. */\n admissionCore: AdmissionCoreState;\n readonly admissionPolicy: AdmissionSelectionPolicy;\n readonly diagnosticLogger: DiagnosticLogger | undefined;\n readonly graph: PlannedTaskGraph;\n readonly isPrerequisiteSatisfied: RunTaskGraphOptions<TResult>[\"isPrerequisiteSatisfied\"];\n readonly maxParallel: number;\n readonly signal: AbortSignal | undefined;\n readonly execute: RunTaskGraphOptions<TResult>[\"execute\"];\n readonly onTaskBlocked: RunTaskGraphOptions<TResult>[\"onTaskBlocked\"];\n readonly onAdmissionCoreEffect: RunTaskGraphOptions<TResult>[\"onAdmissionCoreEffect\"];\n readonly pending: PlannedTask[];\n readonly runningById: Map<string, RunningTask<TResult>>;\n readonly runningMutexes: Set<string>;\n readonly settlementsByTaskId: Map<string, TaskSettlement<TResult>>;\n readonly scopesById: ReadonlyMap<string, RuntimeScope>;\n isCancelled: boolean;\n admissionPolicyFault: AdmissionPolicyFaultCategory | undefined;\n}\n\nexport function createSchedulerState<TResult>(\n graph: PlannedTaskGraph,\n options: RunTaskGraphOptions<TResult>\n): SchedulerState<TResult> {\n const admissionPolicy = options.admissionPolicy ?? staticAdmissionSelectionPolicy;\n if (!Object.isFrozen(admissionPolicy) || typeof admissionPolicy.decide !== \"function\") {\n throw new TypeError(\"task engine admission policy must be a frozen policy value\");\n }\n const scopesById = new Map<string, RuntimeScope>();\n for (const scope of graph.scopes) {\n scopesById.set(scope.id, {\n scope,\n activationTaskIds: new Set(scope.activationTaskIds),\n isActive: false\n });\n }\n const compiledAdmissionGraph = compilePreparedAdmissionGraph(graph, options.maxParallel);\n const state: SchedulerState<TResult> = {\n admissionCore: createInitialAdmissionCoreState(compiledAdmissionGraph),\n admissionPolicy,\n diagnosticLogger: options.diagnosticLogger,\n graph,\n isPrerequisiteSatisfied: options.isPrerequisiteSatisfied,\n maxParallel: options.maxParallel,\n onTaskBlocked: options.onTaskBlocked,\n onAdmissionCoreEffect: options.onAdmissionCoreEffect,\n signal: options.signal,\n execute: options.execute,\n pending: [...graph.tasks],\n runningById: new Map(),\n runningMutexes: new Set(),\n settlementsByTaskId: new Map(),\n scopesById,\n isCancelled: false,\n admissionPolicyFault: undefined\n };\n recordPreAdmissionTaskResults(state, options.preAdmissionTaskResults ?? []);\n state.admissionCore = createAdmissionCoreFromSchedulerSnapshot(\n compiledAdmissionGraph,\n snapshotSchedulerState(state)\n );\n return state;\n}\n\nfunction recordPreAdmissionTaskResults<TResult>(\n state: SchedulerState<TResult>,\n preAdmissionTaskResults: readonly PreAdmissionTaskResult<TResult>[]\n): void {\n for (const result of preAdmissionTaskResults) {\n const pendingIndex = state.pending.findIndex((task) => task.id === result.taskId);\n if (pendingIndex < 0) {\n throw new TypeError(\n `pre-admission task result references unknown or duplicate task ${result.taskId}`\n );\n }\n const [task] = state.pending.splice(pendingIndex, 1);\n if (task === undefined) {\n throw new Error(`pre-admission task ${result.taskId} disappeared before settlement`);\n }\n const settlement: TaskSettlement<TResult> =\n state.isPrerequisiteSatisfied?.(result.value) === false\n ? { kind: \"prerequisite-unsatisfied\", value: result.value }\n : { kind: \"completed\", value: result.value };\n recordSettlement(state, task, Object.freeze(settlement));\n }\n}\n\n/** Projects mutable execution state into the pure scheduler-decision input. */\nexport function snapshotSchedulerState<TResult>(state: SchedulerState<TResult>): SchedulerSnapshot {\n return Object.freeze({\n activeScopeIds: Object.freeze(\n [...state.scopesById.values()]\n .filter((scope) => scope.isActive)\n .map((scope) => scope.scope.id)\n ),\n graph: state.graph,\n isAbortRequested: state.signal?.aborted === true,\n isCancelled: state.isCancelled,\n maxParallel: state.maxParallel,\n pendingTaskIds: Object.freeze(state.pending.map((task) => task.id)),\n runningMutexes: Object.freeze([...state.runningMutexes]),\n runningTaskIds: Object.freeze([...state.runningById.keys()]),\n settledTasks: Object.freeze(\n [...state.settlementsByTaskId].map(([taskId, settlement]) =>\n Object.freeze({ kind: settlement.kind, taskId })\n )\n )\n });\n}\n\nexport function scopeForTask<TResult>(\n task: PlannedTask,\n state: SchedulerState<TResult>\n): RuntimeScope | undefined {\n return task.scopeId === undefined ? undefined : state.scopesById.get(task.scopeId);\n}\n\nexport function cancelPendingTasks<TResult>(state: SchedulerState<TResult>): void {\n state.isCancelled = true;\n while (state.pending.length > 0) {\n const task = state.pending.shift();\n if (task === undefined) {\n throw new Error(\"task graph pending queue changed unexpectedly\");\n }\n recordSettlement(state, task, Object.freeze({ kind: \"cancelled-before-start\" }));\n }\n}\n\nexport function recordSettlement<TResult>(\n state: SchedulerState<TResult>,\n task: PlannedTask,\n settlement: TaskSettlement<TResult>\n): void {\n if (state.settlementsByTaskId.has(task.id)) {\n throw new Error(`task ${task.id} settled more than once`);\n }\n state.settlementsByTaskId.set(task.id, settlement);\n const scope = scopeForTask(task, state);\n if (scope?.scope.terminalTaskId === task.id) {\n scope.isActive = false;\n }\n}\n"]}
1
+ {"version":3,"file":"execution-state.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/execution-state.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementContext,\n SchedulerTerminalEffect\n} from \"../../project-definition/project-definition.ts\";\nimport type { PlannedTask, PlannedTaskGraph, PlannedTaskScope, TaskGraph } from \"./graph.ts\";\nimport {\n staticAdmissionSelectionPolicy,\n type AdmissionSelectionPolicy\n} from \"./admission-selection-policy.ts\";\nimport type { DiagnosticLogger } from \"../diagnostic-logging/logger.ts\";\nimport type { SchedulerSnapshot } from \"./scheduler-decision.ts\";\nimport type { AdmissionPolicyFaultCategory } from \"./scheduler-admission-decision.ts\";\nimport type { SchedulerPerformanceDiagnosticsInput } from \"./measurement/diagnostics.ts\";\nimport {\n compilePreparedAdmissionGraph,\n createAdmissionCoreFromSchedulerSnapshot,\n createInitialAdmissionCoreState,\n type AdmissionCoreEffect,\n type AdmissionCoreState\n} from \"./admission-core/core.ts\";\n\nexport type TaskSettlement<TResult> = Readonly<\n | { readonly kind: \"completed\"; readonly value: TResult }\n | { readonly kind: \"prerequisite-unsatisfied\"; readonly value: TResult }\n | { readonly kind: \"failed\"; readonly error: unknown }\n | { readonly kind: \"blocked\"; readonly dependencyIds: readonly string[] }\n | { readonly kind: \"cancelled-before-start\" }\n>;\n\nexport interface SettledTask<TResult> {\n readonly task: PlannedTask;\n readonly settlement: TaskSettlement<TResult>;\n}\n\nexport interface TaskExecutionContext {\n readonly signal: AbortSignal | undefined;\n}\n\nexport interface PreAdmissionTaskResult<TResult> {\n readonly taskId: string;\n readonly value: TResult;\n}\n\n/** Product-private effect hook used to prove that the real shell replays the shared core. */\nexport interface SchedulerAdmissionCoreEffect {\n readonly effect: AdmissionCoreEffect;\n readonly state: AdmissionCoreState;\n}\n\nexport interface TaskGraphRun<TResult> {\n readonly admissionPolicyFault: AdmissionPolicyFaultCategory | undefined;\n readonly cancelled: boolean;\n /** One entry per static graph Task, in static graph order. */\n readonly settlements: readonly SettledTask<TResult>[];\n /** Product-private terminal facts retained after terminal Hooks have been drained. */\n readonly terminalMeasurement?: SchedulerMeasurementContext;\n}\n\nexport interface RunTaskGraphOptions<TResult> {\n /** Product-private policy handoff; package consumers cannot author this through the public API. */\n readonly admissionPolicy?: AdmissionSelectionPolicy;\n readonly diagnosticLogger?: DiagnosticLogger;\n /** Explicit enabled-only handoff; no Scheduler behavior is inferred from a logger shape. */\n readonly performanceDiagnostics?: SchedulerPerformanceDiagnosticsInput;\n /** Runtime-only terminal consumers; their context is formed after Scheduler drain. */\n readonly terminalEffects?: readonly SchedulerTerminalEffect[];\n readonly onTerminalEffectFailure?: () => void;\n readonly onTerminalEffectsSettled?: () => void;\n /** Product-private test observer; no package consumer can supply this through `run`. */\n readonly onAdmissionCoreEffect?: (effect: SchedulerAdmissionCoreEffect) => void;\n readonly graph: TaskGraph;\n /** Product-private Task results formed without Scheduler admission in the current Run. */\n readonly preAdmissionTaskResults?: readonly PreAdmissionTaskResult<TResult>[];\n readonly maxParallel: number;\n readonly signal?: AbortSignal;\n readonly execute: (\n task: PlannedTask,\n context: TaskExecutionContext\n ) => TResult | Promise<TResult>;\n /** Maps a completed Task's opaque product value to prerequisite satisfaction. */\n readonly isPrerequisiteSatisfied?: (value: TResult) => boolean;\n /** Lets a product close a blocked Task before any terminal observer can be admitted. */\n readonly onTaskBlocked?: (task: PlannedTask, dependencyIds: readonly string[]) => void;\n}\n\nexport type RunningTaskCompletion<TResult> = Readonly<{\n readonly taskId: string;\n readonly settlement: TaskSettlement<TResult>;\n}>;\n\nexport interface RunningTask<TResult> {\n readonly task: PlannedTask;\n readonly completion: Promise<RunningTaskCompletion<TResult>>;\n}\n\nexport interface RuntimeScope {\n readonly scope: PlannedTaskScope;\n readonly activationTaskIds: ReadonlySet<string>;\n isActive: boolean;\n}\n\nexport interface SchedulerState<TResult> {\n /** The shared immutable legality/transition state; Task and Promise ownership remains below. */\n admissionCore: AdmissionCoreState;\n readonly admissionPolicy: AdmissionSelectionPolicy;\n readonly diagnosticLogger: DiagnosticLogger | undefined;\n readonly graph: PlannedTaskGraph;\n readonly isPrerequisiteSatisfied: RunTaskGraphOptions<TResult>[\"isPrerequisiteSatisfied\"];\n readonly maxParallel: number;\n readonly signal: AbortSignal | undefined;\n readonly execute: RunTaskGraphOptions<TResult>[\"execute\"];\n readonly onTaskBlocked: RunTaskGraphOptions<TResult>[\"onTaskBlocked\"];\n readonly onAdmissionCoreEffect: RunTaskGraphOptions<TResult>[\"onAdmissionCoreEffect\"];\n readonly pending: PlannedTask[];\n readonly runningById: Map<string, RunningTask<TResult>>;\n readonly runningMutexes: Set<string>;\n readonly settlementsByTaskId: Map<string, TaskSettlement<TResult>>;\n readonly scopesById: ReadonlyMap<string, RuntimeScope>;\n isCancelled: boolean;\n admissionPolicyFault: AdmissionPolicyFaultCategory | undefined;\n}\n\nexport function createSchedulerState<TResult>(\n graph: PlannedTaskGraph,\n options: RunTaskGraphOptions<TResult>\n): SchedulerState<TResult> {\n const admissionPolicy = options.admissionPolicy ?? staticAdmissionSelectionPolicy;\n if (!Object.isFrozen(admissionPolicy) || typeof admissionPolicy.decide !== \"function\") {\n throw new TypeError(\"task engine admission policy must be a frozen policy value\");\n }\n const scopesById = new Map<string, RuntimeScope>();\n for (const scope of graph.scopes) {\n scopesById.set(scope.id, {\n scope,\n activationTaskIds: new Set(scope.activationTaskIds),\n isActive: false\n });\n }\n const compiledAdmissionGraph = compilePreparedAdmissionGraph(graph, options.maxParallel);\n const state: SchedulerState<TResult> = {\n admissionCore: createInitialAdmissionCoreState(compiledAdmissionGraph),\n admissionPolicy,\n diagnosticLogger: options.diagnosticLogger,\n graph,\n isPrerequisiteSatisfied: options.isPrerequisiteSatisfied,\n maxParallel: options.maxParallel,\n onTaskBlocked: options.onTaskBlocked,\n onAdmissionCoreEffect: options.onAdmissionCoreEffect,\n signal: options.signal,\n execute: options.execute,\n pending: [...graph.tasks],\n runningById: new Map(),\n runningMutexes: new Set(),\n settlementsByTaskId: new Map(),\n scopesById,\n isCancelled: false,\n admissionPolicyFault: undefined\n };\n recordPreAdmissionTaskResults(state, options.preAdmissionTaskResults ?? []);\n state.admissionCore = createAdmissionCoreFromSchedulerSnapshot(\n compiledAdmissionGraph,\n snapshotSchedulerState(state)\n );\n return state;\n}\n\nfunction recordPreAdmissionTaskResults<TResult>(\n state: SchedulerState<TResult>,\n preAdmissionTaskResults: readonly PreAdmissionTaskResult<TResult>[]\n): void {\n for (const result of preAdmissionTaskResults) {\n const pendingIndex = state.pending.findIndex((task) => task.id === result.taskId);\n if (pendingIndex < 0) {\n throw new TypeError(\n `pre-admission task result references unknown or duplicate task ${result.taskId}`\n );\n }\n const [task] = state.pending.splice(pendingIndex, 1);\n if (task === undefined) {\n throw new Error(`pre-admission task ${result.taskId} disappeared before settlement`);\n }\n const settlement: TaskSettlement<TResult> =\n state.isPrerequisiteSatisfied?.(result.value) === false\n ? { kind: \"prerequisite-unsatisfied\", value: result.value }\n : { kind: \"completed\", value: result.value };\n recordSettlement(state, task, Object.freeze(settlement));\n }\n}\n\n/** Projects mutable execution state into the pure scheduler-decision input. */\nexport function snapshotSchedulerState<TResult>(state: SchedulerState<TResult>): SchedulerSnapshot {\n return Object.freeze({\n activeScopeIds: Object.freeze(\n [...state.scopesById.values()]\n .filter((scope) => scope.isActive)\n .map((scope) => scope.scope.id)\n ),\n graph: state.graph,\n isAbortRequested: state.signal?.aborted === true,\n isCancelled: state.isCancelled,\n maxParallel: state.maxParallel,\n pendingTaskIds: Object.freeze(state.pending.map((task) => task.id)),\n runningMutexes: Object.freeze([...state.runningMutexes]),\n runningTaskIds: Object.freeze([...state.runningById.keys()]),\n settledTasks: Object.freeze(\n [...state.settlementsByTaskId].map(([taskId, settlement]) =>\n Object.freeze({ kind: settlement.kind, taskId })\n )\n )\n });\n}\n\nexport function scopeForTask<TResult>(\n task: PlannedTask,\n state: SchedulerState<TResult>\n): RuntimeScope | undefined {\n return task.scopeId === undefined ? undefined : state.scopesById.get(task.scopeId);\n}\n\nexport function cancelPendingTasks<TResult>(state: SchedulerState<TResult>): void {\n state.isCancelled = true;\n while (state.pending.length > 0) {\n const task = state.pending.shift();\n if (task === undefined) {\n throw new Error(\"task graph pending queue changed unexpectedly\");\n }\n recordSettlement(state, task, Object.freeze({ kind: \"cancelled-before-start\" }));\n }\n}\n\nexport function recordSettlement<TResult>(\n state: SchedulerState<TResult>,\n task: PlannedTask,\n settlement: TaskSettlement<TResult>\n): void {\n if (state.settlementsByTaskId.has(task.id)) {\n throw new Error(`task ${task.id} settled more than once`);\n }\n state.settlementsByTaskId.set(task.id, settlement);\n const scope = scopeForTask(task, state);\n if (scope?.scope.terminalTaskId === task.id) {\n scope.isActive = false;\n }\n}\n"]}
@@ -34,8 +34,10 @@ export class SchedulerPerformanceDiagnostics {
34
34
  if (boundary === undefined)
35
35
  return;
36
36
  const admissionDelay = this.#timing.takeAdmissionDelay(taskId);
37
- if (admissionDelay === undefined)
38
- return this.#timing.invalidate("integral-invalid");
37
+ if (admissionDelay === undefined) {
38
+ this.#timing.invalidate("integral-invalid");
39
+ return;
40
+ }
39
41
  this.#chronologyByTaskId.set(taskId, {
40
42
  admissionDelay,
41
43
  admittedAt: boundary,
@@ -57,8 +59,10 @@ export class SchedulerPerformanceDiagnostics {
57
59
  return;
58
60
  this.#timing.closeAcceptedWait(boundary);
59
61
  const chronology = this.#chronologyByTaskId.get(taskId);
60
- if (chronology === undefined)
61
- return this.#timing.invalidate("integral-invalid");
62
+ if (chronology === undefined) {
63
+ this.#timing.invalidate("integral-invalid");
64
+ return;
65
+ }
62
66
  chronology.settledAt = boundary;
63
67
  }
64
68
  beforeAcceptedWait() {
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AdmissionPolicyMeasurement,\n SchedulerDecisionMeasurementCumulative,\n SchedulerMeasurementAdmission,\n SchedulerMeasurementEffect,\n SchedulerMeasurementHook,\n SchedulerRawMeasurement\n} from \"../../../project-definition/project-definition.ts\";\nimport { diagnosticTags, type DiagnosticLogger } from \"../../diagnostic-logging/logger.ts\";\nimport type { AdmissionDelayBreakdown } from \"./integrals.ts\";\nimport { summaryFromSchedulerMeasurement } from \"./summary.ts\";\nimport { SchedulerPerformanceTiming } from \"./timing.ts\";\nimport { SchedulerPolicyMeasurement } from \"./policy.ts\";\n\n/** Explicit, enabled-only private handoff; the Scheduler never infers this from logger behavior. */\nexport type SchedulerPerformanceDiagnosticsInput = Readonly<{\n readonly clock: Readonly<{ now(): number }>;\n readonly declarativeFingerprint: string;\n readonly logger?: DiagnosticLogger;\n}>;\n\ntype AdmissionChronology = {\n readonly admissionDelay: AdmissionDelayBreakdown;\n readonly admittedAt: number;\n settledAt: number | undefined;\n};\n\nexport type AdmissionViablePendingTask = Readonly<{\n readonly kind: \"admissible-pending\" | \"capacity-blocked\" | \"mutex-blocked\";\n readonly taskId: string;\n}>;\n\nexport type SchedulerPerformanceState = Readonly<{\n readonly admissionViablePendingTasks: readonly AdmissionViablePendingTask[];\n readonly effectiveMaxParallel: number;\n readonly rootMaxParallel: number;\n readonly running: number;\n}>;\n\n/**\n * Scheduler-owned, invocation-local lifecycle projection. Clock boundaries and\n * numeric interval accumulation remain private collaborators of this owner.\n */\nexport class SchedulerPerformanceDiagnostics {\n readonly #declarativeFingerprint: string;\n readonly #logger: DiagnosticLogger | undefined;\n readonly #timing: SchedulerPerformanceTiming;\n #lastSettledTaskId: string | undefined;\n #completionTailActiveTaskIds: readonly string[] = Object.freeze([]);\n readonly #admittedTaskIds = new Set<string>();\n readonly #chronologyByTaskId = new Map<string, AdmissionChronology>();\n readonly #policyMeasurement = new SchedulerPolicyMeasurement();\n\n public constructor(\n input: SchedulerPerformanceDiagnosticsInput,\n initial: SchedulerPerformanceState\n ) {\n this.#declarativeFingerprint = input.declarativeFingerprint;\n this.#logger = input.logger;\n this.#timing = new SchedulerPerformanceTiming(input.clock, initial);\n }\n\n public measureControlPath<T>(operation: () => T): T {\n return this.#timing.measureControlPath(operation);\n }\n\n public observeDecision(observation: () => void): void {\n this.#timing.observeDecision(observation);\n }\n\n /** Flushes the old state before admission changes the real Scheduler state. */\n public beforeAdmission(taskId: string, runningTaskIds: readonly string[]): void {\n this.#admittedTaskIds.add(taskId);\n this.#completionTailActiveTaskIds = Object.freeze([...runningTaskIds, taskId]);\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n const admissionDelay = this.#timing.takeAdmissionDelay(taskId);\n if (admissionDelay === undefined) return this.#timing.invalidate(\"integral-invalid\");\n this.#chronologyByTaskId.set(taskId, {\n admissionDelay,\n admittedAt: boundary,\n settledAt: undefined\n });\n }\n\n /** Flushes the old state before blocked/cancelled changes the real Scheduler state. */\n public beforePendingSettlement(taskIds: readonly string[] = []): void {\n const lastTaskId = taskIds.at(-1);\n if (lastTaskId !== undefined) this.#lastSettledTaskId = lastTaskId;\n this.#timing.boundary();\n }\n\n /** Flushes the old running interval before removing the actual running Task. */\n public beforeRunningSettlement(taskId: string): void {\n this.#lastSettledTaskId = taskId;\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n this.#timing.closeAcceptedWait(boundary);\n const chronology = this.#chronologyByTaskId.get(taskId);\n if (chronology === undefined) return this.#timing.invalidate(\"integral-invalid\");\n chronology.settledAt = boundary;\n }\n\n public beforeAcceptedWait(): void {\n this.#timing.beginAcceptedWait();\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#timing.captureState(state);\n }\n\n public rawMeasurement(): SchedulerRawMeasurement {\n return this.#measurement(true);\n }\n\n public beginSelectedPolicyAction(taskId: string): void {\n this.#policyMeasurement.beginSelected(taskId, this.#timing.snapshot().totals);\n }\n\n public beginWaitPolicyAction(): void {\n this.#policyMeasurement.beginWait(this.#timing.snapshot().totals);\n }\n\n public recordEffect(effect: SchedulerMeasurementEffect): void {\n this.#policyMeasurement.recordEffect(effect);\n }\n\n public policyMeasurement(): AdmissionPolicyMeasurement {\n this.#timing.boundary();\n this.#completePolicyAction();\n return this.#policyMeasurement.snapshot(this.#cumulativeMeasurement());\n }\n\n public completePendingActionObservation(): void {\n this.#timing.boundary();\n this.#completePolicyAction();\n }\n\n public admittedTaskIds(): readonly string[] {\n return Object.freeze([...this.#admittedTaskIds]);\n }\n\n /** Internal default terminal hook; it contains writer failure without runner special-casing. */\n public defaultSummaryHook(): SchedulerMeasurementHook | undefined {\n if (this.#logger === undefined) return undefined;\n const logger = this.#logger;\n return (context) => {\n try {\n logger.observe({\n event: \"scheduler.summary\",\n tags: diagnosticTags(\"SUMMARY\"),\n details: summaryFromSchedulerMeasurement(context.rawMeasurement)\n });\n } catch {\n // Summary writer failure is contained by this hook, not the shared runner.\n }\n };\n }\n\n #completePolicyAction(): void {\n const timing = this.#timing.snapshot();\n this.#policyMeasurement.complete(timing.totals, timing.timing);\n }\n\n #cumulativeMeasurement(): SchedulerDecisionMeasurementCumulative {\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #measurement(terminal: boolean): SchedulerRawMeasurement {\n const endedAt = this.#timing.boundary();\n if (terminal && endedAt !== undefined) this.#timing.closeAcceptedWait(endedAt);\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n completionTailActiveTaskIds: Object.freeze([...this.#completionTailActiveTaskIds]),\n lastSettledTaskId: this.#lastSettledTaskId ?? null,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n if (endedAt === undefined)\n throw new Error(\"available Scheduler timing has no terminal boundary\");\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n admissions: Object.freeze(this.#admissionMeasurements()),\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n endedAtMonotonicMs: endedAt,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n schedulerControlPathMs: snapshot.schedulerControlPathMs,\n schedulerDecisionObservationMs: snapshot.decisionObservationMs,\n startedAtMonotonicMs: snapshot.startedAtMonotonicMs ?? endedAt,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #admissionMeasurements(): SchedulerMeasurementAdmission[] {\n const pendingByTaskId = new Map(\n this.#timing\n .pendingAdmissionDelays()\n .map(({ admissionDelay, taskId }) => [taskId, admissionDelay])\n );\n const taskIds = new Set([...pendingByTaskId.keys(), ...this.#chronologyByTaskId.keys()]);\n return [...taskIds]\n .map((taskId) => this.#admissionMeasurement(taskId, pendingByTaskId))\n .sort((left, right) => compareText(left.taskId, right.taskId));\n }\n\n #admissionMeasurement(\n taskId: string,\n pendingByTaskId: ReadonlyMap<string, AdmissionDelayBreakdown>\n ): SchedulerMeasurementAdmission {\n const chronology = this.#chronologyByTaskId.get(taskId);\n const admissionDelay = chronology?.admissionDelay ?? pendingByTaskId.get(taskId);\n if (admissionDelay === undefined)\n throw new Error(`missing admission measurement for ${taskId}`);\n return Object.freeze({\n admissionDelay,\n admittedAtMonotonicMs: chronology?.admittedAt ?? null,\n settledAtMonotonicMs: chronology?.settledAt ?? null,\n taskId\n });\n }\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"diagnostics.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AdmissionPolicyMeasurement,\n SchedulerDecisionMeasurementCumulative,\n SchedulerMeasurementAdmission,\n SchedulerMeasurementEffect,\n SchedulerTerminalEffect,\n SchedulerRawMeasurement\n} from \"../../../project-definition/project-definition.ts\";\nimport { diagnosticTags, type DiagnosticLogger } from \"../../diagnostic-logging/logger.ts\";\nimport type { AdmissionDelayBreakdown } from \"./integrals.ts\";\nimport { summaryFromSchedulerMeasurement } from \"./summary.ts\";\nimport { SchedulerPerformanceTiming } from \"./timing.ts\";\nimport { SchedulerPolicyMeasurement } from \"./policy.ts\";\n\n/** Explicit, enabled-only private handoff; the Scheduler never infers this from logger behavior. */\nexport type SchedulerPerformanceDiagnosticsInput = Readonly<{\n readonly clock: Readonly<{ now(): number }>;\n readonly declarativeFingerprint: string;\n readonly logger?: DiagnosticLogger;\n}>;\n\ntype AdmissionChronology = {\n readonly admissionDelay: AdmissionDelayBreakdown;\n readonly admittedAt: number;\n settledAt: number | undefined;\n};\n\nexport type AdmissionViablePendingTask = Readonly<{\n readonly kind: \"admissible-pending\" | \"capacity-blocked\" | \"mutex-blocked\";\n readonly taskId: string;\n}>;\n\nexport type SchedulerPerformanceState = Readonly<{\n readonly admissionViablePendingTasks: readonly AdmissionViablePendingTask[];\n readonly effectiveMaxParallel: number;\n readonly rootMaxParallel: number;\n readonly running: number;\n}>;\n\n/**\n * Scheduler-owned, invocation-local lifecycle projection. Clock boundaries and\n * numeric interval accumulation remain private collaborators of this owner.\n */\nexport class SchedulerPerformanceDiagnostics {\n readonly #declarativeFingerprint: string;\n readonly #logger: DiagnosticLogger | undefined;\n readonly #timing: SchedulerPerformanceTiming;\n #lastSettledTaskId: string | undefined;\n #completionTailActiveTaskIds: readonly string[] = Object.freeze([]);\n readonly #admittedTaskIds = new Set<string>();\n readonly #chronologyByTaskId = new Map<string, AdmissionChronology>();\n readonly #policyMeasurement = new SchedulerPolicyMeasurement();\n\n public constructor(\n input: SchedulerPerformanceDiagnosticsInput,\n initial: SchedulerPerformanceState\n ) {\n this.#declarativeFingerprint = input.declarativeFingerprint;\n this.#logger = input.logger;\n this.#timing = new SchedulerPerformanceTiming(input.clock, initial);\n }\n\n public measureControlPath<T>(operation: () => T): T {\n return this.#timing.measureControlPath(operation);\n }\n\n public observeDecision(observation: () => void): void {\n this.#timing.observeDecision(observation);\n }\n\n /** Flushes the old state before admission changes the real Scheduler state. */\n public beforeAdmission(taskId: string, runningTaskIds: readonly string[]): void {\n this.#admittedTaskIds.add(taskId);\n this.#completionTailActiveTaskIds = Object.freeze([...runningTaskIds, taskId]);\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n const admissionDelay = this.#timing.takeAdmissionDelay(taskId);\n if (admissionDelay === undefined) {\n this.#timing.invalidate(\"integral-invalid\");\n return;\n }\n this.#chronologyByTaskId.set(taskId, {\n admissionDelay,\n admittedAt: boundary,\n settledAt: undefined\n });\n }\n\n /** Flushes the old state before blocked/cancelled changes the real Scheduler state. */\n public beforePendingSettlement(taskIds: readonly string[] = []): void {\n const lastTaskId = taskIds.at(-1);\n if (lastTaskId !== undefined) this.#lastSettledTaskId = lastTaskId;\n this.#timing.boundary();\n }\n\n /** Flushes the old running interval before removing the actual running Task. */\n public beforeRunningSettlement(taskId: string): void {\n this.#lastSettledTaskId = taskId;\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n this.#timing.closeAcceptedWait(boundary);\n const chronology = this.#chronologyByTaskId.get(taskId);\n if (chronology === undefined) {\n this.#timing.invalidate(\"integral-invalid\");\n return;\n }\n chronology.settledAt = boundary;\n }\n\n public beforeAcceptedWait(): void {\n this.#timing.beginAcceptedWait();\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#timing.captureState(state);\n }\n\n public rawMeasurement(): SchedulerRawMeasurement {\n return this.#measurement(true);\n }\n\n public beginSelectedPolicyAction(taskId: string): void {\n this.#policyMeasurement.beginSelected(taskId, this.#timing.snapshot().totals);\n }\n\n public beginWaitPolicyAction(): void {\n this.#policyMeasurement.beginWait(this.#timing.snapshot().totals);\n }\n\n public recordEffect(effect: SchedulerMeasurementEffect): void {\n this.#policyMeasurement.recordEffect(effect);\n }\n\n public policyMeasurement(): AdmissionPolicyMeasurement {\n this.#timing.boundary();\n this.#completePolicyAction();\n return this.#policyMeasurement.snapshot(this.#cumulativeMeasurement());\n }\n\n public completePendingActionObservation(): void {\n this.#timing.boundary();\n this.#completePolicyAction();\n }\n\n public admittedTaskIds(): readonly string[] {\n return Object.freeze([...this.#admittedTaskIds]);\n }\n\n /** Internal default terminal hook; it contains writer failure without runner special-casing. */\n public defaultSummaryHook(): SchedulerTerminalEffect | undefined {\n if (this.#logger === undefined) return undefined;\n const logger = this.#logger;\n return (context) => {\n try {\n logger.observe({\n event: \"scheduler.summary\",\n tags: diagnosticTags(\"SUMMARY\"),\n details: summaryFromSchedulerMeasurement(context.rawMeasurement)\n });\n } catch {\n // Summary writer failure is contained by this hook, not the shared runner.\n }\n };\n }\n\n #completePolicyAction(): void {\n const timing = this.#timing.snapshot();\n this.#policyMeasurement.complete(timing.totals, timing.timing);\n }\n\n #cumulativeMeasurement(): SchedulerDecisionMeasurementCumulative {\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #measurement(terminal: boolean): SchedulerRawMeasurement {\n const endedAt = this.#timing.boundary();\n if (terminal && endedAt !== undefined) this.#timing.closeAcceptedWait(endedAt);\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n completionTailActiveTaskIds: Object.freeze([...this.#completionTailActiveTaskIds]),\n lastSettledTaskId: this.#lastSettledTaskId ?? null,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n if (endedAt === undefined)\n throw new Error(\"available Scheduler timing has no terminal boundary\");\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n admissions: Object.freeze(this.#admissionMeasurements()),\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n endedAtMonotonicMs: endedAt,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n schedulerControlPathMs: snapshot.schedulerControlPathMs,\n schedulerDecisionObservationMs: snapshot.decisionObservationMs,\n startedAtMonotonicMs: snapshot.startedAtMonotonicMs ?? endedAt,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #admissionMeasurements(): SchedulerMeasurementAdmission[] {\n const pendingByTaskId = new Map(\n this.#timing\n .pendingAdmissionDelays()\n .map(({ admissionDelay, taskId }) => [taskId, admissionDelay])\n );\n const taskIds = new Set([...pendingByTaskId.keys(), ...this.#chronologyByTaskId.keys()]);\n return [...taskIds]\n .map((taskId) => this.#admissionMeasurement(taskId, pendingByTaskId))\n .sort((left, right) => compareText(left.taskId, right.taskId));\n }\n\n #admissionMeasurement(\n taskId: string,\n pendingByTaskId: ReadonlyMap<string, AdmissionDelayBreakdown>\n ): SchedulerMeasurementAdmission {\n const chronology = this.#chronologyByTaskId.get(taskId);\n const admissionDelay = chronology?.admissionDelay ?? pendingByTaskId.get(taskId);\n if (admissionDelay === undefined)\n throw new Error(`missing admission measurement for ${taskId}`);\n return Object.freeze({\n admissionDelay,\n admittedAtMonotonicMs: chronology?.admittedAt ?? null,\n settledAtMonotonicMs: chronology?.settledAt ?? null,\n taskId\n });\n }\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -106,23 +106,29 @@ export class SchedulerPerformanceTiming {
106
106
  return undefined;
107
107
  try {
108
108
  const now = this.#clock.now();
109
- if (!Number.isFinite(now))
110
- return this.#unavailable("clock-non-finite");
109
+ if (!Number.isFinite(now)) {
110
+ this.#unavailable("clock-non-finite");
111
+ return undefined;
112
+ }
111
113
  if (this.#lastBoundaryAt !== undefined && now < this.#lastBoundaryAt) {
112
- return this.#unavailable("clock-backward");
114
+ this.#unavailable("clock-backward");
115
+ return undefined;
113
116
  }
114
117
  return now;
115
118
  }
116
119
  catch {
117
- return this.#unavailable("clock-threw");
120
+ this.#unavailable("clock-threw");
121
+ return undefined;
118
122
  }
119
123
  }
120
124
  #addTiming(kind, startedAt, endedAt) {
121
125
  if (startedAt === undefined || endedAt === undefined)
122
126
  return;
123
127
  const elapsedMs = endedAt - startedAt;
124
- if (!validElapsed(elapsedMs))
125
- return this.#markUnavailable("interval-invalid");
128
+ if (!validElapsed(elapsedMs)) {
129
+ this.#markUnavailable("interval-invalid");
130
+ return;
131
+ }
126
132
  if (kind === "control")
127
133
  this.#controlPathMs += elapsedMs;
128
134
  else
@@ -1 +1 @@
1
- {"version":3,"file":"timing.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/timing.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementIntervalContribution,\n SchedulerMeasurementTiming,\n SchedulerMeasurementTimingUnavailableReason\n} from \"../../../project-definition/project-definition.ts\";\nimport type { SchedulerPerformanceState } from \"./diagnostics.ts\";\nimport {\n SchedulerPerformanceIntegrals,\n type AdmissionDelayBreakdown,\n type SchedulerPerformancePeaks\n} from \"./integrals.ts\";\n\nexport type SchedulerPerformanceTimingSnapshot = Readonly<{\n readonly acceptedWaitCount: number;\n readonly acceptedWaitMs: number;\n readonly decisionObservationMs: number;\n readonly maxRunning: number;\n readonly peaks: SchedulerPerformancePeaks;\n readonly schedulerControlPathMs: number;\n readonly startedAtMonotonicMs: number | undefined;\n readonly timing: SchedulerMeasurementTiming;\n readonly totals: SchedulerMeasurementIntervalContribution;\n}>;\n\n/** Owns monotonic clock boundaries and delegates numeric interval accumulation. */\nexport class SchedulerPerformanceTiming {\n readonly #clock: Readonly<{ now(): number }>;\n readonly #integrals = new SchedulerPerformanceIntegrals();\n #lastBoundaryAt: number | undefined;\n #startedAt: number | undefined;\n #lastState: SchedulerPerformanceState;\n #timing: SchedulerMeasurementTiming = Object.freeze({ availability: \"available\" });\n #controlPathMs = 0;\n #decisionObservationMs = 0;\n #maxRunning: number;\n #acceptedWaitStartedAt: number | undefined;\n #acceptedWaitMs = 0;\n #acceptedWaitCount = 0;\n\n public constructor(clock: Readonly<{ now(): number }>, initial: SchedulerPerformanceState) {\n this.#clock = clock;\n this.#lastState = initial;\n this.#maxRunning = initial.running;\n this.#integrals.installPendingProjection(initial.admissionViablePendingTasks, true);\n const boundary = this.#sample();\n if (boundary !== undefined) {\n this.#lastBoundaryAt = boundary;\n this.#startedAt = boundary;\n }\n }\n\n /** Accounts a synchronous shell operation, never an await or author callback. */\n public measureControlPath<T>(operation: () => T): T {\n const startedAt = this.#sample();\n try {\n return operation();\n } finally {\n this.#addTiming(\"control\", startedAt, this.#sample());\n }\n }\n\n /** Keeps decision writer work separate from the shell control-path projection. */\n public observeDecision(observation: () => void): void {\n const startedAt = this.#sample();\n try {\n observation();\n } catch {\n // Diagnostic writers are observational; a direct test seam must preserve that containment too.\n }\n this.#addTiming(\"decision-observation\", startedAt, this.#sample());\n }\n\n public boundary(): number | undefined {\n const now = this.#sample();\n if (now === undefined) return undefined;\n if (this.#lastBoundaryAt !== undefined) this.#addElapsed(now - this.#lastBoundaryAt);\n this.#lastBoundaryAt = now;\n return this.#timing.availability === \"available\" ? now : undefined;\n }\n\n public beginAcceptedWait(): void {\n this.#acceptedWaitCount += 1;\n const boundary = this.boundary();\n if (boundary !== undefined && this.#acceptedWaitStartedAt === undefined) {\n this.#acceptedWaitStartedAt = boundary;\n }\n }\n\n public closeAcceptedWait(boundary: number): void {\n if (this.#acceptedWaitStartedAt === undefined) return;\n const elapsedMs = boundary - this.#acceptedWaitStartedAt;\n if (!validElapsed(elapsedMs)) this.#markUnavailable(\"interval-invalid\");\n else this.#acceptedWaitMs += elapsedMs;\n if (!Number.isFinite(this.#acceptedWaitMs)) this.#markUnavailable(\"integral-invalid\");\n this.#acceptedWaitStartedAt = undefined;\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#lastState = state;\n this.#maxRunning = Math.max(this.#maxRunning, state.running);\n this.#integrals.installPendingProjection(\n state.admissionViablePendingTasks,\n this.#timing.availability === \"available\"\n );\n }\n\n public takeAdmissionDelay(taskId: string): AdmissionDelayBreakdown | undefined {\n return this.#integrals.takeAdmissionDelay(taskId);\n }\n\n public pendingAdmissionDelays(): ReturnType<\n SchedulerPerformanceIntegrals[\"pendingAdmissionDelays\"]\n > {\n return this.#integrals.pendingAdmissionDelays();\n }\n\n public snapshot(): SchedulerPerformanceTimingSnapshot {\n const integralTotals = this.#integrals.totals();\n return Object.freeze({\n acceptedWaitCount: this.#acceptedWaitCount,\n acceptedWaitMs: this.#acceptedWaitMs,\n decisionObservationMs: this.#decisionObservationMs,\n maxRunning: this.#maxRunning,\n peaks: this.#integrals.peaks(),\n schedulerControlPathMs: this.#controlPathMs,\n startedAtMonotonicMs: this.#startedAt,\n timing: this.#timing,\n totals: Object.freeze({ ...integralTotals, acceptedWaitMs: this.#acceptedWaitMs })\n });\n }\n\n public invalidate(reason: SchedulerMeasurementTimingUnavailableReason): void {\n this.#markUnavailable(reason);\n }\n\n #sample(): number | undefined {\n if (this.#timing.availability === \"unavailable\") return undefined;\n try {\n const now = this.#clock.now();\n if (!Number.isFinite(now)) return this.#unavailable(\"clock-non-finite\");\n if (this.#lastBoundaryAt !== undefined && now < this.#lastBoundaryAt) {\n return this.#unavailable(\"clock-backward\");\n }\n return now;\n } catch {\n return this.#unavailable(\"clock-threw\");\n }\n }\n\n #addTiming(\n kind: \"control\" | \"decision-observation\",\n startedAt: number | undefined,\n endedAt: number | undefined\n ): void {\n if (startedAt === undefined || endedAt === undefined) return;\n const elapsedMs = endedAt - startedAt;\n if (!validElapsed(elapsedMs)) return this.#markUnavailable(\"interval-invalid\");\n if (kind === \"control\") this.#controlPathMs += elapsedMs;\n else this.#decisionObservationMs += elapsedMs;\n if (!Number.isFinite(this.#controlPathMs) || !Number.isFinite(this.#decisionObservationMs)) {\n this.#markUnavailable(\"integral-invalid\");\n }\n }\n\n #addElapsed(elapsedMs: number): void {\n if (!validElapsed(elapsedMs)) {\n this.#markUnavailable(elapsedMs < 0 ? \"clock-backward\" : \"interval-invalid\");\n return;\n }\n if (this.#timing.availability !== \"available\") return;\n if (!this.#integrals.addInterval(elapsedMs, this.#lastState)) {\n this.#markUnavailable(\"integral-invalid\");\n }\n }\n\n #unavailable(reason: SchedulerMeasurementTimingUnavailableReason): undefined {\n this.#markUnavailable(reason);\n return undefined;\n }\n\n #markUnavailable(reason: SchedulerMeasurementTimingUnavailableReason): void {\n if (this.#timing.availability === \"available\") {\n this.#timing = Object.freeze({ availability: \"unavailable\", reason });\n }\n }\n}\n\nfunction validElapsed(elapsedMs: number): boolean {\n return Number.isFinite(elapsedMs) && elapsedMs >= 0;\n}\n"]}
1
+ {"version":3,"file":"timing.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/timing.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementIntervalContribution,\n SchedulerMeasurementTiming,\n SchedulerMeasurementTimingUnavailableReason\n} from \"../../../project-definition/project-definition.ts\";\nimport type { SchedulerPerformanceState } from \"./diagnostics.ts\";\nimport {\n SchedulerPerformanceIntegrals,\n type AdmissionDelayBreakdown,\n type SchedulerPerformancePeaks\n} from \"./integrals.ts\";\n\nexport type SchedulerPerformanceTimingSnapshot = Readonly<{\n readonly acceptedWaitCount: number;\n readonly acceptedWaitMs: number;\n readonly decisionObservationMs: number;\n readonly maxRunning: number;\n readonly peaks: SchedulerPerformancePeaks;\n readonly schedulerControlPathMs: number;\n readonly startedAtMonotonicMs: number | undefined;\n readonly timing: SchedulerMeasurementTiming;\n readonly totals: SchedulerMeasurementIntervalContribution;\n}>;\n\n/** Owns monotonic clock boundaries and delegates numeric interval accumulation. */\nexport class SchedulerPerformanceTiming {\n readonly #clock: Readonly<{ now(): number }>;\n readonly #integrals = new SchedulerPerformanceIntegrals();\n #lastBoundaryAt: number | undefined;\n readonly #startedAt: number | undefined;\n #lastState: SchedulerPerformanceState;\n #timing: SchedulerMeasurementTiming = Object.freeze({ availability: \"available\" });\n #controlPathMs = 0;\n #decisionObservationMs = 0;\n #maxRunning: number;\n #acceptedWaitStartedAt: number | undefined;\n #acceptedWaitMs = 0;\n #acceptedWaitCount = 0;\n\n public constructor(clock: Readonly<{ now(): number }>, initial: SchedulerPerformanceState) {\n this.#clock = clock;\n this.#lastState = initial;\n this.#maxRunning = initial.running;\n this.#integrals.installPendingProjection(initial.admissionViablePendingTasks, true);\n const boundary = this.#sample();\n if (boundary !== undefined) {\n this.#lastBoundaryAt = boundary;\n this.#startedAt = boundary;\n }\n }\n\n /** Accounts a synchronous shell operation, never an await or author callback. */\n public measureControlPath<T>(operation: () => T): T {\n const startedAt = this.#sample();\n try {\n return operation();\n } finally {\n this.#addTiming(\"control\", startedAt, this.#sample());\n }\n }\n\n /** Keeps decision writer work separate from the shell control-path projection. */\n public observeDecision(observation: () => void): void {\n const startedAt = this.#sample();\n try {\n observation();\n } catch {\n // Diagnostic writers are observational; a direct test seam must preserve that containment too.\n }\n this.#addTiming(\"decision-observation\", startedAt, this.#sample());\n }\n\n public boundary(): number | undefined {\n const now = this.#sample();\n if (now === undefined) return undefined;\n if (this.#lastBoundaryAt !== undefined) this.#addElapsed(now - this.#lastBoundaryAt);\n this.#lastBoundaryAt = now;\n return this.#timing.availability === \"available\" ? now : undefined;\n }\n\n public beginAcceptedWait(): void {\n this.#acceptedWaitCount += 1;\n const boundary = this.boundary();\n if (boundary !== undefined && this.#acceptedWaitStartedAt === undefined) {\n this.#acceptedWaitStartedAt = boundary;\n }\n }\n\n public closeAcceptedWait(boundary: number): void {\n if (this.#acceptedWaitStartedAt === undefined) return;\n const elapsedMs = boundary - this.#acceptedWaitStartedAt;\n if (!validElapsed(elapsedMs)) this.#markUnavailable(\"interval-invalid\");\n else this.#acceptedWaitMs += elapsedMs;\n if (!Number.isFinite(this.#acceptedWaitMs)) this.#markUnavailable(\"integral-invalid\");\n this.#acceptedWaitStartedAt = undefined;\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#lastState = state;\n this.#maxRunning = Math.max(this.#maxRunning, state.running);\n this.#integrals.installPendingProjection(\n state.admissionViablePendingTasks,\n this.#timing.availability === \"available\"\n );\n }\n\n public takeAdmissionDelay(taskId: string): AdmissionDelayBreakdown | undefined {\n return this.#integrals.takeAdmissionDelay(taskId);\n }\n\n public pendingAdmissionDelays(): ReturnType<\n SchedulerPerformanceIntegrals[\"pendingAdmissionDelays\"]\n > {\n return this.#integrals.pendingAdmissionDelays();\n }\n\n public snapshot(): SchedulerPerformanceTimingSnapshot {\n const integralTotals = this.#integrals.totals();\n return Object.freeze({\n acceptedWaitCount: this.#acceptedWaitCount,\n acceptedWaitMs: this.#acceptedWaitMs,\n decisionObservationMs: this.#decisionObservationMs,\n maxRunning: this.#maxRunning,\n peaks: this.#integrals.peaks(),\n schedulerControlPathMs: this.#controlPathMs,\n startedAtMonotonicMs: this.#startedAt,\n timing: this.#timing,\n totals: Object.freeze({ ...integralTotals, acceptedWaitMs: this.#acceptedWaitMs })\n });\n }\n\n public invalidate(reason: SchedulerMeasurementTimingUnavailableReason): void {\n this.#markUnavailable(reason);\n }\n\n #sample(): number | undefined {\n if (this.#timing.availability === \"unavailable\") return undefined;\n try {\n const now = this.#clock.now();\n if (!Number.isFinite(now)) {\n this.#unavailable(\"clock-non-finite\");\n return undefined;\n }\n if (this.#lastBoundaryAt !== undefined && now < this.#lastBoundaryAt) {\n this.#unavailable(\"clock-backward\");\n return undefined;\n }\n return now;\n } catch {\n this.#unavailable(\"clock-threw\");\n return undefined;\n }\n }\n\n #addTiming(\n kind: \"control\" | \"decision-observation\",\n startedAt: number | undefined,\n endedAt: number | undefined\n ): void {\n if (startedAt === undefined || endedAt === undefined) return;\n const elapsedMs = endedAt - startedAt;\n if (!validElapsed(elapsedMs)) {\n this.#markUnavailable(\"interval-invalid\");\n return;\n }\n if (kind === \"control\") this.#controlPathMs += elapsedMs;\n else this.#decisionObservationMs += elapsedMs;\n if (!Number.isFinite(this.#controlPathMs) || !Number.isFinite(this.#decisionObservationMs)) {\n this.#markUnavailable(\"integral-invalid\");\n }\n }\n\n #addElapsed(elapsedMs: number): void {\n if (!validElapsed(elapsedMs)) {\n this.#markUnavailable(elapsedMs < 0 ? \"clock-backward\" : \"interval-invalid\");\n return;\n }\n if (this.#timing.availability !== \"available\") return;\n if (!this.#integrals.addInterval(elapsedMs, this.#lastState)) {\n this.#markUnavailable(\"integral-invalid\");\n }\n }\n\n #unavailable(reason: SchedulerMeasurementTimingUnavailableReason): undefined {\n this.#markUnavailable(reason);\n return undefined;\n }\n\n #markUnavailable(reason: SchedulerMeasurementTimingUnavailableReason): void {\n if (this.#timing.availability === \"available\") {\n this.#timing = Object.freeze({ availability: \"unavailable\", reason });\n }\n }\n}\n\nfunction validElapsed(elapsedMs: number): boolean {\n return Number.isFinite(elapsedMs) && elapsedMs >= 0;\n}\n"]}
@@ -15,7 +15,9 @@ export function observeSchedulerDecision(state, decision, diagnostics) {
15
15
  tags: schedulerDecisionTags(decision),
16
16
  details: schedulerDecisionDetails(decision)
17
17
  };
18
- const observe = () => observeSchedulerDiagnostic(state, observation);
18
+ const observe = () => {
19
+ observeSchedulerDiagnostic(state, observation);
20
+ };
19
21
  if (diagnostics === undefined)
20
22
  observe();
21
23
  else
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-observation.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-observation.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { diagnosticTags, type DiagnosticObservation } from \"../diagnostic-logging/logger.ts\";\nimport type { SchedulerDecision } from \"./scheduler-decision.ts\";\nimport type { SchedulerState } from \"./execution-state.ts\";\nimport {\n schedulerInspectionForCore,\n validateAdmissionCoreSelection\n} from \"./admission-core/core.ts\";\nimport type {\n AdmissionViablePendingTask,\n SchedulerPerformanceDiagnostics,\n SchedulerPerformanceState\n} from \"./measurement/diagnostics.ts\";\nimport type { AdmissionPolicyFault } from \"./scheduler-admission-decision.ts\";\n\n/** Fault logging is observational and therefore excluded from Scheduler control-path timing. */\nexport function observeAdmissionPolicyFault<TResult>(\n state: SchedulerState<TResult>,\n fault: AdmissionPolicyFault\n): void {\n observeSchedulerDiagnostic(state, {\n event: \"scheduler.admission-policy-failed\",\n tags: diagnosticTags(\"ADMISSION_POLICY_FAILED\", fault.category.toUpperCase()),\n details: Object.freeze({ category: fault.category })\n });\n}\n\nexport function observeSchedulerDecision<TResult>(\n state: SchedulerState<TResult>,\n decision: SchedulerDecision,\n diagnostics: SchedulerPerformanceDiagnostics | undefined\n): void {\n const observation: DiagnosticObservation = {\n event: \"scheduler.decision\",\n tags: schedulerDecisionTags(decision),\n details: schedulerDecisionDetails(decision)\n };\n const observe = () => observeSchedulerDiagnostic(state, observation);\n if (diagnostics === undefined) observe();\n else diagnostics.observeDecision(observe);\n}\n\n/** One immutable graph record makes the enclosing scheduler channel the self-contained evidence unit. */\nexport function observeSchedulerGraph<TResult>(state: SchedulerState<TResult>): void {\n const graph = state.graph.schedulerGraphSnapshot;\n observeSchedulerDiagnostic(state, {\n event: \"scheduler.graph\",\n tags: diagnosticTags(\"GRAPH\"),\n details: Object.freeze({ graph, graphFingerprint: schedulerGraphFingerprint(graph) })\n });\n}\n\nexport function schedulerGraphFingerprint(graph: unknown): string {\n return createHash(\"sha256\").update(JSON.stringify(graph)).digest(\"hex\");\n}\n\nfunction schedulerDecisionDetails(decision: SchedulerDecision): Readonly<Record<string, unknown>> {\n const { graphIdentity, ...dynamicFacts } = decision;\n return Object.freeze({\n ...dynamicFacts,\n graphFingerprint: schedulerGraphFingerprint(graphIdentity)\n });\n}\n\n/** Logger failures are observational and must not revise Scheduler lifecycle state. */\nexport function observeSchedulerDiagnostic<TResult>(\n state: SchedulerState<TResult>,\n observation: DiagnosticObservation\n): void {\n try {\n state.diagnosticLogger?.observe(observation);\n } catch {\n // Invocation logging has its own containment; retain it for direct Scheduler seams as well.\n }\n}\n\nexport function performanceState<TResult>(\n state: SchedulerState<TResult>\n): SchedulerPerformanceState {\n const inspection = schedulerInspectionForCore(state.admissionCore);\n const admissionViablePendingTasks: AdmissionViablePendingTask[] = [];\n for (const task of inspection.pendingTasks) {\n const validation = validateAdmissionCoreSelection(state.admissionCore, task.id);\n if (validation.accepted) {\n admissionViablePendingTasks.push(\n Object.freeze({ kind: \"admissible-pending\", taskId: task.id })\n );\n continue;\n }\n switch (validation.reason.kind) {\n case \"mutex-held\":\n admissionViablePendingTasks.push(Object.freeze({ kind: \"mutex-blocked\", taskId: task.id }));\n continue;\n case \"root-capacity-reached\":\n case \"scope-capacity-reached\":\n case \"resource-capacity-insufficient\":\n admissionViablePendingTasks.push(\n Object.freeze({ kind: \"capacity-blocked\", taskId: task.id })\n );\n continue;\n case \"depends-on-pending\":\n case \"observes-pending\":\n continue;\n case \"not-pending\":\n case \"state-complete\":\n case \"unknown-task\":\n throw new Error(\"shared admission core disagrees with Scheduler pending state\");\n }\n }\n return Object.freeze({\n admissionViablePendingTasks: Object.freeze(admissionViablePendingTasks),\n effectiveMaxParallel: inspection.effectiveMaxParallel,\n rootMaxParallel: inspection.maxParallel,\n running: inspection.runningTaskIds.length\n });\n}\n\nfunction schedulerDecisionTags(decision: SchedulerDecision): readonly string[] {\n return diagnosticTags(\n decision.kind.toUpperCase(),\n ...(\"taskId\" in decision ? [`TASK:${decision.taskId}`] : [])\n );\n}\n"]}
1
+ {"version":3,"file":"scheduler-observation.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-observation.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { diagnosticTags, type DiagnosticObservation } from \"../diagnostic-logging/logger.ts\";\nimport type { SchedulerDecision } from \"./scheduler-decision.ts\";\nimport type { SchedulerState } from \"./execution-state.ts\";\nimport {\n schedulerInspectionForCore,\n validateAdmissionCoreSelection\n} from \"./admission-core/core.ts\";\nimport type {\n AdmissionViablePendingTask,\n SchedulerPerformanceDiagnostics,\n SchedulerPerformanceState\n} from \"./measurement/diagnostics.ts\";\nimport type { AdmissionPolicyFault } from \"./scheduler-admission-decision.ts\";\n\n/** Fault logging is observational and therefore excluded from Scheduler control-path timing. */\nexport function observeAdmissionPolicyFault<TResult>(\n state: SchedulerState<TResult>,\n fault: AdmissionPolicyFault\n): void {\n observeSchedulerDiagnostic(state, {\n event: \"scheduler.admission-policy-failed\",\n tags: diagnosticTags(\"ADMISSION_POLICY_FAILED\", fault.category.toUpperCase()),\n details: Object.freeze({ category: fault.category })\n });\n}\n\nexport function observeSchedulerDecision<TResult>(\n state: SchedulerState<TResult>,\n decision: SchedulerDecision,\n diagnostics: SchedulerPerformanceDiagnostics | undefined\n): void {\n const observation: DiagnosticObservation = {\n event: \"scheduler.decision\",\n tags: schedulerDecisionTags(decision),\n details: schedulerDecisionDetails(decision)\n };\n const observe = () => {\n observeSchedulerDiagnostic(state, observation);\n };\n if (diagnostics === undefined) observe();\n else diagnostics.observeDecision(observe);\n}\n\n/** One immutable graph record makes the enclosing scheduler channel the self-contained evidence unit. */\nexport function observeSchedulerGraph<TResult>(state: SchedulerState<TResult>): void {\n const graph = state.graph.schedulerGraphSnapshot;\n observeSchedulerDiagnostic(state, {\n event: \"scheduler.graph\",\n tags: diagnosticTags(\"GRAPH\"),\n details: Object.freeze({ graph, graphFingerprint: schedulerGraphFingerprint(graph) })\n });\n}\n\nexport function schedulerGraphFingerprint(graph: unknown): string {\n return createHash(\"sha256\").update(JSON.stringify(graph)).digest(\"hex\");\n}\n\nfunction schedulerDecisionDetails(decision: SchedulerDecision): Readonly<Record<string, unknown>> {\n const { graphIdentity, ...dynamicFacts } = decision;\n return Object.freeze({\n ...dynamicFacts,\n graphFingerprint: schedulerGraphFingerprint(graphIdentity)\n });\n}\n\n/** Logger failures are observational and must not revise Scheduler lifecycle state. */\nexport function observeSchedulerDiagnostic<TResult>(\n state: SchedulerState<TResult>,\n observation: DiagnosticObservation\n): void {\n try {\n state.diagnosticLogger?.observe(observation);\n } catch {\n // Invocation logging has its own containment; retain it for direct Scheduler seams as well.\n }\n}\n\nexport function performanceState<TResult>(\n state: SchedulerState<TResult>\n): SchedulerPerformanceState {\n const inspection = schedulerInspectionForCore(state.admissionCore);\n const admissionViablePendingTasks: AdmissionViablePendingTask[] = [];\n for (const task of inspection.pendingTasks) {\n const validation = validateAdmissionCoreSelection(state.admissionCore, task.id);\n if (validation.accepted) {\n admissionViablePendingTasks.push(\n Object.freeze({ kind: \"admissible-pending\", taskId: task.id })\n );\n continue;\n }\n switch (validation.reason.kind) {\n case \"mutex-held\":\n admissionViablePendingTasks.push(Object.freeze({ kind: \"mutex-blocked\", taskId: task.id }));\n continue;\n case \"root-capacity-reached\":\n case \"scope-capacity-reached\":\n case \"resource-capacity-insufficient\":\n admissionViablePendingTasks.push(\n Object.freeze({ kind: \"capacity-blocked\", taskId: task.id })\n );\n continue;\n case \"depends-on-pending\":\n case \"observes-pending\":\n continue;\n case \"not-pending\":\n case \"state-complete\":\n case \"unknown-task\":\n throw new Error(\"shared admission core disagrees with Scheduler pending state\");\n }\n }\n return Object.freeze({\n admissionViablePendingTasks: Object.freeze(admissionViablePendingTasks),\n effectiveMaxParallel: inspection.effectiveMaxParallel,\n rootMaxParallel: inspection.maxParallel,\n running: inspection.runningTaskIds.length\n });\n}\n\nfunction schedulerDecisionTags(decision: SchedulerDecision): readonly string[] {\n return diagnosticTags(\n decision.kind.toUpperCase(),\n ...(\"taskId\" in decision ? [`TASK:${decision.taskId}`] : [])\n );\n}\n"]}
@@ -1,36 +1,36 @@
1
1
  import { diagnosticTags } from "../diagnostic-logging/logger.mjs";
2
2
  import { observeSchedulerDiagnostic } from "./scheduler-observation.mjs";
3
- /** Delivers the terminal measurement to the internal summary and caller hooks exactly once. */
3
+ /** Delivers the terminal measurement to the internal summary and caller effects exactly once. */
4
4
  export async function observeTerminalMeasurement(input) {
5
5
  input.diagnostics.completePendingActionObservation();
6
6
  const context = measurementContext(input.state, input.diagnostics.admittedTaskIds(), input.diagnostics.rawMeasurement());
7
- const callerHooks = input.options.measurementHooks ?? [];
8
- let callerHookFailed = false;
9
- const callerFailure = () => {
10
- callerHookFailed = true;
7
+ const callerEffects = input.options.terminalEffects ?? [];
8
+ let callerEffectFailed = false;
9
+ const reportCallerEffectFailure = () => {
10
+ callerEffectFailed = true;
11
11
  observeSchedulerDiagnostic(input.state, {
12
- event: "scheduler.measurement-hook-failed",
13
- tags: diagnosticTags("MEASUREMENT_HOOK_FAILED"),
12
+ event: "scheduler.terminal-effect-failed",
13
+ tags: diagnosticTags("TERMINAL_EFFECT_FAILED"),
14
14
  details: Object.freeze({})
15
15
  });
16
16
  try {
17
- input.options.onMeasurementHookFailure?.();
17
+ input.options.onTerminalEffectFailure?.();
18
18
  }
19
19
  catch {
20
20
  // A failure-reporting seam cannot revise terminal Scheduler facts either.
21
21
  }
22
22
  };
23
- const defaultHook = input.diagnostics.defaultSummaryHook();
23
+ const defaultSummaryEffect = input.diagnostics.defaultSummaryHook();
24
24
  const deliveries = Object.freeze([
25
- ...(defaultHook === undefined
25
+ ...(defaultSummaryEffect === undefined
26
26
  ? []
27
- : [Object.freeze({ hook: defaultHook, onFailure: () => undefined })]),
28
- ...callerHooks.map((hook) => Object.freeze({ hook, onFailure: callerFailure }))
27
+ : [Object.freeze({ effect: defaultSummaryEffect, onFailure: () => undefined })]),
28
+ ...callerEffects.map((effect) => Object.freeze({ effect, onFailure: reportCallerEffectFailure }))
29
29
  ]);
30
- await deliverTerminalMeasurementHooks(deliveries, context);
31
- if (callerHooks.length > 0 && !callerHookFailed) {
30
+ await deliverTerminalEffects(deliveries, context);
31
+ if (callerEffects.length > 0 && !callerEffectFailed) {
32
32
  try {
33
- input.options.onMeasurementHooksSettled?.();
33
+ input.options.onTerminalEffectsSettled?.();
34
34
  }
35
35
  catch {
36
36
  // A success-reporting seam cannot revise terminal Scheduler facts either.
@@ -38,10 +38,10 @@ export async function observeTerminalMeasurement(input) {
38
38
  }
39
39
  return context;
40
40
  }
41
- async function deliverTerminalMeasurementHooks(deliveries, context) {
41
+ async function deliverTerminalEffects(deliveries, context) {
42
42
  for (const delivery of deliveries) {
43
43
  try {
44
- await delivery.hook(context);
44
+ await delivery.effect(context);
45
45
  }
46
46
  catch {
47
47
  delivery.onFailure();
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-terminal-measurement.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-terminal-measurement.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementContext,\n SchedulerMeasurementHook,\n SchedulerRawMeasurement\n} from \"../../project-definition/project-definition.ts\";\nimport { diagnosticTags } from \"../diagnostic-logging/logger.ts\";\nimport type { RunTaskGraphOptions, SchedulerState } from \"./execution-state.ts\";\nimport type { SchedulerPerformanceDiagnostics } from \"./measurement/diagnostics.ts\";\nimport { observeSchedulerDiagnostic } from \"./scheduler-observation.ts\";\n\n/** Delivers the terminal measurement to the internal summary and caller hooks exactly once. */\nexport async function observeTerminalMeasurement<TResult>(\n input: Readonly<{\n readonly diagnostics: SchedulerPerformanceDiagnostics;\n readonly options: RunTaskGraphOptions<TResult>;\n readonly state: SchedulerState<TResult>;\n }>\n): Promise<SchedulerMeasurementContext> {\n input.diagnostics.completePendingActionObservation();\n const context = measurementContext(\n input.state,\n input.diagnostics.admittedTaskIds(),\n input.diagnostics.rawMeasurement()\n );\n const callerHooks = input.options.measurementHooks ?? [];\n let callerHookFailed = false;\n const callerFailure = () => {\n callerHookFailed = true;\n observeSchedulerDiagnostic(input.state, {\n event: \"scheduler.measurement-hook-failed\",\n tags: diagnosticTags(\"MEASUREMENT_HOOK_FAILED\"),\n details: Object.freeze({})\n });\n try {\n input.options.onMeasurementHookFailure?.();\n } catch {\n // A failure-reporting seam cannot revise terminal Scheduler facts either.\n }\n };\n const defaultHook = input.diagnostics.defaultSummaryHook();\n const deliveries: readonly TerminalMeasurementDelivery[] = Object.freeze([\n ...(defaultHook === undefined\n ? []\n : [Object.freeze({ hook: defaultHook, onFailure: () => undefined })]),\n ...callerHooks.map((hook) => Object.freeze({ hook, onFailure: callerFailure }))\n ]);\n await deliverTerminalMeasurementHooks(deliveries, context);\n if (callerHooks.length > 0 && !callerHookFailed) {\n try {\n input.options.onMeasurementHooksSettled?.();\n } catch {\n // A success-reporting seam cannot revise terminal Scheduler facts either.\n }\n }\n return context;\n}\n\ntype TerminalMeasurementDelivery = Readonly<{\n readonly hook: SchedulerMeasurementHook;\n readonly onFailure: () => void;\n}>;\n\nasync function deliverTerminalMeasurementHooks(\n deliveries: readonly TerminalMeasurementDelivery[],\n context: SchedulerMeasurementContext\n): Promise<void> {\n for (const delivery of deliveries) {\n try {\n await delivery.hook(context);\n } catch {\n delivery.onFailure();\n }\n }\n}\n\nfunction measurementContext<TResult>(\n state: SchedulerState<TResult>,\n admittedTaskIds: readonly string[],\n rawMeasurement: SchedulerRawMeasurement\n): SchedulerMeasurementContext {\n return Object.freeze({\n graph: state.graph.schedulerGraphSnapshot,\n execution: Object.freeze({\n admittedTaskIds: Object.freeze([...admittedTaskIds]),\n settledTasks: Object.freeze(\n state.graph.tasks.map((task) => {\n const settlement = state.settlementsByTaskId.get(task.id);\n if (settlement === undefined) throw new Error(`task ${task.id} was not settled`);\n return Object.freeze({ kind: settlement.kind, taskId: task.id });\n })\n )\n }),\n rawMeasurement\n });\n}\n"]}
1
+ {"version":3,"file":"scheduler-terminal-measurement.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-terminal-measurement.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementContext,\n SchedulerTerminalEffect,\n SchedulerRawMeasurement\n} from \"../../project-definition/project-definition.ts\";\nimport { diagnosticTags } from \"../diagnostic-logging/logger.ts\";\nimport type { RunTaskGraphOptions, SchedulerState } from \"./execution-state.ts\";\nimport type { SchedulerPerformanceDiagnostics } from \"./measurement/diagnostics.ts\";\nimport { observeSchedulerDiagnostic } from \"./scheduler-observation.ts\";\n\n/** Delivers the terminal measurement to the internal summary and caller effects exactly once. */\nexport async function observeTerminalMeasurement<TResult>(\n input: Readonly<{\n readonly diagnostics: SchedulerPerformanceDiagnostics;\n readonly options: RunTaskGraphOptions<TResult>;\n readonly state: SchedulerState<TResult>;\n }>\n): Promise<SchedulerMeasurementContext> {\n input.diagnostics.completePendingActionObservation();\n const context = measurementContext(\n input.state,\n input.diagnostics.admittedTaskIds(),\n input.diagnostics.rawMeasurement()\n );\n const callerEffects = input.options.terminalEffects ?? [];\n let callerEffectFailed = false;\n const reportCallerEffectFailure = () => {\n callerEffectFailed = true;\n observeSchedulerDiagnostic(input.state, {\n event: \"scheduler.terminal-effect-failed\",\n tags: diagnosticTags(\"TERMINAL_EFFECT_FAILED\"),\n details: Object.freeze({})\n });\n try {\n input.options.onTerminalEffectFailure?.();\n } catch {\n // A failure-reporting seam cannot revise terminal Scheduler facts either.\n }\n };\n const defaultSummaryEffect = input.diagnostics.defaultSummaryHook();\n const deliveries: readonly TerminalEffectDelivery[] = Object.freeze([\n ...(defaultSummaryEffect === undefined\n ? []\n : [Object.freeze({ effect: defaultSummaryEffect, onFailure: () => undefined })]),\n ...callerEffects.map((effect) =>\n Object.freeze({ effect, onFailure: reportCallerEffectFailure })\n )\n ]);\n await deliverTerminalEffects(deliveries, context);\n if (callerEffects.length > 0 && !callerEffectFailed) {\n try {\n input.options.onTerminalEffectsSettled?.();\n } catch {\n // A success-reporting seam cannot revise terminal Scheduler facts either.\n }\n }\n return context;\n}\n\ntype TerminalEffectDelivery = Readonly<{\n readonly effect: SchedulerTerminalEffect;\n readonly onFailure: () => void;\n}>;\n\nasync function deliverTerminalEffects(\n deliveries: readonly TerminalEffectDelivery[],\n context: SchedulerMeasurementContext\n): Promise<void> {\n for (const delivery of deliveries) {\n try {\n await delivery.effect(context);\n } catch {\n delivery.onFailure();\n }\n }\n}\n\nfunction measurementContext<TResult>(\n state: SchedulerState<TResult>,\n admittedTaskIds: readonly string[],\n rawMeasurement: SchedulerRawMeasurement\n): SchedulerMeasurementContext {\n return Object.freeze({\n graph: state.graph.schedulerGraphSnapshot,\n execution: Object.freeze({\n admittedTaskIds: Object.freeze([...admittedTaskIds]),\n settledTasks: Object.freeze(\n state.graph.tasks.map((task) => {\n const settlement = state.settlementsByTaskId.get(task.id);\n if (settlement === undefined) throw new Error(`task ${task.id} was not settled`);\n return Object.freeze({ kind: settlement.kind, taskId: task.id });\n })\n )\n }),\n rawMeasurement\n });\n}\n"]}
@@ -45,7 +45,9 @@ export async function runTaskGraph(options) {
45
45
  if (diagnostics === undefined)
46
46
  applyAdmissionPolicyFault(state, error);
47
47
  else
48
- diagnostics.measureControlPath(() => applyAdmissionPolicyFault(state, error));
48
+ diagnostics.measureControlPath(() => {
49
+ applyAdmissionPolicyFault(state, error);
50
+ });
49
51
  diagnostics?.captureState(performanceState(state));
50
52
  observeAdmissionPolicyFault(state, error);
51
53
  trigger = Object.freeze({ kind: "cancellation-applied" });
@@ -62,7 +64,9 @@ export async function runTaskGraph(options) {
62
64
  if (diagnostics === undefined)
63
65
  applyAdmissionPolicyFault(state, lifecycleFault);
64
66
  else
65
- diagnostics.measureControlPath(() => applyAdmissionPolicyFault(state, lifecycleFault));
67
+ diagnostics.measureControlPath(() => {
68
+ applyAdmissionPolicyFault(state, lifecycleFault);
69
+ });
66
70
  diagnostics?.captureState(performanceState(state));
67
71
  observeAdmissionPolicyFault(state, lifecycleFault);
68
72
  trigger = Object.freeze({ kind: "cancellation-applied" });
@@ -81,7 +85,9 @@ export async function runTaskGraph(options) {
81
85
  if (diagnostics === undefined)
82
86
  applyAdmission(state, decision);
83
87
  else
84
- diagnostics.measureControlPath(() => applyAdmission(state, decision));
88
+ diagnostics.measureControlPath(() => {
89
+ applyAdmission(state, decision);
90
+ });
85
91
  diagnostics?.captureState(performanceState(state));
86
92
  if (state.admissionPolicy.requiresMeasurement === true) {
87
93
  diagnostics?.beginSelectedPolicyAction(decision.taskId);
@@ -96,7 +102,9 @@ export async function runTaskGraph(options) {
96
102
  if (diagnostics === undefined)
97
103
  applyBlockedSettlement(state, decision);
98
104
  else
99
- diagnostics.measureControlPath(() => applyBlockedSettlement(state, decision));
105
+ diagnostics.measureControlPath(() => {
106
+ applyBlockedSettlement(state, decision);
107
+ });
100
108
  diagnostics?.captureState(performanceState(state));
101
109
  diagnostics?.recordEffect(Object.freeze({
102
110
  kind: "settled",
@@ -114,7 +122,9 @@ export async function runTaskGraph(options) {
114
122
  if (diagnostics === undefined)
115
123
  applyCancellation(state, decision);
116
124
  else
117
- diagnostics.measureControlPath(() => applyCancellation(state, decision));
125
+ diagnostics.measureControlPath(() => {
126
+ applyCancellation(state, decision);
127
+ });
118
128
  diagnostics?.captureState(performanceState(state));
119
129
  for (const taskId of decision.taskIds) {
120
130
  diagnostics?.recordEffect(Object.freeze({
@@ -137,7 +147,9 @@ export async function runTaskGraph(options) {
137
147
  if (diagnostics === undefined)
138
148
  settleRunningTask(state, completion);
139
149
  else
140
- diagnostics.measureControlPath(() => settleRunningTask(state, completion));
150
+ diagnostics.measureControlPath(() => {
151
+ settleRunningTask(state, completion);
152
+ });
141
153
  const settlementKind = completion.settlement.kind;
142
154
  if (settlementKind !== "completed" &&
143
155
  settlementKind !== "prerequisite-unsatisfied" &&
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionPolicyContext } from \"../../project-definition/project-definition.ts\";\nimport { prepareTaskGraph } from \"./graph.ts\";\nimport {\n decideScheduler,\n type SchedulerDecision,\n type SchedulerTrigger\n} from \"./scheduler-decision.ts\";\nimport {\n createSchedulerState,\n snapshotSchedulerState,\n type RunTaskGraphOptions,\n type SchedulerState,\n type TaskGraphRun\n} from \"./execution-state.ts\";\nexport type {\n RunTaskGraphOptions,\n SettledTask,\n TaskExecutionContext,\n TaskGraphRun,\n TaskSettlement\n} from \"./execution-state.ts\";\nimport { AdmissionPolicyFault } from \"./scheduler-admission-decision.ts\";\nimport { replayCoreForcedBlocks } from \"./forced-block-effect-replay.ts\";\nimport { SchedulerPerformanceDiagnostics } from \"./measurement/diagnostics.ts\";\nimport {\n observeAdmissionPolicyFault,\n observeSchedulerDecision,\n observeSchedulerGraph,\n performanceState\n} from \"./scheduler-observation.ts\";\nimport { observeTerminalMeasurement } from \"./scheduler-terminal-measurement.ts\";\nimport {\n applyAdmission,\n applyAdmissionPolicyFault,\n applyBlockedSettlement,\n applyCancellation,\n buildTaskGraphRun,\n nextRunningSettlement,\n settleRunningTask\n} from \"./scheduler-task-lifecycle.ts\";\nimport {\n cancelPendingAdmissionCore,\n reconcileAdmissionCore,\n selectAdmissionCore,\n settleRunningAdmissionCore,\n type AdmissionCoreEffect\n} from \"./admission-core/core.ts\";\n\nexport async function runTaskGraph<TResult>(\n options: RunTaskGraphOptions<TResult>\n): Promise<TaskGraphRun<TResult>> {\n const graph = prepareTaskGraph(options.graph, options.maxParallel);\n const state = createSchedulerState(graph, options);\n observeSchedulerGraph(state);\n const measurementInput =\n options.performanceDiagnostics ??\n (state.admissionPolicy.requiresMeasurement === true\n ? Object.freeze({\n clock: Object.freeze({ now: () => performance.now() }),\n declarativeFingerprint: \"\"\n })\n : undefined);\n const diagnostics =\n measurementInput === undefined\n ? undefined\n : new SchedulerPerformanceDiagnostics(measurementInput, performanceState(state));\n const initialReconciliation = reconcileAdmissionCore(state.admissionCore);\n replayCoreForcedBlocks(\n state,\n initialReconciliation.effects,\n initialReconciliation.effectStates,\n diagnostics,\n triggerForInitialReconciliation()\n );\n let trigger: SchedulerTrigger = Object.freeze({ kind: \"execution-started\" });\n\n while (true) {\n let decision: SchedulerDecision;\n try {\n const snapshot = snapshotSchedulerState(state);\n const measurement =\n state.admissionPolicy.requiresMeasurement === true\n ? () => decisionBoundaryMeasurement(diagnostics)\n : undefined;\n decision =\n diagnostics?.measureControlPath(() =>\n decideScheduler(\n snapshot,\n trigger,\n state.admissionPolicy,\n measurement,\n state.admissionCore\n )\n ) ??\n decideScheduler(snapshot, trigger, state.admissionPolicy, measurement, state.admissionCore);\n } catch (error) {\n if (!(error instanceof AdmissionPolicyFault)) throw error;\n const cancellation = cancelPendingAdmissionCore(state.admissionCore);\n state.admissionCore = cancellation.state;\n diagnostics?.beforePendingSettlement(state.pending.map((task) => task.id));\n if (diagnostics === undefined) applyAdmissionPolicyFault(state, error);\n else diagnostics.measureControlPath(() => applyAdmissionPolicyFault(state, error));\n diagnostics?.captureState(performanceState(state));\n observeAdmissionPolicyFault(state, error);\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n }\n observeSchedulerDecision(state, decision, diagnostics);\n\n switch (decision.kind) {\n case \"admit\": {\n if (state.signal?.aborted === true) {\n const cancellation = cancelPendingAdmissionCore(state.admissionCore);\n state.admissionCore = cancellation.state;\n diagnostics?.beforePendingSettlement(state.pending.map((task) => task.id));\n const lifecycleFault = new AdmissionPolicyFault(\"lifecycle-invalid-select\");\n if (diagnostics === undefined) applyAdmissionPolicyFault(state, lifecycleFault);\n else\n diagnostics.measureControlPath(() => applyAdmissionPolicyFault(state, lifecycleFault));\n diagnostics?.captureState(performanceState(state));\n observeAdmissionPolicyFault(state, lifecycleFault);\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n }\n const selection = selectAdmissionCore(state.admissionCore, decision.taskId);\n if (!selection.accepted) {\n throw new Error(\"shared admission core rejected a Scheduler hard-guarded selection\");\n }\n const admissionEffect = selection.transition.effects[0];\n if (admissionEffect === undefined) {\n throw new Error(\"shared admission core omitted a Scheduler admission effect\");\n }\n state.admissionCore = selection.transition.state;\n diagnostics?.beforeAdmission(decision.taskId, [...state.runningById.keys()]);\n if (diagnostics === undefined) applyAdmission(state, decision);\n else diagnostics.measureControlPath(() => applyAdmission(state, decision));\n diagnostics?.captureState(performanceState(state));\n if (state.admissionPolicy.requiresMeasurement === true) {\n diagnostics?.beginSelectedPolicyAction(decision.taskId);\n diagnostics?.recordEffect(Object.freeze({ kind: \"admitted\", taskId: decision.taskId }));\n }\n observeAdmissionCoreEffect(state, admissionEffect);\n trigger = Object.freeze({ kind: \"admission-continued\" });\n continue;\n }\n case \"settle-blocked\":\n diagnostics?.beforePendingSettlement([decision.taskId]);\n if (diagnostics === undefined) applyBlockedSettlement(state, decision);\n else diagnostics.measureControlPath(() => applyBlockedSettlement(state, decision));\n diagnostics?.captureState(performanceState(state));\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: \"blocked\",\n taskId: decision.taskId\n })\n );\n trigger = Object.freeze({\n kind: \"blocked-settled\",\n taskId: decision.taskId\n });\n continue;\n case \"cancel-pending\":\n state.admissionCore = cancelPendingAdmissionCore(state.admissionCore).state;\n diagnostics?.beforePendingSettlement(decision.taskIds);\n if (diagnostics === undefined) applyCancellation(state, decision);\n else diagnostics.measureControlPath(() => applyCancellation(state, decision));\n diagnostics?.captureState(performanceState(state));\n for (const taskId of decision.taskIds) {\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: \"cancelled-before-start\",\n taskId\n })\n );\n }\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n case \"await-running\": {\n if (decision.proposal?.kind === \"wait\") {\n diagnostics?.beforeAcceptedWait();\n if (state.admissionPolicy.requiresMeasurement === true) {\n diagnostics?.beginWaitPolicyAction();\n }\n }\n const completion = await nextRunningSettlement(state);\n diagnostics?.beforeRunningSettlement(completion.taskId);\n if (diagnostics === undefined) settleRunningTask(state, completion);\n else diagnostics.measureControlPath(() => settleRunningTask(state, completion));\n const settlementKind = completion.settlement.kind;\n if (\n settlementKind !== \"completed\" &&\n settlementKind !== \"prerequisite-unsatisfied\" &&\n settlementKind !== \"failed\"\n ) {\n throw new Error(\"running Task completed with a non-running settlement kind\");\n }\n const transition = settleRunningAdmissionCore(\n state.admissionCore,\n completion.taskId,\n settlementKind\n );\n if (!transition.accepted) {\n throw new Error(\"shared admission core rejected a Scheduler running settlement\");\n }\n const directEffect = transition.transition.effects[0];\n const directState = transition.transition.effectStates[0];\n if (directEffect === undefined || directState === undefined) {\n throw new Error(\"shared admission core omitted a Scheduler running settlement effect\");\n }\n state.admissionCore = directState;\n diagnostics?.captureState(performanceState(state));\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n })\n );\n observeAdmissionCoreEffect(state, directEffect);\n replayCoreForcedBlocks(\n state,\n transition.transition.effects.slice(1),\n transition.transition.effectStates.slice(1),\n diagnostics,\n Object.freeze({\n kind: \"task-settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n })\n );\n trigger = Object.freeze({\n kind: \"task-settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n });\n continue;\n }\n case \"complete\": {\n if (diagnostics === undefined) return buildTaskGraphRun(state);\n const run = diagnostics.measureControlPath(() => buildTaskGraphRun(state));\n const terminalMeasurement = await observeTerminalMeasurement({\n diagnostics,\n options,\n state\n });\n return Object.freeze({ ...run, terminalMeasurement });\n }\n }\n }\n}\n\nfunction observeAdmissionCoreEffect<TResult>(\n state: SchedulerState<TResult>,\n effect: AdmissionCoreEffect\n): void {\n if (state.onAdmissionCoreEffect === undefined) return;\n state.onAdmissionCoreEffect(Object.freeze({ effect, state: state.admissionCore }));\n}\n\nfunction triggerForInitialReconciliation(): SchedulerTrigger {\n return Object.freeze({ kind: \"execution-started\" });\n}\n\nfunction decisionBoundaryMeasurement(\n diagnostics: SchedulerPerformanceDiagnostics | undefined\n): AdmissionPolicyContext[\"measurement\"] {\n if (diagnostics === undefined) {\n throw new Error(\"custom policy measurement collector is unavailable\");\n }\n return diagnostics.policyMeasurement();\n}\n"]}
1
+ {"version":3,"file":"scheduler.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionPolicyContext } from \"../../project-definition/project-definition.ts\";\nimport { prepareTaskGraph } from \"./graph.ts\";\nimport {\n decideScheduler,\n type SchedulerDecision,\n type SchedulerTrigger\n} from \"./scheduler-decision.ts\";\nimport {\n createSchedulerState,\n snapshotSchedulerState,\n type RunTaskGraphOptions,\n type SchedulerState,\n type TaskGraphRun\n} from \"./execution-state.ts\";\nexport type {\n RunTaskGraphOptions,\n SettledTask,\n TaskExecutionContext,\n TaskGraphRun,\n TaskSettlement\n} from \"./execution-state.ts\";\nimport { AdmissionPolicyFault } from \"./scheduler-admission-decision.ts\";\nimport { replayCoreForcedBlocks } from \"./forced-block-effect-replay.ts\";\nimport { SchedulerPerformanceDiagnostics } from \"./measurement/diagnostics.ts\";\nimport {\n observeAdmissionPolicyFault,\n observeSchedulerDecision,\n observeSchedulerGraph,\n performanceState\n} from \"./scheduler-observation.ts\";\nimport { observeTerminalMeasurement } from \"./scheduler-terminal-measurement.ts\";\nimport {\n applyAdmission,\n applyAdmissionPolicyFault,\n applyBlockedSettlement,\n applyCancellation,\n buildTaskGraphRun,\n nextRunningSettlement,\n settleRunningTask\n} from \"./scheduler-task-lifecycle.ts\";\nimport {\n cancelPendingAdmissionCore,\n reconcileAdmissionCore,\n selectAdmissionCore,\n settleRunningAdmissionCore,\n type AdmissionCoreEffect\n} from \"./admission-core/core.ts\";\n\nexport async function runTaskGraph<TResult>(\n options: RunTaskGraphOptions<TResult>\n): Promise<TaskGraphRun<TResult>> {\n const graph = prepareTaskGraph(options.graph, options.maxParallel);\n const state = createSchedulerState(graph, options);\n observeSchedulerGraph(state);\n const measurementInput =\n options.performanceDiagnostics ??\n (state.admissionPolicy.requiresMeasurement === true\n ? Object.freeze({\n clock: Object.freeze({ now: () => performance.now() }),\n declarativeFingerprint: \"\"\n })\n : undefined);\n const diagnostics =\n measurementInput === undefined\n ? undefined\n : new SchedulerPerformanceDiagnostics(measurementInput, performanceState(state));\n const initialReconciliation = reconcileAdmissionCore(state.admissionCore);\n replayCoreForcedBlocks(\n state,\n initialReconciliation.effects,\n initialReconciliation.effectStates,\n diagnostics,\n triggerForInitialReconciliation()\n );\n let trigger: SchedulerTrigger = Object.freeze({ kind: \"execution-started\" });\n\n while (true) {\n let decision: SchedulerDecision;\n try {\n const snapshot = snapshotSchedulerState(state);\n const measurement =\n state.admissionPolicy.requiresMeasurement === true\n ? () => decisionBoundaryMeasurement(diagnostics)\n : undefined;\n decision =\n diagnostics?.measureControlPath(() =>\n decideScheduler(\n snapshot,\n trigger,\n state.admissionPolicy,\n measurement,\n state.admissionCore\n )\n ) ??\n decideScheduler(snapshot, trigger, state.admissionPolicy, measurement, state.admissionCore);\n } catch (error) {\n if (!(error instanceof AdmissionPolicyFault)) throw error;\n const cancellation = cancelPendingAdmissionCore(state.admissionCore);\n state.admissionCore = cancellation.state;\n diagnostics?.beforePendingSettlement(state.pending.map((task) => task.id));\n if (diagnostics === undefined) applyAdmissionPolicyFault(state, error);\n else\n diagnostics.measureControlPath(() => {\n applyAdmissionPolicyFault(state, error);\n });\n diagnostics?.captureState(performanceState(state));\n observeAdmissionPolicyFault(state, error);\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n }\n observeSchedulerDecision(state, decision, diagnostics);\n\n switch (decision.kind) {\n case \"admit\": {\n if (state.signal?.aborted === true) {\n const cancellation = cancelPendingAdmissionCore(state.admissionCore);\n state.admissionCore = cancellation.state;\n diagnostics?.beforePendingSettlement(state.pending.map((task) => task.id));\n const lifecycleFault = new AdmissionPolicyFault(\"lifecycle-invalid-select\");\n if (diagnostics === undefined) applyAdmissionPolicyFault(state, lifecycleFault);\n else\n diagnostics.measureControlPath(() => {\n applyAdmissionPolicyFault(state, lifecycleFault);\n });\n diagnostics?.captureState(performanceState(state));\n observeAdmissionPolicyFault(state, lifecycleFault);\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n }\n const selection = selectAdmissionCore(state.admissionCore, decision.taskId);\n if (!selection.accepted) {\n throw new Error(\"shared admission core rejected a Scheduler hard-guarded selection\");\n }\n const admissionEffect = selection.transition.effects[0];\n if (admissionEffect === undefined) {\n throw new Error(\"shared admission core omitted a Scheduler admission effect\");\n }\n state.admissionCore = selection.transition.state;\n diagnostics?.beforeAdmission(decision.taskId, [...state.runningById.keys()]);\n if (diagnostics === undefined) applyAdmission(state, decision);\n else\n diagnostics.measureControlPath(() => {\n applyAdmission(state, decision);\n });\n diagnostics?.captureState(performanceState(state));\n if (state.admissionPolicy.requiresMeasurement === true) {\n diagnostics?.beginSelectedPolicyAction(decision.taskId);\n diagnostics?.recordEffect(Object.freeze({ kind: \"admitted\", taskId: decision.taskId }));\n }\n observeAdmissionCoreEffect(state, admissionEffect);\n trigger = Object.freeze({ kind: \"admission-continued\" });\n continue;\n }\n case \"settle-blocked\":\n diagnostics?.beforePendingSettlement([decision.taskId]);\n if (diagnostics === undefined) applyBlockedSettlement(state, decision);\n else\n diagnostics.measureControlPath(() => {\n applyBlockedSettlement(state, decision);\n });\n diagnostics?.captureState(performanceState(state));\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: \"blocked\",\n taskId: decision.taskId\n })\n );\n trigger = Object.freeze({\n kind: \"blocked-settled\",\n taskId: decision.taskId\n });\n continue;\n case \"cancel-pending\":\n state.admissionCore = cancelPendingAdmissionCore(state.admissionCore).state;\n diagnostics?.beforePendingSettlement(decision.taskIds);\n if (diagnostics === undefined) applyCancellation(state, decision);\n else\n diagnostics.measureControlPath(() => {\n applyCancellation(state, decision);\n });\n diagnostics?.captureState(performanceState(state));\n for (const taskId of decision.taskIds) {\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: \"cancelled-before-start\",\n taskId\n })\n );\n }\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n case \"await-running\": {\n if (decision.proposal?.kind === \"wait\") {\n diagnostics?.beforeAcceptedWait();\n if (state.admissionPolicy.requiresMeasurement === true) {\n diagnostics?.beginWaitPolicyAction();\n }\n }\n const completion = await nextRunningSettlement(state);\n diagnostics?.beforeRunningSettlement(completion.taskId);\n if (diagnostics === undefined) settleRunningTask(state, completion);\n else\n diagnostics.measureControlPath(() => {\n settleRunningTask(state, completion);\n });\n const settlementKind = completion.settlement.kind;\n if (\n settlementKind !== \"completed\" &&\n settlementKind !== \"prerequisite-unsatisfied\" &&\n settlementKind !== \"failed\"\n ) {\n throw new Error(\"running Task completed with a non-running settlement kind\");\n }\n const transition = settleRunningAdmissionCore(\n state.admissionCore,\n completion.taskId,\n settlementKind\n );\n if (!transition.accepted) {\n throw new Error(\"shared admission core rejected a Scheduler running settlement\");\n }\n const directEffect = transition.transition.effects[0];\n const directState = transition.transition.effectStates[0];\n if (directEffect === undefined || directState === undefined) {\n throw new Error(\"shared admission core omitted a Scheduler running settlement effect\");\n }\n state.admissionCore = directState;\n diagnostics?.captureState(performanceState(state));\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n })\n );\n observeAdmissionCoreEffect(state, directEffect);\n replayCoreForcedBlocks(\n state,\n transition.transition.effects.slice(1),\n transition.transition.effectStates.slice(1),\n diagnostics,\n Object.freeze({\n kind: \"task-settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n })\n );\n trigger = Object.freeze({\n kind: \"task-settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n });\n continue;\n }\n case \"complete\": {\n if (diagnostics === undefined) return buildTaskGraphRun(state);\n const run = diagnostics.measureControlPath(() => buildTaskGraphRun(state));\n const terminalMeasurement = await observeTerminalMeasurement({\n diagnostics,\n options,\n state\n });\n return Object.freeze({ ...run, terminalMeasurement });\n }\n }\n }\n}\n\nfunction observeAdmissionCoreEffect<TResult>(\n state: SchedulerState<TResult>,\n effect: AdmissionCoreEffect\n): void {\n if (state.onAdmissionCoreEffect === undefined) return;\n state.onAdmissionCoreEffect(Object.freeze({ effect, state: state.admissionCore }));\n}\n\nfunction triggerForInitialReconciliation(): SchedulerTrigger {\n return Object.freeze({ kind: \"execution-started\" });\n}\n\nfunction decisionBoundaryMeasurement(\n diagnostics: SchedulerPerformanceDiagnostics | undefined\n): AdmissionPolicyContext[\"measurement\"] {\n if (diagnostics === undefined) {\n throw new Error(\"custom policy measurement collector is unavailable\");\n }\n return diagnostics.policyMeasurement();\n}\n"]}