Skip to content

1.2.65

Choose a tag to compare

@github-actions github-actions released this 12 Oct 21:36
· 65 commits to main since this release
Immutable release. Only release title and notes can be modified.
  • A run that has ended keeps its outcome until the daemon records it. A
    concurrencyPolicy: Replace launch leaves that run as it is, a Forbid
    launch starts its job, and a pooled run that finishes while the pool
    scheduler renews its lease keeps its result. POST /jobs/{name}/cancel
    and the MCP cron_cancel_job tool ask the runs that have not ended to
    stop. When every run has ended, the request returns 409 and the tool
    reports an error.
  • When the daemon cancels a run, it waits up to killTimeout for the job's
    own process and stops waiting when that process exits. On every platform
    except Windows, the forced kill of the rest of the process group follows
    within about 0.25 seconds. A workload that needs all of killTimeout to
    shut down must be the job's own process: an argv list, or exec as the
    last step of a shell command.
  • The daemon records a canceled or timed-out run within a time limit when a
    process that the run started holds its output open. A canceled run has
    30 seconds. A run that its executionTimeout ended, or a verification
    check that reached verify.timeout, has 30 seconds for each stream. The
    daemon then logs a warning, keeps the output captured so far, and records
    the run.
  • executionTimeout bounds a run until its captured output closes. When the
    job's own process exits inside the deadline and a process that it started
    still holds a captured stream open at the deadline, the daemon times the
    run out and records exit code -100.
  • When the operating system refuses the daemon's signal to a job's process,
    such as EPERM for a command that sudo runs, the daemon logs a warning
    and completes the cancel sequence. The process keeps running until it
    exits by itself.
  • A recorded run's finished_at is the instant the run ended, and ranAt
    and the archived output carry the same instant. A canceled or timed-out
    run that is recorded after a later run of the same job leaves the later
    run as the job's last run. onlyIfLastSucceeded, maxTimeSinceSuccess,
    and missed-run catch-up go by the instant each run ended.
  • When two runs of a job overlap, the success of the earlier run leaves the
    retries of the later scheduled run in place until that run has scheduled
    a retry. Once a retry is pending or its attempt is running, a success of
    any run of the job ends the retry sequence. A run canceled through
    POST /jobs/{name}/cancel or cron_cancel_job follows the same rule.
  • When concurrencyPolicy: Forbid drops a scheduled fire of a job that has
    no pool, the job's retry sequence stays as it is. A scheduled fire of a
    pooled job ends the job's retry sequence before it queues its own entry.
  • When the store write that records a pooled entry's completion fails, the
    pool scheduler writes it again on its next pass and on each lease
    heartbeat, every five seconds.
  • GET /pools, POST /pools/{name}/queue/{key}/cancel, and
    POST /jobs/{name}/start for a pooled job answer 503 with
    pool state is unavailable whenever pool state cannot be read or
    written. GET /jobs then answers 200, and the pool object of each
    pooled job carries queueUnavailable: true. The MCP cron_list_pools,
    cron_cancel_queued, and cron_run_job tools report the 503 as a tool
    error with the same text. The daemon logs a warning and drops a scheduled
    fire of a pooled job that finds pool state unavailable.
  • Once a run is recorded and its reports are sent, the daemon frees the
    run's process handles and the copy of its output that reports read.
  • A workflow whose configuration lists a task before its upstreams settles a
    failure in one scheduler pass.
  • The workflow retention pass lists a workflow's runs once and deletes them
    in batches of up to 32, each run under its lease. It keeps a run that a
    recovery in preparation or an open recovery batch references. Under
    state.maxOpsPerSecond of about 2 or lower, or on a slow store, a busy
    workflow can hold more than retainRuns finished runs, and a scheduled
    workflow run can start late.
  • A date-range recovery takes the lease of each source run before it writes
    its batch. While retention or another recovery holds the lease of a
    source run, the request answers 409 with
    source run is busy; retry shortly. When a source run is gone or its key
    holds another run, the message is
    recovery preview is stale; preview again.
  • POST /dags/{name}/recover, POST /dags/{name}/runs/{run_key}/recover,
    and POST /dags/{name}/backfill answer 503 whenever the state store
    cannot answer: on a store I/O error or a timeout, on a document that
    cannot be read, and while the configured store has not started. The
    message is recovery state is unavailable or
    backfill state is unavailable. After a fault during a backfill, the
    same request creates the rest of the runs. The MCP
    cron_preview_recovery, cron_recover_dag, and cron_backfill_dag
    tools report these answers as tool errors.
  • Publishing an artifact or an XCom value costs the same at any number of
    names in the scope. Workflow recovery's limit of 10,000 artifacts counts
    names.
  • Nodes that share a state store need synchronized clocks, and they should
    move to this release together. Until they do, a node on the previous
    release can answer not found for an artifact or an XCom value while a
    node on this release republishes it.
  • Planning a workflow rerun from a task follows each dependency once.
  • A configuration directory of more than 1,024 files reloads by reparsing
    only the files that changed. An include tree of that size reparses each
    changed file, each file that includes it, and the entry file.
  • A configuration file, an included file, or an env_file that changes
    while the daemon loads the configuration is parsed again. So is a
    configuration directory when a file joins or leaves it during the parse.
  • A source that cannot be read twice (a pipe, a FIFO, a terminal,
    /dev/stdin, or /dev/fd/N) is read again only when the file that names
    it is parsed again. Jobs keep the environment read from a piped
    env_file across a reload request and across an edit to another file.
  • When the configuration named by -c is a pipe, a FIFO, or a terminal,
    only a reload request (SIGHUP or cronstable service reload) reads it
    again. When another source changes, the once-a-minute check logs a
    warning and keeps the loaded configuration. A reload that reads zero
    bytes from such a configuration does the same. In both cases,
    cronstable_config_last_reload_successful reads 0.
  • A file that two files of one include tree both include is loaded under
    each of them and is no cycle. Only a file that holds defaults alone can
    be shared: a shared file that defines a job, a pool, or a web or
    logging section fails the load. A file that includes itself, directly
    or through other files, fails with include cycle detected at <path>.
  • A configuration file, a file of a configuration directory, or an included
    file that is not valid UTF-8 is a configuration error. The message is
    Could not load config file '<path>': followed by the decoding error.
    Windows PowerShell 5.1 writes little-endian UTF-16 when it redirects
    output to a file, which is the usual cause.
  • The file that cluster.etcd.password.fromFile names is a configuration
    source, as an env_file is: the once-a-minute check parses the
    configuration again when the file changes. Change the password on the
    etcd server before you replace the file.
  • Configuration parse time grows in proportion to the number of keys in a
    mapping. A pools or web.headers block with 2,000 entries loads in
    under a second.
  • The jobs and workflow tasks of one configuration file share one read of an
    env_file that they name or inherit from defaults.
  • cronstable --validate-config and cronstable --job-set-id exit without
    loading psutil. They load asyncio only for a configuration that has a
    push section or enables web.bonjour.
  • GET /activity takes two optional query parameters that cap the jobs in
    the response. jobs=N returns at most N jobs: the first N in
    configuration order, or the first N by name with sort=name. Each
    dashboard draws at most 80 heatmap rows and sends that cap.
  • The daemon compresses the dashboard page with zlib at level 9 for the
    first browser that accepts gzip and serves the stored result after that.
    Such a browser downloads about 180 KB. The page answers
    304 Not Modified to an If-None-Match header that carries its ETag
    in weak form or in a list.
  • The MCP cron_list_jobs tool builds full job rows only for the page that
    it returns, so the cost of a call follows the page size.
  • Some terminals send Alt with a navigation key as an Esc ahead of the
    key's own sequence. On every platform except Windows, the terminal
    dashboard reads that as the plain key, and the panel or drawer that is on
    top stays open.
  • Except on Windows, the terminal dashboard asks the terminal to mark each
    paste (bracketed paste), and marked text is text only. The text field
    with the focus takes it without its line breaks and other control
    characters, and no pasted character acts as a shortcut. The Windows
    console marks no paste, so a pasted line break, tab, or escape arrives
    as Enter, Tab, or Esc.
  • On Windows, the terminal dashboard reads key events from the console. A
    character outside the Basic Multilingual Plane, such as an emoji, arrives
    as one character, and a character composed with Alt and the numeric
    keypad is delivered. Shift-Tab steps the tabs of the job drawer and the
    state inspector backward. The dashboard restores the console's input mode
    when it exits, including after an error.
  • In the web dashboard, a job's countdown and its Next at time stay tied
    to the /jobs response that delivered them. When the daemon answers a
    poll with 304 Not Modified, the dashboard keeps the jobs it holds, and
    their countdowns run on. After the computer sleeps or its clock is set,
    the next poll takes a full response and restarts the countdowns from it.
    The Next at label names its day from the browser's local date.

Performance compared with 1.2.64

Regression check: passed for 189 of 191 metrics with regression limits. The remaining metrics could not be compared.

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 (197 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.64 1.2.65 Change Noise (±) Regression limit
dag.gc_excess_60 1.192 s 59.62 ms -95.0% 2.8% 25%
state.artifact_put_distinct_2k 496.71 ms 25.31 ms -94.9% 1.8% 25%
dag.recover_plan_from_1k 1.314 s 98.09 ms -92.5% 1.3% 15%
pools.admit_cycle_1k 1.247 s 126.68 ms -89.8% 0.7% 25%
webui.dirty_frame_rows_500 10.24 ms 1.22 ms -88.1% 6.4% Not enforced
state.artifact_get_oldest_2k 544.58 ms 70.92 ms -87.0% 0.8% 25%
mcp.list_jobs_page_500 728.51 ms 118.17 ms -83.8% 1.5% 15%
webui.boot_rows_500 731.70 ms 469.30 ms -35.9% 4.9% Not enforced
mcp.list_jobs_500 178.44 ms 114.57 ms -35.8% 1.2% 15%
config.parse_yaml_rich_20 300.65 ms 213.79 ms -28.9% 0.5% 15%
startup.validate_config_100 202.64 ms 163.02 ms -21.2% 0.7% 25%
startup.job_set_id_100 206.54 ms 168.70 ms -19.8% 0.7% 25%
mem.launch_reap_steady_20x55 0.44 MB 0.37 MB -15.2% 0.0% 15%
webapi.index_gzip_bytes 213.63 KB 181.36 KB -15.1% 0.0% 15%
state.artifact_get_newest 11.23 ms 9.69 ms -13.7% 2.0% 44.51% (declared 25%)
loop.stall_launch_herd_8k 54.38 ms 61.53 ms +13.1% 2.1% Not enforced
config.parse_yaml_3k 1.580 s 1.435 s -9.2% 0.6% 15%
startup.import_cronexpr 24.41 ms 25.01 ms +8.8% 1.0% 25%
config.parse_yaml_300 157.55 ms 143.97 ms -8.6% 0.4% 15%
config.reload_warm_include_50 79.83 ms 74.06 ms -7.2% 0.4% 25%
state.derive_max_cold 12.77 ms 13.68 ms +7.1% 1.0% 78.33% (declared 15%)
config.reload_warm_50 36.61 ms 34.13 ms -6.8% 1.1% 27.32% (declared 25%)
state.list_records_2k 14.49 ms 15.45 ms +6.6% 4.1% 69.01% (declared 15%)
job.launch_reap_2k 108.50 ms 115.08 ms +6.1% 1.2% 15%
startup.daemon_first_pass_2k 1.423 s 1.341 s -5.9% 0.3% 25%
job.launch_fail_retry_2k 125.69 ms 131.86 ms +4.9% 1.3% 15%
loop.sla_pass_5k_x10 126.66 ms 132.75 ms +4.8% 3.3% 15%
state.boot_rehydrate_populated 26.05 ms 27.14 ms +4.2% 1.3% 38.38% (declared 15%)
config.reload_warm_dir_1k 182.37 ms 188.77 ms +3.5% 0.3% 25%
webui.rows_layout_200 57.40 ms 55.40 ms -3.5% 3.1% 25%
state.fanout_gather_100 4.70 ms 4.85 ms +3.1% 3.3% 212.8% (declared 25%)
webui.tick_500 81.50 ms 79.30 ms -2.7% 5.0% 25%
config.reload_gc_100k 1.990 s 1.941 s -2.5% 1.6% 25%
job.report_noop_100k 41.34 ms 42.36 ms +2.4% 0.7% 15%
tui.poll_absorb_5k 87.73 ms 85.62 ms -2.4% 1.7% 15%
tui.wallboard_paint_5k 161.21 ms 157.36 ms -2.4% 1.8% 15%
loop.stall_mcp_jobs_500 6.69 ms 6.84 ms +2.4% 1.8% Not enforced
webapi.jobs_payload_500 41.92 ms 42.90 ms +2.3% 2.2% 23.85% (declared 15%)
loop.stall_metrics_2000 24.10 ms 24.66 ms +2.3% 2.4% Not enforced
prometheus.first_scrape_after_reload_500 162.41 ms 166.10 ms +2.3% 1.9% 15%
loop.idle_wake_rate 12.23 ms 12.49 ms +2.1% 2.3% 40.88% (declared 25%)
webui.radar_walk_500x150 52.10 ms 51.00 ms -2.1% 1.8% 25%
config.jobconfig_3k 50.18 ms 49.23 ms -1.9% 1.7% 19.93% (declared 15%)
state.append_pruned_1k 38.91 ms 39.64 ms +1.9% 2.3% 25%
state.gc_sweep_2k_streams 20.81 ms 20.42 ms -1.9% 2.5% 72.07% (declared 25%)
config.parse_dir_cold_200 243.32 ms 238.96 ms -1.8% 1.1% 25%
webui.filter_keys_500 57.80 ms 56.80 ms -1.7% 2.7% 25%
schedule.pressure_20k_48h 13.98 ms 14.22 ms +1.7% 2.5% 71.52% (declared 15%)
webui.select_move_500 64.10 ms 63.00 ms -1.7% 6.3% 25%
dag.adopt_scan_500 50.45 ms 51.24 ms +1.6% 2.0% 39.64% (declared 25%)
cronexpr.parse_complex 18.18 ms 17.91 ms -1.5% 2.9% 55.02% (declared 15%)
dag.mapped_drain_256 15.57 ms 15.35 ms -1.4% 2.4% 64.23% (declared 25%)
webui.wallboard_poll_500 55.80 ms 55.00 ms -1.4% 3.7% 25%
tui.palette_type_5k 152.98 ms 150.83 ms -1.4% 1.2% 15%
dag.full_sweep_50x200 106.30 ms 104.81 ms -1.4% 4.4% 25%
statsd.emit_2k 7.14 ms 7.24 ms +1.4% 0.5% 140% (declared 25%)
redact.adversarial_10k 29.63 ms 30.03 ms +1.4% 0.6% 33.75% (declared 15%)
webui.sort_500 52.70 ms 52.00 ms -1.3% 3.2% 25%
mcp.query_metrics_500 115.95 ms 114.50 ms -1.3% 1.5% 25%
schedule.due_pass_100k 16.32 ms 16.11 ms -1.3% 2.7% 61.28% (declared 25%)
dag.finish_fanin_20x1k 57.08 ms 57.77 ms +1.2% 1.8% 25%
config.parse_crontab_1k 9.83 ms 9.71 ms -1.2% 2.2% 101.8% (declared 15%)
config.interp_2k 52.77 ms 52.16 ms -1.2% 0.9% 18.95% (declared 15%)
state.list_records_warm 89.88 ms 90.90 ms +1.1% 2.6% 15%
mem.gc_pause_100k 142.12 ms 143.70 ms +1.1% 0.4% 25%
webui.render_fleet_15x400 22.64 ms 22.40 ms -1.1% 2.8% 25%
webapi.resources_poll_20x240 120.93 ms 122.18 ms +1.0% 1.3% 15%
state.list_documents_600 33.68 ms 34.03 ms +1.0% 1.7% 35.63% (declared 15%)
job.stream_passthrough_240k 117.56 ms 118.74 ms +1.0% 1.2% 15%
cluster.derive_cold_50 130.40 ms 131.69 ms +1.0% 1.1% 15%
mcp.fleet_15x400 146.67 ms 148.09 ms +1.0% 1.4% 15%
state.lease_renew_200 21.62 ms 21.41 ms -1.0% 1.2% 231.3% (declared 25%)
loop.stall_completions_500 6.64 ms 6.70 ms +1.0% 2.6% 75.29% (declared 25%)
webui.rows_diff_500 53.20 ms 52.70 ms -0.9% 2.0% 25%
tui.dag_graph_paint_2k 183.78 ms 182.07 ms -0.9% 1.4% 15%
pools.enqueue_burst_200 103.10 ms 102.15 ms -0.9% 2.1% 25%
jobapi.sem_denied_64x10 39.68 ms 39.32 ms -0.9% 0.9% 25%
state.artifact_list_churn_x500 35.69 ms 35.37 ms -0.9% 0.6% 28.02% (declared 25%)
webapi.dags_poll_1k 111.43 ms 112.42 ms +0.9% 0.5% 15%
schedule.lint_2500_zoned 52.43 ms 51.99 ms -0.8% 3.1% 15%
redact.secrets_5k 17.55 ms 17.69 ms +0.8% 0.8% 56.99% (declared 15%)
state.mutate_document_1k 112.43 ms 113.35 ms +0.8% 1.3% 44.47% (declared 25%)
mem.rss_daemon_import 37.66 MB 37.96 MB +0.8% 0.1% 25%
mem.rss_daemon_web_100 52.46 MB 52.88 MB +0.8% 0.1% 25%
schedule.cold_build_100k 392.88 ms 395.97 ms +0.8% 3.0% 15%
cronexpr.next_simple 32.39 ms 32.14 ms -0.8% 1.4% 30.87% (declared 15%)
ical.render_500x7d 42.61 ms 42.29 ms -0.8% 2.1% 23.47% (declared 15%)
tui.log_restyle_5k 25.34 ms 25.52 ms +0.7% 0.8% 39.47% (declared 15%)
cronexpr.next_dst_2k 32.89 ms 32.65 ms -0.7% 4.1% 30.41% (declared 15%)
startup.python_baseline 16.31 ms 16.20 ms -0.7% 1.9% Not enforced
webapi.sse_burst_20k 39.89 ms 40.16 ms +0.7% 1.3% 15%
webapi.index_bytes 631.03 KB 635.35 KB +0.7% 0.0% 15%
dag.plan_claim_10k 12.23 ms 12.31 ms +0.7% 3.2% 81.79% (declared 15%)
webapi.sse_tail_pump_4x20k 90.74 ms 91.35 ms +0.7% 1.7% 15%
tui.week_rows_500 110.54 ms 109.80 ms -0.7% 0.5% 15%
startup.mcp_bridge 100.28 ms 99.61 ms -0.7% 1.2% 25%
json.loads_wide_int_2k 203.59 ms 202.25 ms -0.7% 0.9% 15%
cluster.parse_summaries_6k 71.73 ms 72.19 ms +0.6% 1.9% 15%
schedule.reseed_100k 167.93 ms 169.00 ms +0.6% 1.8% 15%
fingerprint.job_set_id_10k 259.86 ms 261.46 ms +0.6% 0.6% 15%
mcp.handle_200 123.06 ms 123.81 ms +0.6% 0.4% 15%
webui.palette_keys_500 49.80 ms 50.10 ms +0.6% 2.1% 25%
webapi.dag_run_poll_1k 80.06 ms 80.53 ms +0.6% 0.8% 25%
resources.monitor_stop_100 148.46 ms 147.61 ms -0.6% 2.0% 25%
startup.jobcli_state_get 102.75 ms 102.14 ms -0.6% 1.3% 25%
json.roundtrip_3k 504.58 ms 501.84 ms -0.5% 1.3% 15%
webui.timeline_500 55.70 ms 56.00 ms +0.5% 1.1% 25%
state.depends_on_past_gate 1.77 ms 1.78 ms +0.5% 3.9% 113.1% (declared 25%)
dag.build_layered_10k 44.84 ms 45.07 ms +0.5% 2.1% 22.3% (declared 15%)
prometheus.render_500 15.20 ms 15.28 ms +0.5% 1.8% 65.79% (declared 15%)
resources.usage_from_dict_500 77.94 ms 77.56 ms -0.5% 2.3% 15%
startup.import_config 94.28 ms 93.79 ms -0.5% 1.7% 25%
cluster.peer_serve_400 133.83 ms 134.46 ms +0.5% 0.6% 15%
schedule.next_fires_2k 20.04 ms 19.95 ms -0.5% 2.0% 49.9% (declared 15%)
dag.advance_quiescent_1k 63.25 ms 63.55 ms +0.5% 0.4% 25%
startup.version 51.54 ms 51.58 ms +0.5% 1.3% 25%
state.append_1k 52.51 ms 52.28 ms -0.4% 1.0% 95.22% (declared 15%)
webui.render_rows_500 16.20 ms 16.13 ms -0.4% 2.6% 25%
job.stream_capture_120k 29.75 ms 29.62 ms -0.4% 1.4% 33.61% (declared 15%)
dag.advance_quiescent_chain 62.56 ms 62.81 ms +0.4% 0.8% 25%
tui.drawer_paint_5k 89.97 ms 89.61 ms -0.4% 1.2% 15%
tui.view_sort_5k 105.95 ms 106.37 ms +0.4% 0.6% 15%
push.seal_500 86.82 ms 87.15 ms +0.4% 0.8% 15%
cronexpr.test_match_200k 21.50 ms 21.58 ms +0.4% 1.2% 46.51% (declared 15%)
webui.week_walk_500x20 55.80 ms 55.60 ms -0.4% 0.7% 25%
cluster.poll_round_15x400 137.07 ms 136.61 ms -0.3% 0.7% 15%
state.derive_max_warm 121.30 ms 121.71 ms +0.3% 2.2% 15%
schedule.reseed_local_20k 74.72 ms 74.47 ms -0.3% 1.2% 15%
dag.run_wide_500 91.13 ms 91.43 ms +0.3% 1.4% 25%
tui.tail_ingest_30k 144.15 ms 143.69 ms -0.3% 0.9% 15%
prometheus.counter_snapshot_2k 106.36 ms 106.69 ms +0.3% 1.5% 15%
schedule.suggest_slot_5k_x20 63.64 ms 63.83 ms +0.3% 1.3% 15%
cronexpr.occurrences_1k 11.37 ms 11.40 ms +0.3% 2.4% 87.98% (declared 15%)
webui.render_term_5k 98.10 ms 98.40 ms +0.3% 1.4% 25%
dag.list_dags_warm_x300 38.40 ms 38.29 ms -0.3% 1.2% 25%
tui.table_paint_5k 142.00 ms 142.42 ms +0.3% 1.5% 15%
tui.mark_idle_300 226.59 ms 227.26 ms +0.3% 1.6% 15%
cluster.fleet_view_15x400 81.93 ms 82.17 ms +0.3% 0.7% 25%
dag.advance_waiting_mapped_1k 106.38 ms 106.08 ms -0.3% 0.8% 25%
cronexpr.parse_simple 36.91 ms 36.81 ms -0.3% 1.1% 27.09% (declared 15%)
push.seal_xwing_500 112.27 ms 112.56 ms +0.3% 0.4% 15%
push.fanout_8x100 143.39 ms 143.76 ms +0.3% 1.2% 15%
cronexpr.next_complex 12.62 ms 12.65 ms +0.2% 1.6% 79.23% (declared 15%)
startup.import_daemon 180.26 ms 180.53 ms +0.2% 0.9% 25%
dag.run_chain_100 127.08 ms 127.38 ms +0.2% 0.6% 25%
webapi.activity_build_500 161.60 ms 161.97 ms +0.2% 1.0% 15%
json.roundtrip_orjson_3k 173.71 ms 173.32 ms -0.2% 1.9% 15%
redact.clean_20k 18.22 ms 18.18 ms -0.2% 2.3% 54.88% (declared 15%)
mem.rss_version 14.41 MB 14.44 MB +0.2% 0.6% 25%
webui.dag_tasks_2k 49.50 ms 49.40 ms -0.2% 2.5% 25%
mem.rss_daemon_10k 142.52 MB 142.79 MB +0.2% 0.1% 25%
jobapi.read_path_10k 108.94 ms 108.74 ms -0.2% 1.8% 15%
schedule.duplicates_20k 16.83 ms 16.86 ms +0.2% 2.9% 59.41% (declared 15%)
webui.tail_term_2k 55.20 ms 55.10 ms -0.2% 1.6% 25%
fingerprint.job_set_id_rich_2k 213.04 ms 213.42 ms +0.2% 0.7% 15%
webapi.summary_status_500 133.19 ms 132.96 ms -0.2% 1.8% 15%
state.inventory_2k_streams 55.45 ms 55.36 ms -0.2% 1.5% Not enforced
dag.list_runs_warm 7.96 ms 7.98 ms +0.2% 1.4% 25%
webapi.gzip_body_500 51.84 ms 51.92 ms +0.2% 0.8% 19.29% (declared 15%)
dag.fanin_barrier_1k 164.63 ms 164.87 ms +0.1% 0.6% 25%
mem.jobconfig_2k 1.62 MB 1.62 MB +0.1% 0.6% 30.94% (declared 15%)
startup.import_tui 94.83 ms 94.81 ms +0.1% 1.1% 25%
pair.qr_encode_14 223.64 ms 223.91 ms +0.1% 1.8% 15%
dag.build_chain_10k 25.64 ms 25.61 ms -0.1% 1.9% 39.01% (declared 15%)
webui.logo_recovery 85.20 ms 85.10 ms -0.1% 1.3% 25%
cluster.job_owner_2k 51.51 ms 51.56 ms +0.1% 1.1% 19.41% (declared 15%)
tui.log_search_20k 13.27 ms 13.26 ms -0.1% 1.6% 75.37% (declared 15%)
tui.fleet_paint_15x400 121.01 ms 121.08 ms +0.1% 0.7% 15%
webapi.trends_build_5k 123.24 ms 123.19 ms -0.0% 2.4% 15%
state.kv_roundtrip_200 24.97 ms 24.96 ms -0.0% 1.8% 40.05% (declared 15%)
webapi.pools_poll_4x130 92.73 ms 92.76 ms +0.0% 0.7% 25%
loop.stall_jobs_500 18.08 ms 18.08 ms +0.0% 3.0% Not enforced
mem.jobconfig_envfile_2k 16.37 MB 16.37 MB +0.0% 0.1% 15%
mem.gc_manifest_scan_128x2k 14.32 MB 14.32 MB +0.0% 0.0% 15%
mem.parse_peak_rich_20 4.21 MB 4.21 MB -0.0% 0.0% 15%
mem.tui_state_5k 2.23 MB 2.23 MB +0.0% 0.0% 15%
webapi.auth_scope_20k 69.97 ms 69.97 ms -0.0% 1.7% 15%
prometheus.exposition_bytes_500 821.15 KB 821.17 KB +0.0% 0.0% 15%
webui.append_line_5k 12.0 us 12.0 us -0.0% 0.0% 25%
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 80.0 us 80.0 us +0.0% 0.0% 2500% (declared 25%)
webui.ledger_analyze_500x600 75.90 ms 75.90 ms +0.0% 1.2% 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.fleet_bytes_15x400 963.62 KB 963.62 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%
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 19.95 KB 19.95 KB +0.0% 0.0% 15%
mem.crontab_10k 2.80 MB 2.80 MB +0.0% 0.0% 17.85% (declared 15%)
mem.retired_output_1k 0.12 MB 0.12 MB +0.0% 0.0% 15%
mem.run_history_series_5 9.57 MB 9.57 MB +0.0% 0.0% 15%
mem.cluster_view_50x400 11.64 MB 11.64 MB +0.0% 0.0% 15%

No percentage comparison available: webapi.activity_capped_bytes_500, webui.swim_400x49.

Full Changelog: 1.2.64...1.2.65