Skip to content

Commit 59e393f

Browse files
committed
Implement shared native database benchmark methodology
Use one canonical pure, mixed and million-record ingestion schedule at native one and three nodes. Execute real independent 1/10/500-client ingestion with bounded admission, complete stored-state verification, three retained repetitions and explicit timing/resource evidence. Remove active two-node comparison cells and keep historical originals unchanged. Add an exclusive Aspire RF3 ingestion case with simultaneous SDK and official MCP reads. Authenticate its original job, TRX and image artifacts before qualifying the new document cohort. Keep measurements serial within isolated database jobs and preserve all existing qualification gates. Verification is pending in GitHub Actions after the owner's GitHub-only correction. Earlier development failures and mapped repairs are recorded honestly; this checkpoint does not claim complete native scale, coverage, endurance or production qualification.
1 parent 883a207 commit 59e393f

262 files changed

Lines changed: 6038 additions & 714 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/AGENTS.md‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
## Current first-release Website contract, owner corrections 2026-10-06
9393

9494
- The current four workflows are Build and Tests (`build-and-tests.yml`), Benchmarks (`benchmarks.yml`), Website (`website.yml`) and prepared manual Release (`release.yml`). Only Website builds, qualifies and publishes the site on trusted main push/manual; Benchmarks ends with a bounded Website dispatch and Website has no `workflow_run` executor subscription. These explicit owner corrections supersede every earlier three-workflow, filename, executor, placement and completion-subscription clause; every unrelated suite, permission and qualification rule remains mandatory.
95-
- The sole measured producer contract is the current 1,386-worker/2,530-input cohort in ADR-076. Its executed dependency manifest contains exactly 80 current source paths. Remove old-plan readers, schemas, event-file parsers and their exclusive fixtures or inventory entries under the root owner-only migration/legacy super rule. This supersedes earlier 270/277 and old-reader requirements only; retain bounded authenticated REST producer/artifact provenance, exact current source and input hashes, failed/null accounting, strict selected-evidence rejection, freshness and unchanged 80/70/90 coverage thresholds.
95+
- The sole measured producer contract is the current 924-worker/1,716-input website cohort plus separately authenticated 418-cell document family in ADR-076. Its executed dependency manifest contains exactly 84 current source paths. Remove old-plan readers, schemas, event-file parsers and their exclusive fixtures or inventory entries under the root owner-only migration/legacy super rule. This supersedes earlier 270/277 and old-reader requirements only; retain bounded authenticated REST producer/artifact provenance, exact current source and input hashes, failed/null accounting, strict selected-evidence rejection, freshness and unchanged 80/70/90 coverage thresholds.
9696
- When no current authenticated producer is ready, qualify the complete content-only site without figures. Real native TUnit/Node/Chrome operations, no skips in each applicable suite, source/coverage inventories and needs-gated least-privilege Pages remain required. Local tests enter the same Aspire-owned AppHost and are development evidence; genuine exact-source Linux/provider proof closes delivery. Controlled rejection inputs cannot become published measurements.
9797

9898
## Native TUnit entry, owner correction 2026-10-07
@@ -101,3 +101,7 @@
101101
## Website automatic trigger scope, owner correction 2026-10-08
102102

103103
- Website main pushes MUST be filtered to site and actual qualification/build/publication inputs; database-only pushes MUST NOT enqueue it. Benchmarks' final bounded dispatch MUST require all producer prerequisites, database matrices and aggregate to succeed. Website MUST authenticate successful terminal completion of a supplied triggering producer before proceeding. This explicit correction supersedes unfiltered push and failed-producer dispatch clauses only; preserve the existing manual/final-dispatch executor, independent site push path, optional metrics, bounded waits, immutable provenance, all qualification/freshness checks and least privileges.
104+
105+
## Native benchmark methodology, owner direction 2026-10-09
106+
107+
- ADR-122 and Methodology require only actual native1/3 topology, one shared pure/mixed/ingestion inventory and exclusive measurements. Active two-node dispatch/admission is removed; RF3 majority remains2. Preserve authenticated original failure/null and resource/source/provenance gates; new document-family originals are separately admitted before any numerical website rendering. Executed source closure reflects every new transitive input, with unchanged80/70/90 coverage thresholds.

‎.github/workflows/Features/BenchmarkComparisons/QualifySite/action.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ runs:
8282
git -C control rev-parse HEAD > "$EVIDENCE_DIR/control-revision.txt"
8383
closure="scripts/Features/BenchmarkComparisons/site-isolated-dependencies.txt"
8484
cmp "control/$closure" "website/$closure"
85-
[[ "$(wc -l < "control/$closure")" == 80 ]]
85+
[[ "$(wc -l < "control/$closure")" == 84 ]]
8686
LC_ALL=C sort -u "control/$closure" > "$EVIDENCE_DIR/isolated-dependencies.txt"
8787
cmp "control/$closure" "$EVIDENCE_DIR/isolated-dependencies.txt"
8888
sha256sum "website/$closure" >> "$EVIDENCE_DIR/executed-evidence-tools.sha256"

‎.github/workflows/benchmarks.yml‎

Lines changed: 83 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ jobs:
6161
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
6262
- name: Plan all benchmark scenarios
6363
id: plan
64-
run: node scripts/Features/BenchmarkComparisons/isolated-plan.mjs --output="$RUNNER_TEMP/isolated-plan.json" --scale-output="$RUNNER_TEMP/scaled-plan.json" --vector-output="$RUNNER_TEMP/vector-plan.json" --composite-output="$RUNNER_TEMP/composite-plan.json" --open-loop-output="$RUNNER_TEMP/open-loop-plan.json" --github-output="$GITHUB_OUTPUT"
64+
run: node scripts/Features/BenchmarkComparisons/isolated-plan.mjs --output="$RUNNER_TEMP/isolated-plan.json" --scale-output="$RUNNER_TEMP/scaled-plan.json" --vector-output="$RUNNER_TEMP/vector-plan.json" --composite-output="$RUNNER_TEMP/composite-plan.json" --open-loop-output="$RUNNER_TEMP/open-loop-plan.json" --document-output="$RUNNER_TEMP/document-plan.json" --github-output="$GITHUB_OUTPUT"
6565
- name: Save benchmark plan
6666
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
6767
with:
@@ -72,6 +72,7 @@ jobs:
7272
${{ runner.temp }}/vector-plan.json
7373
${{ runner.temp }}/composite-plan.json
7474
${{ runner.temp }}/open-loop-plan.json
75+
${{ runner.temp }}/document-plan.json
7576
if-no-files-found: error
7677
retention-days: 90
7778
comparison-images:
@@ -157,6 +158,10 @@ jobs:
157158
run: node scripts/Features/TestInfrastructure/run-tests.mjs --KeyLoadTests:Suite=comparison '--KeyLoadTests:Filter=/*/*/NativeBenchmarkProgressEntryTests/*' --KeyLoadTests:ResultsDirectory=TestResults/comparison-images/live-entry
158159
- name: Test benchmark phase and attempt counters
159160
run: node scripts/Features/TestInfrastructure/run-tests.mjs --KeyLoadTests:Suite=comparison '--KeyLoadTests:Filter=/*/*/ComparisonLiveProgress*/*' --KeyLoadTests:ResultsDirectory=TestResults/comparison-images/live-counters
161+
- name: Test document resource budgets and current native topology
162+
run: node scripts/Features/TestInfrastructure/run-tests.mjs --KeyLoadTests:Suite=comparison '--KeyLoadTests:Filter=/*/*/(DocumentResourceBudgetTests)|(NativeTopologyAdmissionTests)/*' --KeyLoadTests:ResultsDirectory=TestResults/comparison-images/document-admission --KeyLoadTests:ReportTrx=true
163+
- name: Test actual native document schedules and cancellation
164+
run: node scripts/Features/TestInfrastructure/run-tests.mjs --KeyLoadTests:Suite=comparison '--KeyLoadTests:Filter=/*/*/DocumentComparisonNativeTests/*' --KeyLoadTests:ResultsDirectory=TestResults/comparison-images/document-native --KeyLoadTests:ReportTrx=true
160165
- name: Test KeyLoad replay admission
161166
run: node scripts/Features/TestInfrastructure/run-tests.mjs --KeyLoadTests:Suite=comparison '--KeyLoadTests:Filter=/*/*/IsolatedKeyLoadReplayAdmissionTests/*' --KeyLoadTests:ResultsDirectory=TestResults/comparison-images/replay-admission
162167
- name: Test Redis replica error reporting
@@ -264,7 +269,7 @@ jobs:
264269
if: ${{ !cancelled() }}
265270
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
266271
with:
267-
name: ${{ matrix.kind == 'preflight' && 'comparison-preflight-' || matrix.kind == 'proof' && 'comparison-open-loop-proof-' || matrix.kind == 'open-loop' && 'comparison-open-loop-worker-' || 'comparison-worker-' }}${{ matrix.id }}
272+
name: ${{ matrix.kind == 'documents' && 'comparison-document-worker-' || matrix.kind == 'preflight' && 'comparison-preflight-' || matrix.kind == 'proof' && 'comparison-open-loop-proof-' || matrix.kind == 'open-loop' && 'comparison-open-loop-worker-' || 'comparison-worker-' }}${{ matrix.id }}
268273
path: artifacts/comparisons/isolated/workers/${{ matrix.id }}/*
269274
if-no-files-found: error
270275
retention-days: 90
@@ -273,7 +278,7 @@ jobs:
273278
uses: ./.github/workflows/Features/BenchmarkComparisons/IsolatedCellTeardown
274279
with:
275280
setup-outcome: ${{ steps.images.outcome }}
276-
artifact-name: ${{ matrix.kind == 'preflight' && 'comparison-preflight-qualification-' || matrix.kind == 'proof' && 'comparison-open-loop-proof-qualification-' || matrix.kind == 'open-loop' && 'comparison-open-loop-case-qualification-' || 'comparison-case-qualification-' }}${{ matrix.id }}
281+
artifact-name: ${{ matrix.kind == 'documents' && 'comparison-document-qualification-' || matrix.kind == 'preflight' && 'comparison-preflight-qualification-' || matrix.kind == 'proof' && 'comparison-open-loop-proof-qualification-' || matrix.kind == 'open-loop' && 'comparison-open-loop-case-qualification-' || 'comparison-case-qualification-' }}${{ matrix.id }}
277282
comparison-postgresql:
278283
name: ${{ matrix.jobName }}
279284
needs: [comparison-plan, comparison-images]
@@ -384,9 +389,57 @@ jobs:
384389
matrix: ${{ fromJSON(needs.comparison-plan.outputs.databases).helixdb }}
385390
env: *database-environment
386391
steps: *database-steps
392+
keyload-functional-heavy-load:
393+
name: KeyLoad functional RF3 million-record ingestion
394+
needs: [comparison-images]
395+
runs-on: ubuntu-latest
396+
timeout-minutes: 180
397+
steps:
398+
- name: Download source code
399+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
400+
- name: Set up .NET
401+
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68
402+
with:
403+
global-json-file: global.json
404+
- name: Check Docker
405+
run: docker version
406+
- name: Download exact source Docker images
407+
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131
408+
with:
409+
artifact-ids: ${{ needs.comparison-images.outputs.bundle-artifact-id }}
410+
path: ${{ runner.temp }}/keyload-image-bundle
411+
- name: Load and verify Docker images
412+
id: images
413+
run: node scripts/Features/BenchmarkComparisons/import-images.mjs --bundle="$RUNNER_TEMP/keyload-image-bundle"
414+
- name: Configure exact source KeyLoad image
415+
env:
416+
KEYLOAD_SERVER_IMAGE: ${{ steps.images.outputs.server-image }}
417+
run: |
418+
test -n "$KEYLOAD_SERVER_IMAGE"
419+
printf 'KeyLoad__ContainerImages__Server=%s\nKEYLOAD_IMAGE_RECEIPT=%s\n' "$KEYLOAD_SERVER_IMAGE" "$RUNNER_TEMP/keyload-images/image-receipt.json" >> "$GITHUB_ENV"
420+
- name: Restore .NET packages
421+
run: dotnet restore KeyLoad.slnx
422+
- name: Build functional RF3 tests
423+
run: dotnet build tests/KeyLoad.IntegrationTests --no-restore --configuration Release
424+
- name: Test ingestion while SDK and MCP reads are active
425+
run: node scripts/Features/TestInfrastructure/run-tests.mjs --KeyLoadTests:Suite=rf3 '--KeyLoadTests:Filter=/*/*/HeavyDocumentLoadRf3Tests/*' --KeyLoadTests:HeavyLoad:Enabled=true --KeyLoadTests:TimeoutMinutes=140 --KeyLoadTests:ResultsDirectory=TestResults/rf3-heavy-load --KeyLoadTests:ReportTrx=true
426+
- name: Clean up this job's Docker registry
427+
if: always()
428+
run: node scripts/Features/BenchmarkComparisons/cleanup-images.mjs
429+
- name: Save original functional load results and image receipts
430+
if: always()
431+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
432+
with:
433+
name: keyload-functional-heavy-load
434+
path: |
435+
TestResults/rf3-heavy-load/**
436+
${{ runner.temp }}/keyload-images/**
437+
artifacts/code-quality/**
438+
if-no-files-found: error
439+
retention-days: 90
387440
comparison-aggregate:
388441
name: Combine benchmark results
389-
needs: [comparison-build, comparison-plan, comparison-images, comparison-keyload, comparison-postgresql, comparison-qdrant, comparison-rabbitmq, comparison-redis, comparison-neo4j, comparison-mongodb, comparison-opensearch, comparison-kurrentdb, comparison-surrealdb, comparison-helixdb]
442+
needs: [comparison-build, comparison-plan, comparison-images, comparison-keyload, comparison-postgresql, comparison-qdrant, comparison-rabbitmq, comparison-redis, comparison-neo4j, comparison-mongodb, comparison-opensearch, comparison-kurrentdb, comparison-surrealdb, comparison-helixdb, keyload-functional-heavy-load]
390443
if: ${{ always() && !cancelled() && needs.comparison-plan.result == 'success' && needs.comparison-images.result == 'success' }}
391444
runs-on: ubuntu-latest
392445
timeout-minutes: 150
@@ -398,7 +451,7 @@ jobs:
398451
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
399452
- name: Verify benchmark plan
400453
id: plan
401-
run: node scripts/Features/BenchmarkComparisons/isolated-plan.mjs --output="$RUNNER_TEMP/isolated-plan.json" --scale-output="$RUNNER_TEMP/scaled-plan.json" --vector-output="$RUNNER_TEMP/vector-plan.json" --composite-output="$RUNNER_TEMP/composite-plan.json" --open-loop-output="$RUNNER_TEMP/open-loop-plan.json"
454+
run: node scripts/Features/BenchmarkComparisons/isolated-plan.mjs --output="$RUNNER_TEMP/isolated-plan.json" --scale-output="$RUNNER_TEMP/scaled-plan.json" --vector-output="$RUNNER_TEMP/vector-plan.json" --composite-output="$RUNNER_TEMP/composite-plan.json" --open-loop-output="$RUNNER_TEMP/open-loop-plan.json" --document-output="$RUNNER_TEMP/document-plan.json"
402455
- name: Download benchmark results
403456
run: node scripts/Features/BenchmarkComparisons/isolated-github-collect.mjs --plan="$RUNNER_TEMP/isolated-plan.json" --scale-plan="$RUNNER_TEMP/scaled-plan.json" --vector-plan="$RUNNER_TEMP/vector-plan.json" --input="$RUNNER_TEMP/isolated-capture"
404457
- name: Check control and complete scale accounting
@@ -452,9 +505,33 @@ jobs:
452505
path: ${{ runner.temp }}/open-loop-aggregate/**
453506
if-no-files-found: warn
454507
retention-days: 90
508+
- name: Download authenticated document workload results
509+
id: document-intake
510+
if: ${{ always() && !cancelled() && steps.plan.outcome == 'success' }}
511+
run: node scripts/Features/BenchmarkComparisons/document-github-collect.mjs --capture="$RUNNER_TEMP/isolated-capture/github" --plan="$RUNNER_TEMP/document-plan.json" --output="$RUNNER_TEMP/document-intake"
512+
- name: Aggregate complete pure mixed and ingestion results
513+
id: document-aggregate
514+
if: ${{ always() && !cancelled() && steps.document-intake.outcome == 'success' }}
515+
run: node scripts/Features/BenchmarkComparisons/document-aggregate-cli.mjs --input="$RUNNER_TEMP/document-intake" --output="$RUNNER_TEMP/document-aggregate"
516+
- name: Save original document workload evidence
517+
if: always()
518+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
519+
with:
520+
name: comparison-document-intake
521+
path: ${{ runner.temp }}/document-intake/**
522+
if-no-files-found: warn
523+
retention-days: 90
524+
- name: Save complete document workload cohort
525+
if: always()
526+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
527+
with:
528+
name: comparison-document-cohort
529+
path: ${{ runner.temp }}/document-aggregate/**
530+
if-no-files-found: warn
531+
retention-days: 90
455532
website-trigger:
456533
name: Trigger Website
457-
needs: [comparison-build, comparison-plan, comparison-images, comparison-keyload, comparison-postgresql, comparison-qdrant, comparison-rabbitmq, comparison-redis, comparison-neo4j, comparison-mongodb, comparison-opensearch, comparison-kurrentdb, comparison-surrealdb, comparison-helixdb, comparison-aggregate]
534+
needs: [comparison-build, comparison-plan, comparison-images, comparison-keyload, comparison-postgresql, comparison-qdrant, comparison-rabbitmq, comparison-redis, comparison-neo4j, comparison-mongodb, comparison-opensearch, comparison-kurrentdb, comparison-surrealdb, comparison-helixdb, keyload-functional-heavy-load, comparison-aggregate]
458535
if: >-
459536
always() && !cancelled() &&
460537
needs.comparison-aggregate.result == 'success' &&

0 commit comments

Comments
 (0)