@zxyycom/vibe-check 0.0.1 → 0.0.2

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 (950) hide show
  1. package/README.md +47 -74
  2. package/dist/esm/cache/cache-json-by-key.mjs +189 -0
  3. package/dist/esm/cache/cache-json-by-key.mjs.map +1 -0
  4. package/dist/esm/check/check.mjs.map +1 -1
  5. package/dist/esm/check/finding-presentation.mjs +40 -0
  6. package/dist/esm/check/finding-presentation.mjs.map +1 -0
  7. package/dist/esm/check/inherited-collection.mjs +1 -1
  8. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  9. package/dist/esm/check-settlement/fact-validation.mjs +17 -23
  10. package/dist/esm/check-settlement/fact-validation.mjs.map +1 -1
  11. package/dist/esm/check-settlement/outcome-normalization.mjs +9 -19
  12. package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -1
  13. package/dist/esm/check-settlement/reason-shape.mjs +12 -0
  14. package/dist/esm/check-settlement/reason-shape.mjs.map +1 -0
  15. package/dist/esm/check-settlement/record-store.mjs +14 -17
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/check-settlement/session.mjs +8 -2
  18. package/dist/esm/check-settlement/session.mjs.map +1 -1
  19. package/dist/esm/data-boundary/closed-values.mjs +16 -0
  20. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  21. package/dist/esm/data-boundary/value-shapes.mjs +9 -0
  22. package/dist/esm/data-boundary/value-shapes.mjs.map +1 -1
  23. package/dist/esm/index.mjs +9 -2
  24. package/dist/esm/index.mjs.map +1 -1
  25. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs +56 -0
  26. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  27. package/dist/esm/learned-critical-path/duration-model/prediction.mjs +122 -0
  28. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  29. package/dist/esm/learned-critical-path/duration-model/preparation.mjs +41 -0
  30. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  31. package/dist/esm/learned-critical-path/duration-model/recording.mjs +109 -0
  32. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +1 -0
  33. package/dist/esm/learned-critical-path/duration-model/storage.mjs +187 -0
  34. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +1 -0
  35. package/dist/esm/learned-critical-path/selection-layers.mjs +28 -0
  36. package/dist/esm/learned-critical-path/selection-layers.mjs.map +1 -0
  37. package/dist/esm/learned-critical-path/static-decision.mjs +55 -0
  38. package/dist/esm/learned-critical-path/static-decision.mjs.map +1 -0
  39. package/dist/esm/learned-critical-path/strategy.mjs +179 -0
  40. package/dist/esm/learned-critical-path/strategy.mjs.map +1 -0
  41. package/dist/esm/machine-output/v4/atomic-publication.mjs +1 -15
  42. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  43. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs +40 -0
  44. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -0
  45. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs +48 -0
  46. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -0
  47. package/dist/esm/package-checks/code-quality-findings/policy.mjs +20 -0
  48. package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +15 -7
  50. package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +1 -1
  54. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  55. package/dist/esm/package-checks/duplicate-detection/execution.mjs +44 -18
  56. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  57. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +59 -0
  58. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -0
  59. package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs +55 -0
  60. package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs.map +1 -0
  61. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  62. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  63. package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs +1 -1
  64. package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -1
  65. package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +15 -5
  66. package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -1
  67. package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +5 -4
  68. package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -1
  69. package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +22 -47
  70. package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -1
  71. package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +20 -25
  72. package/dist/esm/package-checks/duplicate-detection/options-validation.mjs.map +1 -1
  73. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  74. package/dist/esm/package-checks/duplicate-detection/records.mjs +27 -6
  75. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  76. package/dist/esm/package-checks/file-metrics/execution.mjs +10 -17
  77. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  78. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +22 -0
  79. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -0
  80. package/dist/esm/package-checks/file-metrics/options-resolution.mjs +11 -43
  81. package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -1
  82. package/dist/esm/package-checks/file-metrics/options-validation.mjs +15 -25
  83. package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -1
  84. package/dist/esm/package-checks/file-metrics/records.mjs +2 -9
  85. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  86. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  87. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  88. package/dist/esm/package-checks/file-metrics/scc/parser.mjs +4 -4
  89. package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -1
  90. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +2 -2
  91. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  92. package/dist/esm/package-checks/function-metrics/analysis.mjs +56 -15
  93. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  94. package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs +550 -0
  95. package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs.map +1 -0
  96. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +332 -0
  97. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -0
  98. package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs +7 -0
  99. package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs.map +1 -0
  100. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +24 -0
  101. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -0
  102. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs +113 -0
  103. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs.map +1 -0
  104. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs +180 -0
  105. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -0
  106. package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs +121 -0
  107. package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs.map +1 -0
  108. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +217 -0
  109. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -0
  110. package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs +96 -0
  111. package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs.map +1 -0
  112. package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs +76 -0
  113. package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs.map +1 -0
  114. package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs +88 -0
  115. package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs.map +1 -0
  116. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +466 -0
  117. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -0
  118. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +289 -0
  119. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -0
  120. package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs +38 -0
  121. package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs.map +1 -0
  122. package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs +44 -0
  123. package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs.map +1 -0
  124. package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs +113 -0
  125. package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs.map +1 -0
  126. package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs +247 -0
  127. package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs.map +1 -0
  128. package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs +16 -0
  129. package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs.map +1 -0
  130. package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs +103 -0
  131. package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs.map +1 -0
  132. package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs +55 -0
  133. package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs.map +1 -0
  134. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +100 -0
  135. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -0
  136. package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs +367 -0
  137. package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs.map +1 -0
  138. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +260 -0
  139. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -0
  140. package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs +53 -0
  141. package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs.map +1 -0
  142. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +306 -0
  143. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -0
  144. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +402 -0
  145. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -0
  146. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +214 -0
  147. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -0
  148. package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs +75 -0
  149. package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs.map +1 -0
  150. package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs +32 -0
  151. package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs.map +1 -0
  152. package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs +47 -0
  153. package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs.map +1 -0
  154. package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs +22 -0
  155. package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs.map +1 -0
  156. package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs +142 -0
  157. package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs.map +1 -0
  158. package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs +94 -0
  159. package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs.map +1 -0
  160. package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs +149 -0
  161. package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs.map +1 -0
  162. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +79 -0
  163. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -0
  164. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +606 -0
  165. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -0
  166. package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs +31 -0
  167. package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs.map +1 -0
  168. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +23 -0
  169. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -0
  170. package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs +492 -0
  171. package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs.map +1 -0
  172. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +542 -0
  173. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -0
  174. package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs +141 -0
  175. package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs.map +1 -0
  176. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +62 -0
  177. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -0
  178. package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs +154 -0
  179. package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs.map +1 -0
  180. package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs +36 -0
  181. package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs.map +1 -0
  182. package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs +56 -0
  183. package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs.map +1 -0
  184. package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs +2 -0
  185. package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs.map +1 -0
  186. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +108 -0
  187. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -0
  188. package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs +24 -0
  189. package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs.map +1 -0
  190. package/dist/esm/package-checks/function-metrics/constructor.mjs +2 -2
  191. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  192. package/dist/esm/package-checks/function-metrics/execution.mjs +51 -33
  193. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  194. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +75 -0
  195. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -0
  196. package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs +28 -0
  197. package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs.map +1 -0
  198. package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -1
  199. package/dist/esm/package-checks/function-metrics/measurement.mjs +161 -26
  200. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  201. package/dist/esm/package-checks/function-metrics/options-resolution.mjs +30 -63
  202. package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -1
  203. package/dist/esm/package-checks/function-metrics/options-validation.mjs +27 -32
  204. package/dist/esm/package-checks/function-metrics/options-validation.mjs.map +1 -1
  205. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  206. package/dist/esm/package-checks/function-metrics/records.mjs +31 -1
  207. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  208. package/dist/esm/package-checks/function-metrics/target-files.mjs +6 -67
  209. package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -1
  210. package/dist/esm/package-checks/{file-metrics/scc → host-environment}/csv.mjs +1 -0
  211. package/dist/esm/package-checks/host-environment/csv.mjs.map +1 -0
  212. package/dist/esm/package-checks/host-environment/git.mjs +1 -1
  213. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  214. package/dist/esm/package-checks/host-environment/process.mjs +5 -0
  215. package/dist/esm/package-checks/host-environment/process.mjs.map +1 -0
  216. package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -1
  217. package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +15 -17
  218. package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -1
  219. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  220. package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -1
  221. package/dist/esm/package-checks/json-validation/options-validation.mjs +4 -10
  222. package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -1
  223. package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -1
  224. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +9 -3
  225. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  226. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +27 -24
  227. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  228. package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +82 -53
  229. package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -1
  230. package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -1
  231. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +36 -0
  232. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -0
  233. package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -1
  234. package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +2 -2
  235. package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -1
  236. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +26 -4
  237. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  238. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +24 -11
  239. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  240. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  241. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +185 -0
  242. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -0
  243. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs +131 -0
  244. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs.map +1 -0
  245. package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +58 -57
  246. package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -1
  247. package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs +54 -0
  248. package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs.map +1 -0
  249. package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs +16 -0
  250. package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs.map +1 -0
  251. package/dist/esm/package-checks/project-files/collection.mjs +1 -1
  252. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  253. package/dist/esm/package-checks/project-files/configuration.mjs +2 -10
  254. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  255. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +1 -1
  256. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  257. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +1 -1
  258. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  259. package/dist/esm/package-checks/project-files/public-collection.mjs +56 -0
  260. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -0
  261. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +1 -1
  262. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  263. package/dist/esm/package-checks/secret-detection/classification.mjs +15 -0
  264. package/dist/esm/package-checks/secret-detection/classification.mjs.map +1 -0
  265. package/dist/esm/package-checks/secret-detection/default-check.mjs +39 -0
  266. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -0
  267. package/dist/esm/package-checks/secret-detection/execution.mjs +172 -0
  268. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -0
  269. package/dist/esm/package-checks/secret-detection/final-data.mjs +33 -0
  270. package/dist/esm/package-checks/secret-detection/final-data.mjs.map +1 -0
  271. package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs +30 -0
  272. package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs.map +1 -0
  273. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +153 -0
  274. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -0
  275. package/dist/esm/package-checks/secret-detection/options-resolution.mjs +40 -0
  276. package/dist/esm/package-checks/secret-detection/options-resolution.mjs.map +1 -0
  277. package/dist/esm/package-checks/secret-detection/options-validation.mjs +22 -0
  278. package/dist/esm/package-checks/secret-detection/options-validation.mjs.map +1 -0
  279. package/dist/esm/package-checks/secret-detection/options.mjs +2 -0
  280. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -0
  281. package/dist/esm/package-checks/secret-detection/records.mjs +31 -0
  282. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -0
  283. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +85 -0
  284. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -0
  285. package/dist/esm/project-definition/check-tree/authoring.mjs +12 -172
  286. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  287. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +171 -0
  288. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -0
  289. package/dist/esm/project-definition/check-tree/collection-authoring.mjs +16 -0
  290. package/dist/esm/project-definition/check-tree/collection-authoring.mjs.map +1 -0
  291. package/dist/esm/project-definition/check-tree/materialization.mjs +9 -1
  292. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  293. package/dist/esm/project-definition/check-tree/resolution.mjs +45 -13
  294. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  295. package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs +73 -0
  296. package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs.map +1 -0
  297. package/dist/esm/project-definition/declarative-snapshot.mjs +73 -0
  298. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -0
  299. package/dist/esm/project-definition/output-defaults.mjs +18 -1
  300. package/dist/esm/project-definition/output-defaults.mjs.map +1 -1
  301. package/dist/esm/project-definition/output-validation.mjs +15 -15
  302. package/dist/esm/project-definition/output-validation.mjs.map +1 -1
  303. package/dist/esm/project-definition/progress-rendering-output.mjs +52 -0
  304. package/dist/esm/project-definition/progress-rendering-output.mjs.map +1 -0
  305. package/dist/esm/project-definition/project-definition-validation.mjs +100 -16
  306. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  307. package/dist/esm/project-definition/project-definition.mjs +52 -47
  308. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  309. package/dist/esm/project-definition/resource-unit-mapping.mjs +21 -0
  310. package/dist/esm/project-definition/resource-unit-mapping.mjs.map +1 -0
  311. package/dist/esm/project-definition/scheduler-policy.mjs +2 -0
  312. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -0
  313. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +54 -0
  314. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -0
  315. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs +2 -0
  316. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -0
  317. package/dist/esm/project-run/admission-strategy-provider/provider.mjs +23 -0
  318. package/dist/esm/project-run/admission-strategy-provider/provider.mjs.map +1 -0
  319. package/dist/esm/project-run/aggregation.mjs +7 -5
  320. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  321. package/dist/esm/project-run/check-execution/callback.mjs +35 -8
  322. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  323. package/dist/esm/project-run/check-execution/console-capture.mjs +220 -0
  324. package/dist/esm/project-run/check-execution/console-capture.mjs.map +1 -0
  325. package/dist/esm/project-run/check-execution/dependencies.mjs +21 -3
  326. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  327. package/dist/esm/project-run/check-execution/execution-finalization.mjs +54 -13
  328. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  329. package/dist/esm/project-run/check-execution/execution-settlement.mjs +13 -9
  330. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  331. package/dist/esm/project-run/check-execution/flag-controls.mjs +87 -0
  332. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -0
  333. package/dist/esm/project-run/check-execution/lifecycle.mjs +2 -0
  334. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -0
  335. package/dist/esm/project-run/check-execution/messages.mjs +5 -0
  336. package/dist/esm/project-run/check-execution/messages.mjs.map +1 -1
  337. package/dist/esm/project-run/check-execution/plan.mjs +9 -5
  338. package/dist/esm/project-run/check-execution/plan.mjs.map +1 -1
  339. package/dist/esm/project-run/check-execution/preflight.mjs +18 -32
  340. package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -1
  341. package/dist/esm/project-run/check-execution/resolved-checks.mjs +100 -58
  342. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  343. package/dist/esm/project-run/check-execution/resolved-execution-result.mjs +2 -0
  344. package/dist/esm/project-run/check-execution/resolved-execution-result.mjs.map +1 -0
  345. package/dist/esm/project-run/{completion.mjs → completion/completion.mjs} +16 -38
  346. package/dist/esm/project-run/completion/completion.mjs.map +1 -0
  347. package/dist/esm/project-run/{machine-publication.mjs → completion/machine-publication.mjs} +1 -1
  348. package/dist/esm/project-run/completion/machine-publication.mjs.map +1 -0
  349. package/dist/esm/project-run/completion/result-resolver.mjs +36 -0
  350. package/dist/esm/project-run/completion/result-resolver.mjs.map +1 -0
  351. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  352. package/dist/esm/project-run/controls/outputs-override-validation.mjs +67 -47
  353. package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -1
  354. package/dist/esm/project-run/controls/validation-result.mjs.map +1 -1
  355. package/dist/esm/project-run/controls/validation.mjs +75 -11
  356. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  357. package/dist/esm/project-run/diagnostic-logging/logger.mjs +100 -161
  358. package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -1
  359. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +159 -0
  360. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -0
  361. package/dist/esm/project-run/invocation/candidate.mjs +61 -0
  362. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -0
  363. package/dist/esm/project-run/invocation/creation.mjs +79 -0
  364. package/dist/esm/project-run/invocation/creation.mjs.map +1 -0
  365. package/dist/esm/project-run/invocation/paths.mjs +77 -0
  366. package/dist/esm/project-run/invocation/paths.mjs.map +1 -0
  367. package/dist/esm/project-run/invocation/progress.mjs +30 -0
  368. package/dist/esm/project-run/invocation/progress.mjs.map +1 -0
  369. package/dist/esm/project-run/{invocation.mjs → invocation/run.mjs} +78 -92
  370. package/dist/esm/project-run/invocation/run.mjs.map +1 -0
  371. package/dist/esm/project-run/invocation/scheduler.mjs +57 -0
  372. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -0
  373. package/dist/esm/project-run/{output-configuration.mjs → outputs/configuration.mjs} +3 -2
  374. package/dist/esm/project-run/outputs/configuration.mjs.map +1 -0
  375. package/dist/esm/project-run/outputs/status.mjs +105 -0
  376. package/dist/esm/project-run/outputs/status.mjs.map +1 -0
  377. package/dist/esm/project-run/progress-rendering/presentation.mjs +112 -18
  378. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  379. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +108 -19
  380. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  381. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +30 -4
  382. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  383. package/dist/esm/project-run/progress-rendering/renderer.mjs +5 -2
  384. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  385. package/dist/esm/project-run/project-context.mjs +1 -1
  386. package/dist/esm/project-run/project-context.mjs.map +1 -1
  387. package/dist/esm/project-run/result.mjs +2 -0
  388. package/dist/esm/project-run/result.mjs.map +1 -1
  389. package/dist/esm/project-run/run.mjs +1 -1
  390. package/dist/esm/project-run/run.mjs.map +1 -1
  391. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +166 -0
  392. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -0
  393. package/dist/esm/project-run/task-scheduler/admission-core/core.mjs +163 -0
  394. package/dist/esm/project-run/task-scheduler/admission-core/core.mjs.map +1 -0
  395. package/dist/esm/project-run/task-scheduler/admission-core/input.mjs +119 -0
  396. package/dist/esm/project-run/task-scheduler/admission-core/input.mjs.map +1 -0
  397. package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs +124 -0
  398. package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs.map +1 -0
  399. package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs +99 -0
  400. package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs.map +1 -0
  401. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +198 -0
  402. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -0
  403. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +151 -0
  404. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -0
  405. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +121 -0
  406. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -0
  407. package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs +65 -0
  408. package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs.map +1 -0
  409. package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs +25 -0
  410. package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs.map +1 -0
  411. package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs +55 -0
  412. package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs.map +1 -0
  413. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs +46 -0
  414. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +1 -0
  415. package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs +110 -0
  416. package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs.map +1 -0
  417. package/dist/esm/project-run/task-scheduler/execution-state.mjs +34 -5
  418. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  419. package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs +46 -0
  420. package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs.map +1 -0
  421. package/dist/esm/project-run/task-scheduler/graph-validation.mjs +54 -26
  422. package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -1
  423. package/dist/esm/project-run/task-scheduler/graph.mjs +79 -3
  424. package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -1
  425. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +207 -0
  426. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -0
  427. package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs +116 -0
  428. package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs.map +1 -0
  429. package/dist/esm/project-run/task-scheduler/measurement/policy.mjs +67 -0
  430. package/dist/esm/project-run/task-scheduler/measurement/policy.mjs.map +1 -0
  431. package/dist/esm/project-run/task-scheduler/measurement/summary.mjs +123 -0
  432. package/dist/esm/project-run/task-scheduler/measurement/summary.mjs.map +1 -0
  433. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +158 -0
  434. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -0
  435. package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +90 -62
  436. package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -1
  437. package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +20 -6
  438. package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -1
  439. package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +5 -105
  440. package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -1
  441. package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +0 -9
  442. package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -1
  443. package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +48 -28
  444. package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -1
  445. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +89 -0
  446. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -0
  447. package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs +94 -0
  448. package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs.map +1 -0
  449. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +66 -0
  450. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -0
  451. package/dist/esm/project-run/task-scheduler/scheduler.mjs +171 -114
  452. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  453. package/docs/api-mechanics.md +64 -137
  454. package/docs/changelog.md +157 -0
  455. package/docs/checks/duplicate-detection.md +111 -59
  456. package/docs/checks/file-metrics.md +46 -43
  457. package/docs/checks/function-metrics.md +100 -163
  458. package/docs/checks/json-schema-validation.md +43 -36
  459. package/docs/checks/json-validation.md +38 -25
  460. package/docs/checks/maintenance-reminders.md +41 -29
  461. package/docs/checks/markdown-link-validation.md +82 -54
  462. package/docs/checks/secret-detection.md +129 -0
  463. package/docs/examples/artifacts/mixed-outcomes/definition.ts +5 -5
  464. package/docs/guides/cache-results.md +63 -0
  465. package/docs/guides/callbacks.md +34 -0
  466. package/docs/guides/check-dependencies.md +121 -0
  467. package/docs/guides/collecting-project-files.md +59 -0
  468. package/docs/guides/extending-check-lifecycle.md +112 -0
  469. package/docs/guides/finding-waivers.md +45 -0
  470. package/docs/guides/learned-scheduling.md +83 -0
  471. package/docs/guides/presenting-findings.md +54 -0
  472. package/docs/guides/run-outputs.md +145 -0
  473. package/docs/guides/scheduling.md +208 -0
  474. package/docs/guides/simulating-admission.md +55 -0
  475. package/docs/output.md +11 -20
  476. package/licenses/Lizard-1.24.0-MIT.txt +30 -0
  477. package/{third-party-licenses/momoa-3.3.12-LICENSE → licenses/Lizard-1.24.0-lizard.py-Apache-2.0.txt} +1 -0
  478. package/licenses/Pygments-2.18.0-BSD-2-Clause.txt +25 -0
  479. package/licenses/analyzer-translations-NOTICE.md +24 -0
  480. package/licenses/lizard-1.24.0-provenance.json +957 -0
  481. package/package.json +18 -6
  482. package/src/cache/cache-json-by-key.ts +304 -0
  483. package/src/check/check.ts +67 -17
  484. package/src/check/finding-presentation.ts +67 -0
  485. package/src/check/inherited-collection.ts +1 -1
  486. package/src/check-settlement/fact-validation.ts +29 -39
  487. package/src/check-settlement/outcome-normalization.ts +17 -35
  488. package/src/check-settlement/reason-shape.ts +20 -0
  489. package/src/check-settlement/record-store.ts +18 -15
  490. package/src/check-settlement/session.ts +12 -3
  491. package/src/data-boundary/closed-values.ts +29 -0
  492. package/src/data-boundary/value-shapes.ts +12 -0
  493. package/src/index.ts +70 -2
  494. package/src/learned-critical-path/duration-model/bounded-history.ts +108 -0
  495. package/src/learned-critical-path/duration-model/prediction.ts +181 -0
  496. package/src/learned-critical-path/duration-model/preparation.ts +77 -0
  497. package/src/learned-critical-path/duration-model/recording.ts +208 -0
  498. package/src/learned-critical-path/duration-model/storage.ts +252 -0
  499. package/src/learned-critical-path/selection-layers.ts +72 -0
  500. package/src/learned-critical-path/static-decision.ts +105 -0
  501. package/src/learned-critical-path/strategy.ts +299 -0
  502. package/src/machine-output/v4/atomic-publication.ts +1 -16
  503. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +46 -0
  504. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +95 -0
  505. package/src/package-checks/code-quality-findings/policy.ts +23 -0
  506. package/src/package-checks/duplicate-detection/area-policy.ts +24 -13
  507. package/src/package-checks/duplicate-detection/cache/identity.ts +1 -1
  508. package/src/package-checks/duplicate-detection/default-check.ts +1 -1
  509. package/src/package-checks/duplicate-detection/execution.ts +82 -22
  510. package/src/package-checks/duplicate-detection/finding-messages.ts +75 -0
  511. package/src/package-checks/duplicate-detection/finding-waiver-identity.ts +68 -0
  512. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  513. package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +1 -1
  514. package/src/package-checks/duplicate-detection/jscpd/json-report.ts +24 -5
  515. package/src/package-checks/duplicate-detection/jscpd/scanner.ts +6 -7
  516. package/src/package-checks/duplicate-detection/options-resolution.ts +32 -57
  517. package/src/package-checks/duplicate-detection/options-validation.ts +23 -31
  518. package/src/package-checks/duplicate-detection/options.ts +21 -1
  519. package/src/package-checks/duplicate-detection/records.ts +65 -12
  520. package/src/package-checks/file-metrics/execution.ts +16 -17
  521. package/src/package-checks/file-metrics/finding-messages.ts +29 -0
  522. package/src/package-checks/file-metrics/options-resolution.ts +19 -52
  523. package/src/package-checks/file-metrics/options-validation.ts +23 -32
  524. package/src/package-checks/file-metrics/records.ts +11 -23
  525. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  526. package/src/package-checks/file-metrics/scc/parser.ts +4 -4
  527. package/src/package-checks/file-metrics/scc/scanner.ts +2 -2
  528. package/src/package-checks/function-metrics/analysis.ts +76 -21
  529. package/src/package-checks/function-metrics/analyzer/analysis-context.ts +749 -0
  530. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +421 -0
  531. package/src/package-checks/function-metrics/analyzer/contracts.ts +54 -0
  532. package/src/package-checks/function-metrics/analyzer/extension-output.ts +261 -0
  533. package/src/package-checks/function-metrics/analyzer/extensions/extension-base.ts +33 -0
  534. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +27 -0
  535. package/src/package-checks/function-metrics/analyzer/extensions/lizardnd.ts +144 -0
  536. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +345 -0
  537. package/src/package-checks/function-metrics/analyzer/extensions/registry.ts +157 -0
  538. package/src/package-checks/function-metrics/analyzer/pipeline.ts +311 -0
  539. package/src/package-checks/function-metrics/analyzer/port-facade.ts +142 -0
  540. package/src/package-checks/function-metrics/analyzer/reader-registry.ts +84 -0
  541. package/src/package-checks/function-metrics/analyzer/readers/csharp.ts +110 -0
  542. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +501 -0
  543. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +294 -0
  544. package/src/package-checks/function-metrics/analyzer/readers/gdscript.ts +42 -0
  545. package/src/package-checks/function-metrics/analyzer/readers/go.ts +53 -0
  546. package/src/package-checks/function-metrics/analyzer/readers/java-body-states.ts +141 -0
  547. package/src/package-checks/function-metrics/analyzer/readers/java.ts +270 -0
  548. package/src/package-checks/function-metrics/analyzer/readers/javascript.ts +19 -0
  549. package/src/package-checks/function-metrics/analyzer/readers/kotlin.ts +120 -0
  550. package/src/package-checks/function-metrics/analyzer/readers/lua.ts +68 -0
  551. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +107 -0
  552. package/src/package-checks/function-metrics/analyzer/readers/perl.ts +340 -0
  553. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +246 -0
  554. package/src/package-checks/function-metrics/analyzer/readers/php.ts +63 -0
  555. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +306 -0
  556. package/src/package-checks/function-metrics/analyzer/readers/python.ts +431 -0
  557. package/src/package-checks/function-metrics/analyzer/readers/r.ts +234 -0
  558. package/src/package-checks/function-metrics/analyzer/readers/ruby.ts +88 -0
  559. package/src/package-checks/function-metrics/analyzer/readers/rust.ts +47 -0
  560. package/src/package-checks/function-metrics/analyzer/readers/scala.ts +60 -0
  561. package/src/package-checks/function-metrics/analyzer/readers/solidity.ts +32 -0
  562. package/src/package-checks/function-metrics/analyzer/readers/st.ts +161 -0
  563. package/src/package-checks/function-metrics/analyzer/readers/swift.ts +116 -0
  564. package/src/package-checks/function-metrics/analyzer/readers/tsx.ts +165 -0
  565. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +90 -0
  566. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +593 -0
  567. package/src/package-checks/function-metrics/analyzer/readers/vue.ts +43 -0
  568. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +35 -0
  569. package/src/package-checks/function-metrics/analyzer/shared/clike.ts +541 -0
  570. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +682 -0
  571. package/src/package-checks/function-metrics/analyzer/shared/golike.ts +143 -0
  572. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +75 -0
  573. package/src/package-checks/function-metrics/analyzer/shared/rubylike.ts +161 -0
  574. package/src/package-checks/function-metrics/analyzer/shared/script-language.ts +50 -0
  575. package/src/package-checks/function-metrics/analyzer-adapter.ts +84 -0
  576. package/src/package-checks/function-metrics/analyzer-worker-contract.ts +10 -0
  577. package/src/package-checks/function-metrics/analyzer-worker-port.ts +150 -0
  578. package/src/package-checks/function-metrics/analyzer-worker.ts +31 -0
  579. package/src/package-checks/function-metrics/constructor.ts +2 -2
  580. package/src/package-checks/function-metrics/execution.ts +94 -39
  581. package/src/package-checks/function-metrics/finding-messages.ts +95 -0
  582. package/src/package-checks/function-metrics/finding-waiver-identity.ts +36 -0
  583. package/src/package-checks/function-metrics/measurement-model.ts +15 -1
  584. package/src/package-checks/function-metrics/measurement.ts +221 -36
  585. package/src/package-checks/function-metrics/options-resolution.ts +39 -75
  586. package/src/package-checks/function-metrics/options-validation.ts +30 -39
  587. package/src/package-checks/function-metrics/options.ts +27 -11
  588. package/src/package-checks/function-metrics/records.ts +73 -7
  589. package/src/package-checks/function-metrics/target-files.ts +10 -70
  590. package/src/package-checks/{file-metrics/scc → host-environment}/csv.ts +1 -2
  591. package/src/package-checks/host-environment/git.ts +2 -2
  592. package/src/package-checks/host-environment/process.ts +10 -0
  593. package/src/package-checks/json-schema-validation/final-data.ts +8 -0
  594. package/src/package-checks/json-schema-validation/options-validation.ts +16 -23
  595. package/src/package-checks/json-schema-validation/options.ts +23 -0
  596. package/src/package-checks/json-validation/final-data.ts +5 -0
  597. package/src/package-checks/json-validation/options-validation.ts +4 -18
  598. package/src/package-checks/maintenance-reminders/final-data.ts +18 -0
  599. package/src/package-checks/markdown-link-validation/default-check.ts +9 -3
  600. package/src/package-checks/markdown-link-validation/execution.ts +51 -57
  601. package/src/package-checks/markdown-link-validation/filesystem-probes.ts +108 -51
  602. package/src/package-checks/markdown-link-validation/final-data.ts +5 -0
  603. package/src/package-checks/markdown-link-validation/finding-messages.ts +48 -0
  604. package/src/package-checks/markdown-link-validation/local-resolution.ts +17 -9
  605. package/src/package-checks/markdown-link-validation/local-resolver.ts +5 -2
  606. package/src/package-checks/markdown-link-validation/options-resolution.ts +31 -3
  607. package/src/package-checks/markdown-link-validation/options-validation.ts +27 -19
  608. package/src/package-checks/markdown-link-validation/options.ts +15 -0
  609. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +246 -0
  610. package/src/package-checks/markdown-link-validation/parse-facts-cache.ts +154 -0
  611. package/src/package-checks/markdown-link-validation/resolver-engine.ts +75 -65
  612. package/src/package-checks/markdown-link-validation/source-reader.ts +86 -0
  613. package/src/package-checks/markdown-link-validation/unavailable-reasons.ts +42 -0
  614. package/src/package-checks/project-files/collection.ts +1 -1
  615. package/src/package-checks/project-files/configuration.ts +3 -14
  616. package/src/package-checks/project-files/gitlink-revision.ts +1 -1
  617. package/src/package-checks/project-files/gitlink-worktree.ts +1 -1
  618. package/src/package-checks/project-files/public-collection.ts +92 -0
  619. package/src/package-checks/project-files/revision-worktree-files.ts +1 -1
  620. package/src/package-checks/secret-detection/classification.ts +30 -0
  621. package/src/package-checks/secret-detection/default-check.ts +50 -0
  622. package/src/package-checks/secret-detection/execution.ts +247 -0
  623. package/src/package-checks/secret-detection/final-data.ts +57 -0
  624. package/src/package-checks/secret-detection/finding-waiver-identity.ts +37 -0
  625. package/src/package-checks/secret-detection/input-preparation.ts +233 -0
  626. package/src/package-checks/secret-detection/options-resolution.ts +65 -0
  627. package/src/package-checks/secret-detection/options-validation.ts +27 -0
  628. package/src/package-checks/secret-detection/options.ts +36 -0
  629. package/src/package-checks/secret-detection/records.ts +77 -0
  630. package/src/package-checks/secret-detection/secretlint/adapter.ts +123 -0
  631. package/src/project-definition/check-tree/authoring.ts +29 -230
  632. package/src/project-definition/check-tree/check-fields-authoring.ts +227 -0
  633. package/src/project-definition/check-tree/collection-authoring.ts +13 -0
  634. package/src/project-definition/check-tree/materialization.ts +9 -1
  635. package/src/project-definition/check-tree/resolution.ts +80 -22
  636. package/src/project-definition/check-tree/scheduling-authoring.ts +114 -0
  637. package/src/project-definition/declarative-snapshot.ts +87 -0
  638. package/src/project-definition/output-defaults.ts +32 -1
  639. package/src/project-definition/output-validation.ts +15 -15
  640. package/src/project-definition/progress-rendering-output.ts +121 -0
  641. package/src/project-definition/project-definition-validation.ts +117 -18
  642. package/src/project-definition/project-definition.ts +198 -61
  643. package/src/project-definition/resource-unit-mapping.ts +25 -0
  644. package/src/project-definition/scheduler-policy.ts +553 -0
  645. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +80 -0
  646. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +27 -0
  647. package/src/project-run/admission-strategy-provider/provider.ts +45 -0
  648. package/src/project-run/aggregation.ts +10 -5
  649. package/src/project-run/check-execution/callback.ts +50 -8
  650. package/src/project-run/check-execution/console-capture.ts +262 -0
  651. package/src/project-run/check-execution/dependencies.ts +43 -6
  652. package/src/project-run/check-execution/execution-finalization.ts +99 -25
  653. package/src/project-run/check-execution/execution-settlement.ts +19 -11
  654. package/src/project-run/check-execution/flag-controls.ts +132 -0
  655. package/src/project-run/check-execution/lifecycle.ts +21 -0
  656. package/src/project-run/check-execution/messages.ts +8 -0
  657. package/src/project-run/check-execution/plan.ts +12 -8
  658. package/src/project-run/check-execution/preflight.ts +23 -43
  659. package/src/project-run/check-execution/resolved-checks.ts +165 -126
  660. package/src/project-run/check-execution/resolved-execution-result.ts +22 -0
  661. package/src/project-run/{completion.ts → completion/completion.ts} +17 -57
  662. package/src/project-run/{machine-publication.ts → completion/machine-publication.ts} +4 -4
  663. package/src/project-run/completion/result-resolver.ts +60 -0
  664. package/src/project-run/controls/contract.ts +25 -2
  665. package/src/project-run/controls/outputs-override-validation.ts +83 -60
  666. package/src/project-run/controls/validation-result.ts +17 -6
  667. package/src/project-run/controls/validation.ts +107 -12
  668. package/src/project-run/diagnostic-logging/logger.ts +132 -207
  669. package/src/project-run/diagnostic-logging/observation-rendering.ts +203 -0
  670. package/src/project-run/invocation/candidate.ts +86 -0
  671. package/src/project-run/invocation/creation.ts +116 -0
  672. package/src/project-run/invocation/paths.ts +154 -0
  673. package/src/project-run/invocation/progress.ts +38 -0
  674. package/src/project-run/{invocation.ts → invocation/run.ts} +125 -120
  675. package/src/project-run/invocation/scheduler.ts +75 -0
  676. package/src/project-run/{output-configuration.ts → outputs/configuration.ts} +6 -5
  677. package/src/project-run/outputs/status.ts +161 -0
  678. package/src/project-run/progress-rendering/presentation.ts +118 -26
  679. package/src/project-run/progress-rendering/renderer-formatting.ts +166 -19
  680. package/src/project-run/progress-rendering/renderer-lifecycle.ts +38 -3
  681. package/src/project-run/progress-rendering/renderer.ts +13 -2
  682. package/src/project-run/project-context.ts +3 -2
  683. package/src/project-run/result.ts +49 -3
  684. package/src/project-run/run.ts +7 -6
  685. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +316 -0
  686. package/src/project-run/task-scheduler/admission-core/core.ts +278 -0
  687. package/src/project-run/task-scheduler/admission-core/input.ts +138 -0
  688. package/src/project-run/task-scheduler/admission-core/projection.ts +164 -0
  689. package/src/project-run/task-scheduler/admission-core/selection-index.ts +165 -0
  690. package/src/project-run/task-scheduler/admission-core/selection-query.ts +295 -0
  691. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +252 -0
  692. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +236 -0
  693. package/src/project-run/task-scheduler/admission-core/selection.ts +140 -0
  694. package/src/project-run/task-scheduler/admission-core/trace.ts +177 -0
  695. package/src/project-run/task-scheduler/admission-scope-layers.ts +44 -0
  696. package/src/project-run/task-scheduler/admission-selection-policy.ts +116 -0
  697. package/src/project-run/task-scheduler/critical-path-ranking.ts +76 -0
  698. package/src/project-run/task-scheduler/custom-admission-policy.ts +128 -0
  699. package/src/project-run/task-scheduler/execution-state.ts +97 -6
  700. package/src/project-run/task-scheduler/forced-block-effect-replay.ts +68 -0
  701. package/src/project-run/task-scheduler/graph-validation.ts +77 -31
  702. package/src/project-run/task-scheduler/graph.ts +111 -3
  703. package/src/project-run/task-scheduler/measurement/diagnostics.ts +261 -0
  704. package/src/project-run/task-scheduler/measurement/integrals.ts +177 -0
  705. package/src/project-run/task-scheduler/measurement/policy.ts +105 -0
  706. package/src/project-run/task-scheduler/measurement/summary.ts +175 -0
  707. package/src/project-run/task-scheduler/measurement/timing.ts +190 -0
  708. package/src/project-run/task-scheduler/scheduler-admission-decision.ts +143 -134
  709. package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +34 -9
  710. package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +28 -170
  711. package/src/project-run/task-scheduler/scheduler-decision-model.ts +36 -40
  712. package/src/project-run/task-scheduler/scheduler-decision.ts +68 -36
  713. package/src/project-run/task-scheduler/scheduler-observation.ts +124 -0
  714. package/src/project-run/task-scheduler/scheduler-task-lifecycle.ts +150 -0
  715. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +95 -0
  716. package/src/project-run/task-scheduler/scheduler.ts +216 -171
  717. package/types/cache/cache-json-by-key.d.ts +53 -0
  718. package/types/check/check.d.ts +62 -17
  719. package/types/check/finding-presentation.d.ts +25 -0
  720. package/types/check/inherited-collection.d.ts +1 -1
  721. package/types/check-settlement/reason-shape.d.ts +5 -0
  722. package/types/check-settlement/record-store.d.ts +2 -2
  723. package/types/check-settlement/session.d.ts +3 -1
  724. package/types/data-boundary/closed-values.d.ts +8 -0
  725. package/types/data-boundary/value-shapes.d.ts +3 -0
  726. package/types/index.d.ts +22 -7
  727. package/types/learned-critical-path/duration-model/bounded-history.d.ts +34 -0
  728. package/types/learned-critical-path/duration-model/prediction.d.ts +32 -0
  729. package/types/learned-critical-path/duration-model/preparation.d.ts +28 -0
  730. package/types/learned-critical-path/duration-model/recording.d.ts +28 -0
  731. package/types/learned-critical-path/duration-model/storage.d.ts +12 -0
  732. package/types/learned-critical-path/selection-layers.d.ts +14 -0
  733. package/types/learned-critical-path/static-decision.d.ts +3 -0
  734. package/types/learned-critical-path/strategy.d.ts +35 -0
  735. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +7 -0
  736. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +34 -0
  737. package/types/package-checks/code-quality-findings/policy.d.ts +4 -0
  738. package/types/package-checks/duplicate-detection/area-policy.d.ts +1 -1
  739. package/types/package-checks/duplicate-detection/finding-messages.d.ts +7 -0
  740. package/types/package-checks/duplicate-detection/finding-waiver-identity.d.ts +3 -0
  741. package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +1 -1
  742. package/types/package-checks/duplicate-detection/options.d.ts +18 -1
  743. package/types/package-checks/duplicate-detection/records.d.ts +20 -3
  744. package/types/package-checks/file-metrics/finding-messages.d.ts +4 -0
  745. package/types/package-checks/file-metrics/records.d.ts +5 -10
  746. package/types/package-checks/file-metrics/scc/parser.d.ts +4 -4
  747. package/types/package-checks/function-metrics/analysis.d.ts +1 -1
  748. package/types/package-checks/function-metrics/analyzer/analysis-context.d.ts +174 -0
  749. package/types/package-checks/function-metrics/analyzer/analysis-model.d.ts +135 -0
  750. package/types/package-checks/function-metrics/analyzer/contracts.d.ts +48 -0
  751. package/types/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.d.ts +13 -0
  752. package/types/package-checks/function-metrics/analyzer/extensions/lizardnd.d.ts +28 -0
  753. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +99 -0
  754. package/types/package-checks/function-metrics/analyzer/extensions/registry.d.ts +34 -0
  755. package/types/package-checks/function-metrics/analyzer/pipeline.d.ts +67 -0
  756. package/types/package-checks/function-metrics/analyzer/port-facade.d.ts +38 -0
  757. package/types/package-checks/function-metrics/analyzer/reader-registry.d.ts +18 -0
  758. package/types/package-checks/function-metrics/analyzer/readers/csharp.d.ts +22 -0
  759. package/types/package-checks/function-metrics/analyzer/readers/erlang.d.ts +22 -0
  760. package/types/package-checks/function-metrics/analyzer/readers/fortran.d.ts +29 -0
  761. package/types/package-checks/function-metrics/analyzer/readers/gdscript.d.ts +18 -0
  762. package/types/package-checks/function-metrics/analyzer/readers/go.d.ts +18 -0
  763. package/types/package-checks/function-metrics/analyzer/readers/java-body-states.d.ts +18 -0
  764. package/types/package-checks/function-metrics/analyzer/readers/java.d.ts +44 -0
  765. package/types/package-checks/function-metrics/analyzer/readers/javascript.d.ts +14 -0
  766. package/types/package-checks/function-metrics/analyzer/readers/kotlin.d.ts +23 -0
  767. package/types/package-checks/function-metrics/analyzer/readers/lua.d.ts +16 -0
  768. package/types/package-checks/function-metrics/analyzer/readers/objc.d.ts +18 -0
  769. package/types/package-checks/function-metrics/analyzer/readers/perl.d.ts +28 -0
  770. package/types/package-checks/function-metrics/analyzer/readers/php-states.d.ts +41 -0
  771. package/types/package-checks/function-metrics/analyzer/readers/php.d.ts +22 -0
  772. package/types/package-checks/function-metrics/analyzer/readers/plsql.d.ts +24 -0
  773. package/types/package-checks/function-metrics/analyzer/readers/python.d.ts +50 -0
  774. package/types/package-checks/function-metrics/analyzer/readers/r.d.ts +22 -0
  775. package/types/package-checks/function-metrics/analyzer/readers/ruby.d.ts +16 -0
  776. package/types/package-checks/function-metrics/analyzer/readers/rust.d.ts +20 -0
  777. package/types/package-checks/function-metrics/analyzer/readers/scala.d.ts +20 -0
  778. package/types/package-checks/function-metrics/analyzer/readers/solidity.d.ts +19 -0
  779. package/types/package-checks/function-metrics/analyzer/readers/st.d.ts +37 -0
  780. package/types/package-checks/function-metrics/analyzer/readers/swift.d.ts +30 -0
  781. package/types/package-checks/function-metrics/analyzer/readers/tsx.d.ts +15 -0
  782. package/types/package-checks/function-metrics/analyzer/readers/ttcn.d.ts +22 -0
  783. package/types/package-checks/function-metrics/analyzer/readers/typescript.d.ts +35 -0
  784. package/types/package-checks/function-metrics/analyzer/readers/vue.d.ts +18 -0
  785. package/types/package-checks/function-metrics/analyzer/readers/zig.d.ts +19 -0
  786. package/types/package-checks/function-metrics/analyzer/shared/clike.d.ts +101 -0
  787. package/types/package-checks/function-metrics/analyzer/shared/code-reader.d.ts +176 -0
  788. package/types/package-checks/function-metrics/analyzer/shared/golike.d.ts +39 -0
  789. package/types/package-checks/function-metrics/analyzer/shared/js-style-regex.d.ts +16 -0
  790. package/types/package-checks/function-metrics/analyzer/shared/rubylike.d.ts +40 -0
  791. package/types/package-checks/function-metrics/analyzer/shared/script-language.d.ts +17 -0
  792. package/types/package-checks/function-metrics/analyzer-adapter.d.ts +26 -0
  793. package/types/package-checks/function-metrics/analyzer-worker-contract.d.ts +5 -0
  794. package/types/package-checks/function-metrics/analyzer-worker-port.d.ts +24 -0
  795. package/types/package-checks/function-metrics/analyzer-worker.d.ts +1 -0
  796. package/types/package-checks/function-metrics/constructor.d.ts +1 -1
  797. package/types/package-checks/function-metrics/execution.d.ts +5 -2
  798. package/types/package-checks/function-metrics/finding-messages.d.ts +9 -0
  799. package/types/package-checks/function-metrics/finding-waiver-identity.d.ts +2 -0
  800. package/types/package-checks/function-metrics/measurement-model.d.ts +13 -1
  801. package/types/package-checks/function-metrics/measurement.d.ts +22 -7
  802. package/types/package-checks/function-metrics/options.d.ts +23 -10
  803. package/types/package-checks/function-metrics/records.d.ts +24 -5
  804. package/types/package-checks/function-metrics/target-files.d.ts +4 -3
  805. package/types/package-checks/host-environment/csv.d.ts +2 -0
  806. package/types/package-checks/host-environment/git.d.ts +1 -1
  807. package/types/package-checks/host-environment/process.d.ts +5 -0
  808. package/types/package-checks/json-schema-validation/final-data.d.ts +8 -0
  809. package/types/package-checks/json-schema-validation/options.d.ts +31 -3
  810. package/types/package-checks/json-validation/final-data.d.ts +5 -0
  811. package/types/package-checks/maintenance-reminders/final-data.d.ts +18 -0
  812. package/types/package-checks/markdown-link-validation/default-check.d.ts +9 -3
  813. package/types/package-checks/markdown-link-validation/execution.d.ts +1 -3
  814. package/types/package-checks/markdown-link-validation/final-data.d.ts +5 -0
  815. package/types/package-checks/markdown-link-validation/finding-messages.d.ts +4 -0
  816. package/types/package-checks/markdown-link-validation/local-resolution.d.ts +12 -6
  817. package/types/package-checks/markdown-link-validation/local-resolver.d.ts +2 -1
  818. package/types/package-checks/markdown-link-validation/options.d.ts +15 -0
  819. package/types/package-checks/markdown-link-validation/parse-facts-cache-payload.d.ts +24 -0
  820. package/types/package-checks/markdown-link-validation/parse-facts-cache.d.ts +13 -0
  821. package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +6 -4
  822. package/types/package-checks/markdown-link-validation/source-reader.d.ts +11 -0
  823. package/types/package-checks/markdown-link-validation/unavailable-reasons.d.ts +4 -0
  824. package/types/package-checks/project-files/public-collection.d.ts +16 -0
  825. package/types/package-checks/secret-detection/classification.d.ts +12 -0
  826. package/types/package-checks/secret-detection/default-check.d.ts +11 -0
  827. package/types/package-checks/secret-detection/execution.d.ts +14 -0
  828. package/types/package-checks/secret-detection/final-data.d.ts +15 -0
  829. package/types/package-checks/secret-detection/finding-waiver-identity.d.ts +5 -0
  830. package/types/package-checks/secret-detection/input-preparation.d.ts +24 -0
  831. package/types/package-checks/secret-detection/options-resolution.d.ts +6 -0
  832. package/types/package-checks/secret-detection/options-validation.d.ts +3 -0
  833. package/types/package-checks/secret-detection/options.d.ts +32 -0
  834. package/types/package-checks/secret-detection/records.d.ts +35 -0
  835. package/types/package-checks/secret-detection/secretlint/adapter.d.ts +28 -0
  836. package/types/project-definition/check-tree/authoring.d.ts +11 -14
  837. package/types/project-definition/check-tree/check-fields-authoring.d.ts +25 -0
  838. package/types/project-definition/check-tree/collection-authoring.d.ts +2 -0
  839. package/types/project-definition/check-tree/resolution.d.ts +8 -3
  840. package/types/project-definition/check-tree/scheduling-authoring.d.ts +19 -0
  841. package/types/project-definition/declarative-snapshot.d.ts +7 -0
  842. package/types/project-definition/output-defaults.d.ts +7 -0
  843. package/types/project-definition/output-validation.d.ts +2 -1
  844. package/types/project-definition/progress-rendering-output.d.ts +41 -0
  845. package/types/project-definition/project-definition.d.ts +61 -16
  846. package/types/project-definition/resource-unit-mapping.d.ts +4 -0
  847. package/types/project-definition/scheduler-policy.d.ts +497 -0
  848. package/types/project-run/admission-strategy-provider/custom-strategy-preparation.d.ts +9 -0
  849. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +23 -0
  850. package/types/project-run/admission-strategy-provider/provider.d.ts +13 -0
  851. package/types/project-run/aggregation.d.ts +1 -1
  852. package/types/project-run/check-execution/callback.d.ts +5 -1
  853. package/types/project-run/check-execution/console-capture.d.ts +18 -0
  854. package/types/project-run/check-execution/dependencies.d.ts +1 -1
  855. package/types/project-run/check-execution/execution-finalization.d.ts +17 -7
  856. package/types/project-run/check-execution/execution-settlement.d.ts +5 -2
  857. package/types/project-run/check-execution/flag-controls.d.ts +27 -0
  858. package/types/project-run/check-execution/lifecycle.d.ts +20 -0
  859. package/types/project-run/check-execution/messages.d.ts +2 -0
  860. package/types/project-run/check-execution/plan.d.ts +2 -3
  861. package/types/project-run/check-execution/preflight.d.ts +6 -5
  862. package/types/project-run/check-execution/resolved-checks.d.ts +32 -38
  863. package/types/project-run/check-execution/resolved-execution-result.d.ts +21 -0
  864. package/types/project-run/{completion.d.ts → completion/completion.d.ts} +4 -4
  865. package/types/project-run/{machine-publication.d.ts → completion/machine-publication.d.ts} +3 -3
  866. package/types/project-run/completion/result-resolver.d.ts +4 -0
  867. package/types/project-run/controls/contract.d.ts +25 -2
  868. package/types/project-run/controls/outputs-override-validation.d.ts +2 -1
  869. package/types/project-run/controls/validation-result.d.ts +12 -4
  870. package/types/project-run/diagnostic-logging/logger.d.ts +34 -4
  871. package/types/project-run/diagnostic-logging/observation-rendering.d.ts +7 -0
  872. package/types/project-run/invocation/candidate.d.ts +12 -0
  873. package/types/project-run/{invocation-creation.d.ts → invocation/creation.d.ts} +3 -3
  874. package/types/project-run/invocation/paths.d.ts +40 -0
  875. package/types/project-run/invocation/progress.d.ts +11 -0
  876. package/types/project-run/invocation/run.d.ts +43 -0
  877. package/types/project-run/invocation/scheduler.d.ts +16 -0
  878. package/types/project-run/outputs/configuration.d.ts +3 -0
  879. package/types/project-run/outputs/status.d.ts +48 -0
  880. package/types/project-run/progress-rendering/presentation.d.ts +9 -5
  881. package/types/project-run/progress-rendering/renderer-formatting.d.ts +8 -0
  882. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +6 -1
  883. package/types/project-run/progress-rendering/renderer.d.ts +7 -1
  884. package/types/project-run/project-context.d.ts +2 -1
  885. package/types/project-run/result.d.ts +37 -3
  886. package/types/project-run/run.d.ts +6 -5
  887. package/types/project-run/task-scheduler/admission-core/compiled-graph.d.ts +31 -0
  888. package/types/project-run/task-scheduler/admission-core/core.d.ts +57 -0
  889. package/types/project-run/task-scheduler/admission-core/input.d.ts +4 -0
  890. package/types/project-run/task-scheduler/admission-core/projection.d.ts +22 -0
  891. package/types/project-run/task-scheduler/admission-core/selection-index.d.ts +61 -0
  892. package/types/project-run/task-scheduler/admission-core/selection-query.d.ts +28 -0
  893. package/types/project-run/task-scheduler/admission-core/selection-seed.d.ts +9 -0
  894. package/types/project-run/task-scheduler/admission-core/selection-transition.d.ts +4 -0
  895. package/types/project-run/task-scheduler/admission-core/selection.d.ts +20 -0
  896. package/types/project-run/task-scheduler/admission-scope-layers.d.ts +8 -0
  897. package/types/project-run/task-scheduler/admission-selection-policy.d.ts +31 -0
  898. package/types/project-run/task-scheduler/critical-path-ranking.d.ts +19 -0
  899. package/types/project-run/task-scheduler/custom-admission-policy.d.ts +6 -0
  900. package/types/project-run/task-scheduler/execution-state.d.ts +43 -1
  901. package/types/project-run/task-scheduler/forced-block-effect-replay.d.ts +9 -0
  902. package/types/project-run/task-scheduler/graph-validation.d.ts +3 -2
  903. package/types/project-run/task-scheduler/graph.d.ts +15 -0
  904. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +47 -0
  905. package/types/project-run/task-scheduler/measurement/integrals.d.ts +27 -0
  906. package/types/project-run/task-scheduler/measurement/policy.d.ts +10 -0
  907. package/types/project-run/task-scheduler/measurement/summary.d.ts +3 -0
  908. package/types/project-run/task-scheduler/measurement/timing.d.ts +33 -0
  909. package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +13 -1
  910. package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +20 -19
  911. package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +38 -22
  912. package/types/project-run/task-scheduler/scheduler-decision.d.ts +4 -1
  913. package/types/project-run/task-scheduler/scheduler-observation.d.ts +14 -0
  914. package/types/project-run/task-scheduler/scheduler-task-lifecycle.d.ts +18 -0
  915. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +9 -0
  916. package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +0 -1
  917. package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +0 -64
  918. package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +0 -1
  919. package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +0 -17
  920. package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +0 -1
  921. package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +0 -138
  922. package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +0 -1
  923. package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +0 -35
  924. package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +0 -1
  925. package/dist/esm/package-checks/host-environment/process/command.mjs +0 -13
  926. package/dist/esm/package-checks/host-environment/process/command.mjs.map +0 -1
  927. package/dist/esm/project-run/completion.mjs.map +0 -1
  928. package/dist/esm/project-run/invocation-creation.mjs +0 -111
  929. package/dist/esm/project-run/invocation-creation.mjs.map +0 -1
  930. package/dist/esm/project-run/invocation.mjs.map +0 -1
  931. package/dist/esm/project-run/machine-publication.mjs.map +0 -1
  932. package/dist/esm/project-run/output-configuration.mjs.map +0 -1
  933. package/dist/esm/project-run/output-status.mjs +0 -43
  934. package/dist/esm/project-run/output-status.mjs.map +0 -1
  935. package/src/package-checks/function-metrics/lizard/availability.ts +0 -90
  936. package/src/package-checks/function-metrics/lizard/csv.ts +0 -20
  937. package/src/package-checks/function-metrics/lizard/parser.ts +0 -179
  938. package/src/package-checks/function-metrics/lizard/scanner.ts +0 -62
  939. package/src/package-checks/host-environment/process/command.ts +0 -21
  940. package/src/project-run/invocation-creation.ts +0 -160
  941. package/src/project-run/output-status.ts +0 -69
  942. package/types/package-checks/file-metrics/scc/csv.d.ts +0 -1
  943. package/types/package-checks/function-metrics/lizard/availability.d.ts +0 -11
  944. package/types/package-checks/function-metrics/lizard/csv.d.ts +0 -1
  945. package/types/package-checks/function-metrics/lizard/parser.d.ts +0 -17
  946. package/types/package-checks/function-metrics/lizard/scanner.d.ts +0 -15
  947. package/types/package-checks/host-environment/process/command.d.ts +0 -7
  948. package/types/project-run/invocation.d.ts +0 -34
  949. package/types/project-run/output-configuration.d.ts +0 -3
  950. package/types/project-run/output-status.d.ts +0 -21
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-admission-decision.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-admission-decision.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,yBAAyB,EACzB,6BAA6B,EAC7B,oBAAoB,EAErB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EAOrB,MAAM,+BAA+B,CAAC;AAoBvC,MAAM,UAAU,eAAe,CAAC,KAA6B;IAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7D,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAC7C,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,aAAa,CAAC,KAAK,EAAE;YAC1B,aAAa;YACb,MAAM,EAAE,qBAAqB;YAC7B,iBAAiB,EAAE,oBAAoB,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IAC5E,IAAI,YAAY,KAAK,SAAS;QAC5B,OAAO,uBAAuB,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IAErE,OAAO,yBAAyB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAA6B,EAC7B,aAAqC,EACrC,YAAyB;IAEzB,MAAM,SAAS,GAAuB;QACpC,MAAM,EAAE,aAAa;QACrB,iBAAiB,EAAE,gBAAgB,EAAE;QACrC,IAAI,EAAE,YAAY;KACnB,CAAC;IACF,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC;QAAE,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IAC/F,OAAO,aAAa,CAAC,KAAK,EAAE;QAC1B,aAAa;QACb,MAAM,EAAE,2BAA2B;QACnC,iBAAiB,EAAE,oBAAoB,EAAE;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAChC,KAA6B,EAC7B,aAAqC;IAErC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,oBAAoB,CACzC,KAAK,CAAC,KAAK,EACX,aAAa,EACb,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAC5C,CAAC;IACF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,uBAAuB,CAC5B,KAAK,EACL,aAAa,EACb,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,EACvE,2BAA2B,CAC5B,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,6BAA6B,CAChD,KAAK,CAAC,KAAK,EACX,aAAa,EACb,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAC5C,CAAC;IACF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,uBAAuB,CAC5B,KAAK,EACL,aAAa,EACb,EAAE,MAAM,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,EAC7E,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAChC,CAAC;IACJ,CAAC;IAED,OAAO,uBAAuB,CAC5B,KAAK,EACL,aAAa,EACb,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EACxE,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAA6B,EAC7B,aAAqC,EACrC,SAA6B,EAC7B,UAAgC;IAEhC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACjG,MAAM,iBAAiB,GACrB,SAAS,CAAC,MAAM,KAAK,kBAAkB;QACrC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC;IAClC,OAAO,aAAa,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,aAAa,CACpB,KAA6B,EAC7B,SAA6B,EAC7B,aAAqC;IAErC,OAAO,cAAc,CAAC;QACpB,GAAG,KAAK,CAAC,OAAO;QAChB,aAAa,EAAE,aAAa,CAAC,MAAM;QACnC,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,iBAAiB,EAAE,SAAS,CAAC,iBAAiB;QAC9C,eAAe,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI;QAC5E,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE;QACzB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CACpB,KAA6B,EAC7B,OAAkC;IAElC,IAAI,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,cAAc,CAAC;QACpB,GAAG,KAAK,CAAC,OAAO;QAChB,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM;QAC3C,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA0B;IACxD,OAAO,KAAK,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;AAC7F,CAAC;AAED,SAAS,QAAQ,CACf,MAA0B,EAC1B,KAA6B;IAE7B,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;AACrF,CAAC","sourcesContent":["import type { PlannedTask } from \"./graph.ts\";\nimport {\n activationScopeFor,\n canAdmit,\n capacityWaitReason,\n isDependencyMutexEligible,\n selectConstrainedContinuation,\n selectTighteningTask,\n type SchedulerInspection\n} from \"./scheduler-decision-inspection.ts\";\nimport {\n freezeDecision,\n reservationClear,\n reservationSet,\n reservationUnchanged,\n type ReservationUpdate,\n type SchedulerAdmissionReason,\n type SchedulerAwaitReason,\n type SchedulerDecision,\n type SchedulerDecisionContext,\n type SchedulerTrigger\n} from \"./scheduler-decision-model.ts\";\n\nexport interface SchedulerDecisionCycle {\n readonly context: SchedulerDecisionContext;\n readonly state: SchedulerInspection;\n readonly trigger: SchedulerTrigger;\n}\n\ninterface AdmissionSelection {\n readonly reason: SchedulerAdmissionReason;\n readonly reservationUpdate: ReservationUpdate;\n readonly task: PlannedTask;\n}\n\ninterface AwaitingSchedulerDecision {\n readonly eligibleTasks: readonly PlannedTask[];\n readonly reason: SchedulerAwaitReason;\n readonly reservationUpdate: ReservationUpdate;\n}\n\nexport function decideAdmission(cycle: SchedulerDecisionCycle): SchedulerDecision {\n const eligibleTasks = cycle.state.pendingTasks.filter((task) =>\n isDependencyMutexEligible(task, cycle.state)\n );\n if (eligibleTasks.length === 0) {\n return awaitDecision(cycle, {\n eligibleTasks,\n reason: \"dependency-or-mutex\",\n reservationUpdate: reservationUnchanged()\n });\n }\n\n const reservedTask = taskById(cycle.state.reservationTaskId, eligibleTasks);\n if (reservedTask !== undefined)\n return decideReservedAdmission(cycle, eligibleTasks, reservedTask);\n\n return decideUnreservedAdmission(cycle, eligibleTasks);\n}\n\nfunction decideReservedAdmission(\n cycle: SchedulerDecisionCycle,\n eligibleTasks: readonly PlannedTask[],\n reservedTask: PlannedTask\n): SchedulerDecision {\n const selection: AdmissionSelection = {\n reason: \"reservation\",\n reservationUpdate: reservationClear(),\n task: reservedTask\n };\n if (canAdmit(cycle.state, reservedTask)) return admitDecision(cycle, selection, eligibleTasks);\n return awaitDecision(cycle, {\n eligibleTasks,\n reason: \"reserved-tightening-scope\",\n reservationUpdate: reservationUnchanged()\n });\n}\n\nfunction decideUnreservedAdmission(\n cycle: SchedulerDecisionCycle,\n eligibleTasks: readonly PlannedTask[]\n): SchedulerDecision {\n const reservationUpdate = staleReservationUpdate(cycle.state);\n const tighteningTask = selectTighteningTask(\n cycle.state,\n eligibleTasks,\n cycle.context.capacity.effectiveMaxParallel\n );\n if (tighteningTask !== undefined) {\n return admissionOrCapacityWait(\n cycle,\n eligibleTasks,\n { reason: \"tightening-scope\", reservationUpdate, task: tighteningTask },\n \"reserved-tightening-scope\"\n );\n }\n\n const continuation = selectConstrainedContinuation(\n cycle.state,\n eligibleTasks,\n cycle.context.capacity.effectiveMaxParallel\n );\n if (continuation !== undefined) {\n return admissionOrCapacityWait(\n cycle,\n eligibleTasks,\n { reason: \"constrained-continuation\", reservationUpdate, task: continuation },\n capacityWaitReason(cycle.state)\n );\n }\n\n return admissionOrCapacityWait(\n cycle,\n eligibleTasks,\n { reason: \"canonical-order\", reservationUpdate, task: eligibleTasks[0] },\n capacityWaitReason(cycle.state)\n );\n}\n\nfunction admissionOrCapacityWait(\n cycle: SchedulerDecisionCycle,\n eligibleTasks: readonly PlannedTask[],\n selection: AdmissionSelection,\n waitReason: SchedulerAwaitReason\n): SchedulerDecision {\n if (canAdmit(cycle.state, selection.task)) return admitDecision(cycle, selection, eligibleTasks);\n const reservationUpdate =\n selection.reason === \"tightening-scope\"\n ? reservationSet(selection.task.id)\n : selection.reservationUpdate;\n return awaitDecision(cycle, { eligibleTasks, reason: waitReason, reservationUpdate });\n}\n\nfunction admitDecision(\n cycle: SchedulerDecisionCycle,\n selection: AdmissionSelection,\n eligibleTasks: readonly PlannedTask[]\n): SchedulerDecision {\n return freezeDecision({\n ...cycle.context,\n eligibleCount: eligibleTasks.length,\n kind: \"admit\",\n reason: selection.reason,\n reservationUpdate: selection.reservationUpdate,\n scopeToActivate: activationScopeFor(cycle.state, selection.task)?.id ?? null,\n taskId: selection.task.id,\n trigger: cycle.trigger\n });\n}\n\nfunction awaitDecision(\n cycle: SchedulerDecisionCycle,\n waiting: AwaitingSchedulerDecision\n): SchedulerDecision {\n if (cycle.state.runningTaskIds.size === 0) {\n throw new Error(\"scheduler has pending tasks but no runnable or running task\");\n }\n return freezeDecision({\n ...cycle.context,\n eligibleCount: waiting.eligibleTasks.length,\n kind: \"await-running\",\n reason: waiting.reason,\n reservationUpdate: waiting.reservationUpdate,\n trigger: cycle.trigger\n });\n}\n\nfunction staleReservationUpdate(state: SchedulerInspection): ReservationUpdate {\n return state.reservationTaskId === undefined ? reservationUnchanged() : reservationClear();\n}\n\nfunction taskById(\n taskId: string | undefined,\n tasks: readonly PlannedTask[]\n): PlannedTask | undefined {\n return taskId === undefined ? undefined : tasks.find((task) => task.id === taskId);\n}\n"]}
1
+ {"version":3,"file":"scheduler-admission-decision.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-admission-decision.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionPolicyContext } from \"../../project-definition/project-definition.ts\";\nimport type {\n AdmissionCandidate,\n AdmissionPolicyDecision,\n AdmissionSelectionPolicy\n} from \"./admission-selection-policy.ts\";\nimport {\n freezeDecision,\n type SchedulerAdmissionCandidateFact,\n type SchedulerAdmissionHardGuard,\n type SchedulerDecision,\n type SchedulerDecisionContext,\n type SchedulerTrigger\n} from \"./scheduler-decision-model.ts\";\nimport type { SchedulerInspection } from \"./scheduler-decision-inspection.ts\";\nimport {\n admissionCandidatesForCore,\n scopeToActivateForCore,\n type AdmissionCoreState\n} from \"./admission-core/core.ts\";\n\nexport interface SchedulerDecisionCycle {\n readonly admissionCore: AdmissionCoreState;\n readonly context: SchedulerDecisionContext;\n readonly policy: AdmissionSelectionPolicy;\n /** Invoked immediately before the private policy seam enters a custom callback. */\n readonly measurement?: () => AdmissionPolicyContext[\"measurement\"];\n readonly state: SchedulerInspection;\n readonly trigger: SchedulerTrigger;\n}\n\nexport function decideAdmission(cycle: SchedulerDecisionCycle): SchedulerDecision {\n const candidates = Object.freeze(\n admissionCandidatesForCore(cycle.admissionCore).map((candidate) =>\n Object.freeze({ canAdmit: candidate.canAdmit, task: candidate.task })\n )\n );\n if (candidates.length === 0) return awaitDecision(cycle, candidates);\n\n const measurement = cycle.measurement?.();\n const result = validatePolicyDecision(\n cycle.policy.decide(\n Object.freeze({\n admissionCore: cycle.admissionCore,\n candidates,\n graph: cycle.state.graph,\n graphSnapshot: cycle.context.graphIdentity,\n inspection: cycle.state,\n ...(measurement === undefined ? {} : { measurement })\n })\n )\n );\n return result.kind === \"select\"\n ? admitDecision(cycle, candidates, result)\n : awaitDecision(cycle, candidates, result);\n}\n\nfunction admitDecision(\n cycle: SchedulerDecisionCycle,\n candidates: readonly AdmissionCandidate[],\n result: Extract<AdmissionPolicyDecision, { readonly kind: \"select\" }>\n): SchedulerDecision {\n const candidate = candidateFor(result.taskId, candidates);\n if (candidate === undefined) {\n throw new AdmissionPolicyFault(\"non-candidate-select\");\n }\n if (!candidate.canAdmit) {\n throw new AdmissionPolicyFault(\"capacity-invalid-select\");\n }\n return freezeDecision({\n ...cycle.context,\n admissionPriority: candidate.task.admissionPriority,\n candidates: candidateFacts(candidates),\n eligibleCount: candidates.length,\n hardGuard: selectHardGuard(candidate.task.id),\n kind: \"admit\",\n proposal: result,\n scopeToActivate: scopeToActivateForCore(cycle.admissionCore, candidate.task.id),\n taskId: candidate.task.id,\n trigger: cycle.trigger\n });\n}\n\nfunction awaitDecision(\n cycle: SchedulerDecisionCycle,\n candidates: readonly AdmissionCandidate[],\n proposal: AdmissionPolicyDecision | null = null\n): SchedulerDecision {\n if (cycle.state.runningTaskIds.length === 0) {\n throw new AdmissionPolicyFault(\"undrainable-wait\");\n }\n return freezeDecision({\n ...cycle.context,\n candidates: candidateFacts(candidates),\n eligibleCount: candidates.length,\n hardGuard: waitHardGuard(),\n kind: \"await-running\",\n proposal,\n trigger: cycle.trigger\n });\n}\n\nfunction candidateFacts(\n candidates: readonly AdmissionCandidate[]\n): readonly SchedulerAdmissionCandidateFact[] {\n return Object.freeze(\n candidates.map((candidate) =>\n Object.freeze({ canAdmit: candidate.canAdmit, taskId: candidate.task.id })\n )\n );\n}\n\nfunction selectHardGuard(\n taskId: string\n): Extract<SchedulerAdmissionHardGuard, { readonly kind: \"select\" }> {\n return Object.freeze({\n canAdmit: true,\n isCandidate: true,\n kind: \"select\",\n lifecycleOpen: true,\n taskId\n });\n}\n\nfunction waitHardGuard(): Extract<SchedulerAdmissionHardGuard, { readonly kind: \"wait\" }> {\n return Object.freeze({ kind: \"wait\", runningCanDrain: true });\n}\n\nfunction validatePolicyDecision(value: unknown): AdmissionPolicyDecision {\n if (!isRecord(value)) throw new AdmissionPolicyFault(\"malformed-proposal\");\n if (value[\"kind\"] === \"select\") {\n requireExactKeys(value, [\"kind\", \"taskId\"]);\n if (typeof value[\"taskId\"] !== \"string\") {\n throw new AdmissionPolicyFault(\"malformed-proposal\");\n }\n return Object.freeze({ kind: \"select\", taskId: value[\"taskId\"] });\n }\n if (value[\"kind\"] === \"wait\") {\n requireExactKeys(value, [\"kind\"]);\n return Object.freeze({ kind: \"wait\" });\n }\n throw new AdmissionPolicyFault(\"malformed-proposal\");\n}\n\nfunction candidateFor(\n taskId: string,\n candidates: readonly AdmissionCandidate[]\n): AdmissionCandidate | undefined {\n return candidates.find((candidate) => candidate.task.id === taskId);\n}\n\nfunction requireExactKeys(value: Readonly<Record<string, unknown>>, keys: readonly string[]): void {\n const prototype = Reflect.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new AdmissionPolicyFault(\"malformed-proposal\");\n }\n const actualKeys = Reflect.ownKeys(value);\n if (\n actualKeys.length !== keys.length ||\n actualKeys.some((key) => typeof key !== \"string\" || !keys.includes(key))\n ) {\n throw new AdmissionPolicyFault(\"malformed-proposal\");\n }\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport type AdmissionPolicyFaultCategory =\n | \"callback-threw\"\n | \"thenable-proposal\"\n | \"malformed-proposal\"\n | \"non-candidate-select\"\n | \"capacity-invalid-select\"\n | \"lifecycle-invalid-select\"\n | \"undrainable-wait\";\n\nexport class AdmissionPolicyFault extends Error {\n public readonly category: AdmissionPolicyFaultCategory;\n\n public constructor(category: AdmissionPolicyFaultCategory) {\n super(\"admission policy fault\");\n this.category = category;\n }\n}\n"]}
@@ -2,26 +2,40 @@
2
2
  export function summarizeSchedulerBlockers(state, capacity) {
3
3
  let dependency = 0;
4
4
  let mutex = 0;
5
+ let resourceCapacity = 0;
5
6
  for (const task of state.pendingTasks) {
6
- if (hasUncompletedDependency(task.dependsOn, state.settlementKindByTaskId)) {
7
+ if (hasUnsatisfiedRelation(task, state.settledTasks)) {
7
8
  dependency += 1;
8
9
  continue;
9
10
  }
10
11
  if (hasRunningMutex(task.mutex, state.runningMutexes))
11
12
  mutex += 1;
13
+ else if (hasResourceShortage(task.resourceClaims, state.resources))
14
+ resourceCapacity += 1;
12
15
  }
13
16
  return Object.freeze({
14
17
  dependency,
15
18
  mutex,
16
- rootCapacity: state.runningTaskIds.size >= state.maxParallel,
19
+ resourceCapacity,
20
+ rootCapacity: state.runningTaskIds.length >= state.maxParallel,
17
21
  scopeCapacity: capacity.effectiveMaxParallel < state.maxParallel &&
18
- state.runningTaskIds.size >= capacity.effectiveMaxParallel
22
+ state.runningTaskIds.length >= capacity.effectiveMaxParallel
19
23
  });
20
24
  }
21
- function hasUncompletedDependency(dependencyIds, settlementKindByTaskId) {
22
- return dependencyIds.some((dependencyId) => settlementKindByTaskId.get(dependencyId) !== "completed");
25
+ function hasResourceShortage(claims, resources) {
26
+ return claims.some((claim) => {
27
+ const resource = resources.find(({ resourceId }) => resourceId === claim.resourceId);
28
+ return resource === undefined || claim.units > resource.available;
29
+ });
30
+ }
31
+ function hasUnsatisfiedRelation(task, settledTasks) {
32
+ return (task.dependsOn.some((dependencyId) => settlementKindFor(settledTasks, dependencyId) !== "completed") ||
33
+ task.observes.some((observationId) => settlementKindFor(settledTasks, observationId) === undefined));
23
34
  }
24
35
  function hasRunningMutex(mutexNames, runningMutexes) {
25
- return mutexNames.some((mutexName) => runningMutexes.has(mutexName));
36
+ return mutexNames.some((mutexName) => runningMutexes.includes(mutexName));
37
+ }
38
+ function settlementKindFor(settledTasks, taskId) {
39
+ return settledTasks.find((task) => task.taskId === taskId)?.kind;
26
40
  }
27
41
  //# sourceMappingURL=scheduler-blocker-summary.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-blocker-summary.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-blocker-summary.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,MAAM,UAAU,0BAA0B,CACxC,KAA0B,EAC1B,QAA2B;IAE3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACtC,IAAI,wBAAwB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3E,UAAU,IAAI,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU;QACV,KAAK;QACL,YAAY,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW;QAC5D,aAAa,EACX,QAAQ,CAAC,oBAAoB,GAAG,KAAK,CAAC,WAAW;YACjD,KAAK,CAAC,cAAc,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAC/B,aAAgC,EAChC,sBAAqE;IAErE,OAAO,aAAa,CAAC,IAAI,CACvB,CAAC,YAAY,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,WAAW,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,UAA6B,EAC7B,cAAqD;IAErD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC","sourcesContent":["import type { SchedulerInspection } from \"./scheduler-decision-inspection.ts\";\nimport type { SchedulerBlockerSummary, SchedulerCapacity } from \"./scheduler-decision-model.ts\";\n\n/** Summarizes why pending Tasks cannot currently advance. */\nexport function summarizeSchedulerBlockers(\n state: SchedulerInspection,\n capacity: SchedulerCapacity\n): SchedulerBlockerSummary {\n let dependency = 0;\n let mutex = 0;\n for (const task of state.pendingTasks) {\n if (hasUncompletedDependency(task.dependsOn, state.settlementKindByTaskId)) {\n dependency += 1;\n continue;\n }\n if (hasRunningMutex(task.mutex, state.runningMutexes)) mutex += 1;\n }\n return Object.freeze({\n dependency,\n mutex,\n rootCapacity: state.runningTaskIds.size >= state.maxParallel,\n scopeCapacity:\n capacity.effectiveMaxParallel < state.maxParallel &&\n state.runningTaskIds.size >= capacity.effectiveMaxParallel\n });\n}\n\nfunction hasUncompletedDependency(\n dependencyIds: readonly string[],\n settlementKindByTaskId: SchedulerInspection[\"settlementKindByTaskId\"]\n): boolean {\n return dependencyIds.some(\n (dependencyId) => settlementKindByTaskId.get(dependencyId) !== \"completed\"\n );\n}\n\nfunction hasRunningMutex(\n mutexNames: readonly string[],\n runningMutexes: SchedulerInspection[\"runningMutexes\"]\n): boolean {\n return mutexNames.some((mutexName) => runningMutexes.has(mutexName));\n}\n"]}
1
+ {"version":3,"file":"scheduler-blocker-summary.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-blocker-summary.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,MAAM,UAAU,0BAA0B,CACxC,KAA0B,EAC1B,QAA2B;IAE3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACtC,IAAI,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACrD,UAAU,IAAI,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;aAC7D,IAAI,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC;YAAE,gBAAgB,IAAI,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU;QACV,KAAK;QACL,gBAAgB;QAChB,YAAY,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW;QAC9D,aAAa,EACX,QAAQ,CAAC,oBAAoB,GAAG,KAAK,CAAC,WAAW;YACjD,KAAK,CAAC,cAAc,CAAC,MAAM,IAAI,QAAQ,CAAC,oBAAoB;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAqE,EACrE,SAA2C;IAE3C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;QACrF,OAAO,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAiD,EACjD,YAAiD;IAEjD,OAAO,CACL,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,CAAC,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,EAAE,YAAY,CAAC,KAAK,WAAW,CAChF;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,CAAC,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,EAAE,aAAa,CAAC,KAAK,SAAS,CAChF,CACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,UAA6B,EAC7B,cAAqD;IAErD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,iBAAiB,CACxB,YAAiD,EACjD,MAAc;IAEd,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC;AACnE,CAAC","sourcesContent":["import type { SchedulerInspection } from \"./scheduler-decision-inspection.ts\";\nimport type { SchedulerBlockerSummary, SchedulerCapacity } from \"./scheduler-decision-model.ts\";\n\n/** Summarizes why pending Tasks cannot currently advance. */\nexport function summarizeSchedulerBlockers(\n state: SchedulerInspection,\n capacity: SchedulerCapacity\n): SchedulerBlockerSummary {\n let dependency = 0;\n let mutex = 0;\n let resourceCapacity = 0;\n for (const task of state.pendingTasks) {\n if (hasUnsatisfiedRelation(task, state.settledTasks)) {\n dependency += 1;\n continue;\n }\n if (hasRunningMutex(task.mutex, state.runningMutexes)) mutex += 1;\n else if (hasResourceShortage(task.resourceClaims, state.resources)) resourceCapacity += 1;\n }\n return Object.freeze({\n dependency,\n mutex,\n resourceCapacity,\n rootCapacity: state.runningTaskIds.length >= state.maxParallel,\n scopeCapacity:\n capacity.effectiveMaxParallel < state.maxParallel &&\n state.runningTaskIds.length >= capacity.effectiveMaxParallel\n });\n}\n\nfunction hasResourceShortage(\n claims: SchedulerInspection[\"pendingTasks\"][number][\"resourceClaims\"],\n resources: SchedulerInspection[\"resources\"]\n): boolean {\n return claims.some((claim) => {\n const resource = resources.find(({ resourceId }) => resourceId === claim.resourceId);\n return resource === undefined || claim.units > resource.available;\n });\n}\n\nfunction hasUnsatisfiedRelation(\n task: SchedulerInspection[\"pendingTasks\"][number],\n settledTasks: SchedulerInspection[\"settledTasks\"]\n): boolean {\n return (\n task.dependsOn.some(\n (dependencyId) => settlementKindFor(settledTasks, dependencyId) !== \"completed\"\n ) ||\n task.observes.some(\n (observationId) => settlementKindFor(settledTasks, observationId) === undefined\n )\n );\n}\n\nfunction hasRunningMutex(\n mutexNames: readonly string[],\n runningMutexes: SchedulerInspection[\"runningMutexes\"]\n): boolean {\n return mutexNames.some((mutexName) => runningMutexes.includes(mutexName));\n}\n\nfunction settlementKindFor(\n settledTasks: SchedulerInspection[\"settledTasks\"],\n taskId: string\n): SchedulerInspection[\"settledTasks\"][number][\"kind\"] | undefined {\n return settledTasks.find((task) => task.taskId === taskId)?.kind;\n}\n"]}
@@ -1,125 +1,25 @@
1
1
  import { summarizeSchedulerBlockers } from "./scheduler-blocker-summary.mjs";
2
- export function inspectSnapshot(snapshot) {
3
- const tasksById = new Map(snapshot.graph.tasks.map((task) => [task.id, task]));
4
- const pendingTasks = snapshot.pendingTaskIds.map((taskId) => pendingTaskFor(taskId, tasksById));
5
- return Object.freeze({
6
- activeScopeIds: new Set(snapshot.activeScopeIds),
7
- graph: snapshot.graph,
8
- maxParallel: snapshot.maxParallel,
9
- pendingTasks: Object.freeze(pendingTasks),
10
- reservationTaskId: snapshot.reservationTaskId,
11
- runningMutexes: new Set(snapshot.runningMutexes),
12
- runningTaskIds: new Set(snapshot.runningTaskIds),
13
- settlementKindByTaskId: new Map(snapshot.settledTasks.map(({ taskId, kind }) => [taskId, kind]))
14
- });
15
- }
16
- export function decisionContext(state) {
2
+ export function decisionContext(state, graphIdentity) {
17
3
  const capacity = capacityFor(state);
18
4
  return Object.freeze({
19
5
  blockers: summarizeSchedulerBlockers(state, capacity),
20
6
  capacity,
21
- reservation: Object.freeze({ taskId: state.reservationTaskId ?? null })
7
+ graphIdentity
22
8
  });
23
9
  }
24
- export function selectBlockedTask(state) {
25
- for (let index = state.pendingTasks.length - 1; index >= 0; index -= 1) {
26
- const task = state.pendingTasks[index];
27
- const dependencyIds = blockingDependencyIds(task, state.settlementKindByTaskId);
28
- if (dependencyIds !== undefined)
29
- return Object.freeze({ dependencyIds: Object.freeze(dependencyIds), task });
30
- }
31
- return undefined;
32
- }
33
- export function isDependencyMutexEligible(task, state) {
34
- return (task.dependsOn.every((dependencyId) => state.settlementKindByTaskId.get(dependencyId) === "completed") && task.mutex.every((mutex) => !state.runningMutexes.has(mutex)));
35
- }
36
- export function capacityWaitReason(state) {
37
- return state.runningTaskIds.size >= state.maxParallel ? "root-capacity" : "active-scope-capacity";
38
- }
39
- export function canAdmit(state, task) {
40
- return state.runningTaskIds.size < prospectiveMaxParallel(state, task);
41
- }
42
- export function activationScopeFor(state, task) {
43
- const scope = scopeForTask(state, task);
44
- return scope?.activationTaskIds.includes(task.id) === true && !state.activeScopeIds.has(scope.id)
45
- ? scope
46
- : undefined;
47
- }
48
- export function selectTighteningTask(state, eligibleTasks, effectiveMaxParallel) {
49
- return eligibleTasks
50
- .filter((task) => activatesTighteningScope(state, task, effectiveMaxParallel))
51
- .sort((left, right) => compareConstrainedTasks(state, left, right))[0];
52
- }
53
- export function selectConstrainedContinuation(state, eligibleTasks, effectiveMaxParallel) {
54
- return eligibleTasks
55
- .filter((task) => isConstrainedContinuation(state, task, effectiveMaxParallel))
56
- .sort((left, right) => compareConstrainedTasks(state, left, right))[0];
57
- }
58
- function pendingTaskFor(taskId, tasksById) {
59
- const task = tasksById.get(taskId);
60
- if (task === undefined)
61
- throw new Error(`scheduler snapshot has unknown pending task ${taskId}`);
62
- return task;
63
- }
64
- function blockingDependencyIds(task, settlementKindByTaskId) {
65
- const settlementKinds = task.dependsOn.map((dependencyId) => [dependencyId, settlementKindByTaskId.get(dependencyId)]);
66
- if (settlementKinds.some(([, kind]) => kind === undefined))
67
- return undefined;
68
- const dependencyIds = settlementKinds.flatMap(([dependencyId, kind]) => kind === "completed" ? [] : [dependencyId]);
69
- return dependencyIds.length === 0 ? undefined : dependencyIds;
70
- }
71
- function capacityFor(state) {
10
+ export function capacityFor(state) {
72
11
  return Object.freeze({
73
12
  effectiveMaxParallel: effectiveMaxParallelFor(state),
74
13
  maxParallel: state.maxParallel,
75
- running: state.runningTaskIds.size
14
+ running: state.runningTaskIds.length
76
15
  });
77
16
  }
78
17
  function effectiveMaxParallelFor(state) {
79
18
  let effective = state.maxParallel;
80
19
  for (const scope of state.graph.scopes) {
81
- if (state.activeScopeIds.has(scope.id))
20
+ if (state.activeScopeIds.includes(scope.id))
82
21
  effective = Math.min(effective, scope.maxParallel);
83
22
  }
84
23
  return effective;
85
24
  }
86
- function prospectiveMaxParallel(state, task) {
87
- const scope = activationScopeFor(state, task);
88
- return scope === undefined
89
- ? effectiveMaxParallelFor(state)
90
- : Math.min(effectiveMaxParallelFor(state), scope.maxParallel);
91
- }
92
- function activatesTighteningScope(state, task, effectiveMaxParallel) {
93
- const scope = activationScopeFor(state, task);
94
- return scope !== undefined && scope.maxParallel < effectiveMaxParallel;
95
- }
96
- function isConstrainedContinuation(state, task, effectiveMaxParallel) {
97
- const scope = scopeForTask(state, task);
98
- return (scope !== undefined &&
99
- state.activeScopeIds.has(scope.id) &&
100
- scope.maxParallel < state.maxParallel &&
101
- scope.maxParallel === effectiveMaxParallel);
102
- }
103
- function compareConstrainedTasks(state, left, right) {
104
- const leftScope = scopeForTask(state, left);
105
- const rightScope = scopeForTask(state, right);
106
- if (leftScope === undefined || rightScope === undefined) {
107
- throw new Error("constrained task is missing a scope");
108
- }
109
- return (leftScope.maxParallel - rightScope.maxParallel ||
110
- compareText(leftScope.id, rightScope.id) ||
111
- compareText(left.id, right.id));
112
- }
113
- function compareText(left, right) {
114
- if (left < right)
115
- return -1;
116
- if (left > right)
117
- return 1;
118
- return 0;
119
- }
120
- function scopeForTask(state, task) {
121
- return task.scopeId === undefined
122
- ? undefined
123
- : state.graph.scopes.find((scope) => scope.id === task.scopeId);
124
- }
125
25
  //# sourceMappingURL=scheduler-decision-inspection.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-decision-inspection.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-decision-inspection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PlannedTask, PlannedTaskGraph, PlannedTaskScope } from \"./graph.ts\";\nimport { summarizeSchedulerBlockers } from \"./scheduler-blocker-summary.ts\";\nimport type {\n SchedulerAwaitReason,\n SchedulerCapacity,\n SchedulerDecisionContext,\n SchedulerSettlementKind,\n SchedulerSnapshot\n} from \"./scheduler-decision-model.ts\";\n\nexport interface SchedulerInspection {\n readonly activeScopeIds: ReadonlySet<string>;\n readonly graph: PlannedTaskGraph;\n readonly maxParallel: number;\n readonly pendingTasks: readonly PlannedTask[];\n readonly reservationTaskId: string | undefined;\n readonly runningMutexes: ReadonlySet<string>;\n readonly runningTaskIds: ReadonlySet<string>;\n readonly settlementKindByTaskId: ReadonlyMap<string, SchedulerSettlementKind>;\n}\n\nexport function inspectSnapshot(snapshot: SchedulerSnapshot): SchedulerInspection {\n const tasksById = new Map(snapshot.graph.tasks.map((task) => [task.id, task] as const));\n const pendingTasks = snapshot.pendingTaskIds.map((taskId) => pendingTaskFor(taskId, tasksById));\n return Object.freeze({\n activeScopeIds: new Set(snapshot.activeScopeIds),\n graph: snapshot.graph,\n maxParallel: snapshot.maxParallel,\n pendingTasks: Object.freeze(pendingTasks),\n reservationTaskId: snapshot.reservationTaskId,\n runningMutexes: new Set(snapshot.runningMutexes),\n runningTaskIds: new Set(snapshot.runningTaskIds),\n settlementKindByTaskId: new Map(\n snapshot.settledTasks.map(({ taskId, kind }) => [taskId, kind] as const)\n )\n });\n}\n\nexport function decisionContext(state: SchedulerInspection): SchedulerDecisionContext {\n const capacity = capacityFor(state);\n return Object.freeze({\n blockers: summarizeSchedulerBlockers(state, capacity),\n capacity,\n reservation: Object.freeze({ taskId: state.reservationTaskId ?? null })\n });\n}\n\nexport function selectBlockedTask(\n state: SchedulerInspection\n): Readonly<{ readonly dependencyIds: readonly string[]; readonly task: PlannedTask }> | undefined {\n for (let index = state.pendingTasks.length - 1; index >= 0; index -= 1) {\n const task = state.pendingTasks[index];\n const dependencyIds = blockingDependencyIds(task, state.settlementKindByTaskId);\n if (dependencyIds !== undefined)\n return Object.freeze({ dependencyIds: Object.freeze(dependencyIds), task });\n }\n return undefined;\n}\n\nexport function isDependencyMutexEligible(task: PlannedTask, state: SchedulerInspection): boolean {\n return (\n task.dependsOn.every(\n (dependencyId) => state.settlementKindByTaskId.get(dependencyId) === \"completed\"\n ) && task.mutex.every((mutex) => !state.runningMutexes.has(mutex))\n );\n}\n\nexport function capacityWaitReason(state: SchedulerInspection): SchedulerAwaitReason {\n return state.runningTaskIds.size >= state.maxParallel ? \"root-capacity\" : \"active-scope-capacity\";\n}\n\nexport function canAdmit(state: SchedulerInspection, task: PlannedTask): boolean {\n return state.runningTaskIds.size < prospectiveMaxParallel(state, task);\n}\n\nexport function activationScopeFor(\n state: SchedulerInspection,\n task: PlannedTask\n): PlannedTaskScope | undefined {\n const scope = scopeForTask(state, task);\n return scope?.activationTaskIds.includes(task.id) === true && !state.activeScopeIds.has(scope.id)\n ? scope\n : undefined;\n}\n\nexport function selectTighteningTask(\n state: SchedulerInspection,\n eligibleTasks: readonly PlannedTask[],\n effectiveMaxParallel: number\n): PlannedTask | undefined {\n return eligibleTasks\n .filter((task) => activatesTighteningScope(state, task, effectiveMaxParallel))\n .sort((left, right) => compareConstrainedTasks(state, left, right))[0];\n}\n\nexport function selectConstrainedContinuation(\n state: SchedulerInspection,\n eligibleTasks: readonly PlannedTask[],\n effectiveMaxParallel: number\n): PlannedTask | undefined {\n return eligibleTasks\n .filter((task) => isConstrainedContinuation(state, task, effectiveMaxParallel))\n .sort((left, right) => compareConstrainedTasks(state, left, right))[0];\n}\n\nfunction pendingTaskFor(taskId: string, tasksById: ReadonlyMap<string, PlannedTask>): PlannedTask {\n const task = tasksById.get(taskId);\n if (task === undefined) throw new Error(`scheduler snapshot has unknown pending task ${taskId}`);\n return task;\n}\n\nfunction blockingDependencyIds(\n task: PlannedTask,\n settlementKindByTaskId: ReadonlyMap<string, SchedulerSettlementKind>\n): string[] | undefined {\n const settlementKinds = task.dependsOn.map(\n (dependencyId) => [dependencyId, settlementKindByTaskId.get(dependencyId)] as const\n );\n if (settlementKinds.some(([, kind]) => kind === undefined)) return undefined;\n const dependencyIds = settlementKinds.flatMap(([dependencyId, kind]) =>\n kind === \"completed\" ? [] : [dependencyId]\n );\n return dependencyIds.length === 0 ? undefined : dependencyIds;\n}\n\nfunction capacityFor(state: SchedulerInspection): SchedulerCapacity {\n return Object.freeze({\n effectiveMaxParallel: effectiveMaxParallelFor(state),\n maxParallel: state.maxParallel,\n running: state.runningTaskIds.size\n });\n}\n\nfunction effectiveMaxParallelFor(state: SchedulerInspection): number {\n let effective = state.maxParallel;\n for (const scope of state.graph.scopes) {\n if (state.activeScopeIds.has(scope.id)) effective = Math.min(effective, scope.maxParallel);\n }\n return effective;\n}\n\nfunction prospectiveMaxParallel(state: SchedulerInspection, task: PlannedTask): number {\n const scope = activationScopeFor(state, task);\n return scope === undefined\n ? effectiveMaxParallelFor(state)\n : Math.min(effectiveMaxParallelFor(state), scope.maxParallel);\n}\n\nfunction activatesTighteningScope(\n state: SchedulerInspection,\n task: PlannedTask,\n effectiveMaxParallel: number\n): boolean {\n const scope = activationScopeFor(state, task);\n return scope !== undefined && scope.maxParallel < effectiveMaxParallel;\n}\n\nfunction isConstrainedContinuation(\n state: SchedulerInspection,\n task: PlannedTask,\n effectiveMaxParallel: number\n): boolean {\n const scope = scopeForTask(state, task);\n return (\n scope !== undefined &&\n state.activeScopeIds.has(scope.id) &&\n scope.maxParallel < state.maxParallel &&\n scope.maxParallel === effectiveMaxParallel\n );\n}\n\nfunction compareConstrainedTasks(\n state: SchedulerInspection,\n left: PlannedTask,\n right: PlannedTask\n): number {\n const leftScope = scopeForTask(state, left);\n const rightScope = scopeForTask(state, right);\n if (leftScope === undefined || rightScope === undefined) {\n throw new Error(\"constrained task is missing a scope\");\n }\n return (\n leftScope.maxParallel - rightScope.maxParallel ||\n compareText(leftScope.id, rightScope.id) ||\n compareText(left.id, right.id)\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\nfunction scopeForTask(state: SchedulerInspection, task: PlannedTask): PlannedTaskScope | undefined {\n return task.scopeId === undefined\n ? undefined\n : state.graph.scopes.find((scope) => scope.id === task.scopeId);\n}\n"]}
1
+ {"version":3,"file":"scheduler-decision-inspection.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-decision-inspection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AA4B5E,MAAM,UAAU,eAAe,CAC7B,KAA0B,EAC1B,aAAqC;IAErC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC;QACrD,QAAQ;QACR,aAAa;KACd,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAA0B;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,oBAAoB,EAAE,uBAAuB,CAAC,KAAK,CAAC;QACpD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM;KACrC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,KAA0B;IACzD,IAAI,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import type { PlannedTask, PlannedTaskGraph } from \"./graph.ts\";\nimport type { SchedulerGraphSnapshot } from \"../../project-definition/project-definition.ts\";\nimport { summarizeSchedulerBlockers } from \"./scheduler-blocker-summary.ts\";\nimport type {\n SchedulerCapacity,\n SchedulerDecisionContext,\n SchedulerSettlementKind\n} from \"./scheduler-decision-model.ts\";\n\nexport interface SchedulerInspection {\n readonly activeScopeIds: readonly string[];\n readonly graph: PlannedTaskGraph;\n readonly isAbortRequested: boolean;\n readonly isCancelled: boolean;\n readonly maxParallel: number;\n readonly pendingTasks: readonly PlannedTask[];\n readonly runningMutexes: readonly string[];\n readonly resources: readonly Readonly<{\n readonly available: number;\n readonly capacity: number;\n readonly inUse: number;\n readonly resourceId: string;\n }>[];\n readonly runningTaskIds: readonly string[];\n readonly settledTasks: readonly Readonly<{\n readonly kind: SchedulerSettlementKind;\n readonly taskId: string;\n }>[];\n}\n\nexport function decisionContext(\n state: SchedulerInspection,\n graphIdentity: SchedulerGraphSnapshot\n): SchedulerDecisionContext {\n const capacity = capacityFor(state);\n return Object.freeze({\n blockers: summarizeSchedulerBlockers(state, capacity),\n capacity,\n graphIdentity\n });\n}\n\nexport function capacityFor(state: SchedulerInspection): SchedulerCapacity {\n return Object.freeze({\n effectiveMaxParallel: effectiveMaxParallelFor(state),\n maxParallel: state.maxParallel,\n running: state.runningTaskIds.length\n });\n}\n\nfunction effectiveMaxParallelFor(state: SchedulerInspection): number {\n let effective = state.maxParallel;\n for (const scope of state.graph.scopes) {\n if (state.activeScopeIds.includes(scope.id)) effective = Math.min(effective, scope.maxParallel);\n }\n return effective;\n}\n"]}
@@ -1,12 +1,3 @@
1
- export function reservationUnchanged() {
2
- return Object.freeze({ kind: "unchanged" });
3
- }
4
- export function reservationSet(taskId) {
5
- return Object.freeze({ kind: "set", taskId });
6
- }
7
- export function reservationClear() {
8
- return Object.freeze({ kind: "clear" });
9
- }
10
1
  export function freezeDecision(decision) {
11
2
  const trigger = freezeTrigger(decision.trigger);
12
3
  switch (decision.kind) {
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-decision-model.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-decision-model.ts"],"names":[],"mappings":"AA8GA,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAA2B;IACxD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChD,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,OAAO,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,GAAG,QAAQ;gBACX,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;gBACzD,OAAO;aACR,CAAC,CAAC;QACL,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAChG,KAAK,UAAU;YACb,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAyB;IAC9C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,mBAAmB,CAAC;QACzB,KAAK,qBAAqB,CAAC;QAC3B,KAAK,uBAAuB,CAAC;QAC7B,KAAK,sBAAsB;YACzB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,KAAK,iBAAiB;YACpB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,KAAK,cAAc;YACjB,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;IACP,CAAC;AACH,CAAC","sourcesContent":["import type { PlannedTaskGraph } from \"./graph.ts\";\n\nexport type SchedulerSettlementKind = \"completed\" | \"failed\" | \"blocked\" | \"cancelled-before-start\";\n\nexport type SchedulerTrigger =\n | Readonly<{ readonly kind: \"execution-started\" }>\n | Readonly<{ readonly kind: \"admission-continued\" }>\n | Readonly<{ readonly kind: \"blocked-settled\"; readonly taskId: string }>\n | Readonly<{\n readonly kind: \"task-settled\";\n readonly settlementKind: SchedulerSettlementKind;\n readonly taskId: string;\n }>\n | Readonly<{ readonly kind: \"cancellation-observed\" }>\n | Readonly<{ readonly kind: \"cancellation-applied\" }>;\n\nexport interface SchedulerSnapshot {\n readonly graph: PlannedTaskGraph;\n readonly isAbortRequested: boolean;\n readonly isCancelled: boolean;\n readonly pendingTaskIds: readonly string[];\n readonly reservationTaskId: string | undefined;\n readonly runningMutexes: readonly string[];\n readonly runningTaskIds: readonly string[];\n readonly settledTasks: readonly Readonly<{\n readonly kind: SchedulerSettlementKind;\n readonly taskId: string;\n }>[];\n readonly activeScopeIds: readonly string[];\n readonly maxParallel: number;\n}\n\nexport interface SchedulerCapacity {\n readonly effectiveMaxParallel: number;\n readonly maxParallel: number;\n readonly running: number;\n}\n\nexport interface SchedulerBlockerSummary {\n readonly dependency: number;\n readonly mutex: number;\n readonly rootCapacity: boolean;\n readonly scopeCapacity: boolean;\n}\n\nexport interface SchedulerReservationContext {\n readonly taskId: string | null;\n}\n\nexport interface SchedulerDecisionContext {\n readonly blockers: SchedulerBlockerSummary;\n readonly capacity: SchedulerCapacity;\n readonly reservation: SchedulerReservationContext;\n}\n\nexport type ReservationUpdate =\n | Readonly<{ readonly kind: \"unchanged\" }>\n | Readonly<{ readonly kind: \"set\"; readonly taskId: string }>\n | Readonly<{ readonly kind: \"clear\" }>;\n\nexport type SchedulerAdmissionReason =\n | \"reservation\"\n | \"tightening-scope\"\n | \"constrained-continuation\"\n | \"canonical-order\";\n\nexport type SchedulerAwaitReason =\n | \"cancellation-drain\"\n | \"dependency-or-mutex\"\n | \"running-drain\"\n | \"root-capacity\"\n | \"active-scope-capacity\"\n | \"reserved-tightening-scope\";\n\nexport type SchedulerDecision = SchedulerDecisionContext &\n (\n | Readonly<{\n readonly eligibleCount: number;\n readonly kind: \"admit\";\n readonly reason: SchedulerAdmissionReason;\n readonly reservationUpdate: ReservationUpdate;\n readonly scopeToActivate: string | null;\n readonly taskId: string;\n readonly trigger: SchedulerTrigger;\n }>\n | Readonly<{\n readonly dependencyIds: readonly string[];\n readonly kind: \"settle-blocked\";\n readonly taskId: string;\n readonly trigger: SchedulerTrigger;\n }>\n | Readonly<{\n readonly eligibleCount: number;\n readonly kind: \"await-running\";\n readonly reason: SchedulerAwaitReason;\n readonly reservationUpdate: ReservationUpdate;\n readonly trigger: SchedulerTrigger;\n }>\n | Readonly<{\n readonly kind: \"cancel-pending\";\n readonly taskIds: readonly string[];\n readonly trigger: SchedulerTrigger;\n }>\n | Readonly<{\n readonly cancelled: boolean;\n readonly kind: \"complete\";\n readonly trigger: SchedulerTrigger;\n }>\n );\n\nexport function reservationUnchanged(): ReservationUpdate {\n return Object.freeze({ kind: \"unchanged\" });\n}\n\nexport function reservationSet(taskId: string): ReservationUpdate {\n return Object.freeze({ kind: \"set\", taskId });\n}\n\nexport function reservationClear(): ReservationUpdate {\n return Object.freeze({ kind: \"clear\" });\n}\n\nexport function freezeDecision(decision: SchedulerDecision): SchedulerDecision {\n const trigger = freezeTrigger(decision.trigger);\n switch (decision.kind) {\n case \"admit\":\n case \"await-running\":\n return Object.freeze({ ...decision, trigger });\n case \"settle-blocked\":\n return Object.freeze({\n ...decision,\n dependencyIds: Object.freeze([...decision.dependencyIds]),\n trigger\n });\n case \"cancel-pending\":\n return Object.freeze({ ...decision, taskIds: Object.freeze([...decision.taskIds]), trigger });\n case \"complete\":\n return Object.freeze({ ...decision, trigger });\n }\n}\n\nfunction freezeTrigger(trigger: SchedulerTrigger): SchedulerTrigger {\n switch (trigger.kind) {\n case \"execution-started\":\n case \"admission-continued\":\n case \"cancellation-observed\":\n case \"cancellation-applied\":\n return Object.freeze({ kind: trigger.kind });\n case \"blocked-settled\":\n return Object.freeze({ kind: trigger.kind, taskId: trigger.taskId });\n case \"task-settled\":\n return Object.freeze({\n kind: trigger.kind,\n settlementKind: trigger.settlementKind,\n taskId: trigger.taskId\n });\n }\n}\n"]}
1
+ {"version":3,"file":"scheduler-decision-model.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-decision-model.ts"],"names":[],"mappings":"AAsHA,MAAM,UAAU,cAAc,CAAC,QAA2B;IACxD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChD,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,OAAO,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,GAAG,QAAQ;gBACX,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;gBACzD,OAAO;aACR,CAAC,CAAC;QACL,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAChG,KAAK,UAAU;YACb,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAyB;IAC9C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,mBAAmB,CAAC;QACzB,KAAK,qBAAqB,CAAC;QAC3B,KAAK,uBAAuB,CAAC;QAC7B,KAAK,sBAAsB;YACzB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,KAAK,iBAAiB;YACpB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,KAAK,cAAc;YACjB,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;IACP,CAAC;AACH,CAAC","sourcesContent":["import type { PlannedTaskGraph } from \"./graph.ts\";\nimport type { SchedulerGraphSnapshot } from \"../../project-definition/project-definition.ts\";\n\nexport type SchedulerSettlementKind =\n | \"completed\"\n | \"prerequisite-unsatisfied\"\n | \"failed\"\n | \"blocked\"\n | \"cancelled-before-start\";\n\nexport type SchedulerTrigger =\n | Readonly<{ readonly kind: \"execution-started\" }>\n | Readonly<{ readonly kind: \"admission-continued\" }>\n | Readonly<{ readonly kind: \"blocked-settled\"; readonly taskId: string }>\n | Readonly<{\n readonly kind: \"task-settled\";\n readonly settlementKind: SchedulerSettlementKind;\n readonly taskId: string;\n }>\n | Readonly<{ readonly kind: \"cancellation-observed\" }>\n | Readonly<{ readonly kind: \"cancellation-applied\" }>;\n\nexport interface SchedulerSnapshot {\n readonly graph: PlannedTaskGraph;\n readonly isAbortRequested: boolean;\n readonly isCancelled: boolean;\n readonly pendingTaskIds: readonly string[];\n readonly runningMutexes: readonly string[];\n readonly runningTaskIds: readonly string[];\n readonly settledTasks: readonly Readonly<{\n readonly kind: SchedulerSettlementKind;\n readonly taskId: string;\n }>[];\n readonly activeScopeIds: readonly string[];\n readonly maxParallel: number;\n}\n\nexport interface SchedulerCapacity {\n readonly effectiveMaxParallel: number;\n readonly maxParallel: number;\n readonly running: number;\n}\n\nexport interface SchedulerBlockerSummary {\n readonly dependency: number;\n readonly mutex: number;\n readonly resourceCapacity: number;\n readonly rootCapacity: boolean;\n readonly scopeCapacity: boolean;\n}\n\n/** The sole public Scheduler graph DTO; task identity is always `taskId`. */\nexport type { SchedulerGraphSnapshot } from \"../../project-definition/project-definition.ts\";\n\nexport interface SchedulerAdmissionCandidateFact {\n readonly canAdmit: boolean;\n readonly taskId: string;\n}\n\nexport type SchedulerAdmissionProposal =\n | Readonly<{ readonly kind: \"select\"; readonly taskId: string }>\n | Readonly<{ readonly kind: \"wait\" }>;\n\nexport type SchedulerAdmissionHardGuard =\n | Readonly<{\n readonly canAdmit: true;\n readonly isCandidate: true;\n readonly kind: \"select\";\n readonly lifecycleOpen: true;\n readonly taskId: string;\n }>\n | Readonly<{ readonly kind: \"wait\"; readonly runningCanDrain: true }>;\n\nexport interface SchedulerDecisionContext {\n readonly blockers: SchedulerBlockerSummary;\n readonly capacity: SchedulerCapacity;\n readonly graphIdentity: SchedulerGraphSnapshot;\n}\n\nexport type SchedulerDecision = SchedulerDecisionContext &\n (\n | Readonly<{\n readonly admissionPriority: number;\n readonly candidates: readonly SchedulerAdmissionCandidateFact[];\n readonly eligibleCount: number;\n readonly hardGuard: Extract<SchedulerAdmissionHardGuard, { readonly kind: \"select\" }>;\n readonly kind: \"admit\";\n readonly proposal: Extract<SchedulerAdmissionProposal, { readonly kind: \"select\" }>;\n readonly scopeToActivate: string | null;\n readonly taskId: string;\n readonly trigger: SchedulerTrigger;\n }>\n | Readonly<{\n readonly dependencyIds: readonly string[];\n readonly kind: \"settle-blocked\";\n readonly taskId: string;\n readonly trigger: SchedulerTrigger;\n }>\n | Readonly<{\n readonly candidates: readonly SchedulerAdmissionCandidateFact[];\n readonly eligibleCount: number;\n readonly hardGuard: Extract<SchedulerAdmissionHardGuard, { readonly kind: \"wait\" }>;\n readonly kind: \"await-running\";\n readonly proposal: SchedulerAdmissionProposal | null;\n readonly trigger: SchedulerTrigger;\n }>\n | Readonly<{\n readonly kind: \"cancel-pending\";\n readonly taskIds: readonly string[];\n readonly trigger: SchedulerTrigger;\n }>\n | Readonly<{\n readonly cancelled: boolean;\n readonly kind: \"complete\";\n readonly trigger: SchedulerTrigger;\n }>\n );\n\nexport function freezeDecision(decision: SchedulerDecision): SchedulerDecision {\n const trigger = freezeTrigger(decision.trigger);\n switch (decision.kind) {\n case \"admit\":\n case \"await-running\":\n return Object.freeze({ ...decision, trigger });\n case \"settle-blocked\":\n return Object.freeze({\n ...decision,\n dependencyIds: Object.freeze([...decision.dependencyIds]),\n trigger\n });\n case \"cancel-pending\":\n return Object.freeze({ ...decision, taskIds: Object.freeze([...decision.taskIds]), trigger });\n case \"complete\":\n return Object.freeze({ ...decision, trigger });\n }\n}\n\nfunction freezeTrigger(trigger: SchedulerTrigger): SchedulerTrigger {\n switch (trigger.kind) {\n case \"execution-started\":\n case \"admission-continued\":\n case \"cancellation-observed\":\n case \"cancellation-applied\":\n return Object.freeze({ kind: trigger.kind });\n case \"blocked-settled\":\n return Object.freeze({ kind: trigger.kind, taskId: trigger.taskId });\n case \"task-settled\":\n return Object.freeze({\n kind: trigger.kind,\n settlementKind: trigger.settlementKind,\n taskId: trigger.taskId\n });\n }\n}\n"]}
@@ -1,42 +1,53 @@
1
+ import { staticAdmissionSelectionPolicy } from "./admission-selection-policy.mjs";
1
2
  import { decideAdmission } from "./scheduler-admission-decision.mjs";
2
- import { decisionContext, inspectSnapshot, selectBlockedTask } from "./scheduler-decision-inspection.mjs";
3
- import { freezeDecision, reservationUnchanged } from "./scheduler-decision-model.mjs";
3
+ import { decisionContext } from "./scheduler-decision-inspection.mjs";
4
+ import { freezeDecision } from "./scheduler-decision-model.mjs";
5
+ import { compilePreparedAdmissionGraph, createAdmissionCoreFromSchedulerSnapshot, reconcileAdmissionCore, schedulerInspectionForCore } from "./admission-core/core.mjs";
4
6
  /**
5
7
  * Computes the next generic task-engine action from an immutable state projection.
6
8
  * Starting work, awaiting promises, cancellation, and diagnostic output remain in
7
9
  * the imperative scheduler shell.
8
10
  */
9
- export function decideScheduler(snapshot, trigger) {
10
- const state = inspectSnapshot(snapshot);
11
+ export function decideScheduler(snapshot, trigger, policy = staticAdmissionSelectionPolicy, measurement, admissionCore) {
12
+ const core = admissionCore ??
13
+ createAdmissionCoreFromSchedulerSnapshot(compilePreparedAdmissionGraph(snapshot.graph, snapshot.maxParallel), snapshot);
14
+ if (admissionCore === undefined) {
15
+ const reconciliation = reconcileAdmissionCore(core);
16
+ const forced = reconciliation.effects.find((effect) => effect.kind === "settled" && effect.settlementKind === "blocked");
17
+ if (forced?.kind === "settled" && forced.settlementKind === "blocked") {
18
+ return freezeDecision({
19
+ ...decisionContext(Object.freeze({
20
+ ...schedulerInspectionForCore(core),
21
+ isAbortRequested: snapshot.isAbortRequested,
22
+ isCancelled: snapshot.isCancelled
23
+ }), core.compiled.graph.schedulerGraphSnapshot),
24
+ dependencyIds: forced.dependencyIds ?? [],
25
+ kind: "settle-blocked",
26
+ taskId: forced.taskId,
27
+ trigger
28
+ });
29
+ }
30
+ }
31
+ const coreInspection = schedulerInspectionForCore(core);
32
+ const state = Object.freeze({
33
+ ...coreInspection,
34
+ isAbortRequested: snapshot.isAbortRequested,
35
+ isCancelled: snapshot.isCancelled
36
+ });
11
37
  const cycle = Object.freeze({
12
- context: decisionContext(state),
38
+ admissionCore: core,
39
+ context: decisionContext(state, state.graph.schedulerGraphSnapshot),
40
+ policy,
13
41
  state,
42
+ ...(measurement === undefined ? {} : { measurement }),
14
43
  trigger
15
44
  });
16
45
  const terminalDecision = decideTerminalSchedulerAction(cycle, snapshot);
17
46
  if (terminalDecision !== undefined)
18
47
  return terminalDecision;
19
- const blocked = selectBlockedTask(state);
20
- if (blocked !== undefined) {
21
- return freezeDecision({
22
- ...cycle.context,
23
- dependencyIds: blocked.dependencyIds,
24
- kind: "settle-blocked",
25
- taskId: blocked.task.id,
26
- trigger
27
- });
28
- }
29
48
  return decideAdmission(cycle);
30
49
  }
31
50
  function decideTerminalSchedulerAction(cycle, snapshot) {
32
- if (cycle.state.pendingTasks.length === 0 && cycle.state.runningTaskIds.size === 0) {
33
- return freezeDecision({
34
- ...cycle.context,
35
- cancelled: snapshot.isCancelled,
36
- kind: "complete",
37
- trigger: cycle.trigger
38
- });
39
- }
40
51
  if (snapshot.isAbortRequested && !snapshot.isCancelled) {
41
52
  return freezeDecision({
42
53
  ...cycle.context,
@@ -45,6 +56,14 @@ function decideTerminalSchedulerAction(cycle, snapshot) {
45
56
  trigger: Object.freeze({ kind: "cancellation-observed" })
46
57
  });
47
58
  }
59
+ if (cycle.state.pendingTasks.length === 0 && cycle.state.runningTaskIds.length === 0) {
60
+ return freezeDecision({
61
+ ...cycle.context,
62
+ cancelled: snapshot.isCancelled,
63
+ kind: "complete",
64
+ trigger: cycle.trigger
65
+ });
66
+ }
48
67
  if (snapshot.isCancelled) {
49
68
  if (cycle.state.pendingTasks.length > 0) {
50
69
  throw new Error("cancelled scheduler state retains pending tasks");
@@ -56,18 +75,19 @@ function decideTerminalSchedulerAction(cycle, snapshot) {
56
75
  return undefined;
57
76
  }
58
77
  function cancellationDrainDecision(cycle) {
59
- return awaitDrainDecision(cycle, "cancellation-drain");
78
+ return awaitDrainDecision(cycle);
60
79
  }
61
80
  function runningDrainDecision(cycle) {
62
- return awaitDrainDecision(cycle, "running-drain");
81
+ return awaitDrainDecision(cycle);
63
82
  }
64
- function awaitDrainDecision(cycle, reason) {
83
+ function awaitDrainDecision(cycle) {
65
84
  return freezeDecision({
66
85
  ...cycle.context,
86
+ candidates: Object.freeze([]),
67
87
  eligibleCount: 0,
88
+ hardGuard: Object.freeze({ kind: "wait", runningCanDrain: true }),
68
89
  kind: "await-running",
69
- reason,
70
- reservationUpdate: reservationUnchanged(),
90
+ proposal: null,
71
91
  trigger: cycle.trigger
72
92
  });
73
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler-decision.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-decision.ts"],"names":[],"mappings":"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","sourcesContent":["import { decideAdmission, type SchedulerDecisionCycle } from \"./scheduler-admission-decision.ts\";\nimport {\n decisionContext,\n inspectSnapshot,\n selectBlockedTask\n} from \"./scheduler-decision-inspection.ts\";\nimport { freezeDecision, reservationUnchanged } from \"./scheduler-decision-model.ts\";\nimport type {\n SchedulerDecision,\n SchedulerSnapshot,\n SchedulerTrigger\n} from \"./scheduler-decision-model.ts\";\n\nexport type {\n SchedulerDecision,\n SchedulerSettlementKind,\n SchedulerSnapshot,\n SchedulerTrigger\n} from \"./scheduler-decision-model.ts\";\n\n/**\n * Computes the next generic task-engine action from an immutable state projection.\n * Starting work, awaiting promises, cancellation, and diagnostic output remain in\n * the imperative scheduler shell.\n */\nexport function decideScheduler(\n snapshot: SchedulerSnapshot,\n trigger: SchedulerTrigger\n): SchedulerDecision {\n const state = inspectSnapshot(snapshot);\n const cycle: SchedulerDecisionCycle = Object.freeze({\n context: decisionContext(state),\n state,\n trigger\n });\n const terminalDecision = decideTerminalSchedulerAction(cycle, snapshot);\n if (terminalDecision !== undefined) return terminalDecision;\n\n const blocked = selectBlockedTask(state);\n if (blocked !== undefined) {\n return freezeDecision({\n ...cycle.context,\n dependencyIds: blocked.dependencyIds,\n kind: \"settle-blocked\",\n taskId: blocked.task.id,\n trigger\n });\n }\n\n return decideAdmission(cycle);\n}\n\nfunction decideTerminalSchedulerAction(\n cycle: SchedulerDecisionCycle,\n snapshot: SchedulerSnapshot\n): SchedulerDecision | undefined {\n if (cycle.state.pendingTasks.length === 0 && cycle.state.runningTaskIds.size === 0) {\n return freezeDecision({\n ...cycle.context,\n cancelled: snapshot.isCancelled,\n kind: \"complete\",\n trigger: cycle.trigger\n });\n }\n if (snapshot.isAbortRequested && !snapshot.isCancelled) {\n return freezeDecision({\n ...cycle.context,\n kind: \"cancel-pending\",\n taskIds: snapshot.pendingTaskIds,\n trigger: Object.freeze({ kind: \"cancellation-observed\" })\n });\n }\n if (snapshot.isCancelled) {\n if (cycle.state.pendingTasks.length > 0) {\n throw new Error(\"cancelled scheduler state retains pending tasks\");\n }\n return cancellationDrainDecision(cycle);\n }\n if (cycle.state.pendingTasks.length === 0) return runningDrainDecision(cycle);\n return undefined;\n}\n\nfunction cancellationDrainDecision(cycle: SchedulerDecisionCycle): SchedulerDecision {\n return awaitDrainDecision(cycle, \"cancellation-drain\");\n}\n\nfunction runningDrainDecision(cycle: SchedulerDecisionCycle): SchedulerDecision {\n return awaitDrainDecision(cycle, \"running-drain\");\n}\n\nfunction awaitDrainDecision(\n cycle: SchedulerDecisionCycle,\n reason: Extract<SchedulerDecision, { readonly kind: \"await-running\" }>[\"reason\"]\n): SchedulerDecision {\n return freezeDecision({\n ...cycle.context,\n eligibleCount: 0,\n kind: \"await-running\",\n reason,\n reservationUpdate: reservationUnchanged(),\n trigger: cycle.trigger\n });\n}\n"]}
1
+ {"version":3,"file":"scheduler-decision.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-decision.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionSelectionPolicy } from \"./admission-selection-policy.ts\";\nimport type { AdmissionPolicyContext } from \"../../project-definition/project-definition.ts\";\nimport { staticAdmissionSelectionPolicy } from \"./admission-selection-policy.ts\";\nimport { decideAdmission, type SchedulerDecisionCycle } from \"./scheduler-admission-decision.ts\";\nimport { decisionContext } from \"./scheduler-decision-inspection.ts\";\nimport { freezeDecision } from \"./scheduler-decision-model.ts\";\nimport type {\n SchedulerDecision,\n SchedulerSnapshot,\n SchedulerTrigger\n} from \"./scheduler-decision-model.ts\";\nimport {\n compilePreparedAdmissionGraph,\n createAdmissionCoreFromSchedulerSnapshot,\n reconcileAdmissionCore,\n schedulerInspectionForCore,\n type AdmissionCoreState\n} from \"./admission-core/core.ts\";\n\nexport type {\n SchedulerDecision,\n SchedulerSettlementKind,\n SchedulerSnapshot,\n SchedulerTrigger\n} from \"./scheduler-decision-model.ts\";\n\n/**\n * Computes the next generic task-engine action from an immutable state projection.\n * Starting work, awaiting promises, cancellation, and diagnostic output remain in\n * the imperative scheduler shell.\n */\nexport function decideScheduler(\n snapshot: SchedulerSnapshot,\n trigger: SchedulerTrigger,\n policy: AdmissionSelectionPolicy = staticAdmissionSelectionPolicy,\n measurement?: () => AdmissionPolicyContext[\"measurement\"],\n admissionCore?: AdmissionCoreState\n): SchedulerDecision {\n const core =\n admissionCore ??\n createAdmissionCoreFromSchedulerSnapshot(\n compilePreparedAdmissionGraph(snapshot.graph, snapshot.maxParallel),\n snapshot\n );\n if (admissionCore === undefined) {\n const reconciliation = reconcileAdmissionCore(core);\n const forced = reconciliation.effects.find(\n (effect) => effect.kind === \"settled\" && effect.settlementKind === \"blocked\"\n );\n if (forced?.kind === \"settled\" && forced.settlementKind === \"blocked\") {\n return freezeDecision({\n ...decisionContext(\n Object.freeze({\n ...schedulerInspectionForCore(core),\n isAbortRequested: snapshot.isAbortRequested,\n isCancelled: snapshot.isCancelled\n }),\n core.compiled.graph.schedulerGraphSnapshot\n ),\n dependencyIds: forced.dependencyIds ?? [],\n kind: \"settle-blocked\",\n taskId: forced.taskId,\n trigger\n });\n }\n }\n const coreInspection = schedulerInspectionForCore(core);\n const state = Object.freeze({\n ...coreInspection,\n isAbortRequested: snapshot.isAbortRequested,\n isCancelled: snapshot.isCancelled\n });\n const cycle: SchedulerDecisionCycle = Object.freeze({\n admissionCore: core,\n context: decisionContext(state, state.graph.schedulerGraphSnapshot),\n policy,\n state,\n ...(measurement === undefined ? {} : { measurement }),\n trigger\n });\n const terminalDecision = decideTerminalSchedulerAction(cycle, snapshot);\n if (terminalDecision !== undefined) return terminalDecision;\n\n return decideAdmission(cycle);\n}\n\nfunction decideTerminalSchedulerAction(\n cycle: SchedulerDecisionCycle,\n snapshot: SchedulerSnapshot\n): SchedulerDecision | undefined {\n if (snapshot.isAbortRequested && !snapshot.isCancelled) {\n return freezeDecision({\n ...cycle.context,\n kind: \"cancel-pending\",\n taskIds: snapshot.pendingTaskIds,\n trigger: Object.freeze({ kind: \"cancellation-observed\" })\n });\n }\n if (cycle.state.pendingTasks.length === 0 && cycle.state.runningTaskIds.length === 0) {\n return freezeDecision({\n ...cycle.context,\n cancelled: snapshot.isCancelled,\n kind: \"complete\",\n trigger: cycle.trigger\n });\n }\n if (snapshot.isCancelled) {\n if (cycle.state.pendingTasks.length > 0) {\n throw new Error(\"cancelled scheduler state retains pending tasks\");\n }\n return cancellationDrainDecision(cycle);\n }\n if (cycle.state.pendingTasks.length === 0) return runningDrainDecision(cycle);\n return undefined;\n}\n\nfunction cancellationDrainDecision(cycle: SchedulerDecisionCycle): SchedulerDecision {\n return awaitDrainDecision(cycle);\n}\n\nfunction runningDrainDecision(cycle: SchedulerDecisionCycle): SchedulerDecision {\n return awaitDrainDecision(cycle);\n}\n\nfunction awaitDrainDecision(cycle: SchedulerDecisionCycle): SchedulerDecision {\n return freezeDecision({\n ...cycle.context,\n candidates: Object.freeze([]),\n eligibleCount: 0,\n hardGuard: Object.freeze({ kind: \"wait\", runningCanDrain: true }),\n kind: \"await-running\",\n proposal: null,\n trigger: cycle.trigger\n });\n}\n"]}
@@ -0,0 +1,89 @@
1
+ import { createHash } from "node:crypto";
2
+ import { diagnosticTags } from "../diagnostic-logging/logger.mjs";
3
+ import { schedulerInspectionForCore, validateAdmissionCoreSelection } from "./admission-core/core.mjs";
4
+ /** Fault logging is observational and therefore excluded from Scheduler control-path timing. */
5
+ export function observeAdmissionPolicyFault(state, fault) {
6
+ observeSchedulerDiagnostic(state, {
7
+ event: "scheduler.admission-policy-failed",
8
+ tags: diagnosticTags("ADMISSION_POLICY_FAILED", fault.category.toUpperCase()),
9
+ details: Object.freeze({ category: fault.category })
10
+ });
11
+ }
12
+ export function observeSchedulerDecision(state, decision, diagnostics) {
13
+ const observation = {
14
+ event: "scheduler.decision",
15
+ tags: schedulerDecisionTags(decision),
16
+ details: schedulerDecisionDetails(decision)
17
+ };
18
+ const observe = () => observeSchedulerDiagnostic(state, observation);
19
+ if (diagnostics === undefined)
20
+ observe();
21
+ else
22
+ diagnostics.observeDecision(observe);
23
+ }
24
+ /** One immutable graph record makes the enclosing scheduler channel the self-contained evidence unit. */
25
+ export function observeSchedulerGraph(state) {
26
+ const graph = state.graph.schedulerGraphSnapshot;
27
+ observeSchedulerDiagnostic(state, {
28
+ event: "scheduler.graph",
29
+ tags: diagnosticTags("GRAPH"),
30
+ details: Object.freeze({ graph, graphFingerprint: schedulerGraphFingerprint(graph) })
31
+ });
32
+ }
33
+ export function schedulerGraphFingerprint(graph) {
34
+ return createHash("sha256").update(JSON.stringify(graph)).digest("hex");
35
+ }
36
+ function schedulerDecisionDetails(decision) {
37
+ const { graphIdentity, ...dynamicFacts } = decision;
38
+ return Object.freeze({
39
+ ...dynamicFacts,
40
+ graphFingerprint: schedulerGraphFingerprint(graphIdentity)
41
+ });
42
+ }
43
+ /** Logger failures are observational and must not revise Scheduler lifecycle state. */
44
+ export function observeSchedulerDiagnostic(state, observation) {
45
+ try {
46
+ state.diagnosticLogger?.observe(observation);
47
+ }
48
+ catch {
49
+ // Invocation logging has its own containment; retain it for direct Scheduler seams as well.
50
+ }
51
+ }
52
+ export function performanceState(state) {
53
+ const inspection = schedulerInspectionForCore(state.admissionCore);
54
+ const admissionViablePendingTasks = [];
55
+ for (const task of inspection.pendingTasks) {
56
+ const validation = validateAdmissionCoreSelection(state.admissionCore, task.id);
57
+ if (validation.accepted) {
58
+ admissionViablePendingTasks.push(Object.freeze({ kind: "admissible-pending", taskId: task.id }));
59
+ continue;
60
+ }
61
+ switch (validation.reason.kind) {
62
+ case "mutex-held":
63
+ admissionViablePendingTasks.push(Object.freeze({ kind: "mutex-blocked", taskId: task.id }));
64
+ continue;
65
+ case "root-capacity-reached":
66
+ case "scope-capacity-reached":
67
+ case "resource-capacity-insufficient":
68
+ admissionViablePendingTasks.push(Object.freeze({ kind: "capacity-blocked", taskId: task.id }));
69
+ continue;
70
+ case "depends-on-pending":
71
+ case "observes-pending":
72
+ continue;
73
+ case "not-pending":
74
+ case "state-complete":
75
+ case "unknown-task":
76
+ throw new Error("shared admission core disagrees with Scheduler pending state");
77
+ }
78
+ }
79
+ return Object.freeze({
80
+ admissionViablePendingTasks: Object.freeze(admissionViablePendingTasks),
81
+ effectiveMaxParallel: inspection.effectiveMaxParallel,
82
+ rootMaxParallel: inspection.maxParallel,
83
+ running: inspection.runningTaskIds.length
84
+ });
85
+ }
86
+ function schedulerDecisionTags(decision) {
87
+ return diagnosticTags(decision.kind.toUpperCase(), ...("taskId" in decision ? [`TASK:${decision.taskId}`] : []));
88
+ }
89
+ //# sourceMappingURL=scheduler-observation.mjs.map
@@ -0,0 +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"]}