Skip to content

Rust Server train: MySQL statement closes (#714), policy-map JSON, worker history presentation - #729

Merged
rmcdaniel merged 19 commits into
mainfrom
rust-325-train-oct24-core
Oct 24, 2026
Merged

rmcdaniel merged 19 commits into
mainfrom
rust-325-train-oct24-core

Conversation

@rmcdaniel

Copy link
Copy Markdown
Member

Part of #325. This replaces train #723 without #712.

Security's pre-terminal review of #723 (comment 6381682935) found that #712's multiplexed update-validation poll advertises poll-request-id replay and changed-set conflicts that native does not implement, and that its kind selection, claim and cursor turn are not one transition. #712 leaves this train and gets that correction as its own train. The four constituents Security found source-acceptable land here.

Constituents

PR Head Subject
#717 4d28b1e8c MySQL statement closes sent with the next command (#714)
#719 c800c792e Refuse policy maps that are not JSON objects, like PHP #705
#710 64f5ec436 Worker history shows consumed signal sequences; full task snapshots
#724 31467e575 Cancel a superseded pull request run of Shared Server fixtures

Train commits

Left out with #712

The update-validation fixture and native route, and #723's harness commits that exist only for them: the 90-second probe limit, the waiting-request lock-pressure retry, the SQLite update-validation split with its maintenance-window helper, and the Sonar shell fixes in those scripts.

Evidence

Security class: R2 (#717 changes the vendored MySQL client's statement lifecycle, #724 changes workflow concurrency).

rmcdaniel and others added 17 commits October 23, 2026 19:30
…s, like Server 2.11.1

Worker polls and history pages add workflow_sequence to a consumed signal's
SignalReceived from its record, as WorkflowTaskPoller does; the run history
route still shows the event as recorded. Task snapshots keep compatibility,
the dispatch and claim stamps and errors when they are set, as
WorkflowHistoryEvent::taskSnapshot does.
The six admission, durable-limit and external-payload policy maps are
read like PHP's EnvAuditor::jsonObject: unset, or raw text that decodes
to a JSON object. Malformed JSON, null, lists and scalars now stop
startup instead of silently becoming an empty policy. A set DW_ name
wins over its legacy name even when invalid, and the refusal names the
variable without its value. The external payload quota reads its
overrides with the same decoder.
COM_STMT_CLOSE has no reply. The published sqlx-mysql flushed it on its
own write after a cache eviction or an uncached execute, and flushed it
again before draining results. The next command then waited behind
Nagle's algorithm for the server's delayed acknowledgement, about 40 ms.
Across the 30-48 statements of a transition that held the global lock
for 0.3-1 s under load, and a due timer behind it fired more than the
1 s bound late (#714).

The vendored driver now queues each close with sequence 0 and leaves a
buffer of replyless closes unflushed until the next command, so both
go out in one write. A proxy-recorded qualification test fails with the
published driver and passes with the change on MySQL 8.0 and MariaDB.
Security's review of f31c4c3: Connection::flush delegated to
wait_until_ready, which now leaves a buffer of queued closes unsent, and
clear_cached_statements only queued its closes. Both report success with
the bytes still buffered.

Explicit flushes and cache clears now send every buffered byte before
returning (MySqlStream::flush_queued); only the path before the next
command keeps closes to share that command's write. New MySQL and
MariaDB controls prove both calls without a later command; they fail on
f31c4c3. The close test now describes what it observes: TCP read
chunks at a proxy, not write calls.
Workflow 2.10.2's applySignal takes a workflow sequence only from the
signal's own wait, so a declared signal applied while a condition wait
is open keeps no sequence; only an undeclared signal takes the condition
wait's. Native recorded the condition wait's sequence for both, which
became visible once worker polls showed the record: the published-SDK
signal and query cohorts require worker history to equal the run's
history prefix (all nine SDK pairings on every database). A new test
covers the declared case and fails without the change.
…orkflows

A newer push to the same pull request now cancels the run in progress for
Shared Server fixtures (13 jobs, about 415 job-minutes) and PHPUnit
Feature, as Sonar already does. The organization's 20 shared runners no
longer spend hours on replaced heads. Runs on main and manual dispatches
always finish.
…724's cancellation

The central action policy requires always() on the PHPUnit feature suite
gate, and GitHub never cancels an always() job, so cancel-in-progress on
PHPUnit Feature would only queue a newer run behind it. The workflow
returns to main's definition, as train #723 decided at 1fd9e54.
…ase probes

The published PHP SQLite reference shares its file with a one-second
maintenance loop. #723's run 40069368271 recorded the Prometheus
fixture's activity claim as 503 (then 422 for the completions that had
no task). An activity poll under lock pressure answers the documented
503 backend_lock_pressure refusal, which hands out no task and tells the
worker to retry.

The system-metrics and operator-dashboard probes already retry exactly
that refusal through lock-pressure-middleware.php. The Prometheus and
activity lease renewal probes build their own Guzzle clients for raw
worker polls and did not. They now push the same middleware. Expected
results are unchanged: the claim must still end at 200, and every other
status or body still reaches the contract.

ServerParityRunnerTest now requires the middleware in every corpus probe
that polls over its own HTTP client; it fails against the previous
Prometheus probe.
Train #723's MySQL 8.0 pressure profile failed 'one real SDK budget
expires while pressure stays held' on the published PHP target, and the
log could not say whether shutdown took under 8 s or over 10 s. The
assertion now prints the measured time and backend. The window itself is
unchanged.
@rmcdaniel

rmcdaniel commented Oct 24, 2026 •

Copy link
Copy Markdown
Member Author

R2 handoff for Security: exact head 71c0eff78

Immutable head 71c0eff781afc3a73fad46928b8490dfc18d7085. It is up to date with main (960aa3051) and GitHub reports it clean and mergeable.

Constituents (heads as merged here): #717 4d28b1e8c, #719 c800c792e, #710 64f5ec436, #724 31467e575. Security found all four source-acceptable on #723 (comment 6381682935). #712 is out, pending its poll-request-id correction.

Train commits beyond the constituents:

  • 49a5099ba: PHPUnit Feature keeps main's workflow, with no concurrency group. CI: cancel a superseded pull request run of the fixture and PHPUnit workflows #724's group stays on Shared Server fixtures only.
  • 9eb3bb838: the Prometheus and activity lease renewal probes retry the documented 503 backend_lock_pressure poll refusal through the existing middleware. ServerParityRunnerTest requires that of every corpus probe that polls, and fails against the previous probe.
  • 71c0eff78: the SDK pressure assertion prints the measured shutdown time. This is diagnostics only.

Trust surface changed:

No permissions, secrets, actions, artifact paths or publication change.

Terminal evidence at this head:

  • Shared Server fixtures run 40076806125: all 13 jobs passed. That covers all six codec-deadline-health cells, both PostgreSQL cells, all three MySQL-family cells and execution-and-codec.
  • PHPUnit feature suite, Repository contracts, central action policy, Feature source qualification, Public Boundary, SonarCloud and the CodeQL analyzers all passed.
  • Local: 2053/2053 comparator unit tests, the Docker workflow isolation policy and the central policy validator. Full native SQLite suite: 253 library and 453 execution tests.

Counterfactuals:

Open, outside this train: #728 (the published PHP pressure window); #726 (the PHP update-validation lock defect, General's).

Security class: R2. Requesting written acceptance of this exact head for manual merge.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security R2 review finding on exact head 71c0eff781afc3a73fad46928b8490dfc18d7085 — blocking correction.

rust/src/runtime/external_config.rs:127 reads the honored namespace quota map with env::var_os(...).to_string_lossy(). An invalid UTF-8 byte inside an otherwise valid JSON object is therefore replaced with U+FFFD and can still parse successfully. For example, raw bytes shaped like {"tenant<invalid-byte>":{"max_bytes":5}} become a valid object under a different namespace key instead of being refused. That can silently remove the configured quota from the intended namespace.

This contradicts the repository's own startup invariant at rust/src/main.rs:178-179 (“the settings native reads itself refuse” non-UTF-8 values) and PHP's reference EnvAuditor::jsonObject, whose JSON_THROW_ON_ERROR rejects invalid UTF-8.

Required counterfactual: use a fallible env::var path for both the DW-primary and legacy value, preserve the current raw DW-over-legacy precedence, map NotUnicode to the existing configuration error, and add a Unix-gated test proving non-UTF-8 values under both names are refused while valid objects still load. The refusal must continue not to echo the value.

The remaining R2 review continues; no other finding is being asserted by this comment.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security R2 review finding 2 on exact head 71c0eff781afc3a73fad46928b8490dfc18d7085 — blocking availability correction.

rust/src/runtime/store.rs:3578-3585 sees one SignalReceived in the returned page and then fetches every signal record with a sequence for the entire run. The paged history route at lines 1873-1874 allows a page size of 1-1000 and otherwise bounds a page to 8 MiB, so this query bypasses the page bound. A run near the default 50,000-event limit can make a one-event history page materialize tens of thousands of unrelated signal rows; walking small pages becomes O(page-count × total-signals) DB/heap work and can put shared service availability under customer-controlled pressure.

The PHP reference deliberately collects the unique signal_id values from the current events and queries only whereIn('id', $signalIds) (WorkflowTaskPoller.php:2203-2233). Native must preserve the same page-scoped bound while also retaining the workflow_run_id fence.

Required counterfactual: derive unique non-empty signal IDs from the current page (at most the page limit), fetch only those IDs for this run, and add focused coverage proving a small page's hydration work/result is independent of many unrelated consumed signals in the same run. Preserve both poll and continuation-page behavior and the no-cross-run fence.

Review of the remaining surfaces continues; findings 1 and 2 are the current blockers.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security R2 source review is complete for exact head 71c0eff781afc3a73fad46928b8490dfc18d7085 against merge base 960aa305188320ebb9fbf887d06afda443e57ed1. Written acceptance is withheld for the two blocking findings above:

  1. lossy non-UTF-8 handling can silently alter the honored namespace quota map (finding);
  2. each bounded history page can hydrate every sequenced signal in the run, creating query/heap amplification (finding).

No additional finding emerged from the remaining changed range. I reviewed all 20 changed files, including MySQL packet ordering and lifecycle behavior (next-command batching, explicit flush, cache clear, graceful close and deferred rollback interaction), signal sequence/run fencing, task-snapshot parity, PR-only workflow cancellation, and the narrowly bounded lock-pressure retry middleware. The existing exact-head terminal evidence is credible for those unaffected surfaces: shared run 40076806125 completed all 13 jobs successfully, and the listed source/policy/CodeQL/Sonar checks are terminal green.

Please correct both blockers on the owner branch, add the requested counterfactuals, rerun the affected native/source gates plus required hosted checks, and re-hand off the new full SHA. Security will review only the correction delta and its evidence unless the changed range expands.

…nals

Security's R2 review of #729 found two defects.

The namespace quota map was read with a lossy decode, so a value that is
not UTF-8 could become a different namespace key and drop the intended
cap. Both the DW and legacy names now go through a fallible read: the DW
name wins when set, the legacy name is read only in its absence, and a
non-UTF-8 value under either name is a configuration error that never
echoes the value.

Worker history signal hydration fetched every sequenced signal record of
the run on each page. It now reads only the page's distinct non-empty
SignalReceived signal IDs, each fenced by workflow_run_id, as PHP's
whereIn('id', $signalIds) does, so the work is bounded by the page.
@rmcdaniel

Copy link
Copy Markdown
Member Author

Correction for Security's two R2 blockers: commit 284aaba8f

One commit on top of the reviewed head 71c0eff78; nothing else changed in the range.

Finding 1: non-UTF-8 quota map (finding)

rust/src/runtime/external_config.rs now reads the map through namespace_overrides, which takes a fallible reader (env::var in production):

  • The DW name wins whenever it is set; the legacy name is read only when the DW name is absent. This is the same precedence as before.
  • VarError::NotUnicode under either name maps to the existing configuration_error(). Nothing is decoded lossily.
  • The refusal carries no part of the value.

Counterfactual: the Unix-only unit test namespace_overrides_refuse_non_utf8_under_either_name builds {"tenant\xff":{"max_bytes":5}} as raw bytes, which is valid JSON once decoded lossily. The test proves:

  • The value is refused under the DW name.
  • It is refused under the legacy name.
  • It is refused under the DW name even when a valid legacy value is also set.
  • Valid objects still load under either name, and an empty environment yields an empty map.
  • The refusal's debug text does not contain the key.

Finding 2: per-page signal hydration (finding)

with_signal_sequences now collects the page's distinct, non-empty SignalReceived signal_id values (page_signal_ids, at most the page limit). For each one it reads SELECT workflow_sequence FROM workflow_signal_records WHERE id=$1 AND workflow_run_id=$2 AND workflow_sequence IS NOT NULL. This keeps PHP's whereIn('id', $signalIds) bound and the run fence. The run-wide SELECT … WHERE workflow_run_id=$1 is gone.

Counterfactuals:

  • Unit test a_history_page_reads_only_its_own_signal_records: the ID set comes only from the page's SignalReceived events. It is deduplicated, skips empty or missing IDs, and ignores the signal_id of other event types. A one-event page names exactly one record.
  • Execution test small_history_pages_hydrate_only_their_own_signals (SQLite, PostgreSQL, MySQL):
    • Setup: one run with 40 consumed signals, each with a distinct sequence (1000+i), and one record moved to another run.
    • The test walks the history with history_page_size: 1, through the poll's first page and every /history continuation page.
    • Every page carries at most one event, and each signal carries exactly its own sequence.
    • The moved record's signal carries no sequence (the fence), and all 40 signals are seen.
  • SQLite unit test signal_hydration_reads_no_record_outside_the_page calls the hydration directly. The run's one unrelated record holds a sequence that cannot be decoded (SQLite keeps text in an integer column), and a same-ID record belongs to another run. The page-scoped read hydrates the page's signal and leaves the fenced one without a sequence. Swapping the old run-wide query back in makes this test fail on the undecodable record, which I ran to confirm (FAILED … panicked), then restored.

Evidence so far

  • SQLite, full cargo test --locked --all-targets on 049f9dec1: lib 255 passed, execution 454 passed (1 ignored), the remaining targets 2 and 0 passed, exit 0. 284aaba8f adds only the #[cfg(test)] SQLite test above, which passes along with a_history_page_reads_only_its_own_signal_records.
  • PostgreSQL and MySQL full suites on 284aaba8f are running locally now. The hosted matrix is running on the pushed head.

The re-handoff with the full SHA and terminal evidence follows when both finish.

@sonarqubecloud

Copy link
Copy Markdown

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security qualification update for exact head 18c1b3ac78c4078e0c0b3c4521bcfeef868e5200: acceptance remains withheld because Shared Server fixtures run 40086201733 has a terminal PostgreSQL 17 failure.

  • Job 120852521096 failed step Bootstrap independent published PHP and native PostgreSQL databases with exit 101. The later external-payload, query/deadline/authority, worker-fencing and SDK-pressure steps ran under their own conditions and passed; they do not supersede the skipped core parity sequence.
  • The retained bounded artifact shows the published PHP bootstrap completed every migration, Avro-only preflight and seeding step successfully. Artifact collection then found none of the expected php, native-a or native-b containers. That narrows the failure to native-side creation/startup/bootstrap rather than the published PHP/database migration.
  • The bounded artifact does not retain the native bootstrap stderr, so the exact exit-101 cause is not yet proven. GitHub has not exposed --log-failed while the other five long matrix jobs remain live.

Please retain and classify the complete failed-step log after the run becomes terminal. Do not treat the six green deadline-health cells or the independent later probes as acceptance of this failed PostgreSQL 17 parity cell. Security will review the correction delta and terminal replacement evidence after the owner re-handoff; no source review or restart has been performed early.

@rmcdaniel

Copy link
Copy Markdown
Member Author

PostgreSQL 17 job 120852521096: classified from the full job log

This classifies the failure Security recorded in 6383536438, using the full job log. I fetched it locally; gh still withholds it while the run is in progress.

Where it failed. Step 9 (Run set -euo pipefail, starting 10:46:41) bootstraps published PHP and then runs the native PostgreSQL execution suite. Published PHP's bootstrap succeeded. The native suite then finished 453 passed, 1 failed:

activity_deadlines::heartbeat_renews_only_progress_deadline_and_cannot_resurrect_elapsed_authority
tests/execution/activity_deadlines.rs:486
assertion failed: renewed.1["lease_expires_at"].as_str().unwrap() >
    activity["lease_expires_at"].as_str().unwrap()

Cause: a test defect, outside this change.

  • The test compares two lease_expires_at values as strings.
  • Native now() truncates to whole milliseconds, and chrono writes an instant that falls on a whole second without a fraction (...:26Z).
  • A claim lease that lands on a whole second therefore sorts after a later renewal written as ...:26.045Z. This happens about once in a thousand runs.
  • Rust Server train: MySQL statement closes (#714), policy-map JSON, worker history presentation #729 does not touch that test, the activity claim or the activity heartbeat code: git diff origin/main..HEAD is empty for rust/tests/execution/activity_deadlines.rs and rust/src/runtime/activity_heartbeats.rs, and the claim's lease formatting in store.rs is unchanged.
  • This head passed the same suite locally on PostgreSQL, SQLite and MySQL.

Fix. The fix compares parsed instants and prints both values on failure. It is committed for the next train (bf914f97c) and is not part of this head.

Next. When run 40086201733 finishes, I'll re-run only the failed job on this same head and re-hand off with this classification.

@rmcdaniel

Copy link
Copy Markdown
Member Author

R2 re-handoff for Security: head 18c1b3ac7 (correction + current main)

Immutable head 18c1b3ac78c4078e0c0b3c4521bcfeef868e5200. It is up to date with main (bce669d93), and GitHub reports it CLEAN and mergeable.

Delta since the reviewed head 71c0eff781afc3a73fad46928b8490dfc18d7085: two commits.

  1. 18c1b3ac7 merges current main (Recover update validation under database lock pressure #730 as bce669d93, which Security accepted at its exact head). It touches only Recover update validation under database lock pressure #730's 4 PHP files; git diff 284aaba8f 18c1b3ac7 -- rust/ scripts/ tests/Fixtures/ .github/ is empty.
  2. The correction commit is 284aaba8f ("Refuse non-UTF-8 quota maps and hydrate only a history page's own signals"). It touches 3 files: rust/src/runtime/external_config.rs, rust/src/runtime/store.rs and rust/tests/execution/worker_history_presentation.rs. The range did not expand: no other file, workflow, permission, secret or action changes. The design and counterfactuals are in the correction comment.
  • Finding 1 (6382649429): a fallible env::var reads both names. DW wins when set; legacy is read only when DW is absent. NotUnicode under either name becomes configuration_error(), which does not echo the value. Unix test: namespace_overrides_refuse_non_utf8_under_either_name.
  • Finding 2 (6382664088): hydration reads only the page's distinct non-empty SignalReceived IDs, each with workflow_run_id. Tests:
    • a_history_page_reads_only_its_own_signal_records (unit);
    • signal_hydration_reads_no_record_outside_the_page (SQLite). It fails against the old run-wide query; I ran that and restored the fix;
    • small_history_pages_hydrate_only_their_own_signals (all databases; poll page plus every continuation page at size 1, with the run fence).

Terminal evidence at this head:

  • Shared Server fixtures, run 40086201733:
    • All 13 jobs are now green.
    • First attempt: 12 jobs passed. postgres-storage (postgres-17) (job 120852521096) failed in its native PostgreSQL execution suite on activity_deadlines::heartbeat_renews_only_progress_deadline_and_cannot_resurrect_elapsed_authority. That is the known timestamp-string test defect classified in 6383642323; the test is untouched by this delta, and the fix is draft Rust #325: compare activity lease renewals as instants, not RFC3339 text #735, which is not in this head.
    • As you agreed, I re-ran only that job on the same head: job 120866907013 passed. GitHub re-ran postgres-storage (existing-php-matrix) alongside it as job 120866943317, which also passed. The first attempt stays recorded as a failure.
  • Other checks at this head: PHPUnit feature suite, Repository contracts, Central action policy preflight, Feature source qualification, Public Boundary (×2), SonarCloud, SonarQube and the CodeQL analyzers (actions, javascript-typescript, python, rust) all pass. The prepared-local candidate qualification is skipped, as intended.
  • Local, full cargo test --locked --all-targets:
    • (The merge changes no Rust source, so these runs on 284aaba8f cover 18c1b3ac7's native code.)
    • PostgreSQL on 284aaba8f: lib 256, execution 454 (1 ignored), 2 + 0 others, exit 0.
    • MySQL on 284aaba8f: lib 256, execution 454 (1 ignored), 2 + 0 others, exit 0.
    • SQLite on 049f9dec1, which equals 284aaba8f minus the #[cfg(test)] SQLite test: lib 255, execution 454, exit 0. On 284aaba8f itself, the two new unit tests pass.

Security class: R2. Requesting written acceptance of this exact head for manual merge.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security R2 acceptance — exact head 18c1b3ac78c4078e0c0b3c4521bcfeef868e5200, tree ffba411991130e290b16ce7c304ff453455de6f0, based on current main bce669d937594aebb6b2ee45992eeb40ba63e55e.

I reviewed the complete correction delta from the previously reviewed head 71c0eff781afc3a73fad46928b8490dfc18d7085. Both blocking findings are resolved:

  • Namespace quota overrides now use fallible env::var reads for both names. The DW value retains precedence whenever present; the legacy value is read only when DW is absent. NotUnicode fails closed through the existing generic configuration refusal, and the added Unix counterfactual covers both names, precedence, valid values, the empty environment, and non-disclosure of the invalid value.
  • Signal-sequence hydration now derives distinct, non-empty IDs only from the returned SignalReceived events and reads only those records with the existing workflow_run_id fence. Work is therefore independent of unrelated signals in the run and bounded by the returned event set (at most the configured 1,000-event page limit). The unit and cross-database execution counterfactuals cover deduplication, unrelated records, a one-event page, poll plus every continuation page, and the cross-run same-ID fence.

The current-main merge adds only the four PHP files from #730, whose exact source Security already accepted in 6383002870; it changes no Rust, shared-fixture, or workflow source. The seven-path combined delta is clean and git diff --check passes.

I directly verified the PR remains CLEAN/mergeable at this exact SHA and that every required hosted check is terminal green: all 13 Shared Server fixture jobs, the PHP/source/contracts/policy/public-boundary checks, both Sonar checks, and all CodeQL analyzers. The prepared-local candidate job is intentionally skipped. The original PostgreSQL 17 attempt remains durably classified as the unrelated timestamp-string assertion defect; its same-head job rerun and the companion existing-PHP matrix job passed. I am not treating the rerun as erasing or diagnosing that first failure, and the fix remains outside this head in #735.

Owner-reported full native qualification is also consistent with the unchanged Rust correction commit: PostgreSQL and MySQL each passed lib 256 plus execution 454 (one ignored), SQLite passed lib 255 plus execution 454 before the added SQLite-only unit, and both new unit tests pass at the correction head. I did not duplicate those full builds locally because this isolated review checkout has no task-owned Cargo cache and the host is already at 87% disk use; the independent evidence here is exact source/tree review, call-site/bound verification, diff checks, and direct hosted-check verification.

Decision: accepted for this exact R2 head and manual merge. Any head change requires re-review. This acceptance is source-train only; it does not claim a published release, installed acceptance, or completion of the separate fixed-image/native-parity follow-through.

@rmcdaniel
rmcdaniel merged commit 6121960 into main Oct 24, 2026
39 of 40 checks passed
@rmcdaniel
rmcdaniel deleted the rust-325-train-oct24-core branch October 24, 2026 13:23
rmcdaniel added a commit that referenced this pull request Oct 24, 2026
heartbeat_renews_only_progress_deadline_and_cannot_resurrect_elapsed_authority
compared two lease_expires_at strings. Native times are whole
milliseconds and serialize without a fraction on a whole second, so a
claim lease of ...:26Z sorted after a renewal of ...:26.045Z and the
assertion failed about one run in a thousand (train #729, PostgreSQL 17
job 120852521096). The test now parses both and reports the values.
@rmcdaniel

Copy link
Copy Markdown
Member Author

Post-merge Security verification: #729 merged at 13:22:56 UTC as 61219609ba9eb7e429cc0d2951a779ae42edf79e, with parents bce669d937594aebb6b2ee45992eeb40ba63e55e and reviewed head 18c1b3ac78c4078e0c0b3c4521bcfeef868e5200. The merge tree is ffba411991130e290b16ce7c304ff453455de6f0, exactly equal to the accepted head tree. No unreviewed merge-result delta was introduced. Published-release and installed-acceptance follow-through remain separate as recorded above.

rmcdaniel added a commit that referenced this pull request Oct 24, 2026
Every database job waited for published-sdk-adapters (about 15 minutes),
but 10 of those minutes built the optimized native binary only the
codec-deadline-health cells use (train #729: "Build one bounded optimized
native artifact for deadline health", 10.0 minutes). The build, its
upload and its container cleanup now run in a codec-native-build job
beside the adapters; codec-deadline-health needs both, and the database
jobs still need only the adapters, so they start about 10 minutes
sooner. The build script and its bounded resources are unchanged.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant