Skip to content

1.2.60

Choose a tag to compare

@github-actions github-actions released this 30 Sep 08:30
· 30 commits to main since this release
Immutable release. Only release title and notes can be modified.
537cc7b
  • A job's verification record redacts every line of a PEM private key that
    the verify command prints, including the base64 body.
  • sentry.maxStringLength sets the Sentry SDK's max_value_length, so
    Sentry truncates longer string values in an event. The default is 8192
    characters, and 0 sets no limit.
  • A manual start of a pooled job answers 503 when pool state is
    unavailable. cron_list_pools, cron_cancel_queued,
    cron_preview_recovery, and cron_recover_dag report an unavailable
    pool or recovery store as a tool error, matching the 503 from the REST
    routes.
  • Before the kubernetes cluster backend restarts for rotated TLS files, it
    checks that the kubeconfig, CA, client certificate, and key (or the
    in-cluster CA) load. A half-written file keeps the running backend until a
    later reload, as with the etcd and gossip backends.
  • Speed up the dashboard's week calendar by reading only each fire's
    instant during the walk. The calendar repaints when any job name or fire
    time in the grid changes, including names that contain @ or |. The
    demo dashboard includes both changes.
  • Reduce daemon overhead on frequent paths. Live log streams build each
    line's server-sent event frame from a pre-encoded prefix, and /jobs
    skips process, resource, and verification scans for idle jobs. A DAG pass
    stops advancing pending root tasks once it spends its claim quota.
    Configuration parsing does one environment lookup per ${VAR} reference,
    resolves each distinct env_file path once, and skips report checks that
    have nothing to validate.
  • Reduce overhead in job output capture, the state store, and the terminal
    UI. Output that is valid UTF-8 decodes without the per-line fallback, and
    a run holds no live-viewer list until a viewer attaches. The filesystem
    state store reads whole files unbuffered and evicts from a full record
    cache in constant time. Pool reads copy the stored document once. The
    terminal UI copies styled text runs as slices when it cuts a row to
    width.
  • Pin PyInstaller once, in pyinstaller/build-requirements.txt, where
    Dependabot tracks it, and run one shared extras smoke test
    (pyinstaller/smoke_frozen.sh) across the POSIX binary builds. Raise the
    test coverage floors to 95% on POSIX and 94% on Windows. Key the
    manylinux wheel cache on its build image. The local PyInstaller image
    builds on CPython 3.14.7, like the release binaries.

Performance compared with 1.2.59

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 (99 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. 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.59 1.2.60 Change Noise (±) Regression limit
mem.retired_output_1k 0.17 MB 0.12 MB -31.7% 0.0% 296.4% (declared 15%)
startup.import_cronexpr 32.42 ms 29.02 ms -26.8% 1.4% 25%
job.stream_capture_120k 44.63 ms 35.47 ms -20.5% 1.2% 22.41% (declared 15%)
tui.drawer_paint_5k 119.16 ms 95.44 ms -19.9% 2.4% 15%
tui.dag_graph_paint_2k 268.21 ms 223.11 ms -16.8% 0.8% 15%
config.interp_2k 75.76 ms 63.67 ms -16.0% 1.0% 15%
dag.plan_claim_10k 17.06 ms 14.37 ms -15.8% 11.1% 58.62% (declared 15%)
webapi.sse_burst_20k 50.56 ms 42.61 ms -15.7% 1.1% 15%
webui.week_walk_500 3.55 ms 3.05 ms -14.1% 3.2% 56.34% (declared 25%)
state.derive_max_cold 26.10 ms 22.60 ms -13.4% 1.8% 38.31% (declared 15%)
state.list_documents_600 69.53 ms 61.03 ms -12.2% 1.2% 17.26% (declared 15%)
state.list_records_2k 28.25 ms 24.81 ms -12.2% 2.2% 35.4% (declared 15%)
statsd.emit_2k 15.45 ms 13.73 ms -11.2% 0.5% 64.71% (declared 25%)
state.boot_rehydrate_populated 41.96 ms 38.87 ms -7.4% 1.0% 23.83% (declared 15%)
webui.append_line_5k 14.0 us 13.0 us -7.1% 0.0% 25%
schedule.due_pass_100k 16.80 ms 15.74 ms -6.3% 4.8% 59.52% (declared 25%)
cronexpr.test_match_200k 26.08 ms 24.67 ms -5.4% 6.7% 38.34% (declared 15%)
push.seal_500 94.61 ms 90.85 ms -4.0% 0.4% 15%
startup.import_config 102.89 ms 106.16 ms +4.0% 3.7% 25%
dag.adopt_scan_500 79.90 ms 76.78 ms -3.9% 0.6% 25%
state.lease_renew_200 43.31 ms 41.65 ms -3.8% 0.6% 115.4% (declared 25%)
mem.gc_pause_100k 158.13 ms 163.84 ms +3.6% 4.0% 25%
tui.log_restyle_5k 30.16 ms 29.20 ms -3.2% 1.7% 33.15% (declared 15%)
dag.list_dags_warm 958.6 us 928.3 us -3.2% 3.6% 208.6% (declared 25%)
startup.validate_config_100 213.71 ms 219.74 ms +3.1% 2.6% 25%
state.artifact_list_churn 1.33 ms 1.30 ms -2.8% 3.5% 374.7% (declared 25%)
webui.radar_walk_500 380.0 us 370.0 us -2.6% 1.5% 526.3% (declared 25%)
state.kv_roundtrip_200 47.82 ms 46.61 ms -2.5% 1.6% 20.91% (declared 15%)
cronexpr.parse_simple 41.95 ms 40.95 ms -2.4% 1.8% 23.84% (declared 15%)
schedule.pressure_20k_48h 16.59 ms 16.98 ms +2.3% 4.7% 60.27% (declared 15%)
webui.render_term_5k 108.30 ms 110.75 ms +2.3% 2.6% 25%
webui.render_fleet_15x400 23.43 ms 22.91 ms -2.2% 1.7% 25%
cluster.parse_summaries_6k 85.90 ms 87.68 ms +2.1% 4.1% 15%
startup.version 58.36 ms 57.56 ms -2.0% 2.5% 25%
config.parse_crontab_1k 11.94 ms 11.70 ms -2.0% 2.6% 83.75% (declared 15%)
state.depends_on_past_gate 2.54 ms 2.49 ms -1.9% 2.0% 78.7% (declared 25%)
state.fanout_gather_100 8.42 ms 8.58 ms +1.9% 2.1% 118.8% (declared 25%)
cronexpr.occurrences_1k 13.41 ms 13.18 ms -1.7% 1.9% 74.54% (declared 15%)
startup.job_set_id_100 222.67 ms 226.11 ms +1.7% 2.5% 25%
cronexpr.parse_complex 21.74 ms 21.40 ms -1.6% 1.5% 46% (declared 15%)
schedule.lint_250_zoned 5.95 ms 5.85 ms -1.6% 2.1% 168.2% (declared 15%)
dag.build_layered_10k 48.67 ms 47.98 ms -1.4% 1.2% 20.55% (declared 15%)
schedule.next_fires_2k 23.26 ms 22.93 ms -1.4% 0.8% 42.99% (declared 15%)
config.reload_gc_100k 1.891 s 1.864 s -1.4% 3.1% 25%
state.list_records_warm 112.01 ms 110.57 ms -1.3% 2.2% 15%
config.parse_yaml_300 165.49 ms 163.43 ms -1.2% 1.8% 15%
config.reload_warm_include_50 87.50 ms 86.43 ms -1.2% 0.6% 25%
schedule.reseed_100k 195.61 ms 197.97 ms +1.2% 3.6% 15%
schedule.reseed_local_20k 94.27 ms 93.19 ms -1.1% 1.6% 15%
redact.secrets_5k 20.20 ms 20.42 ms +1.1% 0.5% 49.5% (declared 15%)
startup.import_daemon 194.88 ms 192.96 ms -1.1% 1.1% 25%
cronexpr.next_complex 15.39 ms 15.23 ms -1.1% 2.5% 64.96% (declared 15%)
job.report_noop_100k 50.68 ms 50.13 ms -1.1% 2.4% 15%
cronexpr.next_dst_2k 38.17 ms 37.76 ms -1.1% 3.2% 26.2% (declared 15%)
mcp.handle_200 157.11 ms 155.44 ms -1.1% 1.0% 15%
webui.render_rows_500 16.49 ms 16.66 ms +1.0% 4.7% 25%
state.mutate_document_1k 144.98 ms 143.55 ms -1.0% 0.6% 34.49% (declared 25%)
loop.stall_metrics_2000 26.76 ms 27.02 ms +1.0% 4.2% Not enforced
dag.mapped_drain_256 20.15 ms 19.95 ms -1.0% 1.5% 49.63% (declared 25%)
schedule.duplicates_20k 18.15 ms 18.31 ms +0.9% 13.1% 55.08% (declared 15%)
dag.advance_quiescent_1k 73.84 ms 73.19 ms -0.9% 1.4% 25%
cluster.fleet_view_15x400 85.08 ms 84.38 ms -0.8% 2.6% 25%
resources.monitor_stop_100 300.41 ms 302.79 ms +0.8% 2.4% 25%
config.jobconfig_3k 46.83 ms 46.47 ms -0.8% 2.0% 21.35% (declared 15%)
json.roundtrip_orjson_3k 209.99 ms 211.59 ms +0.8% 1.4% 15%
dag.advance_quiescent_chain 72.72 ms 72.19 ms -0.7% 1.3% 25%
webapi.jobs_payload_500 54.82 ms 54.42 ms -0.7% 0.5% 18.24% (declared 15%)
json.roundtrip_3k 555.39 ms 559.05 ms +0.7% 2.3% 15%
state.gc_sweep_2k_streams 38.26 ms 38.02 ms -0.6% 1.9% 39.21% (declared 25%)
ical.render_500x7d 48.89 ms 49.19 ms +0.6% 1.8% 20.45% (declared 15%)
schedule.suggest_slot_5k 4.14 ms 4.12 ms -0.6% 3.4% 241.6% (declared 15%)
tui.log_search_20k 14.31 ms 14.37 ms +0.4% 2.0% 69.87% (declared 15%)
loop.idle_wake_rate 15.53 ms 15.47 ms -0.4% 1.7% 32.2% (declared 25%)
dag.build_chain_10k 27.78 ms 27.69 ms -0.3% 3.3% 36% (declared 15%)
redact.adversarial_10k 35.57 ms 35.47 ms -0.3% 1.8% 28.12% (declared 15%)
state.append_1k 98.84 ms 98.58 ms -0.3% 0.9% 50.59% (declared 15%)
loop.stall_completions_500 8.56 ms 8.54 ms -0.3% 1.7% 58.39% (declared 25%)
dag.list_runs_warm 10.98 ms 10.95 ms -0.2% 0.7% 25%
webapi.auth_scope_20k 86.50 ms 86.30 ms -0.2% 0.8% 15%
schedule.cold_build_100k 472.24 ms 473.30 ms +0.2% 1.2% 15%
prometheus.render_500 16.39 ms 16.43 ms +0.2% 1.7% 61.01% (declared 15%)
mem.rss_daemon_import 37.53 MB 37.46 MB -0.2% 0.0% 25%
config.parse_yaml_3k 1.645 s 1.648 s +0.2% 2.2% 15%
config.reload_warm_50 39.83 ms 39.76 ms -0.2% 2.8% 25%
state.derive_max_warm 151.03 ms 150.81 ms -0.1% 0.4% 15%
state.artifact_get_newest 16.14 ms 16.17 ms +0.1% 1.1% 30.97% (declared 25%)
mem.rss_version 14.46 MB 14.45 MB -0.1% 0.2% 25%
loop.stall_jobs_500 19.67 ms 19.69 ms +0.1% 1.3% Not enforced
redact.clean_20k 20.58 ms 20.57 ms -0.1% 1.6% 48.58% (declared 15%)
startup.python_baseline 19.77 ms 19.76 ms -0.1% 1.4% Not enforced
fingerprint.job_set_id_10k 295.96 ms 295.78 ms -0.1% 0.7% 15%
dag.finish_fanin_1k 3.51 ms 3.52 ms +0.0% 2.7% 142.3% (declared 25%)
cluster.job_owner_2k 52.49 ms 52.51 ms +0.0% 2.6% 19.05% (declared 15%)
cronexpr.next_simple 36.63 ms 36.64 ms +0.0% 3.6% 27.3% (declared 15%)
webui.log_count_5k 100.0 us 100.0 us +0.0% 4.5% 2000% (declared 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%
mem.crontab_10k 2.80 MB 2.80 MB +0.0% 0.0% 17.85% (declared 15%)
mem.jobconfig_2k 1.57 MB 1.57 MB +0.0% 0.0% 31.89% (declared 15%)

What's Changed

  • Bump the nix group with 2 updates by @dependabot[bot] in #28
  • Bump the github-actions group across 1 directory with 3 updates by @dependabot[bot] in #29
  • Bump pyinstaller from 6.22.1 to 6.22.3 in the python group by @dependabot[bot] in #30

Full Changelog: 1.2.59...1.2.60