@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prediction.mjs","sourceRoot":"","sources":["../../../../../src/package-tools/learned-critical-path/duration-model/prediction.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport {\n canonicalJsonBytes,\n type CanonicalJsonValue\n} from \"../../../data-boundary/canonical-data.ts\";\nimport {\n SCHEDULER_HISTORY_MODEL_VERSION,\n schedulerHistorySeries,\n type SchedulerHistoryModel\n} from \"./bounded-history.ts\";\n\nexport type SchedulerPredictionSource = \"learned\" | \"project-prior\" | \"cold-start\";\n\nexport interface SchedulerPredictionInput {\n readonly authoredOptions: CanonicalJsonValue;\n readonly checkId: string;\n readonly flags: CanonicalJsonValue;\n readonly taskId: string;\n}\n\nexport interface SchedulerTaskPrediction {\n readonly estimatedDurationMs: number;\n readonly identityDigest: string;\n readonly meanDurationMs: number | null;\n readonly p90DurationMs: number | null;\n readonly sampleCount: number;\n readonly source: SchedulerPredictionSource;\n readonly taskId: string;\n}\n\n/** Frozen before Scheduler admission; it does not retain authored options or flag values. */\nexport interface SchedulerPredictionSnapshot {\n readonly digest: string;\n readonly modelVersion: string;\n readonly predictions: readonly SchedulerTaskPrediction[];\n}\n\nexport function createSchedulerHistoryIdentity(input: {\n readonly authoredOptions: CanonicalJsonValue;\n readonly checkId: string;\n readonly flags: CanonicalJsonValue;\n}): string {\n const authoredOptionsDigest = digestCanonicalValue(input.authoredOptions);\n const flagsDigest = digestCanonicalValue(input.flags);\n return digestCanonicalValue({\n authoredOptionsDigest,\n checkId: input.checkId,\n flagsDigest,\n modelVersion: SCHEDULER_HISTORY_MODEL_VERSION\n });\n}\n\n/** Forms learned means first, then one project median prior, without invoking preparation. */\nexport function createSchedulerPredictionSnapshot(\n history: SchedulerHistoryModel,\n inputs: readonly SchedulerPredictionInput[],\n coldStartDurationMs = 1\n): SchedulerPredictionSnapshot {\n const learned = inputs.map((input) => learnedPrediction(history, input));\n const projectPrior = median(\n learned.flatMap((prediction) =>\n prediction.source === \"learned\" ? [prediction.estimatedDurationMs] : []\n )\n );\n const predictions = learned.map((prediction) => {\n if (prediction.source === \"learned\") return prediction;\n if (projectPrior === undefined) return coldStartPrediction(prediction, coldStartDurationMs);\n return projectPriorPrediction(prediction, projectPrior);\n });\n const digest = digestCanonicalValue({\n modelVersion: SCHEDULER_HISTORY_MODEL_VERSION,\n predictions: [...predictions]\n .sort((left, right) => compareText(left.taskId, right.taskId))\n .map((prediction) => ({\n estimatedDurationMs: prediction.estimatedDurationMs,\n identityDigest: prediction.identityDigest,\n meanDurationMs: prediction.meanDurationMs,\n p90DurationMs: prediction.p90DurationMs,\n sampleCount: prediction.sampleCount,\n source: prediction.source,\n taskId: prediction.taskId\n }))\n });\n return Object.freeze({\n digest,\n modelVersion: SCHEDULER_HISTORY_MODEL_VERSION,\n predictions: Object.freeze(predictions.map(freezePrediction))\n });\n}\n\nexport function predictionForTask(\n snapshot: SchedulerPredictionSnapshot,\n taskId: string\n): SchedulerTaskPrediction | undefined {\n return snapshot.predictions.find((prediction) => prediction.taskId === taskId);\n}\n\nfunction learnedPrediction(\n history: SchedulerHistoryModel,\n input: SchedulerPredictionInput\n): SchedulerTaskPrediction {\n const identityDigest = createSchedulerHistoryIdentity(input);\n const samples = schedulerHistorySeries(history, identityDigest)?.samples ?? [];\n if (samples.length === 0) {\n return Object.freeze({\n estimatedDurationMs: 0,\n identityDigest,\n meanDurationMs: null,\n p90DurationMs: null,\n sampleCount: 0,\n source: \"cold-start\",\n taskId: input.taskId\n });\n }\n const meanDurationMs = arithmeticMean(samples.map((sample) => sample.durationMs));\n return Object.freeze({\n estimatedDurationMs: meanDurationMs,\n identityDigest,\n meanDurationMs,\n p90DurationMs: p90(samples.map((sample) => sample.durationMs)),\n sampleCount: samples.length,\n source: \"learned\",\n taskId: input.taskId\n });\n}\n\nfunction projectPriorPrediction(\n prediction: SchedulerTaskPrediction,\n projectPrior: number\n): SchedulerTaskPrediction {\n return Object.freeze({\n ...prediction,\n estimatedDurationMs: projectPrior,\n source: \"project-prior\"\n });\n}\n\nfunction coldStartPrediction(\n prediction: SchedulerTaskPrediction,\n coldStartDurationMs: number\n): SchedulerTaskPrediction {\n return Object.freeze({\n ...prediction,\n estimatedDurationMs: coldStartDurationMs,\n source: \"cold-start\"\n });\n}\n\nfunction freezePrediction(prediction: SchedulerTaskPrediction): SchedulerTaskPrediction {\n return Object.freeze({ ...prediction });\n}\n\nfunction digestCanonicalValue(value: CanonicalJsonValue): string {\n return `sha256:${createHash(\"sha256\").update(canonicalJsonBytes(value)).digest(\"hex\")}`;\n}\n\nfunction arithmeticMean(values: readonly number[]): number {\n return values.reduce((total, value) => total + value, 0) / values.length;\n}\n\n/** The p90 is the nearest-rank element from an ascending finite duration window. */\nfunction p90(values: readonly number[]): number {\n const ordered = [...values].sort((left, right) => left - right);\n const index = Math.ceil(ordered.length * 0.9) - 1;\n return ordered[index] ?? 0;\n}\n\nfunction median(values: readonly number[]): number | undefined {\n if (values.length === 0) return undefined;\n const ordered = [...values].sort((left, right) => left - right);\n const middle = Math.floor(ordered.length / 2);\n const upper = ordered[middle];\n if (upper === undefined) return undefined;\n if (ordered.length % 2 === 1) return upper;\n const lower = ordered[middle - 1];\n return lower === undefined ? undefined : (lower + upper) / 2;\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"]}
|
|
@@ -18,8 +18,10 @@ export async function prepareSchedulerDurationModel(input) {
|
|
|
18
18
|
prediction,
|
|
19
19
|
rawMeasurement: terminalMeasurement.rawMeasurement,
|
|
20
20
|
settledTasks: terminalMeasurement.execution.settledTasks,
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
...(input.maxSamplesPerSeries === undefined
|
|
22
|
+
? {}
|
|
23
|
+
: { maxSamplesPerSeries: input.maxSamplesPerSeries }),
|
|
24
|
+
...(input.maxSeries === undefined ? {} : { maxSeries: input.maxSeries })
|
|
23
25
|
});
|
|
24
26
|
const writeObservation = await writeSchedulerHistory(input.stateDirectory, recorded.history);
|
|
25
27
|
return Object.freeze({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preparation.mjs","sourceRoot":"","sources":["../../../../../src/package-tools/learned-critical-path/duration-model/preparation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAA6C,MAAM,gBAAgB,CAAC;AACnG,OAAO,EACL,iCAAiC,EAGlC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAsB3E,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,KAMnD;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,iCAAiC,CAClD,MAAM,CAAC,OAAO,EACd,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,mBAAmB,CAC1B,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,OAAO;YACb,UAAU;YACV,eAAe,EAAE,MAAM,CAAC,WAAW;YACnC,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;YACjD,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE;gBACpC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,sBAAsB,CAAC;wBACtC,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,UAAU;wBACV,cAAc,EAAE,mBAAmB,CAAC,cAAc;wBAClD,YAAY,EAAE,mBAAmB,CAAC,SAAS,CAAC,YAAY;wBACxD,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,SAAS;4BACzC,CAAC,CAAC,EAAE;4BACJ,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAAE,CAAC;wBACvD,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;qBACzE,CAAC,CAAC;oBACH,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAClD,KAAK,CAAC,cAAc,EACpB,QAAQ,CAAC,OAAO,CACjB,CAAC;oBACF,OAAO,MAAM,CAAC,MAAM,CAAC;wBACnB,IAAI,EAAE,UAAU;wBAChB,SAAS,EAAE,QAAQ,CAAC,WAAW;wBAC/B,gBAAgB;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC","sourcesContent":["import type { SchedulerMeasurementContext } from \"../../../project-definition/project-definition.ts\";\nimport { recordSchedulerHistory, type SchedulerHistoryRecordingObservation } from \"./recording.ts\";\nimport {\n createSchedulerPredictionSnapshot,\n type SchedulerPredictionInput,\n type SchedulerPredictionSnapshot\n} from \"./prediction.ts\";\nimport { loadSchedulerHistory, writeSchedulerHistory } from \"./storage.ts\";\n\nexport type SchedulerDurationModelPreparation =\n | Readonly<{\n readonly kind: \"ready\";\n readonly prediction: SchedulerPredictionSnapshot;\n readonly readObservation: Awaited<ReturnType<typeof loadSchedulerHistory>>[\"observation\"];\n readonly retainedSeriesCount: number;\n readonly record: (\n terminalMeasurement: SchedulerMeasurementContext\n ) => Promise<SchedulerDurationModelRecordObservation>;\n }>\n | Readonly<{ readonly kind: \"static-fallback\" }>;\n\nexport type SchedulerDurationModelRecordObservation =\n | Readonly<{\n readonly kind: \"recorded\";\n readonly recording: SchedulerHistoryRecordingObservation;\n readonly writeObservation: Awaited<ReturnType<typeof writeSchedulerHistory>>;\n }>\n | Readonly<{ readonly kind: \"failed\" }>;\n\n/** Prepares one immutable duration prediction and its terminal record capability outside Scheduler. */\nexport async function prepareSchedulerDurationModel(input: {\n readonly predictionInputs: readonly SchedulerPredictionInput[];\n readonly stateDirectory: string;\n readonly coldStartDurationMs?: number;\n readonly maxSamplesPerSeries?: number;\n readonly maxSeries?: number;\n}): Promise<SchedulerDurationModelPreparation> {\n try {\n const loaded = await loadSchedulerHistory(input.stateDirectory);\n const prediction = createSchedulerPredictionSnapshot(\n loaded.history,\n input.predictionInputs,\n input.coldStartDurationMs\n );\n return Object.freeze({\n kind: \"ready\",\n prediction,\n readObservation: loaded.observation,\n retainedSeriesCount: loaded.history.series.length,\n record: async (terminalMeasurement) => {\n try {\n const recorded = recordSchedulerHistory({\n history: loaded.history,\n prediction,\n rawMeasurement: terminalMeasurement.rawMeasurement,\n settledTasks: terminalMeasurement.execution.settledTasks,\n ...(input.maxSamplesPerSeries === undefined\n ? {}\n : { maxSamplesPerSeries: input.maxSamplesPerSeries }),\n ...(input.maxSeries === undefined ? {} : { maxSeries: input.maxSeries })\n });\n const writeObservation = await writeSchedulerHistory(\n input.stateDirectory,\n recorded.history\n );\n return Object.freeze({\n kind: \"recorded\",\n recording: recorded.observation,\n writeObservation\n });\n } catch {\n return Object.freeze({ kind: \"failed\" });\n }\n }\n });\n } catch {\n return Object.freeze({ kind: \"static-fallback\" });\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.mjs","sourceRoot":"","sources":["../../../../../src/package-tools/learned-critical-path/duration-model/recording.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SchedulerRawMeasurement } from \"../../../project-definition/project-definition.ts\";\nimport {\n freezeSchedulerHistoryModel,\n isBoundedDurationMs,\n MAX_SCHEDULER_HISTORY_SAMPLES_PER_SERIES,\n MAX_SCHEDULER_HISTORY_SERIES,\n type SchedulerDurationSettlementKind,\n type SchedulerHistoryModel,\n type SchedulerHistorySeries\n} from \"./bounded-history.ts\";\nimport { predictionForTask, type SchedulerPredictionSnapshot } from \"./prediction.ts\";\n\ntype SchedulerMeasurementAdmission = NonNullable<\n SchedulerRawMeasurement[\"timingFacts\"]\n>[\"admissions\"][number];\n\nexport type SchedulerHistoryRecordingObservation =\n | Readonly<{\n readonly acceptedSampleCount: number;\n readonly retainedSeriesCount: number;\n readonly status: \"recorded\";\n }>\n | Readonly<{\n readonly acceptedSampleCount: 0;\n readonly retainedSeriesCount: number;\n readonly status: \"timing-unavailable\";\n }>;\n\nexport interface SchedulerHistoryRecording {\n readonly history: SchedulerHistoryModel;\n readonly observation: SchedulerHistoryRecordingObservation;\n}\n\n/** Merges only trusted terminal Scheduler occupancy intervals; unavailable timing creates no samples. */\nexport function recordSchedulerHistory(input: {\n readonly history: SchedulerHistoryModel;\n readonly prediction: SchedulerPredictionSnapshot;\n readonly rawMeasurement: SchedulerRawMeasurement;\n readonly settledTasks: readonly Readonly<{\n readonly kind: SchedulerDurationSettlementKind;\n readonly taskId: string;\n }>[];\n readonly maxSamplesPerSeries?: number;\n readonly maxSeries?: number;\n}): SchedulerHistoryRecording {\n const rawMeasurement = input.rawMeasurement;\n const timingFacts = rawMeasurement.timingFacts;\n if (rawMeasurement.timing.availability !== \"available\" || timingFacts === undefined) {\n return Object.freeze({\n history: input.history,\n observation: Object.freeze({\n acceptedSampleCount: 0,\n retainedSeriesCount: input.history.series.length,\n status: \"timing-unavailable\"\n })\n });\n }\n\n return recordedHistory(input, timingFacts.admissions);\n}\n\nfunction recordedHistory(\n input: Parameters<typeof recordSchedulerHistory>[0],\n admissions: readonly SchedulerMeasurementAdmission[]\n): SchedulerHistoryRecording {\n const merged = mergeVerifiedAdmissionSamples({\n admissions,\n history: input.history,\n prediction: input.prediction,\n settledByTaskId: new Map(input.settledTasks.map((settled) => [settled.taskId, settled.kind])),\n maxSamplesPerSeries: input.maxSamplesPerSeries ?? MAX_SCHEDULER_HISTORY_SAMPLES_PER_SERIES\n });\n const retained = retainRecentSeries(\n merged.seriesByIdentity.values(),\n input.maxSeries ?? MAX_SCHEDULER_HISTORY_SERIES\n );\n const history = freezeSchedulerHistoryModel({\n latestObservationSequence: merged.latestObservationSequence,\n series: retained\n });\n return Object.freeze({\n history,\n observation: Object.freeze({\n acceptedSampleCount: merged.acceptedSampleCount,\n retainedSeriesCount: history.series.length,\n status: \"recorded\"\n })\n });\n}\n\ntype VerifiedAdmissionMerge = Readonly<{\n readonly acceptedSampleCount: number;\n readonly latestObservationSequence: number;\n readonly seriesByIdentity: ReadonlyMap<string, SchedulerHistorySeries>;\n}>;\n\n/** Applies valid admissions in Scheduler order and returns the updated identity histories. */\nfunction mergeVerifiedAdmissionSamples(input: {\n readonly admissions: readonly SchedulerMeasurementAdmission[];\n readonly history: SchedulerHistoryModel;\n readonly prediction: SchedulerPredictionSnapshot;\n readonly settledByTaskId: ReadonlyMap<string, SchedulerDurationSettlementKind>;\n readonly maxSamplesPerSeries: number;\n}): VerifiedAdmissionMerge {\n const seriesByIdentity = new Map(\n input.history.series.map((series) => [series.identityDigest, series] as const)\n );\n let latestObservationSequence = input.history.latestObservationSequence;\n let acceptedSampleCount = 0;\n for (const admission of input.admissions) {\n const sample = sampleForAdmission(admission, input.prediction, input.settledByTaskId);\n if (sample === undefined || latestObservationSequence === Number.MAX_SAFE_INTEGER) continue;\n latestObservationSequence += 1;\n appendSampleToIdentityHistory(\n seriesByIdentity,\n sample,\n latestObservationSequence,\n input.maxSamplesPerSeries\n );\n acceptedSampleCount += 1;\n }\n return Object.freeze({ acceptedSampleCount, latestObservationSequence, seriesByIdentity });\n}\n\nfunction appendSampleToIdentityHistory(\n seriesByIdentity: Map<string, SchedulerHistorySeries>,\n sample: AdmissionSample,\n observationSequence: number,\n maxSamplesPerSeries: number\n): void {\n const existing = seriesByIdentity.get(sample.identityDigest);\n const samples = [\n ...(existing?.samples ?? []),\n {\n durationMs: sample.durationMs,\n observationSequence,\n settlementKind: sample.settlementKind\n }\n ].slice(-maxSamplesPerSeries);\n seriesByIdentity.set(\n sample.identityDigest,\n Object.freeze({\n identityDigest: sample.identityDigest,\n latestObservationSequence: observationSequence,\n samples: Object.freeze(samples)\n })\n );\n}\n\ntype AdmissionSample = Readonly<{\n readonly durationMs: number;\n readonly identityDigest: string;\n readonly settlementKind: SchedulerDurationSettlementKind;\n}>;\n\nfunction sampleForAdmission(\n admission: Readonly<{\n readonly admittedAtMonotonicMs: number | null;\n readonly settledAtMonotonicMs: number | null;\n readonly taskId: string;\n }>,\n prediction: SchedulerPredictionSnapshot,\n settledByTaskId: ReadonlyMap<string, SchedulerDurationSettlementKind>\n): AdmissionSample | undefined {\n if (\n admission.admittedAtMonotonicMs === null ||\n admission.settledAtMonotonicMs === null ||\n !isFiniteMonotonicTimestamp(admission.admittedAtMonotonicMs) ||\n !isFiniteMonotonicTimestamp(admission.settledAtMonotonicMs) ||\n admission.settledAtMonotonicMs < admission.admittedAtMonotonicMs\n ) {\n return undefined;\n }\n const durationMs = admission.settledAtMonotonicMs - admission.admittedAtMonotonicMs;\n if (!isBoundedDurationMs(durationMs)) return undefined;\n const taskPrediction = predictionForTask(prediction, admission.taskId);\n const settlementKind = settledByTaskId.get(admission.taskId);\n if (taskPrediction === undefined || settlementKind === undefined) return undefined;\n return Object.freeze({\n durationMs,\n identityDigest: taskPrediction.identityDigest,\n settlementKind\n });\n}\n\nfunction retainRecentSeries(\n series: Iterable<SchedulerHistorySeries>,\n maxSeries: number\n): readonly SchedulerHistorySeries[] {\n return Object.freeze(\n [...series]\n .sort(\n (left, right) =>\n right.latestObservationSequence - left.latestObservationSequence ||\n compareText(left.identityDigest, right.identityDigest)\n )\n .slice(0, maxSeries)\n );\n}\n\nfunction isFiniteMonotonicTimestamp(value: number): boolean {\n return Number.isFinite(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER;\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,8 +1,8 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
|
-
import { canonicalJsonText } from "
|
|
5
|
-
import {
|
|
4
|
+
import { canonicalJsonText } from "../../../data-boundary/canonical-data.mjs";
|
|
5
|
+
import { snapshotClosedArray, snapshotExactClosedRecord } from "../../../data-boundary/closed-values.mjs";
|
|
6
6
|
import { emptySchedulerHistory, freezeSchedulerHistoryModel, isBoundedDurationMs, isObservationSequence, isSchedulerHistoryIdentityDigest, isSchedulerSettlementKind, MAX_SCHEDULER_HISTORY_SAMPLES_PER_SERIES, MAX_SCHEDULER_HISTORY_SERIES, SCHEDULER_HISTORY_ENVELOPE_VERSION, SCHEDULER_HISTORY_FILE_NAME, SCHEDULER_HISTORY_MODEL_VERSION } from "./bounded-history.mjs";
|
|
7
7
|
const ENVELOPE_KEYS = [
|
|
8
8
|
"envelopeVersion",
|
|
@@ -81,8 +81,8 @@ function schedulerHistoryText(history) {
|
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
83
|
function parseSchedulerHistoryEnvelope(value) {
|
|
84
|
-
const envelope =
|
|
85
|
-
if (envelope === undefined
|
|
84
|
+
const envelope = snapshotExactClosedRecord(value, ENVELOPE_KEYS);
|
|
85
|
+
if (envelope === undefined) {
|
|
86
86
|
return Object.freeze({ kind: "invalid" });
|
|
87
87
|
}
|
|
88
88
|
if (typeof envelope.envelopeVersion !== "string" ||
|
|
@@ -125,8 +125,8 @@ function parseSeries(value) {
|
|
|
125
125
|
return Object.freeze(parsed);
|
|
126
126
|
}
|
|
127
127
|
function parseSeriesEntry(value) {
|
|
128
|
-
const record =
|
|
129
|
-
if (record === undefined
|
|
128
|
+
const record = snapshotExactClosedRecord(value, SERIES_KEYS);
|
|
129
|
+
if (record === undefined)
|
|
130
130
|
return undefined;
|
|
131
131
|
if (!isSchedulerHistoryIdentityDigest(record.identityDigest) ||
|
|
132
132
|
!isObservationSequence(record.latestObservationSequence)) {
|
|
@@ -162,8 +162,8 @@ function parseSamples(value) {
|
|
|
162
162
|
return Object.freeze(samples);
|
|
163
163
|
}
|
|
164
164
|
function parseSample(value) {
|
|
165
|
-
const record =
|
|
166
|
-
if (record === undefined
|
|
165
|
+
const record = snapshotExactClosedRecord(value, SAMPLE_KEYS);
|
|
166
|
+
if (record === undefined)
|
|
167
167
|
return undefined;
|
|
168
168
|
if (!isBoundedDurationMs(record.durationMs) ||
|
|
169
169
|
!isPositiveObservationSequence(record.observationSequence) ||
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.mjs","sourceRoot":"","sources":["../../../../../src/package-tools/learned-critical-path/duration-model/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport { canonicalJsonText } from \"../../../data-boundary/canonical-data.ts\";\nimport {\n snapshotClosedArray,\n snapshotExactClosedRecord\n} from \"../../../data-boundary/closed-values.ts\";\nimport {\n emptySchedulerHistory,\n freezeSchedulerHistoryModel,\n isBoundedDurationMs,\n isObservationSequence,\n isSchedulerHistoryIdentityDigest,\n isSchedulerSettlementKind,\n MAX_SCHEDULER_HISTORY_SAMPLES_PER_SERIES,\n MAX_SCHEDULER_HISTORY_SERIES,\n SCHEDULER_HISTORY_ENVELOPE_VERSION,\n SCHEDULER_HISTORY_FILE_NAME,\n SCHEDULER_HISTORY_MODEL_VERSION,\n type SchedulerHistoryModel,\n type SchedulerHistorySample,\n type SchedulerHistorySeries\n} from \"./bounded-history.ts\";\n\nconst ENVELOPE_KEYS = [\n \"envelopeVersion\",\n \"latestObservationSequence\",\n \"modelVersion\",\n \"series\"\n] as const;\nconst SERIES_KEYS = [\"identityDigest\", \"latestObservationSequence\", \"samples\"] as const;\nconst SAMPLE_KEYS = [\"durationMs\", \"observationSequence\", \"settlementKind\"] as const;\n\nexport type SchedulerHistoryReadObservation =\n | \"loaded\"\n | \"missing\"\n | \"invalid\"\n | \"incompatible\"\n | \"failed\";\n\nexport type SchedulerHistoryWriteObservation = \"stored\" | \"failed\";\n\nexport interface SchedulerHistoryLoad {\n readonly history: SchedulerHistoryModel;\n readonly observation: SchedulerHistoryReadObservation;\n}\n\n/** Reads untrusted local state and always degrades to an empty model on an I/O or format fault. */\nexport async function loadSchedulerHistory(stateDirectory: string): Promise<SchedulerHistoryLoad> {\n let source: string;\n try {\n source = await fs.readFile(schedulerHistoryPath(stateDirectory), \"utf8\");\n } catch (error: unknown) {\n return Object.freeze({\n history: emptySchedulerHistory(),\n observation: isMissingPath(error) ? \"missing\" : \"failed\"\n });\n }\n\n try {\n const parsed = parseSchedulerHistoryEnvelope(JSON.parse(source));\n if (parsed.kind === \"incompatible\") {\n return Object.freeze({ history: emptySchedulerHistory(), observation: \"incompatible\" });\n }\n if (parsed.kind === \"invalid\") {\n return Object.freeze({ history: emptySchedulerHistory(), observation: \"invalid\" });\n }\n return Object.freeze({ history: parsed.history, observation: \"loaded\" });\n } catch {\n return Object.freeze({ history: emptySchedulerHistory(), observation: \"invalid\" });\n }\n}\n\n/** Publishes a full closed model through a same-directory temporary file and atomic replacement. */\nexport async function writeSchedulerHistory(\n stateDirectory: string,\n history: SchedulerHistoryModel\n): Promise<SchedulerHistoryWriteObservation> {\n let temporaryPath: string | undefined;\n try {\n const targetPath = schedulerHistoryPath(stateDirectory);\n temporaryPath = join(stateDirectory, `.vibe-check-scheduler-history-${randomUUID()}.tmp`);\n await fs.mkdir(stateDirectory, { recursive: true });\n await fs.writeFile(temporaryPath, schedulerHistoryText(history), {\n encoding: \"utf8\",\n flag: \"wx\"\n });\n await fs.rename(temporaryPath, targetPath);\n return \"stored\";\n } catch {\n return \"failed\";\n } finally {\n if (temporaryPath !== undefined) {\n await fs.rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n }\n}\n\nexport function schedulerHistoryPath(stateDirectory: string): string {\n return join(stateDirectory, SCHEDULER_HISTORY_FILE_NAME);\n}\n\nfunction schedulerHistoryText(history: SchedulerHistoryModel): string {\n return canonicalJsonText({\n envelopeVersion: SCHEDULER_HISTORY_ENVELOPE_VERSION,\n latestObservationSequence: history.latestObservationSequence,\n modelVersion: SCHEDULER_HISTORY_MODEL_VERSION,\n series: history.series.map((series) => ({\n identityDigest: series.identityDigest,\n latestObservationSequence: series.latestObservationSequence,\n samples: series.samples.map((sample) => ({\n durationMs: sample.durationMs,\n observationSequence: sample.observationSequence,\n settlementKind: sample.settlementKind\n }))\n }))\n });\n}\n\ntype ParsedEnvelope =\n | Readonly<{ readonly kind: \"loaded\"; readonly history: SchedulerHistoryModel }>\n | Readonly<{ readonly kind: \"invalid\" }>\n | Readonly<{ readonly kind: \"incompatible\" }>;\n\nfunction parseSchedulerHistoryEnvelope(value: unknown): ParsedEnvelope {\n const envelope = snapshotExactClosedRecord(value, ENVELOPE_KEYS);\n if (envelope === undefined) {\n return Object.freeze({ kind: \"invalid\" });\n }\n if (\n typeof envelope.envelopeVersion !== \"string\" ||\n typeof envelope.modelVersion !== \"string\" ||\n !isObservationSequence(envelope.latestObservationSequence)\n ) {\n return Object.freeze({ kind: \"invalid\" });\n }\n if (\n envelope.envelopeVersion !== SCHEDULER_HISTORY_ENVELOPE_VERSION ||\n envelope.modelVersion !== SCHEDULER_HISTORY_MODEL_VERSION\n ) {\n return Object.freeze({ kind: \"incompatible\" });\n }\n\n const series = parseSeries(envelope.series);\n if (series === undefined) return Object.freeze({ kind: \"invalid\" });\n const greatestSequence = series.reduce(\n (greatest, entry) => Math.max(greatest, entry.latestObservationSequence),\n 0\n );\n if (envelope.latestObservationSequence !== greatestSequence) {\n return Object.freeze({ kind: \"invalid\" });\n }\n\n return Object.freeze({\n kind: \"loaded\",\n history: freezeSchedulerHistoryModel({\n latestObservationSequence: envelope.latestObservationSequence,\n series\n })\n });\n}\n\nfunction parseSeries(value: unknown): readonly SchedulerHistorySeries[] | undefined {\n const entries = snapshotClosedArray(value);\n if (entries === undefined || entries.length > MAX_SCHEDULER_HISTORY_SERIES) return undefined;\n\n const identities = new Set<string>();\n const parsed: SchedulerHistorySeries[] = [];\n for (const entry of entries) {\n const series = parseSeriesEntry(entry);\n if (series === undefined || identities.has(series.identityDigest)) return undefined;\n identities.add(series.identityDigest);\n parsed.push(series);\n }\n return Object.freeze(parsed);\n}\n\nfunction parseSeriesEntry(value: unknown): SchedulerHistorySeries | undefined {\n const record = snapshotExactClosedRecord(value, SERIES_KEYS);\n if (record === undefined) return undefined;\n if (\n !isSchedulerHistoryIdentityDigest(record.identityDigest) ||\n !isObservationSequence(record.latestObservationSequence)\n ) {\n return undefined;\n }\n const samples = parseSamples(record.samples);\n if (\n samples === undefined ||\n samples.at(-1)?.observationSequence !== record.latestObservationSequence\n ) {\n return undefined;\n }\n return Object.freeze({\n identityDigest: record.identityDigest,\n latestObservationSequence: record.latestObservationSequence,\n samples\n });\n}\n\nfunction parseSamples(value: unknown): readonly SchedulerHistorySample[] | undefined {\n const entries = snapshotClosedArray(value);\n if (\n entries === undefined ||\n entries.length === 0 ||\n entries.length > MAX_SCHEDULER_HISTORY_SAMPLES_PER_SERIES\n ) {\n return undefined;\n }\n\n const samples: SchedulerHistorySample[] = [];\n let priorSequence = -1;\n for (const entry of entries) {\n const sample = parseSample(entry);\n if (sample === undefined || sample.observationSequence <= priorSequence) return undefined;\n priorSequence = sample.observationSequence;\n samples.push(sample);\n }\n return Object.freeze(samples);\n}\n\nfunction parseSample(value: unknown): SchedulerHistorySample | undefined {\n const record = snapshotExactClosedRecord(value, SAMPLE_KEYS);\n if (record === undefined) return undefined;\n if (\n !isBoundedDurationMs(record.durationMs) ||\n !isPositiveObservationSequence(record.observationSequence) ||\n !isSchedulerSettlementKind(record.settlementKind)\n ) {\n return undefined;\n }\n return Object.freeze({\n durationMs: record.durationMs,\n observationSequence: record.observationSequence,\n settlementKind: record.settlementKind\n });\n}\n\nfunction isMissingPath(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n (error as { readonly code?: unknown }).code === \"ENOENT\"\n );\n}\n\nfunction isPositiveObservationSequence(value: unknown): value is number {\n return isObservationSequence(value) && value > 0;\n}\n"]}
|
package/dist/esm/{learned-critical-path → package-tools/learned-critical-path}/selection-layers.mjs
RENAMED
|
@@ -12,8 +12,7 @@ export function learnedSelectionLayers(context) {
|
|
|
12
12
|
}
|
|
13
13
|
function isTightening(candidate, taskById, scopeById, activeScopeIds, maxParallel) {
|
|
14
14
|
const scope = scopeForCandidate(candidate, taskById, scopeById);
|
|
15
|
-
return (scope
|
|
16
|
-
scope.activationTaskIds.includes(candidate.taskId) &&
|
|
15
|
+
return (scope?.activationTaskIds.includes(candidate.taskId) === true &&
|
|
17
16
|
!activeScopeIds.has(scope.id) &&
|
|
18
17
|
scope.maxParallel < maxParallel);
|
|
19
18
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-layers.mjs","sourceRoot":"","sources":["../../../../src/package-tools/learned-critical-path/selection-layers.ts"],"names":[],"mappings":"AAgBA,0GAA0G;AAC1G,MAAM,UAAU,sBAAsB,CAAC,OAA+B;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAU,CAAC,CAAC,CAAC;IAC3F,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC,MAAM,CACzB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CACtC,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC7F,CACF;QACD,SAAS;QACT,QAAQ;QACR,UAAU,EAAE,MAAM,CAAC,MAAM,CACvB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CACtC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC3F,CACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CACnB,SAAoB,EACpB,QAAmC,EACnC,SAAqC,EACrC,cAAmC,EACnC,WAAmB;IAEnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChE,OAAO,CACL,KAAK,EAAE,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI;QAC5D,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,WAAW,GAAG,WAAW,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,SAAoB,EACpB,QAAmC,EACnC,SAAqC,EACrC,cAAmC,EACnC,WAAmB;IAEnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChE,OAAO,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAAoB,EACpB,QAAmC,EACnC,SAAqC;IAErC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,IAAI,EAAE,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChG,CAAC","sourcesContent":["import type {\n AdmissionPolicyContext,\n SchedulerGraphSnapshot\n} from \"../../project-definition/project-definition.ts\";\n\ntype Candidate = AdmissionPolicyContext[\"candidates\"][number];\ntype Task = SchedulerGraphSnapshot[\"tasks\"][number];\ntype Scope = SchedulerGraphSnapshot[\"scopes\"][number];\n\nexport interface LearnedSelectionLayers {\n readonly continuation: readonly Candidate[];\n readonly scopeById: ReadonlyMap<string, Scope>;\n readonly taskById: ReadonlyMap<string, Task>;\n readonly tightening: readonly Candidate[];\n}\n\n/** Projects the public graph and boundary facts into the Scheduler's two constrained selection layers. */\nexport function learnedSelectionLayers(context: AdmissionPolicyContext): LearnedSelectionLayers {\n const taskById = new Map(context.graph.tasks.map((task) => [task.taskId, task] as const));\n const scopeById = new Map(context.graph.scopes.map((scope) => [scope.id, scope] as const));\n const activeScopeIds = new Set(context.activeScopeIds);\n return Object.freeze({\n continuation: Object.freeze(\n context.candidates.filter((candidate) =>\n isContinuation(candidate, taskById, scopeById, activeScopeIds, context.capacity.maxParallel)\n )\n ),\n scopeById,\n taskById,\n tightening: Object.freeze(\n context.candidates.filter((candidate) =>\n isTightening(candidate, taskById, scopeById, activeScopeIds, context.capacity.maxParallel)\n )\n )\n });\n}\n\nfunction isTightening(\n candidate: Candidate,\n taskById: ReadonlyMap<string, Task>,\n scopeById: ReadonlyMap<string, Scope>,\n activeScopeIds: ReadonlySet<string>,\n maxParallel: number\n): boolean {\n const scope = scopeForCandidate(candidate, taskById, scopeById);\n return (\n scope?.activationTaskIds.includes(candidate.taskId) === true &&\n !activeScopeIds.has(scope.id) &&\n scope.maxParallel < maxParallel\n );\n}\n\nfunction isContinuation(\n candidate: Candidate,\n taskById: ReadonlyMap<string, Task>,\n scopeById: ReadonlyMap<string, Scope>,\n activeScopeIds: ReadonlySet<string>,\n maxParallel: number\n): boolean {\n const scope = scopeForCandidate(candidate, taskById, scopeById);\n return scope !== undefined && activeScopeIds.has(scope.id) && scope.maxParallel < maxParallel;\n}\n\nexport function scopeForCandidate(\n candidate: Candidate,\n taskById: ReadonlyMap<string, Task>,\n scopeById: ReadonlyMap<string, Scope>\n): Scope | undefined {\n const task = taskById.get(candidate.taskId);\n return task?.scopeId === null || task === undefined ? undefined : scopeById.get(task.scopeId);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-decision.mjs","sourceRoot":"","sources":["../../../../src/package-tools/learned-critical-path/static-decision.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AdmissionPolicyContext,\n AdmissionProposal,\n SchedulerGraphSnapshot\n} from \"../../project-definition/project-definition.ts\";\nimport { learnedSelectionLayers, scopeForCandidate } from \"./selection-layers.ts\";\n\ntype Candidate = AdmissionPolicyContext[\"candidates\"][number];\ntype Task = SchedulerGraphSnapshot[\"tasks\"][number];\ntype Scope = SchedulerGraphSnapshot[\"scopes\"][number];\n\n/** Preserves ordinary static selection when learned preparation cannot form a ranking. */\nexport function staticDecision(context: AdmissionPolicyContext): AdmissionProposal {\n const layers = learnedSelectionLayers(context);\n const selected = selectStaticCandidate(\n context.candidates,\n layers.continuation,\n layers.scopeById,\n layers.taskById,\n layers.tightening\n );\n return selected === undefined || !selected.canAdmit\n ? Object.freeze({ kind: \"wait\" })\n : Object.freeze({ kind: \"select\", taskId: selected.taskId });\n}\n\nfunction selectStaticCandidate(\n candidates: readonly Candidate[],\n continuation: readonly Candidate[],\n scopeById: ReadonlyMap<string, Scope>,\n taskById: ReadonlyMap<string, Task>,\n tightening: readonly Candidate[]\n): Candidate | undefined {\n if (tightening.length > 0) return first(sortConstrained(tightening, taskById, scopeById));\n if (continuation.length > 0) return first(sortConstrained(continuation, taskById, scopeById));\n return selectOrdinary(candidates, taskById);\n}\n\nfunction selectOrdinary(\n candidates: readonly Candidate[],\n taskById: ReadonlyMap<string, Task>\n): Candidate | undefined {\n const admissible = candidates.filter((candidate) => candidate.canAdmit);\n return [...(admissible.length === 0 ? candidates : admissible)].sort(\n (left, right) =>\n priorityDifference(left, right, taskById) || compareText(left.taskId, right.taskId)\n )[0];\n}\n\nfunction sortConstrained(\n candidates: readonly Candidate[],\n taskById: ReadonlyMap<string, Task>,\n scopeById: ReadonlyMap<string, Scope>\n): Candidate[] {\n return [...candidates].sort((left, right) =>\n constrainedComparison(left, right, taskById, scopeById)\n );\n}\n\nfunction constrainedComparison(\n left: Candidate,\n right: Candidate,\n taskById: ReadonlyMap<string, Task>,\n scopeById: ReadonlyMap<string, Scope>\n): number {\n const leftScope = requiredScope(left, taskById, scopeById);\n const rightScope = requiredScope(right, taskById, scopeById);\n return (\n leftScope.maxParallel - rightScope.maxParallel ||\n priorityDifference(left, right, taskById) ||\n compareText(leftScope.id, rightScope.id) ||\n compareText(left.taskId, right.taskId)\n );\n}\n\nfunction requiredScope(\n candidate: Candidate,\n taskById: ReadonlyMap<string, Task>,\n scopeById: ReadonlyMap<string, Scope>\n): Scope {\n const scope = scopeForCandidate(candidate, taskById, scopeById);\n if (scope === undefined) throw new Error(\"constrained task is missing a scope\");\n return scope;\n}\n\nfunction priorityDifference(\n left: Candidate,\n right: Candidate,\n taskById: ReadonlyMap<string, Task>\n): number {\n return (\n (taskById.get(right.taskId)?.admissionPriority ?? 0) -\n (taskById.get(left.taskId)?.admissionPriority ?? 0)\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}\nfunction first<T>(values: readonly T[]): T {\n const value = values[0];\n if (value === undefined) throw new Error(\"static strategy requires a candidate\");\n return value;\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { isAbsolute } from "node:path";
|
|
2
|
-
import { canonicalizeJsonValue } from "
|
|
2
|
+
import { canonicalizeJsonValue } from "../../data-boundary/canonical-data.mjs";
|
|
3
3
|
import { prepareSchedulerDurationModel } from "./duration-model/preparation.mjs";
|
|
4
4
|
import { learnedSelectionLayers } from "./selection-layers.mjs";
|
|
5
5
|
import { staticDecision } from "./static-decision.mjs";
|
|
6
6
|
import { predictionForTask } from "./duration-model/prediction.mjs";
|
|
7
|
-
import { createSchedulerCriticalPathSnapshot, criticalPathScoreForTask } from "
|
|
7
|
+
import { createSchedulerCriticalPathSnapshot, criticalPathScoreForTask } from "./critical-path-ranking.mjs";
|
|
8
8
|
/**
|
|
9
9
|
* 构造普通公开 prepared strategy。调用方拥有 history location 与 identity projection;
|
|
10
10
|
* Product 只按同一 custom strategy lifecycle 调用它,不为该 helper 增加特权。
|
|
@@ -43,7 +43,7 @@ export function createLearnedCriticalPathStrategy(options) {
|
|
|
43
43
|
}
|
|
44
44
|
return Object.freeze({
|
|
45
45
|
decide: (context) => learnedDecision(context, durationModel.prediction, criticalPath, options),
|
|
46
|
-
|
|
46
|
+
terminalEffect: async (context) => {
|
|
47
47
|
const recorded = await durationModel.record(context);
|
|
48
48
|
if (recorded.kind === "failed" || recorded.writeObservation === "failed") {
|
|
49
49
|
observe(options, { kind: "recording-unavailable" });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.mjs","sourceRoot":"","sources":["../../../../src/package-tools/learned-critical-path/strategy.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute } from \"node:path\";\n\nimport {\n canonicalizeJsonValue,\n type CanonicalJsonValue\n} from \"../../data-boundary/canonical-data.ts\";\nimport type {\n AdmissionPolicyContext,\n AdmissionProposal,\n CustomAdmissionStrategy,\n SchedulerGraphSnapshot,\n SchedulerMeasurementContext\n} from \"../../project-definition/project-definition.ts\";\nimport { prepareSchedulerDurationModel } from \"./duration-model/preparation.ts\";\nimport { learnedSelectionLayers } from \"./selection-layers.ts\";\nimport { staticDecision } from \"./static-decision.ts\";\nimport {\n predictionForTask,\n type SchedulerPredictionInput,\n type SchedulerPredictionSnapshot\n} from \"./duration-model/prediction.ts\";\nimport {\n createSchedulerCriticalPathSnapshot,\n criticalPathScoreForTask,\n type SchedulerCriticalPathSnapshot\n} from \"./critical-path-ranking.ts\";\n\n/** 公开 learned critical-path prepared strategy 的调用方配置。 */\nexport interface LearnedCriticalPathStrategyOptions {\n /** 调用方拥有的可丢弃 learned duration history 本地目录;必须是绝对路径。 */\n readonly stateDirectory: string;\n /** 为每个公开 Task 提供 canonical-JSON-compatible 的调用方 identity projection。 */\n readonly identityForTask: (task: SchedulerGraphSnapshot[\"tasks\"][number]) => unknown;\n /** 单个 identity 最多保留的样本数;默认 32。 */\n readonly sampleWindow?: number;\n /** 最多保留的 identity 数;默认 4096。 */\n readonly maxHistorySeries?: number;\n /** 正的 cold-start duration 权重(毫秒);默认 1。 */\n readonly coldStartDurationMs?: number;\n /** 可选调用方 observation sink;observer fault 不改变 scheduling 或 Run facts。 */\n readonly observe?: (event: LearnedCriticalPathObservation) => void | Promise<void>;\n}\n\n/** 调用方可选 observer 收到的有界 learned strategy 事件;selection-proposed 不表示 Scheduler 已接受 admission。 */\nexport type LearnedCriticalPathObservation =\n | Readonly<{\n readonly kind: \"history-unavailable\";\n readonly reason: \"identity-invalid\" | \"setup-failed\";\n }>\n | Readonly<{\n readonly kind: \"selection-proposed\";\n readonly taskId: string;\n readonly estimatedDurationMs: number;\n readonly criticalPathScore: number;\n readonly sampleCount: number;\n readonly source: \"learned\" | \"project-prior\" | \"cold-start\";\n }>\n | Readonly<{ readonly kind: \"recording-unavailable\" }>;\n\n/**\n * 构造普通公开 prepared strategy。调用方拥有 history location 与 identity projection;\n * Product 只按同一 custom strategy lifecycle 调用它,不为该 helper 增加特权。\n */\nexport function createLearnedCriticalPathStrategy(\n options: LearnedCriticalPathStrategyOptions\n): CustomAdmissionStrategy {\n if (typeof options.stateDirectory !== \"string\" || !isAbsolute(options.stateDirectory)) {\n throw new TypeError(\"learned critical-path stateDirectory must be an absolute path\");\n }\n const model = modelOptions(options);\n return Object.freeze({\n kind: \"prepared\" as const,\n prepare: async ({ graph }) => {\n const predictionInputs = predictionInputsFor(graph, options.identityForTask, model);\n if (predictionInputs === undefined) {\n observe(options, { kind: \"history-unavailable\", reason: \"identity-invalid\" });\n return Object.freeze({ decide: staticDecision });\n }\n const durationModel = await prepareSchedulerDurationModel({\n predictionInputs,\n stateDirectory: options.stateDirectory,\n coldStartDurationMs: model.coldStartDurationMs,\n maxSamplesPerSeries: model.sampleWindow,\n maxSeries: model.maxHistorySeries\n });\n if (durationModel.kind === \"static-fallback\") {\n observe(options, { kind: \"history-unavailable\", reason: \"setup-failed\" });\n return Object.freeze({ decide: staticDecision });\n }\n let criticalPath: SchedulerCriticalPathSnapshot;\n try {\n criticalPath = createSchedulerCriticalPathSnapshot(graph, durationModel.prediction);\n } catch {\n observe(options, { kind: \"history-unavailable\", reason: \"setup-failed\" });\n return Object.freeze({ decide: staticDecision });\n }\n return Object.freeze({\n decide: (context: AdmissionPolicyContext) =>\n learnedDecision(context, durationModel.prediction, criticalPath, options),\n terminalEffect: async (context: SchedulerMeasurementContext) => {\n const recorded = await durationModel.record(context);\n if (recorded.kind === \"failed\" || recorded.writeObservation === \"failed\") {\n observe(options, { kind: \"recording-unavailable\" });\n }\n }\n });\n }\n });\n}\n\nfunction modelOptions(options: LearnedCriticalPathStrategyOptions): Readonly<{\n readonly coldStartDurationMs: number;\n readonly maxHistorySeries: number;\n readonly sampleWindow: number;\n}> {\n const coldStartDurationMs = options.coldStartDurationMs ?? 1;\n const maxHistorySeries = options.maxHistorySeries ?? 4_096;\n const sampleWindow = options.sampleWindow ?? 32;\n validatePositiveFinite(coldStartDurationMs, \"coldStartDurationMs\");\n validateBoundedInteger(maxHistorySeries, \"maxHistorySeries\", 4_096);\n validateBoundedInteger(sampleWindow, \"sampleWindow\", 32);\n return Object.freeze({ coldStartDurationMs, maxHistorySeries, sampleWindow });\n}\n\nfunction validatePositiveFinite(value: number, name: string): void {\n if (!Number.isFinite(value) || value <= 0)\n throw new TypeError(`learned critical-path ${name} must be positive and finite`);\n}\n\nfunction validateBoundedInteger(value: number, name: string, maximum: number): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > maximum)\n throw new TypeError(`learned critical-path ${name} must be a positive safe integer`);\n}\n\nfunction predictionInputsFor(\n graph: SchedulerGraphSnapshot,\n identityForTask: LearnedCriticalPathStrategyOptions[\"identityForTask\"],\n model: Readonly<{\n readonly coldStartDurationMs: number;\n readonly maxHistorySeries: number;\n readonly sampleWindow: number;\n }>\n): readonly SchedulerPredictionInput[] | undefined {\n const inputs: SchedulerPredictionInput[] = [];\n for (const task of graph.tasks) {\n let identity: CanonicalJsonValue | undefined;\n try {\n identity = canonicalizeJsonValue({ historyKey: identityForTask(task), model });\n } catch {\n return undefined;\n }\n if (identity === undefined) return undefined;\n inputs.push(\n Object.freeze({\n authoredOptions: identity,\n checkId: task.taskId,\n flags: null,\n taskId: task.taskId\n })\n );\n }\n return Object.freeze(inputs);\n}\n\nfunction learnedDecision(\n context: AdmissionPolicyContext,\n prediction: SchedulerPredictionSnapshot,\n criticalPath: SchedulerCriticalPathSnapshot,\n options: LearnedCriticalPathStrategyOptions\n): AdmissionProposal {\n const selected = selectLearnedCandidate(context, criticalPath);\n if (!selected.canAdmit) return Object.freeze({ kind: \"wait\" });\n const taskPrediction = predictionForTask(prediction, selected.taskId);\n const score = criticalPathScoreForTask(criticalPath, selected.taskId);\n if (taskPrediction !== undefined && score !== undefined) {\n observe(\n options,\n Object.freeze({\n kind: \"selection-proposed\",\n taskId: selected.taskId,\n criticalPathScore: score,\n estimatedDurationMs: taskPrediction.estimatedDurationMs,\n sampleCount: taskPrediction.sampleCount,\n source: taskPrediction.source\n })\n );\n }\n return Object.freeze({ kind: \"select\", taskId: selected.taskId });\n}\n\nfunction selectLearnedCandidate(\n context: AdmissionPolicyContext,\n criticalPath: SchedulerCriticalPathSnapshot\n): AdmissionPolicyContext[\"candidates\"][number] {\n const layers = learnedSelectionLayers(context);\n if (layers.tightening.length > 0)\n return requiredFirst(\n sortConstrained(layers.tightening, layers.taskById, layers.scopeById, criticalPath)\n );\n if (layers.continuation.length > 0)\n return requiredFirst(\n sortConstrained(layers.continuation, layers.taskById, layers.scopeById, criticalPath)\n );\n return requiredFirst(\n [...context.candidates].sort(learnedCandidateComparator(layers.taskById, criticalPath))\n );\n}\n\nfunction learnedCandidateComparator(\n taskById: ReadonlyMap<string, SchedulerGraphSnapshot[\"tasks\"][number]>,\n criticalPath: SchedulerCriticalPathSnapshot\n): (\n left: AdmissionPolicyContext[\"candidates\"][number],\n right: AdmissionPolicyContext[\"candidates\"][number]\n) => number {\n return (left, right) => compareLearnedTasks(taskById, criticalPath, left.taskId, right.taskId);\n}\n\nfunction sortConstrained(\n candidates: readonly AdmissionPolicyContext[\"candidates\"][number][],\n taskById: ReadonlyMap<string, SchedulerGraphSnapshot[\"tasks\"][number]>,\n scopeById: ReadonlyMap<string, SchedulerGraphSnapshot[\"scopes\"][number]>,\n criticalPath: SchedulerCriticalPathSnapshot\n): AdmissionPolicyContext[\"candidates\"][number][] {\n return [...candidates].sort(learnedConstrainedComparator(taskById, scopeById, criticalPath));\n}\n\nfunction learnedConstrainedComparator(\n taskById: ReadonlyMap<string, SchedulerGraphSnapshot[\"tasks\"][number]>,\n scopeById: ReadonlyMap<string, SchedulerGraphSnapshot[\"scopes\"][number]>,\n criticalPath: SchedulerCriticalPathSnapshot\n): (\n left: AdmissionPolicyContext[\"candidates\"][number],\n right: AdmissionPolicyContext[\"candidates\"][number]\n) => number {\n return (left, right) => {\n const leftScope = requiredLearnedScope(left, taskById, scopeById);\n const rightScope = requiredLearnedScope(right, taskById, scopeById);\n return (\n leftScope.maxParallel - rightScope.maxParallel ||\n compareLearnedTasks(taskById, criticalPath, left.taskId, right.taskId) ||\n compareText(leftScope.id, rightScope.id) ||\n compareText(left.taskId, right.taskId)\n );\n };\n}\n\nfunction requiredLearnedScope(\n candidate: AdmissionPolicyContext[\"candidates\"][number],\n taskById: ReadonlyMap<string, SchedulerGraphSnapshot[\"tasks\"][number]>,\n scopeById: ReadonlyMap<string, SchedulerGraphSnapshot[\"scopes\"][number]>\n): SchedulerGraphSnapshot[\"scopes\"][number] {\n const task = taskById.get(candidate.taskId);\n const scope =\n task?.scopeId === null || task === undefined ? undefined : scopeById.get(task.scopeId);\n if (scope === undefined) throw new Error(\"constrained task is missing a scope\");\n return scope;\n}\nfunction compareLearnedTasks(\n taskById: ReadonlyMap<string, SchedulerGraphSnapshot[\"tasks\"][number]>,\n criticalPath: SchedulerCriticalPathSnapshot,\n leftId: string,\n rightId: string\n): number {\n const left = taskById.get(leftId);\n const right = taskById.get(rightId);\n if (left === undefined || right === undefined)\n throw new Error(\"learned candidate is missing from graph\");\n const leftScore = criticalPathScoreForTask(criticalPath, leftId);\n const rightScore = criticalPathScoreForTask(criticalPath, rightId);\n if (leftScore === undefined || rightScore === undefined)\n throw new Error(\"learned scheduler score is missing\");\n return (\n rightScore - leftScore ||\n right.admissionPriority - left.admissionPriority ||\n compareText(leftId, rightId)\n );\n}\n\nfunction observe(\n options: LearnedCriticalPathStrategyOptions,\n event: LearnedCriticalPathObservation\n): void {\n try {\n const observed = options.observe?.(event);\n if (observed !== undefined) void Promise.resolve(observed).catch(() => undefined);\n } catch {\n // Caller observation is contained.\n }\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\nfunction requiredFirst<T>(values: readonly T[]): T {\n const first = values[0];\n if (first === undefined) throw new Error(\"learned strategy requires a candidate\");\n return first;\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getDefinedHandoffProviderIdentity } from "../../check/handoff-provider-identity.mjs";
|
|
1
2
|
import { snapshotClosedArray } from "../../data-boundary/closed-values.mjs";
|
|
2
3
|
import { parseCheckAuthoringData, parseCheckFieldPrelude, parseCheckFields } from "./check-fields-authoring.mjs";
|
|
3
4
|
import { parseCheckScheduling } from "./scheduling-authoring.mjs";
|
|
@@ -23,10 +24,11 @@ export function parseCheckTreeAuthoring(value) {
|
|
|
23
24
|
});
|
|
24
25
|
}
|
|
25
26
|
function parseCheck(value, path, state) {
|
|
27
|
+
const handoffProviderIdentity = getDefinedHandoffProviderIdentity(value);
|
|
26
28
|
const data = parseCheckAuthoringData(value);
|
|
27
29
|
if (data === undefined)
|
|
28
30
|
return undefined;
|
|
29
|
-
const prelude = parseCheckFieldPrelude(data);
|
|
31
|
+
const prelude = parseCheckFieldPrelude(data, handoffProviderIdentity);
|
|
30
32
|
if (prelude === undefined)
|
|
31
33
|
return undefined;
|
|
32
34
|
const checks = parseChildren(data, path, state);
|
|
@@ -47,7 +49,8 @@ function parseCheck(value, path, state) {
|
|
|
47
49
|
dependsOn: scheduling.dependsOn,
|
|
48
50
|
displayName: data.displayName,
|
|
49
51
|
enabledByFlags: fields.enabledByFlags,
|
|
50
|
-
|
|
52
|
+
execute: fields.execute,
|
|
53
|
+
handoff: fields.handoff,
|
|
51
54
|
maxParallel: scheduling.maxParallel,
|
|
52
55
|
mutex: scheduling.mutex,
|
|
53
56
|
observes: scheduling.observes,
|
|
@@ -55,8 +58,8 @@ function parseCheck(value, path, state) {
|
|
|
55
58
|
options: fields.options,
|
|
56
59
|
path,
|
|
57
60
|
parseData: fields.parseData,
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
prepare: fields.prepare,
|
|
62
|
+
omitQuietPassedRow: fields.omitQuietPassedRow
|
|
60
63
|
});
|
|
61
64
|
}
|
|
62
65
|
function parseChildren(data, path, state) {
|
|
@@ -75,7 +78,7 @@ function parseChildren(data, path, state) {
|
|
|
75
78
|
return Object.freeze(checks);
|
|
76
79
|
}
|
|
77
80
|
function warnForMeaninglessCheck(data, checks, fields, path, state) {
|
|
78
|
-
if (fields.
|
|
81
|
+
if (fields.execute !== null || checks.length > 0)
|
|
79
82
|
return;
|
|
80
83
|
state.warnings.push(Object.freeze({ code: "meaningless-check", path, checkId: data.checkId }));
|
|
81
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoring.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/authoring.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,EAKjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAA8B,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"authoring.mjs","sourceRoot":"","sources":["../../../../src/project-definition/check-tree/authoring.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CheckDescriptor } from \"../../check/descriptor.ts\";\nimport {\n getDefinedHandoffProviderIdentity,\n type HandoffProviderIdentity\n} from \"../../check/handoff-provider-identity.ts\";\nimport { snapshotClosedArray } from \"../../data-boundary/closed-values.ts\";\nimport {\n parseCheckAuthoringData,\n parseCheckFieldPrelude,\n parseCheckFields,\n type CheckAuthoringData,\n type ParsedCheckFields,\n type ParsedCheckFieldPrelude,\n type TrustedDataParser\n} from \"./check-fields-authoring.ts\";\nimport { parseCheckScheduling, type ParsedCheckCollection } from \"./scheduling-authoring.ts\";\nimport type { ResourceUnitMapping } from \"../resource-unit-mapping.ts\";\n\nexport type { ParsedCheckCollection } from \"./scheduling-authoring.ts\";\n\nexport interface ParsedCheck {\n readonly admissionPriority: number | undefined;\n readonly checkId: string;\n readonly checks: readonly ParsedCheck[];\n readonly definition: CheckDescriptor | null;\n readonly dependsOn: ParsedCheckCollection | undefined;\n readonly displayName: string;\n readonly enabledByFlags: ParsedCheckFieldPrelude[\"enabledByFlags\"];\n readonly execute: ParsedCheckFieldPrelude[\"execute\"];\n readonly handoff: HandoffProviderIdentity | null;\n readonly maxParallel: number | undefined;\n readonly mutex: ParsedCheckCollection | undefined;\n readonly observes: ParsedCheckCollection | undefined;\n readonly resourceClaims: ResourceUnitMapping | undefined;\n readonly options: object | null;\n readonly path: string;\n readonly parseData: TrustedDataParser | null;\n readonly prepare: ParsedCheckFieldPrelude[\"prepare\"];\n readonly omitQuietPassedRow: ParsedCheckFields[\"omitQuietPassedRow\"];\n}\n\nexport interface ParsedCheckTree {\n readonly checks: readonly ParsedCheck[];\n readonly warnings: readonly MeaninglessCheckWarning[];\n}\n\nexport interface MeaninglessCheckWarning {\n readonly code: \"meaningless-check\";\n readonly path: string;\n readonly checkId: string;\n}\n\ninterface ParseState {\n readonly warnings: MeaninglessCheckWarning[];\n}\n\n/**\n * Parses only the closed recursive authoring grammar. Execution callbacks are\n * trusted project code, while every declarative field is copied and validated.\n */\nexport function parseCheckTreeAuthoring(value: unknown): ParsedCheckTree | undefined {\n const roots = snapshotClosedArray(value);\n if (roots === undefined) return undefined;\n const state: ParseState = { warnings: [] };\n const checks: ParsedCheck[] = [];\n for (let index = 0; index < roots.length; index += 1) {\n const check = parseCheck(roots[index], `definition.checks[${index}]`, state);\n if (check === undefined) return undefined;\n checks.push(check);\n }\n return Object.freeze({\n checks: Object.freeze(checks),\n warnings: Object.freeze(state.warnings)\n });\n}\n\nfunction parseCheck(value: unknown, path: string, state: ParseState): ParsedCheck | undefined {\n const handoffProviderIdentity = getDefinedHandoffProviderIdentity(value);\n const data = parseCheckAuthoringData(value);\n if (data === undefined) return undefined;\n const prelude = parseCheckFieldPrelude(data, handoffProviderIdentity);\n if (prelude === undefined) return undefined;\n const checks = parseChildren(data, path, state);\n if (checks === undefined) return undefined;\n const scheduling = parseCheckScheduling(data);\n if (scheduling === undefined) return undefined;\n const fields = parseCheckFields(data, prelude);\n if (fields === undefined) return undefined;\n warnForMeaninglessCheck(data, checks, fields, path, state);\n return Object.freeze({\n admissionPriority: scheduling.admissionPriority,\n checkId: data.checkId,\n checks,\n definition: fields.definition,\n dependsOn: scheduling.dependsOn,\n displayName: data.displayName,\n enabledByFlags: fields.enabledByFlags,\n execute: fields.execute,\n handoff: fields.handoff,\n maxParallel: scheduling.maxParallel,\n mutex: scheduling.mutex,\n observes: scheduling.observes,\n resourceClaims: scheduling.resourceClaims,\n options: fields.options,\n path,\n parseData: fields.parseData,\n prepare: fields.prepare,\n omitQuietPassedRow: fields.omitQuietPassedRow\n });\n}\n\nfunction parseChildren(\n data: CheckAuthoringData,\n path: string,\n state: ParseState\n): readonly ParsedCheck[] | undefined {\n if (!Object.hasOwn(data, \"checks\")) return Object.freeze([]);\n const values = snapshotClosedArray(data.checks);\n if (values === undefined) return undefined;\n const checks: ParsedCheck[] = [];\n for (let index = 0; index < values.length; index += 1) {\n const check = parseCheck(values[index], `${path}.checks[${index}]`, state);\n if (check === undefined) return undefined;\n checks.push(check);\n }\n return Object.freeze(checks);\n}\n\nfunction warnForMeaninglessCheck(\n data: CheckAuthoringData,\n checks: readonly ParsedCheck[],\n fields: ParsedCheckFields,\n path: string,\n state: ParseState\n): void {\n if (fields.execute !== null || checks.length > 0) return;\n state.warnings.push(Object.freeze({ code: \"meaningless-check\", path, checkId: data.checkId }));\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import {} from "../../check/check.mjs";
|
|
|
2
2
|
import { validateCheckDescriptor } from "../../check/descriptor-validation.mjs";
|
|
3
3
|
import { snapshotJsonObject } from "../../check/options-snapshot.mjs";
|
|
4
4
|
import { snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
5
|
-
import {
|
|
5
|
+
import { hasOnlyKeys, parseFlagCondition } from "./flag-conditions.mjs";
|
|
6
6
|
const CHECK_KEYS = [
|
|
7
7
|
"admissionPriority",
|
|
8
8
|
"checkId",
|
|
@@ -10,25 +10,27 @@ const CHECK_KEYS = [
|
|
|
10
10
|
"dependsOn",
|
|
11
11
|
"displayName",
|
|
12
12
|
"enabledByFlags",
|
|
13
|
-
"
|
|
13
|
+
"execute",
|
|
14
|
+
"handoff",
|
|
14
15
|
"maxParallel",
|
|
15
16
|
"mutex",
|
|
16
17
|
"options",
|
|
17
18
|
"observes",
|
|
18
19
|
"parseData",
|
|
19
|
-
"
|
|
20
|
+
"prepare",
|
|
20
21
|
"resourceClaims",
|
|
21
|
-
"
|
|
22
|
+
"omitQuietPassedRow"
|
|
22
23
|
];
|
|
23
|
-
const
|
|
24
|
+
const FLAG_ENABLEMENT_EXPRESSION_KEYS = ["when", "propagateDependsOn"];
|
|
24
25
|
const CONTAINER_CHECK_FIELDS = Object.freeze({
|
|
25
26
|
definition: null,
|
|
26
27
|
enabledByFlags: null,
|
|
27
|
-
|
|
28
|
+
execute: null,
|
|
29
|
+
handoff: null,
|
|
28
30
|
options: null,
|
|
29
31
|
parseData: null,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
prepare: null,
|
|
33
|
+
omitQuietPassedRow: null
|
|
32
34
|
});
|
|
33
35
|
export function parseCheckAuthoringData(value) {
|
|
34
36
|
const data = snapshotClosedRecord(value);
|
|
@@ -41,67 +43,91 @@ function hasValidCheckIdentity(data) {
|
|
|
41
43
|
typeof data.displayName === "string" &&
|
|
42
44
|
data.displayName.length > 0);
|
|
43
45
|
}
|
|
44
|
-
export function parseCheckFieldPrelude(data) {
|
|
46
|
+
export function parseCheckFieldPrelude(data, handoffProviderIdentity) {
|
|
45
47
|
const execution = parseExecution(data);
|
|
46
48
|
if (execution === undefined)
|
|
47
49
|
return undefined;
|
|
50
|
+
const handoff = parseHandoff(data, handoffProviderIdentity);
|
|
51
|
+
if (handoff === undefined)
|
|
52
|
+
return undefined;
|
|
48
53
|
const parseData = parseDataParser(data);
|
|
49
54
|
if (parseData === undefined)
|
|
50
55
|
return undefined;
|
|
51
|
-
const
|
|
52
|
-
if (
|
|
56
|
+
const preparation = parsePreparation(data);
|
|
57
|
+
if (preparation === undefined)
|
|
53
58
|
return undefined;
|
|
54
59
|
const enabledByFlags = parseEnabledByFlags(data);
|
|
55
60
|
return enabledByFlags === undefined
|
|
56
61
|
? undefined
|
|
57
|
-
: Object.freeze({
|
|
62
|
+
: Object.freeze({
|
|
63
|
+
enabledByFlags,
|
|
64
|
+
execute: execution,
|
|
65
|
+
handoff,
|
|
66
|
+
parseData,
|
|
67
|
+
prepare: preparation
|
|
68
|
+
});
|
|
58
69
|
}
|
|
59
70
|
export function parseCheckFields(data, prelude) {
|
|
60
|
-
if (prelude.
|
|
61
|
-
return
|
|
62
|
-
Object.hasOwn(data, "enabledByFlags") ||
|
|
63
|
-
Object.hasOwn(data, "visibility") ||
|
|
64
|
-
prelude.parseData !== null ||
|
|
65
|
-
prelude.preflight !== null
|
|
66
|
-
? undefined
|
|
67
|
-
: CONTAINER_CHECK_FIELDS;
|
|
71
|
+
if (prelude.execute === null) {
|
|
72
|
+
return containerHasExecutableFields(data, prelude) ? undefined : CONTAINER_CHECK_FIELDS;
|
|
68
73
|
}
|
|
74
|
+
return parseExecutableCheckFields(data, prelude);
|
|
75
|
+
}
|
|
76
|
+
/** Container nodes cannot carry values that only an executable callback can consume. */
|
|
77
|
+
function containerHasExecutableFields(data, prelude) {
|
|
78
|
+
return (Object.hasOwn(data, "options") ||
|
|
79
|
+
Object.hasOwn(data, "enabledByFlags") ||
|
|
80
|
+
prelude.handoff !== null ||
|
|
81
|
+
Object.hasOwn(data, "omitQuietPassedRow") ||
|
|
82
|
+
prelude.parseData !== null ||
|
|
83
|
+
prelude.prepare !== null);
|
|
84
|
+
}
|
|
85
|
+
/** Parses the callback-owned fields that form one executable Check definition. */
|
|
86
|
+
function parseExecutableCheckFields(data, prelude) {
|
|
69
87
|
const definition = parseDefinition(data);
|
|
70
88
|
if (definition === undefined)
|
|
71
89
|
return undefined;
|
|
72
90
|
const options = parseOptions(data);
|
|
73
91
|
if (options === undefined)
|
|
74
92
|
return undefined;
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
93
|
+
const omitQuietPassedRow = parseOmitQuietPassedRow(data);
|
|
94
|
+
if (omitQuietPassedRow === undefined)
|
|
77
95
|
return undefined;
|
|
78
96
|
return Object.freeze({
|
|
79
97
|
definition,
|
|
80
98
|
enabledByFlags: prelude.enabledByFlags,
|
|
81
|
-
|
|
99
|
+
execute: prelude.execute,
|
|
100
|
+
handoff: prelude.handoff,
|
|
82
101
|
options,
|
|
83
102
|
parseData: prelude.parseData,
|
|
84
|
-
|
|
85
|
-
|
|
103
|
+
prepare: prelude.prepare,
|
|
104
|
+
omitQuietPassedRow
|
|
86
105
|
});
|
|
87
106
|
}
|
|
88
107
|
function hasOnlyCheckKeys(data) {
|
|
89
108
|
return Object.keys(data).every((key) => CHECK_KEYS.some((checkKey) => checkKey === key));
|
|
90
109
|
}
|
|
91
110
|
function parseExecution(data) {
|
|
92
|
-
if (!Object.hasOwn(data, "
|
|
111
|
+
if (!Object.hasOwn(data, "execute"))
|
|
112
|
+
return null;
|
|
113
|
+
return isTrustedFunction(data.execute) ? data.execute : undefined;
|
|
114
|
+
}
|
|
115
|
+
function parseHandoff(data, handoffProviderIdentity) {
|
|
116
|
+
if (!Object.hasOwn(data, "handoff"))
|
|
93
117
|
return null;
|
|
94
|
-
return
|
|
118
|
+
return data.handoff === true && handoffProviderIdentity !== undefined
|
|
119
|
+
? handoffProviderIdentity
|
|
120
|
+
: undefined;
|
|
95
121
|
}
|
|
96
122
|
function parseDataParser(data) {
|
|
97
123
|
if (!Object.hasOwn(data, "parseData") || data.parseData === undefined)
|
|
98
124
|
return null;
|
|
99
125
|
return isTrustedFunction(data.parseData) ? data.parseData : undefined;
|
|
100
126
|
}
|
|
101
|
-
function
|
|
102
|
-
if (!Object.hasOwn(data, "
|
|
127
|
+
function parsePreparation(data) {
|
|
128
|
+
if (!Object.hasOwn(data, "prepare"))
|
|
103
129
|
return null;
|
|
104
|
-
return isTrustedFunction(data.
|
|
130
|
+
return isTrustedFunction(data.prepare) ? data.prepare : undefined;
|
|
105
131
|
}
|
|
106
132
|
function isTrustedFunction(value) {
|
|
107
133
|
return typeof value === "function";
|
|
@@ -124,48 +150,35 @@ function parseOptions(data) {
|
|
|
124
150
|
function parseEnabledByFlags(data) {
|
|
125
151
|
if (!Object.hasOwn(data, "enabledByFlags"))
|
|
126
152
|
return null;
|
|
127
|
-
|
|
128
|
-
if (control === undefined)
|
|
129
|
-
return undefined;
|
|
130
|
-
const flags = parseUniqueIdentifiers(control.flags);
|
|
131
|
-
return flags === undefined ? undefined : canonicalFlagEnablement(control, flags);
|
|
153
|
+
return parseFlagEnablementControl(data.enabledByFlags);
|
|
132
154
|
}
|
|
133
|
-
|
|
155
|
+
/** Parses one closed flag-enablement field without validating its Project flag references. */
|
|
156
|
+
export function parseFlagEnablementControl(value) {
|
|
134
157
|
const control = snapshotClosedRecord(value);
|
|
135
|
-
if (control === undefined ||
|
|
158
|
+
if (control === undefined ||
|
|
159
|
+
!hasOnlyKeys(control, FLAG_ENABLEMENT_EXPRESSION_KEYS) ||
|
|
160
|
+
!Object.hasOwn(control, "when")) {
|
|
136
161
|
return undefined;
|
|
137
|
-
|
|
162
|
+
}
|
|
163
|
+
const when = parseFlagCondition(control.when);
|
|
164
|
+
const propagateDependsOn = parsePropagation(control);
|
|
165
|
+
return when === undefined || propagateDependsOn === undefined
|
|
166
|
+
? undefined
|
|
167
|
+
: Object.freeze({
|
|
168
|
+
when,
|
|
169
|
+
...(propagateDependsOn ? { propagateDependsOn: true } : {})
|
|
170
|
+
});
|
|
138
171
|
}
|
|
139
|
-
function
|
|
140
|
-
if (!Object.hasOwn(control, "
|
|
141
|
-
return false;
|
|
142
|
-
if (!isCheckFlagEnablementMode(control.mode))
|
|
172
|
+
function parsePropagation(control) {
|
|
173
|
+
if (!Object.hasOwn(control, "propagateDependsOn"))
|
|
143
174
|
return false;
|
|
144
|
-
return
|
|
175
|
+
return control.propagateDependsOn === true ? true : undefined;
|
|
145
176
|
}
|
|
146
|
-
function
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
return Object.freeze({
|
|
152
|
-
flags: Object.freeze(canonicalFlags),
|
|
153
|
-
mode: control.mode,
|
|
154
|
-
...(control.propagateDependsOn === true ? { propagateDependsOn: true } : {})
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
function hasOnlyFlagEnablementKeys(control) {
|
|
158
|
-
return Object.keys(control).every((key) => FLAG_ENABLEMENT_KEYS.some((allowed) => allowed === key));
|
|
159
|
-
}
|
|
160
|
-
function isCheckFlagEnablementMode(value) {
|
|
161
|
-
return value === "all" || value === "any" || value === "none" || value === "not-all";
|
|
162
|
-
}
|
|
163
|
-
function parseVisibility(data) {
|
|
164
|
-
if (!Object.hasOwn(data, "visibility"))
|
|
165
|
-
return "always";
|
|
166
|
-
const visibility = data.visibility;
|
|
167
|
-
return visibility === undefined || visibility === "always" || visibility === "attention"
|
|
168
|
-
? (visibility ?? "always")
|
|
177
|
+
function parseOmitQuietPassedRow(data) {
|
|
178
|
+
if (!Object.hasOwn(data, "omitQuietPassedRow"))
|
|
179
|
+
return false;
|
|
180
|
+
return data.omitQuietPassedRow === undefined || data.omitQuietPassedRow === true
|
|
181
|
+
? (data.omitQuietPassedRow ?? false)
|
|
169
182
|
: undefined;
|
|
170
183
|
}
|
|
171
184
|
//# sourceMappingURL=check-fields-authoring.mjs.map
|