claude-code-session-manager 0.97.0 → 0.100.0
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/README.md +3 -3
- package/bin/cli.cjs +16 -4
- package/bin/node-floor.cjs +41 -0
- package/dist/assets/{DataModel-D93FoaOm.js → DataModel-HdR0AxFq.js} +1 -1
- package/dist/assets/{History-CXxxqNP1.js → History-Dr4Jr_5z.js} +2 -2
- package/dist/assets/{Hooks-CzeYFQjq.js → Hooks-NhrvH3JP.js} +3 -3
- package/dist/assets/{Library-D2zPkwOC.js → Library-Dv_EtIMr.js} +1 -1
- package/dist/assets/{MarkdownEditor-DbinP78A.js → MarkdownEditor-DTKDWV_n.js} +1 -1
- package/dist/assets/{McpServers-Bu_sVGLr.js → McpServers-M034G9B3.js} +2 -2
- package/dist/assets/{Memory-BgiI6LZ_.js → Memory-DzF1B4gx.js} +6 -6
- package/dist/assets/{Permissions-C1MMzZRm.js → Permissions-DrgbSGWl.js} +3 -3
- package/dist/assets/{Plugins-Dhu6wAZi.js → Plugins-Bd3ef35w.js} +2 -2
- package/dist/assets/{ProvenanceBadge-C3AcWKMG.js → ProvenanceBadge-DcBHT1Iy.js} +1 -1
- package/dist/assets/{SaveBar-plwYm0iO.js → SaveBar-rimJem-Y.js} +1 -1
- package/dist/assets/Scheduler-DjgFJl2w.js +16 -0
- package/dist/assets/{ScopeSwitcher-DFy0vv_o.js → ScopeSwitcher-CnAzTBrl.js} +1 -1
- package/dist/assets/Settings-Dc1F_sSg.js +3 -0
- package/dist/assets/{SkillReferenceGraph-DsI7hRPB.js → SkillReferenceGraph-B9aZDecM.js} +1 -1
- package/dist/assets/{Skills-3E748UfB.js → Skills-DRXd18gu.js} +2 -2
- package/dist/assets/{SystemPrompt-BqmfUJOd.js → SystemPrompt-ahy5-Fwe.js} +1 -1
- package/dist/assets/{TagLibrary-CPz6fO8Q.js → TagLibrary-C_tToDeL.js} +1 -1
- package/dist/assets/{TiptapBody-D9EoBQ1P.js → TiptapBody-DvdefS6K.js} +1 -1
- package/dist/assets/{Toggle-BHAmZNDn.js → Toggle-6Jl5Njc6.js} +1 -1
- package/dist/assets/{index-CKH5Uxik.css → index-Bta-hwud.css} +1 -1
- package/dist/assets/{index-tn5JIVPj.js → index-vx8O73l8.js} +497 -502
- package/dist/assets/{settingsSchema-Crqy_aNz.js → settingsSchema-D6iRguNV.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +26 -29
- package/plugins/CLAUDE.md +6 -6
- package/plugins/session-manager-dev/skills/builder/4-manual/SKILL.md +23 -19
- package/plugins/session-manager-dev/skills/builder/SKILL.md +3 -3
- package/plugins/session-manager-dev/skills/develop/SKILL.md +254 -510
- package/plugins/session-manager-dev/skills/develop/standards.md +17 -22
- package/scripts/README.md +3 -11
- package/scripts/audit-ops-hygiene.cjs +3 -3
- package/scripts/hooks/lib/guard-prd-writes-policy.cjs +1 -1
- package/scripts/hooks/lib/guard-self-schedule-policy.cjs +1 -1
- package/scripts/mint-epic.cjs +2 -3
- package/scripts/scheduler-mcp-server.cjs +36 -7
- package/src/main/agentLibrary.cjs +22 -2
- package/src/main/build-info.json +4 -4
- package/src/main/config.cjs +41 -38
- package/src/main/docEdit.cjs +4 -1
- package/src/main/files.cjs +2 -5
- package/src/main/health.cjs +1 -1
- package/src/main/index.cjs +23 -10
- package/src/main/ipcSchemas.cjs +28 -35
- package/src/main/lib/agentPersonaSchema.cjs +13 -2
- package/src/main/lib/atomicFs.cjs +116 -0
- package/src/main/lib/branchSweep.cjs +13 -12
- package/src/main/lib/buildTarget.cjs +3 -3
- package/src/main/lib/claudeCliCaps.cjs +129 -0
- package/src/main/lib/credentials.cjs +2 -4
- package/src/main/lib/crossProjectFeedback.cjs +3 -3
- package/src/main/lib/cwdClassify.cjs +15 -3
- package/src/main/lib/definitionOfDone.cjs +207 -125
- package/src/main/lib/dodDrainHook.cjs +11 -5
- package/src/main/lib/epicMint.cjs +2 -4
- package/src/main/lib/epicStatusMirror.cjs +8 -10
- package/src/main/lib/epicWorktreeProjectConfig.cjs +2 -4
- package/src/main/lib/gateAuthority.cjs +96 -0
- package/src/main/lib/gitExec.cjs +69 -0
- package/src/main/lib/gitWorktree.cjs +656 -92
- package/src/main/lib/instanceLock.cjs +5 -8
- package/src/main/lib/launchFailure.cjs +2 -3
- package/src/main/lib/macroLibrary.cjs +386 -0
- package/src/main/lib/mcpToolCatalog.cjs +26 -17
- package/src/main/lib/needsReviewLedger.cjs +1 -1
- package/src/main/lib/opsErrorLog.cjs +11 -1
- package/src/main/lib/opsOwnership.cjs +0 -5
- package/src/main/lib/pidAlive.cjs +32 -0
- package/src/main/lib/prdCreate.cjs +153 -19
- package/src/main/lib/prdDisposition.cjs +2 -2
- package/src/main/lib/prdGateFiles.cjs +284 -0
- package/src/main/lib/prdLocations.cjs +61 -0
- package/src/main/lib/prdMigration.cjs +2 -3
- package/src/main/lib/prdSizing.cjs +2 -1
- package/src/main/lib/promptSessionSchema.cjs +10 -2
- package/src/main/lib/rcaReport.cjs +4 -6
- package/src/main/lib/reaperHelpers.cjs +8 -1
- package/src/main/lib/reservationExpiry.cjs +6 -1
- package/src/main/lib/reviewNotice.cjs +263 -0
- package/src/main/lib/runClaudeP.cjs +4 -1
- package/src/main/lib/schedulerPaths.cjs +22 -2
- package/src/main/lib/sessionSlots.cjs +2 -4
- package/src/main/lib/shippedPersonaSeeds.cjs +179 -0
- package/src/main/lib/timeoutShim.cjs +123 -0
- package/src/main/lib/timeoutShimScript.cjs +275 -0
- package/src/main/lib/upgradeDrain.cjs +4 -10
- package/src/main/lib/watchdogHelpers.cjs +33 -30
- package/src/main/lib/workTypeLibrary.cjs +7 -1
- package/src/main/promptSessionEvents.cjs +37 -13
- package/src/main/queueOps.cjs +17 -6
- package/src/main/scheduler.cjs +975 -203
- package/src/main/seedAgentPersonas.cjs +278 -23
- package/src/main/supervisor.cjs +4 -1
- package/src/main/templates/PRD_AUTHORING.md +126 -406
- package/src/preload/__tests__/preload-surface.test.cjs +68 -0
- package/src/preload/api.d.ts +41 -94
- package/src/preload/index.cjs +14 -9
- package/src/seed/agents/architect.md +1 -0
- package/src/seed/agents/dev-lead.md +17 -18
- package/src/seed/agents/project-home-builder.md +1 -0
- package/src/seed/agents/validator.md +10 -4
- package/dist/assets/HostBilko-nESrTRIg.js +0 -1
- package/dist/assets/Scheduler-BVYTeh39.js +0 -16
- package/dist/assets/Settings-DIhGgdfs.js +0 -3
- package/src/main/__tests__/activeIndexMerge.test.cjs +0 -235
- package/src/main/__tests__/agentEffortResolve.test.cjs +0 -117
- package/src/main/__tests__/agentLibrary.test.cjs +0 -276
- package/src/main/__tests__/agentModelResolve.test.cjs +0 -311
- package/src/main/__tests__/agentOverlayWrite.test.cjs +0 -95
- package/src/main/__tests__/bilkoHost-deriveSlug.test.cjs +0 -26
- package/src/main/__tests__/bilkoHost-integration.test.cjs +0 -118
- package/src/main/__tests__/bilkoHostCore.test.cjs +0 -72
- package/src/main/__tests__/broadcastCoalescer.test.cjs +0 -122
- package/src/main/__tests__/chat-cancel-terminal.test.cjs +0 -120
- package/src/main/__tests__/chat-dead-channels.test.cjs +0 -63
- package/src/main/__tests__/chat-exit-close-race.test.cjs +0 -146
- package/src/main/__tests__/chat-mcp-consent-notice.test.cjs +0 -139
- package/src/main/__tests__/chat-preamble-anchors.test.cjs +0 -100
- package/src/main/__tests__/chat-queue.test.cjs +0 -97
- package/src/main/__tests__/chat-stop-signal.test.cjs +0 -89
- package/src/main/__tests__/chatRunner-epic-worktree-execcwd.test.cjs +0 -125
- package/src/main/__tests__/chatRunner-session-flag-retry.test.cjs +0 -252
- package/src/main/__tests__/classifyPromptTicket.test.cjs +0 -101
- package/src/main/__tests__/classifyTranscriptLine.test.cjs +0 -201
- package/src/main/__tests__/computeDepHistorySatisfaction.test.cjs +0 -66
- package/src/main/__tests__/config-readText-bounded.test.cjs +0 -84
- package/src/main/__tests__/configWriteBoundaryOwners.test.cjs +0 -59
- package/src/main/__tests__/crossProjectFeedback.test.cjs +0 -334
- package/src/main/__tests__/crossProjectFeedbackRoutes.test.cjs +0 -161
- package/src/main/__tests__/dep-orphan-archive-health.test.cjs +0 -77
- package/src/main/__tests__/develop-skill-failure-modes.test.cjs +0 -70
- package/src/main/__tests__/docEdit.test.cjs +0 -244
- package/src/main/__tests__/dod-batchkey.test.cjs +0 -183
- package/src/main/__tests__/dod-drain-hook.test.cjs +0 -302
- package/src/main/__tests__/dod-report.test.cjs +0 -304
- package/src/main/__tests__/dod-reverify.test.cjs +0 -285
- package/src/main/__tests__/epicContextDigest.test.cjs +0 -174
- package/src/main/__tests__/epicMint.test.cjs +0 -332
- package/src/main/__tests__/epicMintTelemetryTap.test.cjs +0 -64
- package/src/main/__tests__/epicStatusMirror.test.cjs +0 -110
- package/src/main/__tests__/epicValidationHook.test.cjs +0 -291
- package/src/main/__tests__/exchanges.test.cjs +0 -122
- package/src/main/__tests__/exchangesPromptId.test.cjs +0 -61
- package/src/main/__tests__/extractJson.test.cjs +0 -51
- package/src/main/__tests__/files-reject-credentials.test.cjs +0 -40
- package/src/main/__tests__/fixtures/1218-fo-01-move-scripts-lib-into-src-main-lib.log +0 -556
- package/src/main/__tests__/flatPrdTickSweep.test.cjs +0 -110
- package/src/main/__tests__/health-build-freshness.test.cjs +0 -39
- package/src/main/__tests__/health-claude-md-budget.test.cjs +0 -57
- package/src/main/__tests__/health-credentials.test.cjs +0 -81
- package/src/main/__tests__/health-delegation-chain.test.cjs +0 -124
- package/src/main/__tests__/health-per-project-stall.test.cjs +0 -84
- package/src/main/__tests__/health-prd-migration.test.cjs +0 -37
- package/src/main/__tests__/health-queue-dispatch.test.cjs +0 -135
- package/src/main/__tests__/health-starve-escalation.test.cjs +0 -94
- package/src/main/__tests__/health-tick-liveness.test.cjs +0 -179
- package/src/main/__tests__/health-usage-poller.test.cjs +0 -144
- package/src/main/__tests__/health-worktree-cap-blocked.test.cjs +0 -65
- package/src/main/__tests__/heapSnapshot.test.cjs +0 -121
- package/src/main/__tests__/historyAggregatorIntraday.test.cjs +0 -313
- package/src/main/__tests__/historyDashboard.test.cjs +0 -163
- package/src/main/__tests__/historyRollup.test.cjs +0 -333
- package/src/main/__tests__/intradayRefresh.test.cjs +0 -39
- package/src/main/__tests__/ipcSchemas-dependsOn.test.cjs +0 -39
- package/src/main/__tests__/kg-augment.test.cjs +0 -195
- package/src/main/__tests__/loadGateDetailTick.test.cjs +0 -31
- package/src/main/__tests__/machineProfile.test.cjs +0 -152
- package/src/main/__tests__/mcpStatus.test.cjs +0 -61
- package/src/main/__tests__/memoryAggregate.test.cjs +0 -109
- package/src/main/__tests__/memoryStale.test.cjs +0 -88
- package/src/main/__tests__/needsReviewLedger.test.cjs +0 -162
- package/src/main/__tests__/openExternalApp-spawn-error.test.cjs +0 -25
- package/src/main/__tests__/opsErrorLog.test.cjs +0 -109
- package/src/main/__tests__/opsErrorLogTelemetryTap.test.cjs +0 -173
- package/src/main/__tests__/personaMerge.test.cjs +0 -169
- package/src/main/__tests__/planValidator.test.cjs +0 -125
- package/src/main/__tests__/pollLoop-dispatch-on-failure.test.cjs +0 -176
- package/src/main/__tests__/prd-group-allocator.test.cjs +0 -119
- package/src/main/__tests__/prdAdminRouteParity.test.cjs +0 -70
- package/src/main/__tests__/prdAdminRoutes.test.cjs +0 -718
- package/src/main/__tests__/prdAgentType.test.cjs +0 -103
- package/src/main/__tests__/prdAuthoringSeed.test.cjs +0 -39
- package/src/main/__tests__/prdCreate.test.cjs +0 -979
- package/src/main/__tests__/prdCreateDisposition.test.cjs +0 -201
- package/src/main/__tests__/prdCreatePlanId.test.cjs +0 -132
- package/src/main/__tests__/prdFrontmatterAgentType.test.cjs +0 -117
- package/src/main/__tests__/prdFrontmatterDependsOn.test.cjs +0 -136
- package/src/main/__tests__/prdFrontmatterDisposition.test.cjs +0 -125
- package/src/main/__tests__/prdFrontmatterQuietMachine.test.cjs +0 -108
- package/src/main/__tests__/prdLocations.test.cjs +0 -195
- package/src/main/__tests__/prdLocationsArchived.test.cjs +0 -201
- package/src/main/__tests__/prdMigration.test.cjs +0 -349
- package/src/main/__tests__/prdMigrationLegacyAdopt.test.cjs +0 -91
- package/src/main/__tests__/prdParserHighWater.test.cjs +0 -74
- package/src/main/__tests__/prdParserSourcePromptId.test.cjs +0 -65
- package/src/main/__tests__/prdSetDisposition.test.cjs +0 -222
- package/src/main/__tests__/prdSizing.test.cjs +0 -106
- package/src/main/__tests__/prdSourcePromptIdBackfill.test.cjs +0 -118
- package/src/main/__tests__/prdUpdateDependsOn.test.cjs +0 -160
- package/src/main/__tests__/proc-role-env.test.cjs +0 -125
- package/src/main/__tests__/procname-claude-spawn-sites.test.cjs +0 -304
- package/src/main/__tests__/procname-sm-processes.test.cjs +0 -127
- package/src/main/__tests__/projectHomeAdminRoutes.test.cjs +0 -177
- package/src/main/__tests__/projectPages.test.cjs +0 -137
- package/src/main/__tests__/promptSessionEvents.test.cjs +0 -234
- package/src/main/__tests__/promptSessionSchema.test.cjs +0 -101
- package/src/main/__tests__/promptSessionTranscript.test.cjs +0 -0
- package/src/main/__tests__/promptSessionsCreateEpicHandler.test.cjs +0 -159
- package/src/main/__tests__/pty-epic-worktree-spawn-cwd.test.cjs +0 -282
- package/src/main/__tests__/pty-session-open-telemetry.test.cjs +0 -96
- package/src/main/__tests__/pty-write-result.test.cjs +0 -46
- package/src/main/__tests__/queue-health-verdict.test.cjs +0 -170
- package/src/main/__tests__/queue-starvation-dispatch-driver.test.cjs +0 -286
- package/src/main/__tests__/queue-starvation-per-project.test.cjs +0 -147
- package/src/main/__tests__/queueHistory.test.cjs +0 -355
- package/src/main/__tests__/queueOps-interactive-ac-lint.test.cjs +0 -65
- package/src/main/__tests__/queueOpsArchiveDestination.test.cjs +0 -65
- package/src/main/__tests__/queueOpsAutoArchive.test.cjs +0 -154
- package/src/main/__tests__/rateLimitPollerStreak.test.cjs +0 -128
- package/src/main/__tests__/rcaReport.test.cjs +0 -266
- package/src/main/__tests__/reconcileFlatPrdSweep.test.cjs +0 -119
- package/src/main/__tests__/reconcileTiming.test.cjs +0 -135
- package/src/main/__tests__/runLogRetention.test.cjs +0 -489
- package/src/main/__tests__/runVerify-atomic-verdicts.test.cjs +0 -26
- package/src/main/__tests__/runVerify-blocked-by-foreign-wip.test.cjs +0 -58
- package/src/main/__tests__/runVerify-landed-commit-outranks.test.cjs +0 -191
- package/src/main/__tests__/runVerify-policy-denial.test.cjs +0 -89
- package/src/main/__tests__/runVerify-transcript-commit-evidence.test.cjs +0 -225
- package/src/main/__tests__/runVerify.test.cjs +0 -1784
- package/src/main/__tests__/scheduleJobSchema.test.cjs +0 -127
- package/src/main/__tests__/scheduleJobStatusDrift.test.cjs +0 -65
- package/src/main/__tests__/scheduleJobTransitions.test.cjs +0 -277
- package/src/main/__tests__/scheduleJobTransitionsGrep.test.cjs +0 -59
- package/src/main/__tests__/scheduleJobTransitionsTelemetryTap.test.cjs +0 -72
- package/src/main/__tests__/scheduler-admin-routes.test.cjs +0 -199
- package/src/main/__tests__/scheduler-adopted-run-supervision.test.cjs +0 -143
- package/src/main/__tests__/scheduler-already-satisfied-on-main.test.cjs +0 -105
- package/src/main/__tests__/scheduler-archive-completed-prd.test.cjs +0 -102
- package/src/main/__tests__/scheduler-archived-twin-guard.test.cjs +0 -155
- package/src/main/__tests__/scheduler-autofix-outcome.test.cjs +0 -188
- package/src/main/__tests__/scheduler-autofix-select.test.cjs +0 -439
- package/src/main/__tests__/scheduler-autopromote.test.cjs +0 -51
- package/src/main/__tests__/scheduler-bash-timeout-env.test.cjs +0 -101
- package/src/main/__tests__/scheduler-blocked-by-foreign-wip.test.cjs +0 -107
- package/src/main/__tests__/scheduler-boot-orphans.test.cjs +0 -153
- package/src/main/__tests__/scheduler-broadcast-reconcile.test.cjs +0 -121
- package/src/main/__tests__/scheduler-clear-queue-history.test.cjs +0 -134
- package/src/main/__tests__/scheduler-commit-guard-noop.test.cjs +0 -244
- package/src/main/__tests__/scheduler-committed-in-window.test.cjs +0 -182
- package/src/main/__tests__/scheduler-cross-project-batch.test.cjs +0 -43
- package/src/main/__tests__/scheduler-default-eligible-heal.test.cjs +0 -168
- package/src/main/__tests__/scheduler-dispatch-loop.test.cjs +0 -58
- package/src/main/__tests__/scheduler-effective-concurrency.test.cjs +0 -81
- package/src/main/__tests__/scheduler-epic-digest.test.cjs +0 -227
- package/src/main/__tests__/scheduler-failed-autoreset.test.cjs +0 -121
- package/src/main/__tests__/scheduler-finalize-dispatch-guards.test.cjs +0 -229
- package/src/main/__tests__/scheduler-find-prd-dir.test.cjs +0 -75
- package/src/main/__tests__/scheduler-fix-plan-path.test.cjs +0 -119
- package/src/main/__tests__/scheduler-force-tick-outcome.test.cjs +0 -46
- package/src/main/__tests__/scheduler-foreign-wip-manifest.test.cjs +0 -78
- package/src/main/__tests__/scheduler-gate-shadow.test.cjs +0 -119
- package/src/main/__tests__/scheduler-guard-verdict-autoresolve.test.cjs +0 -390
- package/src/main/__tests__/scheduler-heal-refusal.test.cjs +0 -61
- package/src/main/__tests__/scheduler-heartbeat-payload.test.cjs +0 -80
- package/src/main/__tests__/scheduler-inplace-salvage.test.cjs +0 -323
- package/src/main/__tests__/scheduler-integration-failure-stamp.test.cjs +0 -41
- package/src/main/__tests__/scheduler-investigation-clean-skip.test.cjs +0 -63
- package/src/main/__tests__/scheduler-investigation-prompt.test.cjs +0 -123
- package/src/main/__tests__/scheduler-job-budget.test.cjs +0 -172
- package/src/main/__tests__/scheduler-job-overrun.test.cjs +0 -175
- package/src/main/__tests__/scheduler-launch-failure.test.cjs +0 -199
- package/src/main/__tests__/scheduler-leftover-fields.test.cjs +0 -52
- package/src/main/__tests__/scheduler-leftover-quarantine.test.cjs +0 -199
- package/src/main/__tests__/scheduler-looks-done.test.cjs +0 -537
- package/src/main/__tests__/scheduler-manual-pause.test.cjs +0 -118
- package/src/main/__tests__/scheduler-mechanical-recovery.test.cjs +0 -245
- package/src/main/__tests__/scheduler-meta-code-sha.test.cjs +0 -46
- package/src/main/__tests__/scheduler-needs-review-autoresolve.test.cjs +0 -197
- package/src/main/__tests__/scheduler-never-stop.test.cjs +0 -157
- package/src/main/__tests__/scheduler-no-dead-end-status.test.cjs +0 -152
- package/src/main/__tests__/scheduler-no-orphan-run-dir.test.cjs +0 -81
- package/src/main/__tests__/scheduler-notify-originating-tab-transcript.test.cjs +0 -87
- package/src/main/__tests__/scheduler-notify-originating-tab.test.cjs +0 -343
- package/src/main/__tests__/scheduler-periodic-reverify-guard.test.cjs +0 -217
- package/src/main/__tests__/scheduler-porcelain-rename.test.cjs +0 -164
- package/src/main/__tests__/scheduler-prd-missing-skip.test.cjs +0 -161
- package/src/main/__tests__/scheduler-prd-persona-spawn.test.cjs +0 -178
- package/src/main/__tests__/scheduler-quarantine-autoresolve.test.cjs +0 -165
- package/src/main/__tests__/scheduler-quiet-machine-lease.test.cjs +0 -257
- package/src/main/__tests__/scheduler-rate-limit-cooldown-freshness.test.cjs +0 -123
- package/src/main/__tests__/scheduler-rate-limit-pause.test.cjs +0 -152
- package/src/main/__tests__/scheduler-rate-limit-spin-guard.test.cjs +0 -156
- package/src/main/__tests__/scheduler-reap-dead-running-jobs.test.cjs +0 -754
- package/src/main/__tests__/scheduler-reaper-helpers-basics.test.cjs +0 -87
- package/src/main/__tests__/scheduler-reconcile-cwd-preserve.test.cjs +0 -100
- package/src/main/__tests__/scheduler-reconcile-history-backfill.test.cjs +0 -105
- package/src/main/__tests__/scheduler-reconcile-invalid-repair.test.cjs +0 -203
- package/src/main/__tests__/scheduler-reconcile-quarantine.test.cjs +0 -247
- package/src/main/__tests__/scheduler-reset-job-fields-guard.test.cjs +0 -77
- package/src/main/__tests__/scheduler-resume-recovery.test.cjs +0 -254
- package/src/main/__tests__/scheduler-shard-quarantine.test.cjs +0 -115
- package/src/main/__tests__/scheduler-shared-tree-guard.test.cjs +0 -380
- package/src/main/__tests__/scheduler-sigterm-commit.test.cjs +0 -43
- package/src/main/__tests__/scheduler-stall-per-project.test.cjs +0 -126
- package/src/main/__tests__/scheduler-starve-escalation.test.cjs +0 -154
- package/src/main/__tests__/scheduler-stranded-autofix-park.test.cjs +0 -252
- package/src/main/__tests__/scheduler-stranded-investigation.test.cjs +0 -185
- package/src/main/__tests__/scheduler-stuck-failed-escalation.test.cjs +0 -136
- package/src/main/__tests__/scheduler-supervisor-record.test.cjs +0 -81
- package/src/main/__tests__/scheduler-tick-cancel-token.test.cjs +0 -54
- package/src/main/__tests__/scheduler-tick-wedge.test.cjs +0 -172
- package/src/main/__tests__/scheduler-transient-failure.test.cjs +0 -141
- package/src/main/__tests__/scheduler-unreadable-queue-guard.test.cjs +0 -62
- package/src/main/__tests__/scheduler-utilization-hold.test.cjs +0 -89
- package/src/main/__tests__/scheduler-verify-prd-path.test.cjs +0 -109
- package/src/main/__tests__/scheduler-worktree-cap-defer.test.cjs +0 -234
- package/src/main/__tests__/scheduler-worktree-exec-cwd.test.cjs +0 -120
- package/src/main/__tests__/scheduler-writeprd-epic-rollback.test.cjs +0 -105
- package/src/main/__tests__/schedulerBatchRootBlocker.test.cjs +0 -117
- package/src/main/__tests__/schedulerStateSidecarRestore.test.cjs +0 -110
- package/src/main/__tests__/seedAgentPersonas.test.cjs +0 -184
- package/src/main/__tests__/seedSchedulerMcp.test.cjs +0 -211
- package/src/main/__tests__/seedStatus.test.cjs +0 -100
- package/src/main/__tests__/seedValidatorPersona.test.cjs +0 -116
- package/src/main/__tests__/stop-signal-anchor.test.cjs +0 -75
- package/src/main/__tests__/telemetryClient.test.cjs +0 -1055
- package/src/main/__tests__/telemetryContract.test.cjs +0 -930
- package/src/main/__tests__/telemetrySettings.test.cjs +0 -210
- package/src/main/__tests__/transcripts-batch-flush.test.cjs +0 -249
- package/src/main/__tests__/transcripts-doFlush-array.test.cjs +0 -124
- package/src/main/__tests__/transcripts-paged-reads.test.cjs +0 -241
- package/src/main/__tests__/transcripts-worktree-epic-path.test.cjs +0 -154
- package/src/main/__tests__/transcriptsUsageFor.test.cjs +0 -206
- package/src/main/__tests__/uniquePrdNumbers.test.cjs +0 -153
- package/src/main/__tests__/usageSingleFlight.test.cjs +0 -169
- package/src/main/__tests__/validationSentinels.test.cjs +0 -84
- package/src/main/__tests__/workTypeLibrary.test.cjs +0 -89
- package/src/main/bilkoHost.cjs +0 -314
- package/src/main/bilkoHostCore.cjs +0 -89
- package/src/main/lib/__tests__/active-sessions.test.cjs +0 -251
- package/src/main/lib/__tests__/activeIndexRebuild.test.cjs +0 -179
- package/src/main/lib/__tests__/agentPersonaSchema.test.cjs +0 -67
- package/src/main/lib/__tests__/auditLog.test.cjs +0 -38
- package/src/main/lib/__tests__/bootSelfHeal.test.cjs +0 -107
- package/src/main/lib/__tests__/branchSweep.test.cjs +0 -164
- package/src/main/lib/__tests__/buildIdentity.test.cjs +0 -121
- package/src/main/lib/__tests__/buildTarget.test.cjs +0 -52
- package/src/main/lib/__tests__/childWithLog.test.cjs +0 -321
- package/src/main/lib/__tests__/coldBootPromptSessionsWrite.test.cjs +0 -87
- package/src/main/lib/__tests__/crashTelemetry.test.cjs +0 -103
- package/src/main/lib/__tests__/credentials-futile-refresh.test.cjs +0 -115
- package/src/main/lib/__tests__/cwdClassify.test.cjs +0 -111
- package/src/main/lib/__tests__/definitionOfDoneSequence.test.cjs +0 -95
- package/src/main/lib/__tests__/delegationReadiness.test.cjs +0 -1175
- package/src/main/lib/__tests__/dispatchLoop.test.cjs +0 -63
- package/src/main/lib/__tests__/effectiveModelInfo.test.cjs +0 -244
- package/src/main/lib/__tests__/ephemeralCwd.test.cjs +0 -91
- package/src/main/lib/__tests__/epicDelegationStats.test.cjs +0 -137
- package/src/main/lib/__tests__/epicSpawnCwd.test.cjs +0 -283
- package/src/main/lib/__tests__/epicSpawnPlan.test.cjs +0 -196
- package/src/main/lib/__tests__/epicTranscriptPath.test.cjs +0 -163
- package/src/main/lib/__tests__/epicWorktreeBoot.test.cjs +0 -136
- package/src/main/lib/__tests__/epicWorktreeMerge.test.cjs +0 -130
- package/src/main/lib/__tests__/epicWorktreeMint.test.cjs +0 -117
- package/src/main/lib/__tests__/epicWorktreeProjectConfig.test.cjs +0 -137
- package/src/main/lib/__tests__/fixChainDepth.test.cjs +0 -40
- package/src/main/lib/__tests__/fixtures/204-mercury-steam-horse.log.txt +0 -13
- package/src/main/lib/__tests__/fixtures/scheduler-machine.json.corrupt-1789147548 +0 -34
- package/src/main/lib/__tests__/gateFixtures.json +0 -20
- package/src/main/lib/__tests__/gitCacheBound.test.cjs +0 -69
- package/src/main/lib/__tests__/gitWorktree.test.cjs +0 -1478
- package/src/main/lib/__tests__/gitWorktreeSalvage.test.cjs +0 -107
- package/src/main/lib/__tests__/gitWorktreeSalvageDelta.test.cjs +0 -153
- package/src/main/lib/__tests__/guardShims.test.cjs +0 -158
- package/src/main/lib/__tests__/importReferences.spec.cjs +0 -56
- package/src/main/lib/__tests__/instanceLock.test.cjs +0 -173
- package/src/main/lib/__tests__/jobSupervisorRecord.test.cjs +0 -78
- package/src/main/lib/__tests__/jobWorktree.test.cjs +0 -199
- package/src/main/lib/__tests__/jobWorktreeBootLive.test.cjs +0 -82
- package/src/main/lib/__tests__/landedSinceRun.test.cjs +0 -133
- package/src/main/lib/__tests__/launchFailure.test.cjs +0 -220
- package/src/main/lib/__tests__/loadGate.test.cjs +0 -303
- package/src/main/lib/__tests__/localAdminHttp.test.cjs +0 -214
- package/src/main/lib/__tests__/loopDelay.test.cjs +0 -68
- package/src/main/lib/__tests__/mcpToolCatalog.test.cjs +0 -107
- package/src/main/lib/__tests__/modelCatalog.test.cjs +0 -202
- package/src/main/lib/__tests__/opsOwnership.test.cjs +0 -113
- package/src/main/lib/__tests__/opsRootAbsoluteCwd.test.cjs +0 -328
- package/src/main/lib/__tests__/opsRootNestedWrite.test.cjs +0 -51
- package/src/main/lib/__tests__/opsRootResolve.test.cjs +0 -149
- package/src/main/lib/__tests__/prdDeclaredPaths.test.cjs +0 -82
- package/src/main/lib/__tests__/prdDisposition.test.cjs +0 -224
- package/src/main/lib/__tests__/procIdentity.test.cjs +0 -119
- package/src/main/lib/__tests__/procName.test.cjs +0 -92
- package/src/main/lib/__tests__/projectBriefCore.test.cjs +0 -216
- package/src/main/lib/__tests__/projectRootResolve.test.cjs +0 -148
- package/src/main/lib/__tests__/queueHealth.test.cjs +0 -58
- package/src/main/lib/__tests__/queueStoreAtomicWrite.test.cjs +0 -88
- package/src/main/lib/__tests__/queueStoreMachineStateRecovery.test.cjs +0 -190
- package/src/main/lib/__tests__/quietMachineLease.test.cjs +0 -39
- package/src/main/lib/__tests__/rateLimitWindow.test.cjs +0 -88
- package/src/main/lib/__tests__/reaperHelpers.test.cjs +0 -577
- package/src/main/lib/__tests__/schedulerBatchDepends.test.cjs +0 -312
- package/src/main/lib/__tests__/schedulerBatchFairness.test.cjs +0 -213
- package/src/main/lib/__tests__/schedulerBatchLaunchHold.test.cjs +0 -125
- package/src/main/lib/__tests__/schedulerBatchProjectCap.test.cjs +0 -127
- package/src/main/lib/__tests__/schedulerBatchQuietMachine.test.cjs +0 -109
- package/src/main/lib/__tests__/schedulerMcpServerHeadlessRefusal.test.cjs +0 -71
- package/src/main/lib/__tests__/schedulerMcpServerHelp.test.cjs +0 -216
- package/src/main/lib/__tests__/schedulerMcpServerProjectHome.test.cjs +0 -183
- package/src/main/lib/__tests__/schedulerPaths.test.cjs +0 -226
- package/src/main/lib/__tests__/schedulerPathsWorktree.test.cjs +0 -133
- package/src/main/lib/__tests__/schedulerRuntimeState.test.cjs +0 -56
- package/src/main/lib/__tests__/sessionSlots.test.cjs +0 -144
- package/src/main/lib/__tests__/telemetryBacklog.test.cjs +0 -626
- package/src/main/lib/__tests__/telemetryBoot.test.cjs +0 -134
- package/src/main/lib/__tests__/telemetryConsent.test.cjs +0 -136
- package/src/main/lib/__tests__/telemetryCounters.test.cjs +0 -57
- package/src/main/lib/__tests__/telemetryCountersMetadataColumn.test.cjs +0 -98
- package/src/main/lib/__tests__/terminalRunOutcome.test.cjs +0 -200
- package/src/main/lib/__tests__/toolUseClassify.test.cjs +0 -53
- package/src/main/lib/__tests__/updateCheck.test.cjs +0 -63
- package/src/main/lib/__tests__/upgradeDrain.test.cjs +0 -130
- package/src/main/lib/__tests__/usageCircuit.test.cjs +0 -354
- package/src/main/lib/__tests__/watchdog-helpers.test.cjs +0 -375
- package/src/main/lib/__tests__/watchdog-relaunch.test.cjs +0 -266
- package/src/main/lib/kgExchangePairing.cjs +0 -75
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* scheduler-archived-twin-guard.test.cjs — unit tests for archivedTwinExists
|
|
3
|
-
* (PRD 822-promptsession-prd-trace-events recurrence fix): a queue row whose
|
|
4
|
-
* PRD `.md` has already been moved to the sibling `prds-archived/` dir (work
|
|
5
|
-
* shipped out-of-band) must be recognized as stale, not a genuine missing-PRD
|
|
6
|
-
* failure.
|
|
7
|
-
*
|
|
8
|
-
* Uses a temp cwd fixture (`prdDirForCwd` is a pure path join off `cwd`) so
|
|
9
|
-
* this never touches the real `~/.claude/session-manager/` tree.
|
|
10
|
-
*
|
|
11
|
-
* Run: timeout 120 npx vitest run src/main/__tests__/scheduler-archived-twin-guard.test.cjs
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
'use strict';
|
|
15
|
-
|
|
16
|
-
import { test, expect, afterEach } from 'vitest';
|
|
17
|
-
const fs = require('node:fs');
|
|
18
|
-
const os = require('node:os');
|
|
19
|
-
const path = require('node:path');
|
|
20
|
-
const { archivedTwinExists, archivedPrdPathForJob, prdDirForCwd } = require('../scheduler.cjs');
|
|
21
|
-
const { listArchivedPrdDirs } = require('../lib/prdLocations.cjs');
|
|
22
|
-
|
|
23
|
-
const tmpDirs = [];
|
|
24
|
-
|
|
25
|
-
function makeFixtureCwd() {
|
|
26
|
-
const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'sm-archived-twin-'));
|
|
27
|
-
tmpDirs.push(cwd);
|
|
28
|
-
return cwd;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
afterEach(() => {
|
|
32
|
-
while (tmpDirs.length) {
|
|
33
|
-
const dir = tmpDirs.pop();
|
|
34
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test('archivedTwinExists returns true when the archived twin exists and the live PRD does not', async () => {
|
|
39
|
-
const cwd = makeFixtureCwd();
|
|
40
|
-
const slug = 'test-shipped-and-archived';
|
|
41
|
-
const prdsDir = prdDirForCwd(cwd);
|
|
42
|
-
const archivedDir = path.join(prdsDir, '..', 'prds-archived');
|
|
43
|
-
fs.mkdirSync(archivedDir, { recursive: true });
|
|
44
|
-
fs.writeFileSync(path.join(archivedDir, `${slug}.md`), '# Goal\n\nshipped\n', 'utf8');
|
|
45
|
-
|
|
46
|
-
await expect(archivedTwinExists({ slug, cwd })).resolves.toBe(true);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
test('archivedTwinExists returns false when neither the live PRD nor an archived twin exists', async () => {
|
|
50
|
-
const cwd = makeFixtureCwd();
|
|
51
|
-
const slug = 'test-genuinely-missing';
|
|
52
|
-
fs.mkdirSync(prdDirForCwd(cwd), { recursive: true });
|
|
53
|
-
|
|
54
|
-
await expect(archivedTwinExists({ slug, cwd })).resolves.toBe(false);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test('archivedTwinExists returns false for a slug whose archived twin belongs to a different cwd', async () => {
|
|
58
|
-
const cwd = makeFixtureCwd();
|
|
59
|
-
const otherCwd = makeFixtureCwd();
|
|
60
|
-
const slug = 'test-cross-cwd-twin';
|
|
61
|
-
const otherArchivedDir = path.join(prdDirForCwd(otherCwd), '..', 'prds-archived');
|
|
62
|
-
fs.mkdirSync(otherArchivedDir, { recursive: true });
|
|
63
|
-
fs.writeFileSync(path.join(otherArchivedDir, `${slug}.md`), '# Goal\n\nother project\n', 'utf8');
|
|
64
|
-
fs.mkdirSync(prdDirForCwd(cwd), { recursive: true });
|
|
65
|
-
|
|
66
|
-
await expect(archivedTwinExists({ slug, cwd })).resolves.toBe(false);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('archivedTwinExists returns false when the PRD is still live in prds/ (never short-circuits a normal run)', async () => {
|
|
70
|
-
const cwd = makeFixtureCwd();
|
|
71
|
-
const slug = 'test-still-live';
|
|
72
|
-
const prdsDir = prdDirForCwd(cwd);
|
|
73
|
-
fs.mkdirSync(prdsDir, { recursive: true });
|
|
74
|
-
fs.writeFileSync(path.join(prdsDir, `${slug}.md`), '# Goal\n\nlive\n', 'utf8');
|
|
75
|
-
|
|
76
|
-
await expect(archivedTwinExists({ slug, cwd })).resolves.toBe(false);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test('archivedPrdPathForJob resolves to the sibling prds-archived/<slug>.md for a job cwd', () => {
|
|
80
|
-
const cwd = makeFixtureCwd();
|
|
81
|
-
const job = { cwd, slug: 'my-slug' };
|
|
82
|
-
const prdsDir = prdDirForCwd(cwd);
|
|
83
|
-
const expected = path.join(prdsDir, '..', 'prds-archived', 'my-slug.md');
|
|
84
|
-
expect(archivedPrdPathForJob(job)).toBe(expected);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test('archivedPrdPathForJob does not escape prds-archived/ for a well-formed slug', () => {
|
|
88
|
-
const cwd = makeFixtureCwd();
|
|
89
|
-
const job = { cwd, slug: 'well-formed-slug' };
|
|
90
|
-
const resolved = path.resolve(archivedPrdPathForJob(job));
|
|
91
|
-
const archiveDir = path.resolve(path.join(prdDirForCwd(cwd), '..', 'prds-archived'));
|
|
92
|
-
expect(resolved.startsWith(archiveDir + path.sep)).toBe(true);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
test('archivedTwinExists returns true when the twin lives in an EPIC\'s prds-archived dir', async () => {
|
|
96
|
-
// Regression cover for job 865: every new PRD is Epic-scoped, and
|
|
97
|
-
// archiveCompletedPrd archives into the Epic's own sibling prds-archived/,
|
|
98
|
-
// not the retired flat one. A queue row whose PRD moved there must still
|
|
99
|
-
// be recognized as stale.
|
|
100
|
-
const cwd = makeFixtureCwd();
|
|
101
|
-
const slug = '865-paste-image-in-chat-does-not-work';
|
|
102
|
-
const epicArchiveDir = path.join(
|
|
103
|
-
cwd, 'session-manager-operations', 'scheduler', 'epics', 'psess-fixture-1', 'prds-archived',
|
|
104
|
-
);
|
|
105
|
-
fs.mkdirSync(epicArchiveDir, { recursive: true });
|
|
106
|
-
fs.writeFileSync(path.join(epicArchiveDir, `${slug}.md`), '# Goal\n\nshipped\n', 'utf8');
|
|
107
|
-
|
|
108
|
-
await expect(archivedTwinExists({ slug, cwd })).resolves.toBe(true);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
test('archivedTwinExists still returns true for a flat-layout twin', async () => {
|
|
112
|
-
const cwd = makeFixtureCwd();
|
|
113
|
-
const slug = 'test-flat-layout-twin';
|
|
114
|
-
const archivedDir = path.join(prdDirForCwd(cwd), '..', 'prds-archived');
|
|
115
|
-
fs.mkdirSync(archivedDir, { recursive: true });
|
|
116
|
-
fs.writeFileSync(path.join(archivedDir, `${slug}.md`), '# Goal\n\nshipped\n', 'utf8');
|
|
117
|
-
|
|
118
|
-
await expect(archivedTwinExists({ slug, cwd })).resolves.toBe(true);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
test('archivedTwinExists returns false when no twin exists in any layout', async () => {
|
|
122
|
-
const cwd = makeFixtureCwd();
|
|
123
|
-
const slug = 'test-no-twin-anywhere';
|
|
124
|
-
fs.mkdirSync(prdDirForCwd(cwd), { recursive: true });
|
|
125
|
-
|
|
126
|
-
await expect(archivedTwinExists({ slug, cwd })).resolves.toBe(false);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
test('listArchivedPrdDirs returns the flat dir plus every existing epic archive dir', () => {
|
|
130
|
-
const cwd = makeFixtureCwd();
|
|
131
|
-
const epicArchiveDir1 = path.join(
|
|
132
|
-
cwd, 'session-manager-operations', 'scheduler', 'epics', 'psess-a', 'prds-archived',
|
|
133
|
-
);
|
|
134
|
-
const epicArchiveDir2 = path.join(
|
|
135
|
-
cwd, 'session-manager-operations', 'scheduler', 'epics', 'psess-b', 'prds-archived',
|
|
136
|
-
);
|
|
137
|
-
// psess-c has no prds-archived dir yet — should be excluded.
|
|
138
|
-
fs.mkdirSync(path.join(cwd, 'session-manager-operations', 'scheduler', 'epics', 'psess-c', 'prds'), { recursive: true });
|
|
139
|
-
fs.mkdirSync(epicArchiveDir1, { recursive: true });
|
|
140
|
-
fs.mkdirSync(epicArchiveDir2, { recursive: true });
|
|
141
|
-
|
|
142
|
-
const dirs = listArchivedPrdDirs(cwd);
|
|
143
|
-
const flatDir = path.join(prdDirForCwd(cwd), '..', 'prds-archived');
|
|
144
|
-
expect(dirs).toContain(flatDir);
|
|
145
|
-
expect(dirs).toContain(epicArchiveDir1);
|
|
146
|
-
expect(dirs).toContain(epicArchiveDir2);
|
|
147
|
-
expect(dirs).not.toContain(path.join(cwd, 'session-manager-operations', 'scheduler', 'epics', 'psess-c', 'prds-archived'));
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test('listArchivedPrdDirs never throws for a cwd with no session-manager-operations/ at all', () => {
|
|
151
|
-
const cwd = makeFixtureCwd();
|
|
152
|
-
expect(() => listArchivedPrdDirs(cwd)).not.toThrow();
|
|
153
|
-
const dirs = listArchivedPrdDirs(cwd);
|
|
154
|
-
expect(dirs.length).toBe(1);
|
|
155
|
-
});
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* scheduler-autofix-outcome.test.cjs — self-heal terminal-state gap fix.
|
|
3
|
-
*
|
|
4
|
-
* spawnInvestigation's onExit used to stamp autoFixOutcome only in the
|
|
5
|
-
* no-plan branch; a job whose probe erred, spawn-failed, or produced a plan
|
|
6
|
-
* that never became a queue row ended up autoFixAttempted:true with no
|
|
7
|
-
* outcome — permanently excluded from both retry AND the exhausted-retry
|
|
8
|
-
* annotation. This file is a vitest-runnable (npm run test:unit) home for
|
|
9
|
-
* the scenarios the PRD's acceptance criteria enumerate; the pure-logic
|
|
10
|
-
* coverage in scheduler-autofix-select.test.cjs (node --test) exercises the
|
|
11
|
-
* same helpers in more granular detail.
|
|
12
|
-
*
|
|
13
|
-
* PRD 1129 added one sub-shape to case (d): "outcome 'plan' WITH a queue
|
|
14
|
-
* row is neither retried nor annotated" only holds while that queue row
|
|
15
|
-
* (the fix-plan child) is still alive. Once the child itself reaches a
|
|
16
|
-
* terminal, non-completed status, isFixPlanDead makes the parent eligible
|
|
17
|
-
* for exactly one further attempt (stamped autoFixReopened: true), after
|
|
18
|
-
* which it is permanently excluded and annotated again.
|
|
19
|
-
*
|
|
20
|
-
* Run: timeout 120 npx vitest run src/main/__tests__/scheduler-autofix-outcome.test.cjs
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
'use strict';
|
|
24
|
-
|
|
25
|
-
import { test, expect } from 'vitest';
|
|
26
|
-
const {
|
|
27
|
-
selectAutoFixTargets, isExhaustedAutoFix, isPlanUnqueued, isFixPlanDead, fixSlugFor,
|
|
28
|
-
} = require('../scheduler.cjs');
|
|
29
|
-
|
|
30
|
-
const noSiblingOnDisk = () => false;
|
|
31
|
-
|
|
32
|
-
function makeJob(overrides = {}) {
|
|
33
|
-
return {
|
|
34
|
-
slug: '05-my-feature',
|
|
35
|
-
status: 'needs_review',
|
|
36
|
-
runId: '2026-06-16T10-00-00-000Z',
|
|
37
|
-
parallelGroup: 5,
|
|
38
|
-
...overrides,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function isTarget(job) {
|
|
43
|
-
return selectAutoFixTargets([job], { fixSlugExists: noSiblingOnDisk }).some((j) => j.slug === job.slug);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function isAnnotatable(job, queuedSlugs = new Set()) {
|
|
47
|
-
return isExhaustedAutoFix(job) || isPlanUnqueued(job, queuedSlugs);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// (a) attempted + no outcome → eligible once, then annotated when the retry is spent.
|
|
51
|
-
test('(a) attempted with unstamped outcome and an unspent retry is eligible, not annotated', () => {
|
|
52
|
-
const job = makeJob({ autoFixAttempted: true, autoFixRetries: 0 });
|
|
53
|
-
expect(isTarget(job)).toBe(true);
|
|
54
|
-
expect(isAnnotatable(job)).toBe(false);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test('(a) attempted with unstamped outcome and a spent retry is annotated, not eligible', () => {
|
|
58
|
-
const job = makeJob({ autoFixAttempted: true, autoFixRetries: 1 });
|
|
59
|
-
expect(isTarget(job)).toBe(false);
|
|
60
|
-
expect(isAnnotatable(job)).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// (b) outcome 'error' → eligible once.
|
|
64
|
-
test("(b) outcome 'error' with an unspent retry is eligible", () => {
|
|
65
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'error', autoFixRetries: 0 });
|
|
66
|
-
expect(isTarget(job)).toBe(true);
|
|
67
|
-
expect(isAnnotatable(job)).toBe(false);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("(b) outcome 'error' with a spent retry is annotated, not eligible", () => {
|
|
71
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'error', autoFixRetries: 1 });
|
|
72
|
-
expect(isTarget(job)).toBe(false);
|
|
73
|
-
expect(isAnnotatable(job)).toBe(true);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// (c) outcome 'plan' with no queue row → annotated autofix_plan_unqueued, NOT retried.
|
|
77
|
-
test("(c) outcome 'plan' with the fix slug absent from the queue is annotated, never retried", () => {
|
|
78
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0 });
|
|
79
|
-
expect(isTarget(job)).toBe(false);
|
|
80
|
-
expect(isPlanUnqueued(job, new Set())).toBe(true);
|
|
81
|
-
expect(isExhaustedAutoFix(job)).toBe(false);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// (d) outcome 'plan' WITH a queue row → neither retried nor annotated.
|
|
85
|
-
test("(d) outcome 'plan' with the fix slug present in the queue is neither retried nor annotated", () => {
|
|
86
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0 });
|
|
87
|
-
const queuedSlugs = new Set([fixSlugFor(job)]);
|
|
88
|
-
expect(isTarget(job)).toBe(false);
|
|
89
|
-
expect(isAnnotatable(job, queuedSlugs)).toBe(false);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// (e) dead fix-plan child: outcome 'plan' whose fix-plan row itself died —
|
|
93
|
-
// the parent is eligible again, exactly once.
|
|
94
|
-
test('(e) a dead fix-plan child makes the parent eligible for one further attempt', () => {
|
|
95
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0 });
|
|
96
|
-
const deadChild = { slug: fixSlugFor(job), status: 'needs_review', parallelGroup: job.parallelGroup };
|
|
97
|
-
const jobs = [job, deadChild];
|
|
98
|
-
expect(isFixPlanDead(job, jobs)).toBe(true);
|
|
99
|
-
expect(selectAutoFixTargets(jobs, { fixSlugExists: noSiblingOnDisk }).some((j) => j.slug === job.slug)).toBe(true);
|
|
100
|
-
expect(isAnnotatable(job, new Set(jobs.map((j) => j.slug)))).toBe(false);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test('(e) a failed, quarantined, or skipped fix-plan child also counts as dead', () => {
|
|
104
|
-
for (const status of ['failed', 'quarantined', 'skipped']) {
|
|
105
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0 });
|
|
106
|
-
const deadChild = { slug: fixSlugFor(job), status, parallelGroup: job.parallelGroup };
|
|
107
|
-
expect(isFixPlanDead(job, [job, deadChild])).toBe(true);
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
test('(e) an already-reopened parent is annotated, never eligible again — even with another dead child', () => {
|
|
112
|
-
const job = makeJob({
|
|
113
|
-
autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 1, autoFixReopened: true,
|
|
114
|
-
});
|
|
115
|
-
const deadChild = { slug: fixSlugFor(job), status: 'needs_review', parallelGroup: job.parallelGroup };
|
|
116
|
-
const jobs = [job, deadChild];
|
|
117
|
-
expect(isFixPlanDead(job, jobs)).toBe(false);
|
|
118
|
-
expect(selectAutoFixTargets(jobs, { fixSlugExists: noSiblingOnDisk }).some((j) => j.slug === job.slug)).toBe(false);
|
|
119
|
-
expect(isExhaustedAutoFix(job)).toBe(true);
|
|
120
|
-
expect(isAnnotatable(job, new Set(jobs.map((j) => j.slug)))).toBe(true);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test('(e) a reopened parent whose second attempt is still in flight (outcome cleared) is untouched — not re-eligible, not yet annotated', () => {
|
|
124
|
-
const job = makeJob({ autoFixAttempted: true, autoFixRetries: 1, autoFixReopened: true });
|
|
125
|
-
expect(isFixPlanDead(job, [job])).toBe(false);
|
|
126
|
-
expect(selectAutoFixTargets([job], { fixSlugExists: noSiblingOnDisk }).some((j) => j.slug === job.slug)).toBe(false);
|
|
127
|
-
expect(isExhaustedAutoFix(job)).toBe(false);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
test('(e) a fix-plan child that is still pending leaves the parent untouched', () => {
|
|
131
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0 });
|
|
132
|
-
const pendingChild = { slug: fixSlugFor(job), status: 'pending', parallelGroup: job.parallelGroup };
|
|
133
|
-
const jobs = [job, pendingChild];
|
|
134
|
-
expect(isFixPlanDead(job, jobs)).toBe(false);
|
|
135
|
-
expect(selectAutoFixTargets(jobs, { fixSlugExists: noSiblingOnDisk }).some((j) => j.slug === job.slug)).toBe(false);
|
|
136
|
-
expect(isAnnotatable(job, new Set(jobs.map((j) => j.slug)))).toBe(false);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
test('(e) a fix-plan child that is still running leaves the parent untouched', () => {
|
|
140
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0 });
|
|
141
|
-
const runningChild = { slug: fixSlugFor(job), status: 'running', parallelGroup: job.parallelGroup };
|
|
142
|
-
const jobs = [job, runningChild];
|
|
143
|
-
expect(isFixPlanDead(job, jobs)).toBe(false);
|
|
144
|
-
expect(selectAutoFixTargets(jobs, { fixSlugExists: noSiblingOnDisk }).some((j) => j.slug === job.slug)).toBe(false);
|
|
145
|
-
expect(isAnnotatable(job, new Set(jobs.map((j) => j.slug)))).toBe(false);
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
test('(e) a fix-plan child that completed leaves the parent untouched (unchanged from today)', () => {
|
|
149
|
-
const job = makeJob({ autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0 });
|
|
150
|
-
const completedChild = { slug: fixSlugFor(job), status: 'completed', parallelGroup: job.parallelGroup };
|
|
151
|
-
const jobs = [job, completedChild];
|
|
152
|
-
expect(isFixPlanDead(job, jobs)).toBe(false);
|
|
153
|
-
expect(selectAutoFixTargets(jobs, { fixSlugExists: noSiblingOnDisk }).some((j) => j.slug === job.slug)).toBe(false);
|
|
154
|
-
expect(isAnnotatable(job, new Set(jobs.map((j) => j.slug)))).toBe(false);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// (invariant) every needs_review job is either an auto-fix target or
|
|
158
|
-
// annotatable (would receive a non-null verifierVerdict) — never both false.
|
|
159
|
-
test('invariant: fresh, retry-eligible, exhausted, and plan-unqueued jobs are always selected or annotatable', () => {
|
|
160
|
-
const jobs = [
|
|
161
|
-
makeJob({ slug: '01-fresh' }),
|
|
162
|
-
makeJob({ slug: '02-unstamped-retry', autoFixAttempted: true, autoFixRetries: 0 }),
|
|
163
|
-
makeJob({ slug: '03-unstamped-exhausted', autoFixAttempted: true, autoFixRetries: 1 }),
|
|
164
|
-
makeJob({ slug: '04-error-retry', autoFixAttempted: true, autoFixOutcome: 'error', autoFixRetries: 0 }),
|
|
165
|
-
makeJob({ slug: '05-error-exhausted', autoFixAttempted: true, autoFixOutcome: 'error', autoFixRetries: 1 }),
|
|
166
|
-
makeJob({ slug: '06-plan-unqueued', autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0 }),
|
|
167
|
-
];
|
|
168
|
-
const planJob = jobs.find((j) => j.slug === '06-plan-unqueued');
|
|
169
|
-
const planQueuedJob = makeJob({
|
|
170
|
-
slug: '07-plan-queued', parallelGroup: 7, autoFixAttempted: true, autoFixOutcome: 'plan', autoFixRetries: 0,
|
|
171
|
-
});
|
|
172
|
-
jobs.push(planQueuedJob);
|
|
173
|
-
const queuedSlugs = new Set([fixSlugFor(planQueuedJob)]);
|
|
174
|
-
|
|
175
|
-
const targets = new Set(selectAutoFixTargets(jobs, { fixSlugExists: noSiblingOnDisk }).map((j) => j.slug));
|
|
176
|
-
for (const job of jobs) {
|
|
177
|
-
const selected = targets.has(job.slug);
|
|
178
|
-
const annotated = isAnnotatable(job, queuedSlugs);
|
|
179
|
-
if (job.slug === '07-plan-queued') {
|
|
180
|
-
// The good path: waiting on the fix-plan job itself, no action here.
|
|
181
|
-
expect(selected).toBe(false);
|
|
182
|
-
expect(annotated).toBe(false);
|
|
183
|
-
continue;
|
|
184
|
-
}
|
|
185
|
-
expect(selected || annotated).toBe(true);
|
|
186
|
-
}
|
|
187
|
-
expect(isPlanUnqueued(planJob, queuedSlugs)).toBe(true);
|
|
188
|
-
});
|