prizmkit 1.1.92 → 1.1.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/VERSION.json +3 -3
- package/bundled/dev-pipeline/.env.example +0 -4
- package/bundled/dev-pipeline/README.md +9 -39
- package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +0 -4
- package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +0 -2
- package/bundled/dev-pipeline/launch-bugfix-daemon.sh +0 -1
- package/bundled/dev-pipeline/launch-feature-daemon.sh +2 -3
- package/bundled/dev-pipeline/launch-refactor-daemon.sh +0 -1
- package/bundled/dev-pipeline/lib/heartbeat.sh +4 -50
- package/bundled/dev-pipeline/run-bugfix.sh +9 -77
- package/bundled/dev-pipeline/run-feature.sh +8 -94
- package/bundled/dev-pipeline/run-recovery.sh +1 -32
- package/bundled/dev-pipeline/run-refactor.sh +8 -78
- package/bundled/dev-pipeline/tests/test-deploy-safety.sh +3 -3
- package/bundled/dev-pipeline-windows/.env.example +0 -4
- package/bundled/dev-pipeline-windows/SCHEMA_ANALYSIS.md +0 -4
- package/bundled/dev-pipeline-windows/assets/prizm-dev-team-integration.md +0 -2
- package/bundled/dev-pipeline-windows/lib/pipeline.ps1 +19 -139
- package/bundled/dev-pipeline-windows/run-recovery.ps1 +4 -19
- package/bundled/skills/_metadata.json +1 -1
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +1 -1
- package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +5 -15
- package/bundled/skills/feature-pipeline-launcher/SKILL.md +4 -4
- package/bundled/skills/feature-pipeline-launcher/references/configuration.md +3 -13
- package/bundled/skills/refactor-pipeline-launcher/SKILL.md +3 -3
- package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +4 -14
- package/bundled/skills-windows/bugfix-pipeline-launcher/SKILL.md +1 -1
- package/bundled/skills-windows/bugfix-pipeline-launcher/references/configuration.md +4 -14
- package/bundled/skills-windows/feature-pipeline-launcher/SKILL.md +4 -4
- package/bundled/skills-windows/feature-pipeline-launcher/references/configuration.md +2 -12
- package/bundled/skills-windows/refactor-pipeline-launcher/SKILL.md +3 -3
- package/bundled/skills-windows/refactor-pipeline-launcher/references/configuration.md +4 -14
- package/package.json +1 -1
- package/bundled/dev-pipeline/scripts/cleanup-logs.py +0 -192
- package/bundled/dev-pipeline-windows/scripts/cleanup-logs.py +0 -192
|
@@ -44,7 +44,7 @@ function Invoke-PrizmPipeline {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
if ($command -in @('help','--help','-h')) {
|
|
47
|
-
Write-Host "Usage: .\run-$Kind.ps1 run [item-id] [list-path] [--dry-run] [--mode lite|standard|full] [--critic] [--max-retries N] [--max-infra-retries N]
|
|
47
|
+
Write-Host "Usage: .\run-$Kind.ps1 run [item-id] [list-path] [--dry-run] [--mode lite|standard|full] [--critic] [--max-retries N] [--max-infra-retries N]"
|
|
48
48
|
Write-Host " .\run-$Kind.ps1 status [list-path]"
|
|
49
49
|
Write-Host " .\run-$Kind.ps1 reset"
|
|
50
50
|
Write-Host ""
|
|
@@ -90,14 +90,6 @@ function Invoke-PrizmPipeline {
|
|
|
90
90
|
$maxInfraRetries = $null
|
|
91
91
|
if ($envMaxInfraRetryArgs.Count -gt 0) { $maxInfraRetries = [int]$envMaxInfraRetryArgs[1] }
|
|
92
92
|
$verboseEnabled = $env:VERBOSE -in @('1','true','yes','on')
|
|
93
|
-
$timeoutSeconds = 0
|
|
94
|
-
if ($env:SESSION_TIMEOUT) {
|
|
95
|
-
$parsedEnvTimeout = 0
|
|
96
|
-
if (-not [int]::TryParse($env:SESSION_TIMEOUT, [ref]$parsedEnvTimeout) -or $parsedEnvTimeout -lt 0) {
|
|
97
|
-
throw "SESSION_TIMEOUT must be a non-negative integer: $($env:SESSION_TIMEOUT)"
|
|
98
|
-
}
|
|
99
|
-
$timeoutSeconds = $parsedEnvTimeout
|
|
100
|
-
}
|
|
101
93
|
$heartbeatInterval = 30
|
|
102
94
|
if ($env:HEARTBEAT_INTERVAL) {
|
|
103
95
|
$parsedHeartbeatInterval = 0
|
|
@@ -126,26 +118,6 @@ function Invoke-PrizmPipeline {
|
|
|
126
118
|
$enableDeploy = $env:ENABLE_DEPLOY -in @('1','true','yes','on')
|
|
127
119
|
$stopOnFailure = $env:STOP_ON_FAILURE -in @('1','true','yes','on')
|
|
128
120
|
$devBranchOverride = if ($env:DEV_BRANCH) { $env:DEV_BRANCH.Trim() } else { '' }
|
|
129
|
-
$logCleanupEnabled = $true
|
|
130
|
-
if ($env:LOG_CLEANUP_ENABLED) {
|
|
131
|
-
$logCleanupEnabled = $env:LOG_CLEANUP_ENABLED -in @('1','true','yes','on')
|
|
132
|
-
}
|
|
133
|
-
$logRetentionDays = 14
|
|
134
|
-
if ($env:LOG_RETENTION_DAYS) {
|
|
135
|
-
$parsedLogRetentionDays = 0
|
|
136
|
-
if (-not [int]::TryParse($env:LOG_RETENTION_DAYS, [ref]$parsedLogRetentionDays) -or $parsedLogRetentionDays -lt 0) {
|
|
137
|
-
throw "LOG_RETENTION_DAYS must be a non-negative integer: $($env:LOG_RETENTION_DAYS)"
|
|
138
|
-
}
|
|
139
|
-
$logRetentionDays = $parsedLogRetentionDays
|
|
140
|
-
}
|
|
141
|
-
$logMaxTotalMb = 1024
|
|
142
|
-
if ($env:LOG_MAX_TOTAL_MB) {
|
|
143
|
-
$parsedLogMaxTotalMb = 0
|
|
144
|
-
if (-not [int]::TryParse($env:LOG_MAX_TOTAL_MB, [ref]$parsedLogMaxTotalMb) -or $parsedLogMaxTotalMb -lt 0) {
|
|
145
|
-
throw "LOG_MAX_TOTAL_MB must be a non-negative integer: $($env:LOG_MAX_TOTAL_MB)"
|
|
146
|
-
}
|
|
147
|
-
$logMaxTotalMb = $parsedLogMaxTotalMb
|
|
148
|
-
}
|
|
149
121
|
$featuresFilter = $null
|
|
150
122
|
|
|
151
123
|
for ($i = 0; $i -lt $remaining.Count; $i++) {
|
|
@@ -173,16 +145,6 @@ function Invoke-PrizmPipeline {
|
|
|
173
145
|
$maxInfraRetries = $parsedMaxInfraRetries
|
|
174
146
|
continue
|
|
175
147
|
}
|
|
176
|
-
'^--timeout$' {
|
|
177
|
-
$i++
|
|
178
|
-
if ($i -ge $remaining.Count) { throw '--timeout requires a seconds value.' }
|
|
179
|
-
$parsedTimeout = 0
|
|
180
|
-
if (-not [int]::TryParse($remaining[$i], [ref]$parsedTimeout) -or $parsedTimeout -lt 0) {
|
|
181
|
-
throw "--timeout must be a non-negative integer: $($remaining[$i])"
|
|
182
|
-
}
|
|
183
|
-
$timeoutSeconds = $parsedTimeout
|
|
184
|
-
continue
|
|
185
|
-
}
|
|
186
148
|
'^--features$' { $i++; $featuresFilter = $remaining[$i]; continue }
|
|
187
149
|
'^-' { Write-PrizmWarn "Ignoring unsupported option: $arg"; continue }
|
|
188
150
|
default {
|
|
@@ -205,7 +167,7 @@ function Invoke-PrizmPipeline {
|
|
|
205
167
|
$retryLabel = if ($maxRetries -ne $null) { [string]$maxRetries } else { 'default' }
|
|
206
168
|
$infraRetryLabel = if ($maxInfraRetries -ne $null) { [string]$maxInfraRetries } else { 'default' }
|
|
207
169
|
Write-PrizmInfo "Verbose mode enabled."
|
|
208
|
-
Write-PrizmInfo "Effective options: mode=$modeLabel critic=$criticLabel maxRetries=$retryLabel maxInfraRetries=$infraRetryLabel
|
|
170
|
+
Write-PrizmInfo "Effective options: mode=$modeLabel critic=$criticLabel maxRetries=$retryLabel maxInfraRetries=$infraRetryLabel staleKillThreshold=$staleKillThreshold dryRun=$dryRun"
|
|
209
171
|
}
|
|
210
172
|
|
|
211
173
|
# Validate PRIZMKIT_EFFORT early (fail-fast before any sessions are spawned)
|
|
@@ -329,12 +291,12 @@ function Invoke-PrizmPipeline {
|
|
|
329
291
|
}
|
|
330
292
|
|
|
331
293
|
function Write-PrizmStaleKillMarker {
|
|
332
|
-
param([string]$MarkerPath, [int]$StaleSeconds, [int]$Threshold
|
|
294
|
+
param([string]$MarkerPath, [int]$StaleSeconds, [int]$Threshold)
|
|
333
295
|
$markerDir = Split-Path $MarkerPath -Parent
|
|
334
296
|
if ($markerDir) { New-Item -ItemType Directory -Force -Path $markerDir | Out-Null }
|
|
335
297
|
[ordered]@{
|
|
336
298
|
killed_at = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
|
|
337
|
-
reason =
|
|
299
|
+
reason = 'stale_session'
|
|
338
300
|
stale_seconds = $StaleSeconds
|
|
339
301
|
threshold = $Threshold
|
|
340
302
|
} | ConvertTo-Json -Compress | Set-Content -Path $MarkerPath -Encoding UTF8
|
|
@@ -571,26 +533,6 @@ function Invoke-PrizmPipeline {
|
|
|
571
533
|
}
|
|
572
534
|
}
|
|
573
535
|
|
|
574
|
-
function Invoke-PrizmLogCleanup {
|
|
575
|
-
if (-not $logCleanupEnabled) { return }
|
|
576
|
-
if (-not (Test-Path $stateDir)) { return }
|
|
577
|
-
|
|
578
|
-
try {
|
|
579
|
-
$cleanup = Invoke-PrizmPythonJson $python @(
|
|
580
|
-
(Join-Path $paths.ScriptsDir 'cleanup-logs.py'),
|
|
581
|
-
'--state-dir', $stateDir,
|
|
582
|
-
'--retention-days', [string]$logRetentionDays,
|
|
583
|
-
'--max-total-mb', [string]$logMaxTotalMb
|
|
584
|
-
)
|
|
585
|
-
if ($cleanup -and $cleanup.deleted_files -gt 0) {
|
|
586
|
-
$reclaimedKb = [int]([int64]$cleanup.reclaimed_bytes / 1024)
|
|
587
|
-
Write-PrizmInfo "Log cleanup: deleted $($cleanup.deleted_files) files, reclaimed ${reclaimedKb}KB"
|
|
588
|
-
}
|
|
589
|
-
} catch {
|
|
590
|
-
Write-PrizmWarn "Log cleanup failed (continuing)"
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
|
|
594
536
|
function Get-PrizmDeployIncompleteItems {
|
|
595
537
|
param([string]$Kind, [string]$ListPath)
|
|
596
538
|
|
|
@@ -694,11 +636,12 @@ function Invoke-PrizmPipeline {
|
|
|
694
636
|
$devBranchName = ''
|
|
695
637
|
$hadDirtyBaseline = if ($isGitRepository) { Test-PrizmGitWorkDirty $paths.ProjectRoot $stateDir $listPath } else { $false }
|
|
696
638
|
if ($hadDirtyBaseline) {
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
639
|
+
if ($dryRun) {
|
|
640
|
+
Write-PrizmWarn "Dirty working tree detected before $CurrentItemId; would auto-commit snapshot in real run."
|
|
641
|
+
} else {
|
|
642
|
+
Write-PrizmInfo "Dirty working tree detected before $CurrentItemId; auto-committing snapshot."
|
|
643
|
+
Invoke-PrizmGitAutoCommit $paths.ProjectRoot "chore: workspace snapshot ready for run $CurrentItemId" | Out-Null
|
|
644
|
+
}
|
|
702
645
|
}
|
|
703
646
|
|
|
704
647
|
if ($dryRun) {
|
|
@@ -783,21 +726,16 @@ function Invoke-PrizmPipeline {
|
|
|
783
726
|
|
|
784
727
|
$elapsedSeconds = 0
|
|
785
728
|
$staleSeconds = 0
|
|
786
|
-
$staleReason = 'stale_session'
|
|
787
729
|
$previousLogSize = 0
|
|
788
730
|
$previousProgressSignature = ''
|
|
789
731
|
$previousChildActivitySignature = ''
|
|
790
|
-
$previousErrorLoopSignature = ''
|
|
791
|
-
$wasTimedOut = $false
|
|
792
732
|
$staleKillMarker = Join-Path $logsDir 'stale-kill.json'
|
|
793
733
|
$wasStaleKilled = $false
|
|
794
734
|
while ($true) {
|
|
795
|
-
$
|
|
796
|
-
$waitSeconds = if ($timeoutSeconds -gt 0) { [Math]::Min($heartbeatInterval, [Math]::Max(1, $remainingTimeout)) } else { $heartbeatInterval }
|
|
797
|
-
$completed = Wait-Job $job -Timeout $waitSeconds
|
|
735
|
+
$completed = Wait-Job $job -Timeout $heartbeatInterval
|
|
798
736
|
if ($completed) { break }
|
|
799
737
|
|
|
800
|
-
$elapsedSeconds += $
|
|
738
|
+
$elapsedSeconds += $heartbeatInterval
|
|
801
739
|
$currentLogSize = 0
|
|
802
740
|
if (Test-Path $sessionLog) {
|
|
803
741
|
$currentLogSize = [int64](Get-Item $sessionLog).Length
|
|
@@ -815,49 +753,10 @@ function Invoke-PrizmPipeline {
|
|
|
815
753
|
|
|
816
754
|
$effectiveStaleKillThreshold = Get-PrizmEffectiveStaleKillThreshold -ProgressFile $progressJson -BaseThreshold $staleKillThreshold
|
|
817
755
|
|
|
818
|
-
|
|
819
|
-
# all read-offset errors or wasted calls. Only a newly advancing error
|
|
820
|
-
# signature counts; stale historical errors must not turn later normal output
|
|
821
|
-
# into a stale kill.
|
|
822
|
-
$errorLoopDetected = $false
|
|
823
|
-
$errorLoopSignature = ''
|
|
824
|
-
if ($effectiveStaleKillThreshold -gt 0 -and $growth -gt 0 -and (Test-Path $progressJson)) {
|
|
825
|
-
try {
|
|
826
|
-
$progress = Get-Content $progressJson -Raw | ConvertFrom-Json
|
|
827
|
-
$errors = $progress.errors
|
|
828
|
-
if ($errors -is [array] -and $errors.Count -ge 5) {
|
|
829
|
-
$recent = $errors[-5..-1]
|
|
830
|
-
$allBad = ($recent | Where-Object {
|
|
831
|
-
$_.type -in @("read_offset_overflow", "wasted_call")
|
|
832
|
-
}).Count -eq 5
|
|
833
|
-
if ($allBad) {
|
|
834
|
-
$errorLoopSignature = ($recent | ConvertTo-Json -Compress)
|
|
835
|
-
if ($previousErrorLoopSignature -and $errorLoopSignature -ne $previousErrorLoopSignature) {
|
|
836
|
-
$errorLoopDetected = $true
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
} catch {
|
|
841
|
-
# Ignore JSON parse errors — progress file may be incomplete or malformed
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
$previousErrorLoopSignature = $errorLoopSignature
|
|
845
|
-
|
|
846
|
-
if ($errorLoopDetected) {
|
|
847
|
-
$staleReason = 'error_loop'
|
|
848
|
-
$staleSeconds = $effectiveStaleKillThreshold
|
|
849
|
-
} elseif ($growth -gt 0 -or $childAdvanced -or $progressAdvanced) {
|
|
850
|
-
$staleReason = 'stale_session'
|
|
756
|
+
if ($growth -gt 0 -or $childAdvanced -or $progressAdvanced) {
|
|
851
757
|
$staleSeconds = 0
|
|
852
758
|
} else {
|
|
853
|
-
$
|
|
854
|
-
$staleSeconds += $waitSeconds
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
if ($timeoutSeconds -gt 0 -and $elapsedSeconds -ge $timeoutSeconds) {
|
|
858
|
-
$wasTimedOut = $true
|
|
859
|
-
Stop-PrizmSessionProcess $pidPath
|
|
860
|
-
break
|
|
759
|
+
$staleSeconds += $heartbeatInterval
|
|
861
760
|
}
|
|
862
761
|
|
|
863
762
|
$fatalErrorCode = Get-PrizmProgressFatalErrorCode -ProgressFile $progressJson
|
|
@@ -873,12 +772,8 @@ function Invoke-PrizmPipeline {
|
|
|
873
772
|
}
|
|
874
773
|
if ($effectiveStaleKillThreshold -gt 0 -and $staleSeconds -ge $effectiveStaleKillThreshold) {
|
|
875
774
|
$wasStaleKilled = $true
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
} else {
|
|
879
|
-
Write-PrizmWarn "Session stale-killed (no progress for ${effectiveStaleKillThreshold}s)"
|
|
880
|
-
}
|
|
881
|
-
Write-PrizmStaleKillMarker $staleKillMarker $staleSeconds $effectiveStaleKillThreshold $staleReason
|
|
775
|
+
Write-PrizmWarn "Session stale-killed (no progress for ${effectiveStaleKillThreshold}s)"
|
|
776
|
+
Write-PrizmStaleKillMarker $staleKillMarker $staleSeconds $effectiveStaleKillThreshold
|
|
882
777
|
Stop-PrizmSessionProcess $pidPath
|
|
883
778
|
if ($staleKillGraceSeconds -gt 0) { Start-Sleep -Seconds $staleKillGraceSeconds }
|
|
884
779
|
break
|
|
@@ -886,11 +781,7 @@ function Invoke-PrizmPipeline {
|
|
|
886
781
|
}
|
|
887
782
|
|
|
888
783
|
$exitCode = 0
|
|
889
|
-
if ($
|
|
890
|
-
Stop-Job $job
|
|
891
|
-
Remove-Job $job
|
|
892
|
-
$exitCode = 124
|
|
893
|
-
} elseif ($wasStaleKilled) {
|
|
784
|
+
if ($wasStaleKilled) {
|
|
894
785
|
Stop-Job $job
|
|
895
786
|
Remove-Job $job
|
|
896
787
|
$exitCode = 143
|
|
@@ -923,7 +814,7 @@ function Invoke-PrizmPipeline {
|
|
|
923
814
|
$status = 'crashed'
|
|
924
815
|
if ($semanticCompletion) {
|
|
925
816
|
$status = 'success'
|
|
926
|
-
if ($exitCode -ne 0 -or $wasStaleKilled -or $
|
|
817
|
+
if ($exitCode -ne 0 -or $wasStaleKilled -or $wasAiRuntimeError) {
|
|
927
818
|
Write-PrizmWarn "Session ended with a failure signal after semantic completion; treating as finalized success"
|
|
928
819
|
Write-PrizmWarn "Semantic completion commit: $($semanticCompletion.CommitSha)"
|
|
929
820
|
}
|
|
@@ -931,19 +822,12 @@ function Invoke-PrizmPipeline {
|
|
|
931
822
|
$status = 'infra_error'
|
|
932
823
|
Write-PrizmWarn "AI session failed due to structured AI runtime/context error"
|
|
933
824
|
Write-PrizmWarn "AI runtime errors are retried without consuming code retry budget"
|
|
934
|
-
} elseif ($wasTimedOut) {
|
|
935
|
-
$status = 'timed_out'
|
|
936
|
-
Write-PrizmWarn "AI session timed out after $timeoutSeconds seconds"
|
|
937
825
|
} elseif ($wasInfraError) {
|
|
938
826
|
$status = 'infra_error'
|
|
939
827
|
Write-PrizmWarn "AI session failed due to AI CLI/provider infrastructure error"
|
|
940
828
|
Write-PrizmWarn "Infrastructure errors are retried without consuming code retry budget"
|
|
941
829
|
} elseif ($wasStaleKilled -or (Test-Path $staleKillMarker)) {
|
|
942
|
-
|
|
943
|
-
Write-PrizmWarn "Session was killed by heartbeat monitor due to repeated read-offset/wasted-call errors"
|
|
944
|
-
} else {
|
|
945
|
-
Write-PrizmWarn "Session was stale-killed by heartbeat monitor (no progress for too long)"
|
|
946
|
-
}
|
|
830
|
+
Write-PrizmWarn "Session was stale-killed by heartbeat monitor (no progress for too long)"
|
|
947
831
|
Write-PrizmWarn "Heartbeat-killed sessions are treated as failed; dev branch is preserved for inspection"
|
|
948
832
|
} elseif ($exitCode -ne 0) {
|
|
949
833
|
Write-PrizmWarn "AI session exited with code $exitCode"
|
|
@@ -1027,10 +911,6 @@ function Invoke-PrizmPipeline {
|
|
|
1027
911
|
return
|
|
1028
912
|
}
|
|
1029
913
|
|
|
1030
|
-
if (-not $dryRun) {
|
|
1031
|
-
Invoke-PrizmLogCleanup
|
|
1032
|
-
}
|
|
1033
|
-
|
|
1034
914
|
if ($itemId) {
|
|
1035
915
|
Invoke-PrizmPipelineItem $itemId
|
|
1036
916
|
$global:PRIZM_EXIT_CODE = $script:PRIZM_ITEM_EXIT_CODE
|
|
@@ -62,7 +62,6 @@ function Get-PrizmRecoveryIntEnv {
|
|
|
62
62
|
return $parsed
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
$timeoutSeconds = Get-PrizmRecoveryIntEnv 'SESSION_TIMEOUT' 0 0
|
|
66
65
|
$heartbeatInterval = Get-PrizmRecoveryIntEnv 'HEARTBEAT_INTERVAL' 30 1
|
|
67
66
|
$staleKillThreshold = Get-PrizmRecoveryIntEnv 'STALE_KILL_THRESHOLD' 900 0
|
|
68
67
|
$staleKillGraceSeconds = Get-PrizmRecoveryIntEnv 'STALE_KILL_GRACE_SECONDS' 10 0
|
|
@@ -123,15 +122,12 @@ $staleSeconds = 0
|
|
|
123
122
|
$previousLogSize = 0
|
|
124
123
|
$previousProgressSignature = ''
|
|
125
124
|
$previousChildActivitySignature = ''
|
|
126
|
-
$wasTimedOut = $false
|
|
127
125
|
$wasStaleKilled = $false
|
|
128
126
|
while ($true) {
|
|
129
|
-
$
|
|
130
|
-
$waitSeconds = if ($timeoutSeconds -gt 0) { [Math]::Min($heartbeatInterval, [Math]::Max(1, $remainingTimeout)) } else { $heartbeatInterval }
|
|
131
|
-
$completed = Wait-Job $job -Timeout $waitSeconds
|
|
127
|
+
$completed = Wait-Job $job -Timeout $heartbeatInterval
|
|
132
128
|
if ($completed) { break }
|
|
133
129
|
|
|
134
|
-
$elapsedSeconds += $
|
|
130
|
+
$elapsedSeconds += $heartbeatInterval
|
|
135
131
|
$currentLogSize = 0
|
|
136
132
|
if (Test-Path $logPath) { $currentLogSize = [int64](Get-Item $logPath).Length }
|
|
137
133
|
$growth = $currentLogSize - $previousLogSize
|
|
@@ -145,13 +141,7 @@ while ($true) {
|
|
|
145
141
|
$childAdvanced = ($childSignature -and $childSignature -ne $previousChildActivitySignature)
|
|
146
142
|
$previousChildActivitySignature = $childSignature
|
|
147
143
|
|
|
148
|
-
if ($growth -gt 0 -or $childAdvanced -or $progressAdvanced) { $staleSeconds = 0 } else { $staleSeconds += $
|
|
149
|
-
|
|
150
|
-
if ($timeoutSeconds -gt 0 -and $elapsedSeconds -ge $timeoutSeconds) {
|
|
151
|
-
$wasTimedOut = $true
|
|
152
|
-
Stop-PrizmSessionProcess $pidPath
|
|
153
|
-
break
|
|
154
|
-
}
|
|
144
|
+
if ($growth -gt 0 -or $childAdvanced -or $progressAdvanced) { $staleSeconds = 0 } else { $staleSeconds += $heartbeatInterval }
|
|
155
145
|
|
|
156
146
|
if ($staleKillThreshold -gt 0 -and $staleSeconds -ge $staleKillThreshold) {
|
|
157
147
|
$wasStaleKilled = $true
|
|
@@ -164,11 +154,7 @@ while ($true) {
|
|
|
164
154
|
}
|
|
165
155
|
|
|
166
156
|
$exitCode = 0
|
|
167
|
-
if ($
|
|
168
|
-
Stop-Job $job
|
|
169
|
-
Remove-Job $job
|
|
170
|
-
$exitCode = 124
|
|
171
|
-
} elseif ($wasStaleKilled) {
|
|
157
|
+
if ($wasStaleKilled) {
|
|
172
158
|
Stop-Job $job
|
|
173
159
|
Remove-Job $job
|
|
174
160
|
$exitCode = 143
|
|
@@ -188,7 +174,6 @@ if (Test-Path $logPath) {
|
|
|
188
174
|
$sizeKb = [int](([int64](Get-Item $logPath).Length) / 1024)
|
|
189
175
|
Write-PrizmInfo "Session log: $lineCount lines, ${sizeKb}KB"
|
|
190
176
|
}
|
|
191
|
-
if ($wasTimedOut) { Write-PrizmWarn "Recovery session timed out after $timeoutSeconds seconds." }
|
|
192
177
|
if ($wasStaleKilled -or (Test-Path $staleKillMarker)) { Write-PrizmWarn "Recovery session was stale-killed." }
|
|
193
178
|
if ($exitCode -eq 0) { Write-PrizmSuccess "Recovery session completed." } else { Write-PrizmError "Recovery session failed. Log: $logPath" }
|
|
194
179
|
exit $exitCode
|
|
@@ -129,7 +129,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
129
129
|
```
|
|
130
130
|
With all options:
|
|
131
131
|
```bash
|
|
132
|
-
VERBOSE=1 MAX_RETRIES=5
|
|
132
|
+
VERBOSE=1 MAX_RETRIES=5 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
|
|
133
133
|
.prizmkit/dev-pipeline/run-bugfix.sh run .prizmkit/plans/bug-fix-list.json
|
|
134
134
|
```
|
|
135
135
|
|
|
@@ -12,7 +12,6 @@ Translating user responses to env vars:
|
|
|
12
12
|
| Verbose: On | `VERBOSE=1` |
|
|
13
13
|
| Max retries: N | `MAX_RETRIES=N` |
|
|
14
14
|
| Critic: On | `ENABLE_CRITIC=1` |
|
|
15
|
-
| Timeout: value | `SESSION_TIMEOUT=<seconds>` |
|
|
16
15
|
| Stop on failure: On | `STOP_ON_FAILURE=1` |
|
|
17
16
|
| Deploy: Yes | `ENABLE_DEPLOY=1` |
|
|
18
17
|
| Effort: value | `PRIZMKIT_EFFORT=<value>` |
|
|
@@ -28,9 +27,6 @@ Not exposed in interactive menu, pass via `--env`:
|
|
|
28
27
|
| `DEV_BRANCH` | auto-generated | Custom dev branch name (default: `bugfix/pipeline-{run_id}`) |
|
|
29
28
|
| `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
|
|
30
29
|
| `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
|
|
31
|
-
| `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
|
|
32
|
-
| `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
|
|
33
|
-
| `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
|
|
34
30
|
|
|
35
31
|
## Interactive Configuration Options
|
|
36
32
|
|
|
@@ -52,28 +48,22 @@ Present these via `AskUserQuestion` in step 5. Round 1 is one `AskUserQuestion`
|
|
|
52
48
|
- On — Enable adversarial critic review (`ENABLE_CRITIC=1`): an independent AI agent reviews the diagnosis/plan for completeness and the fix for defects, edge cases, and regression risks. Adds ~5-10 min per bug.
|
|
53
49
|
|
|
54
50
|
**Question 4 — Advanced config?** (multiSelect: false):
|
|
55
|
-
- No (default) — Use defaults for
|
|
56
|
-
- Yes — Configure
|
|
51
|
+
- No (default) — Use defaults for failure behavior
|
|
52
|
+
- Yes — Configure stop-on-failure, deploy, and reasoning effort options
|
|
57
53
|
|
|
58
54
|
Note: Bug filter defaults to all bugs (by severity order). Default Critic to Off unless bugs have `severity: "critical"` or `severity: "high"` (in which case default to On). If the user selects "Other" on any option, handle their custom input.
|
|
59
55
|
|
|
60
56
|
### Round 2 (only if Advanced config = Yes)
|
|
61
57
|
|
|
62
|
-
**Question 1 —
|
|
63
|
-
- None (default) — No timeout
|
|
64
|
-
- 30 min — `SESSION_TIMEOUT=1800`
|
|
65
|
-
- 1 hour — `SESSION_TIMEOUT=3600`
|
|
66
|
-
- 2 hours — `SESSION_TIMEOUT=7200`
|
|
67
|
-
|
|
68
|
-
**Question 2 — Stop on failure** (multiSelect: false):
|
|
58
|
+
**Question 1 — Stop on failure** (multiSelect: false):
|
|
69
59
|
- Off (default) — Pipeline continues to next task after failure
|
|
70
60
|
- On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
|
|
71
61
|
|
|
72
|
-
**Question
|
|
62
|
+
**Question 2 — Deploy after completion?** (multiSelect: false):
|
|
73
63
|
- No (default) — Skip deployment after pipeline completes
|
|
74
64
|
- Yes — Run /prizmkit-deploy automatically after all bugs fixed successfully (`ENABLE_DEPLOY=1`). Deployment is blocked if any bug was not fixed (status not 'completed', 'skipped', or 'needs_info').
|
|
75
65
|
|
|
76
|
-
**Question
|
|
66
|
+
**Question 3 — Reasoning effort** (multiSelect: false):
|
|
77
67
|
- Default (none) — Use CLI default
|
|
78
68
|
- low — Minimize reasoning, fastest output (`PRIZMKIT_EFFORT=low`)
|
|
79
69
|
- medium — Moderate reasoning (`PRIZMKIT_EFFORT=medium`)
|
|
@@ -150,12 +150,12 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
150
150
|
- 5
|
|
151
151
|
|
|
152
152
|
**Question 4 — Advanced config?** (multiSelect: false):
|
|
153
|
-
- No (default) — Use defaults for
|
|
154
|
-
- Yes — Configure
|
|
153
|
+
- No (default) — Use defaults for failure behavior
|
|
154
|
+
- Yes — Configure stop-on-failure, deploy-after-completion, and reasoning effort options
|
|
155
155
|
|
|
156
156
|
Default Critic to Off unless features have `estimated_complexity: "high"` or above (in which case default to On).
|
|
157
157
|
|
|
158
|
-
**If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (
|
|
158
|
+
**If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (stop-on-failure, deploy-after-completion, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
|
|
159
159
|
|
|
160
160
|
**Environment variable mapping** and **advanced environment variables** tables — read `${SKILL_DIR}/references/configuration.md` for the full translation tables (8 config→env mappings + 9 advanced variables).
|
|
161
161
|
|
|
@@ -168,7 +168,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
168
168
|
```
|
|
169
169
|
With all options:
|
|
170
170
|
```bash
|
|
171
|
-
VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5
|
|
171
|
+
VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
|
|
172
172
|
.prizmkit/dev-pipeline/run-feature.sh run .prizmkit/plans/feature-list.json --features F-001:F-005
|
|
173
173
|
```
|
|
174
174
|
|
|
@@ -6,21 +6,15 @@ Environment variable mappings for the feature launcher.
|
|
|
6
6
|
|
|
7
7
|
Asked only when the user chose "Yes" to Advanced config in step 6.
|
|
8
8
|
|
|
9
|
-
**Question 1 —
|
|
10
|
-
- None (default) — No timeout
|
|
11
|
-
- 30 min — `SESSION_TIMEOUT=1800`
|
|
12
|
-
- 1 hour — `SESSION_TIMEOUT=3600`
|
|
13
|
-
- 2 hours — `SESSION_TIMEOUT=7200`
|
|
14
|
-
|
|
15
|
-
**Question 2 — Stop on failure** (multiSelect: false):
|
|
9
|
+
**Question 1 — Stop on failure** (multiSelect: false):
|
|
16
10
|
- Off (default) — Pipeline continues to next task after failure
|
|
17
11
|
- On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
|
|
18
12
|
|
|
19
|
-
**Question
|
|
13
|
+
**Question 2 — Deploy after completion?** (multiSelect: false):
|
|
20
14
|
- No (default) — Skip deployment after pipeline completes
|
|
21
15
|
- Yes — Run /prizmkit-deploy automatically after all features complete successfully (`ENABLE_DEPLOY=1`). Deployment is blocked if any feature did not complete successfully (status not 'completed' or manually 'skipped').
|
|
22
16
|
|
|
23
|
-
**Question
|
|
17
|
+
**Question 3 — Reasoning effort** (multiSelect: false):
|
|
24
18
|
- Default (none) — Use CLI default
|
|
25
19
|
- low — Minimize reasoning, fastest output (`PRIZMKIT_EFFORT=low`)
|
|
26
20
|
- medium — Moderate reasoning (`PRIZMKIT_EFFORT=medium`)
|
|
@@ -38,7 +32,6 @@ Translating user responses to env vars:
|
|
|
38
32
|
| Verbose: Off | `VERBOSE=0` |
|
|
39
33
|
| Verbose: On | `VERBOSE=1` |
|
|
40
34
|
| Max retries: N | `MAX_RETRIES=N` |
|
|
41
|
-
| Timeout: value | `SESSION_TIMEOUT=<seconds>` |
|
|
42
35
|
| Stop on failure: On | `STOP_ON_FAILURE=1` |
|
|
43
36
|
| Deploy: Yes | `ENABLE_DEPLOY=1` |
|
|
44
37
|
| Effort: value | `PRIZMKIT_EFFORT=<value>` |
|
|
@@ -55,9 +48,6 @@ Not exposed in interactive menu, pass via `--env`:
|
|
|
55
48
|
| `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
|
|
56
49
|
| `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
|
|
57
50
|
| `PIPELINE_MODE` | (none) | Override mode for all features: `lite`\|`standard`\|`full` |
|
|
58
|
-
| `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
|
|
59
|
-
| `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
|
|
60
|
-
| `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
|
|
61
51
|
|
|
62
52
|
## Error Handling
|
|
63
53
|
|
|
@@ -154,8 +154,8 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
154
154
|
- Off — Skip post-task test verification (faster but riskier)
|
|
155
155
|
|
|
156
156
|
**Question 4 — Advanced config?** (multiSelect: false):
|
|
157
|
-
- No (default) — Use defaults for critic review
|
|
158
|
-
- Yes — Configure critic review,
|
|
157
|
+
- No (default) — Use defaults for critic review and failure behavior
|
|
158
|
+
- Yes — Configure critic review, stop-on-failure, and reasoning effort options
|
|
159
159
|
|
|
160
160
|
Note: Refactor filter defaults to all refactor items (by priority order). If the user selects "Other" on any option, handle their custom input.
|
|
161
161
|
|
|
@@ -172,7 +172,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
172
172
|
```
|
|
173
173
|
With all options:
|
|
174
174
|
```bash
|
|
175
|
-
VERBOSE=1 STRICT_BEHAVIOR_CHECK=1 MAX_RETRIES=5
|
|
175
|
+
VERBOSE=1 STRICT_BEHAVIOR_CHECK=1 MAX_RETRIES=5 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
|
|
176
176
|
.prizmkit/dev-pipeline/run-refactor.sh run .prizmkit/plans/refactor-list.json
|
|
177
177
|
```
|
|
178
178
|
|
|
@@ -14,7 +14,6 @@ Translating user responses to env vars:
|
|
|
14
14
|
| Strict behavior: On | `STRICT_BEHAVIOR_CHECK=1` |
|
|
15
15
|
| Strict behavior: Off | `STRICT_BEHAVIOR_CHECK=0` |
|
|
16
16
|
| Critic: On | `ENABLE_CRITIC=true` |
|
|
17
|
-
| Timeout: value | `SESSION_TIMEOUT=<seconds>` |
|
|
18
17
|
| Stop on failure: On | `STOP_ON_FAILURE=1` |
|
|
19
18
|
| Deploy: Yes | `ENABLE_DEPLOY=1` |
|
|
20
19
|
| Effort: value | `PRIZMKIT_EFFORT=<value>` |
|
|
@@ -30,9 +29,6 @@ Not exposed in interactive menu, pass via `--env`:
|
|
|
30
29
|
| `DEV_BRANCH` | auto-generated | Custom dev branch name (default: `refactor/pipeline-{run_id}`) |
|
|
31
30
|
| `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
|
|
32
31
|
| `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
|
|
33
|
-
| `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
|
|
34
|
-
| `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
|
|
35
|
-
| `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
|
|
36
32
|
|
|
37
33
|
## Error Handling
|
|
38
34
|
|
|
@@ -57,23 +53,17 @@ Not exposed in interactive menu, pass via `--env`:
|
|
|
57
53
|
|
|
58
54
|
Only run this when the user answered "Yes" to the **Advanced config?** question in step 6. It applies to a minority of sessions.
|
|
59
55
|
|
|
60
|
-
Ask a second round of `AskUserQuestion` with these
|
|
56
|
+
Ask a second round of `AskUserQuestion` with these 3 questions:
|
|
61
57
|
|
|
62
|
-
**Question 1 —
|
|
63
|
-
- None (default) — No timeout
|
|
64
|
-
- 30 min — `SESSION_TIMEOUT=1800`
|
|
65
|
-
- 1 hour — `SESSION_TIMEOUT=3600`
|
|
66
|
-
- 2 hours — `SESSION_TIMEOUT=7200`
|
|
67
|
-
|
|
68
|
-
**Question 2 — Stop on failure** (multiSelect: false):
|
|
58
|
+
**Question 1 — Stop on failure** (multiSelect: false):
|
|
69
59
|
- Off (default) — Pipeline continues to next task after failure
|
|
70
60
|
- On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
|
|
71
61
|
|
|
72
|
-
**Question
|
|
62
|
+
**Question 2 — Critic review** (multiSelect: false):
|
|
73
63
|
- Off (default) — Skip adversarial review
|
|
74
64
|
- On — Enable adversarial critic review: an independent AI agent reviews the refactor plan for completeness and the implementation for regressions, missed edge cases, and behavior violations. Adds ~5-10 min per refactor task.
|
|
75
65
|
|
|
76
|
-
**Question
|
|
66
|
+
**Question 3 — Deploy after completion?** (multiSelect: false):
|
|
77
67
|
- No (default) — Skip deployment after pipeline completes
|
|
78
68
|
- Yes — Run /prizmkit-deploy automatically after all refactors complete successfully (`ENABLE_DEPLOY=1`). Deployment is blocked if any refactor did not complete successfully (status not 'completed' or manually 'skipped').
|
|
79
69
|
|
|
@@ -155,7 +155,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
155
155
|
```
|
|
156
156
|
With all options:
|
|
157
157
|
```powershell
|
|
158
|
-
$env:VERBOSE = "1"; $env:MAX_RETRIES = "5"; $env:
|
|
158
|
+
$env:VERBOSE = "1"; $env:MAX_RETRIES = "5"; $env:PRIZMKIT_EFFORT = "high"
|
|
159
159
|
.\.prizmkit\dev-pipeline\run-bugfix.ps1 run .prizmkit/plans/bug-fix-list.json
|
|
160
160
|
```
|
|
161
161
|
|
|
@@ -12,7 +12,6 @@ Translating user responses to env vars:
|
|
|
12
12
|
| Verbose: On | `VERBOSE=1` |
|
|
13
13
|
| Max retries: N | `MAX_RETRIES=N` |
|
|
14
14
|
| Critic: On | `ENABLE_CRITIC=1` |
|
|
15
|
-
| Timeout: value | `SESSION_TIMEOUT=<seconds>` |
|
|
16
15
|
| Stop on failure: On | `STOP_ON_FAILURE=1` |
|
|
17
16
|
| Deploy: Yes | `ENABLE_DEPLOY=1` |
|
|
18
17
|
| Effort: value | `PRIZMKIT_EFFORT=<value>` |
|
|
@@ -28,9 +27,6 @@ Not exposed in interactive menu, pass via `--env`:
|
|
|
28
27
|
| `DEV_BRANCH` | auto-generated | Custom dev branch name (default: `bugfix/pipeline-{run_id}`) |
|
|
29
28
|
| `HEARTBEAT_INTERVAL` | `30` | Heartbeat log interval in seconds |
|
|
30
29
|
| `HEARTBEAT_STALE_THRESHOLD` | `600` | Max seconds without heartbeat before marking stale |
|
|
31
|
-
| `LOG_CLEANUP_ENABLED` | `1` | Run periodic log cleanup (`0` to disable) |
|
|
32
|
-
| `LOG_RETENTION_DAYS` | `14` | Delete logs older than N days |
|
|
33
|
-
| `LOG_MAX_TOTAL_MB` | `1024` | Keep total logs under N MB via oldest-first cleanup |
|
|
34
30
|
|
|
35
31
|
## Interactive Configuration Options
|
|
36
32
|
|
|
@@ -52,24 +48,18 @@ Present these via `AskUserQuestion` in step 5. Round 1 is one `AskUserQuestion`
|
|
|
52
48
|
- On — Enable adversarial critic review (`ENABLE_CRITIC=1`): an independent AI agent reviews the diagnosis/plan for completeness and the fix for defects, edge cases, and regression risks. Adds ~5-10 min per bug.
|
|
53
49
|
|
|
54
50
|
**Question 4 — Advanced config?** (multiSelect: false):
|
|
55
|
-
- No (default) — Use defaults for
|
|
56
|
-
- Yes — Configure
|
|
51
|
+
- No (default) — Use defaults for failure behavior
|
|
52
|
+
- Yes — Configure stop-on-failure, and reasoning effort options
|
|
57
53
|
|
|
58
54
|
Note: Bug filter defaults to all bugs (by severity order). Default Critic to Off unless bugs have `severity: "critical"` or `severity: "high"` (in which case default to On). If the user selects "Other" on any option, handle their custom input.
|
|
59
55
|
|
|
60
56
|
### Round 2 (only if Advanced config = Yes)
|
|
61
57
|
|
|
62
|
-
**Question 1 —
|
|
63
|
-
- None (default) — No timeout
|
|
64
|
-
- 30 min — `SESSION_TIMEOUT=1800`
|
|
65
|
-
- 1 hour — `SESSION_TIMEOUT=3600`
|
|
66
|
-
- 2 hours — `SESSION_TIMEOUT=7200`
|
|
67
|
-
|
|
68
|
-
**Question 2 — Stop on failure** (multiSelect: false):
|
|
58
|
+
**Question 1 — Stop on failure** (multiSelect: false):
|
|
69
59
|
- Off (default) — Pipeline continues to next task after failure
|
|
70
60
|
- On — Pipeline halts immediately when a task exhausts all retries (`STOP_ON_FAILURE=1`)
|
|
71
61
|
|
|
72
|
-
**Question
|
|
62
|
+
**Question 2 — Reasoning effort** (multiSelect: false):
|
|
73
63
|
- Default (none) — Use CLI default
|
|
74
64
|
- low — Minimize reasoning, fastest output (`PRIZMKIT_EFFORT=low`)
|
|
75
65
|
- medium — Moderate reasoning (`PRIZMKIT_EFFORT=medium`)
|
|
@@ -176,12 +176,12 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
176
176
|
- 5
|
|
177
177
|
|
|
178
178
|
**Question 4 — Advanced config?** (multiSelect: false):
|
|
179
|
-
- No (default) — Use defaults for
|
|
180
|
-
- Yes — Configure
|
|
179
|
+
- No (default) — Use defaults for failure behavior
|
|
180
|
+
- Yes — Configure stop-on-failure, and reasoning effort options
|
|
181
181
|
|
|
182
182
|
Default Critic to Off unless features have `estimated_complexity: "high"` or above (in which case default to On).
|
|
183
183
|
|
|
184
|
-
**If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (
|
|
184
|
+
**If user chose "Yes" to Advanced config**, ask a second round of `AskUserQuestion` — see the advanced config questions (stop-on-failure, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
|
|
185
185
|
|
|
186
186
|
**Environment variable mapping** and **advanced environment variables** tables — read `${SKILL_DIR}/references/configuration.md` for the full translation tables (8 config→env mappings + 9 advanced variables).
|
|
187
187
|
|
|
@@ -195,7 +195,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
195
195
|
```
|
|
196
196
|
With all options:
|
|
197
197
|
```powershell
|
|
198
|
-
$env:VERBOSE = "1"; $env:ENABLE_CRITIC = "true"; $env:MAX_RETRIES = "5"; $env:
|
|
198
|
+
$env:VERBOSE = "1"; $env:ENABLE_CRITIC = "true"; $env:MAX_RETRIES = "5"; $env:PRIZMKIT_EFFORT = "high"
|
|
199
199
|
.\.prizmkit\dev-pipeline\run-feature.ps1 run .prizmkit/plans/feature-list.json --features F-001:F-005
|
|
200
200
|
```
|
|
201
201
|
|