@zxyycom/vibe-check 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/README.md +36 -5
  2. package/dist/esm/check/check.mjs +4 -0
  3. package/dist/esm/check/check.mjs.map +1 -1
  4. package/dist/esm/check/flag-enablement.mjs +32 -0
  5. package/dist/esm/check/flag-enablement.mjs.map +1 -0
  6. package/dist/esm/check/handoff-provider-identity.mjs +18 -0
  7. package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
  8. package/dist/esm/check/inherited-collection.mjs +1 -1
  9. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  10. package/dist/esm/check/project-changes.mjs +2 -0
  11. package/dist/esm/check/project-changes.mjs.map +1 -0
  12. package/dist/esm/check/project-context.mjs +2 -0
  13. package/dist/esm/check/project-context.mjs.map +1 -0
  14. package/dist/esm/check-settlement/facts.mjs.map +1 -1
  15. package/dist/esm/check-settlement/record-store.mjs +1 -1
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/data-boundary/canonical-data.mjs +36 -7
  18. package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
  19. package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
  20. package/dist/esm/data-boundary/closed-values.mjs +28 -4
  21. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  22. package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
  23. package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
  24. package/dist/esm/data-boundary/project-path.mjs +19 -0
  25. package/dist/esm/data-boundary/project-path.mjs.map +1 -0
  26. package/dist/esm/index.mjs +12 -5
  27. package/dist/esm/index.mjs.map +1 -1
  28. package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
  29. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  30. package/dist/esm/package-checks/check-authoring.mjs +69 -0
  31. package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
  32. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
  33. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
  34. package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
  35. package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
  36. package/dist/esm/package-checks/command-check/contract.mjs +2 -0
  37. package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
  38. package/dist/esm/package-checks/command-check/execution.mjs +134 -0
  39. package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
  40. package/dist/esm/package-checks/command-check/options.mjs +284 -0
  41. package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
  42. package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
  43. package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
  44. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
  45. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  46. package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
  47. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  48. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
  50. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  54. package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
  55. package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
  56. package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
  57. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  58. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
  59. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
  60. package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
  61. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  62. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  63. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  64. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
  65. package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
  66. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
  67. package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
  68. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
  69. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  70. package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
  71. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  72. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
  73. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
  74. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
  75. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
  76. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
  77. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
  78. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
  79. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
  80. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
  81. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
  82. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
  83. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
  84. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
  85. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
  86. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
  87. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
  88. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
  89. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
  90. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
  91. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
  92. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
  93. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
  94. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
  95. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
  96. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
  97. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
  98. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
  99. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
  100. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
  101. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
  102. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
  103. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
  104. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
  105. package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
  106. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  107. package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
  108. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  109. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
  110. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
  111. package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
  112. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  113. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  114. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  115. package/dist/esm/package-checks/host-environment/git.mjs +11 -0
  116. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  117. package/dist/esm/package-checks/host-environment/path.mjs +1 -17
  118. package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
  119. package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
  120. package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
  121. package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
  122. package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
  123. package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
  124. package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
  125. package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
  126. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  127. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
  128. package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
  129. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
  130. package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
  131. package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
  132. package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
  133. package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
  134. package/dist/esm/package-checks/local-cache-options.mjs +28 -0
  135. package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
  136. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
  137. package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
  138. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
  139. package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
  140. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
  141. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  142. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
  143. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  144. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
  145. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
  146. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
  147. package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
  148. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
  149. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  150. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
  151. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  152. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  153. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
  154. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
  155. package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
  156. package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
  157. package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
  158. package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
  159. package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
  160. package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
  161. package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
  162. package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
  163. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
  164. package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
  165. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
  166. package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
  167. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
  168. package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
  169. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
  170. package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
  171. package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
  172. package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
  173. package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
  174. package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
  175. package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
  176. package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
  177. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
  178. package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
  179. package/dist/esm/package-checks/project-files/collection.mjs +23 -19
  180. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  181. package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
  182. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  183. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
  184. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  185. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
  186. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  187. package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
  188. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
  189. package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
  190. package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
  191. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
  192. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  193. package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
  194. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
  195. package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
  196. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
  197. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
  198. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
  199. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
  200. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
  201. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
  202. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
  203. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
  204. package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
  205. package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
  206. package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
  207. package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
  208. package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
  209. package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
  210. package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
  211. package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  212. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
  213. package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  214. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
  215. package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  216. package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
  217. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
  218. package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
  219. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
  220. package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
  221. package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
  222. package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
  223. package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
  224. package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
  225. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  226. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
  227. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
  228. package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
  229. package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
  230. package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
  231. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  232. package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
  233. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  234. package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
  235. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
  236. package/dist/esm/project-definition/project-changes.mjs +70 -0
  237. package/dist/esm/project-definition/project-changes.mjs.map +1 -0
  238. package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
  239. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  240. package/dist/esm/project-definition/project-definition.mjs +22 -15
  241. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  242. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
  243. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
  244. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
  245. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
  246. package/dist/esm/project-run/aggregation.mjs +42 -59
  247. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  248. package/dist/esm/project-run/changes/git.mjs +161 -0
  249. package/dist/esm/project-run/changes/git.mjs.map +1 -0
  250. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
  251. package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
  252. package/dist/esm/project-run/check-execution/callback.mjs +3 -2
  253. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  254. package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
  255. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  256. package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
  257. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  258. package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
  259. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  260. package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
  261. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
  262. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
  263. package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
  264. package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
  265. package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
  266. package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
  267. package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
  268. package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
  269. package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
  270. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  271. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
  272. package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
  273. package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
  274. package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
  275. package/dist/esm/project-run/completion/completion.mjs +18 -1
  276. package/dist/esm/project-run/completion/completion.mjs.map +1 -1
  277. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  278. package/dist/esm/project-run/controls/validation.mjs +7 -54
  279. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  280. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
  281. package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
  282. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
  283. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
  284. package/dist/esm/project-run/invocation/candidate.mjs +17 -13
  285. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
  286. package/dist/esm/project-run/invocation/candidates.mjs +26 -0
  287. package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
  288. package/dist/esm/project-run/invocation/creation.mjs +7 -3
  289. package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
  290. package/dist/esm/project-run/invocation/execution.mjs +98 -0
  291. package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
  292. package/dist/esm/project-run/invocation/run.mjs +13 -112
  293. package/dist/esm/project-run/invocation/run.mjs.map +1 -1
  294. package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
  295. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
  296. package/dist/esm/project-run/outputs/status.mjs +12 -12
  297. package/dist/esm/project-run/outputs/status.mjs.map +1 -1
  298. package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
  299. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  300. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
  301. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  302. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
  303. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  304. package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
  305. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  306. package/dist/esm/project-run/project-context.mjs +2 -1
  307. package/dist/esm/project-run/project-context.mjs.map +1 -1
  308. package/dist/esm/project-run/result.mjs +2 -2
  309. package/dist/esm/project-run/result.mjs.map +1 -1
  310. package/dist/esm/project-run/run.mjs.map +1 -1
  311. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
  312. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
  313. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
  314. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
  315. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
  316. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
  317. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
  318. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
  319. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
  320. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
  321. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  322. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
  323. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
  324. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
  325. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
  326. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
  327. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
  328. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
  329. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
  330. package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
  331. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  332. package/docs/api-mechanics.md +147 -28
  333. package/docs/changelog.md +145 -2
  334. package/docs/checks/duplicate-detection.md +22 -3
  335. package/docs/checks/file-metrics.md +25 -6
  336. package/docs/checks/function-metrics.md +21 -2
  337. package/docs/checks/json-schema-validation.md +25 -4
  338. package/docs/checks/json-validation.md +24 -5
  339. package/docs/checks/maintenance-reminders.md +30 -6
  340. package/docs/checks/markdown-link-validation.md +24 -4
  341. package/docs/checks/markdown-lint.md +167 -0
  342. package/docs/checks/secret-detection.md +31 -7
  343. package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
  344. package/docs/guides/building-project-gate.md +706 -0
  345. package/docs/guides/callbacks.md +81 -22
  346. package/docs/guides/check-dependencies.md +41 -10
  347. package/docs/guides/collecting-project-files.md +7 -7
  348. package/docs/guides/command-check.md +155 -0
  349. package/docs/guides/data-boundaries.md +140 -0
  350. package/docs/guides/extending-check-lifecycle.md +77 -25
  351. package/docs/guides/finding-waivers.md +43 -1
  352. package/docs/guides/learned-scheduling.md +1 -1
  353. package/docs/guides/run-outputs.md +35 -9
  354. package/docs/guides/scheduling.md +15 -15
  355. package/docs/output.md +6 -5
  356. package/package.json +2 -1
  357. package/src/check/check.ts +332 -92
  358. package/src/check/flag-enablement.ts +76 -0
  359. package/src/check/handoff-provider-identity.ts +34 -0
  360. package/src/check/inherited-collection.ts +1 -1
  361. package/src/check/project-changes.ts +14 -0
  362. package/src/check/project-context.ts +11 -0
  363. package/src/check-settlement/facts.ts +1 -1
  364. package/src/check-settlement/record-store.ts +1 -1
  365. package/src/data-boundary/canonical-data.ts +36 -9
  366. package/src/data-boundary/canonical-json.ts +18 -1
  367. package/src/data-boundary/closed-values.ts +26 -6
  368. package/src/data-boundary/config-glob.ts +17 -0
  369. package/src/data-boundary/project-path.ts +21 -0
  370. package/src/index.ts +72 -11
  371. package/src/machine-output/v4/atomic-publication.ts +3 -1
  372. package/src/package-checks/check-authoring.ts +136 -0
  373. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
  374. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
  375. package/src/package-checks/command-check/command-check.ts +152 -0
  376. package/src/package-checks/command-check/contract.ts +168 -0
  377. package/src/package-checks/command-check/execution.ts +211 -0
  378. package/src/package-checks/command-check/options.ts +331 -0
  379. package/src/package-checks/command-check/transcript.ts +35 -0
  380. package/src/package-checks/duplicate-detection/default-check.ts +37 -6
  381. package/src/package-checks/duplicate-detection/execution.ts +2 -4
  382. package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
  383. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  384. package/src/package-checks/duplicate-detection/options.ts +6 -3
  385. package/src/package-checks/duplicate-detection/records.ts +1 -1
  386. package/src/package-checks/file-metrics/constructor.ts +29 -6
  387. package/src/package-checks/file-metrics/execution.ts +2 -4
  388. package/src/package-checks/file-metrics/finding-messages.ts +1 -1
  389. package/src/package-checks/file-metrics/options.ts +6 -3
  390. package/src/package-checks/file-metrics/records.ts +1 -1
  391. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  392. package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
  393. package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
  394. package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
  395. package/src/package-checks/function-metrics/analysis.ts +7 -2
  396. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
  397. package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
  398. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
  399. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
  400. package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
  401. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
  402. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
  403. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
  404. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
  405. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
  406. package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
  407. package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
  408. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
  409. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
  410. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
  411. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
  412. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
  413. package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
  414. package/src/package-checks/function-metrics/constructor.ts +30 -7
  415. package/src/package-checks/function-metrics/execution.ts +2 -4
  416. package/src/package-checks/function-metrics/finding-messages.ts +2 -2
  417. package/src/package-checks/function-metrics/measurement.ts +3 -1
  418. package/src/package-checks/function-metrics/options.ts +6 -3
  419. package/src/package-checks/function-metrics/records.ts +1 -1
  420. package/src/package-checks/host-environment/git.ts +11 -0
  421. package/src/package-checks/host-environment/path.ts +1 -20
  422. package/src/package-checks/host-environment/process/contract.ts +17 -9
  423. package/src/package-checks/host-environment/process/result.ts +48 -20
  424. package/src/package-checks/host-environment/process/runner.ts +8 -4
  425. package/src/package-checks/json-schema-validation/default-check.ts +38 -5
  426. package/src/package-checks/json-schema-validation/options.ts +4 -1
  427. package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
  428. package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
  429. package/src/package-checks/json-validation/default-check.ts +27 -6
  430. package/src/package-checks/json-validation/options.ts +4 -1
  431. package/src/package-checks/local-cache-options.ts +40 -0
  432. package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
  433. package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
  434. package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
  435. package/src/package-checks/markdown-link-validation/execution.ts +1 -1
  436. package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
  437. package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
  438. package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
  439. package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
  440. package/src/package-checks/markdown-link-validation/options.ts +6 -7
  441. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
  442. package/src/package-checks/markdown-lint/adapter.ts +167 -0
  443. package/src/package-checks/markdown-lint/default-check.ts +92 -0
  444. package/src/package-checks/markdown-lint/execution.ts +266 -0
  445. package/src/package-checks/markdown-lint/final-data.ts +33 -0
  446. package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
  447. package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
  448. package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
  449. package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
  450. package/src/package-checks/markdown-lint/options-validation.ts +50 -0
  451. package/src/package-checks/markdown-lint/options.ts +82 -0
  452. package/src/package-checks/markdown-lint/records.ts +132 -0
  453. package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
  454. package/src/package-checks/project-files/collection.ts +38 -22
  455. package/src/package-checks/project-files/config-glob.ts +1 -17
  456. package/src/package-checks/project-files/configuration.ts +1 -1
  457. package/src/package-checks/project-files/gitlink-revision.ts +4 -6
  458. package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
  459. package/src/package-checks/project-files/public-collection.ts +1 -1
  460. package/src/package-checks/project-files/revision-paths.ts +3 -3
  461. package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
  462. package/src/package-checks/secret-detection/default-check.ts +29 -6
  463. package/src/package-checks/secret-detection/execution.ts +2 -2
  464. package/src/package-checks/secret-detection/input-preparation.ts +64 -7
  465. package/src/package-checks/secret-detection/options.ts +5 -2
  466. package/src/package-checks/secret-detection/records.ts +1 -1
  467. package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
  468. package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
  469. package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
  470. package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
  471. package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
  472. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
  473. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
  474. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
  475. package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
  476. package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
  477. package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
  478. package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
  479. package/src/project-definition/check-tree/authoring.ts +15 -8
  480. package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
  481. package/src/project-definition/check-tree/flag-conditions.ts +99 -0
  482. package/src/project-definition/check-tree/materialization.ts +12 -8
  483. package/src/project-definition/check-tree/resolution.ts +13 -15
  484. package/src/project-definition/declarative-snapshot.ts +9 -2
  485. package/src/project-definition/project-changes.ts +112 -0
  486. package/src/project-definition/project-definition-validation.ts +58 -10
  487. package/src/project-definition/project-definition.ts +41 -68
  488. package/src/project-definition/scheduler-policy.ts +6 -3
  489. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
  490. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
  491. package/src/project-run/aggregation.ts +51 -74
  492. package/src/project-run/changes/git.ts +206 -0
  493. package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
  494. package/src/project-run/check-execution/callback.ts +3 -2
  495. package/src/project-run/check-execution/dependencies.ts +120 -6
  496. package/src/project-run/check-execution/execution-finalization.ts +6 -4
  497. package/src/project-run/check-execution/execution-settlement.ts +88 -29
  498. package/src/project-run/check-execution/flag-controls.ts +22 -8
  499. package/src/project-run/check-execution/lifecycle.ts +14 -6
  500. package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
  501. package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
  502. package/src/project-run/check-execution/ready-check-execution.ts +97 -0
  503. package/src/project-run/check-execution/resolved-checks.ts +40 -219
  504. package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
  505. package/src/project-run/check-execution/terminal-result.ts +108 -29
  506. package/src/project-run/completion/completion.ts +17 -3
  507. package/src/project-run/controls/contract.ts +6 -16
  508. package/src/project-run/controls/validation.ts +7 -60
  509. package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
  510. package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
  511. package/src/project-run/invocation/candidate.ts +28 -15
  512. package/src/project-run/invocation/candidates.ts +56 -0
  513. package/src/project-run/invocation/creation.ts +7 -3
  514. package/src/project-run/invocation/execution.ts +136 -0
  515. package/src/project-run/invocation/run.ts +15 -179
  516. package/src/project-run/invocation/scheduler.ts +13 -6
  517. package/src/project-run/outputs/status.ts +15 -15
  518. package/src/project-run/progress-rendering/presentation.ts +35 -13
  519. package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
  520. package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
  521. package/src/project-run/progress-rendering/renderer.ts +10 -4
  522. package/src/project-run/project-context.ts +8 -4
  523. package/src/project-run/result.ts +5 -5
  524. package/src/project-run/run.ts +1 -1
  525. package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
  526. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
  527. package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
  528. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
  529. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
  530. package/src/project-run/task-scheduler/execution-state.ts +4 -4
  531. package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
  532. package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
  533. package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
  534. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
  535. package/src/project-run/task-scheduler/scheduler.ts +23 -6
  536. package/types/check/check.d.ts +178 -67
  537. package/types/check/flag-enablement.d.ts +42 -0
  538. package/types/check/handoff-provider-identity.d.ts +12 -0
  539. package/types/check/project-changes.d.ts +13 -0
  540. package/types/check/project-context.d.ts +10 -0
  541. package/types/check-settlement/facts.d.ts +1 -1
  542. package/types/data-boundary/canonical-data.d.ts +28 -5
  543. package/types/data-boundary/canonical-json.d.ts +18 -1
  544. package/types/data-boundary/closed-values.d.ts +17 -1
  545. package/types/data-boundary/config-glob.d.ts +5 -0
  546. package/types/data-boundary/project-path.d.ts +4 -0
  547. package/types/index.d.ts +27 -11
  548. package/types/package-checks/check-authoring.d.ts +45 -0
  549. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
  550. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
  551. package/types/package-checks/command-check/command-check.d.ts +48 -0
  552. package/types/package-checks/command-check/contract.d.ts +108 -0
  553. package/types/package-checks/command-check/execution.d.ts +7 -0
  554. package/types/package-checks/command-check/options.d.ts +11 -0
  555. package/types/package-checks/command-check/transcript.d.ts +8 -0
  556. package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
  557. package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
  558. package/types/package-checks/duplicate-detection/options.d.ts +4 -3
  559. package/types/package-checks/duplicate-detection/records.d.ts +1 -1
  560. package/types/package-checks/file-metrics/constructor.d.ts +5 -2
  561. package/types/package-checks/file-metrics/options.d.ts +4 -3
  562. package/types/package-checks/file-metrics/records.d.ts +1 -1
  563. package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
  564. package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
  565. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
  566. package/types/package-checks/function-metrics/constructor.d.ts +5 -2
  567. package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
  568. package/types/package-checks/function-metrics/options.d.ts +4 -3
  569. package/types/package-checks/function-metrics/records.d.ts +1 -1
  570. package/types/package-checks/host-environment/git.d.ts +2 -0
  571. package/types/package-checks/host-environment/path.d.ts +1 -3
  572. package/types/package-checks/host-environment/process/contract.d.ts +17 -9
  573. package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
  574. package/types/package-checks/json-schema-validation/options.d.ts +2 -1
  575. package/types/package-checks/json-validation/default-check.d.ts +4 -1
  576. package/types/package-checks/json-validation/options.d.ts +2 -1
  577. package/types/package-checks/local-cache-options.d.ts +9 -0
  578. package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
  579. package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
  580. package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
  581. package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
  582. package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
  583. package/types/package-checks/markdown-lint/execution.d.ts +24 -0
  584. package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
  585. package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
  586. package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
  587. package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
  588. package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
  589. package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
  590. package/types/package-checks/markdown-lint/options.d.ts +65 -0
  591. package/types/package-checks/markdown-lint/records.d.ts +39 -0
  592. package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
  593. package/types/package-checks/secret-detection/default-check.d.ts +4 -1
  594. package/types/package-checks/secret-detection/options.d.ts +3 -2
  595. package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
  596. package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
  597. package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
  598. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
  599. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
  600. package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
  601. package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
  602. package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
  603. package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
  604. package/types/project-definition/check-tree/authoring.d.ts +5 -3
  605. package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
  606. package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
  607. package/types/project-definition/check-tree/resolution.d.ts +6 -4
  608. package/types/project-definition/declarative-snapshot.d.ts +4 -1
  609. package/types/project-definition/project-changes.d.ts +30 -0
  610. package/types/project-definition/project-definition.d.ts +15 -30
  611. package/types/project-definition/scheduler-policy.d.ts +3 -3
  612. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
  613. package/types/project-run/aggregation.d.ts +8 -6
  614. package/types/project-run/changes/git.d.ts +14 -0
  615. package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
  616. package/types/project-run/check-execution/dependencies.d.ts +3 -0
  617. package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
  618. package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
  619. package/types/project-run/check-execution/flag-controls.d.ts +1 -1
  620. package/types/project-run/check-execution/lifecycle.d.ts +9 -5
  621. package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
  622. package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
  623. package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
  624. package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
  625. package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
  626. package/types/project-run/check-execution/terminal-result.d.ts +13 -1
  627. package/types/project-run/completion/completion.d.ts +3 -1
  628. package/types/project-run/controls/contract.d.ts +6 -16
  629. package/types/project-run/invocation/candidates.d.ts +8 -0
  630. package/types/project-run/invocation/execution.d.ts +5 -0
  631. package/types/project-run/invocation/run.d.ts +2 -2
  632. package/types/project-run/outputs/status.d.ts +4 -4
  633. package/types/project-run/progress-rendering/presentation.d.ts +4 -3
  634. package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
  635. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
  636. package/types/project-run/progress-rendering/renderer.d.ts +4 -2
  637. package/types/project-run/project-context.d.ts +3 -3
  638. package/types/project-run/result.d.ts +3 -3
  639. package/types/project-run/run.d.ts +1 -1
  640. package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
  641. package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
  642. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
  643. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
  644. package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
  645. package/dist/esm/check/finding-presentation.mjs.map +0 -1
  646. package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
  647. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
  648. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
  649. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
  650. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
  651. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
  652. package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
  653. package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
  654. package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
  655. package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
  656. package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
  657. package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
  658. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
  659. package/types/package-checks/project-files/config-glob.d.ts +0 -5
  660. /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
  661. /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
  662. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
  663. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
  664. /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
  665. /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
  666. /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
  667. /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
  668. /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
  669. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
  670. /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
@@ -0,0 +1,45 @@
1
+ /** Required accessors for compiler-owned dense slot indexes. */
2
+ export function requiredTaskForCompiled(compiled, taskSlot) {
3
+ const task = compiled.graph.tasks[taskSlot];
4
+ if (task === undefined)
5
+ throw new Error(`admission core task slot is unknown: ${taskSlot}`);
6
+ return task;
7
+ }
8
+ export function requiredTaskMutexSlotsForCompiled(compiled, taskSlot) {
9
+ const slots = compiled.taskMutexSlots[taskSlot];
10
+ if (slots === undefined)
11
+ throw new Error(`admission core task slot is unknown: ${taskSlot}`);
12
+ return slots;
13
+ }
14
+ export function requiredTaskResourceClaimsForCompiled(compiled, taskSlot) {
15
+ const claims = compiled.taskResourceClaims[taskSlot];
16
+ if (claims === undefined)
17
+ throw new Error(`admission core task slot is unknown: ${taskSlot}`);
18
+ return claims;
19
+ }
20
+ export function requiredReverseDependenciesForCompiled(compiled, taskSlot) {
21
+ const dependencies = compiled.relationIndexes.reverseDependencies[taskSlot];
22
+ if (dependencies === undefined)
23
+ throw new Error(`admission core task slot is unknown: ${taskSlot}`);
24
+ return dependencies;
25
+ }
26
+ export function requiredReverseObservationsForCompiled(compiled, taskSlot) {
27
+ const observations = compiled.relationIndexes.reverseObservations[taskSlot];
28
+ if (observations === undefined)
29
+ throw new Error(`admission core task slot is unknown: ${taskSlot}`);
30
+ return observations;
31
+ }
32
+ export function requiredReverseMutexOccurrencesForCompiled(compiled, mutexSlot) {
33
+ const occurrences = compiled.relationIndexes.reverseMutexOccurrences[mutexSlot];
34
+ if (occurrences === undefined) {
35
+ throw new Error(`admission core mutex slot is unknown: ${mutexSlot}`);
36
+ }
37
+ return occurrences;
38
+ }
39
+ export function requiredScopeTerminalSlotsForCompiled(compiled, taskSlot) {
40
+ const scopeSlots = compiled.scopeSlotsByTerminalTaskSlot[taskSlot];
41
+ if (scopeSlots === undefined)
42
+ throw new Error(`admission core task slot is unknown: ${taskSlot}`);
43
+ return scopeSlots;
44
+ }
45
+ //# sourceMappingURL=compiled-graph-lookup.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiled-graph-lookup.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAKhE,MAAM,UAAU,uBAAuB,CACrC,QAAgC,EAChC,QAAgB;IAEhB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,QAAgC,EAChC,QAAgB;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IAC7F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,QAAgC,EAChC,QAAgB;IAEhB,MAAM,MAAM,GAAG,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IAC9F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sCAAsC,CACpD,QAAgC,EAChC,QAAgB;IAEhB,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC5E,IAAI,YAAY,KAAK,SAAS;QAC5B,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IACtE,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,sCAAsC,CACpD,QAAgC,EAChC,QAAgB;IAEhB,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC5E,IAAI,YAAY,KAAK,SAAS;QAC5B,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IACtE,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,0CAA0C,CACxD,QAAgC,EAChC,SAAiB;IAEjB,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAChF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,QAAgC,EAChC,QAAgB;IAEhB,MAAM,UAAU,GAAG,QAAQ,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACnE,IAAI,UAAU,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IAClG,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["/** Required accessors for compiler-owned dense slot indexes. */\n\nimport type { PlannedTask } from \"../graph.ts\";\nimport type { CompiledAdmissionGraph } from \"./compiled-graph.ts\";\n\nexport function requiredTaskForCompiled(\n compiled: CompiledAdmissionGraph,\n taskSlot: number\n): PlannedTask {\n const task = compiled.graph.tasks[taskSlot];\n if (task === undefined) throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return task;\n}\n\nexport function requiredTaskMutexSlotsForCompiled(\n compiled: CompiledAdmissionGraph,\n taskSlot: number\n): CompiledAdmissionGraph[\"taskMutexSlots\"][number] {\n const slots = compiled.taskMutexSlots[taskSlot];\n if (slots === undefined) throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return slots;\n}\n\nexport function requiredTaskResourceClaimsForCompiled(\n compiled: CompiledAdmissionGraph,\n taskSlot: number\n): CompiledAdmissionGraph[\"taskResourceClaims\"][number] {\n const claims = compiled.taskResourceClaims[taskSlot];\n if (claims === undefined) throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return claims;\n}\n\nexport function requiredReverseDependenciesForCompiled(\n compiled: CompiledAdmissionGraph,\n taskSlot: number\n): CompiledAdmissionGraph[\"relationIndexes\"][\"reverseDependencies\"][number] {\n const dependencies = compiled.relationIndexes.reverseDependencies[taskSlot];\n if (dependencies === undefined)\n throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return dependencies;\n}\n\nexport function requiredReverseObservationsForCompiled(\n compiled: CompiledAdmissionGraph,\n taskSlot: number\n): CompiledAdmissionGraph[\"relationIndexes\"][\"reverseObservations\"][number] {\n const observations = compiled.relationIndexes.reverseObservations[taskSlot];\n if (observations === undefined)\n throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return observations;\n}\n\nexport function requiredReverseMutexOccurrencesForCompiled(\n compiled: CompiledAdmissionGraph,\n mutexSlot: number\n): CompiledAdmissionGraph[\"relationIndexes\"][\"reverseMutexOccurrences\"][number] {\n const occurrences = compiled.relationIndexes.reverseMutexOccurrences[mutexSlot];\n if (occurrences === undefined) {\n throw new Error(`admission core mutex slot is unknown: ${mutexSlot}`);\n }\n return occurrences;\n}\n\nexport function requiredScopeTerminalSlotsForCompiled(\n compiled: CompiledAdmissionGraph,\n taskSlot: number\n): CompiledAdmissionGraph[\"scopeSlotsByTerminalTaskSlot\"][number] {\n const scopeSlots = compiled.scopeSlotsByTerminalTaskSlot[taskSlot];\n if (scopeSlots === undefined) throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return scopeSlots;\n}\n"]}
@@ -116,11 +116,16 @@ function compileScopeStaticIndexes(graph, catalog) {
116
116
  }
117
117
  /** Materializes only the lexical catalog projection; declaration slots remain unchanged. */
118
118
  function compilePublicTaskOrder(graph, taskSlotsById) {
119
+ const taskIdsInPublicOrder = Object.freeze(graph.tasks.map((task) => task.id).sort(compareText));
119
120
  return {
120
- taskIdsInPublicOrder: Object.freeze(graph.tasks.map((task) => task.id).sort(compareText)),
121
- taskSlotsInPublicOrder: Object.freeze(graph.tasks
122
- .map((task) => taskSlotsById.get(task.id))
123
- .sort((left, right) => compareText(graph.tasks[left].id, graph.tasks[right].id)))
121
+ taskIdsInPublicOrder,
122
+ taskSlotsInPublicOrder: Object.freeze(taskIdsInPublicOrder.map((taskId) => {
123
+ const taskSlot = taskSlotsById.get(taskId);
124
+ if (taskSlot === undefined) {
125
+ throw new Error(`admission core task is missing from public order: ${taskId}`);
126
+ }
127
+ return taskSlot;
128
+ }))
124
129
  };
125
130
  }
126
131
  /** Freezes the one compiled graph object after every static compiler stage has completed. */
@@ -1 +1 @@
1
- {"version":3,"file":"compiled-graph.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/compiled-graph.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PlannedTask, PlannedTaskGraph } from \"../graph.ts\";\n\ninterface RelationStaticIndexes {\n readonly reverseDependencies: readonly (readonly number[])[];\n readonly reverseMutexOccurrences: readonly (readonly number[])[];\n readonly reverseObservations: readonly (readonly number[])[];\n}\n\ninterface ReverseRelationIndexes {\n readonly reverseDependencies: readonly (readonly number[])[];\n readonly reverseObservations: readonly (readonly number[])[];\n}\n\nexport interface CompiledAdmissionGraph {\n readonly graph: PlannedTaskGraph;\n readonly maxParallel: number;\n readonly mutexSlotById: ReadonlyMap<string, number>;\n readonly resourceCapacityBySlot: readonly number[];\n readonly resourceSlotById: ReadonlyMap<string, number>;\n readonly scopesById: ReadonlyMap<string, PlannedTaskGraph[\"scopes\"][number]>;\n readonly scopeSlotById: ReadonlyMap<string, number>;\n readonly scopeSlotsByTerminalTaskSlot: readonly (readonly number[])[];\n readonly taskById: ReadonlyMap<string, PlannedTask>;\n readonly taskMutexSlots: readonly (readonly number[])[];\n readonly taskResourceClaims: readonly (readonly Readonly<{\n readonly resourceSlot: number;\n readonly units: number;\n }>[])[];\n readonly taskActivatesScope: readonly boolean[];\n readonly taskScopeSlots: readonly (number | undefined)[];\n readonly taskSlotsById: ReadonlyMap<string, number>;\n readonly taskIdsInPublicOrder: readonly string[];\n readonly taskSlotsInPublicOrder: readonly number[];\n readonly relationIndexes: RelationStaticIndexes;\n}\n\ninterface GraphSlotCatalog {\n readonly scopesById: ReadonlyMap<string, PlannedTaskGraph[\"scopes\"][number]>;\n readonly scopeSlotById: ReadonlyMap<string, number>;\n readonly taskById: ReadonlyMap<string, PlannedTask>;\n readonly taskSlotsById: ReadonlyMap<string, number>;\n}\n\ninterface MutexStaticIndexes {\n readonly mutexSlotById: ReadonlyMap<string, number>;\n readonly reverseMutexOccurrences: readonly (readonly number[])[];\n readonly taskMutexSlots: readonly (readonly number[])[];\n}\n\ninterface ResourceStaticIndexes {\n readonly resourceCapacityBySlot: readonly number[];\n readonly resourceSlotById: ReadonlyMap<string, number>;\n readonly taskResourceClaims: CompiledAdmissionGraph[\"taskResourceClaims\"];\n}\n\ninterface ScopeStaticIndexes {\n readonly scopeSlotsByTerminalTaskSlot: readonly (readonly number[])[];\n readonly taskActivatesScope: readonly boolean[];\n readonly taskScopeSlots: readonly (number | undefined)[];\n}\n\ninterface PublicTaskOrder {\n readonly taskIdsInPublicOrder: readonly string[];\n readonly taskSlotsInPublicOrder: readonly number[];\n}\n\ninterface CompiledAdmissionGraphParts {\n readonly catalog: GraphSlotCatalog;\n readonly graph: PlannedTaskGraph;\n readonly maxParallel: number;\n readonly mutexIndexes: MutexStaticIndexes;\n readonly publicTaskOrder: PublicTaskOrder;\n readonly relationIndexes: ReverseRelationIndexes;\n readonly resourceIndexes: ResourceStaticIndexes;\n readonly scopeIndexes: ScopeStaticIndexes;\n}\n\n/** Compiles a Scheduler-owned normalized graph once for an actual scheduler invocation. */\nexport function compilePreparedAdmissionGraph(\n graph: PlannedTaskGraph,\n maxParallel: number\n): CompiledAdmissionGraph {\n assertMaxParallel(maxParallel);\n const catalog = compileGraphSlotCatalog(graph);\n const mutexIndexes = compileMutexStaticIndexes(graph);\n const relationIndexes = compileRelationStaticIndexes(graph, catalog.taskSlotsById);\n const resourceIndexes = compileResourceStaticIndexes(graph);\n const scopeIndexes = compileScopeStaticIndexes(graph, catalog);\n const publicTaskOrder = compilePublicTaskOrder(graph, catalog.taskSlotsById);\n\n return assembleCompiledAdmissionGraph({\n catalog,\n graph,\n maxParallel,\n mutexIndexes,\n publicTaskOrder,\n relationIndexes,\n resourceIndexes,\n scopeIndexes\n });\n}\n\nfunction compileResourceStaticIndexes(graph: PlannedTaskGraph): ResourceStaticIndexes {\n const resourceSlotById = new Map(\n graph.resourceCapacities.map(({ resourceId }, slot) => [resourceId, slot] as const)\n );\n const resourceCapacityBySlot = Object.freeze(graph.resourceCapacities.map(({ units }) => units));\n const taskResourceClaims = Object.freeze(\n graph.tasks.map((task) =>\n Object.freeze(\n task.resourceClaims.map(({ resourceId, units }) => {\n const resourceSlot = resourceSlotById.get(resourceId);\n if (resourceSlot === undefined) {\n throw new Error(`admission core resource is unknown: ${resourceId}`);\n }\n return Object.freeze({ resourceSlot, units });\n })\n )\n )\n );\n return { resourceCapacityBySlot, resourceSlotById, taskResourceClaims };\n}\n\nfunction assertMaxParallel(maxParallel: number): void {\n if (!Number.isSafeInteger(maxParallel) || maxParallel <= 0) {\n throw new TypeError(\"task engine maxParallel must be a positive safe integer\");\n }\n}\n\n/** Creates declaration-slot catalogs without materializing another prepared graph. */\nfunction compileGraphSlotCatalog(graph: PlannedTaskGraph): GraphSlotCatalog {\n return {\n taskSlotsById: new Map(graph.tasks.map((task, slot) => [task.id, slot] as const)),\n taskById: new Map(graph.tasks.map((task) => [task.id, task] as const)),\n scopeSlotById: new Map(graph.scopes.map((scope, slot) => [scope.id, slot] as const)),\n scopesById: new Map(graph.scopes.map((scope) => [scope.id, scope] as const))\n };\n}\n\n/** Allocates mutex slots by first declaration occurrence, then records every task occurrence. */\nfunction compileMutexStaticIndexes(graph: PlannedTaskGraph): MutexStaticIndexes {\n const mutexSlotById = new Map<string, number>();\n const taskMutexSlots = graph.tasks.map((task) => mutexSlotsForTask(task, mutexSlotById));\n const reverseMutexOccurrences = Array.from({ length: mutexSlotById.size }, () => [] as number[]);\n\n for (const [taskSlot, mutexSlots] of taskMutexSlots.entries()) {\n for (const mutexSlot of mutexSlots) reverseMutexOccurrences[mutexSlot]?.push(taskSlot);\n }\n\n return {\n mutexSlotById,\n reverseMutexOccurrences: freezeSlotLists(reverseMutexOccurrences),\n taskMutexSlots: freezeSlotLists(taskMutexSlots)\n };\n}\n\nfunction mutexSlotsForTask(task: PlannedTask, mutexSlotById: Map<string, number>): number[] {\n return task.mutex.map((mutexId) => mutexSlotFor(mutexSlotById, mutexId));\n}\n\nfunction mutexSlotFor(mutexSlotById: Map<string, number>, mutexId: string): number {\n const existingSlot = mutexSlotById.get(mutexId);\n if (existingSlot !== undefined) return existingSlot;\n\n const nextSlot = mutexSlotById.size;\n mutexSlotById.set(mutexId, nextSlot);\n return nextSlot;\n}\n\n/** Reverses relation occurrences while retaining the declared occurrence order for core transitions. */\nfunction compileRelationStaticIndexes(\n graph: PlannedTaskGraph,\n taskSlotsById: ReadonlyMap<string, number>\n): ReverseRelationIndexes {\n const reverseDependencies = emptyTaskSlotLists(graph);\n const reverseObservations = emptyTaskSlotLists(graph);\n\n for (const [taskSlot, task] of graph.tasks.entries()) {\n appendReverseRelationOccurrences(\n task.dependsOn,\n taskSlot,\n taskSlotsById,\n reverseDependencies,\n \"dependency\"\n );\n appendReverseRelationOccurrences(\n task.observes,\n taskSlot,\n taskSlotsById,\n reverseObservations,\n \"observation\"\n );\n }\n\n return {\n reverseDependencies: freezeSlotLists(reverseDependencies),\n reverseObservations: freezeSlotLists(reverseObservations)\n };\n}\n\nfunction appendReverseRelationOccurrences(\n sourceTaskIds: readonly string[],\n targetTaskSlot: number,\n taskSlotsById: ReadonlyMap<string, number>,\n reverseSlotsBySourceTask: number[][],\n relationName: \"dependency\" | \"observation\"\n): void {\n for (const sourceTaskId of sourceTaskIds) {\n const sourceTaskSlot = taskSlotsById.get(sourceTaskId);\n if (sourceTaskSlot === undefined) {\n throw new Error(`admission core ${relationName} is unknown: ${sourceTaskId}`);\n }\n reverseSlotsBySourceTask[sourceTaskSlot]?.push(targetTaskSlot);\n }\n}\n\n/** Associates scope terminals and activation candidates with the existing task slots. */\nfunction compileScopeStaticIndexes(\n graph: PlannedTaskGraph,\n catalog: GraphSlotCatalog\n): ScopeStaticIndexes {\n const scopeSlotsByTerminalTaskSlot = emptyTaskSlotLists(graph);\n\n for (const [scopeSlot, scope] of graph.scopes.entries()) {\n const terminalTaskSlot = catalog.taskSlotsById.get(scope.terminalTaskId);\n if (terminalTaskSlot === undefined) {\n throw new Error(`admission core scope terminal is unknown: ${scope.terminalTaskId}`);\n }\n scopeSlotsByTerminalTaskSlot[terminalTaskSlot]?.push(scopeSlot);\n }\n const taskActivatesScope = graph.tasks.map((task) => {\n const scopeSlot =\n task.scopeId === undefined ? undefined : catalog.scopeSlotById.get(task.scopeId);\n return (\n scopeSlot !== undefined &&\n graph.scopes[scopeSlot]?.activationTaskIds.includes(task.id) === true\n );\n });\n const taskScopeSlots = graph.tasks.map((task) =>\n task.scopeId === undefined ? undefined : catalog.scopeSlotById.get(task.scopeId)\n );\n\n return {\n scopeSlotsByTerminalTaskSlot: freezeSlotLists(scopeSlotsByTerminalTaskSlot),\n taskActivatesScope: Object.freeze(taskActivatesScope),\n taskScopeSlots: Object.freeze(taskScopeSlots)\n };\n}\n\n/** Materializes only the lexical catalog projection; declaration slots remain unchanged. */\nfunction compilePublicTaskOrder(\n graph: PlannedTaskGraph,\n taskSlotsById: ReadonlyMap<string, number>\n): PublicTaskOrder {\n return {\n taskIdsInPublicOrder: Object.freeze(graph.tasks.map((task) => task.id).sort(compareText)),\n taskSlotsInPublicOrder: Object.freeze(\n graph.tasks\n .map((task) => taskSlotsById.get(task.id)!)\n .sort((left, right) => compareText(graph.tasks[left].id, graph.tasks[right].id))\n )\n };\n}\n\n/** Freezes the one compiled graph object after every static compiler stage has completed. */\nfunction assembleCompiledAdmissionGraph(\n parts: CompiledAdmissionGraphParts\n): CompiledAdmissionGraph {\n const {\n catalog,\n graph,\n maxParallel,\n mutexIndexes,\n publicTaskOrder,\n relationIndexes,\n resourceIndexes,\n scopeIndexes\n } = parts;\n return Object.freeze({\n graph,\n maxParallel,\n mutexSlotById: mutexIndexes.mutexSlotById,\n resourceCapacityBySlot: resourceIndexes.resourceCapacityBySlot,\n resourceSlotById: resourceIndexes.resourceSlotById,\n relationIndexes: Object.freeze({\n reverseDependencies: relationIndexes.reverseDependencies,\n reverseMutexOccurrences: mutexIndexes.reverseMutexOccurrences,\n reverseObservations: relationIndexes.reverseObservations\n }),\n scopesById: catalog.scopesById,\n scopeSlotById: catalog.scopeSlotById,\n scopeSlotsByTerminalTaskSlot: scopeIndexes.scopeSlotsByTerminalTaskSlot,\n taskById: catalog.taskById,\n taskIdsInPublicOrder: publicTaskOrder.taskIdsInPublicOrder,\n taskMutexSlots: mutexIndexes.taskMutexSlots,\n taskResourceClaims: resourceIndexes.taskResourceClaims,\n taskActivatesScope: scopeIndexes.taskActivatesScope,\n taskScopeSlots: scopeIndexes.taskScopeSlots,\n taskSlotsById: catalog.taskSlotsById,\n taskSlotsInPublicOrder: publicTaskOrder.taskSlotsInPublicOrder\n });\n}\n\nfunction emptyTaskSlotLists(graph: PlannedTaskGraph): number[][] {\n return graph.tasks.map(() => []);\n}\n\nfunction freezeSlotLists(slotLists: number[][]): readonly (readonly number[])[] {\n return Object.freeze(slotLists.map((slots) => Object.freeze(slots)));\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"compiled-graph.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/compiled-graph.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PlannedTask, PlannedTaskGraph } from \"../graph.ts\";\n\ninterface RelationStaticIndexes {\n readonly reverseDependencies: readonly (readonly number[])[];\n readonly reverseMutexOccurrences: readonly (readonly number[])[];\n readonly reverseObservations: readonly (readonly number[])[];\n}\n\ninterface ReverseRelationIndexes {\n readonly reverseDependencies: readonly (readonly number[])[];\n readonly reverseObservations: readonly (readonly number[])[];\n}\n\nexport interface CompiledAdmissionGraph {\n readonly graph: PlannedTaskGraph;\n readonly maxParallel: number;\n readonly mutexSlotById: ReadonlyMap<string, number>;\n readonly resourceCapacityBySlot: readonly number[];\n readonly resourceSlotById: ReadonlyMap<string, number>;\n readonly scopesById: ReadonlyMap<string, PlannedTaskGraph[\"scopes\"][number]>;\n readonly scopeSlotById: ReadonlyMap<string, number>;\n readonly scopeSlotsByTerminalTaskSlot: readonly (readonly number[])[];\n readonly taskById: ReadonlyMap<string, PlannedTask>;\n readonly taskMutexSlots: readonly (readonly number[])[];\n readonly taskResourceClaims: readonly (readonly Readonly<{\n readonly resourceSlot: number;\n readonly units: number;\n }>[])[];\n readonly taskActivatesScope: readonly boolean[];\n readonly taskScopeSlots: readonly (number | undefined)[];\n readonly taskSlotsById: ReadonlyMap<string, number>;\n readonly taskIdsInPublicOrder: readonly string[];\n readonly taskSlotsInPublicOrder: readonly number[];\n readonly relationIndexes: RelationStaticIndexes;\n}\n\ninterface GraphSlotCatalog {\n readonly scopesById: ReadonlyMap<string, PlannedTaskGraph[\"scopes\"][number]>;\n readonly scopeSlotById: ReadonlyMap<string, number>;\n readonly taskById: ReadonlyMap<string, PlannedTask>;\n readonly taskSlotsById: ReadonlyMap<string, number>;\n}\n\ninterface MutexStaticIndexes {\n readonly mutexSlotById: ReadonlyMap<string, number>;\n readonly reverseMutexOccurrences: readonly (readonly number[])[];\n readonly taskMutexSlots: readonly (readonly number[])[];\n}\n\ninterface ResourceStaticIndexes {\n readonly resourceCapacityBySlot: readonly number[];\n readonly resourceSlotById: ReadonlyMap<string, number>;\n readonly taskResourceClaims: CompiledAdmissionGraph[\"taskResourceClaims\"];\n}\n\ninterface ScopeStaticIndexes {\n readonly scopeSlotsByTerminalTaskSlot: readonly (readonly number[])[];\n readonly taskActivatesScope: readonly boolean[];\n readonly taskScopeSlots: readonly (number | undefined)[];\n}\n\ninterface PublicTaskOrder {\n readonly taskIdsInPublicOrder: readonly string[];\n readonly taskSlotsInPublicOrder: readonly number[];\n}\n\ninterface CompiledAdmissionGraphParts {\n readonly catalog: GraphSlotCatalog;\n readonly graph: PlannedTaskGraph;\n readonly maxParallel: number;\n readonly mutexIndexes: MutexStaticIndexes;\n readonly publicTaskOrder: PublicTaskOrder;\n readonly relationIndexes: ReverseRelationIndexes;\n readonly resourceIndexes: ResourceStaticIndexes;\n readonly scopeIndexes: ScopeStaticIndexes;\n}\n\n/** Compiles a Scheduler-owned normalized graph once for an actual scheduler invocation. */\nexport function compilePreparedAdmissionGraph(\n graph: PlannedTaskGraph,\n maxParallel: number\n): CompiledAdmissionGraph {\n assertMaxParallel(maxParallel);\n const catalog = compileGraphSlotCatalog(graph);\n const mutexIndexes = compileMutexStaticIndexes(graph);\n const relationIndexes = compileRelationStaticIndexes(graph, catalog.taskSlotsById);\n const resourceIndexes = compileResourceStaticIndexes(graph);\n const scopeIndexes = compileScopeStaticIndexes(graph, catalog);\n const publicTaskOrder = compilePublicTaskOrder(graph, catalog.taskSlotsById);\n\n return assembleCompiledAdmissionGraph({\n catalog,\n graph,\n maxParallel,\n mutexIndexes,\n publicTaskOrder,\n relationIndexes,\n resourceIndexes,\n scopeIndexes\n });\n}\n\nfunction compileResourceStaticIndexes(graph: PlannedTaskGraph): ResourceStaticIndexes {\n const resourceSlotById = new Map(\n graph.resourceCapacities.map(({ resourceId }, slot) => [resourceId, slot] as const)\n );\n const resourceCapacityBySlot = Object.freeze(graph.resourceCapacities.map(({ units }) => units));\n const taskResourceClaims = Object.freeze(\n graph.tasks.map((task) =>\n Object.freeze(\n task.resourceClaims.map(({ resourceId, units }) => {\n const resourceSlot = resourceSlotById.get(resourceId);\n if (resourceSlot === undefined) {\n throw new Error(`admission core resource is unknown: ${resourceId}`);\n }\n return Object.freeze({ resourceSlot, units });\n })\n )\n )\n );\n return { resourceCapacityBySlot, resourceSlotById, taskResourceClaims };\n}\n\nfunction assertMaxParallel(maxParallel: number): void {\n if (!Number.isSafeInteger(maxParallel) || maxParallel <= 0) {\n throw new TypeError(\"task engine maxParallel must be a positive safe integer\");\n }\n}\n\n/** Creates declaration-slot catalogs without materializing another prepared graph. */\nfunction compileGraphSlotCatalog(graph: PlannedTaskGraph): GraphSlotCatalog {\n return {\n taskSlotsById: new Map(graph.tasks.map((task, slot) => [task.id, slot] as const)),\n taskById: new Map(graph.tasks.map((task) => [task.id, task] as const)),\n scopeSlotById: new Map(graph.scopes.map((scope, slot) => [scope.id, slot] as const)),\n scopesById: new Map(graph.scopes.map((scope) => [scope.id, scope] as const))\n };\n}\n\n/** Allocates mutex slots by first declaration occurrence, then records every task occurrence. */\nfunction compileMutexStaticIndexes(graph: PlannedTaskGraph): MutexStaticIndexes {\n const mutexSlotById = new Map<string, number>();\n const taskMutexSlots = graph.tasks.map((task) => mutexSlotsForTask(task, mutexSlotById));\n const reverseMutexOccurrences = Array.from({ length: mutexSlotById.size }, () => [] as number[]);\n\n for (const [taskSlot, mutexSlots] of taskMutexSlots.entries()) {\n for (const mutexSlot of mutexSlots) reverseMutexOccurrences[mutexSlot]?.push(taskSlot);\n }\n\n return {\n mutexSlotById,\n reverseMutexOccurrences: freezeSlotLists(reverseMutexOccurrences),\n taskMutexSlots: freezeSlotLists(taskMutexSlots)\n };\n}\n\nfunction mutexSlotsForTask(task: PlannedTask, mutexSlotById: Map<string, number>): number[] {\n return task.mutex.map((mutexId) => mutexSlotFor(mutexSlotById, mutexId));\n}\n\nfunction mutexSlotFor(mutexSlotById: Map<string, number>, mutexId: string): number {\n const existingSlot = mutexSlotById.get(mutexId);\n if (existingSlot !== undefined) return existingSlot;\n\n const nextSlot = mutexSlotById.size;\n mutexSlotById.set(mutexId, nextSlot);\n return nextSlot;\n}\n\n/** Reverses relation occurrences while retaining the declared occurrence order for core transitions. */\nfunction compileRelationStaticIndexes(\n graph: PlannedTaskGraph,\n taskSlotsById: ReadonlyMap<string, number>\n): ReverseRelationIndexes {\n const reverseDependencies = emptyTaskSlotLists(graph);\n const reverseObservations = emptyTaskSlotLists(graph);\n\n for (const [taskSlot, task] of graph.tasks.entries()) {\n appendReverseRelationOccurrences(\n task.dependsOn,\n taskSlot,\n taskSlotsById,\n reverseDependencies,\n \"dependency\"\n );\n appendReverseRelationOccurrences(\n task.observes,\n taskSlot,\n taskSlotsById,\n reverseObservations,\n \"observation\"\n );\n }\n\n return {\n reverseDependencies: freezeSlotLists(reverseDependencies),\n reverseObservations: freezeSlotLists(reverseObservations)\n };\n}\n\nfunction appendReverseRelationOccurrences(\n sourceTaskIds: readonly string[],\n targetTaskSlot: number,\n taskSlotsById: ReadonlyMap<string, number>,\n reverseSlotsBySourceTask: number[][],\n relationName: \"dependency\" | \"observation\"\n): void {\n for (const sourceTaskId of sourceTaskIds) {\n const sourceTaskSlot = taskSlotsById.get(sourceTaskId);\n if (sourceTaskSlot === undefined) {\n throw new Error(`admission core ${relationName} is unknown: ${sourceTaskId}`);\n }\n reverseSlotsBySourceTask[sourceTaskSlot]?.push(targetTaskSlot);\n }\n}\n\n/** Associates scope terminals and activation candidates with the existing task slots. */\nfunction compileScopeStaticIndexes(\n graph: PlannedTaskGraph,\n catalog: GraphSlotCatalog\n): ScopeStaticIndexes {\n const scopeSlotsByTerminalTaskSlot = emptyTaskSlotLists(graph);\n\n for (const [scopeSlot, scope] of graph.scopes.entries()) {\n const terminalTaskSlot = catalog.taskSlotsById.get(scope.terminalTaskId);\n if (terminalTaskSlot === undefined) {\n throw new Error(`admission core scope terminal is unknown: ${scope.terminalTaskId}`);\n }\n scopeSlotsByTerminalTaskSlot[terminalTaskSlot]?.push(scopeSlot);\n }\n const taskActivatesScope = graph.tasks.map((task) => {\n const scopeSlot =\n task.scopeId === undefined ? undefined : catalog.scopeSlotById.get(task.scopeId);\n return (\n scopeSlot !== undefined &&\n graph.scopes[scopeSlot]?.activationTaskIds.includes(task.id) === true\n );\n });\n const taskScopeSlots = graph.tasks.map((task) =>\n task.scopeId === undefined ? undefined : catalog.scopeSlotById.get(task.scopeId)\n );\n\n return {\n scopeSlotsByTerminalTaskSlot: freezeSlotLists(scopeSlotsByTerminalTaskSlot),\n taskActivatesScope: Object.freeze(taskActivatesScope),\n taskScopeSlots: Object.freeze(taskScopeSlots)\n };\n}\n\n/** Materializes only the lexical catalog projection; declaration slots remain unchanged. */\nfunction compilePublicTaskOrder(\n graph: PlannedTaskGraph,\n taskSlotsById: ReadonlyMap<string, number>\n): PublicTaskOrder {\n const taskIdsInPublicOrder = Object.freeze(graph.tasks.map((task) => task.id).sort(compareText));\n return {\n taskIdsInPublicOrder,\n taskSlotsInPublicOrder: Object.freeze(\n taskIdsInPublicOrder.map((taskId) => {\n const taskSlot = taskSlotsById.get(taskId);\n if (taskSlot === undefined) {\n throw new Error(`admission core task is missing from public order: ${taskId}`);\n }\n return taskSlot;\n })\n )\n };\n}\n\n/** Freezes the one compiled graph object after every static compiler stage has completed. */\nfunction assembleCompiledAdmissionGraph(\n parts: CompiledAdmissionGraphParts\n): CompiledAdmissionGraph {\n const {\n catalog,\n graph,\n maxParallel,\n mutexIndexes,\n publicTaskOrder,\n relationIndexes,\n resourceIndexes,\n scopeIndexes\n } = parts;\n return Object.freeze({\n graph,\n maxParallel,\n mutexSlotById: mutexIndexes.mutexSlotById,\n resourceCapacityBySlot: resourceIndexes.resourceCapacityBySlot,\n resourceSlotById: resourceIndexes.resourceSlotById,\n relationIndexes: Object.freeze({\n reverseDependencies: relationIndexes.reverseDependencies,\n reverseMutexOccurrences: mutexIndexes.reverseMutexOccurrences,\n reverseObservations: relationIndexes.reverseObservations\n }),\n scopesById: catalog.scopesById,\n scopeSlotById: catalog.scopeSlotById,\n scopeSlotsByTerminalTaskSlot: scopeIndexes.scopeSlotsByTerminalTaskSlot,\n taskById: catalog.taskById,\n taskIdsInPublicOrder: publicTaskOrder.taskIdsInPublicOrder,\n taskMutexSlots: mutexIndexes.taskMutexSlots,\n taskResourceClaims: resourceIndexes.taskResourceClaims,\n taskActivatesScope: scopeIndexes.taskActivatesScope,\n taskScopeSlots: scopeIndexes.taskScopeSlots,\n taskSlotsById: catalog.taskSlotsById,\n taskSlotsInPublicOrder: publicTaskOrder.taskSlotsInPublicOrder\n });\n}\n\nfunction emptyTaskSlotLists(graph: PlannedTaskGraph): number[][] {\n return graph.tasks.map(() => []);\n}\n\nfunction freezeSlotLists(slotLists: number[][]): readonly (readonly number[])[] {\n return Object.freeze(slotLists.map((slots) => Object.freeze(slots)));\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { requiredTaskForCompiled, requiredTaskResourceClaimsForCompiled } from "./compiled-graph-lookup.mjs";
1
2
  import { numberFor, statusForSelection } from "./selection-index.mjs";
2
3
  import { compareScopeCapacityForCompiled, requiredScopeForCompiled, requiredTaskSlotForCompiled } from "./selection-seed.mjs";
3
4
  export function statusForCore(state, taskSlot) {
@@ -7,10 +8,7 @@ export function isCoreComplete(state) {
7
8
  return state.selection.remainingTaskCount === 0;
8
9
  }
9
10
  export function requiredTaskForCore(state, taskSlot) {
10
- const task = state.compiled.graph.tasks[taskSlot];
11
- if (task === undefined)
12
- throw new Error(`admission core task slot is unknown: ${taskSlot}`);
13
- return task;
11
+ return requiredTaskForCompiled(state.compiled, taskSlot);
14
12
  }
15
13
  export function requiredTaskSlotForCore(state, taskId) {
16
14
  return requiredTaskSlotForCompiled(state.compiled, taskId);
@@ -91,7 +89,7 @@ function capacityRejectionFor(state, taskSlot) {
91
89
  function resourceCapacityRejectionFor(state, taskSlot) {
92
90
  const task = requiredTaskForCore(state, taskSlot);
93
91
  const insufficient = [];
94
- for (const claim of state.compiled.taskResourceClaims[taskSlot]) {
92
+ for (const claim of requiredTaskResourceClaimsForCompiled(state.compiled, taskSlot)) {
95
93
  const capacity = state.compiled.resourceCapacityBySlot[claim.resourceSlot];
96
94
  const inUse = numberFor(state.selection.resourceInUse, claim.resourceSlot);
97
95
  if (capacity === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"selection-query.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/selection-query.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionSelectionRejectionReason } from \"../../../project-definition/scheduler-policy.ts\";\nimport type { CompiledAdmissionGraph } from \"./compiled-graph.ts\";\nimport {\n numberFor,\n statusForSelection,\n type AdmissionSelectionIndex,\n type CoreTaskStatus\n} from \"./selection-index.ts\";\nimport {\n compareScopeCapacityForCompiled,\n requiredScopeForCompiled,\n requiredTaskSlotForCompiled\n} from \"./selection-seed.ts\";\nimport type { PlannedTask, PlannedTaskGraph } from \"../graph.ts\";\n\ntype SelectionCoreState = Readonly<{\n readonly compiled: CompiledAdmissionGraph;\n readonly selection: AdmissionSelectionIndex;\n}>;\n\nexport interface AdmissionCoreSelection {\n readonly canAdmit: boolean;\n readonly task: PlannedTask;\n}\n\nexport function statusForCore(state: SelectionCoreState, taskSlot: number): CoreTaskStatus {\n return statusForSelection(state.selection, taskSlot);\n}\n\nexport function isCoreComplete(state: SelectionCoreState): boolean {\n return state.selection.remainingTaskCount === 0;\n}\n\nexport function requiredTaskForCore(state: SelectionCoreState, taskSlot: number): PlannedTask {\n const task = state.compiled.graph.tasks[taskSlot];\n if (task === undefined) throw new Error(`admission core task slot is unknown: ${taskSlot}`);\n return task;\n}\n\nexport function requiredTaskSlotForCore(state: SelectionCoreState, taskId: string): number {\n return requiredTaskSlotForCompiled(state.compiled, taskId);\n}\n\nexport function requiredScopeForCore(\n state: SelectionCoreState,\n scopeSlot: number\n): PlannedTaskGraph[\"scopes\"][number] {\n return requiredScopeForCompiled(state.compiled, scopeSlot);\n}\n\nexport function requiredScopeSlotForCore(state: SelectionCoreState, scopeId: string): number {\n const scopeSlot = state.compiled.scopeSlotById.get(scopeId);\n if (scopeSlot === undefined) throw new Error(`admission core scope is unknown: ${scopeId}`);\n return scopeSlot;\n}\n\n/** Public validation and catalog payloads preserve lexical duplicate occurrences. */\nexport function selectionRejectionForPendingTask(\n state: SelectionCoreState,\n taskSlot: number\n): AdmissionSelectionRejectionReason | undefined {\n const stage = blockerStageFor(state, taskSlot);\n return stage === undefined\n ? capacityRejectionFor(state, taskSlot)\n : blockerPayloadFor(state, taskSlot, stage);\n}\n\ntype PendingBlockerStage = \"depends-on-pending\" | \"mutex-held\" | \"observes-pending\";\n\n/** Candidate scheduling uses only indexed counters and does not materialize public payloads. */\nfunction blockerStageFor(\n state: SelectionCoreState,\n taskSlot: number\n): PendingBlockerStage | undefined {\n const selection = state.selection;\n if (numberFor(selection.pendingDependencies, taskSlot) > 0) return \"depends-on-pending\";\n if (numberFor(selection.pendingObservations, taskSlot) > 0) return \"observes-pending\";\n return numberFor(selection.heldMutexBlockers, taskSlot) > 0 ? \"mutex-held\" : undefined;\n}\n\nfunction blockerPayloadFor(\n state: SelectionCoreState,\n taskSlot: number,\n stage: PendingBlockerStage\n): AdmissionSelectionRejectionReason {\n const task = requiredTaskForCore(state, taskSlot);\n if (stage === \"depends-on-pending\") {\n return Object.freeze({\n kind: stage,\n taskIds: sorted(\n task.dependsOn.filter(\n (taskId) =>\n statusForCore(state, requiredTaskSlotForCore(state, taskId)).kind !== \"settled\"\n )\n )\n });\n }\n if (stage === \"observes-pending\") {\n return Object.freeze({\n kind: stage,\n taskIds: sorted(\n task.observes.filter(\n (taskId) =>\n statusForCore(state, requiredTaskSlotForCore(state, taskId)).kind !== \"settled\"\n )\n )\n });\n }\n return Object.freeze({\n kind: stage,\n mutexIds: sorted(task.mutex.filter((mutexId) => isMutexHeld(state, mutexId)))\n });\n}\n\nexport function isAdmissionEligibleForPendingTask(\n state: SelectionCoreState,\n taskSlot: number\n): boolean {\n return (\n blockerStageFor(state, taskSlot) === undefined && hasCapacityForPendingTask(state, taskSlot)\n );\n}\n\nfunction hasCapacityForPendingTask(state: SelectionCoreState, taskSlot: number): boolean {\n const running = state.selection.runningTotal;\n return (\n scopeCapacityBlockerFor(state, taskSlot, running) === undefined &&\n running < state.compiled.maxParallel &&\n resourceCapacityRejectionFor(state, taskSlot) === undefined\n );\n}\n\nfunction capacityRejectionFor(\n state: SelectionCoreState,\n taskSlot: number\n): AdmissionSelectionRejectionReason | undefined {\n const running = state.selection.runningTotal;\n const scope = scopeCapacityBlockerFor(state, taskSlot, running);\n if (scope !== undefined) {\n return Object.freeze({\n kind: \"scope-capacity-reached\",\n maxParallel: scope.maxParallel,\n running,\n scopeId: scope.id\n });\n }\n if (running >= state.compiled.maxParallel) {\n return Object.freeze({\n kind: \"root-capacity-reached\",\n maxParallel: state.compiled.maxParallel,\n running\n });\n }\n return resourceCapacityRejectionFor(state, taskSlot);\n}\n\nfunction resourceCapacityRejectionFor(\n state: SelectionCoreState,\n taskSlot: number\n):\n | Extract<AdmissionSelectionRejectionReason, { readonly kind: \"resource-capacity-insufficient\" }>\n | undefined {\n const task = requiredTaskForCore(state, taskSlot);\n const insufficient: Extract<\n AdmissionSelectionRejectionReason,\n { readonly kind: \"resource-capacity-insufficient\" }\n >[\"resources\"][number][] = [];\n for (const claim of state.compiled.taskResourceClaims[taskSlot]) {\n const capacity = state.compiled.resourceCapacityBySlot[claim.resourceSlot];\n const inUse = numberFor(state.selection.resourceInUse, claim.resourceSlot);\n if (capacity === undefined) {\n throw new Error(`admission core resource slot is unknown: ${claim.resourceSlot}`);\n }\n if (inUse + claim.units <= capacity) continue;\n const resourceId = state.compiled.graph.resourceCapacities[claim.resourceSlot]?.resourceId;\n if (resourceId === undefined) {\n throw new Error(`admission core task resource claim is missing: ${task.id}`);\n }\n insufficient.push(\n Object.freeze({\n available: capacity - inUse,\n capacity,\n inUse,\n required: claim.units,\n resourceId\n })\n );\n }\n return insufficient.length === 0\n ? undefined\n : Object.freeze({\n kind: \"resource-capacity-insufficient\",\n resources: Object.freeze(insufficient)\n });\n}\n\n/** Active scope capacity is global; an activating candidate supplies one additional exact scope fact. */\nfunction scopeCapacityBlockerFor(\n state: SelectionCoreState,\n taskSlot: number,\n running: number\n): PlannedTaskGraph[\"scopes\"][number] | undefined {\n let selectedScopeSlot: number | undefined = state.selection.activeScopeSlots[0];\n if (\n selectedScopeSlot !== undefined &&\n requiredScopeForCore(state, selectedScopeSlot).maxParallel > running\n ) {\n selectedScopeSlot = undefined;\n }\n const taskScopeSlot = state.compiled.taskScopeSlots[taskSlot];\n if (\n taskScopeSlot !== undefined &&\n isScopeInactiveForCore(state, taskScopeSlot) &&\n state.compiled.taskActivatesScope[taskSlot] === true &&\n requiredScopeForCore(state, taskScopeSlot).maxParallel <= running &&\n (selectedScopeSlot === undefined ||\n compareScopeCapacityForCompiled(state.compiled, taskScopeSlot, selectedScopeSlot) < 0)\n ) {\n selectedScopeSlot = taskScopeSlot;\n }\n return selectedScopeSlot === undefined\n ? undefined\n : requiredScopeForCore(state, selectedScopeSlot);\n}\n\nexport function admissionCandidatesForCore(\n state: SelectionCoreState\n): readonly AdmissionCoreSelection[] {\n const candidates: AdmissionCoreSelection[] = [];\n for (const [taskSlot, task] of state.compiled.graph.tasks.entries()) {\n if (statusForCore(state, taskSlot).kind !== \"pending\") continue;\n if (blockerStageFor(state, taskSlot) !== undefined) continue;\n candidates.push(Object.freeze({ canAdmit: hasCapacityForPendingTask(state, taskSlot), task }));\n }\n return Object.freeze(candidates);\n}\n\nexport function scopeToActivateForCore(state: SelectionCoreState, taskId: string): string | null {\n const taskSlot = state.compiled.taskSlotsById.get(taskId);\n if (taskSlot === undefined) return null;\n const scopeSlot = state.compiled.taskScopeSlots[taskSlot];\n if (scopeSlot === undefined || !isScopeInactiveForCore(state, scopeSlot)) return null;\n return state.compiled.taskActivatesScope[taskSlot] === true\n ? requiredScopeForCore(state, scopeSlot).id\n : null;\n}\n\nexport function activeScopesForCore(\n state: SelectionCoreState\n): PlannedTaskGraph[\"scopes\"][number][] {\n return state.selection.activeScopeSlots.map((slot) => requiredScopeForCore(state, slot));\n}\n\nexport function scopeLifecycleForCore(\n state: SelectionCoreState,\n scopeSlot: number\n): \"inactive\" | \"active\" | \"closed\" {\n const scope = requiredScopeForCore(state, scopeSlot);\n if (\n statusForCore(state, requiredTaskSlotForCore(state, scope.terminalTaskId)).kind === \"settled\"\n ) {\n return \"closed\";\n }\n return numberFor(state.selection.activeScopes, scopeSlot) > 0 ? \"active\" : \"inactive\";\n}\n\nexport function isScopeInactiveForCore(state: SelectionCoreState, scopeSlot: number): boolean {\n return scopeLifecycleForCore(state, scopeSlot) === \"inactive\";\n}\n\nexport function effectiveMaxParallelForCore(state: SelectionCoreState): number {\n const constrainedScope = state.selection.activeScopeSlots[0];\n return constrainedScope === undefined\n ? state.compiled.maxParallel\n : Math.min(\n state.compiled.maxParallel,\n requiredScopeForCore(state, constrainedScope).maxParallel\n );\n}\n\nfunction isMutexHeld(state: SelectionCoreState, mutexId: string): boolean {\n if (state.selection.legacyRunningMutexes?.includes(mutexId) === true) return true;\n const mutexSlot = state.compiled.mutexSlotById.get(mutexId);\n return mutexSlot !== undefined && numberFor(state.selection.mutexHolders, mutexSlot) > 0;\n}\n\nfunction sorted(values: readonly string[]): readonly string[] {\n return Object.freeze([...values].sort(compareText));\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"selection-query.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/selection-query.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionSelectionRejectionReason } from \"../../../project-definition/scheduler-policy.ts\";\nimport type { CompiledAdmissionGraph } from \"./compiled-graph.ts\";\nimport {\n requiredTaskForCompiled,\n requiredTaskResourceClaimsForCompiled\n} from \"./compiled-graph-lookup.ts\";\nimport {\n numberFor,\n statusForSelection,\n type AdmissionSelectionIndex,\n type CoreTaskStatus\n} from \"./selection-index.ts\";\nimport {\n compareScopeCapacityForCompiled,\n requiredScopeForCompiled,\n requiredTaskSlotForCompiled\n} from \"./selection-seed.ts\";\nimport type { PlannedTask, PlannedTaskGraph } from \"../graph.ts\";\n\ntype SelectionCoreState = Readonly<{\n readonly compiled: CompiledAdmissionGraph;\n readonly selection: AdmissionSelectionIndex;\n}>;\n\nexport interface AdmissionCoreSelection {\n readonly canAdmit: boolean;\n readonly task: PlannedTask;\n}\n\nexport function statusForCore(state: SelectionCoreState, taskSlot: number): CoreTaskStatus {\n return statusForSelection(state.selection, taskSlot);\n}\n\nexport function isCoreComplete(state: SelectionCoreState): boolean {\n return state.selection.remainingTaskCount === 0;\n}\n\nexport function requiredTaskForCore(state: SelectionCoreState, taskSlot: number): PlannedTask {\n return requiredTaskForCompiled(state.compiled, taskSlot);\n}\n\nexport function requiredTaskSlotForCore(state: SelectionCoreState, taskId: string): number {\n return requiredTaskSlotForCompiled(state.compiled, taskId);\n}\n\nexport function requiredScopeForCore(\n state: SelectionCoreState,\n scopeSlot: number\n): PlannedTaskGraph[\"scopes\"][number] {\n return requiredScopeForCompiled(state.compiled, scopeSlot);\n}\n\nexport function requiredScopeSlotForCore(state: SelectionCoreState, scopeId: string): number {\n const scopeSlot = state.compiled.scopeSlotById.get(scopeId);\n if (scopeSlot === undefined) throw new Error(`admission core scope is unknown: ${scopeId}`);\n return scopeSlot;\n}\n\n/** Public validation and catalog payloads preserve lexical duplicate occurrences. */\nexport function selectionRejectionForPendingTask(\n state: SelectionCoreState,\n taskSlot: number\n): AdmissionSelectionRejectionReason | undefined {\n const stage = blockerStageFor(state, taskSlot);\n return stage === undefined\n ? capacityRejectionFor(state, taskSlot)\n : blockerPayloadFor(state, taskSlot, stage);\n}\n\ntype PendingBlockerStage = \"depends-on-pending\" | \"mutex-held\" | \"observes-pending\";\n\n/** Candidate scheduling uses only indexed counters and does not materialize public payloads. */\nfunction blockerStageFor(\n state: SelectionCoreState,\n taskSlot: number\n): PendingBlockerStage | undefined {\n const selection = state.selection;\n if (numberFor(selection.pendingDependencies, taskSlot) > 0) return \"depends-on-pending\";\n if (numberFor(selection.pendingObservations, taskSlot) > 0) return \"observes-pending\";\n return numberFor(selection.heldMutexBlockers, taskSlot) > 0 ? \"mutex-held\" : undefined;\n}\n\nfunction blockerPayloadFor(\n state: SelectionCoreState,\n taskSlot: number,\n stage: PendingBlockerStage\n): AdmissionSelectionRejectionReason {\n const task = requiredTaskForCore(state, taskSlot);\n if (stage === \"depends-on-pending\") {\n return Object.freeze({\n kind: stage,\n taskIds: sorted(\n task.dependsOn.filter(\n (taskId) =>\n statusForCore(state, requiredTaskSlotForCore(state, taskId)).kind !== \"settled\"\n )\n )\n });\n }\n if (stage === \"observes-pending\") {\n return Object.freeze({\n kind: stage,\n taskIds: sorted(\n task.observes.filter(\n (taskId) =>\n statusForCore(state, requiredTaskSlotForCore(state, taskId)).kind !== \"settled\"\n )\n )\n });\n }\n return Object.freeze({\n kind: stage,\n mutexIds: sorted(task.mutex.filter((mutexId) => isMutexHeld(state, mutexId)))\n });\n}\n\nexport function isAdmissionEligibleForPendingTask(\n state: SelectionCoreState,\n taskSlot: number\n): boolean {\n return (\n blockerStageFor(state, taskSlot) === undefined && hasCapacityForPendingTask(state, taskSlot)\n );\n}\n\nfunction hasCapacityForPendingTask(state: SelectionCoreState, taskSlot: number): boolean {\n const running = state.selection.runningTotal;\n return (\n scopeCapacityBlockerFor(state, taskSlot, running) === undefined &&\n running < state.compiled.maxParallel &&\n resourceCapacityRejectionFor(state, taskSlot) === undefined\n );\n}\n\nfunction capacityRejectionFor(\n state: SelectionCoreState,\n taskSlot: number\n): AdmissionSelectionRejectionReason | undefined {\n const running = state.selection.runningTotal;\n const scope = scopeCapacityBlockerFor(state, taskSlot, running);\n if (scope !== undefined) {\n return Object.freeze({\n kind: \"scope-capacity-reached\",\n maxParallel: scope.maxParallel,\n running,\n scopeId: scope.id\n });\n }\n if (running >= state.compiled.maxParallel) {\n return Object.freeze({\n kind: \"root-capacity-reached\",\n maxParallel: state.compiled.maxParallel,\n running\n });\n }\n return resourceCapacityRejectionFor(state, taskSlot);\n}\n\nfunction resourceCapacityRejectionFor(\n state: SelectionCoreState,\n taskSlot: number\n):\n | Extract<AdmissionSelectionRejectionReason, { readonly kind: \"resource-capacity-insufficient\" }>\n | undefined {\n const task = requiredTaskForCore(state, taskSlot);\n const insufficient: Extract<\n AdmissionSelectionRejectionReason,\n { readonly kind: \"resource-capacity-insufficient\" }\n >[\"resources\"][number][] = [];\n for (const claim of requiredTaskResourceClaimsForCompiled(state.compiled, taskSlot)) {\n const capacity = state.compiled.resourceCapacityBySlot[claim.resourceSlot];\n const inUse = numberFor(state.selection.resourceInUse, claim.resourceSlot);\n if (capacity === undefined) {\n throw new Error(`admission core resource slot is unknown: ${claim.resourceSlot}`);\n }\n if (inUse + claim.units <= capacity) continue;\n const resourceId = state.compiled.graph.resourceCapacities[claim.resourceSlot]?.resourceId;\n if (resourceId === undefined) {\n throw new Error(`admission core task resource claim is missing: ${task.id}`);\n }\n insufficient.push(\n Object.freeze({\n available: capacity - inUse,\n capacity,\n inUse,\n required: claim.units,\n resourceId\n })\n );\n }\n return insufficient.length === 0\n ? undefined\n : Object.freeze({\n kind: \"resource-capacity-insufficient\",\n resources: Object.freeze(insufficient)\n });\n}\n\n/** Active scope capacity is global; an activating candidate supplies one additional exact scope fact. */\nfunction scopeCapacityBlockerFor(\n state: SelectionCoreState,\n taskSlot: number,\n running: number\n): PlannedTaskGraph[\"scopes\"][number] | undefined {\n let selectedScopeSlot: number | undefined = state.selection.activeScopeSlots[0];\n if (\n selectedScopeSlot !== undefined &&\n requiredScopeForCore(state, selectedScopeSlot).maxParallel > running\n ) {\n selectedScopeSlot = undefined;\n }\n const taskScopeSlot = state.compiled.taskScopeSlots[taskSlot];\n if (\n taskScopeSlot !== undefined &&\n isScopeInactiveForCore(state, taskScopeSlot) &&\n state.compiled.taskActivatesScope[taskSlot] === true &&\n requiredScopeForCore(state, taskScopeSlot).maxParallel <= running &&\n (selectedScopeSlot === undefined ||\n compareScopeCapacityForCompiled(state.compiled, taskScopeSlot, selectedScopeSlot) < 0)\n ) {\n selectedScopeSlot = taskScopeSlot;\n }\n return selectedScopeSlot === undefined\n ? undefined\n : requiredScopeForCore(state, selectedScopeSlot);\n}\n\nexport function admissionCandidatesForCore(\n state: SelectionCoreState\n): readonly AdmissionCoreSelection[] {\n const candidates: AdmissionCoreSelection[] = [];\n for (const [taskSlot, task] of state.compiled.graph.tasks.entries()) {\n if (statusForCore(state, taskSlot).kind !== \"pending\") continue;\n if (blockerStageFor(state, taskSlot) !== undefined) continue;\n candidates.push(Object.freeze({ canAdmit: hasCapacityForPendingTask(state, taskSlot), task }));\n }\n return Object.freeze(candidates);\n}\n\nexport function scopeToActivateForCore(state: SelectionCoreState, taskId: string): string | null {\n const taskSlot = state.compiled.taskSlotsById.get(taskId);\n if (taskSlot === undefined) return null;\n const scopeSlot = state.compiled.taskScopeSlots[taskSlot];\n if (scopeSlot === undefined || !isScopeInactiveForCore(state, scopeSlot)) return null;\n return state.compiled.taskActivatesScope[taskSlot] === true\n ? requiredScopeForCore(state, scopeSlot).id\n : null;\n}\n\nexport function activeScopesForCore(\n state: SelectionCoreState\n): PlannedTaskGraph[\"scopes\"][number][] {\n return state.selection.activeScopeSlots.map((slot) => requiredScopeForCore(state, slot));\n}\n\nexport function scopeLifecycleForCore(\n state: SelectionCoreState,\n scopeSlot: number\n): \"inactive\" | \"active\" | \"closed\" {\n const scope = requiredScopeForCore(state, scopeSlot);\n if (\n statusForCore(state, requiredTaskSlotForCore(state, scope.terminalTaskId)).kind === \"settled\"\n ) {\n return \"closed\";\n }\n return numberFor(state.selection.activeScopes, scopeSlot) > 0 ? \"active\" : \"inactive\";\n}\n\nexport function isScopeInactiveForCore(state: SelectionCoreState, scopeSlot: number): boolean {\n return scopeLifecycleForCore(state, scopeSlot) === \"inactive\";\n}\n\nexport function effectiveMaxParallelForCore(state: SelectionCoreState): number {\n const constrainedScope = state.selection.activeScopeSlots[0];\n return constrainedScope === undefined\n ? state.compiled.maxParallel\n : Math.min(\n state.compiled.maxParallel,\n requiredScopeForCore(state, constrainedScope).maxParallel\n );\n}\n\nfunction isMutexHeld(state: SelectionCoreState, mutexId: string): boolean {\n if (state.selection.legacyRunningMutexes?.includes(mutexId) === true) return true;\n const mutexSlot = state.compiled.mutexSlotById.get(mutexId);\n return mutexSlot !== undefined && numberFor(state.selection.mutexHolders, mutexSlot) > 0;\n}\n\nfunction sorted(values: readonly string[]): readonly string[] {\n return Object.freeze([...values].sort(compareText));\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { requiredTaskMutexSlotsForCompiled, requiredTaskResourceClaimsForCompiled } from "./compiled-graph-lookup.mjs";
1
2
  import { forcedQueueFromTaskSlots, freezeSelectionIndex, persistentNumbersFor, persistentStatuses, statusForStore } from "./selection-index.mjs";
2
3
  /** Builds every immutable selection index from one static graph and one exact status seed. */
3
4
  export function selectionIndexForSeed(compiled, statuses, activeScopeIds, legacyRunningMutexes) {
@@ -35,10 +36,11 @@ function seedTaskCounters(compiled, statuses) {
35
36
  remainingTaskCount += 1;
36
37
  if (status.kind === "running") {
37
38
  runningTotal += 1;
38
- for (const mutexSlot of compiled.taskMutexSlots[taskSlot])
39
- mutexHolders[mutexSlot] += 1;
40
- for (const claim of compiled.taskResourceClaims[taskSlot]) {
41
- resourceInUse[claim.resourceSlot] += claim.units;
39
+ for (const mutexSlot of requiredTaskMutexSlotsForCompiled(compiled, taskSlot)) {
40
+ incrementCounter(mutexHolders, mutexSlot, 1, "mutex holder");
41
+ }
42
+ for (const claim of requiredTaskResourceClaimsForCompiled(compiled, taskSlot)) {
43
+ incrementCounter(resourceInUse, claim.resourceSlot, claim.units, "resource usage");
42
44
  }
43
45
  }
44
46
  appendDependencyCountsForSeed(compiled, statuses, task.dependsOn, pendingDependencies, nonCompletedDependencies);
@@ -82,14 +84,29 @@ function heldMutexBlockersForSeed(compiled, mutexHolders, legacyRunningMutexes)
82
84
  const blockers = compiled.graph.tasks.map(() => 0);
83
85
  const legacyHeldMutexes = new Set(legacyRunningMutexes);
84
86
  for (const [taskSlot, task] of compiled.graph.tasks.entries()) {
85
- for (const [mutexOccurrence, mutexSlot] of compiled.taskMutexSlots[taskSlot].entries()) {
86
- blockers[taskSlot] += mutexHolders[mutexSlot];
87
- if (legacyHeldMutexes.has(task.mutex[mutexOccurrence]))
88
- blockers[taskSlot] += 1;
87
+ for (const [mutexOccurrence, mutexSlot] of requiredTaskMutexSlotsForCompiled(compiled, taskSlot).entries()) {
88
+ const holderCount = mutexHolders[mutexSlot];
89
+ if (holderCount === undefined) {
90
+ throw new Error(`admission core mutex slot is unknown: ${mutexSlot}`);
91
+ }
92
+ incrementCounter(blockers, taskSlot, holderCount, "mutex blocker");
93
+ const mutexId = task.mutex[mutexOccurrence];
94
+ if (mutexId === undefined) {
95
+ throw new Error(`admission core mutex occurrence is unknown: ${mutexOccurrence}`);
96
+ }
97
+ if (legacyHeldMutexes.has(mutexId))
98
+ incrementCounter(blockers, taskSlot, 1, "mutex blocker");
89
99
  }
90
100
  }
91
101
  return blockers;
92
102
  }
103
+ function incrementCounter(values, slot, amount, counterName) {
104
+ const current = values[slot];
105
+ if (current === undefined) {
106
+ throw new Error(`admission core ${counterName} slot is unknown: ${slot}`);
107
+ }
108
+ values[slot] = current + amount;
109
+ }
93
110
  function seedActiveScopes(compiled, activeScopeIds) {
94
111
  const activeScopes = Array.from({ length: compiled.graph.scopes.length }, () => 0);
95
112
  for (const scopeId of activeScopeIds ?? []) {
@@ -1 +1 @@
1
- {"version":3,"file":"selection-seed.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/selection-seed.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CompiledAdmissionGraph } from \"./compiled-graph.ts\";\nimport {\n forcedQueueFromTaskSlots,\n freezeSelectionIndex,\n persistentNumbersFor,\n persistentStatuses,\n statusForStore,\n type AdmissionSelectionIndex,\n type CoreTaskStatus,\n type ForcedTaskQueue,\n type StatusStore\n} from \"./selection-index.ts\";\n\ninterface SeedTaskCounters {\n readonly mutexHolders: number[];\n readonly nonCompletedDependencies: number[];\n readonly pendingDependencies: number[];\n readonly pendingObservations: number[];\n readonly remainingTaskCount: number;\n readonly resourceInUse: number[];\n readonly runningTotal: number;\n}\n\n/** Builds every immutable selection index from one static graph and one exact status seed. */\nexport function selectionIndexForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: readonly CoreTaskStatus[],\n activeScopeIds: readonly string[] | undefined,\n legacyRunningMutexes: readonly string[] | undefined\n): AdmissionSelectionIndex {\n const persistentStatus = persistentStatuses(statuses);\n const counters = seedTaskCounters(compiled, persistentStatus);\n const activeScopes = seedActiveScopes(compiled, activeScopeIds);\n return freezeSelectionIndex({\n activeScopeSlots: activeScopeSlotsForSeed(compiled, persistentStatus, activeScopes),\n activeScopes: persistentNumbersFor(activeScopes),\n forcedQueue: forcedQueueForSeed(compiled, persistentStatus, counters),\n heldMutexBlockers: persistentNumbersFor(\n heldMutexBlockersForSeed(compiled, counters.mutexHolders, legacyRunningMutexes)\n ),\n legacyRunningMutexes:\n legacyRunningMutexes === undefined ? undefined : Object.freeze([...legacyRunningMutexes]),\n mutexHolders: persistentNumbersFor(counters.mutexHolders),\n nonCompletedDependencies: persistentNumbersFor(counters.nonCompletedDependencies),\n pendingDependencies: persistentNumbersFor(counters.pendingDependencies),\n pendingObservations: persistentNumbersFor(counters.pendingObservations),\n remainingTaskCount: counters.remainingTaskCount,\n resourceInUse: persistentNumbersFor(counters.resourceInUse),\n runningTotal: counters.runningTotal,\n statuses: persistentStatus\n });\n}\n\n/** Status/running/mutex and relation-counter seed stage. */\nfunction seedTaskCounters(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore\n): SeedTaskCounters {\n const mutexHolders = Array.from({ length: compiled.mutexSlotById.size }, () => 0);\n const pendingDependencies: number[] = [];\n const nonCompletedDependencies: number[] = [];\n const pendingObservations: number[] = [];\n let remainingTaskCount = 0;\n let runningTotal = 0;\n const resourceInUse = compiled.resourceCapacityBySlot.map(() => 0);\n for (const [taskSlot, task] of compiled.graph.tasks.entries()) {\n const status = statusForStore(statuses, taskSlot);\n if (status.kind === \"pending\" || status.kind === \"running\") remainingTaskCount += 1;\n if (status.kind === \"running\") {\n runningTotal += 1;\n for (const mutexSlot of compiled.taskMutexSlots[taskSlot]) mutexHolders[mutexSlot] += 1;\n for (const claim of compiled.taskResourceClaims[taskSlot]) {\n resourceInUse[claim.resourceSlot] += claim.units;\n }\n }\n appendDependencyCountsForSeed(\n compiled,\n statuses,\n task.dependsOn,\n pendingDependencies,\n nonCompletedDependencies\n );\n pendingObservations.push(observationCountForSeed(compiled, statuses, task.observes));\n }\n return {\n mutexHolders,\n nonCompletedDependencies,\n pendingDependencies,\n pendingObservations,\n remainingTaskCount,\n resourceInUse,\n runningTotal\n };\n}\n\nfunction appendDependencyCountsForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore,\n dependencyIds: readonly string[],\n pendingDependencies: number[],\n nonCompletedDependencies: number[]\n): void {\n let pending = 0;\n let nonCompleted = 0;\n for (const dependencyId of dependencyIds) {\n const dependency = statusForStore(\n statuses,\n requiredTaskSlotForCompiled(compiled, dependencyId)\n );\n if (dependency.kind !== \"settled\") pending += 1;\n else if (dependency.settlementKind !== \"completed\") nonCompleted += 1;\n }\n pendingDependencies.push(pending);\n nonCompletedDependencies.push(nonCompleted);\n}\n\nfunction observationCountForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore,\n observationIds: readonly string[]\n): number {\n let pending = 0;\n for (const observationId of observationIds) {\n if (\n statusForStore(statuses, requiredTaskSlotForCompiled(compiled, observationId)).kind !==\n \"settled\"\n ) {\n pending += 1;\n }\n }\n return pending;\n}\n\n/** Legacy external mutexes and dynamic holder occurrences intentionally contribute independently. */\nfunction heldMutexBlockersForSeed(\n compiled: CompiledAdmissionGraph,\n mutexHolders: readonly number[],\n legacyRunningMutexes: readonly string[] | undefined\n): number[] {\n const blockers = compiled.graph.tasks.map(() => 0);\n const legacyHeldMutexes = new Set(legacyRunningMutexes);\n for (const [taskSlot, task] of compiled.graph.tasks.entries()) {\n for (const [mutexOccurrence, mutexSlot] of compiled.taskMutexSlots[taskSlot].entries()) {\n blockers[taskSlot] += mutexHolders[mutexSlot];\n if (legacyHeldMutexes.has(task.mutex[mutexOccurrence])) blockers[taskSlot] += 1;\n }\n }\n return blockers;\n}\n\nfunction seedActiveScopes(\n compiled: CompiledAdmissionGraph,\n activeScopeIds: readonly string[] | undefined\n): number[] {\n const activeScopes = Array.from({ length: compiled.graph.scopes.length }, () => 0);\n for (const scopeId of activeScopeIds ?? []) {\n const scopeSlot = compiled.scopeSlotById.get(scopeId);\n if (scopeSlot !== undefined) activeScopes[scopeSlot] = 1;\n }\n return activeScopes;\n}\n\n/** Active root seed stage excludes scopes whose terminal is already settled. */\nfunction activeScopeSlotsForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore,\n activeScopes: readonly number[]\n): readonly number[] {\n const slots = activeScopes\n .map((active, scopeSlot) => (active > 0 ? scopeSlot : undefined))\n .filter((scopeSlot): scopeSlot is number => scopeSlot !== undefined)\n .filter(\n (scopeSlot) =>\n statusForStore(\n statuses,\n requiredTaskSlotForCompiled(\n compiled,\n requiredScopeForCompiled(compiled, scopeSlot).terminalTaskId\n )\n ).kind !== \"settled\"\n );\n return sortedActiveScopeSlots(compiled, slots);\n}\n\n/** Forced-frontier seed stage retains only eligible pending dependents. */\nfunction forcedQueueForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore,\n counters: SeedTaskCounters\n): ForcedTaskQueue {\n const forced = compiled.graph.tasks\n .map((_, taskSlot) => taskSlot)\n .filter(\n (taskSlot) =>\n statusForStore(statuses, taskSlot).kind === \"pending\" &&\n counters.pendingDependencies[taskSlot] === 0 &&\n (counters.nonCompletedDependencies[taskSlot] ?? 0) > 0\n );\n return forcedQueueFromTaskSlots(forced);\n}\n\nexport function insertActiveScopeSlot(\n compiled: CompiledAdmissionGraph,\n slots: readonly number[],\n next: number\n): readonly number[] {\n if (slots.includes(next)) return slots;\n return Object.freeze(sortedActiveScopeSlots(compiled, [...slots, next]));\n}\n\nexport function sortedActiveScopeSlots(\n compiled: CompiledAdmissionGraph,\n slots: readonly number[]\n): readonly number[] {\n return Object.freeze(\n [...slots].sort((left, right) => compareScopeCapacityForCompiled(compiled, left, right))\n );\n}\n\nexport function compareScopeCapacityForCompiled(\n compiled: CompiledAdmissionGraph,\n left: number,\n right: number\n): number {\n const leftScope = requiredScopeForCompiled(compiled, left);\n const rightScope = requiredScopeForCompiled(compiled, right);\n return leftScope.maxParallel - rightScope.maxParallel || compareText(leftScope.id, rightScope.id);\n}\n\nexport function requiredTaskSlotForCompiled(\n compiled: CompiledAdmissionGraph,\n taskId: string\n): number {\n const taskSlot = compiled.taskSlotsById.get(taskId);\n if (taskSlot === undefined) throw new Error(`admission core task is unknown: ${taskId}`);\n return taskSlot;\n}\n\nexport function requiredScopeForCompiled(\n compiled: CompiledAdmissionGraph,\n scopeSlot: number\n): CompiledAdmissionGraph[\"graph\"][\"scopes\"][number] {\n const scope = compiled.graph.scopes[scopeSlot];\n if (scope === undefined) throw new Error(`admission core scope slot is unknown: ${scopeSlot}`);\n return scope;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
1
+ {"version":3,"file":"selection-seed.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/selection-seed.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CompiledAdmissionGraph } from \"./compiled-graph.ts\";\nimport {\n requiredTaskMutexSlotsForCompiled,\n requiredTaskResourceClaimsForCompiled\n} from \"./compiled-graph-lookup.ts\";\nimport {\n forcedQueueFromTaskSlots,\n freezeSelectionIndex,\n persistentNumbersFor,\n persistentStatuses,\n statusForStore,\n type AdmissionSelectionIndex,\n type CoreTaskStatus,\n type ForcedTaskQueue,\n type StatusStore\n} from \"./selection-index.ts\";\n\ninterface SeedTaskCounters {\n readonly mutexHolders: number[];\n readonly nonCompletedDependencies: number[];\n readonly pendingDependencies: number[];\n readonly pendingObservations: number[];\n readonly remainingTaskCount: number;\n readonly resourceInUse: number[];\n readonly runningTotal: number;\n}\n\n/** Builds every immutable selection index from one static graph and one exact status seed. */\nexport function selectionIndexForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: readonly CoreTaskStatus[],\n activeScopeIds: readonly string[] | undefined,\n legacyRunningMutexes: readonly string[] | undefined\n): AdmissionSelectionIndex {\n const persistentStatus = persistentStatuses(statuses);\n const counters = seedTaskCounters(compiled, persistentStatus);\n const activeScopes = seedActiveScopes(compiled, activeScopeIds);\n return freezeSelectionIndex({\n activeScopeSlots: activeScopeSlotsForSeed(compiled, persistentStatus, activeScopes),\n activeScopes: persistentNumbersFor(activeScopes),\n forcedQueue: forcedQueueForSeed(compiled, persistentStatus, counters),\n heldMutexBlockers: persistentNumbersFor(\n heldMutexBlockersForSeed(compiled, counters.mutexHolders, legacyRunningMutexes)\n ),\n legacyRunningMutexes:\n legacyRunningMutexes === undefined ? undefined : Object.freeze([...legacyRunningMutexes]),\n mutexHolders: persistentNumbersFor(counters.mutexHolders),\n nonCompletedDependencies: persistentNumbersFor(counters.nonCompletedDependencies),\n pendingDependencies: persistentNumbersFor(counters.pendingDependencies),\n pendingObservations: persistentNumbersFor(counters.pendingObservations),\n remainingTaskCount: counters.remainingTaskCount,\n resourceInUse: persistentNumbersFor(counters.resourceInUse),\n runningTotal: counters.runningTotal,\n statuses: persistentStatus\n });\n}\n\n/** Status/running/mutex and relation-counter seed stage. */\nfunction seedTaskCounters(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore\n): SeedTaskCounters {\n const mutexHolders = Array.from({ length: compiled.mutexSlotById.size }, () => 0);\n const pendingDependencies: number[] = [];\n const nonCompletedDependencies: number[] = [];\n const pendingObservations: number[] = [];\n let remainingTaskCount = 0;\n let runningTotal = 0;\n const resourceInUse = compiled.resourceCapacityBySlot.map(() => 0);\n for (const [taskSlot, task] of compiled.graph.tasks.entries()) {\n const status = statusForStore(statuses, taskSlot);\n if (status.kind === \"pending\" || status.kind === \"running\") remainingTaskCount += 1;\n if (status.kind === \"running\") {\n runningTotal += 1;\n for (const mutexSlot of requiredTaskMutexSlotsForCompiled(compiled, taskSlot)) {\n incrementCounter(mutexHolders, mutexSlot, 1, \"mutex holder\");\n }\n for (const claim of requiredTaskResourceClaimsForCompiled(compiled, taskSlot)) {\n incrementCounter(resourceInUse, claim.resourceSlot, claim.units, \"resource usage\");\n }\n }\n appendDependencyCountsForSeed(\n compiled,\n statuses,\n task.dependsOn,\n pendingDependencies,\n nonCompletedDependencies\n );\n pendingObservations.push(observationCountForSeed(compiled, statuses, task.observes));\n }\n return {\n mutexHolders,\n nonCompletedDependencies,\n pendingDependencies,\n pendingObservations,\n remainingTaskCount,\n resourceInUse,\n runningTotal\n };\n}\n\nfunction appendDependencyCountsForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore,\n dependencyIds: readonly string[],\n pendingDependencies: number[],\n nonCompletedDependencies: number[]\n): void {\n let pending = 0;\n let nonCompleted = 0;\n for (const dependencyId of dependencyIds) {\n const dependency = statusForStore(\n statuses,\n requiredTaskSlotForCompiled(compiled, dependencyId)\n );\n if (dependency.kind !== \"settled\") pending += 1;\n else if (dependency.settlementKind !== \"completed\") nonCompleted += 1;\n }\n pendingDependencies.push(pending);\n nonCompletedDependencies.push(nonCompleted);\n}\n\nfunction observationCountForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore,\n observationIds: readonly string[]\n): number {\n let pending = 0;\n for (const observationId of observationIds) {\n if (\n statusForStore(statuses, requiredTaskSlotForCompiled(compiled, observationId)).kind !==\n \"settled\"\n ) {\n pending += 1;\n }\n }\n return pending;\n}\n\n/** Legacy external mutexes and dynamic holder occurrences intentionally contribute independently. */\nfunction heldMutexBlockersForSeed(\n compiled: CompiledAdmissionGraph,\n mutexHolders: readonly number[],\n legacyRunningMutexes: readonly string[] | undefined\n): number[] {\n const blockers = compiled.graph.tasks.map(() => 0);\n const legacyHeldMutexes = new Set(legacyRunningMutexes);\n for (const [taskSlot, task] of compiled.graph.tasks.entries()) {\n for (const [mutexOccurrence, mutexSlot] of requiredTaskMutexSlotsForCompiled(\n compiled,\n taskSlot\n ).entries()) {\n const holderCount = mutexHolders[mutexSlot];\n if (holderCount === undefined) {\n throw new Error(`admission core mutex slot is unknown: ${mutexSlot}`);\n }\n incrementCounter(blockers, taskSlot, holderCount, \"mutex blocker\");\n const mutexId = task.mutex[mutexOccurrence];\n if (mutexId === undefined) {\n throw new Error(`admission core mutex occurrence is unknown: ${mutexOccurrence}`);\n }\n if (legacyHeldMutexes.has(mutexId)) incrementCounter(blockers, taskSlot, 1, \"mutex blocker\");\n }\n }\n return blockers;\n}\n\nfunction incrementCounter(\n values: number[],\n slot: number,\n amount: number,\n counterName: string\n): void {\n const current = values[slot];\n if (current === undefined) {\n throw new Error(`admission core ${counterName} slot is unknown: ${slot}`);\n }\n values[slot] = current + amount;\n}\n\nfunction seedActiveScopes(\n compiled: CompiledAdmissionGraph,\n activeScopeIds: readonly string[] | undefined\n): number[] {\n const activeScopes = Array.from({ length: compiled.graph.scopes.length }, () => 0);\n for (const scopeId of activeScopeIds ?? []) {\n const scopeSlot = compiled.scopeSlotById.get(scopeId);\n if (scopeSlot !== undefined) activeScopes[scopeSlot] = 1;\n }\n return activeScopes;\n}\n\n/** Active root seed stage excludes scopes whose terminal is already settled. */\nfunction activeScopeSlotsForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore,\n activeScopes: readonly number[]\n): readonly number[] {\n const slots = activeScopes\n .map((active, scopeSlot) => (active > 0 ? scopeSlot : undefined))\n .filter((scopeSlot): scopeSlot is number => scopeSlot !== undefined)\n .filter(\n (scopeSlot) =>\n statusForStore(\n statuses,\n requiredTaskSlotForCompiled(\n compiled,\n requiredScopeForCompiled(compiled, scopeSlot).terminalTaskId\n )\n ).kind !== \"settled\"\n );\n return sortedActiveScopeSlots(compiled, slots);\n}\n\n/** Forced-frontier seed stage retains only eligible pending dependents. */\nfunction forcedQueueForSeed(\n compiled: CompiledAdmissionGraph,\n statuses: StatusStore,\n counters: SeedTaskCounters\n): ForcedTaskQueue {\n const forced = compiled.graph.tasks\n .map((_, taskSlot) => taskSlot)\n .filter(\n (taskSlot) =>\n statusForStore(statuses, taskSlot).kind === \"pending\" &&\n counters.pendingDependencies[taskSlot] === 0 &&\n (counters.nonCompletedDependencies[taskSlot] ?? 0) > 0\n );\n return forcedQueueFromTaskSlots(forced);\n}\n\nexport function insertActiveScopeSlot(\n compiled: CompiledAdmissionGraph,\n slots: readonly number[],\n next: number\n): readonly number[] {\n if (slots.includes(next)) return slots;\n return Object.freeze(sortedActiveScopeSlots(compiled, [...slots, next]));\n}\n\nexport function sortedActiveScopeSlots(\n compiled: CompiledAdmissionGraph,\n slots: readonly number[]\n): readonly number[] {\n return Object.freeze(\n [...slots].sort((left, right) => compareScopeCapacityForCompiled(compiled, left, right))\n );\n}\n\nexport function compareScopeCapacityForCompiled(\n compiled: CompiledAdmissionGraph,\n left: number,\n right: number\n): number {\n const leftScope = requiredScopeForCompiled(compiled, left);\n const rightScope = requiredScopeForCompiled(compiled, right);\n return leftScope.maxParallel - rightScope.maxParallel || compareText(leftScope.id, rightScope.id);\n}\n\nexport function requiredTaskSlotForCompiled(\n compiled: CompiledAdmissionGraph,\n taskId: string\n): number {\n const taskSlot = compiled.taskSlotsById.get(taskId);\n if (taskSlot === undefined) throw new Error(`admission core task is unknown: ${taskId}`);\n return taskSlot;\n}\n\nexport function requiredScopeForCompiled(\n compiled: CompiledAdmissionGraph,\n scopeSlot: number\n): CompiledAdmissionGraph[\"graph\"][\"scopes\"][number] {\n const scope = compiled.graph.scopes[scopeSlot];\n if (scope === undefined) throw new Error(`admission core scope slot is unknown: ${scopeSlot}`);\n return scope;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { requiredReverseDependenciesForCompiled, requiredReverseMutexOccurrencesForCompiled, requiredReverseObservationsForCompiled, requiredScopeTerminalSlotsForCompiled, requiredTaskMutexSlotsForCompiled, requiredTaskResourceClaimsForCompiled } from "./compiled-graph-lookup.mjs";
1
2
  import { enqueueForcedTaskSlots, freezeSelectionIndex, numberFor, statusForSelection, statusForStore, withNumberDeltas, withStatusAt } from "./selection-index.mjs";
2
3
  import { insertActiveScopeSlot } from "./selection-seed.mjs";
3
4
  /** Applies one status event through staged persistent index deltas. */
@@ -63,19 +64,18 @@ function applyRunningOccupancyDelta(compiled, facts) {
63
64
  }
64
65
  }
65
66
  function withResourceClaimDelta(compiled, resourceInUse, taskSlot, direction) {
66
- return withNumberDeltas(resourceInUse, compiled.taskResourceClaims[taskSlot].map(({ resourceSlot, units }) => [resourceSlot, direction * units]));
67
+ return withNumberDeltas(resourceInUse, requiredTaskResourceClaimsForCompiled(compiled, taskSlot).map(({ resourceSlot, units }) => [resourceSlot, direction * units]));
67
68
  }
68
69
  function withMutexHolderDelta(compiled, mutexHolders, taskSlot, delta) {
69
- return withNumberDeltas(mutexHolders, compiled.taskMutexSlots[taskSlot].map((mutexSlot) => [mutexSlot, delta]));
70
+ return withNumberDeltas(mutexHolders, requiredTaskMutexSlotsForCompiled(compiled, taskSlot).map((mutexSlot) => [mutexSlot, delta]));
70
71
  }
71
72
  function withMutexBlockerDelta(compiled, blockers, taskSlot, delta) {
72
73
  return withNumberDeltas(blockers, mutexBlockerDeltasFor(compiled, taskSlot, delta));
73
74
  }
74
75
  function mutexBlockerDeltasFor(compiled, taskSlot, delta) {
75
76
  const deltas = [];
76
- for (const mutexSlot of compiled.taskMutexSlots[taskSlot]) {
77
- for (const blockedTaskSlot of compiled.relationIndexes.reverseMutexOccurrences[mutexSlot] ??
78
- []) {
77
+ for (const mutexSlot of requiredTaskMutexSlotsForCompiled(compiled, taskSlot)) {
78
+ for (const blockedTaskSlot of requiredReverseMutexOccurrencesForCompiled(compiled, mutexSlot)) {
79
79
  deltas.push([blockedTaskSlot, delta]);
80
80
  }
81
81
  }
@@ -86,12 +86,12 @@ function applySettlementRelationDelta(compiled, facts) {
86
86
  const { previous, status, taskSlot } = facts;
87
87
  if (previous.kind === "settled" || status.kind !== "settled")
88
88
  return;
89
- const reverseDependencies = compiled.relationIndexes.reverseDependencies[taskSlot];
89
+ const reverseDependencies = requiredReverseDependenciesForCompiled(compiled, taskSlot);
90
90
  facts.pendingDependencies = withNumberDeltas(facts.pendingDependencies, reverseDependencies.map((dependentSlot) => [dependentSlot, -1]));
91
91
  if (status.settlementKind !== "completed") {
92
92
  facts.nonCompletedDependencies = withNumberDeltas(facts.nonCompletedDependencies, reverseDependencies.map((dependentSlot) => [dependentSlot, 1]));
93
93
  }
94
- facts.pendingObservations = withNumberDeltas(facts.pendingObservations, compiled.relationIndexes.reverseObservations[taskSlot].map((observerSlot) => [observerSlot, -1]));
94
+ facts.pendingObservations = withNumberDeltas(facts.pendingObservations, requiredReverseObservationsForCompiled(compiled, taskSlot).map((observerSlot) => [observerSlot, -1]));
95
95
  facts.forcedQueue = enqueueForcedTaskSlots(facts.forcedQueue, newlyForcedTaskSlots(facts, reverseDependencies));
96
96
  }
97
97
  function newlyForcedTaskSlots(facts, reverseDependencies) {
@@ -114,7 +114,7 @@ function applyScopeLifecycleDelta(compiled, facts) {
114
114
  }
115
115
  if (previous.kind === "settled" || status.kind !== "settled")
116
116
  return;
117
- for (const scopeSlot of compiled.scopeSlotsByTerminalTaskSlot[taskSlot]) {
117
+ for (const scopeSlot of requiredScopeTerminalSlotsForCompiled(compiled, taskSlot)) {
118
118
  facts.activeScopeSlots = Object.freeze(facts.activeScopeSlots.filter((candidate) => candidate !== scopeSlot));
119
119
  }
120
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"selection-transition.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/selection-transition.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CompiledAdmissionGraph } from \"./compiled-graph.ts\";\nimport {\n enqueueForcedTaskSlots,\n freezeSelectionIndex,\n numberFor,\n statusForSelection,\n statusForStore,\n withNumberDeltas,\n withStatusAt,\n type AdmissionSelectionIndex,\n type CoreTaskStatus,\n type ForcedTaskQueue,\n type NumberStore,\n type StatusStore\n} from \"./selection-index.ts\";\nimport { insertActiveScopeSlot } from \"./selection-seed.ts\";\n\ninterface MutableTransitionFacts {\n readonly activatedScopeSlot: number | undefined;\n activeScopeSlots: readonly number[];\n activeScopes: NumberStore;\n forcedQueue: ForcedTaskQueue;\n heldMutexBlockers: NumberStore;\n mutexHolders: NumberStore;\n nonCompletedDependencies: NumberStore;\n pendingDependencies: NumberStore;\n pendingObservations: NumberStore;\n readonly previous: CoreTaskStatus;\n remainingTaskCount: number;\n resourceInUse: NumberStore;\n runningTotal: number;\n readonly status: CoreTaskStatus;\n statuses: StatusStore;\n readonly taskSlot: number;\n}\n\n/** Applies one status event through staged persistent index deltas. */\nexport function transitionIndexedSelection(\n compiled: CompiledAdmissionGraph,\n selection: AdmissionSelectionIndex,\n taskSlot: number,\n status: CoreTaskStatus,\n activatedScopeSlot: number | undefined\n): AdmissionSelectionIndex {\n const facts = initialTransitionFacts(selection, taskSlot, status, activatedScopeSlot);\n applyRunningOccupancyDelta(compiled, facts);\n applySettlementRelationDelta(compiled, facts);\n applyScopeLifecycleDelta(compiled, facts);\n return freezeSelectionIndex({\n activeScopeSlots: facts.activeScopeSlots,\n activeScopes: facts.activeScopes,\n forcedQueue: facts.forcedQueue,\n heldMutexBlockers: facts.heldMutexBlockers,\n legacyRunningMutexes: selection.legacyRunningMutexes,\n mutexHolders: facts.mutexHolders,\n nonCompletedDependencies: facts.nonCompletedDependencies,\n pendingDependencies: facts.pendingDependencies,\n pendingObservations: facts.pendingObservations,\n remainingTaskCount: facts.remainingTaskCount,\n resourceInUse: facts.resourceInUse,\n runningTotal: facts.runningTotal,\n statuses: facts.statuses\n });\n}\n\nfunction initialTransitionFacts(\n selection: AdmissionSelectionIndex,\n taskSlot: number,\n status: CoreTaskStatus,\n activatedScopeSlot: number | undefined\n): MutableTransitionFacts {\n return {\n activatedScopeSlot,\n activeScopeSlots: selection.activeScopeSlots,\n activeScopes: selection.activeScopes,\n forcedQueue: selection.forcedQueue,\n heldMutexBlockers: selection.heldMutexBlockers,\n mutexHolders: selection.mutexHolders,\n nonCompletedDependencies: selection.nonCompletedDependencies,\n pendingDependencies: selection.pendingDependencies,\n pendingObservations: selection.pendingObservations,\n previous: statusForSelection(selection, taskSlot),\n remainingTaskCount: selection.remainingTaskCount,\n resourceInUse: selection.resourceInUse,\n runningTotal: selection.runningTotal,\n status,\n statuses: withStatusAt(selection.statuses, taskSlot, status),\n taskSlot\n };\n}\n\n/** Running admission/settlement changes the global count and owned constraint occupancy. */\nfunction applyRunningOccupancyDelta(\n compiled: CompiledAdmissionGraph,\n facts: MutableTransitionFacts\n): void {\n const { previous, status, taskSlot } = facts;\n if (previous.kind === \"pending\" && status.kind === \"running\") {\n facts.runningTotal += 1;\n facts.mutexHolders = withMutexHolderDelta(compiled, facts.mutexHolders, taskSlot, 1);\n facts.heldMutexBlockers = withMutexBlockerDelta(compiled, facts.heldMutexBlockers, taskSlot, 1);\n facts.resourceInUse = withResourceClaimDelta(compiled, facts.resourceInUse, taskSlot, 1);\n } else if (previous.kind === \"running\" && status.kind === \"settled\") {\n facts.runningTotal -= 1;\n facts.remainingTaskCount -= 1;\n facts.mutexHolders = withMutexHolderDelta(compiled, facts.mutexHolders, taskSlot, -1);\n facts.heldMutexBlockers = withMutexBlockerDelta(\n compiled,\n facts.heldMutexBlockers,\n taskSlot,\n -1\n );\n facts.resourceInUse = withResourceClaimDelta(compiled, facts.resourceInUse, taskSlot, -1);\n } else if (previous.kind === \"pending\" && status.kind === \"settled\") {\n facts.remainingTaskCount -= 1;\n }\n}\n\nfunction withResourceClaimDelta(\n compiled: CompiledAdmissionGraph,\n resourceInUse: NumberStore,\n taskSlot: number,\n direction: 1 | -1\n): NumberStore {\n return withNumberDeltas(\n resourceInUse,\n compiled.taskResourceClaims[taskSlot].map(\n ({ resourceSlot, units }) => [resourceSlot, direction * units] as const\n )\n );\n}\n\nfunction withMutexHolderDelta(\n compiled: CompiledAdmissionGraph,\n mutexHolders: NumberStore,\n taskSlot: number,\n delta: 1 | -1\n): NumberStore {\n return withNumberDeltas(\n mutexHolders,\n compiled.taskMutexSlots[taskSlot].map((mutexSlot) => [mutexSlot, delta] as const)\n );\n}\n\nfunction withMutexBlockerDelta(\n compiled: CompiledAdmissionGraph,\n blockers: NumberStore,\n taskSlot: number,\n delta: 1 | -1\n): NumberStore {\n return withNumberDeltas(blockers, mutexBlockerDeltasFor(compiled, taskSlot, delta));\n}\n\nfunction mutexBlockerDeltasFor(\n compiled: CompiledAdmissionGraph,\n taskSlot: number,\n delta: 1 | -1\n): readonly (readonly [number, number])[] {\n const deltas: [number, number][] = [];\n for (const mutexSlot of compiled.taskMutexSlots[taskSlot]) {\n for (const blockedTaskSlot of compiled.relationIndexes.reverseMutexOccurrences[mutexSlot] ??\n []) {\n deltas.push([blockedTaskSlot, delta]);\n }\n }\n return deltas;\n}\n\n/** Settlement changes only the changed task's relation reverse fanout and forced frontier. */\nfunction applySettlementRelationDelta(\n compiled: CompiledAdmissionGraph,\n facts: MutableTransitionFacts\n): void {\n const { previous, status, taskSlot } = facts;\n if (previous.kind === \"settled\" || status.kind !== \"settled\") return;\n const reverseDependencies = compiled.relationIndexes.reverseDependencies[taskSlot];\n facts.pendingDependencies = withNumberDeltas(\n facts.pendingDependencies,\n reverseDependencies.map((dependentSlot) => [dependentSlot, -1] as const)\n );\n if (status.settlementKind !== \"completed\") {\n facts.nonCompletedDependencies = withNumberDeltas(\n facts.nonCompletedDependencies,\n reverseDependencies.map((dependentSlot) => [dependentSlot, 1] as const)\n );\n }\n facts.pendingObservations = withNumberDeltas(\n facts.pendingObservations,\n compiled.relationIndexes.reverseObservations[taskSlot].map(\n (observerSlot) => [observerSlot, -1] as const\n )\n );\n facts.forcedQueue = enqueueForcedTaskSlots(\n facts.forcedQueue,\n newlyForcedTaskSlots(facts, reverseDependencies)\n );\n}\n\nfunction newlyForcedTaskSlots(\n facts: MutableTransitionFacts,\n reverseDependencies: readonly number[]\n): ReadonlySet<number> {\n const readyForced = new Set<number>();\n for (const dependentSlot of reverseDependencies) {\n if (\n statusForStore(facts.statuses, dependentSlot).kind === \"pending\" &&\n numberFor(facts.pendingDependencies, dependentSlot) === 0 &&\n numberFor(facts.nonCompletedDependencies, dependentSlot) > 0\n ) {\n readyForced.add(dependentSlot);\n }\n }\n return readyForced;\n}\n\n/** Activation happens before terminal close, preserving the canonical scope lifecycle order. */\nfunction applyScopeLifecycleDelta(\n compiled: CompiledAdmissionGraph,\n facts: MutableTransitionFacts\n): void {\n const { activatedScopeSlot, previous, status, taskSlot } = facts;\n if (activatedScopeSlot !== undefined && numberFor(facts.activeScopes, activatedScopeSlot) === 0) {\n facts.activeScopes = withNumberDeltas(facts.activeScopes, [[activatedScopeSlot, 1]]);\n facts.activeScopeSlots = insertActiveScopeSlot(\n compiled,\n facts.activeScopeSlots,\n activatedScopeSlot\n );\n }\n if (previous.kind === \"settled\" || status.kind !== \"settled\") return;\n for (const scopeSlot of compiled.scopeSlotsByTerminalTaskSlot[taskSlot]) {\n facts.activeScopeSlots = Object.freeze(\n facts.activeScopeSlots.filter((candidate) => candidate !== scopeSlot)\n );\n }\n}\n"]}
1
+ {"version":3,"file":"selection-transition.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/admission-core/selection-transition.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CompiledAdmissionGraph } from \"./compiled-graph.ts\";\nimport {\n requiredReverseDependenciesForCompiled,\n requiredReverseMutexOccurrencesForCompiled,\n requiredReverseObservationsForCompiled,\n requiredScopeTerminalSlotsForCompiled,\n requiredTaskMutexSlotsForCompiled,\n requiredTaskResourceClaimsForCompiled\n} from \"./compiled-graph-lookup.ts\";\nimport {\n enqueueForcedTaskSlots,\n freezeSelectionIndex,\n numberFor,\n statusForSelection,\n statusForStore,\n withNumberDeltas,\n withStatusAt,\n type AdmissionSelectionIndex,\n type CoreTaskStatus,\n type ForcedTaskQueue,\n type NumberStore,\n type StatusStore\n} from \"./selection-index.ts\";\nimport { insertActiveScopeSlot } from \"./selection-seed.ts\";\n\ninterface MutableTransitionFacts {\n readonly activatedScopeSlot: number | undefined;\n activeScopeSlots: readonly number[];\n activeScopes: NumberStore;\n forcedQueue: ForcedTaskQueue;\n heldMutexBlockers: NumberStore;\n mutexHolders: NumberStore;\n nonCompletedDependencies: NumberStore;\n pendingDependencies: NumberStore;\n pendingObservations: NumberStore;\n readonly previous: CoreTaskStatus;\n remainingTaskCount: number;\n resourceInUse: NumberStore;\n runningTotal: number;\n readonly status: CoreTaskStatus;\n statuses: StatusStore;\n readonly taskSlot: number;\n}\n\n/** Applies one status event through staged persistent index deltas. */\nexport function transitionIndexedSelection(\n compiled: CompiledAdmissionGraph,\n selection: AdmissionSelectionIndex,\n taskSlot: number,\n status: CoreTaskStatus,\n activatedScopeSlot: number | undefined\n): AdmissionSelectionIndex {\n const facts = initialTransitionFacts(selection, taskSlot, status, activatedScopeSlot);\n applyRunningOccupancyDelta(compiled, facts);\n applySettlementRelationDelta(compiled, facts);\n applyScopeLifecycleDelta(compiled, facts);\n return freezeSelectionIndex({\n activeScopeSlots: facts.activeScopeSlots,\n activeScopes: facts.activeScopes,\n forcedQueue: facts.forcedQueue,\n heldMutexBlockers: facts.heldMutexBlockers,\n legacyRunningMutexes: selection.legacyRunningMutexes,\n mutexHolders: facts.mutexHolders,\n nonCompletedDependencies: facts.nonCompletedDependencies,\n pendingDependencies: facts.pendingDependencies,\n pendingObservations: facts.pendingObservations,\n remainingTaskCount: facts.remainingTaskCount,\n resourceInUse: facts.resourceInUse,\n runningTotal: facts.runningTotal,\n statuses: facts.statuses\n });\n}\n\nfunction initialTransitionFacts(\n selection: AdmissionSelectionIndex,\n taskSlot: number,\n status: CoreTaskStatus,\n activatedScopeSlot: number | undefined\n): MutableTransitionFacts {\n return {\n activatedScopeSlot,\n activeScopeSlots: selection.activeScopeSlots,\n activeScopes: selection.activeScopes,\n forcedQueue: selection.forcedQueue,\n heldMutexBlockers: selection.heldMutexBlockers,\n mutexHolders: selection.mutexHolders,\n nonCompletedDependencies: selection.nonCompletedDependencies,\n pendingDependencies: selection.pendingDependencies,\n pendingObservations: selection.pendingObservations,\n previous: statusForSelection(selection, taskSlot),\n remainingTaskCount: selection.remainingTaskCount,\n resourceInUse: selection.resourceInUse,\n runningTotal: selection.runningTotal,\n status,\n statuses: withStatusAt(selection.statuses, taskSlot, status),\n taskSlot\n };\n}\n\n/** Running admission/settlement changes the global count and owned constraint occupancy. */\nfunction applyRunningOccupancyDelta(\n compiled: CompiledAdmissionGraph,\n facts: MutableTransitionFacts\n): void {\n const { previous, status, taskSlot } = facts;\n if (previous.kind === \"pending\" && status.kind === \"running\") {\n facts.runningTotal += 1;\n facts.mutexHolders = withMutexHolderDelta(compiled, facts.mutexHolders, taskSlot, 1);\n facts.heldMutexBlockers = withMutexBlockerDelta(compiled, facts.heldMutexBlockers, taskSlot, 1);\n facts.resourceInUse = withResourceClaimDelta(compiled, facts.resourceInUse, taskSlot, 1);\n } else if (previous.kind === \"running\" && status.kind === \"settled\") {\n facts.runningTotal -= 1;\n facts.remainingTaskCount -= 1;\n facts.mutexHolders = withMutexHolderDelta(compiled, facts.mutexHolders, taskSlot, -1);\n facts.heldMutexBlockers = withMutexBlockerDelta(\n compiled,\n facts.heldMutexBlockers,\n taskSlot,\n -1\n );\n facts.resourceInUse = withResourceClaimDelta(compiled, facts.resourceInUse, taskSlot, -1);\n } else if (previous.kind === \"pending\" && status.kind === \"settled\") {\n facts.remainingTaskCount -= 1;\n }\n}\n\nfunction withResourceClaimDelta(\n compiled: CompiledAdmissionGraph,\n resourceInUse: NumberStore,\n taskSlot: number,\n direction: 1 | -1\n): NumberStore {\n return withNumberDeltas(\n resourceInUse,\n requiredTaskResourceClaimsForCompiled(compiled, taskSlot).map(\n ({ resourceSlot, units }) => [resourceSlot, direction * units] as const\n )\n );\n}\n\nfunction withMutexHolderDelta(\n compiled: CompiledAdmissionGraph,\n mutexHolders: NumberStore,\n taskSlot: number,\n delta: 1 | -1\n): NumberStore {\n return withNumberDeltas(\n mutexHolders,\n requiredTaskMutexSlotsForCompiled(compiled, taskSlot).map(\n (mutexSlot) => [mutexSlot, delta] as const\n )\n );\n}\n\nfunction withMutexBlockerDelta(\n compiled: CompiledAdmissionGraph,\n blockers: NumberStore,\n taskSlot: number,\n delta: 1 | -1\n): NumberStore {\n return withNumberDeltas(blockers, mutexBlockerDeltasFor(compiled, taskSlot, delta));\n}\n\nfunction mutexBlockerDeltasFor(\n compiled: CompiledAdmissionGraph,\n taskSlot: number,\n delta: 1 | -1\n): readonly (readonly [number, number])[] {\n const deltas: [number, number][] = [];\n for (const mutexSlot of requiredTaskMutexSlotsForCompiled(compiled, taskSlot)) {\n for (const blockedTaskSlot of requiredReverseMutexOccurrencesForCompiled(compiled, mutexSlot)) {\n deltas.push([blockedTaskSlot, delta]);\n }\n }\n return deltas;\n}\n\n/** Settlement changes only the changed task's relation reverse fanout and forced frontier. */\nfunction applySettlementRelationDelta(\n compiled: CompiledAdmissionGraph,\n facts: MutableTransitionFacts\n): void {\n const { previous, status, taskSlot } = facts;\n if (previous.kind === \"settled\" || status.kind !== \"settled\") return;\n const reverseDependencies = requiredReverseDependenciesForCompiled(compiled, taskSlot);\n facts.pendingDependencies = withNumberDeltas(\n facts.pendingDependencies,\n reverseDependencies.map((dependentSlot) => [dependentSlot, -1] as const)\n );\n if (status.settlementKind !== \"completed\") {\n facts.nonCompletedDependencies = withNumberDeltas(\n facts.nonCompletedDependencies,\n reverseDependencies.map((dependentSlot) => [dependentSlot, 1] as const)\n );\n }\n facts.pendingObservations = withNumberDeltas(\n facts.pendingObservations,\n requiredReverseObservationsForCompiled(compiled, taskSlot).map(\n (observerSlot) => [observerSlot, -1] as const\n )\n );\n facts.forcedQueue = enqueueForcedTaskSlots(\n facts.forcedQueue,\n newlyForcedTaskSlots(facts, reverseDependencies)\n );\n}\n\nfunction newlyForcedTaskSlots(\n facts: MutableTransitionFacts,\n reverseDependencies: readonly number[]\n): ReadonlySet<number> {\n const readyForced = new Set<number>();\n for (const dependentSlot of reverseDependencies) {\n if (\n statusForStore(facts.statuses, dependentSlot).kind === \"pending\" &&\n numberFor(facts.pendingDependencies, dependentSlot) === 0 &&\n numberFor(facts.nonCompletedDependencies, dependentSlot) > 0\n ) {\n readyForced.add(dependentSlot);\n }\n }\n return readyForced;\n}\n\n/** Activation happens before terminal close, preserving the canonical scope lifecycle order. */\nfunction applyScopeLifecycleDelta(\n compiled: CompiledAdmissionGraph,\n facts: MutableTransitionFacts\n): void {\n const { activatedScopeSlot, previous, status, taskSlot } = facts;\n if (activatedScopeSlot !== undefined && numberFor(facts.activeScopes, activatedScopeSlot) === 0) {\n facts.activeScopes = withNumberDeltas(facts.activeScopes, [[activatedScopeSlot, 1]]);\n facts.activeScopeSlots = insertActiveScopeSlot(\n compiled,\n facts.activeScopeSlots,\n activatedScopeSlot\n );\n }\n if (previous.kind === \"settled\" || status.kind !== \"settled\") return;\n for (const scopeSlot of requiredScopeTerminalSlotsForCompiled(compiled, taskSlot)) {\n facts.activeScopeSlots = Object.freeze(\n facts.activeScopeSlots.filter((candidate) => candidate !== scopeSlot)\n );\n }\n}\n"]}