@@ -9,45 +9,116 @@ const MAX_DURATION_SEC = 900;
99
1010const PROFILE_DEFINITIONS = [
1111 {
12- id : "prime95-torture " ,
12+ id : "prime95-small-fft " ,
1313 toolId : "prime95" ,
14- label : "Prime95 / mprime Torture" ,
14+ label : "Prime95 / mprime Small FFT" ,
15+ target : "cpu" ,
16+ risk : "high" ,
17+ durationDefaultSec : 180 ,
18+ durationMaxSec : 600 ,
19+ args : ( ) => [ "-t" ] ,
20+ safety : {
21+ maxDurationSec : 600 ,
22+ recommendedMonitor : "Watch CPU package temperature and VRM temperature. Stop above your platform limit." ,
23+ stopBehavior : "RigScope terminates the process tree at the duration cap or when Stop Native is pressed."
24+ } ,
25+ notes : "Starts Prime95 torture mode. Prime95 chooses the exact torture preset from its local configuration, so treat it as a high-heat CPU test."
26+ } ,
27+ {
28+ id : "prime95-blend" ,
29+ toolId : "prime95" ,
30+ label : "Prime95 / mprime Blend" ,
1531 target : "cpu-memory" ,
1632 risk : "high" ,
1733 durationDefaultSec : 300 ,
1834 durationMaxSec : 900 ,
1935 args : ( ) => [ "-t" ] ,
20- notes : "Starts the built-in torture mode. Stop from RigScope or close Prime95/mprime."
36+ safety : {
37+ maxDurationSec : 900 ,
38+ recommendedMonitor : "Watch CPU temperature, memory temperature where available, and system responsiveness." ,
39+ stopBehavior : "RigScope terminates the process tree at the duration cap or when Stop Native is pressed."
40+ } ,
41+ notes : "Launches Prime95/mprime torture mode for a longer CPU/RAM stability pass. Configure blend mode inside Prime95 if prompted."
2142 } ,
2243 {
2344 id : "furmark-smoke" ,
2445 toolId : "furmark" ,
25- label : "FurMark GPU Smoke" ,
46+ label : "FurMark GPU Smoke 720p " ,
2647 target : "gpu" ,
2748 risk : "high" ,
2849 durationDefaultSec : 120 ,
50+ durationMaxSec : 300 ,
51+ args : ( tool , durationSec ) => {
52+ const exe = path . basename ( tool . executable ?. path || "" ) . toLowerCase ( ) ;
53+ if ( process . platform === "win32" ) {
54+ return exe . includes ( "furmark2" )
55+ ? [ "--demo" , "--fullscreen=0" ]
56+ : [ "/nogui" , "/width=1280" , "/height=720" , `/max_time=${ durationSec * 1000 } ` ] ;
57+ }
58+ return [ ] ;
59+ } ,
60+ safety : {
61+ maxDurationSec : 300 ,
62+ recommendedMonitor : "Watch GPU hotspot, memory junction where available, fan speed, and power draw." ,
63+ stopBehavior : "RigScope terminates the process tree at the duration cap or when Stop Native is pressed."
64+ } ,
65+ notes : "Launches FurMark with a conservative 720p windowed smoke profile when supported by the installed build."
66+ } ,
67+ {
68+ id : "furmark-burn-in-1080p" ,
69+ toolId : "furmark" ,
70+ label : "FurMark Burn-in 1080p" ,
71+ target : "gpu" ,
72+ risk : "extreme" ,
73+ durationDefaultSec : 180 ,
2974 durationMaxSec : 600 ,
30- args : ( tool ) => {
75+ args : ( tool , durationSec ) => {
3176 const exe = path . basename ( tool . executable ?. path || "" ) . toLowerCase ( ) ;
3277 if ( process . platform === "win32" ) {
3378 return exe . includes ( "furmark2" )
3479 ? [ "--demo" , "--fullscreen=0" ]
35- : [ "/nogui" , "/width=1280 " , "/height=720 " , " /max_time=120000" ] ;
80+ : [ "/nogui" , "/width=1920 " , "/height=1080 " , ` /max_time=${ durationSec * 1000 } ` ] ;
3681 }
3782 return [ ] ;
3883 } ,
39- notes : "Launches FurMark with a conservative windowed/smoke profile when supported by the installed build."
84+ safety : {
85+ maxDurationSec : 600 ,
86+ recommendedMonitor : "Use only with active temperature monitoring. Stop immediately on artifacts, throttling, or unstable power." ,
87+ stopBehavior : "RigScope terminates the process tree at the duration cap or when Stop Native is pressed."
88+ } ,
89+ notes : "High-load FurMark profile intended for short validation runs, not unattended overnight testing."
4090 } ,
4191 {
4292 id : "occt-manual" ,
4393 toolId : "occt" ,
44- label : "OCCT Manual Session" ,
94+ label : "OCCT Manual Stability Session" ,
4595 target : "stability-suite" ,
4696 risk : "high" ,
4797 durationDefaultSec : 300 ,
4898 durationMaxSec : 900 ,
4999 args : ( ) => [ ] ,
50- notes : "OCCT CLI differs by release, so RigScope launches OCCT and tracks the process; choose the exact test in OCCT."
100+ safety : {
101+ maxDurationSec : 900 ,
102+ recommendedMonitor : "Use OCCT's own telemetry and stop on errors, thermal throttling, or PSU instability." ,
103+ stopBehavior : "RigScope tracks and terminates the launched OCCT process when requested."
104+ } ,
105+ notes : "OCCT CLI differs by release, so RigScope launches OCCT and tracks the process; choose CPU, memory, GPU, or PSU inside OCCT."
106+ } ,
107+ {
108+ id : "occt-psu-manual" ,
109+ toolId : "occt" ,
110+ label : "OCCT PSU Manual Session" ,
111+ target : "psu-system" ,
112+ risk : "extreme" ,
113+ durationDefaultSec : 120 ,
114+ durationMaxSec : 300 ,
115+ args : ( ) => [ ] ,
116+ safety : {
117+ maxDurationSec : 300 ,
118+ recommendedMonitor : "PSU tests can load CPU and GPU together. Do not run unattended." ,
119+ stopBehavior : "RigScope tracks and terminates the launched OCCT process when requested."
120+ } ,
121+ notes : "Opens OCCT for a short manual PSU validation session. The exact test must be started inside OCCT."
51122 } ,
52123 {
53124 id : "y-cruncher-manual" ,
@@ -58,7 +129,12 @@ const PROFILE_DEFINITIONS = [
58129 durationDefaultSec : 300 ,
59130 durationMaxSec : 900 ,
60131 args : ( ) => [ ] ,
61- notes : "y-cruncher automation is intentionally not scripted yet; this launches the native tool and tracks it."
132+ safety : {
133+ maxDurationSec : 900 ,
134+ recommendedMonitor : "Watch CPU temperature and memory stability. y-cruncher can expose marginal RAM/IMC instability quickly." ,
135+ stopBehavior : "RigScope tracks and terminates the launched y-cruncher process when requested."
136+ } ,
137+ notes : "Launches y-cruncher for manual stress/benchmark selection and tracks the process."
62138 }
63139] ;
64140
@@ -75,7 +151,8 @@ const nativeRunner = {
75151 child : null ,
76152 exitCode : null ,
77153 signal : null ,
78- output : [ ]
154+ output : [ ] ,
155+ report : null
79156} ;
80157
81158function getProfiles ( ) {
@@ -95,6 +172,7 @@ function getProfiles() {
95172 durationDefaultSec : profile . durationDefaultSec ,
96173 durationMaxSec : profile . durationMaxSec ,
97174 acknowledgement : ACK ,
175+ safety : profile . safety ,
98176 notes : profile . notes
99177 } ;
100178 } ) ;
@@ -115,7 +193,31 @@ function getStatus(reason = "status") {
115193 durationMs : nativeRunner . durationMs ,
116194 exitCode : nativeRunner . exitCode ,
117195 signal : nativeRunner . signal ,
118- output : nativeRunner . output . slice ( - 12 )
196+ output : nativeRunner . output . slice ( - 12 ) ,
197+ report : nativeRunner . report
198+ } ;
199+ }
200+
201+ function buildReport ( reason = "status" ) {
202+ const elapsedMs = nativeRunner . startedAt ? Date . now ( ) - nativeRunner . startedAt : 0 ;
203+ const completedRatio = nativeRunner . durationMs ? Math . min ( 1 , elapsedMs / nativeRunner . durationMs ) : 0 ;
204+ return {
205+ generatedAt : new Date ( ) . toISOString ( ) ,
206+ reason,
207+ id : nativeRunner . id ,
208+ profileId : nativeRunner . profileId ,
209+ label : nativeRunner . label ,
210+ target : nativeRunner . target ,
211+ risk : nativeRunner . risk ,
212+ pid : nativeRunner . pid ,
213+ elapsedMs,
214+ durationMs : nativeRunner . durationMs ,
215+ completedRatio : Math . round ( completedRatio * 100 ) / 100 ,
216+ exitCode : nativeRunner . exitCode ,
217+ signal : nativeRunner . signal ,
218+ verdict : nativeRunner . exitCode === 0 ? "completed" : nativeRunner . signal ? "stopped" : reason ,
219+ outputTail : nativeRunner . output . slice ( - 20 ) ,
220+ safety : nativeRunner . safety
119221 } ;
120222}
121223
@@ -151,7 +253,7 @@ function startProfile(options = {}) {
151253
152254 const requested = Number ( options . durationSec ) || profile . durationDefaultSec ;
153255 const durationSec = Math . max ( 10 , Math . min ( requested , profile . durationMaxSec , MAX_DURATION_SEC ) ) ;
154- const args = profile . args ( tool ) ;
256+ const args = profile . args ( tool , durationSec ) ;
155257 const child = spawn ( tool . executable . path , args , {
156258 cwd : path . dirname ( tool . executable . path ) ,
157259 windowsHide : false ,
@@ -164,13 +266,17 @@ function startProfile(options = {}) {
164266 profileId : profile . id ,
165267 toolId : profile . toolId ,
166268 label : profile . label ,
269+ target : profile . target ,
270+ risk : profile . risk ,
271+ safety : profile . safety ,
167272 pid : child . pid ,
168273 startedAt : Date . now ( ) ,
169274 durationMs : durationSec * 1000 ,
170275 child,
171276 exitCode : null ,
172277 signal : null ,
173- output : [ ]
278+ output : [ ] ,
279+ report : null
174280 } ) ;
175281
176282 const capture = ( source , chunk ) => {
@@ -185,6 +291,7 @@ function startProfile(options = {}) {
185291 nativeRunner . active = false ;
186292 nativeRunner . exitCode = code ;
187293 nativeRunner . signal = signal ;
294+ nativeRunner . report = buildReport ( signal ? "stopped" : "exited" ) ;
188295 nativeRunner . child = null ;
189296 clearTimeout ( nativeRunner . timer ) ;
190297 } ) ;
@@ -200,9 +307,11 @@ function stopProfile(reason = "stopped") {
200307 if ( ! nativeRunner . active || ! child ) {
201308 nativeRunner . active = false ;
202309 nativeRunner . child = null ;
310+ nativeRunner . report = buildReport ( reason ) ;
203311 return getStatus ( reason ) ;
204312 }
205313 nativeRunner . active = false ;
314+ nativeRunner . report = buildReport ( reason ) ;
206315 if ( process . platform === "win32" && child . pid ) {
207316 execFile ( "taskkill.exe" , [ "/PID" , String ( child . pid ) , "/T" , "/F" ] , { windowsHide : true } , ( ) => { } ) ;
208317 } else {
0 commit comments