Skip to content

Commit fbee8a4

Browse files
committed
Keep website metrics generation independent from ordinary CI queue
1 parent ee7c7be commit fbee8a4

8 files changed

Lines changed: 90 additions & 4 deletions

File tree

‎.github/workflows/AGENTS.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,6 @@
6060

6161
## Latest completed result eligibility, 2026-10-04
6262
- Latest benchmark metrics means the newest completed own-main push/manual Benchmarks producer with success/failure conclusion. Pending, skipped and canceled workflows have no completed comparison cohort and MUST NOT displace ready JSON. Exclude them before choosing the latest eligible producer; then reject its missing/corrupt/failed aggregate without older fallback. A canceled workflow_run event still cannot authorize publication. This refines the latest-result rule without accepting incomplete or fabricated measurements.
63+
64+
## Independent website queue, 2026-10-04
65+
- CI website generation MUST NOT wait for unrelated ordinary CI/RF3 execution from another run. Push/manual CI runs use their own run identity; PR keeps its existing ref-based cancellation. Website qualification and deployment use separate bounded job concurrency groups with cancel-in-progress=false, preserving source/latest-evidence freshness and all gates. This implements the owner-authorized independent website action without canceling database or test work.

‎.github/workflows/ci.yml‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ on:
1010
permissions:
1111
contents: read
1212
concurrency:
13-
group: keyload-ci-${{ github.event_name == 'workflow_run' && 'site' || github.ref }}
13+
group: keyload-ci-${{ github.event_name == 'workflow_run' && 'site' || github.event_name == 'pull_request' && github.ref || github.run_id }}
1414
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
1515
jobs:
1616
repository-checks:
@@ -205,6 +205,9 @@ jobs:
205205
if-no-files-found: error
206206
qualify:
207207
name: Check website
208+
concurrency:
209+
group: keyload-site-qualification
210+
cancel-in-progress: false
208211
if: >-
209212
github.repository == 'managedcode/KeyLoad' && github.event.repository.id == 477801965 &&
210213
((github.ref == 'refs/heads/main' &&
@@ -238,6 +241,9 @@ jobs:
238241
uses: ./control/.github/workflows/Features/BenchmarkComparisons/QualifySite
239242
deploy:
240243
name: Publish website
244+
concurrency:
245+
group: keyload-site-deployment
246+
cancel-in-progress: false
241247
needs: qualify
242248
if: ${{ always() && !cancelled() && needs.qualify.result == 'success' && needs.qualify.outputs.mode == 'publish' }}
243249
runs-on: ubuntu-latest

‎AGENTS.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,3 +459,6 @@ A bounded website qualification candidate contains the20-project historical runt
459459

460460
## Latest completed result eligibility, 2026-10-04
461461
- Latest benchmark metrics means the newest completed own-main push/manual Benchmarks producer with success/failure conclusion. Pending, skipped and canceled workflows have no completed comparison cohort and MUST NOT displace ready JSON. Exclude them before choosing the latest eligible producer; then reject its missing/corrupt/failed aggregate without older fallback. A canceled workflow_run event still cannot authorize publication. This refines the latest-result rule without accepting incomplete or fabricated measurements.
462+
463+
## Independent website queue, 2026-10-04
464+
- CI website generation MUST NOT wait for unrelated ordinary CI/RF3 execution from another run. Push/manual CI runs use their own run identity; PR keeps its existing ref-based cancellation. Website qualification and deployment use separate bounded job concurrency groups with cancel-in-progress=false, preserving source/latest-evidence freshness and all gates. This implements the owner-authorized independent website action without canceling database or test work.

‎docs/ADR/ADR-080-benchmark-failure-isolation.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,3 +284,13 @@ failure producers before selecting highest run number; the actual canceled event
284284
still cannot authorize publication. Preserve no-fallback rejection after the
285285
newest eligible producer has a failed/missing/corrupt aggregate. The original
286286
metadata digest is f8816dacf8a60b68a41b8911185b8c97f2e27cbd816980f1331972b929d19007.
287+
288+
## Independent website execution queue
289+
290+
The delivered ee7 CI push37193589875 queued behind an older ordinary CI scalar/
291+
recovery run under the legacy main-wide workflow group. REQ/AC-BC-FAIL-021 makes
292+
push/manual CI groups run-specific, retains PR ref cancellation and workflow_run
293+
serialization, and adds separate qualification/deployment job groups. Website
294+
work starts independently while all ordinary suites remain mandatory. Root owns
295+
this CI policy/YAML/regression join; unchanged source/latest-evidence freshness
296+
and false cancellation protect publication, without canceling existing tests.

‎docs/Features/BenchmarkComparisons.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,8 @@ KeyLoad engine repair and concurrent series-codec work are outside this task.
720720

721721
| REQ-BC-FAIL-020 latest metrics for every website build | AC-BC-FAIL-020 select the highest run-number completed own-main Benchmarks run with success/failure conclusion across push/workflow_dispatch producers; pending, skipped and canceled runs have no finished comparison cohort and are not candidates. Require success/failure producer conclusion, successful aggregate and all original270/277 proofs. Reject missing/corrupt/latest failed aggregation without older fallback. Own-main CI push/manual and workflow_run all use this selection; changed latest tuple before deploy prevents stale refresh | Real producer-selection positive/negative TUnit cases, native CI capture and freshness/provider join |
722722

723+
| REQ-BC-FAIL-021 independent website queue | AC-BC-FAIL-021 own-main CI push/manual uses run-specific workflow concurrency so an unrelated older ordinary CI/RF3 run cannot queue the website consumer. PR retains ref cancellation; website qualify/deploy use distinct job-level serialization with cancel-in-progress=false. All tests, source/latest JSON and freshness gates remain unchanged | WorkflowLayoutCiSourceTests and actual CI job start while older ordinary source tests run |
724+
723725
TASK-FAIL-SEPARATE-001 (root) records policy/requirements/ADR before edits.
724726
TASK-FAIL-SEPARATE-002 (root) removes site generation and qualify/deploy from
725727
Benchmarks, adds independent CI own-main push/manual and workflow_run website jobs, and prevents ordinary CI suites

‎docs/implementation/benchmark-json-ci-development-2026-10-04.json‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,5 +267,46 @@
267267
"formatPassed": true,
268268
"nativeCIRecheck": "pending next scoped push",
269269
"browserExecutedLocally": false
270+
},
271+
"independentWebsiteQueueFollowup": {
272+
"oldQueuedCI": 37193589875,
273+
"blockedByOrdinarySourceCI": 37192832065,
274+
"workflowGroups": "run-specific push/manual; PR ref cancellation preserved; completed-workflow site channel preserved",
275+
"websiteJobGroups": [
276+
"keyload-site-qualification",
277+
"keyload-site-deployment"
278+
],
279+
"cancelInProgress": false,
280+
"ordinaryRequiredSuitesAndAllWebsiteGatesPreserved": true,
281+
"fullDevelopmentBuild": {
282+
"passed": true,
283+
"warnings": 0,
284+
"errors": 0,
285+
"logSha256": "adb249402deef8c2804582accfe5bbc820f54527024c1ee2c8ec7d72deef977e"
286+
},
287+
"formatPassed": true,
288+
"focusedAspireUnitTests": {
289+
"counts": {
290+
"total": "34",
291+
"executed": "34",
292+
"passed": "34",
293+
"failed": "0",
294+
"error": "0",
295+
"timeout": "0",
296+
"aborted": "0",
297+
"inconclusive": "0",
298+
"passedButRunAborted": "0",
299+
"notRunnable": "0",
300+
"notExecuted": "0",
301+
"disconnected": "0",
302+
"warning": "0",
303+
"completed": "0",
304+
"inProgress": "0",
305+
"pending": "0"
306+
},
307+
"sha256": "a078f3f0777130176bffe71592a59ce398c4b039e4ff9c32983ac1525fb6e6c6",
308+
"githubQualification": false
309+
},
310+
"deliveredNativeRecheck": "pending scoped push"
270311
}
271312
}

‎docs/implementation/status.json‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3814,7 +3814,8 @@
38143814
"REQ-BC-FAIL-017",
38153815
"REQ-BC-FAIL-018",
38163816
"REQ-BC-FAIL-019",
3817-
"REQ-BC-FAIL-020"
3817+
"REQ-BC-FAIL-020",
3818+
"REQ-BC-FAIL-021"
38183819
],
38193820
"ownerCorrection": "Independent static build action may follow JSON or run through CI; no benchmark Chrome/site tests; every site build uses latest completed authenticated benchmark",
38203821
"implementation": "source_implemented_and_development_verified",
@@ -3866,6 +3867,21 @@
38663867
"developmentBuildWarnings": 0,
38673868
"developmentBuildErrors": 0,
38683869
"nativeCIReverification": "pending_next_scoped_push"
3870+
},
3871+
"independentWebsiteQueue": {
3872+
"ordinaryPushManualGroup": "own_run_id",
3873+
"pullRequestCancellationPreserved": true,
3874+
"qualificationGroup": "keyload-site-qualification",
3875+
"deploymentGroup": "keyload-site-deployment",
3876+
"websiteCancelInProgress": false,
3877+
"fullDevelopmentBuildAndFormat": "passed",
3878+
"focusedAspireRegressions": {
3879+
"passed": 34,
3880+
"failed": 0,
3881+
"skipped": 0,
3882+
"trxSha256": "a078f3f0777130176bffe71592a59ce398c4b039e4ff9c32983ac1525fb6e6c6"
3883+
},
3884+
"nativeReverification": "pending next scoped push"
38693885
}
38703886
}
38713887
}

‎tests/KeyLoad.UnitTests/Features/RepositoryGovernance/WorkflowLayoutCiSourceTests.cs‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,19 @@ await Assert.That(events.Contains("workflow_run:\n workflows: [Benchmarks]\n
6868
}
6969

7070
[Test]
71-
public async Task AcBcFail018IndependentWebsiteChannelRetainsQualifiedLeastPrivilegePagesDelivery()
71+
public async Task AcBcFail018And021IndependentWebsiteQueueRetainsQualifiedLeastPrivilegePagesDelivery()
7272
{
7373
var ci = WorkflowLayoutSource.Read(CiFile);
74-
await Assert.That(ci.Contains("group: keyload-ci-${{ github.event_name == 'workflow_run' && 'site' || github.ref }}",
74+
await Assert.That(ci.Contains("group: keyload-ci-${{ github.event_name == 'workflow_run' && 'site' || github.event_name == 'pull_request' && github.ref || github.run_id }}",
7575
StringComparison.Ordinal)).IsTrue();
7676
await Assert.That(ci.Contains("cancel-in-progress: ${{ github.event_name == 'pull_request' }}",
7777
StringComparison.Ordinal)).IsTrue();
7878
var deploy = WorkflowLayoutSource.JobBlock(ci, "deploy");
79+
var qualify = WorkflowLayoutSource.JobBlock(ci, "qualify");
80+
await Assert.That(qualify.Contains("concurrency:\n group: keyload-site-qualification\n cancel-in-progress: false",
81+
StringComparison.Ordinal)).IsTrue();
82+
await Assert.That(deploy.Contains("concurrency:\n group: keyload-site-deployment\n cancel-in-progress: false",
83+
StringComparison.Ordinal)).IsTrue();
7984
await Assert.That(deploy.Contains("needs: qualify", StringComparison.Ordinal)).IsTrue();
8085
await Assert.That(deploy.Contains("always() && !cancelled()", StringComparison.Ordinal)).IsTrue();
8186
await Assert.That(deploy.Contains("needs.qualify.result == 'success'", StringComparison.Ordinal)).IsTrue();

0 commit comments

Comments
 (0)