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.
Files changed (35) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/dev-pipeline/.env.example +0 -4
  3. package/bundled/dev-pipeline/README.md +9 -39
  4. package/bundled/dev-pipeline/SCHEMA_ANALYSIS.md +0 -4
  5. package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +0 -2
  6. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +0 -1
  7. package/bundled/dev-pipeline/launch-feature-daemon.sh +2 -3
  8. package/bundled/dev-pipeline/launch-refactor-daemon.sh +0 -1
  9. package/bundled/dev-pipeline/lib/heartbeat.sh +4 -50
  10. package/bundled/dev-pipeline/run-bugfix.sh +9 -77
  11. package/bundled/dev-pipeline/run-feature.sh +8 -94
  12. package/bundled/dev-pipeline/run-recovery.sh +1 -32
  13. package/bundled/dev-pipeline/run-refactor.sh +8 -78
  14. package/bundled/dev-pipeline/tests/test-deploy-safety.sh +3 -3
  15. package/bundled/dev-pipeline-windows/.env.example +0 -4
  16. package/bundled/dev-pipeline-windows/SCHEMA_ANALYSIS.md +0 -4
  17. package/bundled/dev-pipeline-windows/assets/prizm-dev-team-integration.md +0 -2
  18. package/bundled/dev-pipeline-windows/lib/pipeline.ps1 +19 -139
  19. package/bundled/dev-pipeline-windows/run-recovery.ps1 +4 -19
  20. package/bundled/skills/_metadata.json +1 -1
  21. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +1 -1
  22. package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +5 -15
  23. package/bundled/skills/feature-pipeline-launcher/SKILL.md +4 -4
  24. package/bundled/skills/feature-pipeline-launcher/references/configuration.md +3 -13
  25. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +3 -3
  26. package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +4 -14
  27. package/bundled/skills-windows/bugfix-pipeline-launcher/SKILL.md +1 -1
  28. package/bundled/skills-windows/bugfix-pipeline-launcher/references/configuration.md +4 -14
  29. package/bundled/skills-windows/feature-pipeline-launcher/SKILL.md +4 -4
  30. package/bundled/skills-windows/feature-pipeline-launcher/references/configuration.md +2 -12
  31. package/bundled/skills-windows/refactor-pipeline-launcher/SKILL.md +3 -3
  32. package/bundled/skills-windows/refactor-pipeline-launcher/references/configuration.md +4 -14
  33. package/package.json +1 -1
  34. package/bundled/dev-pipeline/scripts/cleanup-logs.py +0 -192
  35. 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] [--timeout seconds]"
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 timeoutSeconds=$timeoutSeconds staleKillThreshold=$staleKillThreshold dryRun=$dryRun"
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, [string]$Reason = 'stale_session')
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 = $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
- Write-PrizmError "Dirty working tree detected before $CurrentItemId; refusing to run on $originalBranch."
698
- Write-PrizmError "Commit/stash your changes or start from a clean branch, then rerun the pipeline."
699
- $script:PRIZM_ITEM_LIST_STATUS = ''
700
- $script:PRIZM_ITEM_EXIT_CODE = 1
701
- return
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
- $remainingTimeout = if ($timeoutSeconds -gt 0) { $timeoutSeconds - $elapsedSeconds } else { $heartbeatInterval }
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 += $waitSeconds
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
- # Check for error-loop: agent is actively producing output but results are
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
- $staleReason = 'stale_session'
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
- if ($staleReason -eq 'error_loop') {
877
- Write-PrizmWarn "Session stale-killed due to repeated read-offset/wasted-call error loop"
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 ($wasTimedOut) {
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 $wasTimedOut -or $wasAiRuntimeError) {
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
- if ($staleKillReason -eq 'error_loop') {
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
- $remainingTimeout = if ($timeoutSeconds -gt 0) { $timeoutSeconds - $elapsedSeconds } else { $heartbeatInterval }
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 += $waitSeconds
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 += $waitSeconds }
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 ($wasTimedOut) {
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
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.92",
2
+ "version": "1.1.94",
3
3
  "skills": {
4
4
  "prizm-kit": {
5
5
  "description": "Full-lifecycle dev toolkit. Covers spec-driven development, Prizm context docs, code quality, debugging, deployment, and knowledge management.",
@@ -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 SESSION_TIMEOUT=3600 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
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 session timeout and failure behavior
56
- - Yes — Configure session timeout, stop-on-failure, deploy, and reasoning effort options
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 — Session timeout** (multiSelect: false):
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 3 — Deploy after completion?** (multiSelect: false):
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 4 — Reasoning effort** (multiSelect: false):
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 session timeout and failure behavior
154
- - Yes — Configure session timeout, stop-on-failure, deploy-after-completion, and reasoning effort options
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 (session timeout, stop-on-failure, deploy-after-completion, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
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 SESSION_TIMEOUT=3600 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
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 — Session timeout** (multiSelect: false):
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 3 — Deploy after completion?** (multiSelect: false):
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 4 — Reasoning effort** (multiSelect: false):
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, session timeout, and failure behavior
158
- - Yes — Configure critic review, session timeout, stop-on-failure, and reasoning effort options
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 SESSION_TIMEOUT=3600 ENABLE_DEPLOY=1 PRIZMKIT_EFFORT=high \
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 4 questions:
56
+ Ask a second round of `AskUserQuestion` with these 3 questions:
61
57
 
62
- **Question 1 — Session timeout** (multiSelect: false):
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 3 — Critic review** (multiSelect: false):
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 4 — Deploy after completion?** (multiSelect: false):
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:SESSION_TIMEOUT = "3600"; $env:PRIZMKIT_EFFORT = "high"
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 session timeout and failure behavior
56
- - Yes — Configure session timeout, stop-on-failure, and reasoning effort options
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 — Session timeout** (multiSelect: false):
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 3 — Reasoning effort** (multiSelect: false):
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 session timeout and failure behavior
180
- - Yes — Configure session timeout, stop-on-failure, and reasoning effort options
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 (session timeout, stop-on-failure, reasoning effort) in `${SKILL_DIR}/references/configuration.md`.
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:SESSION_TIMEOUT = "3600"; $env:PRIZMKIT_EFFORT = "high"
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