Skip to content

docs(planner): plan the AutoSketch vs. ASAPQuery planner evaluation (§6.3) - #777

Open
zzylol wants to merge 38 commits into
mainfrom
docs/autosketch-vs-planner-eval
Open

zzylol wants to merge 38 commits into
mainfrom
docs/autosketch-vs-planner-eval

Conversation

@zzylol

@zzylol zzylol commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Before this PR

The §6.3 comparison against AutoSketch had no written plan. The only AutoSketch implementation was an Algorithm 4 adaptation in ASAPQuery-backend (#545 protocol, #547 runner). It is execution-based, CMS-only, and not connected to the RQE MILP that sketch-bench #129 added.

After this PR

docs/evaluation/autosketch-vs-planner.md defines the planner-level comparison, run offline on sketch-bench's rqe-optimizer from sketch-bench measurements.

Validation

Documentation only. Factual claims are checked against sketch-bench (rqe-optimizer at #141's head, the saturation data) and ASAPQuery-backend autosketch_comparison.rs.

🤖 Generated with Claude Code

zzylol and others added 5 commits October 4, 2026 21:14
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cisions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s for KLL/top-k

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n the whole dataset

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol and others added 2 commits October 5, 2026 02:16
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol and others added 4 commits October 5, 2026 13:11
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 5, 2026
…anner workload

Measure frequency and top-k saturation curves at K = 10, 100, 1e4 and 1e6
(theta 0..2, N up to 1e8, 3 seeds) and top-k accuracy after merging 4/16/64
shards, for the synthetic PromQL workload of ProjectASAP/ASAPQuery#777.
Commit the summary CSVs, the N_sat tables and the scripts that finish and
check an interrupted cost phase. Cost results are pending.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 5, 2026
* rqe-optimizer: price plans per EC2 machine family

Score retained memory per active deployment, (x + max S) / y instances,
and add milp::minimize_cost, which minimizes the hourly price on one EC2
machine family in fractional instances (whichever of CPU or memory binds).
Prices are a committed on-demand snapshot from scripts/fetch_ec2_pricing.py.
Dominance pruning also compares retained memory so it cannot drop a
candidate that is cheaper under the new objective.

Part of ProjectASAP/ASAPQuery#777.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* rqe-optimizer: label small_problem MILP output for both objectives

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* rqe-optimizer: scale the MILP so tiny costs and latencies solve exactly

HiGHS's absolute gap (1e-6) and feasibility tolerance (1e-7) exceed
real plan costs (~1e-6 $/hour) and query latencies (µs). Rows are now
scaled by the plan's demand without sharing, and per-RQE memory and
latency bounds become f64 exclusions of the choices over them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
zzylol and others added 6 commits October 5, 2026 10:43
…tatus

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ties

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 5, 2026
The user dropped FewestPlans from the evaluation (ProjectASAP/ASAPQuery#777).
Remove milp::minimize_deployments and MilpBounds::max_active_deployments,
FewestPlans from the runner and its sanity checks, and its column from the
plots and summaries. milp.rs and small_problem.rs are back to #138's versions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol and others added 2 commits October 5, 2026 15:27
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 5, 2026
Runner (examples/autosketch_vs_asap.rs) for the traces workloads of
ProjectASAP/ASAPQuery#777: ASAP (joint MILP with one absolute latency SLA
per sweep point), PerQuery-CostAware and AutoSketch-Adapted, scored by
objectives::score and priced per EC2 family, with sanity checks.

Accuracy now depends on the query's merge count m = S/x: a cost entry may
carry "{metric}@m{b}" keys, eligibility reads the smallest measured b >= m,
and a merge larger than every measured b is ineligible.

Results for Alibaba 2022, Google 2011 and BOOM with figures and summary.
The earlier example and scaling workloads are dropped (#777 §6).

Rebased onto main, which now has #137, #135 and #136.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 5, 2026
…nd PerQuery

- Runner: a synthetic subcommand reading a table from
  export_autosketch_eval_table.py --synthetic (--target, --replicas,
  --no-chosen) and a wider synthetic SLA grid. PerQuery-CostAware now
  solves each RQE under the same SLA as ASAP, with a sanity check that
  ASAP costs no more.
- export_autosketch_eval_table.py --synthetic: the 10 PromQL templates of
  ProjectASAP/ASAPQuery#777 §6 as RQEs, with per-RQE accuracy lookups.
- run/plot scripts for the synthetic sweep.

Rebased onto #138 (f293b73), which dropped the example and scaling
workloads; FewestPlans is not included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zzylol zzylol changed the title docs(planner): plan the AutoSketch vs. planner evaluation docs(planner): plan the AutoSketch vs. ASAPQuery planner evaluation (§6.3) Oct 5, 2026
zzylol and others added 2 commits October 5, 2026 20:40
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 5, 2026
Every query is assumed to start at t = 0 (aligned) only, as decided for
the evaluation (ProjectASAP/ASAPQuery#777). This reverts 59a1700: the
staggered offsets and timeline, the exact per-second staggered MILP
constraints, the staggered:* cost models, their outputs and tests. Model
A and aligned model B (the per-RQE peak occupancy bound) are unchanged.
The summaries ignore staggered:* rows that older result files still hold.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 5, 2026
- rqe-optimizer/results/autosketch-vs-asap-synthetic: 66 runs of the
  ProjectASAP/ASAPQuery#777 workload grid (default point, every dimension
  alone, replicas x series, windows x card), model A and model B per family,
  every SLA. 0 sanity violations, the peak bound exact everywhere, no solve
  or job timed out. Raw results as sweep-json.tar.gz; sweep.csv, summary,
  figures and per-shard provenance (34 runs at ba52fd8 with verified
  identical tables, 32 at 0a45c48).
- rqe-optimizer/data/profiling-time.json: ASAP's one-time profiling, 35.6 h
  of sketch-bench runs (#130, #131, #140), from record timestamps.
- The synthetic summary and figures order each dimension's values by the
  grid.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bound

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 6, 2026
Decided for ProjectASAP/ASAPQuery#777:
- Q1. One evaluation's query CPU per sketch instance is q_r queries at the
  benchmark's CPU per query: card * (q_r * CPU per query + (S/x - 1) *
  merge CPU). The exporter adds query_us_per_query (query-phase CPU over its
  query count, study_saturation.query_secs, from --cost-records; keys
  derived for #130's unkeyed records) and queries_per_instance per RQE:
  a frequency query reads every key (C, C*s, or traces' worst_K), top-k
  and each quantile issue one. query_phase_us stays for reference.
- Q2. Estimated latency remains that CPU time on one core, serial across
  instances; the summaries say so.
- Q3. AutoSketch's benchmark lower bound charges each distinct probed
  config N = 1e8 inserts (sketch-bench's measurement size) plus one query
  phase: benchmark_secs_lower_bound_nbench1e8. The paper-rate estimate
  (60 s per distinct probe) stays.
- The traces table is re-exported with both new fields.

Tests: q_r for every template, CPU per query from a hand-computed record,
and the benchmark bound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 6, 2026
ProjectASAP/ASAPQuery#777 section 6:
- templates=dashboard (D1-D5, 33 RQEs): per-series p50/p90/p99 over
  {1m, 5m, 15m, 1h, 6h, 24h}, p50/p90/p99 by label_0, sum by label_0 of
  rate over the six windows, top-3 by label_0 of rate over 5m and 1h, and
  the p99/p50 ratio over 5m and 1h as two quantile RQEs on D1's stream.
- Shared replicas (table dimension shared=r): r replicas of a template set
  on the same streams; replica i draws 3 of the set's windows, 3 of the five
  quantiles and an interval (10/60/300 s) from a seeded RNG, and identical
  RQEs are kept once (temporal ranges carry their interval, e.g. 1h@60s).
  The runner's --replicas stays the disjoint control.
- The plan adds the dashboard and shared r in {1..64} for the default mix
  and the dashboard, at every strictness level (111 runs in all). The 40
  existing tables are unchanged.
- Summaries: dashboard tables, a shared-replicas table, and
  fig_synthetic_shared_replicas.png (cost relative to ASAP vs. r).

The runner is unchanged since ce4b885.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@zzylol
zzylol marked this pull request as ready for review October 6, 2026 19:59
Comment thread docs/evaluation/autosketch-vs-planner.md Outdated
Comment thread docs/evaluation/autosketch-vs-planner.md Outdated
Comment thread docs/evaluation/autosketch-vs-planner.md Outdated
Comment thread docs/evaluation/autosketch-vs-planner.md Outdated
Comment thread docs/evaluation/autosketch-vs-planner.md Outdated
Comment thread docs/evaluation/autosketch-vs-planner.md Outdated
Comment thread docs/evaluation/autosketch-vs-planner.md
zzylol and others added 5 commits October 6, 2026 21:19
…e cost model

Addresses review on #777:
- cost: sketch-bench #145's per-phase CPU and memory with a weighted
  objective; CPU only first, then Fargate prices. EC2 machine families,
  the peak-provisioned model and the CPU timeline are dropped.
- capabilities: sum and rate/increase map to the exact accumulators
  (#144), not frequency; strictness applies to quantile and top-k only.
- inputs: read the export_rqe_optimizer_costs table (measured_at, merge
  accuracy, size sweep) instead of the saturation tables; exact
  accumulators are benchmarked for cost but need no saturation point.
- grid: keep template set, shared replicas {1, 8, 64}, C {1e2, 1e3, 1e4},
  strictness and SLA {0.01, 0.1, 1, 10} ms; move the rest to planner
  sensitivity. Disjoint replicas are dropped (spatial filters unsupported).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… workload

Top-k, KLL and DDSketch are measured on Zipf s=1.1 over 100k keys (quantiles
on the Zipf ranks). The synthetic workload now uses that distribution instead
of Zipf θ=1.0 and Pareto a=2, so the cost table needs no separate run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- data: C = 1e4 series (label_0, the top-k key), J = 10 jobs, 200
  samples/s per series, Zipf s=1.1 over 10,000 keys (the cost table's
  data at CARDINALITY=10000); fixed, so the comparison does not sweep it.
- windows W = {15m, 1h, 6h, 24h}: every per-series summary sees >= 1e5
  items; per-summary input sizes listed per grouping.
- queries: grouped templates use by (job); top-k is
  topk(k, sum by (label_0) (...)) with k in {100, 200, 300}, served by
  one heap-K deployment for k <= K; quantile syntax fixed. Both template
  sets are enumerated query by query (all checked with promql-parser).
- grid: C removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h-bench #156)

Keep the fixed synthetic data (Zipf s=1.1 over 10,000 keys, quantiles on
the Zipf ranks) and top-k with k in {100, 200, 300} served by heap-K
deployments. Everything else follows sketch-bench #156/#162:
- sketch accuracy from the saturation curves at n(S, G); CPU, memory and
  exact rows from the cost table; grid configs only.
- merging: every pane saturated, then read at n(S, G); KLL/top-k merge
  penalty is #158. AutoSketch uses the same lookup with m = 1.
- DDSketch scored in value relative error (#162), with its own targets.
- a targeted saturation run at the workload's data shape (theta 1.1,
  K 1e4, Zipf-rank quantiles, CMS-heap heaps 100/200/300) so lookups land
  on measured points.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
k = 32 is the heap size sketch-bench measures top-k at (CMS_HEAP_TOP_K),
so top-k needs no heap parameter, no k on the RQE and no extra saturation
points. 58 RQEs per replica for the 10 templates (50 distinct), 25 for the
dashboard (21 distinct); query lists regenerated and parser-checked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 7, 2026
ProjectASAP/ASAPQuery#777 (paper §6.3), consolidating #138, #139 and #141.

- rqe-optimizer/examples/autosketch_vs_asap.rs: ASAP (milp::minimize),
  PerQuery-CostAware and AutoSketch-Adapted on one synthetic table. Costs and
  accuracy come from --saturation-dir, as the planner reads them:
  SaturationCurves::accuracy for ASAP (merge curves for KLL and top-k,
  #179), autosketch_accuracy for AutoSketch, and the one-study cost table
  (#178). Each run is scored by analytical_cost_model::score at #777's two
  weight settings and the SLA grid.
- scripts/export_autosketch_eval_table.py --synthetic: one workload-only
  table per grid point, plus plan.tsv. The data constants come from
  study_saturation's COST_*.
- scripts/run_autosketch_vs_asap_synthetic.sh and
  plot_autosketch_vs_asap_synthetic.py: run the grid, then plot.
- scripts/profiling_time.py and the synthetic results README: ASAP's
  one-time profiling time, and how to reproduce.

The trace workloads are left out for now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 7, 2026
… workloads

ProjectASAP/ASAPQuery#777 (paper §6.3), consolidating #138, #139 and #141.

- rqe-optimizer/examples/autosketch_vs_asap.rs (traces and synthetic): ASAP
  (milp::minimize), PerQuery-CostAware and AutoSketch-Adapted. Costs and
  accuracy come from --saturation-dir, as the planner reads them:
  SaturationCurves::accuracy for ASAP (merge curves for KLL and top-k,
  #179), autosketch_accuracy for AutoSketch, and the one-study cost table
  (#178). Each run is scored by analytical_cost_model::score at #777's two
  weight settings and the SLA grid.
- scripts/run_autosketch_vs_asap.sh and plot_autosketch_vs_asap.py: the
  trace workloads alibaba_v2022 and google_2011. boom is left out for now.
- scripts/export_autosketch_eval_table.py --synthetic: one workload-only
  table per grid point, plus plan.tsv. The data constants come from
  study_saturation's COST_*. The traces path is unchanged from main.
- scripts/run_autosketch_vs_asap_synthetic.sh and
  plot_autosketch_vs_asap_synthetic.py: run the synthetic grid, then plot.
- scripts/profiling_time.py and the results README: ASAP's one-time
  profiling time, and how to reproduce.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 7, 2026
… workloads

ProjectASAP/ASAPQuery#777 (paper §6.3), consolidating #138, #139 and #141.

- rqe-optimizer/examples/autosketch_vs_asap.rs (traces and synthetic): ASAP
  (milp::minimize), PerQuery-CostAware and AutoSketch-Adapted. Costs and
  accuracy come from --saturation-dir, as the planner reads them:
  SaturationCurves::accuracy for ASAP (merge curves for KLL and top-k,
  #179), autosketch_accuracy for AutoSketch, and the one-study cost table
  (#178). Each run is scored by analytical_cost_model::score at #777's two
  weight settings and the SLA grid.
- scripts/run_autosketch_vs_asap.sh and plot_autosketch_vs_asap.py: the
  trace workloads alibaba_v2022 and google_2011. boom is left out for now.
- scripts/export_autosketch_eval_table.py --synthetic: one workload-only
  table per grid point, plus plan.tsv. The data constants come from
  study_saturation's COST_*. The traces path is unchanged from main.
- scripts/run_autosketch_vs_asap_synthetic.sh and
  plot_autosketch_vs_asap_synthetic.py: run the synthetic grid, then plot.
- scripts/profiling_time.py and the results README: ASAP's one-time
  profiling time, and how to reproduce.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 7, 2026
… workloads

ProjectASAP/ASAPQuery#777 (paper §6.3), consolidating #138, #139 and #141.

- rqe-optimizer/examples/autosketch_vs_asap.rs (traces and synthetic): ASAP
  (milp::minimize), PerQuery-CostAware and AutoSketch-Adapted. Costs and
  accuracy come from --saturation-dir, as the planner reads them:
  SaturationCurves::accuracy for ASAP (merge curves for KLL and top-k,
  #179), autosketch_accuracy for AutoSketch, and the one-study cost table
  (#178). Each run is scored by analytical_cost_model::score at #777's two
  weight settings and the SLA grid.
- scripts/run_autosketch_vs_asap.sh and plot_autosketch_vs_asap.py: the
  trace workloads alibaba_v2022 and google_2011. boom is left out for now.
- scripts/export_autosketch_eval_table.py --synthetic: one workload-only
  table per grid point, plus plan.tsv. The data constants come from
  study_saturation's COST_*. The traces path is unchanged from main.
- scripts/run_autosketch_vs_asap_synthetic.sh and
  plot_autosketch_vs_asap_synthetic.py: run the synthetic grid, then plot.
- scripts/profiling_time.py and the results README: ASAP's one-time
  profiling time, and how to reproduce.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 7, 2026
… workloads

ProjectASAP/ASAPQuery#777 (paper §6.3), consolidating #138, #139 and #141.

- rqe-optimizer/examples/autosketch_vs_asap.rs (traces and synthetic): ASAP
  (milp::minimize), PerQuery-CostAware and AutoSketch-Adapted. Costs and
  accuracy come from --saturation-dir, as the planner reads them:
  SaturationCurves::accuracy for ASAP (merge curves for KLL and top-k,
  #179), autosketch_accuracy for AutoSketch, and the one-study cost table
  (#178). Each run is scored by analytical_cost_model::score at #777's two
  weight settings and the SLA grid.
- scripts/run_autosketch_vs_asap.sh and plot_autosketch_vs_asap.py: the
  trace workloads alibaba_v2022 and google_2011. boom is left out for now.
- scripts/export_autosketch_eval_table.py --synthetic: one workload-only
  table per grid point, plus plan.tsv. The data constants come from
  study_saturation's COST_*. The traces path is unchanged from main.
- scripts/run_autosketch_vs_asap_synthetic.sh and
  plot_autosketch_vs_asap_synthetic.py: run the synthetic grid, then plot.
- scripts/profiling_time.py and the results README: ASAP's one-time
  profiling time, and how to reproduce.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol added a commit to ProjectASAP/sketch-bench that referenced this pull request Oct 7, 2026
… workloads

ProjectASAP/ASAPQuery#777 (paper §6.3), consolidating #138, #139 and #141.

- rqe-optimizer/examples/autosketch_vs_asap.rs (traces and synthetic): ASAP
  (milp::minimize), PerQuery-CostAware and AutoSketch-Adapted. Costs and
  accuracy come from --saturation-dir, as the planner reads them:
  SaturationCurves::accuracy for ASAP (merge curves for KLL and top-k,
  #179), autosketch_accuracy for AutoSketch, and the one-study cost table
  (#178). Each run is scored by analytical_cost_model::score at #777's two
  weight settings and the SLA grid.
- scripts/run_autosketch_vs_asap.sh and plot_autosketch_vs_asap.py: the
  trace workloads alibaba_v2022 and google_2011. boom is left out for now.
- scripts/export_autosketch_eval_table.py --synthetic: one workload-only
  table per grid point, plus plan.tsv. The data constants come from
  study_saturation's COST_*. The traces path is unchanged from main.
- scripts/run_autosketch_vs_asap_synthetic.sh and
  plot_autosketch_vs_asap_synthetic.py: run the synthetic grid, then plot.
- scripts/profiling_time.py and the results README: ASAP's one-time
  profiling time, and how to reproduce.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
zzylol and others added 4 commits October 7, 2026 23:27
…tudy

- §5: a single p95 level in each family's metric (error ≤ 0.05, top-k
  precision ≥ 0.95) for synthetic and traces; the three strictness levels
  and fitted trace targets are dropped, and so is the grid's strictness
  dimension.
- §2/§6: costs and accuracy come from one study on asap_sketchlib 0.3.0:
  the cost table from --phase optimizer-cost (#174), a full-cross grid
  with the cost shape (#186), KLL merge curves (#179), top-k heap m·k
  (#182), per-query k with curves at 10/32/100 (#185) and the theoretical
  fallback (#180). Quantiles see Pareto a = 2, the cost shape.
- §6: traces are Alibaba 2022 and Google 2011; BOOM is left out for now.
- §8/§10: statuses as of 2026-10-07; the top-k m·k read is an assumption.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhcWJExZcmVqS6r6rEtjis
…∈ {1, 8}

Shared replicas on one metric stop adding RQEs past r = 8, so r = 64 is
dropped. m ∈ {1, 8, 16} copies of the template set, each on its own
metric, grow RQEs as 21 · m and drive the planning-time figure.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhcWJExZcmVqS6r6rEtjis
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants