Skip to content

Commit 31bb220

Browse files
committed
Checkpoint concurrent open-loop failure accounting cleanup
Include the shared-checkout change that arrived during the requested all-code push. Canonical build and runtime qualification remain incomplete as recorded in the preceding source checkpoint.
1 parent 5f0aa64 commit 31bb220

3 files changed

Lines changed: 150 additions & 14 deletions

File tree

‎benchmarks/KeyLoad.Comparisons/Features/BenchmarkComparisons/Execution/OpenLoopProducer.cs‎

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,7 @@ internal static async Task RunAsync(ScaledOperationInputs inputs,
4040
}
4141
catch (Exception error)
4242
{
43-
failure = error;
44-
try
45-
{
46-
failure = RecordFailedProduction(state, next, error);
47-
}
48-
catch (Exception accountingFailure)
49-
{
50-
failure = OpenLoopFailure.Combine(error, [accountingFailure])!;
51-
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(failure).Throw();
52-
throw;
53-
}
43+
RecordFailedProduction(state, next, error, ref failure);
5444
throw;
5545
}
5646
finally
@@ -67,9 +57,19 @@ private static void RecordUnofferedRemainder(OpenLoopRunState state, int next)
6757
}
6858
}
6959

70-
private static Exception RecordFailedProduction(OpenLoopRunState state, int next, Exception failure)
60+
private static void RecordFailedProduction(OpenLoopRunState state, int next, Exception primary,
61+
ref Exception? completionFailure)
7162
{
72-
RecordUnofferedRemainder(state, next);
73-
return failure;
63+
completionFailure = primary;
64+
try
65+
{
66+
RecordUnofferedRemainder(state, next);
67+
}
68+
catch (Exception accountingFailure)
69+
{
70+
completionFailure = OpenLoopFailure.Combine(primary, [accountingFailure])!;
71+
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(completionFailure).Throw();
72+
throw;
73+
}
7474
}
7575
}

‎docs/ADR/ADR-103-scaled-fair-comparisons.md‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,35 @@ The selected open-loop output follows the same caller-owned create-only path
232232
semantics as the existing CLI outputs: bounded resolved paths and plain parents,
233233
with no new confinement to a test temp root. Absolute/normalized paths remain
234234
valid; an actual linked-parent escape fails before any linked target is changed.
235+
236+
## Accepted stage13: original open-loop delivery and separate receipt
237+
238+
REQ-SCALE-022 / AC-SCALE-022 / TASK-SCALE-OPENLOOP-DELIVERY-001 freeze the exact
239+
terminal/artifact/completeness/fairness contracts in ScalingQualification before
240+
implementation. The source audit found no workflow selection or authenticated
241+
aggregation route for existing native measured/proof outputs. This stage joins
242+
that route without widening WorkerSha256 or existing site schemas.
243+
244+
Ordered stages: freeze the closed original terminal and cohort receipt; add new
245+
feature-local modules with real Node-process tooling flows; root joins canonical
246+
dispatch/finalizer/original GitHub ZIP admission and all eleven workflow groups
247+
together; retain and authenticate every measured/proof/unsupported/failed planned
248+
identity; run full Aspire-owned native gates and the exact-source Linux cohort.
249+
A complete authenticated failed cohort remains explicitly unqualified; missing
250+
or corrupt evidence fails closed without fallback.
251+
252+
Ownership: scripts/Features/BenchmarkComparisons holds new colocated executable
253+
artifacts; tests/KeyLoad.UnitTests/Features/BenchmarkComparisons holds applicable
254+
Cases/Helpers/Assertions/Models/Configuration. A dedicated Luna worker owns only
255+
guarded private new modules/tests. Root owns existing scripts/workflow joins,
256+
full review, gates, evidence and all-scope checkpoints. Dependencies are the
257+
canonical792/six plan, native measured/proof writers, artifact-bound sidecars
258+
and original bounded GitHub archive/metadata primitives. Tooling fixtures never
259+
count as authentic measurements or product functional-coverage contributors.
260+
261+
Migration is additive/internal; original control/scaled/vector/publication and
262+
native topologies remain mandatory. CI selects the new plan only after the
263+
coherent dispatch-to-intake route exists. Rollback removes only this new route
264+
and preserves original immutable evidence. No new website open-loop projection
265+
is enabled. This ADR remains Accepted with native and delivered-source gates
266+
pending until the complete required evidence exists.

‎docs/Features/BenchmarkComparisons/ScalingQualification.md‎

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,3 +612,107 @@ rows/output and rejection/create-only preservation. The CI workflow does not
612612
select the new flag until workload routing and separate artifact/fairness/admission
613613
contracts are implemented together. Planning metadata alone does not qualify any
614614
performance cell or refresh published evidence.
615+
616+
### Original open-loop terminal and cohort delivery
617+
618+
REQ-SCALE-022 / AC-SCALE-022 / TASK-SCALE-OPENLOOP-DELIVERY-001 require original
619+
native open-loop artifacts to travel through the same eleven named isolated
620+
Linux database jobs to a separate authenticated cohort receipt. Acceptance
621+
requires exact workload selection, original terminal publication, hash-bound
622+
archive admission, complete identity accounting and fairness validation. A plan
623+
is never a result. ADR-103 stage13 owns ordered implementation and agent joins.
624+
625+
The per-cell file is `open-loop-cell-terminal.v1.json`. Its closed JSON keys are
626+
schemaVersion (1), kind (`open-loop-cell-terminal.v1`), cell, worker, disposition,
627+
reason and artifacts. Cell is exactly the canonical plan's eight-field row.
628+
Worker has exactly the existing eleven isolated-worker keys: target, nodeCount,
629+
scenario, profile, sourceRevision, runId, attempt, repository, ref, workflow and
630+
jobId. Require agreement with the selected row and actual own-main Benchmarks
631+
source/run/attempt/current job. Artifact IDs and ZIP digests are authenticated
632+
after upload by GitHub intake; the producer cannot invent future upload metadata.
633+
634+
Each descriptor has exactly name, sizeInBytes and sha256, with positive bounded
635+
size and lowercase SHA-256 of the original regular file. Descriptors and ZIP
636+
entries are filename-sorted, unique and closed to these exact sets:
637+
638+
| Disposition | Original files beside the terminal | Reason and eligibility |
639+
| --- | --- | --- |
640+
| measured | open-loop-evidence.v1.json, open-loop-server-resource-evidence.v1.json | null reason; original native report and sidecar bound to its exact bytes |
641+
| cancellationProof | open-loop-cancellation-proof.v1.json, open-loop-server-resource-evidence.v1.json | null reason; only the six canonical KeyLoad RF3 PointRead proof cells |
642+
| unsupportedTopology | worker.json, server-resource-evidence.json | existing canonical native unsupported reason; validate the original generic pair using its own schema, with no open-loop metrics |
643+
| failed | no success-input files | existing fixed safe failed-cell reason, empty descriptors; original partial files remain in the independent owned failures artifact |
644+
645+
Do not put an open-loop hash in WorkerSha256 or change generic/control/scaled/
646+
vector/site/resource-v2 schemas. Successful workloads require their exact
647+
original artifact pair and qualified resource evidence. Missing, ambiguous or
648+
mismatched output fails the job. Failed workloads retain a cell-bound failed
649+
terminal and cleanup evidence on always(), plus their actual failed conclusion;
650+
they are never converted to unsupported or a successful measurement.
651+
652+
Bound terminals to64KiB, native measured/proof files to their existing4MiB limit
653+
and sidecars to the existing64KiB admission limit. Reuse existing original ZIP/
654+
file readers, total-cohort limits, plain-parent and atomic create-only output
655+
primitives. Reject links, duplicate/unexpected entries, expiry and byte/size/
656+
identity mismatch before admission. Original server/native-client resources,
657+
execution policy, images and membership cannot be reconstructed from logs/YAML.
658+
Tooling parser fixtures cannot authenticate GitHub or become measurements.
659+
660+
The workflow archives open-loop-isolated-plan.v1.json beside existing plans and
661+
supplies the optional fourth plan to the same eleven matrices only after all
662+
delivery joins exist. Each new row carries canonical ID, rate, proof boolean and
663+
existing scaled profile. run-workload.mjs recomputes and admits the exact row
664+
before Aspire starts: measured rows use
665+
`/*/*/IsolatedNativeOpenLoopComparisonTests/*`, proofs use
666+
`/*/*/IsolatedNativeOpenLoopCancellationTests/*`; both pass the admitted rate
667+
via KeyLoadTests:OpenLoopRate and the existing ScaleProfile. Reject mixed vector/
668+
control/rate/proof selectors before resource acquisition. The outer
669+
Benchmarks__OpenLoopRate key is not a substitute for the test entry. Absent-plan
670+
arguments and original129 matrix rows stay unchanged.
671+
672+
Keep comparison-open-loop-worker- / comparison-open-loop-proof- archive prefixes
673+
and their separate comparison-open-loop-case-qualification- /
674+
comparison-open-loop-proof-qualification- prefixes. Authenticate actual job
675+
name/ID/URL/conclusion/workload/upload steps independently from original GitHub
676+
artifact name/ID/digest/size/expiry; both identities must match the plan/run/attempt.
677+
678+
The separate open-loop-cohort-receipt.v1.json has exactly schemaVersion (1),
679+
kind (`open-loop-cohort-receipt.v1`), cohort, planSha256, cells, counts,
680+
failedCellIds and qualified. Cohort has exactly sourceRevision, runId, attempt,
681+
repository, ref and workflow; each actual profile belongs to its cell. Cells
682+
follow canonical measurement order then proof order. Each has exactly cell,
683+
disposition, reason, job, artifact, terminalSha256 and artifacts. Job/artifact use
684+
the existing authenticated metadata schemas. Counts have exactly
685+
plannedMeasurements, plannedProofs, measured, cancellationProof,
686+
unsupportedTopology and failed. failedCellIds is sorted/unique. Retain original
687+
archives/raw files; publish atomically only after complete validation settles.
688+
689+
Account for exactly792 measurement identities and six proofs. A fully successful
690+
qualified receipt contains648 measured,144 canonical unsupported and six accepted
691+
proof cells. A complete authenticated cohort with actual failed workloads may
692+
retain their terminal identities and emit qualified=false plus sorted failed IDs;
693+
it cannot qualify open-loop performance. Missing, duplicate, unplanned, corrupt,
694+
expired, skipped, canceled or mixed-run/attempt evidence rejects the cohort with
695+
no synthetic filling or historical fallback. Preserve the owner's failed-cell
696+
publication contract and original control/scaled/vector outputs.
697+
698+
Fairness groups compare the same nodeCount/scenario/rate/profile/dataset and
699+
equivalent acknowledgement/durability/authorization/read, arrival/deadline/drain/
700+
accounting, effective CPU/memory/storage, hardware-class and native-client
701+
policies. Bind actual target images/membership per target; different engines
702+
need not share image digests. Never average rates or count proofs as measured
703+
operations. Require qualified resources, complete denominators and original
704+
policy snapshots. Proofs separately verify the actual1024-completion milestone,
705+
original producer/calls/session/cancellation settlement and persisted healthy SDK
706+
read. Six-node/physical-owner movement/endurance/power-loss gates remain open.
707+
708+
New terminal/validation/receipt modules and a separate aggregate command belong
709+
to scripts/Features/BenchmarkComparisons. Root owns existing workflow/dispatch/
710+
finalizer/authenticated collector and eleven matrix joins. A Luna worker owns
711+
guarded new modules and complete Node-process tooling flows: publish actual
712+
tooling output and independently verify it; reject invalid operations while
713+
preserving original output, then perform a corrected successful follow-up.
714+
Native positive measured/proof evidence requires genuine Aspire-owned workloads;
715+
tooling fixtures are not database or GitHub qualification or product functional
716+
coverage. Retain full unit/scalar/recovery/RF3/comparison and exact-source Linux
717+
logs/TRX/archives/job URLs before closing AC-SCALE-022. This contract enables no
718+
new website open-loop metric projection.

0 commit comments

Comments
 (0)