@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.
- package/README.md +36 -5
- package/dist/esm/check/check.mjs +4 -0
- package/dist/esm/check/check.mjs.map +1 -1
- package/dist/esm/check/flag-enablement.mjs +32 -0
- package/dist/esm/check/flag-enablement.mjs.map +1 -0
- package/dist/esm/check/handoff-provider-identity.mjs +18 -0
- package/dist/esm/check/handoff-provider-identity.mjs.map +1 -0
- package/dist/esm/check/inherited-collection.mjs +1 -1
- package/dist/esm/check/inherited-collection.mjs.map +1 -1
- package/dist/esm/check/project-changes.mjs +2 -0
- package/dist/esm/check/project-changes.mjs.map +1 -0
- package/dist/esm/check/project-context.mjs +2 -0
- package/dist/esm/check/project-context.mjs.map +1 -0
- package/dist/esm/check-settlement/facts.mjs.map +1 -1
- package/dist/esm/check-settlement/record-store.mjs +1 -1
- package/dist/esm/check-settlement/record-store.mjs.map +1 -1
- package/dist/esm/data-boundary/canonical-data.mjs +36 -7
- package/dist/esm/data-boundary/canonical-data.mjs.map +1 -1
- package/dist/esm/data-boundary/canonical-json.mjs.map +1 -1
- package/dist/esm/data-boundary/closed-values.mjs +28 -4
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
- package/dist/esm/{package-checks/project-files → data-boundary}/config-glob.mjs +3 -3
- package/dist/esm/data-boundary/config-glob.mjs.map +1 -0
- package/dist/esm/data-boundary/project-path.mjs +19 -0
- package/dist/esm/data-boundary/project-path.mjs.map +1 -0
- package/dist/esm/index.mjs +12 -5
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/machine-output/v4/atomic-publication.mjs +4 -1
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
- package/dist/esm/package-checks/check-authoring.mjs +69 -0
- package/dist/esm/package-checks/check-authoring.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -1
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -1
- package/dist/esm/package-checks/command-check/command-check.mjs +55 -0
- package/dist/esm/package-checks/command-check/command-check.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/contract.mjs +2 -0
- package/dist/esm/package-checks/command-check/contract.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/execution.mjs +134 -0
- package/dist/esm/package-checks/command-check/execution.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/options.mjs +284 -0
- package/dist/esm/package-checks/command-check/options.mjs.map +1 -0
- package/dist/esm/package-checks/command-check/transcript.mjs +26 -0
- package/dist/esm/package-checks/command-check/transcript.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +9 -11
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +2 -4
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/constructor.mjs +9 -11
- package/dist/esm/package-checks/file-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/execution.mjs +2 -4
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
- package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs +38 -0
- package/dist/esm/package-checks/file-metrics/scc/batch-planner.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs +35 -0
- package/dist/esm/package-checks/file-metrics/scc/logical-scan-resources.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +102 -29
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analysis.mjs +7 -2
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +1 -3
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +3 -2
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +6 -6
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +12 -7
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +6 -6
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +5 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +9 -3
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +12 -5
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +20 -8
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/constructor.mjs +9 -11
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/execution.mjs +2 -4
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs +3 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/git.mjs +11 -0
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/path.mjs +1 -17
- package/dist/esm/package-checks/host-environment/path.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/contract.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/result.mjs +43 -17
- package/dist/esm/package-checks/host-environment/process/result.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process/runner.mjs +7 -5
- package/dist/esm/package-checks/host-environment/process/runner.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs +9 -11
- package/dist/esm/package-checks/json-schema-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs +6 -2
- package/dist/esm/package-checks/json-schema-validation/reference-resolver.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs +11 -3
- package/dist/esm/package-checks/json-schema-validation/schema-policy.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/default-check.mjs +9 -11
- package/dist/esm/package-checks/json-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/local-cache-options.mjs +28 -0
- package/dist/esm/package-checks/local-cache-options.mjs.map +1 -0
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs +37 -45
- package/dist/esm/package-checks/maintenance-reminders/maintenance-reminders.mjs.map +1 -1
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs +3 -1
- package/dist/esm/package-checks/maintenance-reminders/maintenance-support.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +19 -33
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs +1 -3
- package/dist/esm/package-checks/markdown-link-validation/markdown-parser.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +3 -18
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +2 -14
- package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +4 -5
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-lint/adapter.mjs +125 -0
- package/dist/esm/package-checks/markdown-lint/adapter.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/default-check.mjs +37 -0
- package/dist/esm/package-checks/markdown-lint/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/execution.mjs +202 -0
- package/dist/esm/package-checks/markdown-lint/execution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/final-data.mjs +16 -0
- package/dist/esm/package-checks/markdown-lint/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/finding-messages.mjs +72 -0
- package/dist/esm/package-checks/markdown-lint/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs +41 -0
- package/dist/esm/package-checks/markdown-lint/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/findings-cache.mjs +110 -0
- package/dist/esm/package-checks/markdown-lint/findings-cache.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options-resolution.mjs +74 -0
- package/dist/esm/package-checks/markdown-lint/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options-validation.mjs +41 -0
- package/dist/esm/package-checks/markdown-lint/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/options.mjs +13 -0
- package/dist/esm/package-checks/markdown-lint/options.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/records.mjs +65 -0
- package/dist/esm/package-checks/markdown-lint/records.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs +14 -0
- package/dist/esm/package-checks/markdown-lint/unavailable-reasons.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +23 -19
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +2 -5
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +22 -6
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/revision-paths.mjs +3 -3
- package/dist/esm/package-checks/project-files/revision-paths.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +11 -15
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/default-check.mjs +9 -11
- package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/execution.mjs +2 -2
- package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs +46 -7
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +3 -4
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -1
- package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs +10 -0
- package/dist/esm/package-tools/admission-policy/define-admission-policy.mjs.map +1 -0
- package/dist/esm/{cache → package-tools/cache}/cache-json-by-key.mjs +13 -14
- package/dist/esm/package-tools/cache/cache-json-by-key.mjs.map +1 -0
- package/dist/esm/package-tools/finding-presentation/finding-presentation.mjs.map +1 -0
- package/dist/esm/{finding-waivers → package-tools/finding-waivers}/reconciliation.mjs +14 -5
- package/dist/esm/package-tools/finding-waivers/reconciliation.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/critical-path-ranking.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.mjs +2 -2
- package/dist/esm/package-tools/learned-critical-path/duration-model/prediction.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.mjs +4 -2
- package/dist/esm/package-tools/learned-critical-path/duration-model/preparation.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/duration-model/recording.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.mjs +8 -8
- package/dist/esm/package-tools/learned-critical-path/duration-model/storage.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs +1 -2
- package/dist/esm/package-tools/learned-critical-path/selection-layers.mjs.map +1 -0
- package/dist/esm/package-tools/learned-critical-path/static-decision.mjs.map +1 -0
- package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/strategy.mjs +3 -3
- package/dist/esm/package-tools/learned-critical-path/strategy.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +8 -5
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +79 -66
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/flag-conditions.mjs +71 -0
- package/dist/esm/project-definition/check-tree/flag-conditions.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +13 -8
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/resolution.mjs +7 -6
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
- package/dist/esm/project-definition/declarative-snapshot.mjs +2 -1
- package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -1
- package/dist/esm/project-definition/project-changes.mjs +70 -0
- package/dist/esm/project-definition/project-changes.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +40 -8
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
- package/dist/esm/project-definition/project-definition.mjs +22 -15
- package/dist/esm/project-definition/project-definition.mjs.map +1 -1
- package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -1
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +9 -6
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -1
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -1
- package/dist/esm/project-run/aggregation.mjs +42 -59
- package/dist/esm/project-run/aggregation.mjs.map +1 -1
- package/dist/esm/project-run/changes/git.mjs +161 -0
- package/dist/esm/project-run/changes/git.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/admitted-check-execution.mjs +41 -0
- package/dist/esm/project-run/check-execution/admitted-check-execution.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/callback.mjs +3 -2
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/dependencies.mjs +80 -5
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +5 -3
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +37 -16
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/flag-controls.mjs +15 -7
- package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/{preflight-result.mjs → preparation-result.mjs} +24 -24
- package/dist/esm/project-run/check-execution/preparation-result.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/{preflight.mjs → preparation.mjs} +52 -52
- package/dist/esm/project-run/check-execution/preparation.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/ready-check-execution.mjs +71 -0
- package/dist/esm/project-run/check-execution/ready-check-execution.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +27 -164
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/scheduled-check-run.mjs +79 -0
- package/dist/esm/project-run/check-execution/scheduled-check-run.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/terminal-result.mjs +70 -25
- package/dist/esm/project-run/check-execution/terminal-result.mjs.map +1 -1
- package/dist/esm/project-run/completion/completion.mjs +18 -1
- package/dist/esm/project-run/completion/completion.mjs.map +1 -1
- package/dist/esm/project-run/controls/contract.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation.mjs +7 -54
- package/dist/esm/project-run/controls/validation.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs +3 -3
- package/dist/esm/project-run/diagnostic-logging/diagnostic-detail-rendering.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -1
- package/dist/esm/project-run/invocation/candidate.mjs +17 -13
- package/dist/esm/project-run/invocation/candidate.mjs.map +1 -1
- package/dist/esm/project-run/invocation/candidates.mjs +26 -0
- package/dist/esm/project-run/invocation/candidates.mjs.map +1 -0
- package/dist/esm/project-run/invocation/creation.mjs +7 -3
- package/dist/esm/project-run/invocation/creation.mjs.map +1 -1
- package/dist/esm/project-run/invocation/execution.mjs +98 -0
- package/dist/esm/project-run/invocation/execution.mjs.map +1 -0
- package/dist/esm/project-run/invocation/run.mjs +13 -112
- package/dist/esm/project-run/invocation/run.mjs.map +1 -1
- package/dist/esm/project-run/invocation/scheduler.mjs +13 -6
- package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -1
- package/dist/esm/project-run/outputs/status.mjs +12 -12
- package/dist/esm/project-run/outputs/status.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/presentation.mjs +31 -11
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +11 -4
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +20 -6
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer.mjs +6 -2
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
- package/dist/esm/project-run/project-context.mjs +2 -1
- package/dist/esm/project-run/project-context.mjs.map +1 -1
- package/dist/esm/project-run/result.mjs +2 -2
- package/dist/esm/project-run/result.mjs.map +1 -1
- package/dist/esm/project-run/run.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs +45 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph-lookup.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +9 -4
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +3 -5
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +25 -8
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +8 -8
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +8 -4
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +12 -6
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +3 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +17 -17
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +18 -6
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
- package/docs/api-mechanics.md +147 -28
- package/docs/changelog.md +145 -2
- package/docs/checks/duplicate-detection.md +22 -3
- package/docs/checks/file-metrics.md +25 -6
- package/docs/checks/function-metrics.md +21 -2
- package/docs/checks/json-schema-validation.md +25 -4
- package/docs/checks/json-validation.md +24 -5
- package/docs/checks/maintenance-reminders.md +30 -6
- package/docs/checks/markdown-link-validation.md +24 -4
- package/docs/checks/markdown-lint.md +167 -0
- package/docs/checks/secret-detection.md +31 -7
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +10 -10
- package/docs/guides/building-project-gate.md +706 -0
- package/docs/guides/callbacks.md +81 -22
- package/docs/guides/check-dependencies.md +41 -10
- package/docs/guides/collecting-project-files.md +7 -7
- package/docs/guides/command-check.md +155 -0
- package/docs/guides/data-boundaries.md +140 -0
- package/docs/guides/extending-check-lifecycle.md +77 -25
- package/docs/guides/finding-waivers.md +43 -1
- package/docs/guides/learned-scheduling.md +1 -1
- package/docs/guides/run-outputs.md +35 -9
- package/docs/guides/scheduling.md +15 -15
- package/docs/output.md +6 -5
- package/package.json +2 -1
- package/src/check/check.ts +332 -92
- package/src/check/flag-enablement.ts +76 -0
- package/src/check/handoff-provider-identity.ts +34 -0
- package/src/check/inherited-collection.ts +1 -1
- package/src/check/project-changes.ts +14 -0
- package/src/check/project-context.ts +11 -0
- package/src/check-settlement/facts.ts +1 -1
- package/src/check-settlement/record-store.ts +1 -1
- package/src/data-boundary/canonical-data.ts +36 -9
- package/src/data-boundary/canonical-json.ts +18 -1
- package/src/data-boundary/closed-values.ts +26 -6
- package/src/data-boundary/config-glob.ts +17 -0
- package/src/data-boundary/project-path.ts +21 -0
- package/src/index.ts +72 -11
- package/src/machine-output/v4/atomic-publication.ts +3 -1
- package/src/package-checks/check-authoring.ts +136 -0
- package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +1 -1
- package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +1 -1
- package/src/package-checks/command-check/command-check.ts +152 -0
- package/src/package-checks/command-check/contract.ts +168 -0
- package/src/package-checks/command-check/execution.ts +211 -0
- package/src/package-checks/command-check/options.ts +331 -0
- package/src/package-checks/command-check/transcript.ts +35 -0
- package/src/package-checks/duplicate-detection/default-check.ts +37 -6
- package/src/package-checks/duplicate-detection/execution.ts +2 -4
- package/src/package-checks/duplicate-detection/finding-messages.ts +2 -2
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
- package/src/package-checks/duplicate-detection/options.ts +6 -3
- package/src/package-checks/duplicate-detection/records.ts +1 -1
- package/src/package-checks/file-metrics/constructor.ts +29 -6
- package/src/package-checks/file-metrics/execution.ts +2 -4
- package/src/package-checks/file-metrics/finding-messages.ts +1 -1
- package/src/package-checks/file-metrics/options.ts +6 -3
- package/src/package-checks/file-metrics/records.ts +1 -1
- package/src/package-checks/file-metrics/scc/availability.ts +1 -1
- package/src/package-checks/file-metrics/scc/batch-planner.ts +56 -0
- package/src/package-checks/file-metrics/scc/logical-scan-resources.ts +59 -0
- package/src/package-checks/file-metrics/scc/scanner.ts +134 -32
- package/src/package-checks/function-metrics/analysis.ts +7 -2
- package/src/package-checks/function-metrics/analyzer/analysis-model.ts +1 -1
- package/src/package-checks/function-metrics/analyzer/extension-output.ts +14 -6
- package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +1 -3
- package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +3 -3
- package/src/package-checks/function-metrics/analyzer/pipeline.ts +4 -2
- package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +6 -6
- package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +1 -1
- package/src/package-checks/function-metrics/analyzer/readers/objc.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +14 -7
- package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +8 -4
- package/src/package-checks/function-metrics/analyzer/readers/python.ts +4 -3
- package/src/package-checks/function-metrics/analyzer/readers/r.ts +2 -1
- package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +9 -3
- package/src/package-checks/function-metrics/analyzer/readers/zig.ts +2 -1
- package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +3 -1
- package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +10 -5
- package/src/package-checks/function-metrics/analyzer-worker-port.ts +20 -6
- package/src/package-checks/function-metrics/constructor.ts +30 -7
- package/src/package-checks/function-metrics/execution.ts +2 -4
- package/src/package-checks/function-metrics/finding-messages.ts +2 -2
- package/src/package-checks/function-metrics/measurement.ts +3 -1
- package/src/package-checks/function-metrics/options.ts +6 -3
- package/src/package-checks/function-metrics/records.ts +1 -1
- package/src/package-checks/host-environment/git.ts +11 -0
- package/src/package-checks/host-environment/path.ts +1 -20
- package/src/package-checks/host-environment/process/contract.ts +17 -9
- package/src/package-checks/host-environment/process/result.ts +48 -20
- package/src/package-checks/host-environment/process/runner.ts +8 -4
- package/src/package-checks/json-schema-validation/default-check.ts +38 -5
- package/src/package-checks/json-schema-validation/options.ts +4 -1
- package/src/package-checks/json-schema-validation/reference-resolver.ts +6 -2
- package/src/package-checks/json-schema-validation/schema-policy.ts +10 -5
- package/src/package-checks/json-validation/default-check.ts +27 -6
- package/src/package-checks/json-validation/options.ts +4 -1
- package/src/package-checks/local-cache-options.ts +40 -0
- package/src/package-checks/maintenance-reminders/maintenance-reminders.ts +89 -9
- package/src/package-checks/maintenance-reminders/maintenance-support.ts +3 -3
- package/src/package-checks/markdown-link-validation/default-check.ts +48 -5
- package/src/package-checks/markdown-link-validation/execution.ts +1 -1
- package/src/package-checks/markdown-link-validation/finding-messages.ts +1 -1
- package/src/package-checks/markdown-link-validation/markdown-parser.ts +1 -5
- package/src/package-checks/markdown-link-validation/options-resolution.ts +2 -19
- package/src/package-checks/markdown-link-validation/options-validation.ts +2 -17
- package/src/package-checks/markdown-link-validation/options.ts +6 -7
- package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +4 -5
- package/src/package-checks/markdown-lint/adapter.ts +167 -0
- package/src/package-checks/markdown-lint/default-check.ts +92 -0
- package/src/package-checks/markdown-lint/execution.ts +266 -0
- package/src/package-checks/markdown-lint/final-data.ts +33 -0
- package/src/package-checks/markdown-lint/finding-messages.ts +87 -0
- package/src/package-checks/markdown-lint/finding-waiver-identity.ts +54 -0
- package/src/package-checks/markdown-lint/findings-cache.ts +141 -0
- package/src/package-checks/markdown-lint/options-resolution.ts +102 -0
- package/src/package-checks/markdown-lint/options-validation.ts +50 -0
- package/src/package-checks/markdown-lint/options.ts +82 -0
- package/src/package-checks/markdown-lint/records.ts +132 -0
- package/src/package-checks/markdown-lint/unavailable-reasons.ts +33 -0
- package/src/package-checks/project-files/collection.ts +38 -22
- package/src/package-checks/project-files/config-glob.ts +1 -17
- package/src/package-checks/project-files/configuration.ts +1 -1
- package/src/package-checks/project-files/gitlink-revision.ts +4 -6
- package/src/package-checks/project-files/gitlink-worktree.ts +35 -7
- package/src/package-checks/project-files/public-collection.ts +1 -1
- package/src/package-checks/project-files/revision-paths.ts +3 -3
- package/src/package-checks/project-files/revision-worktree-files.ts +16 -16
- package/src/package-checks/secret-detection/default-check.ts +29 -6
- package/src/package-checks/secret-detection/execution.ts +2 -2
- package/src/package-checks/secret-detection/input-preparation.ts +64 -7
- package/src/package-checks/secret-detection/options.ts +5 -2
- package/src/package-checks/secret-detection/records.ts +1 -1
- package/src/package-checks/secret-detection/secretlint/adapter.ts +3 -4
- package/src/package-tools/admission-policy/define-admission-policy.ts +54 -0
- package/src/{cache → package-tools/cache}/cache-json-by-key.ts +13 -17
- package/src/{check → package-tools/finding-presentation}/finding-presentation.ts +3 -1
- package/src/{finding-waivers → package-tools/finding-waivers}/reconciliation.ts +16 -8
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.ts +5 -2
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.ts +5 -3
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.ts +5 -4
- package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.ts +9 -10
- package/src/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.ts +2 -3
- package/src/{learned-critical-path → package-tools/learned-critical-path}/static-decision.ts +1 -1
- package/src/{learned-critical-path → package-tools/learned-critical-path}/strategy.ts +7 -4
- package/src/project-definition/check-tree/authoring.ts +15 -8
- package/src/project-definition/check-tree/check-fields-authoring.ts +106 -91
- package/src/project-definition/check-tree/flag-conditions.ts +99 -0
- package/src/project-definition/check-tree/materialization.ts +12 -8
- package/src/project-definition/check-tree/resolution.ts +13 -15
- package/src/project-definition/declarative-snapshot.ts +9 -2
- package/src/project-definition/project-changes.ts +112 -0
- package/src/project-definition/project-definition-validation.ts +58 -10
- package/src/project-definition/project-definition.ts +41 -68
- package/src/project-definition/scheduler-policy.ts +6 -3
- package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +11 -8
- package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +2 -2
- package/src/project-run/aggregation.ts +51 -74
- package/src/project-run/changes/git.ts +206 -0
- package/src/project-run/check-execution/admitted-check-execution.ts +62 -0
- package/src/project-run/check-execution/callback.ts +3 -2
- package/src/project-run/check-execution/dependencies.ts +120 -6
- package/src/project-run/check-execution/execution-finalization.ts +6 -4
- package/src/project-run/check-execution/execution-settlement.ts +88 -29
- package/src/project-run/check-execution/flag-controls.ts +22 -8
- package/src/project-run/check-execution/lifecycle.ts +14 -6
- package/src/project-run/check-execution/{preflight-result.ts → preparation-result.ts} +34 -32
- package/src/project-run/check-execution/{preflight.ts → preparation.ts} +92 -84
- package/src/project-run/check-execution/ready-check-execution.ts +97 -0
- package/src/project-run/check-execution/resolved-checks.ts +40 -219
- package/src/project-run/check-execution/scheduled-check-run.ts +119 -0
- package/src/project-run/check-execution/terminal-result.ts +108 -29
- package/src/project-run/completion/completion.ts +17 -3
- package/src/project-run/controls/contract.ts +6 -16
- package/src/project-run/controls/validation.ts +7 -60
- package/src/project-run/diagnostic-logging/diagnostic-detail-rendering.ts +1 -2
- package/src/project-run/diagnostic-logging/observation-rendering.ts +1 -1
- package/src/project-run/invocation/candidate.ts +28 -15
- package/src/project-run/invocation/candidates.ts +56 -0
- package/src/project-run/invocation/creation.ts +7 -3
- package/src/project-run/invocation/execution.ts +136 -0
- package/src/project-run/invocation/run.ts +15 -179
- package/src/project-run/invocation/scheduler.ts +13 -6
- package/src/project-run/outputs/status.ts +15 -15
- package/src/project-run/progress-rendering/presentation.ts +35 -13
- package/src/project-run/progress-rendering/renderer-formatting.ts +20 -7
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +23 -6
- package/src/project-run/progress-rendering/renderer.ts +10 -4
- package/src/project-run/project-context.ts +8 -4
- package/src/project-run/result.ts +5 -5
- package/src/project-run/run.ts +1 -1
- package/src/project-run/task-scheduler/admission-core/compiled-graph-lookup.ts +71 -0
- package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +9 -4
- package/src/project-run/task-scheduler/admission-core/selection-query.ts +6 -4
- package/src/project-run/task-scheduler/admission-core/selection-seed.ts +36 -6
- package/src/project-run/task-scheduler/admission-core/selection-transition.ts +17 -8
- package/src/project-run/task-scheduler/execution-state.ts +4 -4
- package/src/project-run/task-scheduler/measurement/diagnostics.ts +10 -4
- package/src/project-run/task-scheduler/measurement/timing.ts +13 -5
- package/src/project-run/task-scheduler/scheduler-observation.ts +3 -1
- package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +24 -22
- package/src/project-run/task-scheduler/scheduler.ts +23 -6
- package/types/check/check.d.ts +178 -67
- package/types/check/flag-enablement.d.ts +42 -0
- package/types/check/handoff-provider-identity.d.ts +12 -0
- package/types/check/project-changes.d.ts +13 -0
- package/types/check/project-context.d.ts +10 -0
- package/types/check-settlement/facts.d.ts +1 -1
- package/types/data-boundary/canonical-data.d.ts +28 -5
- package/types/data-boundary/canonical-json.d.ts +18 -1
- package/types/data-boundary/closed-values.d.ts +17 -1
- package/types/data-boundary/config-glob.d.ts +5 -0
- package/types/data-boundary/project-path.d.ts +4 -0
- package/types/index.d.ts +27 -11
- package/types/package-checks/check-authoring.d.ts +45 -0
- package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +1 -1
- package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +1 -1
- package/types/package-checks/command-check/command-check.d.ts +48 -0
- package/types/package-checks/command-check/contract.d.ts +108 -0
- package/types/package-checks/command-check/execution.d.ts +7 -0
- package/types/package-checks/command-check/options.d.ts +11 -0
- package/types/package-checks/command-check/transcript.d.ts +8 -0
- package/types/package-checks/duplicate-detection/default-check.d.ts +5 -2
- package/types/package-checks/duplicate-detection/finding-messages.d.ts +1 -1
- package/types/package-checks/duplicate-detection/options.d.ts +4 -3
- package/types/package-checks/duplicate-detection/records.d.ts +1 -1
- package/types/package-checks/file-metrics/constructor.d.ts +5 -2
- package/types/package-checks/file-metrics/options.d.ts +4 -3
- package/types/package-checks/file-metrics/records.d.ts +1 -1
- package/types/package-checks/file-metrics/scc/batch-planner.d.ts +18 -0
- package/types/package-checks/file-metrics/scc/logical-scan-resources.d.ts +14 -0
- package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +3 -3
- package/types/package-checks/function-metrics/constructor.d.ts +5 -2
- package/types/package-checks/function-metrics/finding-messages.d.ts +1 -1
- package/types/package-checks/function-metrics/options.d.ts +4 -3
- package/types/package-checks/function-metrics/records.d.ts +1 -1
- package/types/package-checks/host-environment/git.d.ts +2 -0
- package/types/package-checks/host-environment/path.d.ts +1 -3
- package/types/package-checks/host-environment/process/contract.d.ts +17 -9
- package/types/package-checks/json-schema-validation/default-check.d.ts +4 -1
- package/types/package-checks/json-schema-validation/options.d.ts +2 -1
- package/types/package-checks/json-validation/default-check.d.ts +4 -1
- package/types/package-checks/json-validation/options.d.ts +2 -1
- package/types/package-checks/local-cache-options.d.ts +9 -0
- package/types/package-checks/maintenance-reminders/maintenance-reminders.d.ts +11 -2
- package/types/package-checks/markdown-link-validation/default-check.d.ts +4 -1
- package/types/package-checks/markdown-link-validation/options.d.ts +4 -7
- package/types/package-checks/markdown-lint/adapter.d.ts +10 -0
- package/types/package-checks/markdown-lint/default-check.d.ts +37 -0
- package/types/package-checks/markdown-lint/execution.d.ts +24 -0
- package/types/package-checks/markdown-lint/final-data.d.ts +8 -0
- package/types/package-checks/markdown-lint/finding-messages.d.ts +6 -0
- package/types/package-checks/markdown-lint/finding-waiver-identity.d.ts +3 -0
- package/types/package-checks/markdown-lint/findings-cache.d.ts +17 -0
- package/types/package-checks/markdown-lint/options-resolution.d.ts +3 -0
- package/types/package-checks/markdown-lint/options-validation.d.ts +2 -0
- package/types/package-checks/markdown-lint/options.d.ts +65 -0
- package/types/package-checks/markdown-lint/records.d.ts +39 -0
- package/types/package-checks/markdown-lint/unavailable-reasons.d.ts +3 -0
- package/types/package-checks/secret-detection/default-check.d.ts +4 -1
- package/types/package-checks/secret-detection/options.d.ts +3 -2
- package/types/package-tools/admission-policy/define-admission-policy.d.ts +26 -0
- package/types/{check → package-tools/finding-presentation}/finding-presentation.d.ts +3 -1
- package/types/{finding-waivers → package-tools/finding-waivers}/reconciliation.d.ts +3 -3
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/prediction.d.ts +2 -2
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/preparation.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/static-decision.d.ts +1 -1
- package/types/{learned-critical-path → package-tools/learned-critical-path}/strategy.d.ts +1 -1
- package/types/project-definition/check-tree/authoring.d.ts +5 -3
- package/types/project-definition/check-tree/check-fields-authoring.d.ts +12 -7
- package/types/project-definition/check-tree/flag-conditions.d.ts +5 -0
- package/types/project-definition/check-tree/resolution.d.ts +6 -4
- package/types/project-definition/declarative-snapshot.d.ts +4 -1
- package/types/project-definition/project-changes.d.ts +30 -0
- package/types/project-definition/project-definition.d.ts +15 -30
- package/types/project-definition/scheduler-policy.d.ts +3 -3
- package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +2 -2
- package/types/project-run/aggregation.d.ts +8 -6
- package/types/project-run/changes/git.d.ts +14 -0
- package/types/project-run/check-execution/admitted-check-execution.d.ts +18 -0
- package/types/project-run/check-execution/dependencies.d.ts +3 -0
- package/types/project-run/check-execution/execution-finalization.d.ts +1 -1
- package/types/project-run/check-execution/execution-settlement.d.ts +15 -7
- package/types/project-run/check-execution/flag-controls.d.ts +1 -1
- package/types/project-run/check-execution/lifecycle.d.ts +9 -5
- package/types/project-run/check-execution/{preflight-result.d.ts → preparation-result.d.ts} +3 -3
- package/types/project-run/check-execution/{preflight.d.ts → preparation.d.ts} +10 -9
- package/types/project-run/check-execution/ready-check-execution.d.ts +18 -0
- package/types/project-run/check-execution/resolved-checks.d.ts +12 -13
- package/types/project-run/check-execution/scheduled-check-run.d.ts +10 -0
- package/types/project-run/check-execution/terminal-result.d.ts +13 -1
- package/types/project-run/completion/completion.d.ts +3 -1
- package/types/project-run/controls/contract.d.ts +6 -16
- package/types/project-run/invocation/candidates.d.ts +8 -0
- package/types/project-run/invocation/execution.d.ts +5 -0
- package/types/project-run/invocation/run.d.ts +2 -2
- package/types/project-run/outputs/status.d.ts +4 -4
- package/types/project-run/progress-rendering/presentation.d.ts +4 -3
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +5 -2
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +2 -0
- package/types/project-run/progress-rendering/renderer.d.ts +4 -2
- package/types/project-run/project-context.d.ts +3 -3
- package/types/project-run/result.d.ts +3 -3
- package/types/project-run/run.d.ts +1 -1
- package/types/project-run/task-scheduler/admission-core/compiled-graph-lookup.d.ts +10 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +4 -4
- package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +2 -2
- package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +1 -1
- package/dist/esm/cache/cache-json-by-key.mjs.map +0 -1
- package/dist/esm/check/finding-presentation.mjs.map +0 -1
- package/dist/esm/finding-waivers/reconciliation.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +0 -1
- package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +0 -1
- package/dist/esm/learned-critical-path/selection-layers.mjs.map +0 -1
- package/dist/esm/learned-critical-path/static-decision.mjs.map +0 -1
- package/dist/esm/learned-critical-path/strategy.mjs.map +0 -1
- package/dist/esm/package-checks/project-files/config-glob.mjs.map +0 -1
- package/dist/esm/project-run/check-execution/preflight-result.mjs.map +0 -1
- package/dist/esm/project-run/check-execution/preflight.mjs.map +0 -1
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +0 -1
- package/types/package-checks/project-files/config-glob.d.ts +0 -5
- /package/dist/esm/{check → package-tools/finding-presentation}/finding-presentation.mjs +0 -0
- /package/dist/esm/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/duration-model/recording.mjs +0 -0
- /package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/static-decision.mjs +0 -0
- /package/src/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.ts +0 -0
- /package/src/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.ts +0 -0
- /package/types/{cache → package-tools/cache}/cache-json-by-key.d.ts +0 -0
- /package/types/{project-run/task-scheduler → package-tools/learned-critical-path}/critical-path-ranking.d.ts +0 -0
- /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/bounded-history.d.ts +0 -0
- /package/types/{learned-critical-path → package-tools/learned-critical-path}/duration-model/storage.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-state.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/execution-state.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementContext,\n SchedulerMeasurementHook\n} from \"../../project-definition/project-definition.ts\";\nimport type { PlannedTask, PlannedTaskGraph, PlannedTaskScope, TaskGraph } from \"./graph.ts\";\nimport {\n staticAdmissionSelectionPolicy,\n type AdmissionSelectionPolicy\n} from \"./admission-selection-policy.ts\";\nimport type { DiagnosticLogger } from \"../diagnostic-logging/logger.ts\";\nimport type { SchedulerSnapshot } from \"./scheduler-decision.ts\";\nimport type { AdmissionPolicyFaultCategory } from \"./scheduler-admission-decision.ts\";\nimport type { SchedulerPerformanceDiagnosticsInput } from \"./measurement/diagnostics.ts\";\nimport {\n compilePreparedAdmissionGraph,\n createAdmissionCoreFromSchedulerSnapshot,\n createInitialAdmissionCoreState,\n type AdmissionCoreEffect,\n type AdmissionCoreState\n} from \"./admission-core/core.ts\";\n\nexport type TaskSettlement<TResult> = Readonly<\n | { readonly kind: \"completed\"; readonly value: TResult }\n | { readonly kind: \"prerequisite-unsatisfied\"; readonly value: TResult }\n | { readonly kind: \"failed\"; readonly error: unknown }\n | { readonly kind: \"blocked\"; readonly dependencyIds: readonly string[] }\n | { readonly kind: \"cancelled-before-start\" }\n>;\n\nexport interface SettledTask<TResult> {\n readonly task: PlannedTask;\n readonly settlement: TaskSettlement<TResult>;\n}\n\nexport interface TaskExecutionContext {\n readonly signal: AbortSignal | undefined;\n}\n\nexport interface PreAdmissionTaskResult<TResult> {\n readonly taskId: string;\n readonly value: TResult;\n}\n\n/** Product-private effect hook used to prove that the real shell replays the shared core. */\nexport interface SchedulerAdmissionCoreEffect {\n readonly effect: AdmissionCoreEffect;\n readonly state: AdmissionCoreState;\n}\n\nexport interface TaskGraphRun<TResult> {\n readonly admissionPolicyFault: AdmissionPolicyFaultCategory | undefined;\n readonly cancelled: boolean;\n /** One entry per static graph Task, in static graph order. */\n readonly settlements: readonly SettledTask<TResult>[];\n /** Product-private terminal facts retained after terminal Hooks have been drained. */\n readonly terminalMeasurement?: SchedulerMeasurementContext;\n}\n\nexport interface RunTaskGraphOptions<TResult> {\n /** Product-private policy handoff; package consumers cannot author this through the public API. */\n readonly admissionPolicy?: AdmissionSelectionPolicy;\n readonly diagnosticLogger?: DiagnosticLogger;\n /** Explicit enabled-only handoff; no Scheduler behavior is inferred from a logger shape. */\n readonly performanceDiagnostics?: SchedulerPerformanceDiagnosticsInput;\n /** Runtime-only terminal consumers; their context is formed after Scheduler drain. */\n readonly measurementHooks?: readonly SchedulerMeasurementHook[];\n readonly onMeasurementHookFailure?: () => void;\n readonly onMeasurementHooksSettled?: () => void;\n /** Product-private test observer; no package consumer can supply this through `run`. */\n readonly onAdmissionCoreEffect?: (effect: SchedulerAdmissionCoreEffect) => void;\n readonly graph: TaskGraph;\n /** Product-private Task results formed without Scheduler admission in the current Run. */\n readonly preAdmissionTaskResults?: readonly PreAdmissionTaskResult<TResult>[];\n readonly maxParallel: number;\n readonly signal?: AbortSignal;\n readonly execute: (\n task: PlannedTask,\n context: TaskExecutionContext\n ) => TResult | Promise<TResult>;\n /** Maps a completed Task's opaque product value to prerequisite satisfaction. */\n readonly isPrerequisiteSatisfied?: (value: TResult) => boolean;\n /** Lets a product close a blocked Task before any terminal observer can be admitted. */\n readonly onTaskBlocked?: (task: PlannedTask, dependencyIds: readonly string[]) => void;\n}\n\nexport type RunningTaskCompletion<TResult> = Readonly<{\n readonly taskId: string;\n readonly settlement: TaskSettlement<TResult>;\n}>;\n\nexport interface RunningTask<TResult> {\n readonly task: PlannedTask;\n readonly completion: Promise<RunningTaskCompletion<TResult>>;\n}\n\nexport interface RuntimeScope {\n readonly scope: PlannedTaskScope;\n readonly activationTaskIds: ReadonlySet<string>;\n isActive: boolean;\n}\n\nexport interface SchedulerState<TResult> {\n /** The shared immutable legality/transition state; Task and Promise ownership remains below. */\n admissionCore: AdmissionCoreState;\n readonly admissionPolicy: AdmissionSelectionPolicy;\n readonly diagnosticLogger: DiagnosticLogger | undefined;\n readonly graph: PlannedTaskGraph;\n readonly isPrerequisiteSatisfied: RunTaskGraphOptions<TResult>[\"isPrerequisiteSatisfied\"];\n readonly maxParallel: number;\n readonly signal: AbortSignal | undefined;\n readonly execute: RunTaskGraphOptions<TResult>[\"execute\"];\n readonly onTaskBlocked: RunTaskGraphOptions<TResult>[\"onTaskBlocked\"];\n readonly onAdmissionCoreEffect: RunTaskGraphOptions<TResult>[\"onAdmissionCoreEffect\"];\n readonly pending: PlannedTask[];\n readonly runningById: Map<string, RunningTask<TResult>>;\n readonly runningMutexes: Set<string>;\n readonly settlementsByTaskId: Map<string, TaskSettlement<TResult>>;\n readonly scopesById: ReadonlyMap<string, RuntimeScope>;\n isCancelled: boolean;\n admissionPolicyFault: AdmissionPolicyFaultCategory | undefined;\n}\n\nexport function createSchedulerState<TResult>(\n graph: PlannedTaskGraph,\n options: RunTaskGraphOptions<TResult>\n): SchedulerState<TResult> {\n const admissionPolicy = options.admissionPolicy ?? staticAdmissionSelectionPolicy;\n if (!Object.isFrozen(admissionPolicy) || typeof admissionPolicy.decide !== \"function\") {\n throw new TypeError(\"task engine admission policy must be a frozen policy value\");\n }\n const scopesById = new Map<string, RuntimeScope>();\n for (const scope of graph.scopes) {\n scopesById.set(scope.id, {\n scope,\n activationTaskIds: new Set(scope.activationTaskIds),\n isActive: false\n });\n }\n const compiledAdmissionGraph = compilePreparedAdmissionGraph(graph, options.maxParallel);\n const state: SchedulerState<TResult> = {\n admissionCore: createInitialAdmissionCoreState(compiledAdmissionGraph),\n admissionPolicy,\n diagnosticLogger: options.diagnosticLogger,\n graph,\n isPrerequisiteSatisfied: options.isPrerequisiteSatisfied,\n maxParallel: options.maxParallel,\n onTaskBlocked: options.onTaskBlocked,\n onAdmissionCoreEffect: options.onAdmissionCoreEffect,\n signal: options.signal,\n execute: options.execute,\n pending: [...graph.tasks],\n runningById: new Map(),\n runningMutexes: new Set(),\n settlementsByTaskId: new Map(),\n scopesById,\n isCancelled: false,\n admissionPolicyFault: undefined\n };\n recordPreAdmissionTaskResults(state, options.preAdmissionTaskResults ?? []);\n state.admissionCore = createAdmissionCoreFromSchedulerSnapshot(\n compiledAdmissionGraph,\n snapshotSchedulerState(state)\n );\n return state;\n}\n\nfunction recordPreAdmissionTaskResults<TResult>(\n state: SchedulerState<TResult>,\n preAdmissionTaskResults: readonly PreAdmissionTaskResult<TResult>[]\n): void {\n for (const result of preAdmissionTaskResults) {\n const pendingIndex = state.pending.findIndex((task) => task.id === result.taskId);\n if (pendingIndex < 0) {\n throw new TypeError(\n `pre-admission task result references unknown or duplicate task ${result.taskId}`\n );\n }\n const [task] = state.pending.splice(pendingIndex, 1);\n if (task === undefined) {\n throw new Error(`pre-admission task ${result.taskId} disappeared before settlement`);\n }\n const settlement: TaskSettlement<TResult> =\n state.isPrerequisiteSatisfied?.(result.value) === false\n ? { kind: \"prerequisite-unsatisfied\", value: result.value }\n : { kind: \"completed\", value: result.value };\n recordSettlement(state, task, Object.freeze(settlement));\n }\n}\n\n/** Projects mutable execution state into the pure scheduler-decision input. */\nexport function snapshotSchedulerState<TResult>(state: SchedulerState<TResult>): SchedulerSnapshot {\n return Object.freeze({\n activeScopeIds: Object.freeze(\n [...state.scopesById.values()]\n .filter((scope) => scope.isActive)\n .map((scope) => scope.scope.id)\n ),\n graph: state.graph,\n isAbortRequested: state.signal?.aborted === true,\n isCancelled: state.isCancelled,\n maxParallel: state.maxParallel,\n pendingTaskIds: Object.freeze(state.pending.map((task) => task.id)),\n runningMutexes: Object.freeze([...state.runningMutexes]),\n runningTaskIds: Object.freeze([...state.runningById.keys()]),\n settledTasks: Object.freeze(\n [...state.settlementsByTaskId].map(([taskId, settlement]) =>\n Object.freeze({ kind: settlement.kind, taskId })\n )\n )\n });\n}\n\nexport function scopeForTask<TResult>(\n task: PlannedTask,\n state: SchedulerState<TResult>\n): RuntimeScope | undefined {\n return task.scopeId === undefined ? undefined : state.scopesById.get(task.scopeId);\n}\n\nexport function cancelPendingTasks<TResult>(state: SchedulerState<TResult>): void {\n state.isCancelled = true;\n while (state.pending.length > 0) {\n const task = state.pending.shift();\n if (task === undefined) {\n throw new Error(\"task graph pending queue changed unexpectedly\");\n }\n recordSettlement(state, task, Object.freeze({ kind: \"cancelled-before-start\" }));\n }\n}\n\nexport function recordSettlement<TResult>(\n state: SchedulerState<TResult>,\n task: PlannedTask,\n settlement: TaskSettlement<TResult>\n): void {\n if (state.settlementsByTaskId.has(task.id)) {\n throw new Error(`task ${task.id} settled more than once`);\n }\n state.settlementsByTaskId.set(task.id, settlement);\n const scope = scopeForTask(task, state);\n if (scope?.scope.terminalTaskId === task.id) {\n scope.isActive = false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"execution-state.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/execution-state.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementContext,\n SchedulerTerminalEffect\n} from \"../../project-definition/project-definition.ts\";\nimport type { PlannedTask, PlannedTaskGraph, PlannedTaskScope, TaskGraph } from \"./graph.ts\";\nimport {\n staticAdmissionSelectionPolicy,\n type AdmissionSelectionPolicy\n} from \"./admission-selection-policy.ts\";\nimport type { DiagnosticLogger } from \"../diagnostic-logging/logger.ts\";\nimport type { SchedulerSnapshot } from \"./scheduler-decision.ts\";\nimport type { AdmissionPolicyFaultCategory } from \"./scheduler-admission-decision.ts\";\nimport type { SchedulerPerformanceDiagnosticsInput } from \"./measurement/diagnostics.ts\";\nimport {\n compilePreparedAdmissionGraph,\n createAdmissionCoreFromSchedulerSnapshot,\n createInitialAdmissionCoreState,\n type AdmissionCoreEffect,\n type AdmissionCoreState\n} from \"./admission-core/core.ts\";\n\nexport type TaskSettlement<TResult> = Readonly<\n | { readonly kind: \"completed\"; readonly value: TResult }\n | { readonly kind: \"prerequisite-unsatisfied\"; readonly value: TResult }\n | { readonly kind: \"failed\"; readonly error: unknown }\n | { readonly kind: \"blocked\"; readonly dependencyIds: readonly string[] }\n | { readonly kind: \"cancelled-before-start\" }\n>;\n\nexport interface SettledTask<TResult> {\n readonly task: PlannedTask;\n readonly settlement: TaskSettlement<TResult>;\n}\n\nexport interface TaskExecutionContext {\n readonly signal: AbortSignal | undefined;\n}\n\nexport interface PreAdmissionTaskResult<TResult> {\n readonly taskId: string;\n readonly value: TResult;\n}\n\n/** Product-private effect hook used to prove that the real shell replays the shared core. */\nexport interface SchedulerAdmissionCoreEffect {\n readonly effect: AdmissionCoreEffect;\n readonly state: AdmissionCoreState;\n}\n\nexport interface TaskGraphRun<TResult> {\n readonly admissionPolicyFault: AdmissionPolicyFaultCategory | undefined;\n readonly cancelled: boolean;\n /** One entry per static graph Task, in static graph order. */\n readonly settlements: readonly SettledTask<TResult>[];\n /** Product-private terminal facts retained after terminal Hooks have been drained. */\n readonly terminalMeasurement?: SchedulerMeasurementContext;\n}\n\nexport interface RunTaskGraphOptions<TResult> {\n /** Product-private policy handoff; package consumers cannot author this through the public API. */\n readonly admissionPolicy?: AdmissionSelectionPolicy;\n readonly diagnosticLogger?: DiagnosticLogger;\n /** Explicit enabled-only handoff; no Scheduler behavior is inferred from a logger shape. */\n readonly performanceDiagnostics?: SchedulerPerformanceDiagnosticsInput;\n /** Runtime-only terminal consumers; their context is formed after Scheduler drain. */\n readonly terminalEffects?: readonly SchedulerTerminalEffect[];\n readonly onTerminalEffectFailure?: () => void;\n readonly onTerminalEffectsSettled?: () => void;\n /** Product-private test observer; no package consumer can supply this through `run`. */\n readonly onAdmissionCoreEffect?: (effect: SchedulerAdmissionCoreEffect) => void;\n readonly graph: TaskGraph;\n /** Product-private Task results formed without Scheduler admission in the current Run. */\n readonly preAdmissionTaskResults?: readonly PreAdmissionTaskResult<TResult>[];\n readonly maxParallel: number;\n readonly signal?: AbortSignal;\n readonly execute: (\n task: PlannedTask,\n context: TaskExecutionContext\n ) => TResult | Promise<TResult>;\n /** Maps a completed Task's opaque product value to prerequisite satisfaction. */\n readonly isPrerequisiteSatisfied?: (value: TResult) => boolean;\n /** Lets a product close a blocked Task before any terminal observer can be admitted. */\n readonly onTaskBlocked?: (task: PlannedTask, dependencyIds: readonly string[]) => void;\n}\n\nexport type RunningTaskCompletion<TResult> = Readonly<{\n readonly taskId: string;\n readonly settlement: TaskSettlement<TResult>;\n}>;\n\nexport interface RunningTask<TResult> {\n readonly task: PlannedTask;\n readonly completion: Promise<RunningTaskCompletion<TResult>>;\n}\n\nexport interface RuntimeScope {\n readonly scope: PlannedTaskScope;\n readonly activationTaskIds: ReadonlySet<string>;\n isActive: boolean;\n}\n\nexport interface SchedulerState<TResult> {\n /** The shared immutable legality/transition state; Task and Promise ownership remains below. */\n admissionCore: AdmissionCoreState;\n readonly admissionPolicy: AdmissionSelectionPolicy;\n readonly diagnosticLogger: DiagnosticLogger | undefined;\n readonly graph: PlannedTaskGraph;\n readonly isPrerequisiteSatisfied: RunTaskGraphOptions<TResult>[\"isPrerequisiteSatisfied\"];\n readonly maxParallel: number;\n readonly signal: AbortSignal | undefined;\n readonly execute: RunTaskGraphOptions<TResult>[\"execute\"];\n readonly onTaskBlocked: RunTaskGraphOptions<TResult>[\"onTaskBlocked\"];\n readonly onAdmissionCoreEffect: RunTaskGraphOptions<TResult>[\"onAdmissionCoreEffect\"];\n readonly pending: PlannedTask[];\n readonly runningById: Map<string, RunningTask<TResult>>;\n readonly runningMutexes: Set<string>;\n readonly settlementsByTaskId: Map<string, TaskSettlement<TResult>>;\n readonly scopesById: ReadonlyMap<string, RuntimeScope>;\n isCancelled: boolean;\n admissionPolicyFault: AdmissionPolicyFaultCategory | undefined;\n}\n\nexport function createSchedulerState<TResult>(\n graph: PlannedTaskGraph,\n options: RunTaskGraphOptions<TResult>\n): SchedulerState<TResult> {\n const admissionPolicy = options.admissionPolicy ?? staticAdmissionSelectionPolicy;\n if (!Object.isFrozen(admissionPolicy) || typeof admissionPolicy.decide !== \"function\") {\n throw new TypeError(\"task engine admission policy must be a frozen policy value\");\n }\n const scopesById = new Map<string, RuntimeScope>();\n for (const scope of graph.scopes) {\n scopesById.set(scope.id, {\n scope,\n activationTaskIds: new Set(scope.activationTaskIds),\n isActive: false\n });\n }\n const compiledAdmissionGraph = compilePreparedAdmissionGraph(graph, options.maxParallel);\n const state: SchedulerState<TResult> = {\n admissionCore: createInitialAdmissionCoreState(compiledAdmissionGraph),\n admissionPolicy,\n diagnosticLogger: options.diagnosticLogger,\n graph,\n isPrerequisiteSatisfied: options.isPrerequisiteSatisfied,\n maxParallel: options.maxParallel,\n onTaskBlocked: options.onTaskBlocked,\n onAdmissionCoreEffect: options.onAdmissionCoreEffect,\n signal: options.signal,\n execute: options.execute,\n pending: [...graph.tasks],\n runningById: new Map(),\n runningMutexes: new Set(),\n settlementsByTaskId: new Map(),\n scopesById,\n isCancelled: false,\n admissionPolicyFault: undefined\n };\n recordPreAdmissionTaskResults(state, options.preAdmissionTaskResults ?? []);\n state.admissionCore = createAdmissionCoreFromSchedulerSnapshot(\n compiledAdmissionGraph,\n snapshotSchedulerState(state)\n );\n return state;\n}\n\nfunction recordPreAdmissionTaskResults<TResult>(\n state: SchedulerState<TResult>,\n preAdmissionTaskResults: readonly PreAdmissionTaskResult<TResult>[]\n): void {\n for (const result of preAdmissionTaskResults) {\n const pendingIndex = state.pending.findIndex((task) => task.id === result.taskId);\n if (pendingIndex < 0) {\n throw new TypeError(\n `pre-admission task result references unknown or duplicate task ${result.taskId}`\n );\n }\n const [task] = state.pending.splice(pendingIndex, 1);\n if (task === undefined) {\n throw new Error(`pre-admission task ${result.taskId} disappeared before settlement`);\n }\n const settlement: TaskSettlement<TResult> =\n state.isPrerequisiteSatisfied?.(result.value) === false\n ? { kind: \"prerequisite-unsatisfied\", value: result.value }\n : { kind: \"completed\", value: result.value };\n recordSettlement(state, task, Object.freeze(settlement));\n }\n}\n\n/** Projects mutable execution state into the pure scheduler-decision input. */\nexport function snapshotSchedulerState<TResult>(state: SchedulerState<TResult>): SchedulerSnapshot {\n return Object.freeze({\n activeScopeIds: Object.freeze(\n [...state.scopesById.values()]\n .filter((scope) => scope.isActive)\n .map((scope) => scope.scope.id)\n ),\n graph: state.graph,\n isAbortRequested: state.signal?.aborted === true,\n isCancelled: state.isCancelled,\n maxParallel: state.maxParallel,\n pendingTaskIds: Object.freeze(state.pending.map((task) => task.id)),\n runningMutexes: Object.freeze([...state.runningMutexes]),\n runningTaskIds: Object.freeze([...state.runningById.keys()]),\n settledTasks: Object.freeze(\n [...state.settlementsByTaskId].map(([taskId, settlement]) =>\n Object.freeze({ kind: settlement.kind, taskId })\n )\n )\n });\n}\n\nexport function scopeForTask<TResult>(\n task: PlannedTask,\n state: SchedulerState<TResult>\n): RuntimeScope | undefined {\n return task.scopeId === undefined ? undefined : state.scopesById.get(task.scopeId);\n}\n\nexport function cancelPendingTasks<TResult>(state: SchedulerState<TResult>): void {\n state.isCancelled = true;\n while (state.pending.length > 0) {\n const task = state.pending.shift();\n if (task === undefined) {\n throw new Error(\"task graph pending queue changed unexpectedly\");\n }\n recordSettlement(state, task, Object.freeze({ kind: \"cancelled-before-start\" }));\n }\n}\n\nexport function recordSettlement<TResult>(\n state: SchedulerState<TResult>,\n task: PlannedTask,\n settlement: TaskSettlement<TResult>\n): void {\n if (state.settlementsByTaskId.has(task.id)) {\n throw new Error(`task ${task.id} settled more than once`);\n }\n state.settlementsByTaskId.set(task.id, settlement);\n const scope = scopeForTask(task, state);\n if (scope?.scope.terminalTaskId === task.id) {\n scope.isActive = false;\n }\n}\n"]}
|
|
@@ -34,8 +34,10 @@ export class SchedulerPerformanceDiagnostics {
|
|
|
34
34
|
if (boundary === undefined)
|
|
35
35
|
return;
|
|
36
36
|
const admissionDelay = this.#timing.takeAdmissionDelay(taskId);
|
|
37
|
-
if (admissionDelay === undefined)
|
|
38
|
-
|
|
37
|
+
if (admissionDelay === undefined) {
|
|
38
|
+
this.#timing.invalidate("integral-invalid");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
39
41
|
this.#chronologyByTaskId.set(taskId, {
|
|
40
42
|
admissionDelay,
|
|
41
43
|
admittedAt: boundary,
|
|
@@ -57,8 +59,10 @@ export class SchedulerPerformanceDiagnostics {
|
|
|
57
59
|
return;
|
|
58
60
|
this.#timing.closeAcceptedWait(boundary);
|
|
59
61
|
const chronology = this.#chronologyByTaskId.get(taskId);
|
|
60
|
-
if (chronology === undefined)
|
|
61
|
-
|
|
62
|
+
if (chronology === undefined) {
|
|
63
|
+
this.#timing.invalidate("integral-invalid");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
62
66
|
chronology.settledAt = boundary;
|
|
63
67
|
}
|
|
64
68
|
beforeAcceptedWait() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AdmissionPolicyMeasurement,\n SchedulerDecisionMeasurementCumulative,\n SchedulerMeasurementAdmission,\n SchedulerMeasurementEffect,\n SchedulerMeasurementHook,\n SchedulerRawMeasurement\n} from \"../../../project-definition/project-definition.ts\";\nimport { diagnosticTags, type DiagnosticLogger } from \"../../diagnostic-logging/logger.ts\";\nimport type { AdmissionDelayBreakdown } from \"./integrals.ts\";\nimport { summaryFromSchedulerMeasurement } from \"./summary.ts\";\nimport { SchedulerPerformanceTiming } from \"./timing.ts\";\nimport { SchedulerPolicyMeasurement } from \"./policy.ts\";\n\n/** Explicit, enabled-only private handoff; the Scheduler never infers this from logger behavior. */\nexport type SchedulerPerformanceDiagnosticsInput = Readonly<{\n readonly clock: Readonly<{ now(): number }>;\n readonly declarativeFingerprint: string;\n readonly logger?: DiagnosticLogger;\n}>;\n\ntype AdmissionChronology = {\n readonly admissionDelay: AdmissionDelayBreakdown;\n readonly admittedAt: number;\n settledAt: number | undefined;\n};\n\nexport type AdmissionViablePendingTask = Readonly<{\n readonly kind: \"admissible-pending\" | \"capacity-blocked\" | \"mutex-blocked\";\n readonly taskId: string;\n}>;\n\nexport type SchedulerPerformanceState = Readonly<{\n readonly admissionViablePendingTasks: readonly AdmissionViablePendingTask[];\n readonly effectiveMaxParallel: number;\n readonly rootMaxParallel: number;\n readonly running: number;\n}>;\n\n/**\n * Scheduler-owned, invocation-local lifecycle projection. Clock boundaries and\n * numeric interval accumulation remain private collaborators of this owner.\n */\nexport class SchedulerPerformanceDiagnostics {\n readonly #declarativeFingerprint: string;\n readonly #logger: DiagnosticLogger | undefined;\n readonly #timing: SchedulerPerformanceTiming;\n #lastSettledTaskId: string | undefined;\n #completionTailActiveTaskIds: readonly string[] = Object.freeze([]);\n readonly #admittedTaskIds = new Set<string>();\n readonly #chronologyByTaskId = new Map<string, AdmissionChronology>();\n readonly #policyMeasurement = new SchedulerPolicyMeasurement();\n\n public constructor(\n input: SchedulerPerformanceDiagnosticsInput,\n initial: SchedulerPerformanceState\n ) {\n this.#declarativeFingerprint = input.declarativeFingerprint;\n this.#logger = input.logger;\n this.#timing = new SchedulerPerformanceTiming(input.clock, initial);\n }\n\n public measureControlPath<T>(operation: () => T): T {\n return this.#timing.measureControlPath(operation);\n }\n\n public observeDecision(observation: () => void): void {\n this.#timing.observeDecision(observation);\n }\n\n /** Flushes the old state before admission changes the real Scheduler state. */\n public beforeAdmission(taskId: string, runningTaskIds: readonly string[]): void {\n this.#admittedTaskIds.add(taskId);\n this.#completionTailActiveTaskIds = Object.freeze([...runningTaskIds, taskId]);\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n const admissionDelay = this.#timing.takeAdmissionDelay(taskId);\n if (admissionDelay === undefined) return this.#timing.invalidate(\"integral-invalid\");\n this.#chronologyByTaskId.set(taskId, {\n admissionDelay,\n admittedAt: boundary,\n settledAt: undefined\n });\n }\n\n /** Flushes the old state before blocked/cancelled changes the real Scheduler state. */\n public beforePendingSettlement(taskIds: readonly string[] = []): void {\n const lastTaskId = taskIds.at(-1);\n if (lastTaskId !== undefined) this.#lastSettledTaskId = lastTaskId;\n this.#timing.boundary();\n }\n\n /** Flushes the old running interval before removing the actual running Task. */\n public beforeRunningSettlement(taskId: string): void {\n this.#lastSettledTaskId = taskId;\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n this.#timing.closeAcceptedWait(boundary);\n const chronology = this.#chronologyByTaskId.get(taskId);\n if (chronology === undefined) return this.#timing.invalidate(\"integral-invalid\");\n chronology.settledAt = boundary;\n }\n\n public beforeAcceptedWait(): void {\n this.#timing.beginAcceptedWait();\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#timing.captureState(state);\n }\n\n public rawMeasurement(): SchedulerRawMeasurement {\n return this.#measurement(true);\n }\n\n public beginSelectedPolicyAction(taskId: string): void {\n this.#policyMeasurement.beginSelected(taskId, this.#timing.snapshot().totals);\n }\n\n public beginWaitPolicyAction(): void {\n this.#policyMeasurement.beginWait(this.#timing.snapshot().totals);\n }\n\n public recordEffect(effect: SchedulerMeasurementEffect): void {\n this.#policyMeasurement.recordEffect(effect);\n }\n\n public policyMeasurement(): AdmissionPolicyMeasurement {\n this.#timing.boundary();\n this.#completePolicyAction();\n return this.#policyMeasurement.snapshot(this.#cumulativeMeasurement());\n }\n\n public completePendingActionObservation(): void {\n this.#timing.boundary();\n this.#completePolicyAction();\n }\n\n public admittedTaskIds(): readonly string[] {\n return Object.freeze([...this.#admittedTaskIds]);\n }\n\n /** Internal default terminal hook; it contains writer failure without runner special-casing. */\n public defaultSummaryHook(): SchedulerMeasurementHook | undefined {\n if (this.#logger === undefined) return undefined;\n const logger = this.#logger;\n return (context) => {\n try {\n logger.observe({\n event: \"scheduler.summary\",\n tags: diagnosticTags(\"SUMMARY\"),\n details: summaryFromSchedulerMeasurement(context.rawMeasurement)\n });\n } catch {\n // Summary writer failure is contained by this hook, not the shared runner.\n }\n };\n }\n\n #completePolicyAction(): void {\n const timing = this.#timing.snapshot();\n this.#policyMeasurement.complete(timing.totals, timing.timing);\n }\n\n #cumulativeMeasurement(): SchedulerDecisionMeasurementCumulative {\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #measurement(terminal: boolean): SchedulerRawMeasurement {\n const endedAt = this.#timing.boundary();\n if (terminal && endedAt !== undefined) this.#timing.closeAcceptedWait(endedAt);\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n completionTailActiveTaskIds: Object.freeze([...this.#completionTailActiveTaskIds]),\n lastSettledTaskId: this.#lastSettledTaskId ?? null,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n if (endedAt === undefined)\n throw new Error(\"available Scheduler timing has no terminal boundary\");\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n admissions: Object.freeze(this.#admissionMeasurements()),\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n endedAtMonotonicMs: endedAt,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n schedulerControlPathMs: snapshot.schedulerControlPathMs,\n schedulerDecisionObservationMs: snapshot.decisionObservationMs,\n startedAtMonotonicMs: snapshot.startedAtMonotonicMs ?? endedAt,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #admissionMeasurements(): SchedulerMeasurementAdmission[] {\n const pendingByTaskId = new Map(\n this.#timing\n .pendingAdmissionDelays()\n .map(({ admissionDelay, taskId }) => [taskId, admissionDelay])\n );\n const taskIds = new Set([...pendingByTaskId.keys(), ...this.#chronologyByTaskId.keys()]);\n return [...taskIds]\n .map((taskId) => this.#admissionMeasurement(taskId, pendingByTaskId))\n .sort((left, right) => compareText(left.taskId, right.taskId));\n }\n\n #admissionMeasurement(\n taskId: string,\n pendingByTaskId: ReadonlyMap<string, AdmissionDelayBreakdown>\n ): SchedulerMeasurementAdmission {\n const chronology = this.#chronologyByTaskId.get(taskId);\n const admissionDelay = chronology?.admissionDelay ?? pendingByTaskId.get(taskId);\n if (admissionDelay === undefined)\n throw new Error(`missing admission measurement for ${taskId}`);\n return Object.freeze({\n admissionDelay,\n admittedAtMonotonicMs: chronology?.admittedAt ?? null,\n settledAtMonotonicMs: chronology?.settledAt ?? null,\n taskId\n });\n }\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"diagnostics.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AdmissionPolicyMeasurement,\n SchedulerDecisionMeasurementCumulative,\n SchedulerMeasurementAdmission,\n SchedulerMeasurementEffect,\n SchedulerTerminalEffect,\n SchedulerRawMeasurement\n} from \"../../../project-definition/project-definition.ts\";\nimport { diagnosticTags, type DiagnosticLogger } from \"../../diagnostic-logging/logger.ts\";\nimport type { AdmissionDelayBreakdown } from \"./integrals.ts\";\nimport { summaryFromSchedulerMeasurement } from \"./summary.ts\";\nimport { SchedulerPerformanceTiming } from \"./timing.ts\";\nimport { SchedulerPolicyMeasurement } from \"./policy.ts\";\n\n/** Explicit, enabled-only private handoff; the Scheduler never infers this from logger behavior. */\nexport type SchedulerPerformanceDiagnosticsInput = Readonly<{\n readonly clock: Readonly<{ now(): number }>;\n readonly declarativeFingerprint: string;\n readonly logger?: DiagnosticLogger;\n}>;\n\ntype AdmissionChronology = {\n readonly admissionDelay: AdmissionDelayBreakdown;\n readonly admittedAt: number;\n settledAt: number | undefined;\n};\n\nexport type AdmissionViablePendingTask = Readonly<{\n readonly kind: \"admissible-pending\" | \"capacity-blocked\" | \"mutex-blocked\";\n readonly taskId: string;\n}>;\n\nexport type SchedulerPerformanceState = Readonly<{\n readonly admissionViablePendingTasks: readonly AdmissionViablePendingTask[];\n readonly effectiveMaxParallel: number;\n readonly rootMaxParallel: number;\n readonly running: number;\n}>;\n\n/**\n * Scheduler-owned, invocation-local lifecycle projection. Clock boundaries and\n * numeric interval accumulation remain private collaborators of this owner.\n */\nexport class SchedulerPerformanceDiagnostics {\n readonly #declarativeFingerprint: string;\n readonly #logger: DiagnosticLogger | undefined;\n readonly #timing: SchedulerPerformanceTiming;\n #lastSettledTaskId: string | undefined;\n #completionTailActiveTaskIds: readonly string[] = Object.freeze([]);\n readonly #admittedTaskIds = new Set<string>();\n readonly #chronologyByTaskId = new Map<string, AdmissionChronology>();\n readonly #policyMeasurement = new SchedulerPolicyMeasurement();\n\n public constructor(\n input: SchedulerPerformanceDiagnosticsInput,\n initial: SchedulerPerformanceState\n ) {\n this.#declarativeFingerprint = input.declarativeFingerprint;\n this.#logger = input.logger;\n this.#timing = new SchedulerPerformanceTiming(input.clock, initial);\n }\n\n public measureControlPath<T>(operation: () => T): T {\n return this.#timing.measureControlPath(operation);\n }\n\n public observeDecision(observation: () => void): void {\n this.#timing.observeDecision(observation);\n }\n\n /** Flushes the old state before admission changes the real Scheduler state. */\n public beforeAdmission(taskId: string, runningTaskIds: readonly string[]): void {\n this.#admittedTaskIds.add(taskId);\n this.#completionTailActiveTaskIds = Object.freeze([...runningTaskIds, taskId]);\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n const admissionDelay = this.#timing.takeAdmissionDelay(taskId);\n if (admissionDelay === undefined) {\n this.#timing.invalidate(\"integral-invalid\");\n return;\n }\n this.#chronologyByTaskId.set(taskId, {\n admissionDelay,\n admittedAt: boundary,\n settledAt: undefined\n });\n }\n\n /** Flushes the old state before blocked/cancelled changes the real Scheduler state. */\n public beforePendingSettlement(taskIds: readonly string[] = []): void {\n const lastTaskId = taskIds.at(-1);\n if (lastTaskId !== undefined) this.#lastSettledTaskId = lastTaskId;\n this.#timing.boundary();\n }\n\n /** Flushes the old running interval before removing the actual running Task. */\n public beforeRunningSettlement(taskId: string): void {\n this.#lastSettledTaskId = taskId;\n const boundary = this.#timing.boundary();\n if (boundary === undefined) return;\n this.#timing.closeAcceptedWait(boundary);\n const chronology = this.#chronologyByTaskId.get(taskId);\n if (chronology === undefined) {\n this.#timing.invalidate(\"integral-invalid\");\n return;\n }\n chronology.settledAt = boundary;\n }\n\n public beforeAcceptedWait(): void {\n this.#timing.beginAcceptedWait();\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#timing.captureState(state);\n }\n\n public rawMeasurement(): SchedulerRawMeasurement {\n return this.#measurement(true);\n }\n\n public beginSelectedPolicyAction(taskId: string): void {\n this.#policyMeasurement.beginSelected(taskId, this.#timing.snapshot().totals);\n }\n\n public beginWaitPolicyAction(): void {\n this.#policyMeasurement.beginWait(this.#timing.snapshot().totals);\n }\n\n public recordEffect(effect: SchedulerMeasurementEffect): void {\n this.#policyMeasurement.recordEffect(effect);\n }\n\n public policyMeasurement(): AdmissionPolicyMeasurement {\n this.#timing.boundary();\n this.#completePolicyAction();\n return this.#policyMeasurement.snapshot(this.#cumulativeMeasurement());\n }\n\n public completePendingActionObservation(): void {\n this.#timing.boundary();\n this.#completePolicyAction();\n }\n\n public admittedTaskIds(): readonly string[] {\n return Object.freeze([...this.#admittedTaskIds]);\n }\n\n /** Internal default terminal hook; it contains writer failure without runner special-casing. */\n public defaultSummaryHook(): SchedulerTerminalEffect | undefined {\n if (this.#logger === undefined) return undefined;\n const logger = this.#logger;\n return (context) => {\n try {\n logger.observe({\n event: \"scheduler.summary\",\n tags: diagnosticTags(\"SUMMARY\"),\n details: summaryFromSchedulerMeasurement(context.rawMeasurement)\n });\n } catch {\n // Summary writer failure is contained by this hook, not the shared runner.\n }\n };\n }\n\n #completePolicyAction(): void {\n const timing = this.#timing.snapshot();\n this.#policyMeasurement.complete(timing.totals, timing.timing);\n }\n\n #cumulativeMeasurement(): SchedulerDecisionMeasurementCumulative {\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #measurement(terminal: boolean): SchedulerRawMeasurement {\n const endedAt = this.#timing.boundary();\n if (terminal && endedAt !== undefined) this.#timing.closeAcceptedWait(endedAt);\n const snapshot = this.#timing.snapshot();\n const facts = Object.freeze({\n declarativeFingerprint: this.#declarativeFingerprint,\n discrete: Object.freeze({\n acceptedWaitCount: snapshot.acceptedWaitCount,\n admittedCount: this.#admittedTaskIds.size,\n completionTailActiveTaskIds: Object.freeze([...this.#completionTailActiveTaskIds]),\n lastSettledTaskId: this.#lastSettledTaskId ?? null,\n maxRunning: snapshot.maxRunning\n }),\n peaks: snapshot.peaks\n });\n if (snapshot.timing.availability === \"unavailable\") {\n return Object.freeze({ ...facts, timing: snapshot.timing });\n }\n if (endedAt === undefined)\n throw new Error(\"available Scheduler timing has no terminal boundary\");\n return Object.freeze({\n ...facts,\n timing: snapshot.timing,\n timingFacts: Object.freeze({\n acceptedWaitMs: snapshot.acceptedWaitMs,\n admissions: Object.freeze(this.#admissionMeasurements()),\n effectiveCapacitySlotMs: snapshot.totals.effectiveCapacitySlotMs,\n endedAtMonotonicMs: endedAt,\n rootCapacitySlotMs: snapshot.totals.rootCapacitySlotMs,\n schedulerControlPathMs: snapshot.schedulerControlPathMs,\n schedulerDecisionObservationMs: snapshot.decisionObservationMs,\n startedAtMonotonicMs: snapshot.startedAtMonotonicMs ?? endedAt,\n taskSlotMs: snapshot.totals.taskSlotMs\n })\n });\n }\n\n #admissionMeasurements(): SchedulerMeasurementAdmission[] {\n const pendingByTaskId = new Map(\n this.#timing\n .pendingAdmissionDelays()\n .map(({ admissionDelay, taskId }) => [taskId, admissionDelay])\n );\n const taskIds = new Set([...pendingByTaskId.keys(), ...this.#chronologyByTaskId.keys()]);\n return [...taskIds]\n .map((taskId) => this.#admissionMeasurement(taskId, pendingByTaskId))\n .sort((left, right) => compareText(left.taskId, right.taskId));\n }\n\n #admissionMeasurement(\n taskId: string,\n pendingByTaskId: ReadonlyMap<string, AdmissionDelayBreakdown>\n ): SchedulerMeasurementAdmission {\n const chronology = this.#chronologyByTaskId.get(taskId);\n const admissionDelay = chronology?.admissionDelay ?? pendingByTaskId.get(taskId);\n if (admissionDelay === undefined)\n throw new Error(`missing admission measurement for ${taskId}`);\n return Object.freeze({\n admissionDelay,\n admittedAtMonotonicMs: chronology?.admittedAt ?? null,\n settledAtMonotonicMs: chronology?.settledAt ?? null,\n taskId\n });\n }\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n"]}
|
|
@@ -106,23 +106,29 @@ export class SchedulerPerformanceTiming {
|
|
|
106
106
|
return undefined;
|
|
107
107
|
try {
|
|
108
108
|
const now = this.#clock.now();
|
|
109
|
-
if (!Number.isFinite(now))
|
|
110
|
-
|
|
109
|
+
if (!Number.isFinite(now)) {
|
|
110
|
+
this.#unavailable("clock-non-finite");
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
111
113
|
if (this.#lastBoundaryAt !== undefined && now < this.#lastBoundaryAt) {
|
|
112
|
-
|
|
114
|
+
this.#unavailable("clock-backward");
|
|
115
|
+
return undefined;
|
|
113
116
|
}
|
|
114
117
|
return now;
|
|
115
118
|
}
|
|
116
119
|
catch {
|
|
117
|
-
|
|
120
|
+
this.#unavailable("clock-threw");
|
|
121
|
+
return undefined;
|
|
118
122
|
}
|
|
119
123
|
}
|
|
120
124
|
#addTiming(kind, startedAt, endedAt) {
|
|
121
125
|
if (startedAt === undefined || endedAt === undefined)
|
|
122
126
|
return;
|
|
123
127
|
const elapsedMs = endedAt - startedAt;
|
|
124
|
-
if (!validElapsed(elapsedMs))
|
|
125
|
-
|
|
128
|
+
if (!validElapsed(elapsedMs)) {
|
|
129
|
+
this.#markUnavailable("interval-invalid");
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
126
132
|
if (kind === "control")
|
|
127
133
|
this.#controlPathMs += elapsedMs;
|
|
128
134
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/timing.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementIntervalContribution,\n SchedulerMeasurementTiming,\n SchedulerMeasurementTimingUnavailableReason\n} from \"../../../project-definition/project-definition.ts\";\nimport type { SchedulerPerformanceState } from \"./diagnostics.ts\";\nimport {\n SchedulerPerformanceIntegrals,\n type AdmissionDelayBreakdown,\n type SchedulerPerformancePeaks\n} from \"./integrals.ts\";\n\nexport type SchedulerPerformanceTimingSnapshot = Readonly<{\n readonly acceptedWaitCount: number;\n readonly acceptedWaitMs: number;\n readonly decisionObservationMs: number;\n readonly maxRunning: number;\n readonly peaks: SchedulerPerformancePeaks;\n readonly schedulerControlPathMs: number;\n readonly startedAtMonotonicMs: number | undefined;\n readonly timing: SchedulerMeasurementTiming;\n readonly totals: SchedulerMeasurementIntervalContribution;\n}>;\n\n/** Owns monotonic clock boundaries and delegates numeric interval accumulation. */\nexport class SchedulerPerformanceTiming {\n readonly #clock: Readonly<{ now(): number }>;\n readonly #integrals = new SchedulerPerformanceIntegrals();\n #lastBoundaryAt: number | undefined;\n #startedAt: number | undefined;\n #lastState: SchedulerPerformanceState;\n #timing: SchedulerMeasurementTiming = Object.freeze({ availability: \"available\" });\n #controlPathMs = 0;\n #decisionObservationMs = 0;\n #maxRunning: number;\n #acceptedWaitStartedAt: number | undefined;\n #acceptedWaitMs = 0;\n #acceptedWaitCount = 0;\n\n public constructor(clock: Readonly<{ now(): number }>, initial: SchedulerPerformanceState) {\n this.#clock = clock;\n this.#lastState = initial;\n this.#maxRunning = initial.running;\n this.#integrals.installPendingProjection(initial.admissionViablePendingTasks, true);\n const boundary = this.#sample();\n if (boundary !== undefined) {\n this.#lastBoundaryAt = boundary;\n this.#startedAt = boundary;\n }\n }\n\n /** Accounts a synchronous shell operation, never an await or author callback. */\n public measureControlPath<T>(operation: () => T): T {\n const startedAt = this.#sample();\n try {\n return operation();\n } finally {\n this.#addTiming(\"control\", startedAt, this.#sample());\n }\n }\n\n /** Keeps decision writer work separate from the shell control-path projection. */\n public observeDecision(observation: () => void): void {\n const startedAt = this.#sample();\n try {\n observation();\n } catch {\n // Diagnostic writers are observational; a direct test seam must preserve that containment too.\n }\n this.#addTiming(\"decision-observation\", startedAt, this.#sample());\n }\n\n public boundary(): number | undefined {\n const now = this.#sample();\n if (now === undefined) return undefined;\n if (this.#lastBoundaryAt !== undefined) this.#addElapsed(now - this.#lastBoundaryAt);\n this.#lastBoundaryAt = now;\n return this.#timing.availability === \"available\" ? now : undefined;\n }\n\n public beginAcceptedWait(): void {\n this.#acceptedWaitCount += 1;\n const boundary = this.boundary();\n if (boundary !== undefined && this.#acceptedWaitStartedAt === undefined) {\n this.#acceptedWaitStartedAt = boundary;\n }\n }\n\n public closeAcceptedWait(boundary: number): void {\n if (this.#acceptedWaitStartedAt === undefined) return;\n const elapsedMs = boundary - this.#acceptedWaitStartedAt;\n if (!validElapsed(elapsedMs)) this.#markUnavailable(\"interval-invalid\");\n else this.#acceptedWaitMs += elapsedMs;\n if (!Number.isFinite(this.#acceptedWaitMs)) this.#markUnavailable(\"integral-invalid\");\n this.#acceptedWaitStartedAt = undefined;\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#lastState = state;\n this.#maxRunning = Math.max(this.#maxRunning, state.running);\n this.#integrals.installPendingProjection(\n state.admissionViablePendingTasks,\n this.#timing.availability === \"available\"\n );\n }\n\n public takeAdmissionDelay(taskId: string): AdmissionDelayBreakdown | undefined {\n return this.#integrals.takeAdmissionDelay(taskId);\n }\n\n public pendingAdmissionDelays(): ReturnType<\n SchedulerPerformanceIntegrals[\"pendingAdmissionDelays\"]\n > {\n return this.#integrals.pendingAdmissionDelays();\n }\n\n public snapshot(): SchedulerPerformanceTimingSnapshot {\n const integralTotals = this.#integrals.totals();\n return Object.freeze({\n acceptedWaitCount: this.#acceptedWaitCount,\n acceptedWaitMs: this.#acceptedWaitMs,\n decisionObservationMs: this.#decisionObservationMs,\n maxRunning: this.#maxRunning,\n peaks: this.#integrals.peaks(),\n schedulerControlPathMs: this.#controlPathMs,\n startedAtMonotonicMs: this.#startedAt,\n timing: this.#timing,\n totals: Object.freeze({ ...integralTotals, acceptedWaitMs: this.#acceptedWaitMs })\n });\n }\n\n public invalidate(reason: SchedulerMeasurementTimingUnavailableReason): void {\n this.#markUnavailable(reason);\n }\n\n #sample(): number | undefined {\n if (this.#timing.availability === \"unavailable\") return undefined;\n try {\n const now = this.#clock.now();\n if (!Number.isFinite(now)) return this.#unavailable(\"clock-non-finite\");\n if (this.#lastBoundaryAt !== undefined && now < this.#lastBoundaryAt) {\n return this.#unavailable(\"clock-backward\");\n }\n return now;\n } catch {\n return this.#unavailable(\"clock-threw\");\n }\n }\n\n #addTiming(\n kind: \"control\" | \"decision-observation\",\n startedAt: number | undefined,\n endedAt: number | undefined\n ): void {\n if (startedAt === undefined || endedAt === undefined) return;\n const elapsedMs = endedAt - startedAt;\n if (!validElapsed(elapsedMs)) return this.#markUnavailable(\"interval-invalid\");\n if (kind === \"control\") this.#controlPathMs += elapsedMs;\n else this.#decisionObservationMs += elapsedMs;\n if (!Number.isFinite(this.#controlPathMs) || !Number.isFinite(this.#decisionObservationMs)) {\n this.#markUnavailable(\"integral-invalid\");\n }\n }\n\n #addElapsed(elapsedMs: number): void {\n if (!validElapsed(elapsedMs)) {\n this.#markUnavailable(elapsedMs < 0 ? \"clock-backward\" : \"interval-invalid\");\n return;\n }\n if (this.#timing.availability !== \"available\") return;\n if (!this.#integrals.addInterval(elapsedMs, this.#lastState)) {\n this.#markUnavailable(\"integral-invalid\");\n }\n }\n\n #unavailable(reason: SchedulerMeasurementTimingUnavailableReason): undefined {\n this.#markUnavailable(reason);\n return undefined;\n }\n\n #markUnavailable(reason: SchedulerMeasurementTimingUnavailableReason): void {\n if (this.#timing.availability === \"available\") {\n this.#timing = Object.freeze({ availability: \"unavailable\", reason });\n }\n }\n}\n\nfunction validElapsed(elapsedMs: number): boolean {\n return Number.isFinite(elapsedMs) && elapsedMs >= 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"timing.mjs","sourceRoot":"","sources":["../../../../../src/project-run/task-scheduler/measurement/timing.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementIntervalContribution,\n SchedulerMeasurementTiming,\n SchedulerMeasurementTimingUnavailableReason\n} from \"../../../project-definition/project-definition.ts\";\nimport type { SchedulerPerformanceState } from \"./diagnostics.ts\";\nimport {\n SchedulerPerformanceIntegrals,\n type AdmissionDelayBreakdown,\n type SchedulerPerformancePeaks\n} from \"./integrals.ts\";\n\nexport type SchedulerPerformanceTimingSnapshot = Readonly<{\n readonly acceptedWaitCount: number;\n readonly acceptedWaitMs: number;\n readonly decisionObservationMs: number;\n readonly maxRunning: number;\n readonly peaks: SchedulerPerformancePeaks;\n readonly schedulerControlPathMs: number;\n readonly startedAtMonotonicMs: number | undefined;\n readonly timing: SchedulerMeasurementTiming;\n readonly totals: SchedulerMeasurementIntervalContribution;\n}>;\n\n/** Owns monotonic clock boundaries and delegates numeric interval accumulation. */\nexport class SchedulerPerformanceTiming {\n readonly #clock: Readonly<{ now(): number }>;\n readonly #integrals = new SchedulerPerformanceIntegrals();\n #lastBoundaryAt: number | undefined;\n readonly #startedAt: number | undefined;\n #lastState: SchedulerPerformanceState;\n #timing: SchedulerMeasurementTiming = Object.freeze({ availability: \"available\" });\n #controlPathMs = 0;\n #decisionObservationMs = 0;\n #maxRunning: number;\n #acceptedWaitStartedAt: number | undefined;\n #acceptedWaitMs = 0;\n #acceptedWaitCount = 0;\n\n public constructor(clock: Readonly<{ now(): number }>, initial: SchedulerPerformanceState) {\n this.#clock = clock;\n this.#lastState = initial;\n this.#maxRunning = initial.running;\n this.#integrals.installPendingProjection(initial.admissionViablePendingTasks, true);\n const boundary = this.#sample();\n if (boundary !== undefined) {\n this.#lastBoundaryAt = boundary;\n this.#startedAt = boundary;\n }\n }\n\n /** Accounts a synchronous shell operation, never an await or author callback. */\n public measureControlPath<T>(operation: () => T): T {\n const startedAt = this.#sample();\n try {\n return operation();\n } finally {\n this.#addTiming(\"control\", startedAt, this.#sample());\n }\n }\n\n /** Keeps decision writer work separate from the shell control-path projection. */\n public observeDecision(observation: () => void): void {\n const startedAt = this.#sample();\n try {\n observation();\n } catch {\n // Diagnostic writers are observational; a direct test seam must preserve that containment too.\n }\n this.#addTiming(\"decision-observation\", startedAt, this.#sample());\n }\n\n public boundary(): number | undefined {\n const now = this.#sample();\n if (now === undefined) return undefined;\n if (this.#lastBoundaryAt !== undefined) this.#addElapsed(now - this.#lastBoundaryAt);\n this.#lastBoundaryAt = now;\n return this.#timing.availability === \"available\" ? now : undefined;\n }\n\n public beginAcceptedWait(): void {\n this.#acceptedWaitCount += 1;\n const boundary = this.boundary();\n if (boundary !== undefined && this.#acceptedWaitStartedAt === undefined) {\n this.#acceptedWaitStartedAt = boundary;\n }\n }\n\n public closeAcceptedWait(boundary: number): void {\n if (this.#acceptedWaitStartedAt === undefined) return;\n const elapsedMs = boundary - this.#acceptedWaitStartedAt;\n if (!validElapsed(elapsedMs)) this.#markUnavailable(\"interval-invalid\");\n else this.#acceptedWaitMs += elapsedMs;\n if (!Number.isFinite(this.#acceptedWaitMs)) this.#markUnavailable(\"integral-invalid\");\n this.#acceptedWaitStartedAt = undefined;\n }\n\n public captureState(state: SchedulerPerformanceState): void {\n this.#lastState = state;\n this.#maxRunning = Math.max(this.#maxRunning, state.running);\n this.#integrals.installPendingProjection(\n state.admissionViablePendingTasks,\n this.#timing.availability === \"available\"\n );\n }\n\n public takeAdmissionDelay(taskId: string): AdmissionDelayBreakdown | undefined {\n return this.#integrals.takeAdmissionDelay(taskId);\n }\n\n public pendingAdmissionDelays(): ReturnType<\n SchedulerPerformanceIntegrals[\"pendingAdmissionDelays\"]\n > {\n return this.#integrals.pendingAdmissionDelays();\n }\n\n public snapshot(): SchedulerPerformanceTimingSnapshot {\n const integralTotals = this.#integrals.totals();\n return Object.freeze({\n acceptedWaitCount: this.#acceptedWaitCount,\n acceptedWaitMs: this.#acceptedWaitMs,\n decisionObservationMs: this.#decisionObservationMs,\n maxRunning: this.#maxRunning,\n peaks: this.#integrals.peaks(),\n schedulerControlPathMs: this.#controlPathMs,\n startedAtMonotonicMs: this.#startedAt,\n timing: this.#timing,\n totals: Object.freeze({ ...integralTotals, acceptedWaitMs: this.#acceptedWaitMs })\n });\n }\n\n public invalidate(reason: SchedulerMeasurementTimingUnavailableReason): void {\n this.#markUnavailable(reason);\n }\n\n #sample(): number | undefined {\n if (this.#timing.availability === \"unavailable\") return undefined;\n try {\n const now = this.#clock.now();\n if (!Number.isFinite(now)) {\n this.#unavailable(\"clock-non-finite\");\n return undefined;\n }\n if (this.#lastBoundaryAt !== undefined && now < this.#lastBoundaryAt) {\n this.#unavailable(\"clock-backward\");\n return undefined;\n }\n return now;\n } catch {\n this.#unavailable(\"clock-threw\");\n return undefined;\n }\n }\n\n #addTiming(\n kind: \"control\" | \"decision-observation\",\n startedAt: number | undefined,\n endedAt: number | undefined\n ): void {\n if (startedAt === undefined || endedAt === undefined) return;\n const elapsedMs = endedAt - startedAt;\n if (!validElapsed(elapsedMs)) {\n this.#markUnavailable(\"interval-invalid\");\n return;\n }\n if (kind === \"control\") this.#controlPathMs += elapsedMs;\n else this.#decisionObservationMs += elapsedMs;\n if (!Number.isFinite(this.#controlPathMs) || !Number.isFinite(this.#decisionObservationMs)) {\n this.#markUnavailable(\"integral-invalid\");\n }\n }\n\n #addElapsed(elapsedMs: number): void {\n if (!validElapsed(elapsedMs)) {\n this.#markUnavailable(elapsedMs < 0 ? \"clock-backward\" : \"interval-invalid\");\n return;\n }\n if (this.#timing.availability !== \"available\") return;\n if (!this.#integrals.addInterval(elapsedMs, this.#lastState)) {\n this.#markUnavailable(\"integral-invalid\");\n }\n }\n\n #unavailable(reason: SchedulerMeasurementTimingUnavailableReason): undefined {\n this.#markUnavailable(reason);\n return undefined;\n }\n\n #markUnavailable(reason: SchedulerMeasurementTimingUnavailableReason): void {\n if (this.#timing.availability === \"available\") {\n this.#timing = Object.freeze({ availability: \"unavailable\", reason });\n }\n }\n}\n\nfunction validElapsed(elapsedMs: number): boolean {\n return Number.isFinite(elapsedMs) && elapsedMs >= 0;\n}\n"]}
|
|
@@ -15,7 +15,9 @@ export function observeSchedulerDecision(state, decision, diagnostics) {
|
|
|
15
15
|
tags: schedulerDecisionTags(decision),
|
|
16
16
|
details: schedulerDecisionDetails(decision)
|
|
17
17
|
};
|
|
18
|
-
const observe = () =>
|
|
18
|
+
const observe = () => {
|
|
19
|
+
observeSchedulerDiagnostic(state, observation);
|
|
20
|
+
};
|
|
19
21
|
if (diagnostics === undefined)
|
|
20
22
|
observe();
|
|
21
23
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler-observation.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-observation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,cAAc,EAA8B,MAAM,iCAAiC,CAAC;AAG7F,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC/B,MAAM,0BAA0B,CAAC;AAQlC,gGAAgG;AAChG,MAAM,UAAU,2BAA2B,CACzC,KAA8B,EAC9B,KAA2B;IAE3B,0BAA0B,CAAC,KAAK,EAAE;QAChC,KAAK,EAAE,mCAAmC;QAC1C,IAAI,EAAE,cAAc,CAAC,yBAAyB,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC7E,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;KACrD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAA8B,EAC9B,QAA2B,EAC3B,WAAwD;IAExD,MAAM,WAAW,GAA0B;QACzC,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,qBAAqB,CAAC,QAAQ,CAAC;QACrC,OAAO,EAAE,wBAAwB,CAAC,QAAQ,CAAC;KAC5C,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"scheduler-observation.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-observation.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { diagnosticTags, type DiagnosticObservation } from \"../diagnostic-logging/logger.ts\";\nimport type { SchedulerDecision } from \"./scheduler-decision.ts\";\nimport type { SchedulerState } from \"./execution-state.ts\";\nimport {\n schedulerInspectionForCore,\n validateAdmissionCoreSelection\n} from \"./admission-core/core.ts\";\nimport type {\n AdmissionViablePendingTask,\n SchedulerPerformanceDiagnostics,\n SchedulerPerformanceState\n} from \"./measurement/diagnostics.ts\";\nimport type { AdmissionPolicyFault } from \"./scheduler-admission-decision.ts\";\n\n/** Fault logging is observational and therefore excluded from Scheduler control-path timing. */\nexport function observeAdmissionPolicyFault<TResult>(\n state: SchedulerState<TResult>,\n fault: AdmissionPolicyFault\n): void {\n observeSchedulerDiagnostic(state, {\n event: \"scheduler.admission-policy-failed\",\n tags: diagnosticTags(\"ADMISSION_POLICY_FAILED\", fault.category.toUpperCase()),\n details: Object.freeze({ category: fault.category })\n });\n}\n\nexport function observeSchedulerDecision<TResult>(\n state: SchedulerState<TResult>,\n decision: SchedulerDecision,\n diagnostics: SchedulerPerformanceDiagnostics | undefined\n): void {\n const observation: DiagnosticObservation = {\n event: \"scheduler.decision\",\n tags: schedulerDecisionTags(decision),\n details: schedulerDecisionDetails(decision)\n };\n const observe = () => {\n observeSchedulerDiagnostic(state, observation);\n };\n if (diagnostics === undefined) observe();\n else diagnostics.observeDecision(observe);\n}\n\n/** One immutable graph record makes the enclosing scheduler channel the self-contained evidence unit. */\nexport function observeSchedulerGraph<TResult>(state: SchedulerState<TResult>): void {\n const graph = state.graph.schedulerGraphSnapshot;\n observeSchedulerDiagnostic(state, {\n event: \"scheduler.graph\",\n tags: diagnosticTags(\"GRAPH\"),\n details: Object.freeze({ graph, graphFingerprint: schedulerGraphFingerprint(graph) })\n });\n}\n\nexport function schedulerGraphFingerprint(graph: unknown): string {\n return createHash(\"sha256\").update(JSON.stringify(graph)).digest(\"hex\");\n}\n\nfunction schedulerDecisionDetails(decision: SchedulerDecision): Readonly<Record<string, unknown>> {\n const { graphIdentity, ...dynamicFacts } = decision;\n return Object.freeze({\n ...dynamicFacts,\n graphFingerprint: schedulerGraphFingerprint(graphIdentity)\n });\n}\n\n/** Logger failures are observational and must not revise Scheduler lifecycle state. */\nexport function observeSchedulerDiagnostic<TResult>(\n state: SchedulerState<TResult>,\n observation: DiagnosticObservation\n): void {\n try {\n state.diagnosticLogger?.observe(observation);\n } catch {\n // Invocation logging has its own containment; retain it for direct Scheduler seams as well.\n }\n}\n\nexport function performanceState<TResult>(\n state: SchedulerState<TResult>\n): SchedulerPerformanceState {\n const inspection = schedulerInspectionForCore(state.admissionCore);\n const admissionViablePendingTasks: AdmissionViablePendingTask[] = [];\n for (const task of inspection.pendingTasks) {\n const validation = validateAdmissionCoreSelection(state.admissionCore, task.id);\n if (validation.accepted) {\n admissionViablePendingTasks.push(\n Object.freeze({ kind: \"admissible-pending\", taskId: task.id })\n );\n continue;\n }\n switch (validation.reason.kind) {\n case \"mutex-held\":\n admissionViablePendingTasks.push(Object.freeze({ kind: \"mutex-blocked\", taskId: task.id }));\n continue;\n case \"root-capacity-reached\":\n case \"scope-capacity-reached\":\n case \"resource-capacity-insufficient\":\n admissionViablePendingTasks.push(\n Object.freeze({ kind: \"capacity-blocked\", taskId: task.id })\n );\n continue;\n case \"depends-on-pending\":\n case \"observes-pending\":\n continue;\n case \"not-pending\":\n case \"state-complete\":\n case \"unknown-task\":\n throw new Error(\"shared admission core disagrees with Scheduler pending state\");\n }\n }\n return Object.freeze({\n admissionViablePendingTasks: Object.freeze(admissionViablePendingTasks),\n effectiveMaxParallel: inspection.effectiveMaxParallel,\n rootMaxParallel: inspection.maxParallel,\n running: inspection.runningTaskIds.length\n });\n}\n\nfunction schedulerDecisionTags(decision: SchedulerDecision): readonly string[] {\n return diagnosticTags(\n decision.kind.toUpperCase(),\n ...(\"taskId\" in decision ? [`TASK:${decision.taskId}`] : [])\n );\n}\n"]}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
import { diagnosticTags } from "../diagnostic-logging/logger.mjs";
|
|
2
2
|
import { observeSchedulerDiagnostic } from "./scheduler-observation.mjs";
|
|
3
|
-
/** Delivers the terminal measurement to the internal summary and caller
|
|
3
|
+
/** Delivers the terminal measurement to the internal summary and caller effects exactly once. */
|
|
4
4
|
export async function observeTerminalMeasurement(input) {
|
|
5
5
|
input.diagnostics.completePendingActionObservation();
|
|
6
6
|
const context = measurementContext(input.state, input.diagnostics.admittedTaskIds(), input.diagnostics.rawMeasurement());
|
|
7
|
-
const
|
|
8
|
-
let
|
|
9
|
-
const
|
|
10
|
-
|
|
7
|
+
const callerEffects = input.options.terminalEffects ?? [];
|
|
8
|
+
let callerEffectFailed = false;
|
|
9
|
+
const reportCallerEffectFailure = () => {
|
|
10
|
+
callerEffectFailed = true;
|
|
11
11
|
observeSchedulerDiagnostic(input.state, {
|
|
12
|
-
event: "scheduler.
|
|
13
|
-
tags: diagnosticTags("
|
|
12
|
+
event: "scheduler.terminal-effect-failed",
|
|
13
|
+
tags: diagnosticTags("TERMINAL_EFFECT_FAILED"),
|
|
14
14
|
details: Object.freeze({})
|
|
15
15
|
});
|
|
16
16
|
try {
|
|
17
|
-
input.options.
|
|
17
|
+
input.options.onTerminalEffectFailure?.();
|
|
18
18
|
}
|
|
19
19
|
catch {
|
|
20
20
|
// A failure-reporting seam cannot revise terminal Scheduler facts either.
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
-
const
|
|
23
|
+
const defaultSummaryEffect = input.diagnostics.defaultSummaryHook();
|
|
24
24
|
const deliveries = Object.freeze([
|
|
25
|
-
...(
|
|
25
|
+
...(defaultSummaryEffect === undefined
|
|
26
26
|
? []
|
|
27
|
-
: [Object.freeze({
|
|
28
|
-
...
|
|
27
|
+
: [Object.freeze({ effect: defaultSummaryEffect, onFailure: () => undefined })]),
|
|
28
|
+
...callerEffects.map((effect) => Object.freeze({ effect, onFailure: reportCallerEffectFailure }))
|
|
29
29
|
]);
|
|
30
|
-
await
|
|
31
|
-
if (
|
|
30
|
+
await deliverTerminalEffects(deliveries, context);
|
|
31
|
+
if (callerEffects.length > 0 && !callerEffectFailed) {
|
|
32
32
|
try {
|
|
33
|
-
input.options.
|
|
33
|
+
input.options.onTerminalEffectsSettled?.();
|
|
34
34
|
}
|
|
35
35
|
catch {
|
|
36
36
|
// A success-reporting seam cannot revise terminal Scheduler facts either.
|
|
@@ -38,10 +38,10 @@ export async function observeTerminalMeasurement(input) {
|
|
|
38
38
|
}
|
|
39
39
|
return context;
|
|
40
40
|
}
|
|
41
|
-
async function
|
|
41
|
+
async function deliverTerminalEffects(deliveries, context) {
|
|
42
42
|
for (const delivery of deliveries) {
|
|
43
43
|
try {
|
|
44
|
-
await delivery.
|
|
44
|
+
await delivery.effect(context);
|
|
45
45
|
}
|
|
46
46
|
catch {
|
|
47
47
|
delivery.onFailure();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler-terminal-measurement.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-terminal-measurement.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAExE
|
|
1
|
+
{"version":3,"file":"scheduler-terminal-measurement.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler-terminal-measurement.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n SchedulerMeasurementContext,\n SchedulerTerminalEffect,\n SchedulerRawMeasurement\n} from \"../../project-definition/project-definition.ts\";\nimport { diagnosticTags } from \"../diagnostic-logging/logger.ts\";\nimport type { RunTaskGraphOptions, SchedulerState } from \"./execution-state.ts\";\nimport type { SchedulerPerformanceDiagnostics } from \"./measurement/diagnostics.ts\";\nimport { observeSchedulerDiagnostic } from \"./scheduler-observation.ts\";\n\n/** Delivers the terminal measurement to the internal summary and caller effects exactly once. */\nexport async function observeTerminalMeasurement<TResult>(\n input: Readonly<{\n readonly diagnostics: SchedulerPerformanceDiagnostics;\n readonly options: RunTaskGraphOptions<TResult>;\n readonly state: SchedulerState<TResult>;\n }>\n): Promise<SchedulerMeasurementContext> {\n input.diagnostics.completePendingActionObservation();\n const context = measurementContext(\n input.state,\n input.diagnostics.admittedTaskIds(),\n input.diagnostics.rawMeasurement()\n );\n const callerEffects = input.options.terminalEffects ?? [];\n let callerEffectFailed = false;\n const reportCallerEffectFailure = () => {\n callerEffectFailed = true;\n observeSchedulerDiagnostic(input.state, {\n event: \"scheduler.terminal-effect-failed\",\n tags: diagnosticTags(\"TERMINAL_EFFECT_FAILED\"),\n details: Object.freeze({})\n });\n try {\n input.options.onTerminalEffectFailure?.();\n } catch {\n // A failure-reporting seam cannot revise terminal Scheduler facts either.\n }\n };\n const defaultSummaryEffect = input.diagnostics.defaultSummaryHook();\n const deliveries: readonly TerminalEffectDelivery[] = Object.freeze([\n ...(defaultSummaryEffect === undefined\n ? []\n : [Object.freeze({ effect: defaultSummaryEffect, onFailure: () => undefined })]),\n ...callerEffects.map((effect) =>\n Object.freeze({ effect, onFailure: reportCallerEffectFailure })\n )\n ]);\n await deliverTerminalEffects(deliveries, context);\n if (callerEffects.length > 0 && !callerEffectFailed) {\n try {\n input.options.onTerminalEffectsSettled?.();\n } catch {\n // A success-reporting seam cannot revise terminal Scheduler facts either.\n }\n }\n return context;\n}\n\ntype TerminalEffectDelivery = Readonly<{\n readonly effect: SchedulerTerminalEffect;\n readonly onFailure: () => void;\n}>;\n\nasync function deliverTerminalEffects(\n deliveries: readonly TerminalEffectDelivery[],\n context: SchedulerMeasurementContext\n): Promise<void> {\n for (const delivery of deliveries) {\n try {\n await delivery.effect(context);\n } catch {\n delivery.onFailure();\n }\n }\n}\n\nfunction measurementContext<TResult>(\n state: SchedulerState<TResult>,\n admittedTaskIds: readonly string[],\n rawMeasurement: SchedulerRawMeasurement\n): SchedulerMeasurementContext {\n return Object.freeze({\n graph: state.graph.schedulerGraphSnapshot,\n execution: Object.freeze({\n admittedTaskIds: Object.freeze([...admittedTaskIds]),\n settledTasks: Object.freeze(\n state.graph.tasks.map((task) => {\n const settlement = state.settlementsByTaskId.get(task.id);\n if (settlement === undefined) throw new Error(`task ${task.id} was not settled`);\n return Object.freeze({ kind: settlement.kind, taskId: task.id });\n })\n )\n }),\n rawMeasurement\n });\n}\n"]}
|
|
@@ -45,7 +45,9 @@ export async function runTaskGraph(options) {
|
|
|
45
45
|
if (diagnostics === undefined)
|
|
46
46
|
applyAdmissionPolicyFault(state, error);
|
|
47
47
|
else
|
|
48
|
-
diagnostics.measureControlPath(() =>
|
|
48
|
+
diagnostics.measureControlPath(() => {
|
|
49
|
+
applyAdmissionPolicyFault(state, error);
|
|
50
|
+
});
|
|
49
51
|
diagnostics?.captureState(performanceState(state));
|
|
50
52
|
observeAdmissionPolicyFault(state, error);
|
|
51
53
|
trigger = Object.freeze({ kind: "cancellation-applied" });
|
|
@@ -62,7 +64,9 @@ export async function runTaskGraph(options) {
|
|
|
62
64
|
if (diagnostics === undefined)
|
|
63
65
|
applyAdmissionPolicyFault(state, lifecycleFault);
|
|
64
66
|
else
|
|
65
|
-
diagnostics.measureControlPath(() =>
|
|
67
|
+
diagnostics.measureControlPath(() => {
|
|
68
|
+
applyAdmissionPolicyFault(state, lifecycleFault);
|
|
69
|
+
});
|
|
66
70
|
diagnostics?.captureState(performanceState(state));
|
|
67
71
|
observeAdmissionPolicyFault(state, lifecycleFault);
|
|
68
72
|
trigger = Object.freeze({ kind: "cancellation-applied" });
|
|
@@ -81,7 +85,9 @@ export async function runTaskGraph(options) {
|
|
|
81
85
|
if (diagnostics === undefined)
|
|
82
86
|
applyAdmission(state, decision);
|
|
83
87
|
else
|
|
84
|
-
diagnostics.measureControlPath(() =>
|
|
88
|
+
diagnostics.measureControlPath(() => {
|
|
89
|
+
applyAdmission(state, decision);
|
|
90
|
+
});
|
|
85
91
|
diagnostics?.captureState(performanceState(state));
|
|
86
92
|
if (state.admissionPolicy.requiresMeasurement === true) {
|
|
87
93
|
diagnostics?.beginSelectedPolicyAction(decision.taskId);
|
|
@@ -96,7 +102,9 @@ export async function runTaskGraph(options) {
|
|
|
96
102
|
if (diagnostics === undefined)
|
|
97
103
|
applyBlockedSettlement(state, decision);
|
|
98
104
|
else
|
|
99
|
-
diagnostics.measureControlPath(() =>
|
|
105
|
+
diagnostics.measureControlPath(() => {
|
|
106
|
+
applyBlockedSettlement(state, decision);
|
|
107
|
+
});
|
|
100
108
|
diagnostics?.captureState(performanceState(state));
|
|
101
109
|
diagnostics?.recordEffect(Object.freeze({
|
|
102
110
|
kind: "settled",
|
|
@@ -114,7 +122,9 @@ export async function runTaskGraph(options) {
|
|
|
114
122
|
if (diagnostics === undefined)
|
|
115
123
|
applyCancellation(state, decision);
|
|
116
124
|
else
|
|
117
|
-
diagnostics.measureControlPath(() =>
|
|
125
|
+
diagnostics.measureControlPath(() => {
|
|
126
|
+
applyCancellation(state, decision);
|
|
127
|
+
});
|
|
118
128
|
diagnostics?.captureState(performanceState(state));
|
|
119
129
|
for (const taskId of decision.taskIds) {
|
|
120
130
|
diagnostics?.recordEffect(Object.freeze({
|
|
@@ -137,7 +147,9 @@ export async function runTaskGraph(options) {
|
|
|
137
147
|
if (diagnostics === undefined)
|
|
138
148
|
settleRunningTask(state, completion);
|
|
139
149
|
else
|
|
140
|
-
diagnostics.measureControlPath(() =>
|
|
150
|
+
diagnostics.measureControlPath(() => {
|
|
151
|
+
settleRunningTask(state, completion);
|
|
152
|
+
});
|
|
141
153
|
const settlementKind = completion.settlement.kind;
|
|
142
154
|
if (settlementKind !== "completed" &&
|
|
143
155
|
settlementKind !== "prerequisite-unsatisfied" &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionPolicyContext } from \"../../project-definition/project-definition.ts\";\nimport { prepareTaskGraph } from \"./graph.ts\";\nimport {\n decideScheduler,\n type SchedulerDecision,\n type SchedulerTrigger\n} from \"./scheduler-decision.ts\";\nimport {\n createSchedulerState,\n snapshotSchedulerState,\n type RunTaskGraphOptions,\n type SchedulerState,\n type TaskGraphRun\n} from \"./execution-state.ts\";\nexport type {\n RunTaskGraphOptions,\n SettledTask,\n TaskExecutionContext,\n TaskGraphRun,\n TaskSettlement\n} from \"./execution-state.ts\";\nimport { AdmissionPolicyFault } from \"./scheduler-admission-decision.ts\";\nimport { replayCoreForcedBlocks } from \"./forced-block-effect-replay.ts\";\nimport { SchedulerPerformanceDiagnostics } from \"./measurement/diagnostics.ts\";\nimport {\n observeAdmissionPolicyFault,\n observeSchedulerDecision,\n observeSchedulerGraph,\n performanceState\n} from \"./scheduler-observation.ts\";\nimport { observeTerminalMeasurement } from \"./scheduler-terminal-measurement.ts\";\nimport {\n applyAdmission,\n applyAdmissionPolicyFault,\n applyBlockedSettlement,\n applyCancellation,\n buildTaskGraphRun,\n nextRunningSettlement,\n settleRunningTask\n} from \"./scheduler-task-lifecycle.ts\";\nimport {\n cancelPendingAdmissionCore,\n reconcileAdmissionCore,\n selectAdmissionCore,\n settleRunningAdmissionCore,\n type AdmissionCoreEffect\n} from \"./admission-core/core.ts\";\n\nexport async function runTaskGraph<TResult>(\n options: RunTaskGraphOptions<TResult>\n): Promise<TaskGraphRun<TResult>> {\n const graph = prepareTaskGraph(options.graph, options.maxParallel);\n const state = createSchedulerState(graph, options);\n observeSchedulerGraph(state);\n const measurementInput =\n options.performanceDiagnostics ??\n (state.admissionPolicy.requiresMeasurement === true\n ? Object.freeze({\n clock: Object.freeze({ now: () => performance.now() }),\n declarativeFingerprint: \"\"\n })\n : undefined);\n const diagnostics =\n measurementInput === undefined\n ? undefined\n : new SchedulerPerformanceDiagnostics(measurementInput, performanceState(state));\n const initialReconciliation = reconcileAdmissionCore(state.admissionCore);\n replayCoreForcedBlocks(\n state,\n initialReconciliation.effects,\n initialReconciliation.effectStates,\n diagnostics,\n triggerForInitialReconciliation()\n );\n let trigger: SchedulerTrigger = Object.freeze({ kind: \"execution-started\" });\n\n while (true) {\n let decision: SchedulerDecision;\n try {\n const snapshot = snapshotSchedulerState(state);\n const measurement =\n state.admissionPolicy.requiresMeasurement === true\n ? () => decisionBoundaryMeasurement(diagnostics)\n : undefined;\n decision =\n diagnostics?.measureControlPath(() =>\n decideScheduler(\n snapshot,\n trigger,\n state.admissionPolicy,\n measurement,\n state.admissionCore\n )\n ) ??\n decideScheduler(snapshot, trigger, state.admissionPolicy, measurement, state.admissionCore);\n } catch (error) {\n if (!(error instanceof AdmissionPolicyFault)) throw error;\n const cancellation = cancelPendingAdmissionCore(state.admissionCore);\n state.admissionCore = cancellation.state;\n diagnostics?.beforePendingSettlement(state.pending.map((task) => task.id));\n if (diagnostics === undefined) applyAdmissionPolicyFault(state, error);\n else diagnostics.measureControlPath(() => applyAdmissionPolicyFault(state, error));\n diagnostics?.captureState(performanceState(state));\n observeAdmissionPolicyFault(state, error);\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n }\n observeSchedulerDecision(state, decision, diagnostics);\n\n switch (decision.kind) {\n case \"admit\": {\n if (state.signal?.aborted === true) {\n const cancellation = cancelPendingAdmissionCore(state.admissionCore);\n state.admissionCore = cancellation.state;\n diagnostics?.beforePendingSettlement(state.pending.map((task) => task.id));\n const lifecycleFault = new AdmissionPolicyFault(\"lifecycle-invalid-select\");\n if (diagnostics === undefined) applyAdmissionPolicyFault(state, lifecycleFault);\n else\n diagnostics.measureControlPath(() => applyAdmissionPolicyFault(state, lifecycleFault));\n diagnostics?.captureState(performanceState(state));\n observeAdmissionPolicyFault(state, lifecycleFault);\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n }\n const selection = selectAdmissionCore(state.admissionCore, decision.taskId);\n if (!selection.accepted) {\n throw new Error(\"shared admission core rejected a Scheduler hard-guarded selection\");\n }\n const admissionEffect = selection.transition.effects[0];\n if (admissionEffect === undefined) {\n throw new Error(\"shared admission core omitted a Scheduler admission effect\");\n }\n state.admissionCore = selection.transition.state;\n diagnostics?.beforeAdmission(decision.taskId, [...state.runningById.keys()]);\n if (diagnostics === undefined) applyAdmission(state, decision);\n else diagnostics.measureControlPath(() => applyAdmission(state, decision));\n diagnostics?.captureState(performanceState(state));\n if (state.admissionPolicy.requiresMeasurement === true) {\n diagnostics?.beginSelectedPolicyAction(decision.taskId);\n diagnostics?.recordEffect(Object.freeze({ kind: \"admitted\", taskId: decision.taskId }));\n }\n observeAdmissionCoreEffect(state, admissionEffect);\n trigger = Object.freeze({ kind: \"admission-continued\" });\n continue;\n }\n case \"settle-blocked\":\n diagnostics?.beforePendingSettlement([decision.taskId]);\n if (diagnostics === undefined) applyBlockedSettlement(state, decision);\n else diagnostics.measureControlPath(() => applyBlockedSettlement(state, decision));\n diagnostics?.captureState(performanceState(state));\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: \"blocked\",\n taskId: decision.taskId\n })\n );\n trigger = Object.freeze({\n kind: \"blocked-settled\",\n taskId: decision.taskId\n });\n continue;\n case \"cancel-pending\":\n state.admissionCore = cancelPendingAdmissionCore(state.admissionCore).state;\n diagnostics?.beforePendingSettlement(decision.taskIds);\n if (diagnostics === undefined) applyCancellation(state, decision);\n else diagnostics.measureControlPath(() => applyCancellation(state, decision));\n diagnostics?.captureState(performanceState(state));\n for (const taskId of decision.taskIds) {\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: \"cancelled-before-start\",\n taskId\n })\n );\n }\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n case \"await-running\": {\n if (decision.proposal?.kind === \"wait\") {\n diagnostics?.beforeAcceptedWait();\n if (state.admissionPolicy.requiresMeasurement === true) {\n diagnostics?.beginWaitPolicyAction();\n }\n }\n const completion = await nextRunningSettlement(state);\n diagnostics?.beforeRunningSettlement(completion.taskId);\n if (diagnostics === undefined) settleRunningTask(state, completion);\n else diagnostics.measureControlPath(() => settleRunningTask(state, completion));\n const settlementKind = completion.settlement.kind;\n if (\n settlementKind !== \"completed\" &&\n settlementKind !== \"prerequisite-unsatisfied\" &&\n settlementKind !== \"failed\"\n ) {\n throw new Error(\"running Task completed with a non-running settlement kind\");\n }\n const transition = settleRunningAdmissionCore(\n state.admissionCore,\n completion.taskId,\n settlementKind\n );\n if (!transition.accepted) {\n throw new Error(\"shared admission core rejected a Scheduler running settlement\");\n }\n const directEffect = transition.transition.effects[0];\n const directState = transition.transition.effectStates[0];\n if (directEffect === undefined || directState === undefined) {\n throw new Error(\"shared admission core omitted a Scheduler running settlement effect\");\n }\n state.admissionCore = directState;\n diagnostics?.captureState(performanceState(state));\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n })\n );\n observeAdmissionCoreEffect(state, directEffect);\n replayCoreForcedBlocks(\n state,\n transition.transition.effects.slice(1),\n transition.transition.effectStates.slice(1),\n diagnostics,\n Object.freeze({\n kind: \"task-settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n })\n );\n trigger = Object.freeze({\n kind: \"task-settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n });\n continue;\n }\n case \"complete\": {\n if (diagnostics === undefined) return buildTaskGraphRun(state);\n const run = diagnostics.measureControlPath(() => buildTaskGraphRun(state));\n const terminalMeasurement = await observeTerminalMeasurement({\n diagnostics,\n options,\n state\n });\n return Object.freeze({ ...run, terminalMeasurement });\n }\n }\n }\n}\n\nfunction observeAdmissionCoreEffect<TResult>(\n state: SchedulerState<TResult>,\n effect: AdmissionCoreEffect\n): void {\n if (state.onAdmissionCoreEffect === undefined) return;\n state.onAdmissionCoreEffect(Object.freeze({ effect, state: state.admissionCore }));\n}\n\nfunction triggerForInitialReconciliation(): SchedulerTrigger {\n return Object.freeze({ kind: \"execution-started\" });\n}\n\nfunction decisionBoundaryMeasurement(\n diagnostics: SchedulerPerformanceDiagnostics | undefined\n): AdmissionPolicyContext[\"measurement\"] {\n if (diagnostics === undefined) {\n throw new Error(\"custom policy measurement collector is unavailable\");\n }\n return diagnostics.policyMeasurement();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scheduler.mjs","sourceRoot":"","sources":["../../../../src/project-run/task-scheduler/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdmissionPolicyContext } from \"../../project-definition/project-definition.ts\";\nimport { prepareTaskGraph } from \"./graph.ts\";\nimport {\n decideScheduler,\n type SchedulerDecision,\n type SchedulerTrigger\n} from \"./scheduler-decision.ts\";\nimport {\n createSchedulerState,\n snapshotSchedulerState,\n type RunTaskGraphOptions,\n type SchedulerState,\n type TaskGraphRun\n} from \"./execution-state.ts\";\nexport type {\n RunTaskGraphOptions,\n SettledTask,\n TaskExecutionContext,\n TaskGraphRun,\n TaskSettlement\n} from \"./execution-state.ts\";\nimport { AdmissionPolicyFault } from \"./scheduler-admission-decision.ts\";\nimport { replayCoreForcedBlocks } from \"./forced-block-effect-replay.ts\";\nimport { SchedulerPerformanceDiagnostics } from \"./measurement/diagnostics.ts\";\nimport {\n observeAdmissionPolicyFault,\n observeSchedulerDecision,\n observeSchedulerGraph,\n performanceState\n} from \"./scheduler-observation.ts\";\nimport { observeTerminalMeasurement } from \"./scheduler-terminal-measurement.ts\";\nimport {\n applyAdmission,\n applyAdmissionPolicyFault,\n applyBlockedSettlement,\n applyCancellation,\n buildTaskGraphRun,\n nextRunningSettlement,\n settleRunningTask\n} from \"./scheduler-task-lifecycle.ts\";\nimport {\n cancelPendingAdmissionCore,\n reconcileAdmissionCore,\n selectAdmissionCore,\n settleRunningAdmissionCore,\n type AdmissionCoreEffect\n} from \"./admission-core/core.ts\";\n\nexport async function runTaskGraph<TResult>(\n options: RunTaskGraphOptions<TResult>\n): Promise<TaskGraphRun<TResult>> {\n const graph = prepareTaskGraph(options.graph, options.maxParallel);\n const state = createSchedulerState(graph, options);\n observeSchedulerGraph(state);\n const measurementInput =\n options.performanceDiagnostics ??\n (state.admissionPolicy.requiresMeasurement === true\n ? Object.freeze({\n clock: Object.freeze({ now: () => performance.now() }),\n declarativeFingerprint: \"\"\n })\n : undefined);\n const diagnostics =\n measurementInput === undefined\n ? undefined\n : new SchedulerPerformanceDiagnostics(measurementInput, performanceState(state));\n const initialReconciliation = reconcileAdmissionCore(state.admissionCore);\n replayCoreForcedBlocks(\n state,\n initialReconciliation.effects,\n initialReconciliation.effectStates,\n diagnostics,\n triggerForInitialReconciliation()\n );\n let trigger: SchedulerTrigger = Object.freeze({ kind: \"execution-started\" });\n\n while (true) {\n let decision: SchedulerDecision;\n try {\n const snapshot = snapshotSchedulerState(state);\n const measurement =\n state.admissionPolicy.requiresMeasurement === true\n ? () => decisionBoundaryMeasurement(diagnostics)\n : undefined;\n decision =\n diagnostics?.measureControlPath(() =>\n decideScheduler(\n snapshot,\n trigger,\n state.admissionPolicy,\n measurement,\n state.admissionCore\n )\n ) ??\n decideScheduler(snapshot, trigger, state.admissionPolicy, measurement, state.admissionCore);\n } catch (error) {\n if (!(error instanceof AdmissionPolicyFault)) throw error;\n const cancellation = cancelPendingAdmissionCore(state.admissionCore);\n state.admissionCore = cancellation.state;\n diagnostics?.beforePendingSettlement(state.pending.map((task) => task.id));\n if (diagnostics === undefined) applyAdmissionPolicyFault(state, error);\n else\n diagnostics.measureControlPath(() => {\n applyAdmissionPolicyFault(state, error);\n });\n diagnostics?.captureState(performanceState(state));\n observeAdmissionPolicyFault(state, error);\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n }\n observeSchedulerDecision(state, decision, diagnostics);\n\n switch (decision.kind) {\n case \"admit\": {\n if (state.signal?.aborted === true) {\n const cancellation = cancelPendingAdmissionCore(state.admissionCore);\n state.admissionCore = cancellation.state;\n diagnostics?.beforePendingSettlement(state.pending.map((task) => task.id));\n const lifecycleFault = new AdmissionPolicyFault(\"lifecycle-invalid-select\");\n if (diagnostics === undefined) applyAdmissionPolicyFault(state, lifecycleFault);\n else\n diagnostics.measureControlPath(() => {\n applyAdmissionPolicyFault(state, lifecycleFault);\n });\n diagnostics?.captureState(performanceState(state));\n observeAdmissionPolicyFault(state, lifecycleFault);\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n }\n const selection = selectAdmissionCore(state.admissionCore, decision.taskId);\n if (!selection.accepted) {\n throw new Error(\"shared admission core rejected a Scheduler hard-guarded selection\");\n }\n const admissionEffect = selection.transition.effects[0];\n if (admissionEffect === undefined) {\n throw new Error(\"shared admission core omitted a Scheduler admission effect\");\n }\n state.admissionCore = selection.transition.state;\n diagnostics?.beforeAdmission(decision.taskId, [...state.runningById.keys()]);\n if (diagnostics === undefined) applyAdmission(state, decision);\n else\n diagnostics.measureControlPath(() => {\n applyAdmission(state, decision);\n });\n diagnostics?.captureState(performanceState(state));\n if (state.admissionPolicy.requiresMeasurement === true) {\n diagnostics?.beginSelectedPolicyAction(decision.taskId);\n diagnostics?.recordEffect(Object.freeze({ kind: \"admitted\", taskId: decision.taskId }));\n }\n observeAdmissionCoreEffect(state, admissionEffect);\n trigger = Object.freeze({ kind: \"admission-continued\" });\n continue;\n }\n case \"settle-blocked\":\n diagnostics?.beforePendingSettlement([decision.taskId]);\n if (diagnostics === undefined) applyBlockedSettlement(state, decision);\n else\n diagnostics.measureControlPath(() => {\n applyBlockedSettlement(state, decision);\n });\n diagnostics?.captureState(performanceState(state));\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: \"blocked\",\n taskId: decision.taskId\n })\n );\n trigger = Object.freeze({\n kind: \"blocked-settled\",\n taskId: decision.taskId\n });\n continue;\n case \"cancel-pending\":\n state.admissionCore = cancelPendingAdmissionCore(state.admissionCore).state;\n diagnostics?.beforePendingSettlement(decision.taskIds);\n if (diagnostics === undefined) applyCancellation(state, decision);\n else\n diagnostics.measureControlPath(() => {\n applyCancellation(state, decision);\n });\n diagnostics?.captureState(performanceState(state));\n for (const taskId of decision.taskIds) {\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: \"cancelled-before-start\",\n taskId\n })\n );\n }\n trigger = Object.freeze({ kind: \"cancellation-applied\" });\n continue;\n case \"await-running\": {\n if (decision.proposal?.kind === \"wait\") {\n diagnostics?.beforeAcceptedWait();\n if (state.admissionPolicy.requiresMeasurement === true) {\n diagnostics?.beginWaitPolicyAction();\n }\n }\n const completion = await nextRunningSettlement(state);\n diagnostics?.beforeRunningSettlement(completion.taskId);\n if (diagnostics === undefined) settleRunningTask(state, completion);\n else\n diagnostics.measureControlPath(() => {\n settleRunningTask(state, completion);\n });\n const settlementKind = completion.settlement.kind;\n if (\n settlementKind !== \"completed\" &&\n settlementKind !== \"prerequisite-unsatisfied\" &&\n settlementKind !== \"failed\"\n ) {\n throw new Error(\"running Task completed with a non-running settlement kind\");\n }\n const transition = settleRunningAdmissionCore(\n state.admissionCore,\n completion.taskId,\n settlementKind\n );\n if (!transition.accepted) {\n throw new Error(\"shared admission core rejected a Scheduler running settlement\");\n }\n const directEffect = transition.transition.effects[0];\n const directState = transition.transition.effectStates[0];\n if (directEffect === undefined || directState === undefined) {\n throw new Error(\"shared admission core omitted a Scheduler running settlement effect\");\n }\n state.admissionCore = directState;\n diagnostics?.captureState(performanceState(state));\n diagnostics?.recordEffect(\n Object.freeze({\n kind: \"settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n })\n );\n observeAdmissionCoreEffect(state, directEffect);\n replayCoreForcedBlocks(\n state,\n transition.transition.effects.slice(1),\n transition.transition.effectStates.slice(1),\n diagnostics,\n Object.freeze({\n kind: \"task-settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n })\n );\n trigger = Object.freeze({\n kind: \"task-settled\",\n settlementKind: completion.settlement.kind,\n taskId: completion.taskId\n });\n continue;\n }\n case \"complete\": {\n if (diagnostics === undefined) return buildTaskGraphRun(state);\n const run = diagnostics.measureControlPath(() => buildTaskGraphRun(state));\n const terminalMeasurement = await observeTerminalMeasurement({\n diagnostics,\n options,\n state\n });\n return Object.freeze({ ...run, terminalMeasurement });\n }\n }\n }\n}\n\nfunction observeAdmissionCoreEffect<TResult>(\n state: SchedulerState<TResult>,\n effect: AdmissionCoreEffect\n): void {\n if (state.onAdmissionCoreEffect === undefined) return;\n state.onAdmissionCoreEffect(Object.freeze({ effect, state: state.admissionCore }));\n}\n\nfunction triggerForInitialReconciliation(): SchedulerTrigger {\n return Object.freeze({ kind: \"execution-started\" });\n}\n\nfunction decisionBoundaryMeasurement(\n diagnostics: SchedulerPerformanceDiagnostics | undefined\n): AdmissionPolicyContext[\"measurement\"] {\n if (diagnostics === undefined) {\n throw new Error(\"custom policy measurement collector is unavailable\");\n }\n return diagnostics.policyMeasurement();\n}\n"]}
|