# Metric ids the CI perf comparison must actually COMPARE (measure on both
# the baseline and the current side) every run.  compare.py --expected-gated
# fails when a listed metric was not compared: a gate whose baseline side
# skips is otherwise filed under first-release "new" coverage and never
# warned about, so a gate that died because a private seam drifted would be
# indistinguishable from a metric added this release, forever.
#
# Maintenance: when a benchmark lands, add it here as soon as it is known to
# compare against the current baseline release (most do immediately: the
# harness runs from the current checkout and measures public APIs the
# baseline already ships).  A metric that legitimately cannot compare yet
# (it measures a surface the baseline release lacks) stays out until the
# first release carrying that surface becomes the baseline.  Removing a
# line is a reviewed, deliberate edit, same as budgets.json; [perf:accept]
# does not excuse a failure here.
#
# Ids are kept in sorted order so an addition has one obvious home and a
# duplicate is visible in review.  Every id bench.py registers belongs here
# except the four at the bottom, each with the reason it cannot be gated.
#
# The in-repo smoke net (tests/test_benchmarks.py) is the companion guard:
# it fails when a headline metric starts skipping in --smoke, which catches
# a broken seam before CI does.

cluster.fleet_view_15x400
cluster.job_owner_2k
cluster.parse_summaries_6k
config.interp_2k
config.jobconfig_3k
config.parse_crontab_1k
config.parse_yaml_300
config.reload_gc_100k
config.reload_warm_50
config.reload_warm_include_50
cronexpr.next_complex
cronexpr.next_dst_2k
cronexpr.next_simple
cronexpr.occurrences_1k
cronexpr.parse_complex
cronexpr.parse_simple
cronexpr.test_match_200k
dag.adopt_scan_500
dag.advance_quiescent_1k
dag.advance_quiescent_chain
dag.build_chain_10k
dag.build_layered_10k
dag.finish_fanin_1k
dag.list_dags_warm
dag.list_runs_warm
dag.mapped_drain_256
dag.plan_claim_10k
fingerprint.job_set_id_10k
ical.render_500x7d
job.report_noop_100k
job.stream_capture_120k
json.roundtrip_3k
json.roundtrip_orjson_3k
loop.idle_wake_rate
loop.stall_completions_500
mcp.handle_200
mem.crontab_10k
mem.gc_pause_100k
mem.jobconfig_2k
mem.rss_daemon_import
mem.rss_version
prometheus.render_500
push.seal_500
redact.adversarial_10k
redact.clean_20k
redact.secrets_5k
resources.monitor_stop_100
schedule.cold_build_100k
schedule.due_pass_100k
schedule.duplicates_20k
schedule.lint_250_zoned
schedule.next_fires_2k
schedule.pressure_20k_48h
schedule.reseed_100k
schedule.suggest_slot_5k
startup.import_config
startup.import_cronexpr
startup.import_daemon
startup.job_set_id_100
startup.validate_config_100
startup.version
state.append_1k
state.artifact_get_newest
state.artifact_list_churn
state.boot_rehydrate_populated
state.depends_on_past_gate
state.derive_max_cold
state.derive_max_warm
state.fanout_gather_100
state.gc_sweep_2k_streams
state.kv_roundtrip_200
state.lease_renew_200
state.list_documents_600
state.list_records_2k
state.list_records_warm
state.mutate_document_1k
statsd.emit_2k
tui.drawer_paint_5k
tui.log_restyle_5k
tui.log_search_20k
webapi.auth_scope_20k
webapi.jobs_bytes_500
webapi.jobs_gzip_500
webapi.jobs_payload_500
webapi.sse_frame_20k
webui.log_count_5k
webui.render_fleet_15x400
webui.render_rows_500
webui.render_term_5k

# The four benchmarks deliberately NOT listed above, and why.
#
# startup.python_baseline, loop.stall_jobs_500 and loop.stall_metrics_2000
# all ship info=True, so bench.py records gate_pct as None and compare.py
# never counts them as compared (_declared_gate_pct returns None, so
# _gate_coverage skips the metric before it can land in compared_names).
# Listing one would fail every run rather than guard anything, however
# cleanly both sides measure it.  startup.python_baseline is the subprocess
# tier's own noise floor, the quantity every other startup.* delta is
# measured AGAINST; the two loop.* gauges report a max scheduling gap,
# the noisiest shape in the suite, and each is meant to be observed for a
# release before being armed.  Arm one by dropping info=True in bench.py
# and adding its id above in the same commit.
#
# webui.append_line_5k drives the __perf.appendLine hook, which lands in
# this release.  Run against the 1.2.32 baseline tree it skips with "page
# lacks the __perf.appendLine hook", so the pairing has nothing to compare.
# Add it once a release carrying the hook is the baseline.  Its sibling
# webui.render_term_5k needs no such wait: it drives the page's own
# 'matches only' checkbox rather than a hook, and it does compare on 1.2.32.
