Skip to content

1.2.72

Choose a tag to compare

@github-actions github-actions released this 25 Oct 02:07
· 21 commits to main since this release
Immutable release. Only release title and notes can be modified.
  • The push reporter gives each alert a flapId beside its collapseId, so
    a relay can suppress a job that fails on every run. A collapseId names
    one run. A flapId names the source that keeps alerting: a job's
    failures or its successes on one node, one SLA check of a job on one
    node, or one DAG or node event. A cluster node goes by its nodeName and
    a standalone daemon by its hostname, so nodes built from one image keep
    separate ids as long as their nodeNames differ. Test alerts and
    approval_waiting events carry no flapId, because each of them has to
    arrive. The id is a keyed hash under the same per-installation salt as
    the collapseId, so the relay learns that two alerts share a source but
    not what the source is. A relay that predates the field ignores it.
  • Through the hosted relay, a job that fails on every run pages six times
    within 30 minutes, then sends one reminder every 30 minutes until it has
    been quiet for 2 hours. The relay deduplicates one alert that several
    nodes report by its collapseId.
  • docs/relay-protocol.md specifies flap identity and how the hosted relay
    handles a flood. An envelope over a device's rate limit gets a 2xx
    digested answer and folds into a burst digest, sent at most every 5
    minutes. Daemon events draw from a rate bucket of their own, so job
    alerts can't hold back an approval gate. The hosted relay answers 429
    only from its edge limiter (6000 POSTs a minute from one IPv4 address or
    IPv6 /64, shared by every daemon behind that address) and when APNs
    throttles the device. It retries a transient APNs failure once and
    spends at most 8 seconds on a send, inside the default 10-second
    push.relay.timeout. The document also covers the app's subscription
    proof: its 16-day grace, refunds and revocations, and where and how often
    the app sends it.

Performance compared with 1.2.71

Regression check: passed. No compared metric exceeded its regression thresholds.

Both versions were benchmarked in alternating rounds on the same machine. Results use the lowest runtime and median memory usage across rounds. Negative changes mean less time or memory; positive changes mean more.

Benchmark comparisons (199 metrics)

Noise (±) estimates run-to-run variation across both versions. A result fails the regression check only if the increase exceeds its percentage limit, its minimum absolute change, and 2 times the noise estimate. When a result uses the lowest runtime and each version has three or more rounds, the median of the rounds must also increase by more than the percentage limit and the minimum absolute change. n/a means too few rounds to estimate noise; the other limits still apply.

The Regression limit column accounts for the minimum absolute change, expressed as a percentage of the baseline. Not enforced marks informational metrics.

Startup times include Python startup overhead. Their percentage changes exclude that overhead when it can be measured separately and leaves a positive runtime in both versions.

Benchmark 1.2.71 1.2.72 Change Noise (±) Regression limit
webui.dirty_frame_rows_500 536.7 us 741.4 us +38.1% 31.5% Not enforced
mem.gc_pause_100k 154.13 ms 126.91 ms -17.7% 16.0% 25%
webui.append_line_5k 9.0 us 8.0 us -11.1% 6.1% 25%
schedule.duplicates_20k 10.56 ms 9.52 ms -9.8% 13.7% 94.72% (declared 15%)
tui.poll_absorb_5k 62.67 ms 57.70 ms -7.9% 5.9% 15%
schedule.pressure_20k_48h 10.38 ms 9.62 ms -7.3% 9.1% 96.35% (declared 15%)
webapi.jobs_payload_500 28.10 ms 26.53 ms -5.6% 0.9% 35.59% (declared 15%)
state.derive_max_cold 14.96 ms 14.16 ms -5.4% 0.7% 66.86% (declared 15%)
state.gc_sweep_2k_streams 26.69 ms 25.29 ms -5.2% 6.2% 56.2% (declared 25%)
tui.log_search_20k 8.41 ms 8.00 ms -4.8% 0.7% 118.9% (declared 15%)
startup.import_cronexpr 17.84 ms 17.25 ms -4.7% 2.7% 33.9% (declared 25%)
redact.adversarial_10k 21.07 ms 20.08 ms -4.7% 2.2% 47.45% (declared 15%)
dag.mapped_drain_256 10.96 ms 10.48 ms -4.3% 2.1% 91.27% (declared 25%)
webapi.activity_build_500 105.11 ms 100.57 ms -4.3% 5.1% 15%
webapi.sse_burst_20k 23.47 ms 22.50 ms -4.1% 6.6% 21.31% (declared 15%)
job.launch_fail_retry_2k 94.57 ms 90.67 ms -4.1% 3.3% 15%
startup.import_config 71.45 ms 68.72 ms -4.1% 2.3% 25%
webui.swim_400x49 45.80 ms 44.00 ms -3.9% 4.7% 25%
tui.palette_type_5k 95.81 ms 92.10 ms -3.9% 4.3% 15%
state.kv_roundtrip_200 23.88 ms 24.78 ms +3.8% 2.2% 41.88% (declared 15%)
config.reload_warm_dir_1k 45.03 ms 43.34 ms -3.8% 2.7% 25%
startup.import_daemon 125.51 ms 121.10 ms -3.6% 1.8% 25%
dag.gc_excess_60 49.38 ms 47.62 ms -3.6% 3.8% 25%
webui.boot_rows_500 274.10 ms 264.40 ms -3.5% 7.4% Not enforced
tui.wallboard_paint_5k 98.04 ms 94.58 ms -3.5% 2.0% 15%
startup.daemon_first_pass_2k 862.69 ms 833.93 ms -3.3% 1.0% 25%
push.fanout_8x100 88.44 ms 85.53 ms -3.3% 3.5% 15%
webui.ledger_analyze_500x600 48.80 ms 47.20 ms -3.3% 2.2% 25%
tui.log_restyle_5k 16.72 ms 16.18 ms -3.2% 2.2% 59.83% (declared 15%)
loop.stall_mcp_jobs_500 4.37 ms 4.23 ms -3.1% 6.8% Not enforced
webui.tick_500 48.70 ms 47.20 ms -3.1% 12.2% 25%
state.artifact_list_churn_x500 25.96 ms 26.73 ms +3.0% 4.3% 38.53% (declared 25%)
webapi.gzip_body_500 34.53 ms 33.51 ms -3.0% 2.3% 28.96% (declared 15%)
push.seal_500 53.77 ms 52.25 ms -2.8% 4.2% 18.6% (declared 15%)
mcp.list_jobs_500 75.83 ms 73.71 ms -2.8% 2.6% 15%
startup.validate_config_100 113.10 ms 109.97 ms -2.8% 1.7% 25%
webui.render_term_5k 72.25 ms 70.25 ms -2.8% 1.9% 25%
webui.wallboard_poll_500 36.20 ms 35.20 ms -2.8% 4.1% 25%
state.boot_rehydrate_populated 23.97 ms 24.63 ms +2.7% 4.6% 41.72% (declared 15%)
state.depends_on_past_gate 1.53 ms 1.57 ms +2.7% 2.2% 130.5% (declared 25%)
state.derive_max_warm 104.13 ms 101.30 ms -2.7% 3.4% 15%
startup.python_baseline 11.94 ms 11.63 ms -2.6% 1.6% Not enforced
dag.full_sweep_50x200 68.48 ms 66.74 ms -2.5% 4.3% 25%
webui.select_move_500 35.80 ms 34.90 ms -2.5% 3.0% 25%
job.report_noop_100k 28.65 ms 27.94 ms -2.5% 3.7% 17.45% (declared 15%)
webui.render_rows_500 10.54 ms 10.28 ms -2.5% 2.8% 25%
config.parse_dir_cold_200 142.06 ms 138.60 ms -2.4% 0.9% 25%
config.parse_yaml_300 91.86 ms 89.66 ms -2.4% 1.8% 15%
startup.version 35.91 ms 35.04 ms -2.4% 1.9% 25%
fingerprint.job_set_id_10k 171.90 ms 167.95 ms -2.3% 3.0% 15%
dag.run_chain_100 97.22 ms 95.00 ms -2.3% 3.3% 25%
job.launch_reap_2k 81.48 ms 79.65 ms -2.2% 2.5% 15%
state.list_documents_600 37.44 ms 38.27 ms +2.2% 0.8% 32.05% (declared 15%)
loop.sla_pass_5k_x10 80.48 ms 78.71 ms -2.2% 4.0% 15%
webui.dag_tasks_2k 32.30 ms 33.00 ms +2.2% 3.1% 25%
startup.jobcli_state_get 68.31 ms 66.78 ms -2.2% 2.3% 25%
config.parse_yaml_rich_20 135.28 ms 132.38 ms -2.1% 1.4% 15%
webui.render_fleet_15x400 14.38 ms 14.09 ms -2.0% 2.6% 25%
state.artifact_get_newest 8.55 ms 8.38 ms -2.0% 3.3% 58.45% (declared 25%)
state.append_1k 49.38 ms 48.40 ms -2.0% 3.9% 101.2% (declared 15%)
schedule.next_fires_2k 12.86 ms 12.60 ms -2.0% 3.6% 77.78% (declared 15%)
tui.drawer_paint_5k 54.53 ms 53.48 ms -1.9% 1.6% 15%
webui.sort_500 31.60 ms 31.00 ms -1.9% 2.6% 25%
prometheus.first_scrape_after_reload_500 102.17 ms 100.23 ms -1.9% 1.5% 15%
webapi.sse_tail_pump_4x20k 55.25 ms 54.20 ms -1.9% 2.6% 15%
cronexpr.parse_simple 24.07 ms 23.62 ms -1.9% 2.6% 41.54% (declared 15%)
webapi.auth_scope_20k 49.22 ms 48.32 ms -1.8% 2.6% 20.32% (declared 15%)
pair.qr_encode_14 144.66 ms 142.04 ms -1.8% 3.8% 15%
push.seal_xwing_500 68.38 ms 69.59 ms +1.8% 2.7% 15%
state.artifact_put_distinct_2k 24.12 ms 24.53 ms +1.7% 1.1% 41.47% (declared 25%)
job.stream_passthrough_240k 75.26 ms 73.98 ms -1.7% 3.6% 15%
config.reload_warm_include_50 48.49 ms 47.68 ms -1.7% 2.5% 25%
ical.render_500x7d 27.64 ms 27.18 ms -1.7% 2.5% 36.19% (declared 15%)
fingerprint.job_set_id_rich_2k 140.49 ms 138.26 ms -1.6% 2.8% 15%
config.jobconfig_3k 32.03 ms 31.53 ms -1.5% 3.7% 31.22% (declared 15%)
dag.plan_claim_10k 9.37 ms 9.51 ms +1.5% 3.5% 106.8% (declared 15%)
config.interp_2k 36.41 ms 35.85 ms -1.5% 1.9% 27.47% (declared 15%)
webapi.pools_poll_4x130 60.45 ms 59.53 ms -1.5% 1.3% 25%
startup.import_tui 66.21 ms 65.08 ms -1.5% 2.8% 25%
tui.fleet_paint_15x400 82.11 ms 80.88 ms -1.5% 0.8% 15%
state.fanout_gather_100 5.17 ms 5.09 ms -1.5% 5.3% 193.4% (declared 25%)
cronexpr.next_simple 21.80 ms 21.48 ms -1.5% 1.6% 45.88% (declared 15%)
webui.logo_recovery 55.90 ms 55.10 ms -1.4% 1.7% 25%
loop.stall_completions_500 4.73 ms 4.80 ms +1.4% 1.9% 105.6% (declared 25%)
job.stream_capture_120k 19.30 ms 19.04 ms -1.3% 3.7% 51.82% (declared 15%)
dag.advance_quiescent_1k 40.62 ms 41.16 ms +1.3% 2.0% 25%
config.parse_crontab_1k 7.05 ms 6.96 ms -1.3% 0.8% 141.8% (declared 15%)
state.append_pruned_1k 37.84 ms 37.34 ms -1.3% 2.2% 26.43% (declared 25%)
webui.filter_keys_500 38.30 ms 37.80 ms -1.3% 1.7% 25%
schedule.due_pass_100k 10.38 ms 10.51 ms +1.3% 3.3% 96.37% (declared 25%)
startup.job_set_id_100 114.83 ms 113.23 ms -1.3% 1.5% 25%
config.reload_warm_50 22.23 ms 21.95 ms -1.2% 0.9% 44.99% (declared 25%)
webui.rows_layout_200 40.90 ms 40.40 ms -1.2% 2.7% 25%
schedule.reseed_100k 119.01 ms 117.56 ms -1.2% 3.4% 15%
dag.advance_waiting_mapped_1k 67.46 ms 66.66 ms -1.2% 1.3% 25%
webui.week_walk_500x20 34.70 ms 35.10 ms +1.2% 1.9% 25%
redact.clean_20k 11.72 ms 11.59 ms -1.1% 1.6% 85.31% (declared 15%)
state.list_records_2k 16.23 ms 16.04 ms -1.1% 1.4% 61.63% (declared 15%)
state.artifact_get_oldest_2k 58.44 ms 57.77 ms -1.1% 0.4% 25%
loop.stall_metrics_2000 15.57 ms 15.75 ms +1.1% 4.4% Not enforced
config.reload_gc_100k 1.054 s 1.066 s +1.1% 2.9% 25%
webapi.dags_poll_1k 69.07 ms 68.29 ms -1.1% 2.9% 15%
cronexpr.test_match_200k 13.71 ms 13.86 ms +1.1% 3.1% 72.92% (declared 15%)
dag.recover_plan_from_1k 57.81 ms 58.44 ms +1.1% 3.9% 15%
tui.week_rows_500 78.06 ms 77.22 ms -1.1% 2.0% 15%
tui.table_paint_5k 90.81 ms 89.84 ms -1.1% 2.4% 15%
startup.mcp_bridge 66.52 ms 65.64 ms -1.0% 2.1% 25%
cronexpr.occurrences_1k 7.50 ms 7.43 ms -1.0% 3.4% 133.3% (declared 15%)
schedule.cold_build_100k 273.69 ms 270.98 ms -1.0% 2.3% 15%
dag.finish_fanin_20x1k 38.56 ms 38.19 ms -1.0% 2.1% 25%
prometheus.counter_snapshot_2k 68.96 ms 68.31 ms -0.9% 1.5% 15%
tui.mark_idle_300 144.59 ms 143.23 ms -0.9% 1.2% 15%
dag.run_wide_500 59.42 ms 59.97 ms +0.9% 2.8% 25%
loop.stall_jobs_500 10.67 ms 10.57 ms -0.9% 1.9% Not enforced
config.parse_yaml_3k 923.48 ms 931.80 ms +0.9% 1.1% 15%
dag.fanin_barrier_1k 99.95 ms 99.05 ms -0.9% 0.7% 25%
resources.usage_from_dict_500 47.19 ms 46.77 ms -0.9% 3.0% 15%
redact.secrets_5k 11.48 ms 11.37 ms -0.9% 2.8% 87.14% (declared 15%)
tui.view_sort_5k 68.17 ms 67.57 ms -0.9% 3.7% 15%
webui.timeline_500 34.60 ms 34.30 ms -0.9% 1.2% 25%
cluster.fleet_view_15x400 52.71 ms 52.29 ms -0.8% 2.6% 25%
cluster.derive_cold_50 85.09 ms 84.41 ms -0.8% 1.8% 15%
webui.tail_term_2k 38.20 ms 38.50 ms +0.8% 11.5% 25%
json.roundtrip_3k 326.02 ms 328.50 ms +0.8% 2.7% 15%
mcp.query_metrics_500 71.69 ms 72.23 ms +0.8% 0.8% 25%
cluster.parse_summaries_6k 42.51 ms 42.21 ms -0.7% 3.2% 23.52% (declared 15%)
mcp.handle_200 83.10 ms 82.51 ms -0.7% 0.5% 15%
webapi.resources_poll_20x240 78.06 ms 78.59 ms +0.7% 3.2% 15%
webapi.trends_build_5k 95.08 ms 94.44 ms -0.7% 2.3% 15%
json.roundtrip_orjson_3k 108.57 ms 109.30 ms +0.7% 2.3% 15%
webui.palette_keys_500 30.60 ms 30.40 ms -0.7% 1.7% 25%
schedule.suggest_slot_5k_x20 41.73 ms 41.47 ms -0.6% 3.0% 15%
dag.build_chain_10k 16.71 ms 16.61 ms -0.6% 5.3% 59.86% (declared 15%)
mcp.list_jobs_page_500 73.99 ms 74.43 ms +0.6% 2.1% 15%
cronexpr.next_dst_2k 22.94 ms 22.80 ms -0.6% 2.0% 43.59% (declared 15%)
cronexpr.next_complex 8.69 ms 8.64 ms -0.6% 1.3% 115.1% (declared 15%)
dag.build_layered_10k 28.74 ms 28.58 ms -0.6% 3.7% 34.8% (declared 15%)
dag.advance_quiescent_chain 39.79 ms 40.00 ms +0.5% 2.1% 25%
tui.tail_ingest_30k 93.19 ms 92.70 ms -0.5% 3.0% 15%
schedule.lint_2500_zoned 32.65 ms 32.48 ms -0.5% 4.3% 15%
state.list_records_warm 66.24 ms 65.92 ms -0.5% 1.7% 15%
webapi.summary_status_500 85.66 ms 85.25 ms -0.5% 3.0% 15%
state.lease_renew_200 21.07 ms 21.17 ms +0.5% 1.7% 237.3% (declared 25%)
pools.admit_cycle_1k 79.98 ms 79.61 ms -0.5% 1.9% 25%
tui.dag_graph_paint_2k 124.96 ms 124.40 ms -0.5% 0.7% 15%
cronexpr.parse_complex 12.03 ms 12.08 ms +0.4% 1.8% 83.14% (declared 15%)
resources.monitor_stop_100 186.09 ms 186.82 ms +0.4% 2.6% 25%
schedule.reseed_local_20k 52.48 ms 52.27 ms -0.4% 2.4% 19.06% (declared 15%)
jobapi.read_path_10k 72.35 ms 72.14 ms -0.3% 1.8% 15%
webui.radar_walk_500x150 37.70 ms 37.60 ms -0.3% 3.7% 25%
pools.enqueue_burst_200 74.28 ms 74.47 ms +0.3% 2.4% 25%
cluster.poll_round_15x400 82.67 ms 82.47 ms -0.2% 2.9% 15%
dag.list_dags_warm_x300 30.17 ms 30.10 ms -0.2% 2.8% 33.15% (declared 25%)
mcp.fleet_15x400 94.62 ms 94.82 ms +0.2% 1.1% 15%
dag.list_runs_warm 6.36 ms 6.35 ms -0.2% 0.8% 31.45% (declared 25%)
webapi.dag_run_poll_1k 49.15 ms 49.25 ms +0.2% 2.2% 25%
statsd.emit_2k 9.75 ms 9.73 ms -0.2% 1.2% 102.6% (declared 25%)
state.mutate_document_1k 77.33 ms 77.22 ms -0.1% 1.3% 64.66% (declared 25%)
loop.idle_wake_rate 8.92 ms 8.91 ms -0.1% 1.0% 56.06% (declared 25%)
jobapi.sem_denied_64x10 35.33 ms 35.38 ms +0.1% 2.1% 25%
cluster.job_owner_2k 30.30 ms 30.33 ms +0.1% 3.0% 33.01% (declared 15%)
cluster.peer_serve_400 85.32 ms 85.23 ms -0.1% 1.7% 15%
dag.adopt_scan_500 43.40 ms 43.44 ms +0.1% 1.9% 46.09% (declared 25%)
state.inventory_2k_streams 59.92 ms 59.98 ms +0.1% 2.0% Not enforced
mem.rss_daemon_10k 143.85 MB 143.97 MB +0.1% 0.1% 25%
mem.rss_daemon_web_100 53.52 MB 53.49 MB -0.1% 0.4% 25%
loop.stall_launch_herd_8k 46.10 ms 46.07 ms -0.1% 4.7% Not enforced
mem.rss_daemon_import 38.82 MB 38.84 MB +0.1% 0.1% 25%
prometheus.render_500 9.12 ms 9.12 ms -0.1% 1.9% 109.6% (declared 15%)
json.loads_wide_int_2k 142.19 ms 142.13 ms -0.0% 0.8% 15%
mem.rss_version 14.42 MB 14.41 MB -0.0% 0.0% 25%
mem.launch_reap_steady_20x55 0.38 MB 0.38 MB +0.0% 0.0% 15%
mem.parse_peak_rich_20 4.21 MB 4.21 MB +0.0% 0.0% 15%
mem.gc_manifest_scan_128x2k 14.32 MB 14.32 MB +0.0% 0.0% 15%
mem.tui_state_5k 2.24 MB 2.24 MB -0.0% 0.0% 15%
dag.run_doc_bytes_1k 228.53 KB 228.53 KB +0.0% 0.0% 5%
dag.mapped_doc_bytes_1k 725.81 KB 725.81 KB +0.0% 0.0% 5%
tui.frame_bytes_5k 60.22 KB 60.22 KB +0.0% 0.0% 15%
webui.log_count_5k 50.0 us 50.0 us +0.0% 0.0% 4000% (declared 25%)
webui.rows_diff_500 33.70 ms 33.70 ms +0.0% 1.4% 25%
webapi.jobs_bytes_500 181.42 KB 181.42 KB +0.0% 0.0% 15%
webapi.jobs_gzip_500 5.19 KB 5.19 KB +0.0% 0.0% 15%
webapi.activity_bytes_500 2569.83 KB 2569.83 KB +0.0% 0.0% 15%
webapi.activity_capped_bytes_500 411.18 KB 411.18 KB +0.0% 0.0% 15%
webapi.fleet_bytes_15x400 963.62 KB 963.62 KB +0.0% 0.0% 15%
webapi.index_bytes 657.38 KB 657.38 KB +0.0% 0.0% 15%
webapi.index_gzip_bytes 188.24 KB 188.24 KB +0.0% 0.0% 15%
cluster.peer_bytes_512 83.55 KB 83.55 KB +0.0% 0.0% 15%
prometheus.counter_snapshot_bytes_2k 620.59 KB 620.59 KB +0.0% 0.0% 15%
prometheus.exposition_bytes_500 821.17 KB 821.17 KB +0.0% 0.0% 15%
mcp.list_jobs_bytes_500 155.54 KB 155.54 KB +0.0% 0.0% 15%
mcp.fleet_bytes_15x400 2052.76 KB 2052.76 KB +0.0% 0.0% 15%
mcp.tools_list_bytes 20.09 KB 20.09 KB +0.0% 0.0% 15%
mem.crontab_10k 2.80 MB 2.80 MB +0.0% 0.0% 17.85% (declared 15%)
mem.jobconfig_2k 1.61 MB 1.61 MB +0.0% 0.0% 30.97% (declared 15%)
mem.retired_output_1k 0.12 MB 0.12 MB +0.0% 0.0% 15%
mem.run_history_series_5 9.58 MB 9.58 MB +0.0% 0.0% 15%
mem.jobconfig_envfile_2k 16.37 MB 16.37 MB +0.0% 0.0% 15%
mem.cluster_view_50x400 11.64 MB 11.64 MB +0.0% 0.0% 15%

What's Changed

  • Bump the github-actions group across 1 directory with 2 updates by @dependabot[bot] in #58

Full Changelog: 1.2.71...1.2.72