Skip to content

26.11.1.post4: scope, gates and schedule #401

Open

Description

@tae898

This is the plan and the gates for 26.11.1.post4, the release of all the glue work that follows 26.11.1.post3. The scope is all glue, not only the paths of the benchmark cells: every JSON text that crosses between Java and Python on a bulk or per-row path (#388), and the small per-call overheads that the CRUD audit found. The engine stays byte-identical to 26.11.1, as in post1 to post3.

Candidates, all drafts from the tag 26.11.1.post3, tests first, none of them measured yet: #389 native count(), #390 native create_vertices as a frame, #391 JVM graph_batch typed columns, #392 JVM insert_many typed columns, #393 native async create_record batch, #394 frame kinds for RID and number lists, #395 JVM get_rid readers, #396 JVM new_edge, #397 native reply tail and the dead entry, #398 native approximate vector search by pointer. #390 and #391 come first because the graph loads of the benchmark cells (create_vertices) run through them. I dropped the native columnar head frame (rank 4 of #388): by sizing it saves 0.03 to 0.34 ms per call and needs an API change.

What post3 taught me, and what changes for post4: its timed study had no figure for the exact shape of the benchmark cell that regressed (#400: a single-record UPDATE through command() in a begin and commit pair is about 26 percent slower than on 26.11.1), and it labelled one figure with the wrong auto-transaction mode. So the post4 study has a figure for the operation shape of every benchmark cell that a PR can touch, on both wheels, next to the figures of the PRs, and every figure is checked against the code path that it runs before it is credited to a PR.

Gates, all of them before a tag:

  • the full CI matrix (all legs, both wheels) is green on the integration branch, which holds exactly the candidates that go in; the draft pull requests only run the light checks (the heavy legs are skipped on them), so one full run of the branch that ships replaces ten runs of the branches that do not
  • a parity digest per figure: the stored data and the returned values are identical between the arms
  • a pre-registered timed A/B per candidate against the released post3 wheel (ABBA, A/A control, latency and peak memory), and the figures of the benchmark cells as a regression guard; a candidate with a figure that is slower than post3 stays out
  • the integration branch from the tag with the candidates that passed, its CI-built wheels measured as a whole (the gate run, as for post3)
  • the same wheels and the published 26.11.1, post2 and post3 measured side by side, solo on the mini, before the cherry-pick to main (post1 is left out: its native wheel was never published); each candidate marked in or out with the figure that decided it (post4: confirm each candidate solo on the mini against 26.11.1, post2 and post3, then cherry-pick only what passes #405)
  • the engine identity guard on the CI-built and on the published wheels
  • Native: single-record UPDATE through command() is about 26 percent slower on post3 than on 26.11.1 in the l1tpc paper cells #400 is understood, and fixed in post4 or named as open in the release notes
  • the docs describe what the tag contains and only the figures that were measured

Resources: CI is the authority for the full matrix. The laptop timed lane runs the A/B studies. The mini builds and tests the branches with Docker while it is idle (the first Java compile does not wait for the shared runner pool) and runs the benchmark cells solo. More timed lanes on the laptop and the mini come after their qualification (tracked in the control plane).

Schedule (estimates, not promises): first compile and test fixes of the candidates on 2026-11-15 and 16; the A/B studies on 2026-11-16 to 18; go or no-go on 2026-11-19; the tag on 2026-11-19 or 20; the mini reruns of the affected benchmark cells (graph loads on both wheels, about 8 hours) on 2026-11-20 and 21; landing on the page and in the paper notes on 2026-11-22 and 23; the paper deadline is 2026-11-24. A candidate that is not ready on the 19th goes into a later release.

Related: #315, #388, #400.

Activity

  1. self-assigned this
    on Nov 14, 2026
  2. added
    pythonPull requests that update python code
    performanceSpeed or memory of the bindings, with a measurement
    nativeThe arcadedb package (native library build)
    jvmThe arcadedb-jvm package (JPype build)
    on Nov 14, 2026
  3. added
    github_actionsPull requests that update GitHub Actions code
    vectorVector indexes and find_nearest
    on Nov 14, 2026
  4. added this to the 26.12.1 milestone on Nov 14, 2026
  5. tae898 commented on Nov 14, 2026

    @tae898
    CollaboratorAuthor

    Status of the ten candidates on 2026-11-14, evening. Every branch now has a CI-built wheel at its final head and a pre-registered per-candidate A/B in the timed queue. They wait for the A/A study, which is in its last rounds; it runs the released 26.11.1.post3 wheel on both sides and validates the figures, the path probes and the scorer, not any candidate.

    Five branches had never run their new code in a full CI matrix, and the first matrix found real problems. #391 failed on a stale tests/test_import_database.py from the tag against the moving latest engine image (it now takes the file from main). #392 had a real parity gap: a row holding a NaN, an infinity or a subnormal double stored its whole numbers as Integer where the old route stores Long; fixed in 85332a9. #395 called the bridge class in the new getters without the fallback that every other reader has; fixed in 84849b5. #393 and #396 had mistakes in their own tests, and the code of both is unchanged. #394 is green on the JVM wheel and on every Linux and macOS job of the native build; its Windows image build failed on a Maven Central fetch and I will re-run it before any merge. A JVM dispatch for an A/B now passes -f arcadedb-tag=26.11.1: the default takes the jars from the latest image, which is another engine.

    One change to the plan comes from #404. The native wheel on PyPI is a rebuild, and two builds of one commit differed by about 32 percent on the single-record UPDATE in the cell's process state. So the A arm of every native run is the CI-built post3 wheel, not the published one. A native guard figure that moves by 15 percent or more while the candidate's own figures are flat is flagged BUILD-SUSPECT, and the same commit is built again before the candidate is judged. The release gets a canary on the published post4 wheel too, with the cell shape as the figure.

    The schedule is as before: the per-candidate runs take about eight hours after the A/A study, the integration run follows, and the go or no-go is on 2026-11-19. Related: #404, #400.

  6. tae898 commented on Nov 15, 2026

    @tae898
    CollaboratorAuthor

    Added one gate to the list above: the integration wheels and the published 26.11.1, post1, post2 and post3 measured side by side, solo on the mini, before the cherry-pick to main (#405). Edits send no notification, so this comment says it.

  7. tae898 commented on Nov 15, 2026

    @tae898
    CollaboratorAuthor

    Changed the first gate above: the full CI matrix runs once on the integration branch (the one that ships), not on each of the ten draft branches. The drafts only run the light checks of a pull request (15 heavy legs are skipped on every one of them), so ten full runs would cost most of a day of runner time for branches that never ship as such, and the integration run is the stronger test because it covers the candidates together. A candidate that the integration run implicates still gets its own full run. Edits send no notification, so this comment says it.

  8. tae898 commented on Nov 15, 2026

    @tae898
    CollaboratorAuthor

    The in or out rule for the candidates, written before the last verdicts are in (so that no verdict decides its own rule):

    • A candidate goes in when at least one of its target figures is IMPROVED, no figure of it is slower than post3 outside the A/A band on the hosts that measured it (laptop and mini) once its fix is in, and parity holds.
    • A candidate stays out when a slowdown persists after its fix, or when it has no IMPROVED figure. A candidate whose figures are all WEAK has no evidence of a benefit, so it is out for now and comes back if the mini's longer-cap run (up to 40 rounds, written down before it ran) turns a figure IMPROVED. A WEAK figure is no claim, in either direction.
    • A guard figure that is slower on one build only is read against the build spread of Native wheels of one commit differ in speed: the published 26.11.1.post3 runs the single-record UPDATE about 32 percent slower than the CI build of the same commit #404 (the replicate builds of the integration branch), and a reason is recorded for it in the release runbook before the tag; a guard that is slower on every build is a regression and the candidate stays out.
    • The release notes and docs quote only the figures that were measured and not WEAK, generated by script from the score files.

    Where this stands: #393 and #395 (with its fix) are in unless the re-runs say otherwise; #390 is in if its small-batch fix clears n_gb_v_1 and the guard n_l2_read_point is not slower on the new build; #389, #391, #392, #396, #397 are pending the mini and the replicates; #394 and #398 are not measured yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

github_actionsPull requests that update GitHub Actions codejvmThe arcadedb-jvm package (JPype build)nativeThe arcadedb package (native library build)performanceSpeed or memory of the bindings, with a measurementpythonPull requests that update python codevectorVector indexes and find_nearest

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions