Skip to content

1.2.58

Choose a tag to compare

@github-actions github-actions released this 28 Sep 19:55
· 59 commits to main since this release
Immutable release. Only release title and notes can be modified.
  • The Windows service refuses to load a configuration that any account
    other than SYSTEM and Administrators can write, or one reached through a
    junction or symbolic link. It checks before it opens its log or reads a
    file, records the reason and the icacls fix in the Application event log
    as event ID 1020, and stops with a code that cronstable service status
    explains. It repeats the check before every reload, and a reload that
    fails the check keeps the jobs already loaded. cronstable service install refuses the same paths, including a per-user directory named
    with -c. A local account that creates C:\ProgramData\cronstable
    before cronstable init runs therefore cannot have its jobs run as
    SYSTEM. If another account can write to the configuration directory,
    the service remains stopped until the printed icacls commands restrict
    write access.
  • The MSI creates C:\ProgramData\cronstable when it does not exist,
    with the same ownership and permissions as cronstable init:
    the Administrators group owns the directory, and only SYSTEM and
    Administrators can write to it. Uninstalling keeps the directory. The
    MSI preserves existing directories and their permissions.
    The service starts at the next boot with no jobs and loads configuration
    added later within a minute.

Performance compared with 1.2.57

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.57 1.2.58 Change Noise (±) Regression limit
webui.log_count_5k 100.0 us 90.0 us -10.0% 4.5% 2000% (declared 25%)
loop.stall_metrics_2000 28.24 ms 29.04 ms +2.8% 3.2% Not enforced
cronexpr.next_complex 15.60 ms 16.02 ms +2.7% 3.0% 64.1% (declared 15%)
webui.radar_walk_500 380.0 us 390.0 us +2.6% 4.0% 526.3% (declared 25%)
schedule.suggest_slot_5k 4.39 ms 4.28 ms -2.5% 3.4% 228% (declared 15%)
schedule.pressure_20k_48h 17.32 ms 16.95 ms -2.1% 5.2% 57.75% (declared 15%)
mem.gc_pause_100k 141.02 ms 138.47 ms -1.8% 7.6% 25%
state.gc_sweep_2k_streams 32.99 ms 33.56 ms +1.7% 0.7% 45.46% (declared 25%)
config.parse_crontab_1k 12.71 ms 12.50 ms -1.7% 1.5% 78.67% (declared 15%)
dag.finish_fanin_1k 3.33 ms 3.38 ms +1.6% 1.6% 150.1% (declared 25%)
state.list_documents_600 62.90 ms 63.90 ms +1.6% 0.9% 19.08% (declared 15%)
cronexpr.occurrences_1k 14.30 ms 14.07 ms -1.6% 2.3% 69.94% (declared 15%)
mcp.handle_200 139.71 ms 137.64 ms -1.5% 1.0% 15%
fingerprint.job_set_id_10k 302.43 ms 297.98 ms -1.5% 1.2% 15%
schedule.lint_250_zoned 7.78 ms 7.67 ms -1.4% 2.3% 128.5% (declared 15%)
state.artifact_list_churn 1.51 ms 1.53 ms +1.3% 2.2% 330.8% (declared 25%)
state.depends_on_past_gate 3.10 ms 3.06 ms -1.3% 0.4% 64.61% (declared 25%)
schedule.duplicates_20k 19.07 ms 18.82 ms -1.3% 5.6% 52.45% (declared 15%)
dag.plan_claim_10k 16.15 ms 16.34 ms +1.2% 2.0% 61.91% (declared 15%)
schedule.next_fires_2k 25.11 ms 25.40 ms +1.2% 1.1% 39.83% (declared 15%)
config.reload_warm_50 47.29 ms 46.79 ms -1.1% 1.6% 25%
webui.render_rows_500 17.04 ms 17.22 ms +1.1% 3.0% 25%
schedule.reseed_local_20k 94.97 ms 95.96 ms +1.0% 1.4% 15%
redact.clean_20k 20.54 ms 20.34 ms -1.0% 1.5% 48.7% (declared 15%)
startup.python_baseline 17.69 ms 17.52 ms -0.9% 0.3% Not enforced
state.list_records_2k 26.25 ms 26.49 ms +0.9% 3.0% 38.09% (declared 15%)
state.append_1k 127.04 ms 125.96 ms -0.9% 1.3% 39.36% (declared 15%)
config.reload_gc_100k 2.707 s 2.729 s +0.8% 0.7% 25%
schedule.reseed_100k 209.56 ms 211.26 ms +0.8% 0.8% 15%
cronexpr.parse_simple 44.58 ms 44.93 ms +0.8% 1.8% 22.43% (declared 15%)
statsd.emit_2k 15.22 ms 15.10 ms -0.8% 2.3% 65.69% (declared 25%)
dag.list_dags_warm 1.09 ms 1.10 ms +0.8% 1.8% 183.1% (declared 25%)
job.report_noop_100k 52.91 ms 52.53 ms -0.7% 3.3% 15%
loop.idle_wake_rate 21.88 ms 22.03 ms +0.7% 1.7% 25%
startup.validate_config_100 221.44 ms 222.66 ms +0.7% 0.7% 25%
cluster.fleet_view_15x400 85.10 ms 85.66 ms +0.7% 0.5% 25%
dag.build_chain_10k 29.16 ms 28.97 ms -0.7% 1.0% 34.29% (declared 15%)
cronexpr.test_match_200k 24.51 ms 24.67 ms +0.7% 3.4% 40.8% (declared 15%)
config.reload_warm_include_50 100.59 ms 99.95 ms -0.6% 2.3% 25%
webapi.sse_burst_20k 57.25 ms 56.89 ms -0.6% 0.8% 15%
state.list_records_warm 108.54 ms 107.90 ms -0.6% 1.6% 15%
cronexpr.next_simple 39.83 ms 39.60 ms -0.6% 1.6% 25.11% (declared 15%)
loop.stall_jobs_500 21.10 ms 20.99 ms -0.6% 1.8% Not enforced
schedule.due_pass_100k 16.06 ms 16.15 ms +0.5% 3.0% 62.27% (declared 25%)
config.parse_yaml_300 201.23 ms 200.19 ms -0.5% 2.4% 15%
schedule.cold_build_100k 491.60 ms 494.08 ms +0.5% 1.1% 15%
prometheus.render_500 17.05 ms 17.14 ms +0.5% 2.6% 58.64% (declared 15%)
state.boot_rehydrate_populated 43.03 ms 43.24 ms +0.5% 1.3% 23.24% (declared 15%)
dag.mapped_drain_256 19.80 ms 19.89 ms +0.4% 0.8% 50.5% (declared 25%)
dag.adopt_scan_500 103.45 ms 103.90 ms +0.4% 2.0% 25%
resources.monitor_stop_100 291.89 ms 290.64 ms -0.4% 1.4% 25%
json.roundtrip_3k 578.79 ms 581.19 ms +0.4% 1.1% 15%
job.stream_capture_120k 43.78 ms 43.96 ms +0.4% 1.4% 22.84% (declared 15%)
loop.stall_completions_500 10.16 ms 10.12 ms -0.4% 0.6% 49.22% (declared 25%)
config.parse_yaml_3k 1.988 s 1.981 s -0.4% 2.2% 15%
ical.render_500x7d 52.63 ms 52.43 ms -0.4% 1.1% 19% (declared 15%)
dag.advance_quiescent_chain 71.19 ms 70.93 ms -0.4% 0.7% 25%
tui.dag_graph_paint_2k 281.72 ms 282.75 ms +0.4% 0.7% 15%
redact.adversarial_10k 36.17 ms 36.30 ms +0.3% 2.9% 27.65% (declared 15%)
startup.import_config 97.02 ms 97.13 ms +0.3% 1.4% 25%
config.jobconfig_3k 68.43 ms 68.65 ms +0.3% 2.5% 15%
webapi.jobs_payload_500 56.00 ms 55.85 ms -0.3% 2.3% 17.86% (declared 15%)
startup.version 54.26 ms 54.20 ms +0.3% 0.6% 25%
state.artifact_get_newest 21.94 ms 22.00 ms +0.3% 0.9% 25%
webapi.auth_scope_20k 88.46 ms 88.23 ms -0.3% 2.7% 15%
state.mutate_document_1k 143.85 ms 144.20 ms +0.2% 1.1% 34.76% (declared 25%)
cronexpr.next_dst_2k 41.21 ms 41.30 ms +0.2% 2.7% 24.26% (declared 15%)
tui.log_restyle_5k 32.17 ms 32.11 ms -0.2% 1.7% 31.08% (declared 15%)
startup.import_cronexpr 29.40 ms 29.22 ms -0.2% 0.4% 25%
dag.advance_quiescent_1k 72.17 ms 72.31 ms +0.2% 0.8% 25%
state.derive_max_warm 149.49 ms 149.76 ms +0.2% 0.2% 15%
cronexpr.parse_complex 24.19 ms 24.23 ms +0.2% 2.0% 41.35% (declared 15%)
state.derive_max_cold 23.77 ms 23.81 ms +0.2% 1.9% 42.08% (declared 15%)
startup.import_daemon 181.45 ms 181.56 ms +0.2% 0.2% 25%
config.interp_2k 77.84 ms 77.96 ms +0.2% 1.4% 15%
push.seal_500 95.72 ms 95.87 ms +0.2% 0.5% 15%
mem.rss_version 14.45 MB 14.43 MB -0.1% 0.2% 25%
webui.render_fleet_15x400 23.86 ms 23.89 ms +0.1% 0.5% 25%
mem.rss_daemon_import 37.41 MB 37.37 MB -0.1% 0.1% 25%
tui.drawer_paint_5k 130.18 ms 130.08 ms -0.1% 0.7% 15%
tui.log_search_20k 15.39 ms 15.40 ms +0.1% 1.7% 64.96% (declared 15%)
dag.build_layered_10k 49.65 ms 49.61 ms -0.1% 3.1% 20.14% (declared 15%)
cluster.job_owner_2k 57.82 ms 57.86 ms +0.1% 5.4% 17.29% (declared 15%)
redact.secrets_5k 20.48 ms 20.49 ms +0.1% 2.0% 48.84% (declared 15%)
state.kv_roundtrip_200 56.77 ms 56.80 ms +0.0% 1.7% 17.61% (declared 15%)
webui.render_term_5k 108.85 ms 108.90 ms +0.0% 0.6% 25%
state.lease_renew_200 51.58 ms 51.59 ms +0.0% 1.4% 96.94% (declared 25%)
dag.list_runs_warm 12.97 ms 12.97 ms +0.0% 0.9% 25%
cluster.parse_summaries_6k 88.08 ms 88.06 ms -0.0% 1.7% 15%
json.roundtrip_orjson_3k 205.69 ms 205.72 ms +0.0% 1.4% 15%
state.fanout_gather_100 10.06 ms 10.06 ms +0.0% 2.6% 99.44% (declared 25%)
startup.job_set_id_100 227.78 ms 227.60 ms -0.0% 1.2% 25%
webui.append_line_5k 14.0 us 14.0 us -0.0% 6.0% 25%
webui.week_walk_500 3.45 ms 3.45 ms -0.0% 0.6% 57.97% (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.60 MB 1.60 MB +0.0% 0.0% 31.34% (declared 15%)
mem.retired_output_1k 0.17 MB 0.17 MB +0.0% 0.0% 296.4% (declared 15%)

What's Changed

  • Bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-actions group by @dependabot[bot] in #23
  • Bump sentry-sdk from 2.69.2 to 2.70.0 in the python group by @dependabot[bot] in #24
  • Bump the nix group with 2 updates by @dependabot[bot] in #25
  • Bump vmactions/freebsd-vm from 1.5.7 to 1.5.8 in the github-actions group across 1 directory by @dependabot[bot] in #26
  • Bump hypothesis from 6.168.0 to 6.168.1 in the python group by @dependabot[bot] in #27

Full Changelog: 1.2.57...1.2.58