@zxyycom/vibe-check 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -74
- package/dist/esm/cache/cache-json-by-key.mjs +189 -0
- package/dist/esm/cache/cache-json-by-key.mjs.map +1 -0
- package/dist/esm/check/check.mjs.map +1 -1
- package/dist/esm/check/finding-presentation.mjs +40 -0
- package/dist/esm/check/finding-presentation.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-settlement/fact-validation.mjs +17 -23
- package/dist/esm/check-settlement/fact-validation.mjs.map +1 -1
- package/dist/esm/check-settlement/outcome-normalization.mjs +9 -19
- package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -1
- package/dist/esm/check-settlement/reason-shape.mjs +12 -0
- package/dist/esm/check-settlement/reason-shape.mjs.map +1 -0
- package/dist/esm/check-settlement/record-store.mjs +14 -17
- package/dist/esm/check-settlement/record-store.mjs.map +1 -1
- package/dist/esm/check-settlement/session.mjs +8 -2
- package/dist/esm/check-settlement/session.mjs.map +1 -1
- package/dist/esm/data-boundary/closed-values.mjs +16 -0
- package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
- package/dist/esm/data-boundary/value-shapes.mjs +9 -0
- package/dist/esm/data-boundary/value-shapes.mjs.map +1 -1
- package/dist/esm/index.mjs +9 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs +56 -0
- package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs +122 -0
- package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs +41 -0
- package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/recording.mjs +109 -0
- package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +1 -0
- package/dist/esm/learned-critical-path/duration-model/storage.mjs +187 -0
- package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +1 -0
- package/dist/esm/learned-critical-path/selection-layers.mjs +28 -0
- package/dist/esm/learned-critical-path/selection-layers.mjs.map +1 -0
- package/dist/esm/learned-critical-path/static-decision.mjs +55 -0
- package/dist/esm/learned-critical-path/static-decision.mjs.map +1 -0
- package/dist/esm/learned-critical-path/strategy.mjs +179 -0
- package/dist/esm/learned-critical-path/strategy.mjs.map +1 -0
- package/dist/esm/machine-output/v4/atomic-publication.mjs +1 -15
- package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs +40 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs +48 -0
- package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs +20 -0
- package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +15 -7
- package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/execution.mjs +44 -18
- package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +59 -0
- package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs +55 -0
- package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs.map +1 -0
- 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/jscpd/command-resolution.mjs +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +15 -5
- package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +5 -4
- package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +22 -47
- package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +20 -25
- package/dist/esm/package-checks/duplicate-detection/options-validation.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 +27 -6
- package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/execution.mjs +10 -17
- package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs +22 -0
- package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs +11 -43
- package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/options-validation.mjs +15 -25
- package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/records.mjs +2 -9
- 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/parser.mjs +4 -4
- package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -1
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +2 -2
- package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analysis.mjs +56 -15
- package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs +550 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +332 -0
- package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs +7 -0
- package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +24 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs +113 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs +180 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs +121 -0
- package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +217 -0
- package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs +96 -0
- package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs +76 -0
- package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs +88 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +466 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +289 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs +38 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs +44 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs +113 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs +247 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs +16 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs +103 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs +55 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +100 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs +367 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +260 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs +53 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +306 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +402 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +214 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs +32 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs +47 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs +22 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs +142 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs +94 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs +149 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +79 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +606 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs +31 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +23 -0
- package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs +492 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +542 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs +141 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +62 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs +154 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs +36 -0
- package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs +56 -0
- package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs +2 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +108 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs +24 -0
- package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/constructor.mjs +2 -2
- package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/execution.mjs +51 -33
- package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs +75 -0
- package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs +28 -0
- package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/measurement.mjs +161 -26
- package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs +30 -63
- package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/options-validation.mjs +27 -32
- package/dist/esm/package-checks/function-metrics/options-validation.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 +31 -1
- package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
- package/dist/esm/package-checks/function-metrics/target-files.mjs +6 -67
- package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -1
- package/dist/esm/package-checks/{file-metrics/scc → host-environment}/csv.mjs +1 -0
- package/dist/esm/package-checks/host-environment/csv.mjs.map +1 -0
- package/dist/esm/package-checks/host-environment/git.mjs +1 -1
- package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
- package/dist/esm/package-checks/host-environment/process.mjs +5 -0
- package/dist/esm/package-checks/host-environment/process.mjs.map +1 -0
- package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +15 -17
- package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/json-validation/options-validation.mjs +4 -10
- package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -1
- package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +9 -3
- package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs +27 -24
- package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +82 -53
- package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +36 -0
- package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +2 -2
- package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +26 -4
- 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 +24 -11
- 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 +185 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs +131 -0
- package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +58 -57
- package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -1
- package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs +54 -0
- package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs.map +1 -0
- package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs +16 -0
- package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/collection.mjs +1 -1
- package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/configuration.mjs +2 -10
- package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs +1 -1
- package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +1 -1
- package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
- package/dist/esm/package-checks/project-files/public-collection.mjs +56 -0
- package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -0
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +1 -1
- package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
- package/dist/esm/package-checks/secret-detection/classification.mjs +15 -0
- package/dist/esm/package-checks/secret-detection/classification.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/default-check.mjs +39 -0
- package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/execution.mjs +172 -0
- package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/final-data.mjs +33 -0
- package/dist/esm/package-checks/secret-detection/final-data.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs +30 -0
- package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs +153 -0
- package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options-resolution.mjs +40 -0
- package/dist/esm/package-checks/secret-detection/options-resolution.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options-validation.mjs +22 -0
- package/dist/esm/package-checks/secret-detection/options-validation.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/options.mjs +2 -0
- package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/records.mjs +31 -0
- package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -0
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +85 -0
- package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/authoring.mjs +12 -172
- package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +171 -0
- package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/collection-authoring.mjs +16 -0
- package/dist/esm/project-definition/check-tree/collection-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/check-tree/materialization.mjs +9 -1
- package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/resolution.mjs +45 -13
- package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
- package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs +73 -0
- package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs.map +1 -0
- package/dist/esm/project-definition/declarative-snapshot.mjs +73 -0
- package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -0
- package/dist/esm/project-definition/output-defaults.mjs +18 -1
- package/dist/esm/project-definition/output-defaults.mjs.map +1 -1
- package/dist/esm/project-definition/output-validation.mjs +15 -15
- package/dist/esm/project-definition/output-validation.mjs.map +1 -1
- package/dist/esm/project-definition/progress-rendering-output.mjs +52 -0
- package/dist/esm/project-definition/progress-rendering-output.mjs.map +1 -0
- package/dist/esm/project-definition/project-definition-validation.mjs +100 -16
- package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
- package/dist/esm/project-definition/project-definition.mjs +52 -47
- package/dist/esm/project-definition/project-definition.mjs.map +1 -1
- package/dist/esm/project-definition/resource-unit-mapping.mjs +21 -0
- package/dist/esm/project-definition/resource-unit-mapping.mjs.map +1 -0
- package/dist/esm/project-definition/scheduler-policy.mjs +2 -0
- package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +54 -0
- package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs +2 -0
- package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -0
- package/dist/esm/project-run/admission-strategy-provider/provider.mjs +23 -0
- package/dist/esm/project-run/admission-strategy-provider/provider.mjs.map +1 -0
- package/dist/esm/project-run/aggregation.mjs +7 -5
- package/dist/esm/project-run/aggregation.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/callback.mjs +35 -8
- package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/console-capture.mjs +220 -0
- package/dist/esm/project-run/check-execution/console-capture.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/dependencies.mjs +21 -3
- package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-finalization.mjs +54 -13
- package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/execution-settlement.mjs +13 -9
- package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/flag-controls.mjs +87 -0
- package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/lifecycle.mjs +2 -0
- package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/check-execution/messages.mjs +5 -0
- package/dist/esm/project-run/check-execution/messages.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/plan.mjs +9 -5
- package/dist/esm/project-run/check-execution/plan.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/preflight.mjs +18 -32
- package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/resolved-checks.mjs +100 -58
- package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
- package/dist/esm/project-run/check-execution/resolved-execution-result.mjs +2 -0
- package/dist/esm/project-run/check-execution/resolved-execution-result.mjs.map +1 -0
- package/dist/esm/project-run/{completion.mjs → completion/completion.mjs} +16 -38
- package/dist/esm/project-run/completion/completion.mjs.map +1 -0
- package/dist/esm/project-run/{machine-publication.mjs → completion/machine-publication.mjs} +1 -1
- package/dist/esm/project-run/completion/machine-publication.mjs.map +1 -0
- package/dist/esm/project-run/completion/result-resolver.mjs +36 -0
- package/dist/esm/project-run/completion/result-resolver.mjs.map +1 -0
- package/dist/esm/project-run/controls/contract.mjs.map +1 -1
- package/dist/esm/project-run/controls/outputs-override-validation.mjs +67 -47
- package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation-result.mjs.map +1 -1
- package/dist/esm/project-run/controls/validation.mjs +75 -11
- package/dist/esm/project-run/controls/validation.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/logger.mjs +100 -161
- package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -1
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +159 -0
- package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -0
- package/dist/esm/project-run/invocation/candidate.mjs +61 -0
- package/dist/esm/project-run/invocation/candidate.mjs.map +1 -0
- package/dist/esm/project-run/invocation/creation.mjs +79 -0
- package/dist/esm/project-run/invocation/creation.mjs.map +1 -0
- package/dist/esm/project-run/invocation/paths.mjs +77 -0
- package/dist/esm/project-run/invocation/paths.mjs.map +1 -0
- package/dist/esm/project-run/invocation/progress.mjs +30 -0
- package/dist/esm/project-run/invocation/progress.mjs.map +1 -0
- package/dist/esm/project-run/{invocation.mjs → invocation/run.mjs} +78 -92
- package/dist/esm/project-run/invocation/run.mjs.map +1 -0
- package/dist/esm/project-run/invocation/scheduler.mjs +57 -0
- package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -0
- package/dist/esm/project-run/{output-configuration.mjs → outputs/configuration.mjs} +3 -2
- package/dist/esm/project-run/outputs/configuration.mjs.map +1 -0
- package/dist/esm/project-run/outputs/status.mjs +105 -0
- package/dist/esm/project-run/outputs/status.mjs.map +1 -0
- package/dist/esm/project-run/progress-rendering/presentation.mjs +112 -18
- package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +108 -19
- package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +30 -4
- package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
- package/dist/esm/project-run/progress-rendering/renderer.mjs +5 -2
- package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
- package/dist/esm/project-run/project-context.mjs +1 -1
- package/dist/esm/project-run/project-context.mjs.map +1 -1
- package/dist/esm/project-run/result.mjs +2 -0
- package/dist/esm/project-run/result.mjs.map +1 -1
- package/dist/esm/project-run/run.mjs +1 -1
- package/dist/esm/project-run/run.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +166 -0
- package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/core.mjs +163 -0
- package/dist/esm/project-run/task-scheduler/admission-core/core.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/input.mjs +119 -0
- package/dist/esm/project-run/task-scheduler/admission-core/input.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs +124 -0
- package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs +99 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +198 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +151 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +121 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs +65 -0
- package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs +25 -0
- package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs +55 -0
- package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs +46 -0
- package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs +110 -0
- package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/execution-state.mjs +34 -5
- package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs +46 -0
- package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs +54 -26
- package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/graph.mjs +79 -3
- package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +207 -0
- package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs +116 -0
- package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/policy.mjs +67 -0
- package/dist/esm/project-run/task-scheduler/measurement/policy.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/summary.mjs +123 -0
- package/dist/esm/project-run/task-scheduler/measurement/summary.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +158 -0
- package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +90 -62
- package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +20 -6
- package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +5 -105
- package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +0 -9
- package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +48 -28
- package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -1
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +89 -0
- package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs +94 -0
- package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +66 -0
- package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -0
- package/dist/esm/project-run/task-scheduler/scheduler.mjs +171 -114
- package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
- package/docs/api-mechanics.md +64 -137
- package/docs/changelog.md +157 -0
- package/docs/checks/duplicate-detection.md +111 -59
- package/docs/checks/file-metrics.md +46 -43
- package/docs/checks/function-metrics.md +100 -163
- package/docs/checks/json-schema-validation.md +43 -36
- package/docs/checks/json-validation.md +38 -25
- package/docs/checks/maintenance-reminders.md +41 -29
- package/docs/checks/markdown-link-validation.md +82 -54
- package/docs/checks/secret-detection.md +129 -0
- package/docs/examples/artifacts/mixed-outcomes/definition.ts +5 -5
- package/docs/guides/cache-results.md +63 -0
- package/docs/guides/callbacks.md +34 -0
- package/docs/guides/check-dependencies.md +121 -0
- package/docs/guides/collecting-project-files.md +59 -0
- package/docs/guides/extending-check-lifecycle.md +112 -0
- package/docs/guides/finding-waivers.md +45 -0
- package/docs/guides/learned-scheduling.md +83 -0
- package/docs/guides/presenting-findings.md +54 -0
- package/docs/guides/run-outputs.md +145 -0
- package/docs/guides/scheduling.md +208 -0
- package/docs/guides/simulating-admission.md +55 -0
- package/docs/output.md +11 -20
- package/licenses/Lizard-1.24.0-MIT.txt +30 -0
- package/{third-party-licenses/momoa-3.3.12-LICENSE → licenses/Lizard-1.24.0-lizard.py-Apache-2.0.txt} +1 -0
- package/licenses/Pygments-2.18.0-BSD-2-Clause.txt +25 -0
- package/licenses/analyzer-translations-NOTICE.md +24 -0
- package/licenses/lizard-1.24.0-provenance.json +957 -0
- package/package.json +18 -6
- package/src/cache/cache-json-by-key.ts +304 -0
- package/src/check/check.ts +67 -17
- package/src/check/finding-presentation.ts +67 -0
- package/src/check/inherited-collection.ts +1 -1
- package/src/check-settlement/fact-validation.ts +29 -39
- package/src/check-settlement/outcome-normalization.ts +17 -35
- package/src/check-settlement/reason-shape.ts +20 -0
- package/src/check-settlement/record-store.ts +18 -15
- package/src/check-settlement/session.ts +12 -3
- package/src/data-boundary/closed-values.ts +29 -0
- package/src/data-boundary/value-shapes.ts +12 -0
- package/src/index.ts +70 -2
- package/src/learned-critical-path/duration-model/bounded-history.ts +108 -0
- package/src/learned-critical-path/duration-model/prediction.ts +181 -0
- package/src/learned-critical-path/duration-model/preparation.ts +77 -0
- package/src/learned-critical-path/duration-model/recording.ts +208 -0
- package/src/learned-critical-path/duration-model/storage.ts +252 -0
- package/src/learned-critical-path/selection-layers.ts +72 -0
- package/src/learned-critical-path/static-decision.ts +105 -0
- package/src/learned-critical-path/strategy.ts +299 -0
- package/src/machine-output/v4/atomic-publication.ts +1 -16
- package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +46 -0
- package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +95 -0
- package/src/package-checks/code-quality-findings/policy.ts +23 -0
- package/src/package-checks/duplicate-detection/area-policy.ts +24 -13
- package/src/package-checks/duplicate-detection/cache/identity.ts +1 -1
- package/src/package-checks/duplicate-detection/default-check.ts +1 -1
- package/src/package-checks/duplicate-detection/execution.ts +82 -22
- package/src/package-checks/duplicate-detection/finding-messages.ts +75 -0
- package/src/package-checks/duplicate-detection/finding-waiver-identity.ts +68 -0
- package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
- package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +1 -1
- package/src/package-checks/duplicate-detection/jscpd/json-report.ts +24 -5
- package/src/package-checks/duplicate-detection/jscpd/scanner.ts +6 -7
- package/src/package-checks/duplicate-detection/options-resolution.ts +32 -57
- package/src/package-checks/duplicate-detection/options-validation.ts +23 -31
- package/src/package-checks/duplicate-detection/options.ts +21 -1
- package/src/package-checks/duplicate-detection/records.ts +65 -12
- package/src/package-checks/file-metrics/execution.ts +16 -17
- package/src/package-checks/file-metrics/finding-messages.ts +29 -0
- package/src/package-checks/file-metrics/options-resolution.ts +19 -52
- package/src/package-checks/file-metrics/options-validation.ts +23 -32
- package/src/package-checks/file-metrics/records.ts +11 -23
- package/src/package-checks/file-metrics/scc/availability.ts +1 -1
- package/src/package-checks/file-metrics/scc/parser.ts +4 -4
- package/src/package-checks/file-metrics/scc/scanner.ts +2 -2
- package/src/package-checks/function-metrics/analysis.ts +76 -21
- package/src/package-checks/function-metrics/analyzer/analysis-context.ts +749 -0
- package/src/package-checks/function-metrics/analyzer/analysis-model.ts +421 -0
- package/src/package-checks/function-metrics/analyzer/contracts.ts +54 -0
- package/src/package-checks/function-metrics/analyzer/extension-output.ts +261 -0
- package/src/package-checks/function-metrics/analyzer/extensions/extension-base.ts +33 -0
- package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +27 -0
- package/src/package-checks/function-metrics/analyzer/extensions/lizardnd.ts +144 -0
- package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +345 -0
- package/src/package-checks/function-metrics/analyzer/extensions/registry.ts +157 -0
- package/src/package-checks/function-metrics/analyzer/pipeline.ts +311 -0
- package/src/package-checks/function-metrics/analyzer/port-facade.ts +142 -0
- package/src/package-checks/function-metrics/analyzer/reader-registry.ts +84 -0
- package/src/package-checks/function-metrics/analyzer/readers/csharp.ts +110 -0
- package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +501 -0
- package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +294 -0
- package/src/package-checks/function-metrics/analyzer/readers/gdscript.ts +42 -0
- package/src/package-checks/function-metrics/analyzer/readers/go.ts +53 -0
- package/src/package-checks/function-metrics/analyzer/readers/java-body-states.ts +141 -0
- package/src/package-checks/function-metrics/analyzer/readers/java.ts +270 -0
- package/src/package-checks/function-metrics/analyzer/readers/javascript.ts +19 -0
- package/src/package-checks/function-metrics/analyzer/readers/kotlin.ts +120 -0
- package/src/package-checks/function-metrics/analyzer/readers/lua.ts +68 -0
- package/src/package-checks/function-metrics/analyzer/readers/objc.ts +107 -0
- package/src/package-checks/function-metrics/analyzer/readers/perl.ts +340 -0
- package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +246 -0
- package/src/package-checks/function-metrics/analyzer/readers/php.ts +63 -0
- package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +306 -0
- package/src/package-checks/function-metrics/analyzer/readers/python.ts +431 -0
- package/src/package-checks/function-metrics/analyzer/readers/r.ts +234 -0
- package/src/package-checks/function-metrics/analyzer/readers/ruby.ts +88 -0
- package/src/package-checks/function-metrics/analyzer/readers/rust.ts +47 -0
- package/src/package-checks/function-metrics/analyzer/readers/scala.ts +60 -0
- package/src/package-checks/function-metrics/analyzer/readers/solidity.ts +32 -0
- package/src/package-checks/function-metrics/analyzer/readers/st.ts +161 -0
- package/src/package-checks/function-metrics/analyzer/readers/swift.ts +116 -0
- package/src/package-checks/function-metrics/analyzer/readers/tsx.ts +165 -0
- package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +90 -0
- package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +593 -0
- package/src/package-checks/function-metrics/analyzer/readers/vue.ts +43 -0
- package/src/package-checks/function-metrics/analyzer/readers/zig.ts +35 -0
- package/src/package-checks/function-metrics/analyzer/shared/clike.ts +541 -0
- package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +682 -0
- package/src/package-checks/function-metrics/analyzer/shared/golike.ts +143 -0
- package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +75 -0
- package/src/package-checks/function-metrics/analyzer/shared/rubylike.ts +161 -0
- package/src/package-checks/function-metrics/analyzer/shared/script-language.ts +50 -0
- package/src/package-checks/function-metrics/analyzer-adapter.ts +84 -0
- package/src/package-checks/function-metrics/analyzer-worker-contract.ts +10 -0
- package/src/package-checks/function-metrics/analyzer-worker-port.ts +150 -0
- package/src/package-checks/function-metrics/analyzer-worker.ts +31 -0
- package/src/package-checks/function-metrics/constructor.ts +2 -2
- package/src/package-checks/function-metrics/execution.ts +94 -39
- package/src/package-checks/function-metrics/finding-messages.ts +95 -0
- package/src/package-checks/function-metrics/finding-waiver-identity.ts +36 -0
- package/src/package-checks/function-metrics/measurement-model.ts +15 -1
- package/src/package-checks/function-metrics/measurement.ts +221 -36
- package/src/package-checks/function-metrics/options-resolution.ts +39 -75
- package/src/package-checks/function-metrics/options-validation.ts +30 -39
- package/src/package-checks/function-metrics/options.ts +27 -11
- package/src/package-checks/function-metrics/records.ts +73 -7
- package/src/package-checks/function-metrics/target-files.ts +10 -70
- package/src/package-checks/{file-metrics/scc → host-environment}/csv.ts +1 -2
- package/src/package-checks/host-environment/git.ts +2 -2
- package/src/package-checks/host-environment/process.ts +10 -0
- package/src/package-checks/json-schema-validation/final-data.ts +8 -0
- package/src/package-checks/json-schema-validation/options-validation.ts +16 -23
- package/src/package-checks/json-schema-validation/options.ts +23 -0
- package/src/package-checks/json-validation/final-data.ts +5 -0
- package/src/package-checks/json-validation/options-validation.ts +4 -18
- package/src/package-checks/maintenance-reminders/final-data.ts +18 -0
- package/src/package-checks/markdown-link-validation/default-check.ts +9 -3
- package/src/package-checks/markdown-link-validation/execution.ts +51 -57
- package/src/package-checks/markdown-link-validation/filesystem-probes.ts +108 -51
- package/src/package-checks/markdown-link-validation/final-data.ts +5 -0
- package/src/package-checks/markdown-link-validation/finding-messages.ts +48 -0
- package/src/package-checks/markdown-link-validation/local-resolution.ts +17 -9
- package/src/package-checks/markdown-link-validation/local-resolver.ts +5 -2
- package/src/package-checks/markdown-link-validation/options-resolution.ts +31 -3
- package/src/package-checks/markdown-link-validation/options-validation.ts +27 -19
- package/src/package-checks/markdown-link-validation/options.ts +15 -0
- package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +246 -0
- package/src/package-checks/markdown-link-validation/parse-facts-cache.ts +154 -0
- package/src/package-checks/markdown-link-validation/resolver-engine.ts +75 -65
- package/src/package-checks/markdown-link-validation/source-reader.ts +86 -0
- package/src/package-checks/markdown-link-validation/unavailable-reasons.ts +42 -0
- package/src/package-checks/project-files/collection.ts +1 -1
- package/src/package-checks/project-files/configuration.ts +3 -14
- package/src/package-checks/project-files/gitlink-revision.ts +1 -1
- package/src/package-checks/project-files/gitlink-worktree.ts +1 -1
- package/src/package-checks/project-files/public-collection.ts +92 -0
- package/src/package-checks/project-files/revision-worktree-files.ts +1 -1
- package/src/package-checks/secret-detection/classification.ts +30 -0
- package/src/package-checks/secret-detection/default-check.ts +50 -0
- package/src/package-checks/secret-detection/execution.ts +247 -0
- package/src/package-checks/secret-detection/final-data.ts +57 -0
- package/src/package-checks/secret-detection/finding-waiver-identity.ts +37 -0
- package/src/package-checks/secret-detection/input-preparation.ts +233 -0
- package/src/package-checks/secret-detection/options-resolution.ts +65 -0
- package/src/package-checks/secret-detection/options-validation.ts +27 -0
- package/src/package-checks/secret-detection/options.ts +36 -0
- package/src/package-checks/secret-detection/records.ts +77 -0
- package/src/package-checks/secret-detection/secretlint/adapter.ts +123 -0
- package/src/project-definition/check-tree/authoring.ts +29 -230
- package/src/project-definition/check-tree/check-fields-authoring.ts +227 -0
- package/src/project-definition/check-tree/collection-authoring.ts +13 -0
- package/src/project-definition/check-tree/materialization.ts +9 -1
- package/src/project-definition/check-tree/resolution.ts +80 -22
- package/src/project-definition/check-tree/scheduling-authoring.ts +114 -0
- package/src/project-definition/declarative-snapshot.ts +87 -0
- package/src/project-definition/output-defaults.ts +32 -1
- package/src/project-definition/output-validation.ts +15 -15
- package/src/project-definition/progress-rendering-output.ts +121 -0
- package/src/project-definition/project-definition-validation.ts +117 -18
- package/src/project-definition/project-definition.ts +198 -61
- package/src/project-definition/resource-unit-mapping.ts +25 -0
- package/src/project-definition/scheduler-policy.ts +553 -0
- package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +80 -0
- package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +27 -0
- package/src/project-run/admission-strategy-provider/provider.ts +45 -0
- package/src/project-run/aggregation.ts +10 -5
- package/src/project-run/check-execution/callback.ts +50 -8
- package/src/project-run/check-execution/console-capture.ts +262 -0
- package/src/project-run/check-execution/dependencies.ts +43 -6
- package/src/project-run/check-execution/execution-finalization.ts +99 -25
- package/src/project-run/check-execution/execution-settlement.ts +19 -11
- package/src/project-run/check-execution/flag-controls.ts +132 -0
- package/src/project-run/check-execution/lifecycle.ts +21 -0
- package/src/project-run/check-execution/messages.ts +8 -0
- package/src/project-run/check-execution/plan.ts +12 -8
- package/src/project-run/check-execution/preflight.ts +23 -43
- package/src/project-run/check-execution/resolved-checks.ts +165 -126
- package/src/project-run/check-execution/resolved-execution-result.ts +22 -0
- package/src/project-run/{completion.ts → completion/completion.ts} +17 -57
- package/src/project-run/{machine-publication.ts → completion/machine-publication.ts} +4 -4
- package/src/project-run/completion/result-resolver.ts +60 -0
- package/src/project-run/controls/contract.ts +25 -2
- package/src/project-run/controls/outputs-override-validation.ts +83 -60
- package/src/project-run/controls/validation-result.ts +17 -6
- package/src/project-run/controls/validation.ts +107 -12
- package/src/project-run/diagnostic-logging/logger.ts +132 -207
- package/src/project-run/diagnostic-logging/observation-rendering.ts +203 -0
- package/src/project-run/invocation/candidate.ts +86 -0
- package/src/project-run/invocation/creation.ts +116 -0
- package/src/project-run/invocation/paths.ts +154 -0
- package/src/project-run/invocation/progress.ts +38 -0
- package/src/project-run/{invocation.ts → invocation/run.ts} +125 -120
- package/src/project-run/invocation/scheduler.ts +75 -0
- package/src/project-run/{output-configuration.ts → outputs/configuration.ts} +6 -5
- package/src/project-run/outputs/status.ts +161 -0
- package/src/project-run/progress-rendering/presentation.ts +118 -26
- package/src/project-run/progress-rendering/renderer-formatting.ts +166 -19
- package/src/project-run/progress-rendering/renderer-lifecycle.ts +38 -3
- package/src/project-run/progress-rendering/renderer.ts +13 -2
- package/src/project-run/project-context.ts +3 -2
- package/src/project-run/result.ts +49 -3
- package/src/project-run/run.ts +7 -6
- package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +316 -0
- package/src/project-run/task-scheduler/admission-core/core.ts +278 -0
- package/src/project-run/task-scheduler/admission-core/input.ts +138 -0
- package/src/project-run/task-scheduler/admission-core/projection.ts +164 -0
- package/src/project-run/task-scheduler/admission-core/selection-index.ts +165 -0
- package/src/project-run/task-scheduler/admission-core/selection-query.ts +295 -0
- package/src/project-run/task-scheduler/admission-core/selection-seed.ts +252 -0
- package/src/project-run/task-scheduler/admission-core/selection-transition.ts +236 -0
- package/src/project-run/task-scheduler/admission-core/selection.ts +140 -0
- package/src/project-run/task-scheduler/admission-core/trace.ts +177 -0
- package/src/project-run/task-scheduler/admission-scope-layers.ts +44 -0
- package/src/project-run/task-scheduler/admission-selection-policy.ts +116 -0
- package/src/project-run/task-scheduler/critical-path-ranking.ts +76 -0
- package/src/project-run/task-scheduler/custom-admission-policy.ts +128 -0
- package/src/project-run/task-scheduler/execution-state.ts +97 -6
- package/src/project-run/task-scheduler/forced-block-effect-replay.ts +68 -0
- package/src/project-run/task-scheduler/graph-validation.ts +77 -31
- package/src/project-run/task-scheduler/graph.ts +111 -3
- package/src/project-run/task-scheduler/measurement/diagnostics.ts +261 -0
- package/src/project-run/task-scheduler/measurement/integrals.ts +177 -0
- package/src/project-run/task-scheduler/measurement/policy.ts +105 -0
- package/src/project-run/task-scheduler/measurement/summary.ts +175 -0
- package/src/project-run/task-scheduler/measurement/timing.ts +190 -0
- package/src/project-run/task-scheduler/scheduler-admission-decision.ts +143 -134
- package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +34 -9
- package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +28 -170
- package/src/project-run/task-scheduler/scheduler-decision-model.ts +36 -40
- package/src/project-run/task-scheduler/scheduler-decision.ts +68 -36
- package/src/project-run/task-scheduler/scheduler-observation.ts +124 -0
- package/src/project-run/task-scheduler/scheduler-task-lifecycle.ts +150 -0
- package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +95 -0
- package/src/project-run/task-scheduler/scheduler.ts +216 -171
- package/types/cache/cache-json-by-key.d.ts +53 -0
- package/types/check/check.d.ts +62 -17
- package/types/check/finding-presentation.d.ts +25 -0
- package/types/check/inherited-collection.d.ts +1 -1
- package/types/check-settlement/reason-shape.d.ts +5 -0
- package/types/check-settlement/record-store.d.ts +2 -2
- package/types/check-settlement/session.d.ts +3 -1
- package/types/data-boundary/closed-values.d.ts +8 -0
- package/types/data-boundary/value-shapes.d.ts +3 -0
- package/types/index.d.ts +22 -7
- package/types/learned-critical-path/duration-model/bounded-history.d.ts +34 -0
- package/types/learned-critical-path/duration-model/prediction.d.ts +32 -0
- package/types/learned-critical-path/duration-model/preparation.d.ts +28 -0
- package/types/learned-critical-path/duration-model/recording.d.ts +28 -0
- package/types/learned-critical-path/duration-model/storage.d.ts +12 -0
- package/types/learned-critical-path/selection-layers.d.ts +14 -0
- package/types/learned-critical-path/static-decision.d.ts +3 -0
- package/types/learned-critical-path/strategy.d.ts +35 -0
- package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +7 -0
- package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +34 -0
- package/types/package-checks/code-quality-findings/policy.d.ts +4 -0
- package/types/package-checks/duplicate-detection/area-policy.d.ts +1 -1
- package/types/package-checks/duplicate-detection/finding-messages.d.ts +7 -0
- package/types/package-checks/duplicate-detection/finding-waiver-identity.d.ts +3 -0
- package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +1 -1
- package/types/package-checks/duplicate-detection/options.d.ts +18 -1
- package/types/package-checks/duplicate-detection/records.d.ts +20 -3
- package/types/package-checks/file-metrics/finding-messages.d.ts +4 -0
- package/types/package-checks/file-metrics/records.d.ts +5 -10
- package/types/package-checks/file-metrics/scc/parser.d.ts +4 -4
- package/types/package-checks/function-metrics/analysis.d.ts +1 -1
- package/types/package-checks/function-metrics/analyzer/analysis-context.d.ts +174 -0
- package/types/package-checks/function-metrics/analyzer/analysis-model.d.ts +135 -0
- package/types/package-checks/function-metrics/analyzer/contracts.d.ts +48 -0
- package/types/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.d.ts +13 -0
- package/types/package-checks/function-metrics/analyzer/extensions/lizardnd.d.ts +28 -0
- package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +99 -0
- package/types/package-checks/function-metrics/analyzer/extensions/registry.d.ts +34 -0
- package/types/package-checks/function-metrics/analyzer/pipeline.d.ts +67 -0
- package/types/package-checks/function-metrics/analyzer/port-facade.d.ts +38 -0
- package/types/package-checks/function-metrics/analyzer/reader-registry.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/csharp.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/erlang.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/fortran.d.ts +29 -0
- package/types/package-checks/function-metrics/analyzer/readers/gdscript.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/go.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/java-body-states.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/java.d.ts +44 -0
- package/types/package-checks/function-metrics/analyzer/readers/javascript.d.ts +14 -0
- package/types/package-checks/function-metrics/analyzer/readers/kotlin.d.ts +23 -0
- package/types/package-checks/function-metrics/analyzer/readers/lua.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/readers/objc.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/perl.d.ts +28 -0
- package/types/package-checks/function-metrics/analyzer/readers/php-states.d.ts +41 -0
- package/types/package-checks/function-metrics/analyzer/readers/php.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/plsql.d.ts +24 -0
- package/types/package-checks/function-metrics/analyzer/readers/python.d.ts +50 -0
- package/types/package-checks/function-metrics/analyzer/readers/r.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/ruby.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/readers/rust.d.ts +20 -0
- package/types/package-checks/function-metrics/analyzer/readers/scala.d.ts +20 -0
- package/types/package-checks/function-metrics/analyzer/readers/solidity.d.ts +19 -0
- package/types/package-checks/function-metrics/analyzer/readers/st.d.ts +37 -0
- package/types/package-checks/function-metrics/analyzer/readers/swift.d.ts +30 -0
- package/types/package-checks/function-metrics/analyzer/readers/tsx.d.ts +15 -0
- package/types/package-checks/function-metrics/analyzer/readers/ttcn.d.ts +22 -0
- package/types/package-checks/function-metrics/analyzer/readers/typescript.d.ts +35 -0
- package/types/package-checks/function-metrics/analyzer/readers/vue.d.ts +18 -0
- package/types/package-checks/function-metrics/analyzer/readers/zig.d.ts +19 -0
- package/types/package-checks/function-metrics/analyzer/shared/clike.d.ts +101 -0
- package/types/package-checks/function-metrics/analyzer/shared/code-reader.d.ts +176 -0
- package/types/package-checks/function-metrics/analyzer/shared/golike.d.ts +39 -0
- package/types/package-checks/function-metrics/analyzer/shared/js-style-regex.d.ts +16 -0
- package/types/package-checks/function-metrics/analyzer/shared/rubylike.d.ts +40 -0
- package/types/package-checks/function-metrics/analyzer/shared/script-language.d.ts +17 -0
- package/types/package-checks/function-metrics/analyzer-adapter.d.ts +26 -0
- package/types/package-checks/function-metrics/analyzer-worker-contract.d.ts +5 -0
- package/types/package-checks/function-metrics/analyzer-worker-port.d.ts +24 -0
- package/types/package-checks/function-metrics/analyzer-worker.d.ts +1 -0
- package/types/package-checks/function-metrics/constructor.d.ts +1 -1
- package/types/package-checks/function-metrics/execution.d.ts +5 -2
- package/types/package-checks/function-metrics/finding-messages.d.ts +9 -0
- package/types/package-checks/function-metrics/finding-waiver-identity.d.ts +2 -0
- package/types/package-checks/function-metrics/measurement-model.d.ts +13 -1
- package/types/package-checks/function-metrics/measurement.d.ts +22 -7
- package/types/package-checks/function-metrics/options.d.ts +23 -10
- package/types/package-checks/function-metrics/records.d.ts +24 -5
- package/types/package-checks/function-metrics/target-files.d.ts +4 -3
- package/types/package-checks/host-environment/csv.d.ts +2 -0
- package/types/package-checks/host-environment/git.d.ts +1 -1
- package/types/package-checks/host-environment/process.d.ts +5 -0
- package/types/package-checks/json-schema-validation/final-data.d.ts +8 -0
- package/types/package-checks/json-schema-validation/options.d.ts +31 -3
- package/types/package-checks/json-validation/final-data.d.ts +5 -0
- package/types/package-checks/maintenance-reminders/final-data.d.ts +18 -0
- package/types/package-checks/markdown-link-validation/default-check.d.ts +9 -3
- package/types/package-checks/markdown-link-validation/execution.d.ts +1 -3
- package/types/package-checks/markdown-link-validation/final-data.d.ts +5 -0
- package/types/package-checks/markdown-link-validation/finding-messages.d.ts +4 -0
- package/types/package-checks/markdown-link-validation/local-resolution.d.ts +12 -6
- package/types/package-checks/markdown-link-validation/local-resolver.d.ts +2 -1
- package/types/package-checks/markdown-link-validation/options.d.ts +15 -0
- package/types/package-checks/markdown-link-validation/parse-facts-cache-payload.d.ts +24 -0
- package/types/package-checks/markdown-link-validation/parse-facts-cache.d.ts +13 -0
- package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +6 -4
- package/types/package-checks/markdown-link-validation/source-reader.d.ts +11 -0
- package/types/package-checks/markdown-link-validation/unavailable-reasons.d.ts +4 -0
- package/types/package-checks/project-files/public-collection.d.ts +16 -0
- package/types/package-checks/secret-detection/classification.d.ts +12 -0
- package/types/package-checks/secret-detection/default-check.d.ts +11 -0
- package/types/package-checks/secret-detection/execution.d.ts +14 -0
- package/types/package-checks/secret-detection/final-data.d.ts +15 -0
- package/types/package-checks/secret-detection/finding-waiver-identity.d.ts +5 -0
- package/types/package-checks/secret-detection/input-preparation.d.ts +24 -0
- package/types/package-checks/secret-detection/options-resolution.d.ts +6 -0
- package/types/package-checks/secret-detection/options-validation.d.ts +3 -0
- package/types/package-checks/secret-detection/options.d.ts +32 -0
- package/types/package-checks/secret-detection/records.d.ts +35 -0
- package/types/package-checks/secret-detection/secretlint/adapter.d.ts +28 -0
- package/types/project-definition/check-tree/authoring.d.ts +11 -14
- package/types/project-definition/check-tree/check-fields-authoring.d.ts +25 -0
- package/types/project-definition/check-tree/collection-authoring.d.ts +2 -0
- package/types/project-definition/check-tree/resolution.d.ts +8 -3
- package/types/project-definition/check-tree/scheduling-authoring.d.ts +19 -0
- package/types/project-definition/declarative-snapshot.d.ts +7 -0
- package/types/project-definition/output-defaults.d.ts +7 -0
- package/types/project-definition/output-validation.d.ts +2 -1
- package/types/project-definition/progress-rendering-output.d.ts +41 -0
- package/types/project-definition/project-definition.d.ts +61 -16
- package/types/project-definition/resource-unit-mapping.d.ts +4 -0
- package/types/project-definition/scheduler-policy.d.ts +497 -0
- package/types/project-run/admission-strategy-provider/custom-strategy-preparation.d.ts +9 -0
- package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +23 -0
- package/types/project-run/admission-strategy-provider/provider.d.ts +13 -0
- package/types/project-run/aggregation.d.ts +1 -1
- package/types/project-run/check-execution/callback.d.ts +5 -1
- package/types/project-run/check-execution/console-capture.d.ts +18 -0
- package/types/project-run/check-execution/dependencies.d.ts +1 -1
- package/types/project-run/check-execution/execution-finalization.d.ts +17 -7
- package/types/project-run/check-execution/execution-settlement.d.ts +5 -2
- package/types/project-run/check-execution/flag-controls.d.ts +27 -0
- package/types/project-run/check-execution/lifecycle.d.ts +20 -0
- package/types/project-run/check-execution/messages.d.ts +2 -0
- package/types/project-run/check-execution/plan.d.ts +2 -3
- package/types/project-run/check-execution/preflight.d.ts +6 -5
- package/types/project-run/check-execution/resolved-checks.d.ts +32 -38
- package/types/project-run/check-execution/resolved-execution-result.d.ts +21 -0
- package/types/project-run/{completion.d.ts → completion/completion.d.ts} +4 -4
- package/types/project-run/{machine-publication.d.ts → completion/machine-publication.d.ts} +3 -3
- package/types/project-run/completion/result-resolver.d.ts +4 -0
- package/types/project-run/controls/contract.d.ts +25 -2
- package/types/project-run/controls/outputs-override-validation.d.ts +2 -1
- package/types/project-run/controls/validation-result.d.ts +12 -4
- package/types/project-run/diagnostic-logging/logger.d.ts +34 -4
- package/types/project-run/diagnostic-logging/observation-rendering.d.ts +7 -0
- package/types/project-run/invocation/candidate.d.ts +12 -0
- package/types/project-run/{invocation-creation.d.ts → invocation/creation.d.ts} +3 -3
- package/types/project-run/invocation/paths.d.ts +40 -0
- package/types/project-run/invocation/progress.d.ts +11 -0
- package/types/project-run/invocation/run.d.ts +43 -0
- package/types/project-run/invocation/scheduler.d.ts +16 -0
- package/types/project-run/outputs/configuration.d.ts +3 -0
- package/types/project-run/outputs/status.d.ts +48 -0
- package/types/project-run/progress-rendering/presentation.d.ts +9 -5
- package/types/project-run/progress-rendering/renderer-formatting.d.ts +8 -0
- package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +6 -1
- package/types/project-run/progress-rendering/renderer.d.ts +7 -1
- package/types/project-run/project-context.d.ts +2 -1
- package/types/project-run/result.d.ts +37 -3
- package/types/project-run/run.d.ts +6 -5
- package/types/project-run/task-scheduler/admission-core/compiled-graph.d.ts +31 -0
- package/types/project-run/task-scheduler/admission-core/core.d.ts +57 -0
- package/types/project-run/task-scheduler/admission-core/input.d.ts +4 -0
- package/types/project-run/task-scheduler/admission-core/projection.d.ts +22 -0
- package/types/project-run/task-scheduler/admission-core/selection-index.d.ts +61 -0
- package/types/project-run/task-scheduler/admission-core/selection-query.d.ts +28 -0
- package/types/project-run/task-scheduler/admission-core/selection-seed.d.ts +9 -0
- package/types/project-run/task-scheduler/admission-core/selection-transition.d.ts +4 -0
- package/types/project-run/task-scheduler/admission-core/selection.d.ts +20 -0
- package/types/project-run/task-scheduler/admission-scope-layers.d.ts +8 -0
- package/types/project-run/task-scheduler/admission-selection-policy.d.ts +31 -0
- package/types/project-run/task-scheduler/critical-path-ranking.d.ts +19 -0
- package/types/project-run/task-scheduler/custom-admission-policy.d.ts +6 -0
- package/types/project-run/task-scheduler/execution-state.d.ts +43 -1
- package/types/project-run/task-scheduler/forced-block-effect-replay.d.ts +9 -0
- package/types/project-run/task-scheduler/graph-validation.d.ts +3 -2
- package/types/project-run/task-scheduler/graph.d.ts +15 -0
- package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +47 -0
- package/types/project-run/task-scheduler/measurement/integrals.d.ts +27 -0
- package/types/project-run/task-scheduler/measurement/policy.d.ts +10 -0
- package/types/project-run/task-scheduler/measurement/summary.d.ts +3 -0
- package/types/project-run/task-scheduler/measurement/timing.d.ts +33 -0
- package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +13 -1
- package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +20 -19
- package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +38 -22
- package/types/project-run/task-scheduler/scheduler-decision.d.ts +4 -1
- package/types/project-run/task-scheduler/scheduler-observation.d.ts +14 -0
- package/types/project-run/task-scheduler/scheduler-task-lifecycle.d.ts +18 -0
- package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +9 -0
- package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +0 -64
- package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +0 -17
- package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +0 -138
- package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +0 -1
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +0 -35
- package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +0 -1
- package/dist/esm/package-checks/host-environment/process/command.mjs +0 -13
- package/dist/esm/package-checks/host-environment/process/command.mjs.map +0 -1
- package/dist/esm/project-run/completion.mjs.map +0 -1
- package/dist/esm/project-run/invocation-creation.mjs +0 -111
- package/dist/esm/project-run/invocation-creation.mjs.map +0 -1
- package/dist/esm/project-run/invocation.mjs.map +0 -1
- package/dist/esm/project-run/machine-publication.mjs.map +0 -1
- package/dist/esm/project-run/output-configuration.mjs.map +0 -1
- package/dist/esm/project-run/output-status.mjs +0 -43
- package/dist/esm/project-run/output-status.mjs.map +0 -1
- package/src/package-checks/function-metrics/lizard/availability.ts +0 -90
- package/src/package-checks/function-metrics/lizard/csv.ts +0 -20
- package/src/package-checks/function-metrics/lizard/parser.ts +0 -179
- package/src/package-checks/function-metrics/lizard/scanner.ts +0 -62
- package/src/package-checks/host-environment/process/command.ts +0 -21
- package/src/project-run/invocation-creation.ts +0 -160
- package/src/project-run/output-status.ts +0 -69
- package/types/package-checks/file-metrics/scc/csv.d.ts +0 -1
- package/types/package-checks/function-metrics/lizard/availability.d.ts +0 -11
- package/types/package-checks/function-metrics/lizard/csv.d.ts +0 -1
- package/types/package-checks/function-metrics/lizard/parser.d.ts +0 -17
- package/types/package-checks/function-metrics/lizard/scanner.d.ts +0 -15
- package/types/package-checks/host-environment/process/command.d.ts +0 -7
- package/types/project-run/invocation.d.ts +0 -34
- package/types/project-run/output-configuration.d.ts +0 -3
- package/types/project-run/output-status.d.ts +0 -21
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { canonicalJsonText } from "../../data-boundary/canonical-data.mjs";
|
|
5
|
+
import { hasExactPlainRecordKeys, snapshotClosedArray, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
|
|
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
|
+
const ENVELOPE_KEYS = [
|
|
8
|
+
"envelopeVersion",
|
|
9
|
+
"latestObservationSequence",
|
|
10
|
+
"modelVersion",
|
|
11
|
+
"series"
|
|
12
|
+
];
|
|
13
|
+
const SERIES_KEYS = ["identityDigest", "latestObservationSequence", "samples"];
|
|
14
|
+
const SAMPLE_KEYS = ["durationMs", "observationSequence", "settlementKind"];
|
|
15
|
+
/** Reads untrusted local state and always degrades to an empty model on an I/O or format fault. */
|
|
16
|
+
export async function loadSchedulerHistory(stateDirectory) {
|
|
17
|
+
let source;
|
|
18
|
+
try {
|
|
19
|
+
source = await fs.readFile(schedulerHistoryPath(stateDirectory), "utf8");
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return Object.freeze({
|
|
23
|
+
history: emptySchedulerHistory(),
|
|
24
|
+
observation: isMissingPath(error) ? "missing" : "failed"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const parsed = parseSchedulerHistoryEnvelope(JSON.parse(source));
|
|
29
|
+
if (parsed.kind === "incompatible") {
|
|
30
|
+
return Object.freeze({ history: emptySchedulerHistory(), observation: "incompatible" });
|
|
31
|
+
}
|
|
32
|
+
if (parsed.kind === "invalid") {
|
|
33
|
+
return Object.freeze({ history: emptySchedulerHistory(), observation: "invalid" });
|
|
34
|
+
}
|
|
35
|
+
return Object.freeze({ history: parsed.history, observation: "loaded" });
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return Object.freeze({ history: emptySchedulerHistory(), observation: "invalid" });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Publishes a full closed model through a same-directory temporary file and atomic replacement. */
|
|
42
|
+
export async function writeSchedulerHistory(stateDirectory, history) {
|
|
43
|
+
let temporaryPath;
|
|
44
|
+
try {
|
|
45
|
+
const targetPath = schedulerHistoryPath(stateDirectory);
|
|
46
|
+
temporaryPath = join(stateDirectory, `.vibe-check-scheduler-history-${randomUUID()}.tmp`);
|
|
47
|
+
await fs.mkdir(stateDirectory, { recursive: true });
|
|
48
|
+
await fs.writeFile(temporaryPath, schedulerHistoryText(history), {
|
|
49
|
+
encoding: "utf8",
|
|
50
|
+
flag: "wx"
|
|
51
|
+
});
|
|
52
|
+
await fs.rename(temporaryPath, targetPath);
|
|
53
|
+
return "stored";
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return "failed";
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
if (temporaryPath !== undefined) {
|
|
60
|
+
await fs.rm(temporaryPath, { force: true }).catch(() => undefined);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export function schedulerHistoryPath(stateDirectory) {
|
|
65
|
+
return join(stateDirectory, SCHEDULER_HISTORY_FILE_NAME);
|
|
66
|
+
}
|
|
67
|
+
function schedulerHistoryText(history) {
|
|
68
|
+
return canonicalJsonText({
|
|
69
|
+
envelopeVersion: SCHEDULER_HISTORY_ENVELOPE_VERSION,
|
|
70
|
+
latestObservationSequence: history.latestObservationSequence,
|
|
71
|
+
modelVersion: SCHEDULER_HISTORY_MODEL_VERSION,
|
|
72
|
+
series: history.series.map((series) => ({
|
|
73
|
+
identityDigest: series.identityDigest,
|
|
74
|
+
latestObservationSequence: series.latestObservationSequence,
|
|
75
|
+
samples: series.samples.map((sample) => ({
|
|
76
|
+
durationMs: sample.durationMs,
|
|
77
|
+
observationSequence: sample.observationSequence,
|
|
78
|
+
settlementKind: sample.settlementKind
|
|
79
|
+
}))
|
|
80
|
+
}))
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function parseSchedulerHistoryEnvelope(value) {
|
|
84
|
+
const envelope = snapshotClosedRecord(value);
|
|
85
|
+
if (envelope === undefined || !hasExactPlainRecordKeys(envelope, ENVELOPE_KEYS)) {
|
|
86
|
+
return Object.freeze({ kind: "invalid" });
|
|
87
|
+
}
|
|
88
|
+
if (typeof envelope.envelopeVersion !== "string" ||
|
|
89
|
+
typeof envelope.modelVersion !== "string" ||
|
|
90
|
+
!isObservationSequence(envelope.latestObservationSequence)) {
|
|
91
|
+
return Object.freeze({ kind: "invalid" });
|
|
92
|
+
}
|
|
93
|
+
if (envelope.envelopeVersion !== SCHEDULER_HISTORY_ENVELOPE_VERSION ||
|
|
94
|
+
envelope.modelVersion !== SCHEDULER_HISTORY_MODEL_VERSION) {
|
|
95
|
+
return Object.freeze({ kind: "incompatible" });
|
|
96
|
+
}
|
|
97
|
+
const series = parseSeries(envelope.series);
|
|
98
|
+
if (series === undefined)
|
|
99
|
+
return Object.freeze({ kind: "invalid" });
|
|
100
|
+
const greatestSequence = series.reduce((greatest, entry) => Math.max(greatest, entry.latestObservationSequence), 0);
|
|
101
|
+
if (envelope.latestObservationSequence !== greatestSequence) {
|
|
102
|
+
return Object.freeze({ kind: "invalid" });
|
|
103
|
+
}
|
|
104
|
+
return Object.freeze({
|
|
105
|
+
kind: "loaded",
|
|
106
|
+
history: freezeSchedulerHistoryModel({
|
|
107
|
+
latestObservationSequence: envelope.latestObservationSequence,
|
|
108
|
+
series
|
|
109
|
+
})
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function parseSeries(value) {
|
|
113
|
+
const entries = snapshotClosedArray(value);
|
|
114
|
+
if (entries === undefined || entries.length > MAX_SCHEDULER_HISTORY_SERIES)
|
|
115
|
+
return undefined;
|
|
116
|
+
const identities = new Set();
|
|
117
|
+
const parsed = [];
|
|
118
|
+
for (const entry of entries) {
|
|
119
|
+
const series = parseSeriesEntry(entry);
|
|
120
|
+
if (series === undefined || identities.has(series.identityDigest))
|
|
121
|
+
return undefined;
|
|
122
|
+
identities.add(series.identityDigest);
|
|
123
|
+
parsed.push(series);
|
|
124
|
+
}
|
|
125
|
+
return Object.freeze(parsed);
|
|
126
|
+
}
|
|
127
|
+
function parseSeriesEntry(value) {
|
|
128
|
+
const record = snapshotClosedRecord(value);
|
|
129
|
+
if (record === undefined || !hasExactPlainRecordKeys(record, SERIES_KEYS))
|
|
130
|
+
return undefined;
|
|
131
|
+
if (!isSchedulerHistoryIdentityDigest(record.identityDigest) ||
|
|
132
|
+
!isObservationSequence(record.latestObservationSequence)) {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
const samples = parseSamples(record.samples);
|
|
136
|
+
if (samples === undefined ||
|
|
137
|
+
samples.at(-1)?.observationSequence !== record.latestObservationSequence) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
return Object.freeze({
|
|
141
|
+
identityDigest: record.identityDigest,
|
|
142
|
+
latestObservationSequence: record.latestObservationSequence,
|
|
143
|
+
samples
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function parseSamples(value) {
|
|
147
|
+
const entries = snapshotClosedArray(value);
|
|
148
|
+
if (entries === undefined ||
|
|
149
|
+
entries.length === 0 ||
|
|
150
|
+
entries.length > MAX_SCHEDULER_HISTORY_SAMPLES_PER_SERIES) {
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
const samples = [];
|
|
154
|
+
let priorSequence = -1;
|
|
155
|
+
for (const entry of entries) {
|
|
156
|
+
const sample = parseSample(entry);
|
|
157
|
+
if (sample === undefined || sample.observationSequence <= priorSequence)
|
|
158
|
+
return undefined;
|
|
159
|
+
priorSequence = sample.observationSequence;
|
|
160
|
+
samples.push(sample);
|
|
161
|
+
}
|
|
162
|
+
return Object.freeze(samples);
|
|
163
|
+
}
|
|
164
|
+
function parseSample(value) {
|
|
165
|
+
const record = snapshotClosedRecord(value);
|
|
166
|
+
if (record === undefined || !hasExactPlainRecordKeys(record, SAMPLE_KEYS))
|
|
167
|
+
return undefined;
|
|
168
|
+
if (!isBoundedDurationMs(record.durationMs) ||
|
|
169
|
+
!isPositiveObservationSequence(record.observationSequence) ||
|
|
170
|
+
!isSchedulerSettlementKind(record.settlementKind)) {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
return Object.freeze({
|
|
174
|
+
durationMs: record.durationMs,
|
|
175
|
+
observationSequence: record.observationSequence,
|
|
176
|
+
settlementKind: record.settlementKind
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function isMissingPath(error) {
|
|
180
|
+
return (typeof error === "object" &&
|
|
181
|
+
error !== null &&
|
|
182
|
+
error.code === "ENOENT");
|
|
183
|
+
}
|
|
184
|
+
function isPositiveObservationSequence(value) {
|
|
185
|
+
return isObservationSequence(value) && value > 0;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=storage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.mjs","sourceRoot":"","sources":["../../../../src/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 hasExactPlainRecordKeys,\n snapshotClosedArray,\n snapshotClosedRecord\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 = snapshotClosedRecord(value);\n if (envelope === undefined || !hasExactPlainRecordKeys(envelope, ENVELOPE_KEYS)) {\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 = snapshotClosedRecord(value);\n if (record === undefined || !hasExactPlainRecordKeys(record, SERIES_KEYS)) 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 = snapshotClosedRecord(value);\n if (record === undefined || !hasExactPlainRecordKeys(record, SAMPLE_KEYS)) 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"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Projects the public graph and boundary facts into the Scheduler's two constrained selection layers. */
|
|
2
|
+
export function learnedSelectionLayers(context) {
|
|
3
|
+
const taskById = new Map(context.graph.tasks.map((task) => [task.taskId, task]));
|
|
4
|
+
const scopeById = new Map(context.graph.scopes.map((scope) => [scope.id, scope]));
|
|
5
|
+
const activeScopeIds = new Set(context.activeScopeIds);
|
|
6
|
+
return Object.freeze({
|
|
7
|
+
continuation: Object.freeze(context.candidates.filter((candidate) => isContinuation(candidate, taskById, scopeById, activeScopeIds, context.capacity.maxParallel))),
|
|
8
|
+
scopeById,
|
|
9
|
+
taskById,
|
|
10
|
+
tightening: Object.freeze(context.candidates.filter((candidate) => isTightening(candidate, taskById, scopeById, activeScopeIds, context.capacity.maxParallel)))
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function isTightening(candidate, taskById, scopeById, activeScopeIds, maxParallel) {
|
|
14
|
+
const scope = scopeForCandidate(candidate, taskById, scopeById);
|
|
15
|
+
return (scope !== undefined &&
|
|
16
|
+
scope.activationTaskIds.includes(candidate.taskId) &&
|
|
17
|
+
!activeScopeIds.has(scope.id) &&
|
|
18
|
+
scope.maxParallel < maxParallel);
|
|
19
|
+
}
|
|
20
|
+
function isContinuation(candidate, taskById, scopeById, activeScopeIds, maxParallel) {
|
|
21
|
+
const scope = scopeForCandidate(candidate, taskById, scopeById);
|
|
22
|
+
return scope !== undefined && activeScopeIds.has(scope.id) && scope.maxParallel < maxParallel;
|
|
23
|
+
}
|
|
24
|
+
export function scopeForCandidate(candidate, taskById, scopeById) {
|
|
25
|
+
const task = taskById.get(candidate.taskId);
|
|
26
|
+
return task?.scopeId === null || task === undefined ? undefined : scopeById.get(task.scopeId);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=selection-layers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-layers.mjs","sourceRoot":"","sources":["../../../src/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,KAAK,SAAS;QACnB,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;QAClD,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 !== undefined &&\n scope.activationTaskIds.includes(candidate.taskId) &&\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,55 @@
|
|
|
1
|
+
import { learnedSelectionLayers, scopeForCandidate } from "./selection-layers.mjs";
|
|
2
|
+
/** Preserves ordinary static selection when learned preparation cannot form a ranking. */
|
|
3
|
+
export function staticDecision(context) {
|
|
4
|
+
const layers = learnedSelectionLayers(context);
|
|
5
|
+
const selected = selectStaticCandidate(context.candidates, layers.continuation, layers.scopeById, layers.taskById, layers.tightening);
|
|
6
|
+
return selected === undefined || !selected.canAdmit
|
|
7
|
+
? Object.freeze({ kind: "wait" })
|
|
8
|
+
: Object.freeze({ kind: "select", taskId: selected.taskId });
|
|
9
|
+
}
|
|
10
|
+
function selectStaticCandidate(candidates, continuation, scopeById, taskById, tightening) {
|
|
11
|
+
if (tightening.length > 0)
|
|
12
|
+
return first(sortConstrained(tightening, taskById, scopeById));
|
|
13
|
+
if (continuation.length > 0)
|
|
14
|
+
return first(sortConstrained(continuation, taskById, scopeById));
|
|
15
|
+
return selectOrdinary(candidates, taskById);
|
|
16
|
+
}
|
|
17
|
+
function selectOrdinary(candidates, taskById) {
|
|
18
|
+
const admissible = candidates.filter((candidate) => candidate.canAdmit);
|
|
19
|
+
return [...(admissible.length === 0 ? candidates : admissible)].sort((left, right) => priorityDifference(left, right, taskById) || compareText(left.taskId, right.taskId))[0];
|
|
20
|
+
}
|
|
21
|
+
function sortConstrained(candidates, taskById, scopeById) {
|
|
22
|
+
return [...candidates].sort((left, right) => constrainedComparison(left, right, taskById, scopeById));
|
|
23
|
+
}
|
|
24
|
+
function constrainedComparison(left, right, taskById, scopeById) {
|
|
25
|
+
const leftScope = requiredScope(left, taskById, scopeById);
|
|
26
|
+
const rightScope = requiredScope(right, taskById, scopeById);
|
|
27
|
+
return (leftScope.maxParallel - rightScope.maxParallel ||
|
|
28
|
+
priorityDifference(left, right, taskById) ||
|
|
29
|
+
compareText(leftScope.id, rightScope.id) ||
|
|
30
|
+
compareText(left.taskId, right.taskId));
|
|
31
|
+
}
|
|
32
|
+
function requiredScope(candidate, taskById, scopeById) {
|
|
33
|
+
const scope = scopeForCandidate(candidate, taskById, scopeById);
|
|
34
|
+
if (scope === undefined)
|
|
35
|
+
throw new Error("constrained task is missing a scope");
|
|
36
|
+
return scope;
|
|
37
|
+
}
|
|
38
|
+
function priorityDifference(left, right, taskById) {
|
|
39
|
+
return ((taskById.get(right.taskId)?.admissionPriority ?? 0) -
|
|
40
|
+
(taskById.get(left.taskId)?.admissionPriority ?? 0));
|
|
41
|
+
}
|
|
42
|
+
function compareText(left, right) {
|
|
43
|
+
if (left < right)
|
|
44
|
+
return -1;
|
|
45
|
+
if (left > right)
|
|
46
|
+
return 1;
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
function first(values) {
|
|
50
|
+
const value = values[0];
|
|
51
|
+
if (value === undefined)
|
|
52
|
+
throw new Error("static strategy requires a candidate");
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=static-decision.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-decision.mjs","sourceRoot":"","sources":["../../../src/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"]}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { isAbsolute } from "node:path";
|
|
2
|
+
import { canonicalizeJsonValue } from "../data-boundary/canonical-data.mjs";
|
|
3
|
+
import { prepareSchedulerDurationModel } from "./duration-model/preparation.mjs";
|
|
4
|
+
import { learnedSelectionLayers } from "./selection-layers.mjs";
|
|
5
|
+
import { staticDecision } from "./static-decision.mjs";
|
|
6
|
+
import { predictionForTask } from "./duration-model/prediction.mjs";
|
|
7
|
+
import { createSchedulerCriticalPathSnapshot, criticalPathScoreForTask } from "../project-run/task-scheduler/critical-path-ranking.mjs";
|
|
8
|
+
/**
|
|
9
|
+
* 构造普通公开 prepared strategy。调用方拥有 history location 与 identity projection;
|
|
10
|
+
* Product 只按同一 custom strategy lifecycle 调用它,不为该 helper 增加特权。
|
|
11
|
+
*/
|
|
12
|
+
export function createLearnedCriticalPathStrategy(options) {
|
|
13
|
+
if (typeof options.stateDirectory !== "string" || !isAbsolute(options.stateDirectory)) {
|
|
14
|
+
throw new TypeError("learned critical-path stateDirectory must be an absolute path");
|
|
15
|
+
}
|
|
16
|
+
const model = modelOptions(options);
|
|
17
|
+
return Object.freeze({
|
|
18
|
+
kind: "prepared",
|
|
19
|
+
prepare: async ({ graph }) => {
|
|
20
|
+
const predictionInputs = predictionInputsFor(graph, options.identityForTask, model);
|
|
21
|
+
if (predictionInputs === undefined) {
|
|
22
|
+
observe(options, { kind: "history-unavailable", reason: "identity-invalid" });
|
|
23
|
+
return Object.freeze({ decide: staticDecision });
|
|
24
|
+
}
|
|
25
|
+
const durationModel = await prepareSchedulerDurationModel({
|
|
26
|
+
predictionInputs,
|
|
27
|
+
stateDirectory: options.stateDirectory,
|
|
28
|
+
coldStartDurationMs: model.coldStartDurationMs,
|
|
29
|
+
maxSamplesPerSeries: model.sampleWindow,
|
|
30
|
+
maxSeries: model.maxHistorySeries
|
|
31
|
+
});
|
|
32
|
+
if (durationModel.kind === "static-fallback") {
|
|
33
|
+
observe(options, { kind: "history-unavailable", reason: "setup-failed" });
|
|
34
|
+
return Object.freeze({ decide: staticDecision });
|
|
35
|
+
}
|
|
36
|
+
let criticalPath;
|
|
37
|
+
try {
|
|
38
|
+
criticalPath = createSchedulerCriticalPathSnapshot(graph, durationModel.prediction);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
observe(options, { kind: "history-unavailable", reason: "setup-failed" });
|
|
42
|
+
return Object.freeze({ decide: staticDecision });
|
|
43
|
+
}
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
decide: (context) => learnedDecision(context, durationModel.prediction, criticalPath, options),
|
|
46
|
+
complete: async (context) => {
|
|
47
|
+
const recorded = await durationModel.record(context);
|
|
48
|
+
if (recorded.kind === "failed" || recorded.writeObservation === "failed") {
|
|
49
|
+
observe(options, { kind: "recording-unavailable" });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function modelOptions(options) {
|
|
57
|
+
const coldStartDurationMs = options.coldStartDurationMs ?? 1;
|
|
58
|
+
const maxHistorySeries = options.maxHistorySeries ?? 4_096;
|
|
59
|
+
const sampleWindow = options.sampleWindow ?? 32;
|
|
60
|
+
validatePositiveFinite(coldStartDurationMs, "coldStartDurationMs");
|
|
61
|
+
validateBoundedInteger(maxHistorySeries, "maxHistorySeries", 4_096);
|
|
62
|
+
validateBoundedInteger(sampleWindow, "sampleWindow", 32);
|
|
63
|
+
return Object.freeze({ coldStartDurationMs, maxHistorySeries, sampleWindow });
|
|
64
|
+
}
|
|
65
|
+
function validatePositiveFinite(value, name) {
|
|
66
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
67
|
+
throw new TypeError(`learned critical-path ${name} must be positive and finite`);
|
|
68
|
+
}
|
|
69
|
+
function validateBoundedInteger(value, name, maximum) {
|
|
70
|
+
if (!Number.isSafeInteger(value) || value <= 0 || value > maximum)
|
|
71
|
+
throw new TypeError(`learned critical-path ${name} must be a positive safe integer`);
|
|
72
|
+
}
|
|
73
|
+
function predictionInputsFor(graph, identityForTask, model) {
|
|
74
|
+
const inputs = [];
|
|
75
|
+
for (const task of graph.tasks) {
|
|
76
|
+
let identity;
|
|
77
|
+
try {
|
|
78
|
+
identity = canonicalizeJsonValue({ historyKey: identityForTask(task), model });
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
if (identity === undefined)
|
|
84
|
+
return undefined;
|
|
85
|
+
inputs.push(Object.freeze({
|
|
86
|
+
authoredOptions: identity,
|
|
87
|
+
checkId: task.taskId,
|
|
88
|
+
flags: null,
|
|
89
|
+
taskId: task.taskId
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
return Object.freeze(inputs);
|
|
93
|
+
}
|
|
94
|
+
function learnedDecision(context, prediction, criticalPath, options) {
|
|
95
|
+
const selected = selectLearnedCandidate(context, criticalPath);
|
|
96
|
+
if (!selected.canAdmit)
|
|
97
|
+
return Object.freeze({ kind: "wait" });
|
|
98
|
+
const taskPrediction = predictionForTask(prediction, selected.taskId);
|
|
99
|
+
const score = criticalPathScoreForTask(criticalPath, selected.taskId);
|
|
100
|
+
if (taskPrediction !== undefined && score !== undefined) {
|
|
101
|
+
observe(options, Object.freeze({
|
|
102
|
+
kind: "selection-proposed",
|
|
103
|
+
taskId: selected.taskId,
|
|
104
|
+
criticalPathScore: score,
|
|
105
|
+
estimatedDurationMs: taskPrediction.estimatedDurationMs,
|
|
106
|
+
sampleCount: taskPrediction.sampleCount,
|
|
107
|
+
source: taskPrediction.source
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
return Object.freeze({ kind: "select", taskId: selected.taskId });
|
|
111
|
+
}
|
|
112
|
+
function selectLearnedCandidate(context, criticalPath) {
|
|
113
|
+
const layers = learnedSelectionLayers(context);
|
|
114
|
+
if (layers.tightening.length > 0)
|
|
115
|
+
return requiredFirst(sortConstrained(layers.tightening, layers.taskById, layers.scopeById, criticalPath));
|
|
116
|
+
if (layers.continuation.length > 0)
|
|
117
|
+
return requiredFirst(sortConstrained(layers.continuation, layers.taskById, layers.scopeById, criticalPath));
|
|
118
|
+
return requiredFirst([...context.candidates].sort(learnedCandidateComparator(layers.taskById, criticalPath)));
|
|
119
|
+
}
|
|
120
|
+
function learnedCandidateComparator(taskById, criticalPath) {
|
|
121
|
+
return (left, right) => compareLearnedTasks(taskById, criticalPath, left.taskId, right.taskId);
|
|
122
|
+
}
|
|
123
|
+
function sortConstrained(candidates, taskById, scopeById, criticalPath) {
|
|
124
|
+
return [...candidates].sort(learnedConstrainedComparator(taskById, scopeById, criticalPath));
|
|
125
|
+
}
|
|
126
|
+
function learnedConstrainedComparator(taskById, scopeById, criticalPath) {
|
|
127
|
+
return (left, right) => {
|
|
128
|
+
const leftScope = requiredLearnedScope(left, taskById, scopeById);
|
|
129
|
+
const rightScope = requiredLearnedScope(right, taskById, scopeById);
|
|
130
|
+
return (leftScope.maxParallel - rightScope.maxParallel ||
|
|
131
|
+
compareLearnedTasks(taskById, criticalPath, left.taskId, right.taskId) ||
|
|
132
|
+
compareText(leftScope.id, rightScope.id) ||
|
|
133
|
+
compareText(left.taskId, right.taskId));
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function requiredLearnedScope(candidate, taskById, scopeById) {
|
|
137
|
+
const task = taskById.get(candidate.taskId);
|
|
138
|
+
const scope = task?.scopeId === null || task === undefined ? undefined : scopeById.get(task.scopeId);
|
|
139
|
+
if (scope === undefined)
|
|
140
|
+
throw new Error("constrained task is missing a scope");
|
|
141
|
+
return scope;
|
|
142
|
+
}
|
|
143
|
+
function compareLearnedTasks(taskById, criticalPath, leftId, rightId) {
|
|
144
|
+
const left = taskById.get(leftId);
|
|
145
|
+
const right = taskById.get(rightId);
|
|
146
|
+
if (left === undefined || right === undefined)
|
|
147
|
+
throw new Error("learned candidate is missing from graph");
|
|
148
|
+
const leftScore = criticalPathScoreForTask(criticalPath, leftId);
|
|
149
|
+
const rightScore = criticalPathScoreForTask(criticalPath, rightId);
|
|
150
|
+
if (leftScore === undefined || rightScore === undefined)
|
|
151
|
+
throw new Error("learned scheduler score is missing");
|
|
152
|
+
return (rightScore - leftScore ||
|
|
153
|
+
right.admissionPriority - left.admissionPriority ||
|
|
154
|
+
compareText(leftId, rightId));
|
|
155
|
+
}
|
|
156
|
+
function observe(options, event) {
|
|
157
|
+
try {
|
|
158
|
+
const observed = options.observe?.(event);
|
|
159
|
+
if (observed !== undefined)
|
|
160
|
+
void Promise.resolve(observed).catch(() => undefined);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Caller observation is contained.
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function compareText(left, right) {
|
|
167
|
+
if (left < right)
|
|
168
|
+
return -1;
|
|
169
|
+
if (left > right)
|
|
170
|
+
return 1;
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
function requiredFirst(values) {
|
|
174
|
+
const first = values[0];
|
|
175
|
+
if (first === undefined)
|
|
176
|
+
throw new Error("learned strategy requires a candidate");
|
|
177
|
+
return first;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=strategy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.mjs","sourceRoot":"","sources":["../../../src/learned-critical-path/strategy.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute } from \"node:path\";\n\nimport { canonicalizeJsonValue, type CanonicalJsonValue } 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 \"../project-run/task-scheduler/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 complete: 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"]}
|
|
@@ -2,12 +2,6 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
const CANONICAL_NAMES = ["records.ndjson", "run.json"];
|
|
5
|
-
const RETIRED_NAMES = [
|
|
6
|
-
"metrics.json",
|
|
7
|
-
"report.md",
|
|
8
|
-
"warnings-all.ndjson",
|
|
9
|
-
"warnings.ndjson"
|
|
10
|
-
];
|
|
11
5
|
const OWNED_TEMP_PREFIX = ".vibe-check-publication-";
|
|
12
6
|
/** Writes an already validated two-file candidate set through owned temporary paths. */
|
|
13
7
|
export function publishPublicationCandidatesV4(artifactDir, candidates) {
|
|
@@ -23,7 +17,6 @@ export function publishPublicationCandidatesV4(artifactDir, candidates) {
|
|
|
23
17
|
fs.renameSync(file.temp, file.canonical);
|
|
24
18
|
hasReplacedCanonicalPath = true;
|
|
25
19
|
}
|
|
26
|
-
cleanupRetiredArtifacts(artifactDir);
|
|
27
20
|
}
|
|
28
21
|
catch (error) {
|
|
29
22
|
if (hasReplacedCanonicalPath)
|
|
@@ -34,11 +27,7 @@ export function publishPublicationCandidatesV4(artifactDir, candidates) {
|
|
|
34
27
|
}
|
|
35
28
|
}
|
|
36
29
|
export function cleanupPublicationV4(artifactDir) {
|
|
37
|
-
removePaths([
|
|
38
|
-
...artifactPaths(artifactDir, CANONICAL_NAMES),
|
|
39
|
-
...artifactPaths(artifactDir, RETIRED_NAMES),
|
|
40
|
-
...ownedTempPaths(artifactDir)
|
|
41
|
-
]);
|
|
30
|
+
removePaths([...artifactPaths(artifactDir, CANONICAL_NAMES), ...ownedTempPaths(artifactDir)]);
|
|
42
31
|
}
|
|
43
32
|
export function cleanupPublicationV4BestEffort(artifactDir) {
|
|
44
33
|
try {
|
|
@@ -73,9 +62,6 @@ function cleanupOwnedTempsBestEffort(artifactDir) {
|
|
|
73
62
|
// Failure cleanup cannot conceal the original publication failure.
|
|
74
63
|
}
|
|
75
64
|
}
|
|
76
|
-
function cleanupRetiredArtifacts(artifactDir) {
|
|
77
|
-
removePaths(artifactPaths(artifactDir, RETIRED_NAMES));
|
|
78
|
-
}
|
|
79
65
|
function artifactPaths(artifactDir, names) {
|
|
80
66
|
return names.map((name) => join(artifactDir, name));
|
|
81
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-publication.mjs","sourceRoot":"","sources":["../../../../src/machine-output/v4/atomic-publication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,eAAe,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAU,CAAC;AAChE,MAAM,
|
|
1
|
+
{"version":3,"file":"atomic-publication.mjs","sourceRoot":"","sources":["../../../../src/machine-output/v4/atomic-publication.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst CANONICAL_NAMES = [\"records.ndjson\", \"run.json\"] as const;\nconst OWNED_TEMP_PREFIX = \".vibe-check-publication-\";\n\ninterface PublicationCandidatePath {\n readonly canonical: string;\n readonly contents: string;\n readonly temp: string;\n}\n\ninterface PublicationCandidates {\n readonly recordsNdjson: string;\n readonly runJson: string;\n}\n\n/** Writes an already validated two-file candidate set through owned temporary paths. */\nexport function publishPublicationCandidatesV4(\n artifactDir: string,\n candidates: PublicationCandidates\n): void {\n fs.mkdirSync(artifactDir, { recursive: true });\n const files = publicationCandidatePaths(artifactDir, randomUUID(), candidates);\n let hasReplacedCanonicalPath = false;\n try {\n cleanupOwnedTemps(artifactDir);\n for (const file of files) {\n fs.writeFileSync(file.temp, file.contents, { encoding: \"utf8\", flag: \"wx\" });\n }\n for (const file of files) {\n fs.renameSync(file.temp, file.canonical);\n hasReplacedCanonicalPath = true;\n }\n } catch (error: unknown) {\n if (hasReplacedCanonicalPath) cleanupPublicationV4BestEffort(artifactDir);\n else cleanupOwnedTempsBestEffort(artifactDir);\n throw error;\n }\n}\n\nexport function cleanupPublicationV4(artifactDir: string): void {\n removePaths([...artifactPaths(artifactDir, CANONICAL_NAMES), ...ownedTempPaths(artifactDir)]);\n}\n\nexport function cleanupPublicationV4BestEffort(artifactDir: string): void {\n try {\n cleanupPublicationV4(artifactDir);\n } catch {\n // Failure cleanup cannot conceal the original publication failure.\n }\n}\n\nfunction publicationCandidatePaths(\n artifactDir: string,\n token: string,\n candidates: PublicationCandidates\n): readonly PublicationCandidatePath[] {\n return [\n {\n canonical: join(artifactDir, \"run.json\"),\n contents: candidates.runJson,\n temp: join(artifactDir, `.vibe-check-publication-${token}-run.json.tmp`)\n },\n {\n canonical: join(artifactDir, \"records.ndjson\"),\n contents: candidates.recordsNdjson,\n temp: join(artifactDir, `.vibe-check-publication-${token}-records.ndjson.tmp`)\n }\n ];\n}\n\nfunction cleanupOwnedTemps(artifactDir: string): void {\n removePaths(ownedTempPaths(artifactDir));\n}\n\nfunction cleanupOwnedTempsBestEffort(artifactDir: string): void {\n try {\n cleanupOwnedTemps(artifactDir);\n } catch {\n // Failure cleanup cannot conceal the original publication failure.\n }\n}\n\nfunction artifactPaths(artifactDir: string, names: readonly string[]): readonly string[] {\n return names.map((name) => join(artifactDir, name));\n}\n\nfunction ownedTempPaths(artifactDir: string): readonly string[] {\n return fs\n .readdirSync(artifactDir, { withFileTypes: true })\n .filter((entry) => entry.name.startsWith(OWNED_TEMP_PREFIX))\n .map((entry) => join(artifactDir, entry.name))\n .sort();\n}\n\nfunction removePaths(paths: readonly string[]): void {\n let firstFailure: unknown;\n for (const path of paths) {\n try {\n fs.rmSync(path, { force: true, recursive: true });\n } catch (error: unknown) {\n firstFailure ??= error;\n }\n }\n if (firstFailure !== undefined) throw firstFailure;\n}\n"]}
|