sparkforensics-server 0.5.1 → 0.6.0
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/package.json +1 -1
- package/public/assets/AutoscalingChurn-CRA2Mb7F.js +1 -0
- package/public/assets/CacheUtilization-Bh9OY_V9.js +1 -0
- package/public/assets/CachingOpportunity-oCiQwmTJ.js +1 -0
- package/public/assets/{ColdStart-B38OiAOp.js → ColdStart-BJrtjfmn.js} +1 -1
- package/public/assets/ConfigAudit-DMvKxySP.js +1 -0
- package/public/assets/CoreUsageArea-REC2zsKw.js +1 -0
- package/public/assets/Dashboard-BHZ76JCu.js +2 -0
- package/public/assets/DisclosureContext-OO7X1HAx.js +1 -0
- package/public/assets/{DuplicatePlanSubtree-BqS2A2j4.js → DuplicatePlanSubtree-BgG-L-cK.js} +1 -1
- package/public/assets/ExecutorUtilization-D2KhSVbY.js +1 -0
- package/public/assets/{GcPressure-CT1yzR_s.js → GcPressure-D1BTE8qh.js} +1 -1
- package/public/assets/{IncompleteRun-C7Qkjtjn.js → IncompleteRun-DD40xUpy.js} +1 -1
- package/public/assets/{JobFailures-WHl3ELfh.js → JobFailures-YwNzCF19.js} +1 -1
- package/public/assets/MemoryUtilization-9b8ee_3_.js +1 -0
- package/public/assets/{OverBroadcast-6oSSAQ_R.js → OverBroadcast-CfctS8a8.js} +1 -1
- package/public/assets/PartitionSizing-VG8kBgG5.js +1 -0
- package/public/assets/{PlanExplorer-DcxmiQWL.js → PlanExplorer-DmubTAOP.js} +1 -1
- package/public/assets/PlanGraphRoute-DctPZjS0.js +1 -0
- package/public/assets/RetryWaste-CnpM8bB7.js +1 -0
- package/public/assets/{ShuffleIO-CRhrYNE0.js → ShuffleIO-D13vGmas.js} +1 -1
- package/public/assets/Skew-DlagstYP.js +1 -0
- package/public/assets/SlowHost-cSkLRZ_e.js +1 -0
- package/public/assets/{SmallFiles-C082c2rd.js → SmallFiles-B-kERMcq.js} +1 -1
- package/public/assets/{SpeculationWaste-BS2vpadr.js → SpeculationWaste-DaysAzXO.js} +1 -1
- package/public/assets/Spill-H44Gz4US.js +1 -0
- package/public/assets/{StageFailed-D3ac9Sou.js → StageFailed-DCfii9h_.js} +1 -1
- package/public/assets/StageFindingGroup-BXJ0Mj5n.js +1 -0
- package/public/assets/{StageHeader-pI1nTwVf.js → StageHeader--oN2J-oD.js} +1 -1
- package/public/assets/StageShape-IZ80CZiJ.js +1 -0
- package/public/assets/{StageSlowness-BaNyfNvL.js → StageSlowness--BRIaBc1.js} +1 -1
- package/public/assets/Straggler-Ctq0Df_o.js +1 -0
- package/public/assets/TaskFailures-Bks_gqhL.js +1 -0
- package/public/assets/{TinyTask-8_5lpq_2.js → TinyTask-BssfzGFB.js} +1 -1
- package/public/assets/{UnderBroadcast-DJ0XSwth.js → UnderBroadcast-DsScrxc-.js} +1 -1
- package/public/assets/{finding-anchor-Cys8Z6Yn.js → finding-anchor-BYW1oz5R.js} +1 -1
- package/public/assets/{impact-sort-BTQndbof.js → impact-sort-xzy0g-Vh.js} +1 -1
- package/public/assets/index-DhpRGMZc.css +2 -0
- package/public/assets/index-DwqkFUFk.js +14 -0
- package/public/assets/instrument-sans-latin-ext-wdth-normal-C5E2Gvlv.woff2 +0 -0
- package/public/assets/instrument-sans-latin-wdth-normal-BVScPF0l.woff2 +0 -0
- package/public/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/public/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/public/assets/{parser-worker-DmeCnLWU.js → parser-worker-CA5RxqKc.js} +8 -8
- package/public/assets/react-vendor-DfpuPQZf.js +9 -0
- package/public/assets/{select-DIYN6D3y.js → select-C8edjYTq.js} +1 -1
- package/public/assets/{usePagedRows-BxvdFnPk.js → usePagedRows-CsuUFeYx.js} +1 -1
- package/public/assets/useRecentFiles-BvkKo3JN.js +11 -0
- package/public/assets/{useSortMode-B8SRfAoG.js → useSortMode-joX71BZN.js} +1 -1
- package/public/docs/404.html +3 -7
- package/public/docs/assets/{app.D2GqAkhy.js → app.CnWL6bKV.js} +1 -1
- package/public/docs/assets/chunks/@localSearchIndexroot.tE5pz54z.js +1 -0
- package/public/docs/assets/chunks/{VPLocalSearchBox.BS4cSmtW.js → VPLocalSearchBox.C0IBKeRQ.js} +1 -1
- package/public/docs/assets/chunks/{theme.BuxVpb0H.js → theme.BH-2HuRf.js} +2 -2
- package/public/docs/assets/{contributor-guide_architecture_board-widgets_caching-and-memory.md.8bH1HnZp.js → contributor-guide_architecture_board-widgets_caching-and-memory.md.CQgn1t_M.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_board-widgets_visual-system-and-templating.md.wulOueeB.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_detector-contract.md.wj6Et6UD.js → contributor-guide_architecture_detector-contract.md.N4hhenrA.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_detector-contract_threshold-tables.md.Dp3c40rx.js +1 -0
- package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.DfvbqEUu.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_impact-estimation.md.CZv_ZGOp.lean.js → contributor-guide_architecture_impact-estimation.md.DfvbqEUu.lean.js} +1 -1
- package/public/docs/assets/{contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.BUucRc0A.js → contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.Cwm1jHmn.js} +1 -1
- package/public/docs/assets/{contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.BUucRc0A.lean.js → contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.Cwm1jHmn.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_state-and-history_run-comparison-internals.md.CZA0JLtV.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_state-and-history_run-comparison-internals.md.uuAKpY0Y.lean.js → contributor-guide_architecture_state-and-history_run-comparison-internals.md.CZA0JLtV.lean.js} +1 -1
- package/public/docs/assets/contributor-guide_architecture_worker-protocol_cli-and-mcp.md.BX1XnFbq.js +1 -0
- package/public/docs/assets/{contributor-guide_architecture_worker-protocol_evidence-report.md.DVGZOWvW.js → contributor-guide_architecture_worker-protocol_evidence-report.md.CiQl1MLb.js} +1 -1
- package/public/docs/assets/{contributor-guide_development-setup.md.D9bu4j_c.js → contributor-guide_development-setup.md.DQdzera7.js} +1 -1
- package/public/docs/assets/instrument-sans-latin-ext-wdth-normal.C5E2Gvlv.woff2 +0 -0
- package/public/docs/assets/instrument-sans-latin-wdth-normal.BVScPF0l.woff2 +0 -0
- package/public/docs/assets/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2 +0 -0
- package/public/docs/assets/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2 +0 -0
- package/public/docs/assets/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2 +0 -0
- package/public/docs/assets/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2 +0 -0
- package/public/docs/assets/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2 +0 -0
- package/public/docs/assets/style.CyK9Ss73.css +1 -0
- package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.BEepbDDL.js +24 -0
- package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.BEepbDDL.lean.js +1 -0
- package/public/docs/assets/{user-guide_mcp-tools_compare-runs.md.CPowlb2q.js → user-guide_mcp-tools_compare-runs.md.Cc_gLoix.js} +3 -2
- package/public/docs/assets/{user-guide_mcp-tools_compare-runs.md.CPowlb2q.lean.js → user-guide_mcp-tools_compare-runs.md.Cc_gLoix.lean.js} +1 -1
- package/public/docs/assets/{user-guide_mcp-tools_evaluate-budgets.md.Dq5Azk8G.js → user-guide_mcp-tools_evaluate-budgets.md.BB0nDY3Z.js} +2 -2
- package/public/docs/assets/{user-guide_mcp-tools_evaluate-budgets.md.Dq5Azk8G.lean.js → user-guide_mcp-tools_evaluate-budgets.md.BB0nDY3Z.lean.js} +1 -1
- package/public/docs/assets/{user-guide_mcp-tools_get-run-summary.md.DpxZ4ZNp.js → user-guide_mcp-tools_get-run-summary.md.EhaIsele.js} +1 -1
- package/public/docs/assets/user-guide_run-comparison.md.BUALkohi.js +1 -0
- package/public/docs/assets/user-guide_run-comparison.md.BUALkohi.lean.js +1 -0
- package/public/docs/assets/user-guide_run-comparison_how-stages-are-matched.md.DSXGu2tA.js +1 -0
- package/public/docs/assets/user-guide_run-comparison_how-stages-are-matched.md.DSXGu2tA.lean.js +1 -0
- package/public/docs/assets/user-guide_understanding-findings.md.3C7KCEZO.js +1 -0
- package/public/docs/assets/user-guide_understanding-findings.md.3C7KCEZO.lean.js +1 -0
- package/public/docs/contributor-guide/architecture/board-widgets/caching-and-memory.html +6 -10
- package/public/docs/contributor-guide/architecture/board-widgets/plan-advisor.html +4 -8
- package/public/docs/contributor-guide/architecture/board-widgets/visual-system-and-templating.html +6 -10
- package/public/docs/contributor-guide/architecture/board-widgets.html +4 -8
- package/public/docs/contributor-guide/architecture/detector-contract/plan-attribution.html +4 -8
- package/public/docs/contributor-guide/architecture/detector-contract/threshold-tables.html +6 -10
- package/public/docs/contributor-guide/architecture/detector-contract.html +6 -10
- package/public/docs/contributor-guide/architecture/drill-down/plan-graph.html +4 -8
- package/public/docs/contributor-guide/architecture/drill-down.html +4 -8
- package/public/docs/contributor-guide/architecture/impact-estimation/caveats-tuning-and-coverage.html +6 -10
- package/public/docs/contributor-guide/architecture/impact-estimation/stage-union-rollup.html +4 -8
- package/public/docs/contributor-guide/architecture/impact-estimation.html +6 -10
- package/public/docs/contributor-guide/architecture/index.html +4 -8
- package/public/docs/contributor-guide/architecture/overview.html +4 -8
- package/public/docs/contributor-guide/architecture/state-and-history/history-server-intake.html +4 -8
- package/public/docs/contributor-guide/architecture/state-and-history/run-comparison-internals.html +6 -10
- package/public/docs/contributor-guide/architecture/state-and-history.html +4 -8
- package/public/docs/contributor-guide/architecture/widget-rendering/findings-tab.html +4 -8
- package/public/docs/contributor-guide/architecture/widget-rendering/investigation-routing.html +4 -8
- package/public/docs/contributor-guide/architecture/widget-rendering/list-sort-mode.html +4 -8
- package/public/docs/contributor-guide/architecture/widget-rendering/reference-section.html +4 -8
- package/public/docs/contributor-guide/architecture/widget-rendering/row-expand-contract.html +4 -8
- package/public/docs/contributor-guide/architecture/widget-rendering.html +4 -8
- package/public/docs/contributor-guide/architecture/worker-protocol/cli-and-mcp.html +6 -10
- package/public/docs/contributor-guide/architecture/worker-protocol/core-and-event-validation.html +4 -8
- package/public/docs/contributor-guide/architecture/worker-protocol/evidence-availability.html +4 -8
- package/public/docs/contributor-guide/architecture/worker-protocol/evidence-report.html +6 -10
- package/public/docs/contributor-guide/architecture/worker-protocol.html +4 -8
- package/public/docs/contributor-guide/contributing.html +4 -8
- package/public/docs/contributor-guide/development-setup.html +6 -10
- package/public/docs/contributor-guide/testing.html +4 -8
- package/public/docs/favicon.svg +2 -2
- package/public/docs/hashmap.json +1 -1
- package/public/docs/index.html +4 -8
- package/public/docs/tuning-reference/anti-patterns.html +4 -8
- package/public/docs/tuning-reference/aqe.html +4 -8
- package/public/docs/tuning-reference/bottleneck-broadcast-sizing.html +4 -8
- package/public/docs/tuning-reference/bottleneck-cold-start.html +4 -8
- package/public/docs/tuning-reference/bottleneck-duplicate-plan-subtree.html +4 -8
- package/public/docs/tuning-reference/bottleneck-failures.html +4 -8
- package/public/docs/tuning-reference/bottleneck-gc.html +4 -8
- package/public/docs/tuning-reference/bottleneck-job-failure-rate.html +4 -8
- package/public/docs/tuning-reference/bottleneck-memory-utilization.html +4 -8
- package/public/docs/tuning-reference/bottleneck-retry-waste.html +4 -8
- package/public/docs/tuning-reference/bottleneck-shuffle.html +4 -8
- package/public/docs/tuning-reference/bottleneck-skew.html +4 -8
- package/public/docs/tuning-reference/bottleneck-slow-host.html +4 -8
- package/public/docs/tuning-reference/bottleneck-small-files.html +4 -8
- package/public/docs/tuning-reference/bottleneck-spill.html +4 -8
- package/public/docs/tuning-reference/bottleneck-straggler.html +4 -8
- package/public/docs/tuning-reference/bottleneck-tiny-tasks.html +4 -8
- package/public/docs/tuning-reference/bottleneck-utilization.html +4 -8
- package/public/docs/tuning-reference/caching.html +4 -8
- package/public/docs/tuning-reference/cluster-config.html +4 -8
- package/public/docs/tuning-reference/config.html +4 -8
- package/public/docs/tuning-reference/data-formats.html +4 -8
- package/public/docs/tuning-reference/index.html +5 -9
- package/public/docs/tuning-reference/intro.html +4 -8
- package/public/docs/tuning-reference/joins.html +4 -8
- package/public/docs/tuning-reference/memory-model.html +4 -8
- package/public/docs/tuning-reference/metrics.html +4 -8
- package/public/docs/tuning-reference/partitioning.html +4 -8
- package/public/docs/tuning-reference/pyspark.html +4 -8
- package/public/docs/tuning-reference/shuffle.html +4 -8
- package/public/docs/tuning-reference/spark-architecture.html +4 -8
- package/public/docs/tuning-reference/table-formats.html +4 -8
- package/public/docs/user-guide/alternative-log-retrieval/managed-platforms.html +4 -8
- package/public/docs/user-guide/alternative-log-retrieval/ssh-bastion.html +4 -8
- package/public/docs/user-guide/alternative-log-retrieval.html +4 -8
- package/public/docs/user-guide/getting-started/ci-and-automation.html +11 -13
- package/public/docs/user-guide/getting-started/reading-the-dashboard.html +4 -8
- package/public/docs/user-guide/getting-started/regression-metric-keys.html +4 -8
- package/public/docs/user-guide/getting-started/tuning-thresholds.html +4 -8
- package/public/docs/user-guide/getting-started.html +4 -8
- package/public/docs/user-guide/mcp-tools/compare-runs.html +8 -11
- package/public/docs/user-guide/mcp-tools/diagnose-run.html +4 -8
- package/public/docs/user-guide/mcp-tools/evaluate-budgets.html +6 -10
- package/public/docs/user-guide/mcp-tools/get-finding-documentation.html +4 -8
- package/public/docs/user-guide/mcp-tools/get-finding-evidence.html +4 -8
- package/public/docs/user-guide/mcp-tools/get-reference-doc.html +4 -8
- package/public/docs/user-guide/mcp-tools/get-run-summary.html +6 -10
- package/public/docs/user-guide/mcp-tools/list-runs.html +4 -8
- package/public/docs/user-guide/mcp-tools.html +4 -8
- package/public/docs/user-guide/run-comparison/how-stages-are-matched.html +6 -10
- package/public/docs/user-guide/run-comparison.html +6 -10
- package/public/docs/user-guide/understanding-findings.html +6 -10
- package/public/export-template.html +46 -46
- package/public/favicon.svg +2 -2
- package/public/index.html +4 -7
- package/vendor-core/allocation.js +105 -20
- package/vendor-core/api-merge-writes.js +1 -0
- package/vendor-core/cli/budgets.js +62 -2
- package/vendor-core/cli/regression-budgets.js +35 -0
- package/vendor-core/comparison-output.js +2 -1
- package/vendor-core/core-source-hash.txt +1 -1
- package/vendor-core/delta-log-paths.js +10 -1
- package/vendor-core/detectors.js +290 -92
- package/vendor-core/docs-content/detection/chrn.md +3 -1
- package/vendor-core/docs-content/detection/cold.md +2 -1
- package/vendor-core/docs-content/detection/mem.md +1 -1
- package/vendor-core/docs-content/detection/plan.md +9 -2
- package/vendor-core/docs-content/detection/shfl.md +8 -2
- package/vendor-core/docs-content/detection/skew.md +12 -5
- package/vendor-core/docs-content/detection/slow.md +6 -2
- package/vendor-core/docs-content/detection/spill.md +4 -1
- package/vendor-core/docs-content/detection/strag.md +5 -3
- package/vendor-core/docs-content/detection/tiny.md +3 -2
- package/vendor-core/docs-content/detection/util.md +6 -2
- package/vendor-core/efficiency-model.js +22 -14
- package/vendor-core/evidence-report.js +11 -11
- package/vendor-core/finding-presentation.js +52 -19
- package/vendor-core/finding-types.js +71 -16
- package/vendor-core/impact-model.js +2 -2
- package/vendor-core/mcp-server-factory.js +6 -2
- package/vendor-core/mcp-tools.js +10 -1
- package/vendor-core/median.js +8 -0
- package/vendor-core/remediation.js +10 -5
- package/vendor-core/run-comparison.js +2 -0
- package/vendor-core/run-output.js +14 -3
- package/vendor-core/sequence-alignment.js +83 -0
- package/vendor-core/stage-alignment.js +387 -63
- package/vendor-core/stage-quantiles.js +3 -1
- package/vendor-core/stage-structure.js +83 -0
- package/vendor-core/types.js +12 -2
- package/vendor-core/wall-clock.js +8 -0
- package/vendor-core/wasted-core-hours.js +12 -11
- package/vendor-core/write-targets.js +32 -0
- package/public/assets/AutoscalingChurn-5hDGIXi4.js +0 -1
- package/public/assets/CacheUtilization-CT2SCnJJ.js +0 -1
- package/public/assets/CachingOpportunity-D_O_WkbH.js +0 -1
- package/public/assets/ConfigAudit-BoplryCH.js +0 -1
- package/public/assets/CoreUsageArea-csgwNxkl.js +0 -1
- package/public/assets/Dashboard-BgKodJl2.js +0 -2
- package/public/assets/DisclosureContext-B0siMVdg.js +0 -1
- package/public/assets/ExecutorUtilization-Dp52QGWo.js +0 -1
- package/public/assets/MemoryUtilization-D8IUDHJI.js +0 -1
- package/public/assets/PartitionSizing-BwdFL-mw.js +0 -1
- package/public/assets/PlanGraphRoute-pqnHTt4i.js +0 -1
- package/public/assets/RetryWaste-BTbeHkJc.js +0 -1
- package/public/assets/Skew-DSNXRG9V.js +0 -1
- package/public/assets/SlowHost-B7Lwu2EU.js +0 -1
- package/public/assets/Spill-B4DVKHXx.js +0 -1
- package/public/assets/StageFindingGroup-D9naK109.js +0 -1
- package/public/assets/StageShape-eO5le8iG.js +0 -1
- package/public/assets/Straggler-D5Fnok_y.js +0 -1
- package/public/assets/TaskFailures-BWnC-K_G.js +0 -1
- package/public/assets/index-BcqTLKFp.css +0 -2
- package/public/assets/index-DCeWge12.js +0 -13
- package/public/assets/react-vendor-DEdfrRTJ.js +0 -9
- package/public/assets/useRecentFiles-C3Ov47U7.js +0 -11
- package/public/docs/assets/chunks/@localSearchIndexroot.D4OdkQjy.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_board-widgets_visual-system-and-templating.md.DYgUpIJB.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_detector-contract_threshold-tables.md.fkPBXsU2.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.CZv_ZGOp.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_state-and-history_run-comparison-internals.md.uuAKpY0Y.js +0 -1
- package/public/docs/assets/contributor-guide_architecture_worker-protocol_cli-and-mcp.md.Dk08VS7n.js +0 -1
- package/public/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/public/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/public/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/public/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/public/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/public/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/public/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/public/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/public/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/public/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/public/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/public/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/public/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/public/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/public/docs/assets/style.tmDhD3c8.css +0 -1
- package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.DpnfKz3x.js +0 -22
- package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.DpnfKz3x.lean.js +0 -1
- package/public/docs/assets/user-guide_run-comparison.md.B6aNtDYF.js +0 -1
- package/public/docs/assets/user-guide_run-comparison.md.B6aNtDYF.lean.js +0 -1
- package/public/docs/assets/user-guide_run-comparison_how-stages-are-matched.md.XBzQ1oEU.js +0 -1
- package/public/docs/assets/user-guide_run-comparison_how-stages-are-matched.md.XBzQ1oEU.lean.js +0 -1
- package/public/docs/assets/user-guide_understanding-findings.md.Dqt2H_C1.js +0 -1
- package/public/docs/assets/user-guide_understanding-findings.md.Dqt2H_C1.lean.js +0 -1
- /package/public/docs/assets/{contributor-guide_architecture_board-widgets_caching-and-memory.md.8bH1HnZp.lean.js → contributor-guide_architecture_board-widgets_caching-and-memory.md.CQgn1t_M.lean.js} +0 -0
- /package/public/docs/assets/{contributor-guide_architecture_board-widgets_visual-system-and-templating.md.DYgUpIJB.lean.js → contributor-guide_architecture_board-widgets_visual-system-and-templating.md.wulOueeB.lean.js} +0 -0
- /package/public/docs/assets/{contributor-guide_architecture_detector-contract.md.wj6Et6UD.lean.js → contributor-guide_architecture_detector-contract.md.N4hhenrA.lean.js} +0 -0
- /package/public/docs/assets/{contributor-guide_architecture_detector-contract_threshold-tables.md.fkPBXsU2.lean.js → contributor-guide_architecture_detector-contract_threshold-tables.md.Dp3c40rx.lean.js} +0 -0
- /package/public/docs/assets/{contributor-guide_architecture_worker-protocol_cli-and-mcp.md.Dk08VS7n.lean.js → contributor-guide_architecture_worker-protocol_cli-and-mcp.md.BX1XnFbq.lean.js} +0 -0
- /package/public/docs/assets/{contributor-guide_architecture_worker-protocol_evidence-report.md.DVGZOWvW.lean.js → contributor-guide_architecture_worker-protocol_evidence-report.md.CiQl1MLb.lean.js} +0 -0
- /package/public/docs/assets/{contributor-guide_development-setup.md.D9bu4j_c.lean.js → contributor-guide_development-setup.md.DQdzera7.lean.js} +0 -0
- /package/public/docs/assets/{user-guide_mcp-tools_get-run-summary.md.DpxZ4ZNp.lean.js → user-guide_mcp-tools_get-run-summary.md.EhaIsele.lean.js} +0 -0
|
@@ -118,8 +118,8 @@ export function tasksMostlyIdle(stage , sql = n
|
|
|
118
118
|
return cpuMs / runMs < IDLE_CPU_SHARE_MAX;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
// skew, straggler and
|
|
122
|
-
// occupancy clip must not floor them at that same task (see estimateSingleStage).
|
|
121
|
+
// skew, straggler, stageSlowness and lowShuffleParallelism claim time off the stage's longest task
|
|
122
|
+
// itself, so the occupancy clip must not floor them at that same task (see estimateSingleStage).
|
|
123
123
|
export const TAIL_CLAIM = { shortensLongestTask: true };
|
|
124
124
|
|
|
125
125
|
// No quantifiable magnitude -> 'informational'; a rawWaste figure with no stage window ->
|
|
@@ -119,14 +119,18 @@ export function createMcpServer({ thresholds }
|
|
|
119
119
|
maxRegressionPct: z.number().optional(), regressionMetric: z.string().optional(), failOnIntroduced: z.string().optional(),
|
|
120
120
|
regressionBudgets: z.array(z.object({ metric: z.string(), maxPct: z.number().nonnegative() })).optional()
|
|
121
121
|
.describe('Further regression budgets, one per metric (the CLI\'s repeated --regression-budget). A metric can be budgeted once across this list and maxRegressionPct/regressionMetric.'),
|
|
122
|
+
stageRegressionBudgets: z.array(z.object({ metric: z.string(), maxPct: z.number().nonnegative() })).optional()
|
|
123
|
+
.describe('Per paired stage (needs sourceB/runIdB): fail when any eligible pair\'s metric (executorRunTime, executorCpuTime, memoryBytesSpilled, diskBytesSpilled, shuffleReadBytes, shuffleWriteBytes) regressed by more than maxPct. One entry per metric. Inconclusive when no stage pairs.'),
|
|
124
|
+
stageQualities: z.array(z.enum(['exact', 'structural', 'aligned'])).optional()
|
|
125
|
+
.describe('Pair qualities the stage budgets read. Default exact and structural: an aligned pair may compare different work.'),
|
|
122
126
|
},
|
|
123
127
|
}, ({
|
|
124
128
|
source, runId, runIdB, sourceB,
|
|
125
129
|
maxRuntimeMs, maxSpillGb, maxSkewRatio, maxFailedTaskRatePct, minEfficiencyPct,
|
|
126
|
-
maxRegressionPct, regressionMetric, failOnIntroduced, regressionBudgets,
|
|
130
|
+
maxRegressionPct, regressionMetric, failOnIntroduced, regressionBudgets, stageRegressionBudgets, stageQualities,
|
|
127
131
|
}) => toolResult(evaluateBudgetsForRun(
|
|
128
132
|
{ source, runId },
|
|
129
|
-
{ maxRuntimeMs, maxSpillGb, maxSkewRatio, maxFailedTaskRatePct, minEfficiencyPct, maxRegressionPct, regressionMetric, failOnIntroduced, regressionBudgets },
|
|
133
|
+
{ maxRuntimeMs, maxSpillGb, maxSkewRatio, maxFailedTaskRatePct, minEfficiencyPct, maxRegressionPct, regressionMetric, failOnIntroduced, regressionBudgets, stageRegressionBudgets, stageQualities },
|
|
130
134
|
(runIdB || sourceB) ? { runId: runIdB, source: sourceB } : undefined,
|
|
131
135
|
{ thresholds },
|
|
132
136
|
)));
|
package/vendor-core/mcp-tools.js
CHANGED
|
@@ -13,7 +13,7 @@ import { buildComparisonOutput, } from './comparison-outpu
|
|
|
13
13
|
import { compileNormalizePatterns } from './stage-alignment.js';
|
|
14
14
|
import { runOutputBlocks } from './run-output.js';
|
|
15
15
|
import { evaluateBudgets, } from './cli/budgets.js';
|
|
16
|
-
import { combineRegressionBudgets } from './cli/regression-budgets.js';
|
|
16
|
+
import { assertStageBudgetMetric, combineRegressionBudgets } from './cli/regression-budgets.js';
|
|
17
17
|
import { FINDING_NAMES, titleCase } from './finding-names.js';
|
|
18
18
|
import { docAnchorForType } from './detector-docs.js';
|
|
19
19
|
import { DETECTORS, } from './detectors.js';
|
|
@@ -416,6 +416,15 @@ export async function evaluateBudgetsForRun(
|
|
|
416
416
|
} catch (e) {
|
|
417
417
|
throw mcpError('access-or-upstream-failure', (e ).message);
|
|
418
418
|
}
|
|
419
|
+
if (budgets.stageQualities !== undefined && budgets.stageRegressionBudgets === undefined) {
|
|
420
|
+
throw mcpError('access-or-upstream-failure', 'stageQualities requires stageRegressionBudgets.');
|
|
421
|
+
}
|
|
422
|
+
try {
|
|
423
|
+
for (const { metric } of budgets.stageRegressionBudgets ?? []) assertStageBudgetMetric(metric, 'stageRegressionBudgets');
|
|
424
|
+
combineRegressionBudgets((budgets.stageRegressionBudgets ?? []).map((budget) => ({ origin: 'stageRegressionBudgets', budget })));
|
|
425
|
+
} catch (e) {
|
|
426
|
+
throw mcpError('access-or-upstream-failure', (e ).message);
|
|
427
|
+
}
|
|
419
428
|
const [first, second] = await Promise.all([
|
|
420
429
|
resolveAndAnalyze(primary, opts?.thresholds),
|
|
421
430
|
secondary ? resolveAndAnalyze(secondary, opts?.thresholds) : Promise.resolve(undefined),
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// The textbook median of values already sorted ascending: the middle value for an odd count, the
|
|
2
|
+
// mean of the two middle values for an even one. 0 for an empty list.
|
|
3
|
+
export function medianOfSorted(sorted ) {
|
|
4
|
+
const n = sorted.length;
|
|
5
|
+
if (n === 0) return 0;
|
|
6
|
+
const mid = n >> 1;
|
|
7
|
+
return n % 2 === 1 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
|
|
8
|
+
}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
// Constructors for the structured `remediation` a detector attaches next to its prose
|
|
2
2
|
// `recommendation`: only where the detector already names the Spark property, never an invented one.
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
|
|
7
7
|
/** The property should be raised; `suggested` is the value when the detector computed one. */
|
|
8
|
-
export function increaseConf(key , suggested = null)
|
|
8
|
+
export function increaseConf(key , suggested = null) {
|
|
9
9
|
return { kind: 'conf', key, direction: 'increase', suggested };
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/** The property should be lowered; `suggested` is the value when the detector computed one. */
|
|
13
|
-
export function decreaseConf(key , suggested = null)
|
|
13
|
+
export function decreaseConf(key , suggested = null) {
|
|
14
14
|
return { kind: 'conf', key, direction: 'decrease', suggested };
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
/** The property should take a specific value (a switch or a class name), not move up or down. */
|
|
18
|
-
export function setConf(key , suggested = null)
|
|
18
|
+
export function setConf(key , suggested = null) {
|
|
19
19
|
return { kind: 'conf', key, direction: 'set', suggested };
|
|
20
20
|
}
|
|
21
|
+
|
|
22
|
+
/** No property fixes it: the job's code or data has to change, as `hint` says. */
|
|
23
|
+
export function codeFix(hint ) {
|
|
24
|
+
return { kind: 'code', hint };
|
|
25
|
+
}
|
|
@@ -38,6 +38,7 @@ import { summarizeRunOutcome } from './run-outcome.js';
|
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
|
|
41
|
+
|
|
41
42
|
|
|
42
43
|
|
|
43
44
|
|
|
@@ -408,6 +409,7 @@ export function compareRuns(
|
|
|
408
409
|
unmatched: alignment.unmatched,
|
|
409
410
|
replanned: alignment.replanned,
|
|
410
411
|
bookkeepingStageIds: alignment.bookkeepingStageIds,
|
|
412
|
+
executionAlignment: alignment.executionAlignment,
|
|
411
413
|
metrics: metricDeltas(baseSnap, candSnap),
|
|
412
414
|
findings: findingsDelta(baseSnap, candSnap),
|
|
413
415
|
stageSkew: stageSkewDeltas(baseSnap, candSnap, alignment.pairs),
|
|
@@ -5,21 +5,32 @@ import { buildEffectiveConf, } from './effective-conf.js';
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
/** Which build wrote a report: the host package's name and version, and the build id of the core it
|
|
9
|
+
* loaded. Core does not know its host, so the surface passes it in. */
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
8
16
|
/** The CLI report's `metrics` and `effectiveConf` blocks, shared with MCP diagnose_run. Under
|
|
9
17
|
* `redact` they come from the run redacted with the report's own inputs, so host and app
|
|
10
|
-
* pseudonyms match the report's. `confKeys`/`confRedactRegex` narrow and mask `effectiveConf`.
|
|
18
|
+
* pseudonyms match the report's. `confKeys`/`confRedactRegex` narrow and mask `effectiveConf`.
|
|
19
|
+
* `generator`, when the surface supplies it, is returned as given: it holds no run identifiers. */
|
|
11
20
|
export function runOutputBlocks(
|
|
12
21
|
appModel ,
|
|
13
|
-
{ redact, thresholds, confKeys, confRedactRegex }
|
|
22
|
+
{ redact, thresholds, confKeys, confRedactRegex, generator }
|
|
14
23
|
|
|
24
|
+
|
|
15
25
|
= {},
|
|
16
|
-
)
|
|
26
|
+
) {
|
|
17
27
|
let blocksModel = appModel;
|
|
18
28
|
if (redact) {
|
|
19
29
|
const { catalog, config } = runFindings(appModel, thresholds);
|
|
20
30
|
blocksModel = redactRunModel(appModel, catalog, config).appModel;
|
|
21
31
|
}
|
|
22
32
|
return {
|
|
33
|
+
...(generator ? { generator } : {}),
|
|
23
34
|
metrics: computeRunMetrics(blocksModel, thresholds),
|
|
24
35
|
effectiveConf: buildEffectiveConf(blocksModel.app, { keys: confKeys, userPattern: confRedactRegex }),
|
|
25
36
|
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Order-preserving sequence alignment: the weighted longest-common-subsequence dynamic program the
|
|
2
|
+
// stage aligner runs over each run's SQL executions. Pure and deterministic.
|
|
3
|
+
//
|
|
4
|
+
// Cost: the full table has n*m cells and one similarity call per cell. Above `FULL_ALIGNMENT_MAX_CELLS`
|
|
5
|
+
// the table is restricted to a band around the diagonal, which costs about n*(2W+1) cells with
|
|
6
|
+
// W = `BAND_BASE_HALF_WIDTH` + |n-m|/2, and the result reports that the bounded form ran.
|
|
7
|
+
|
|
8
|
+
/** Largest n*m the alignment runs in full (1000 x 1000 executions). */
|
|
9
|
+
export const FULL_ALIGNMENT_MAX_CELLS = 1_000_000;
|
|
10
|
+
/** Band half-width added to half of |n-m| once the table is bounded: the band is centered on the line
|
|
11
|
+
* from corner to corner, and a run of insertions or deletions in one place drifts the best path from
|
|
12
|
+
* that line by at most |n-m|/2. */
|
|
13
|
+
export const BAND_BASE_HALF_WIDTH = 100;
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
/** Aligns two sequences of lengths `n` and `m`, maximizing the summed `score` of matched pairs. `score`
|
|
23
|
+
* returns a non-negative integer; a pair scoring below `minScore` is never matched. Of equally good
|
|
24
|
+
* alignments the one that matches whenever matching is optimal wins, and where it must skip, it skips the
|
|
25
|
+
* element with the higher id (`idA`, `idB`), so the lower ids stay and swapping the two sequences mirrors
|
|
26
|
+
* the pairs. */
|
|
27
|
+
export function alignSequences(
|
|
28
|
+
n , m ,
|
|
29
|
+
score ,
|
|
30
|
+
minScore ,
|
|
31
|
+
idA , idB ,
|
|
32
|
+
) {
|
|
33
|
+
if (n === 0 || m === 0) return { pairs: [], bounded: false };
|
|
34
|
+
const bounded = n * m > FULL_ALIGNMENT_MAX_CELLS;
|
|
35
|
+
const half = BAND_BASE_HALF_WIDTH + Math.ceil(Math.abs(n - m) / 2);
|
|
36
|
+
// Row i may match columns lo[i]..hi[i]; both bounds only grow with i.
|
|
37
|
+
const lo = new Int32Array(n), hi = new Int32Array(n);
|
|
38
|
+
for (let i = 0; i < n; i++) {
|
|
39
|
+
const center = Math.floor((i * m) / n);
|
|
40
|
+
lo[i] = bounded ? Math.max(0, center - half) : 0;
|
|
41
|
+
hi[i] = bounded ? Math.min(m - 1, center + half) : m - 1;
|
|
42
|
+
}
|
|
43
|
+
// best[i][j - lo[i]]: the best total from the suffixes starting at (i, j), for j inside row i's band.
|
|
44
|
+
const best = new Array(n);
|
|
45
|
+
// Cells outside the band are not stored: left of it the row's first cell stands in (those columns can
|
|
46
|
+
// only match in later rows, whose bands start no earlier), right of it the row cannot match, so the
|
|
47
|
+
// next row answers.
|
|
48
|
+
const get = (i , j ) => {
|
|
49
|
+
for (;;) {
|
|
50
|
+
if (i >= n || j >= m) return 0;
|
|
51
|
+
if (j < lo[i]) j = lo[i];
|
|
52
|
+
else if (j > hi[i]) i++;
|
|
53
|
+
else return best[i][j - lo[i]];
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
// The caller memoizes `score`, so the walk below re-asking for visited cells is cheap.
|
|
57
|
+
const cell = score;
|
|
58
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
59
|
+
const row = new Int32Array(hi[i] - lo[i] + 1);
|
|
60
|
+
best[i] = row;
|
|
61
|
+
for (let j = hi[i]; j >= lo[i]; j--) {
|
|
62
|
+
let v = Math.max(get(i + 1, j), j + 1 <= hi[i] ? row[j + 1 - lo[i]] : get(i + 1, j + 1));
|
|
63
|
+
const s = cell(i, j);
|
|
64
|
+
if (s >= minScore) v = Math.max(v, s + get(i + 1, j + 1));
|
|
65
|
+
row[j - lo[i]] = v;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const pairs = [];
|
|
70
|
+
let i = 0, j = 0;
|
|
71
|
+
while (i < n && j < m) {
|
|
72
|
+
if (j < lo[i]) { j = lo[i]; continue; }
|
|
73
|
+
if (j > hi[i]) { i++; continue; }
|
|
74
|
+
const v = best[i][j - lo[i]];
|
|
75
|
+
const s = cell(i, j);
|
|
76
|
+
if (s >= minScore && s + get(i + 1, j + 1) === v) { pairs.push([i, j]); i++; j++; continue; }
|
|
77
|
+
const skipA = get(i + 1, j) === v, skipB = get(i, j + 1) === v;
|
|
78
|
+
if (skipA && skipB) { if (idA(i) >= idB(j)) i++; else j++; }
|
|
79
|
+
else if (skipA) i++;
|
|
80
|
+
else j++;
|
|
81
|
+
}
|
|
82
|
+
return { pairs, bounded };
|
|
83
|
+
}
|