This is an automated email from the ASF dual-hosted git repository.

zqr10159 pushed a commit to branch 2.0.0
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/2.0.0 by this push:
     new 0a82473074 Gate frontend verify on three-signal cutoff
0a82473074 is described below

commit 0a8247307418a4fc670f18176f2ae48a0122c1a0
Author: Logic <[email protected]>
AuthorDate: Tue Jun 9 18:04:04 2026 +0800

    Gate frontend verify on three-signal cutoff
---
 web-next/package.json                              |  3 ++-
 web-next/scripts/release-checklist.mjs             | 11 ++++++++-
 web-next/scripts/release-checklist.test.ts         | 28 ++++++++++++++++++++--
 .../scripts/release-readiness-contract.test.ts     | 16 +++++++++++++
 4 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/web-next/package.json b/web-next/package.json
index 94a7c4a4ae..3505d95536 100644
--- a/web-next/package.json
+++ b/web-next/package.json
@@ -15,7 +15,8 @@
     "release:budget": "node ./scripts/release-budget.mjs",
     "release:compose": "node ./scripts/release-compose.mjs",
     "release:checklist": "node ./scripts/release-checklist.mjs",
-    "verify": "npm run lint && npm run test && npm run i18n:report && npm run 
route:matrix",
+    "three-signal:cutoff": "node 
./scripts/three-signal-alpha-cutoff-report.mjs",
+    "verify": "npm run lint && npm run test && npm run i18n:report && npm run 
route:matrix && npm run three-signal:cutoff",
     "verify:full": "npm run build && npm run release:budget && npm run 
release:compose && npm run release:checklist && npm run verify",
     "i18n:report": "node ./scripts/i18n-report.mjs"
   },
diff --git a/web-next/scripts/release-checklist.mjs 
b/web-next/scripts/release-checklist.mjs
index ed1c6a0e2d..c1e30717c6 100644
--- a/web-next/scripts/release-checklist.mjs
+++ b/web-next/scripts/release-checklist.mjs
@@ -69,6 +69,14 @@ export const RELEASE_CHECKLIST_ITEMS = [
       files.gateway.includes('location ^~ /api/') &&
       files.gateway.includes('location /') &&
       files.gateway.includes('proxy_pass http://hertzbeat:1157;')
+  },
+  {
+    key: 'three-signal-alpha-cutoff-evidence',
+    label: 'Three-signal alpha cutoff evidence report runs in frontend 
verification',
+    verify: files =>
+      files.packageJson.scripts?.['three-signal:cutoff'] === 'node 
./scripts/three-signal-alpha-cutoff-report.mjs' &&
+      files.packageJson.scripts?.verify?.includes('npm run 
three-signal:cutoff') &&
+      files.threeSignalAlphaCutoff.includes('verifyThreeSignalAlphaCutoff')
   }
 ];
 
@@ -84,7 +92,8 @@ export function readReleaseChecklistFiles(rootDir = repoRoot) 
{
     compose: 
readRepoFile('script/docker-compose/hertzbeat-postgresql-victoria-metrics-next-observability/docker-compose.yaml'),
     gateway: 
readRepoFile('script/docker-compose/hertzbeat-postgresql-victoria-metrics-next-observability/nginx/default.conf'),
     releaseBudget: readRepoFile('web-next/scripts/release-budget.mjs'),
-    releaseCompose: readRepoFile('web-next/scripts/release-compose.mjs')
+    releaseCompose: readRepoFile('web-next/scripts/release-compose.mjs'),
+    threeSignalAlphaCutoff: 
readRepoFile('web-next/scripts/three-signal-alpha-cutoff-report.mjs')
   };
 }
 
diff --git a/web-next/scripts/release-checklist.test.ts 
b/web-next/scripts/release-checklist.test.ts
index 19264688ec..4fc38181c1 100644
--- a/web-next/scripts/release-checklist.test.ts
+++ b/web-next/scripts/release-checklist.test.ts
@@ -16,8 +16,10 @@ function releaseFiles(overrides = {}) {
       scripts: {
         'verify:full':
           'npm run build && npm run release:budget && npm run release:compose 
&& npm run release:checklist && npm run verify',
+        verify: 'npm run lint && npm run test && npm run i18n:report && npm 
run route:matrix && npm run three-signal:cutoff',
         'release:budget': 'node ./scripts/release-budget.mjs',
-        'release:compose': 'node ./scripts/release-compose.mjs'
+        'release:compose': 'node ./scripts/release-compose.mjs',
+        'three-signal:cutoff': 'node 
./scripts/three-signal-alpha-cutoff-report.mjs'
       }
     },
     workflow: 'run: npm run verify:full\nrun: npm run parity:smoke:baseline',
@@ -29,6 +31,7 @@ function releaseFiles(overrides = {}) {
     gateway: `${gatewayRoutes}\nlocation ^~ /api/ {\n proxy_pass 
http://hertzbeat:1157;\n}\nlocation / {\n proxy_pass http://hertzbeat:1157;\n}`,
     releaseBudget: 'DEFAULT_RELEASE_BUDGET_BYTES\nevaluateReleaseBudget',
     releaseCompose: 'verifyReleaseComposeConfig\nHERTZBEAT_ROLLBACK_VERSION',
+    threeSignalAlphaCutoff: 'verifyThreeSignalAlphaCutoff',
     ...overrides
   };
 }
@@ -44,7 +47,8 @@ describe('release checklist gate', () => {
       'compose-version-convergence',
       'promotion-rollback-config',
       'bundle-budget',
-      'release-ingress-route-ownership'
+      'release-ingress-route-ownership',
+      'three-signal-alpha-cutoff-evidence'
     ]);
   });
 
@@ -61,4 +65,24 @@ describe('release checklist gate', () => {
     );
     expect(() => 
verifyReleaseChecklist(files)).toThrow('release-ingress-route-ownership');
   });
+
+  it('fails when the three-signal alpha cutoff evidence report is not wired 
into verify', () => {
+    const files = releaseFiles({
+      packageJson: {
+        scripts: {
+          'verify:full':
+            'npm run build && npm run release:budget && npm run 
release:compose && npm run release:checklist && npm run verify',
+          verify: 'npm run lint && npm run test && npm run i18n:report && npm 
run route:matrix',
+          'release:budget': 'node ./scripts/release-budget.mjs',
+          'release:compose': 'node ./scripts/release-compose.mjs',
+          'three-signal:cutoff': 'node 
./scripts/three-signal-alpha-cutoff-report.mjs'
+        }
+      }
+    });
+
+    expect(evaluateReleaseChecklist(files).find(result => result.key === 
'three-signal-alpha-cutoff-evidence')?.passed).toBe(
+      false,
+    );
+    expect(() => 
verifyReleaseChecklist(files)).toThrow('three-signal-alpha-cutoff-evidence');
+  });
 });
diff --git a/web-next/scripts/release-readiness-contract.test.ts 
b/web-next/scripts/release-readiness-contract.test.ts
index 19828c9080..2981264f78 100644
--- a/web-next/scripts/release-readiness-contract.test.ts
+++ b/web-next/scripts/release-readiness-contract.test.ts
@@ -37,6 +37,10 @@ function readReleaseChecklistScript(): string {
   return readFileSync(resolve(webNextRoot, 'scripts/release-checklist.mjs'), 
'utf8');
 }
 
+function readThreeSignalAlphaCutoffScript(): string {
+  return readFileSync(resolve(webNextRoot, 
'scripts/three-signal-alpha-cutoff-report.mjs'), 'utf8');
+}
+
 function readNextObservabilityGateway(): string {
   return readFileSync(
     resolve(repoRoot, 
'script/docker-compose/hertzbeat-postgresql-victoria-metrics-next-observability/nginx/default.conf'),
@@ -133,6 +137,7 @@ describe('release-readiness validation baseline', () => {
     );
     expect(releaseChecklistScript).toContain('RELEASE_CHECKLIST_ITEMS');
     expect(releaseChecklistScript).toContain('verifyReleaseChecklist');
+    
expect(releaseChecklistScript).toContain('three-signal-alpha-cutoff-evidence');
 
     for (const routePrefix of ['/_next/', '/overview', '/entities', '/alert', 
'/topology', '/setting']) {
       expect(gateway).toContain(`location ^~ ${routePrefix}`);
@@ -142,6 +147,17 @@ describe('release-readiness validation baseline', () => {
     expect(gateway).toContain('proxy_pass http://hertzbeat:1157;');
   });
 
+  it('keeps the three-signal alpha cutoff evidence report in frontend 
verification', () => {
+    const packageJson = readPackageJson();
+    const releaseChecklistScript = readReleaseChecklistScript();
+    const threeSignalAlphaCutoffScript = readThreeSignalAlphaCutoffScript();
+
+    expect(packageJson.scripts?.['three-signal:cutoff']).toBe('node 
./scripts/three-signal-alpha-cutoff-report.mjs');
+    expect(packageJson.scripts?.verify).toContain('npm run 
three-signal:cutoff');
+    expect(releaseChecklistScript).toContain('threeSignalAlphaCutoff');
+    
expect(threeSignalAlphaCutoffScript).toContain('verifyThreeSignalAlphaCutoff');
+  });
+
   it('keeps the web-next release image aligned with CI Node runtime', () => {
     const workflowNodeMajors = new 
Set(extractWorkflowNodeMajors(readWorkflow()));
     const dockerNodeMajors = new 
Set(extractDockerNodeMajors(readDockerfile()));


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to