@urateam/core 0.1.55 → 0.1.57
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/dist/__tests__/audit-immutability.test.js +8 -0
- package/dist/__tests__/audit-immutability.test.js.map +1 -1
- package/dist/__tests__/auth-check.test.js +130 -16
- package/dist/__tests__/auth-check.test.js.map +1 -1
- package/dist/__tests__/auth-monitor.test.js +210 -87
- package/dist/__tests__/auth-monitor.test.js.map +1 -1
- package/dist/__tests__/bec-238-repro.test.d.ts +2 -0
- package/dist/__tests__/bec-238-repro.test.d.ts.map +1 -0
- package/dist/__tests__/bec-238-repro.test.js +116 -0
- package/dist/__tests__/bec-238-repro.test.js.map +1 -0
- package/dist/__tests__/bec146-repro.test.d.ts +2 -0
- package/dist/__tests__/bec146-repro.test.d.ts.map +1 -0
- package/dist/__tests__/bec146-repro.test.js +153 -0
- package/dist/__tests__/bec146-repro.test.js.map +1 -0
- package/dist/__tests__/circuit-breaker-config.test.d.ts +2 -0
- package/dist/__tests__/circuit-breaker-config.test.d.ts.map +1 -0
- package/dist/__tests__/circuit-breaker-config.test.js +32 -0
- package/dist/__tests__/circuit-breaker-config.test.js.map +1 -0
- package/dist/__tests__/circuit-breaker-events.test.d.ts +2 -0
- package/dist/__tests__/circuit-breaker-events.test.d.ts.map +1 -0
- package/dist/__tests__/circuit-breaker-events.test.js +53 -0
- package/dist/__tests__/circuit-breaker-events.test.js.map +1 -0
- package/dist/__tests__/circuit-breaker-integration.test.d.ts +2 -0
- package/dist/__tests__/circuit-breaker-integration.test.d.ts.map +1 -0
- package/dist/__tests__/circuit-breaker-integration.test.js +192 -0
- package/dist/__tests__/circuit-breaker-integration.test.js.map +1 -0
- package/dist/__tests__/circuit-breaker-probe.test.d.ts +2 -0
- package/dist/__tests__/circuit-breaker-probe.test.d.ts.map +1 -0
- package/dist/__tests__/circuit-breaker-probe.test.js +124 -0
- package/dist/__tests__/circuit-breaker-probe.test.js.map +1 -0
- package/dist/__tests__/circuit-breaker-recover.test.d.ts +2 -0
- package/dist/__tests__/circuit-breaker-recover.test.d.ts.map +1 -0
- package/dist/__tests__/circuit-breaker-recover.test.js +52 -0
- package/dist/__tests__/circuit-breaker-recover.test.js.map +1 -0
- package/dist/__tests__/circuit-breaker-sweep.test.d.ts +2 -0
- package/dist/__tests__/circuit-breaker-sweep.test.d.ts.map +1 -0
- package/dist/__tests__/circuit-breaker-sweep.test.js +118 -0
- package/dist/__tests__/circuit-breaker-sweep.test.js.map +1 -0
- package/dist/__tests__/db-migrations.test.js +7 -3
- package/dist/__tests__/db-migrations.test.js.map +1 -1
- package/dist/__tests__/decision-artifact-schema.test.d.ts +2 -0
- package/dist/__tests__/decision-artifact-schema.test.d.ts.map +1 -0
- package/dist/__tests__/decision-artifact-schema.test.js +45 -0
- package/dist/__tests__/decision-artifact-schema.test.js.map +1 -0
- package/dist/__tests__/decisions-parser.test.d.ts +2 -0
- package/dist/__tests__/decisions-parser.test.d.ts.map +1 -0
- package/dist/__tests__/decisions-parser.test.js +59 -0
- package/dist/__tests__/decisions-parser.test.js.map +1 -0
- package/dist/__tests__/decisions-store.test.d.ts +2 -0
- package/dist/__tests__/decisions-store.test.d.ts.map +1 -0
- package/dist/__tests__/decisions-store.test.js +68 -0
- package/dist/__tests__/decisions-store.test.js.map +1 -0
- package/dist/__tests__/decisions-table-migration.test.d.ts +2 -0
- package/dist/__tests__/decisions-table-migration.test.d.ts.map +1 -0
- package/dist/__tests__/decisions-table-migration.test.js +56 -0
- package/dist/__tests__/decisions-table-migration.test.js.map +1 -0
- package/dist/__tests__/execute-stage-session-opts.test.js +2 -1
- package/dist/__tests__/execute-stage-session-opts.test.js.map +1 -1
- package/dist/__tests__/executor-issue-id.test.js +2 -1
- package/dist/__tests__/executor-issue-id.test.js.map +1 -1
- package/dist/__tests__/extract-handoff-decisions.test.d.ts +2 -0
- package/dist/__tests__/extract-handoff-decisions.test.d.ts.map +1 -0
- package/dist/__tests__/extract-handoff-decisions.test.js +26 -0
- package/dist/__tests__/extract-handoff-decisions.test.js.map +1 -0
- package/dist/__tests__/force-push-agent-branches.test.js +38 -15
- package/dist/__tests__/force-push-agent-branches.test.js.map +1 -1
- package/dist/__tests__/github-webhook.test.js +117 -0
- package/dist/__tests__/github-webhook.test.js.map +1 -1
- package/dist/__tests__/implement-template-decisions.test.d.ts +2 -0
- package/dist/__tests__/implement-template-decisions.test.d.ts.map +1 -0
- package/dist/__tests__/implement-template-decisions.test.js +41 -0
- package/dist/__tests__/implement-template-decisions.test.js.map +1 -0
- package/dist/__tests__/migrator.test.js +137 -39
- package/dist/__tests__/migrator.test.js.map +1 -1
- package/dist/__tests__/pipeline-runner.test.js +118 -0
- package/dist/__tests__/pipeline-runner.test.js.map +1 -1
- package/dist/__tests__/pm-audit-retention-step.test.js +3 -0
- package/dist/__tests__/pm-audit-retention-step.test.js.map +1 -1
- package/dist/__tests__/pm-budget-alerts.test.d.ts +14 -0
- package/dist/__tests__/pm-budget-alerts.test.d.ts.map +1 -1
- package/dist/__tests__/pm-budget-alerts.test.js +90 -18
- package/dist/__tests__/pm-budget-alerts.test.js.map +1 -1
- package/dist/__tests__/pm-budget-refused-event.test.js +2 -0
- package/dist/__tests__/pm-budget-refused-event.test.js.map +1 -1
- package/dist/__tests__/pm-budget-utc-boundary.test.d.ts +2 -0
- package/dist/__tests__/pm-budget-utc-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/pm-budget-utc-boundary.test.js +128 -0
- package/dist/__tests__/pm-budget-utc-boundary.test.js.map +1 -0
- package/dist/__tests__/pm-conflict.test.js +145 -5
- package/dist/__tests__/pm-conflict.test.js.map +1 -1
- package/dist/__tests__/pm-cost-rollup-step.test.js +2 -0
- package/dist/__tests__/pm-cost-rollup-step.test.js.map +1 -1
- package/dist/__tests__/pm-promote.test.js +111 -0
- package/dist/__tests__/pm-promote.test.js.map +1 -1
- package/dist/__tests__/pm-scheduler.test.js +1 -0
- package/dist/__tests__/pm-scheduler.test.js.map +1 -1
- package/dist/__tests__/pm-sso-prune-step.test.js +2 -0
- package/dist/__tests__/pm-sso-prune-step.test.js.map +1 -1
- package/dist/__tests__/preflight-claude-auth.test.js +3 -2
- package/dist/__tests__/preflight-claude-auth.test.js.map +1 -1
- package/dist/__tests__/ralph-review-fix-regression.test.js +1 -0
- package/dist/__tests__/ralph-review-fix-regression.test.js.map +1 -1
- package/dist/__tests__/ralph.test.js +1 -0
- package/dist/__tests__/ralph.test.js.map +1 -1
- package/dist/__tests__/release-manager-qarun-query.test.d.ts +2 -0
- package/dist/__tests__/release-manager-qarun-query.test.d.ts.map +1 -0
- package/dist/__tests__/release-manager-qarun-query.test.js +233 -0
- package/dist/__tests__/release-manager-qarun-query.test.js.map +1 -0
- package/dist/__tests__/release-manager-scheduler.test.js +62 -0
- package/dist/__tests__/release-manager-scheduler.test.js.map +1 -1
- package/dist/__tests__/release-manager-slack-handler.test.js +66 -0
- package/dist/__tests__/release-manager-slack-handler.test.js.map +1 -1
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.js +1 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.js.map +1 -1
- package/dist/__tests__/reproduce-bec62.test.js +1 -0
- package/dist/__tests__/reproduce-bec62.test.js.map +1 -1
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js +2 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js.map +1 -1
- package/dist/__tests__/resolve-claude-auth.test.js +10 -8
- package/dist/__tests__/resolve-claude-auth.test.js.map +1 -1
- package/dist/__tests__/session-lazy-creation.test.js +2 -1
- package/dist/__tests__/session-lazy-creation.test.js.map +1 -1
- package/dist/__tests__/session-resolver.test.d.ts +13 -0
- package/dist/__tests__/session-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/session-resolver.test.js +152 -0
- package/dist/__tests__/session-resolver.test.js.map +1 -0
- package/dist/__tests__/session-resume-fallback.test.js +2 -1
- package/dist/__tests__/session-resume-fallback.test.js.map +1 -1
- package/dist/__tests__/stage-models.test.js +3 -2
- package/dist/__tests__/stage-models.test.js.map +1 -1
- package/dist/__tests__/start-todo.test.js +29 -0
- package/dist/__tests__/start-todo.test.js.map +1 -1
- package/dist/__tests__/surgical-review-fix-prompt.test.d.ts +2 -0
- package/dist/__tests__/surgical-review-fix-prompt.test.d.ts.map +1 -0
- package/dist/__tests__/surgical-review-fix-prompt.test.js +71 -0
- package/dist/__tests__/surgical-review-fix-prompt.test.js.map +1 -0
- package/dist/__tests__/surgical-review-fix-runner.test.d.ts +2 -0
- package/dist/__tests__/surgical-review-fix-runner.test.d.ts.map +1 -0
- package/dist/__tests__/surgical-review-fix-runner.test.js +171 -0
- package/dist/__tests__/surgical-review-fix-runner.test.js.map +1 -0
- package/dist/__tests__/triage-preserve-acs.test.d.ts +2 -0
- package/dist/__tests__/triage-preserve-acs.test.d.ts.map +1 -0
- package/dist/__tests__/triage-preserve-acs.test.js +240 -0
- package/dist/__tests__/triage-preserve-acs.test.js.map +1 -0
- package/dist/__tests__/validate-run-mode.test.js +1 -0
- package/dist/__tests__/validate-run-mode.test.js.map +1 -1
- package/dist/__tests__/validate.test.js +1 -0
- package/dist/__tests__/validate.test.js.map +1 -1
- package/dist/audit/auth-error-messages.d.ts +6 -0
- package/dist/audit/auth-error-messages.d.ts.map +1 -0
- package/dist/audit/auth-error-messages.js +18 -0
- package/dist/audit/auth-error-messages.js.map +1 -0
- package/dist/audit/events.d.ts +51 -4
- package/dist/audit/events.d.ts.map +1 -1
- package/dist/audit/events.js +78 -5
- package/dist/audit/events.js.map +1 -1
- package/dist/audit/index.d.ts +1 -0
- package/dist/audit/index.d.ts.map +1 -1
- package/dist/audit/index.js +1 -0
- package/dist/audit/index.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +20 -0
- package/dist/db/client.js.map +1 -1
- package/dist/db/decisions-store.d.ts +25 -0
- package/dist/db/decisions-store.d.ts.map +1 -0
- package/dist/db/decisions-store.js +56 -0
- package/dist/db/decisions-store.js.map +1 -0
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +2 -2
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations/postgres/008_sso.sql +9 -20
- package/dist/db/migrations/postgres/009_review_model_runs.sql +9 -18
- package/dist/db/migrations/postgres/009_sso.sql +20 -0
- package/dist/db/migrations/postgres/010_release_manager.sql +9 -38
- package/dist/db/migrations/postgres/010_review_model_runs.sql +18 -0
- package/dist/db/migrations/postgres/011_qa_run_columns.sql +9 -8
- package/dist/db/migrations/postgres/011_release_manager.sql +38 -0
- package/dist/db/migrations/postgres/012_qa_gap_issues.sql +9 -18
- package/dist/db/migrations/postgres/012_qa_run_columns.sql +8 -0
- package/dist/db/migrations/postgres/013_qa_gap_issues.sql +18 -0
- package/dist/db/migrations/postgres/013_stage_runs_cache_tokens.sql +11 -6
- package/dist/db/migrations/postgres/014_missing_indexes.sql +9 -28
- package/dist/db/migrations/postgres/014_stage_runs_cache_tokens.sql +6 -0
- package/dist/db/migrations/postgres/015_missing_indexes.sql +28 -0
- package/dist/db/migrations/postgres/015_triage_results.sql +9 -11
- package/dist/db/migrations/postgres/016_triage_results.sql +11 -0
- package/dist/db/migrations/sqlite/007_sso.sql +9 -20
- package/dist/db/migrations/sqlite/008_review_model_runs.sql +9 -18
- package/dist/db/migrations/sqlite/008_sso.sql +20 -0
- package/dist/db/migrations/sqlite/009_release_manager.sql +9 -43
- package/dist/db/migrations/sqlite/009_review_model_runs.sql +18 -0
- package/dist/db/migrations/sqlite/010_qa_run_columns.sql +9 -9
- package/dist/db/migrations/sqlite/010_release_manager.sql +43 -0
- package/dist/db/migrations/sqlite/011_qa_gap_issues.sql +9 -22
- package/dist/db/migrations/sqlite/011_qa_run_columns.sql +9 -0
- package/dist/db/migrations/sqlite/012_qa_gap_issues.sql +22 -0
- package/dist/db/migrations/sqlite/012_stage_runs_cache_tokens.sql +11 -6
- package/dist/db/migrations/sqlite/013_missing_indexes.sql +10 -28
- package/dist/db/migrations/sqlite/013_stage_runs_cache_tokens.sql +6 -0
- package/dist/db/migrations/sqlite/013_triage_results.sql +10 -11
- package/dist/db/migrations/sqlite/014_missing_indexes.sql +28 -0
- package/dist/db/migrations/sqlite/015_triage_results.sql +11 -0
- package/dist/db/migrator.d.ts +45 -2
- package/dist/db/migrator.d.ts.map +1 -1
- package/dist/db/migrator.js +113 -29
- package/dist/db/migrator.js.map +1 -1
- package/dist/db/schema.d.ts +213 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +28 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/executor/auth-check.d.ts +30 -7
- package/dist/executor/auth-check.d.ts.map +1 -1
- package/dist/executor/auth-check.js +66 -16
- package/dist/executor/auth-check.js.map +1 -1
- package/dist/executor/auth-monitor.d.ts.map +1 -1
- package/dist/executor/auth-monitor.js +48 -39
- package/dist/executor/auth-monitor.js.map +1 -1
- package/dist/executor/deep-review.d.ts.map +1 -1
- package/dist/executor/deep-review.js +14 -79
- package/dist/executor/deep-review.js.map +1 -1
- package/dist/executor/executor.d.ts +21 -0
- package/dist/executor/executor.d.ts.map +1 -1
- package/dist/executor/executor.js +42 -91
- package/dist/executor/executor.js.map +1 -1
- package/dist/executor/extract-handoff.d.ts +9 -0
- package/dist/executor/extract-handoff.d.ts.map +1 -1
- package/dist/executor/extract-handoff.js +48 -0
- package/dist/executor/extract-handoff.js.map +1 -1
- package/dist/executor/handoff.d.ts +10 -1
- package/dist/executor/handoff.d.ts.map +1 -1
- package/dist/executor/handoff.js +7 -1
- package/dist/executor/handoff.js.map +1 -1
- package/dist/executor/index.d.ts +1 -0
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +1 -0
- package/dist/executor/index.js.map +1 -1
- package/dist/executor/prompt/templates.d.ts +12 -1
- package/dist/executor/prompt/templates.d.ts.map +1 -1
- package/dist/executor/prompt/templates.js +64 -0
- package/dist/executor/prompt/templates.js.map +1 -1
- package/dist/executor/session-resolver.d.ts +51 -0
- package/dist/executor/session-resolver.d.ts.map +1 -0
- package/dist/executor/session-resolver.js +83 -0
- package/dist/executor/session-resolver.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/notifier/composite.js +1 -1
- package/dist/notifier/composite.js.map +1 -1
- package/dist/notifier/linear.d.ts +1 -1
- package/dist/notifier/linear.d.ts.map +1 -1
- package/dist/notifier/linear.js +49 -9
- package/dist/notifier/linear.js.map +1 -1
- package/dist/pipeline/run-surgical-review-fix.d.ts +29 -0
- package/dist/pipeline/run-surgical-review-fix.d.ts.map +1 -0
- package/dist/pipeline/run-surgical-review-fix.js +48 -0
- package/dist/pipeline/run-surgical-review-fix.js.map +1 -0
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +132 -36
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pm/actions/circuit-breaker-config.d.ts +13 -0
- package/dist/pm/actions/circuit-breaker-config.d.ts.map +1 -0
- package/dist/pm/actions/circuit-breaker-config.js +23 -0
- package/dist/pm/actions/circuit-breaker-config.js.map +1 -0
- package/dist/pm/actions/db-queries.d.ts +18 -0
- package/dist/pm/actions/db-queries.d.ts.map +1 -1
- package/dist/pm/actions/db-queries.js +75 -2
- package/dist/pm/actions/db-queries.js.map +1 -1
- package/dist/pm/actions/promote.d.ts +7 -0
- package/dist/pm/actions/promote.d.ts.map +1 -1
- package/dist/pm/actions/promote.js +17 -1
- package/dist/pm/actions/promote.js.map +1 -1
- package/dist/pm/actions/recover-circuit-breaker.d.ts +21 -0
- package/dist/pm/actions/recover-circuit-breaker.d.ts.map +1 -0
- package/dist/pm/actions/recover-circuit-breaker.js +47 -0
- package/dist/pm/actions/recover-circuit-breaker.js.map +1 -0
- package/dist/pm/actions/select-probe-candidates.d.ts +21 -0
- package/dist/pm/actions/select-probe-candidates.d.ts.map +1 -0
- package/dist/pm/actions/select-probe-candidates.js +81 -0
- package/dist/pm/actions/select-probe-candidates.js.map +1 -0
- package/dist/pm/actions/start-todo.d.ts +7 -0
- package/dist/pm/actions/start-todo.d.ts.map +1 -1
- package/dist/pm/actions/start-todo.js +2 -1
- package/dist/pm/actions/start-todo.js.map +1 -1
- package/dist/pm/actions/sweep-recovered-circuit-breakers.d.ts +28 -0
- package/dist/pm/actions/sweep-recovered-circuit-breakers.d.ts.map +1 -0
- package/dist/pm/actions/sweep-recovered-circuit-breakers.js +47 -0
- package/dist/pm/actions/sweep-recovered-circuit-breakers.js.map +1 -0
- package/dist/pm/actions/triage-prompt.d.ts +14 -0
- package/dist/pm/actions/triage-prompt.d.ts.map +1 -1
- package/dist/pm/actions/triage-prompt.js +52 -9
- package/dist/pm/actions/triage-prompt.js.map +1 -1
- package/dist/pm/actions/triage.d.ts.map +1 -1
- package/dist/pm/actions/triage.js +37 -24
- package/dist/pm/actions/triage.js.map +1 -1
- package/dist/pm/conflict.d.ts +2 -0
- package/dist/pm/conflict.d.ts.map +1 -1
- package/dist/pm/conflict.js +59 -9
- package/dist/pm/conflict.js.map +1 -1
- package/dist/pm/scheduler.d.ts +5 -0
- package/dist/pm/scheduler.d.ts.map +1 -1
- package/dist/pm/scheduler.js +91 -44
- package/dist/pm/scheduler.js.map +1 -1
- package/dist/pm/slack.d.ts +11 -0
- package/dist/pm/slack.d.ts.map +1 -1
- package/dist/pm/slack.js +48 -5
- package/dist/pm/slack.js.map +1 -1
- package/dist/release-manager/release-helpers.d.ts +19 -2
- package/dist/release-manager/release-helpers.d.ts.map +1 -1
- package/dist/release-manager/release-helpers.js +22 -3
- package/dist/release-manager/release-helpers.js.map +1 -1
- package/dist/release-manager/release-tick.d.ts.map +1 -1
- package/dist/release-manager/release-tick.js +20 -8
- package/dist/release-manager/release-tick.js.map +1 -1
- package/dist/release-manager/slack-handler.d.ts +6 -0
- package/dist/release-manager/slack-handler.d.ts.map +1 -1
- package/dist/release-manager/slack-handler.js +76 -1
- package/dist/release-manager/slack-handler.js.map +1 -1
- package/dist/release-manager/state.d.ts.map +1 -1
- package/dist/release-manager/state.js +25 -18
- package/dist/release-manager/state.js.map +1 -1
- package/dist/types.d.ts +238 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +67 -0
- package/dist/types.js.map +1 -1
- package/dist/webhook/github-handler.d.ts +2 -2
- package/dist/webhook/github-handler.d.ts.map +1 -1
- package/dist/webhook/github-handler.js +18 -6
- package/dist/webhook/github-handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ import { resolveIssueRelations } from "../../util/linear.js";
|
|
|
5
5
|
import { createLogger } from "../../logger.js";
|
|
6
6
|
import { logAuditEventUnchecked, pmTriageClassifiedEvent } from "../../audit/index.js";
|
|
7
7
|
import { upsertTriageResult } from "../triage-results-store.js";
|
|
8
|
-
import { buildTriageV1Prompt, buildTriageV2Prompt, isV2Disabled, } from "./triage-prompt.js";
|
|
8
|
+
import { buildTriageV1Prompt, buildTriageV2Prompt, isV2Disabled, parseHandWrittenACs, } from "./triage-prompt.js";
|
|
9
9
|
import { renderTriageComment, appendTriageSectionsToDescription, } from "./triage-render.js";
|
|
10
10
|
const log = createLogger({ component: "PmAgent:triage" });
|
|
11
11
|
const MAX_ISSUES_PER_TICK = 10;
|
|
@@ -27,9 +27,13 @@ const OBSERVER_BODY_MARKER = "<!-- urateam-qo-observer:";
|
|
|
27
27
|
* diagnostic. See CLAUDE.md "Quality Observer" for the rationale.
|
|
28
28
|
*/
|
|
29
29
|
const OBSERVER_PIPELINE_LABEL = "needs-design";
|
|
30
|
+
const BUG_LABEL = "bug";
|
|
30
31
|
function isObserverOriginIssue(description) {
|
|
31
32
|
return typeof description === "string" && description.includes(OBSERVER_BODY_MARKER);
|
|
32
33
|
}
|
|
34
|
+
function warnMissingPipelineLabel(issueId, label, context) {
|
|
35
|
+
log.warn({ issueId, label }, `${context}: '${label}' label not found in Linear — issue will move to Backlog without pipeline label and won't be routed by promote`);
|
|
36
|
+
}
|
|
33
37
|
/**
|
|
34
38
|
* Process an array of items in batches of `size`, awaiting each batch before
|
|
35
39
|
* starting the next. Returns a flat array of results (preserving order).
|
|
@@ -72,8 +76,7 @@ export async function triageNewIssues(input) {
|
|
|
72
76
|
.map((l) => labelMap.get(l.toLowerCase()))
|
|
73
77
|
.filter(Boolean);
|
|
74
78
|
if (labelIds.length === 0) {
|
|
75
|
-
|
|
76
|
-
"' label not found in Linear — issue will move to Backlog without pipeline label and won't be routed by promote");
|
|
79
|
+
warnMissingPipelineLabel(issue.identifier, OBSERVER_PIPELINE_LABEL, "observer-origin gate");
|
|
77
80
|
}
|
|
78
81
|
const rationale = "Observer-origin finding (body marker detected) — routed to needs-design so the await-approval stage gates a human before any implement-stage work runs.";
|
|
79
82
|
const updatePayload = { priority: 3 };
|
|
@@ -81,13 +84,13 @@ export async function triageNewIssues(input) {
|
|
|
81
84
|
updatePayload.labelIds = labelIds;
|
|
82
85
|
if (backlogStateId)
|
|
83
86
|
updatePayload.stateId = backlogStateId;
|
|
84
|
-
await
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
await Promise.all([
|
|
88
|
+
linearClient.updateIssue(issue.id, updatePayload),
|
|
89
|
+
linearClient.createComment({
|
|
90
|
+
issueId: issue.id,
|
|
91
|
+
body: `🤖 **PM Agent — Triaged (Quality Observer finding)**\n\n**Pipeline:** ${OBSERVER_PIPELINE_LABEL}\n**Rationale:** ${rationale}`,
|
|
92
|
+
}),
|
|
93
|
+
]);
|
|
91
94
|
const result = {
|
|
92
95
|
issueId: issue.identifier,
|
|
93
96
|
priority: 3,
|
|
@@ -106,6 +109,13 @@ export async function triageNewIssues(input) {
|
|
|
106
109
|
log.info({ issueId: issue.identifier, pipelineLabel: OBSERVER_PIPELINE_LABEL }, "triaged observer-origin issue (skipped Claude classification)");
|
|
107
110
|
return result;
|
|
108
111
|
}
|
|
112
|
+
// Pre-parse hand-written ACs from the issue description. When the
|
|
113
|
+
// operator has already written a `**Acceptance Criteria:**` section,
|
|
114
|
+
// we use those items verbatim so the triage result stays in sync with
|
|
115
|
+
// the description text that the implement-stage prompt also sees.
|
|
116
|
+
// When no pre-written ACs are found, fall back to Haiku generation.
|
|
117
|
+
const preSuppliedACs = parseHandWrittenACs(issue.description);
|
|
118
|
+
const hasPreSuppliedACs = preSuppliedACs.length > 0;
|
|
109
119
|
// Tier 6a — pick v2 prompt by default; fall back to v1 when the
|
|
110
120
|
// operator has set URATEAM_DISABLE_TRIAGE_V2=true. Reads env at
|
|
111
121
|
// call time so flipping the var takes effect on the next PM tick
|
|
@@ -115,6 +125,7 @@ export async function triageNewIssues(input) {
|
|
|
115
125
|
identifier: issue.identifier,
|
|
116
126
|
title: issue.title,
|
|
117
127
|
description: issue.description ?? "",
|
|
128
|
+
hasPreSuppliedACs,
|
|
118
129
|
};
|
|
119
130
|
const prompt = useV2
|
|
120
131
|
? buildTriageV2Prompt(promptInput, sanitize)
|
|
@@ -158,9 +169,9 @@ export async function triageNewIssues(input) {
|
|
|
158
169
|
// bug-severity gate). Treat the model's `pipelineLabel` as
|
|
159
170
|
// telemetry only.
|
|
160
171
|
const forceNeedsDesign = openQuestions.length > 0;
|
|
161
|
-
const hasBug = labels.some((l) => l.toLowerCase() ===
|
|
172
|
+
const hasBug = labels.some((l) => l.toLowerCase() === BUG_LABEL);
|
|
162
173
|
const pipelineLabel = forceNeedsDesign
|
|
163
|
-
? OBSERVER_PIPELINE_LABEL //
|
|
174
|
+
? OBSERVER_PIPELINE_LABEL // same routing as observer-origin gate
|
|
164
175
|
: hasBug
|
|
165
176
|
? "bug"
|
|
166
177
|
: complexity === "trivial"
|
|
@@ -175,8 +186,7 @@ export async function triageNewIssues(input) {
|
|
|
175
186
|
// routing label is dropped silently. Surface this so operators can
|
|
176
187
|
// diagnose why a ticket isn't being picked up by promote.
|
|
177
188
|
if (!labelMap.get(OBSERVER_PIPELINE_LABEL.toLowerCase())) {
|
|
178
|
-
|
|
179
|
-
"' label not found in Linear — issue will move to Backlog without pipeline label and won't be routed by promote");
|
|
189
|
+
warnMissingPipelineLabel(issue.identifier, OBSERVER_PIPELINE_LABEL, "Tier 4 routing");
|
|
180
190
|
}
|
|
181
191
|
}
|
|
182
192
|
const labelIds = issueLabels
|
|
@@ -187,9 +197,13 @@ export async function triageNewIssues(input) {
|
|
|
187
197
|
const { team } = await resolveIssueRelations(issue);
|
|
188
198
|
const teamId = team?.id;
|
|
189
199
|
const backlogStateId = teamId ? stateMap.get(`${teamId}:Backlog`) : undefined;
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
200
|
+
// Use pre-supplied ACs when the operator wrote them in the description;
|
|
201
|
+
// fall back to Haiku's generated list for fresh (no-AC) tickets.
|
|
202
|
+
const acceptanceCriteria = hasPreSuppliedACs
|
|
203
|
+
? preSuppliedACs
|
|
204
|
+
: Array.isArray(parsed.acceptanceCriteria)
|
|
205
|
+
? parsed.acceptanceCriteria.filter((c) => typeof c === "string" && c.length > 0)
|
|
206
|
+
: [];
|
|
193
207
|
// Tier 6b — extract optional v2 fields when v2 is active. When v1
|
|
194
208
|
// is forced (env var), skip the extraction so the result shape
|
|
195
209
|
// stays bit-compatible with v1.
|
|
@@ -221,14 +235,13 @@ export async function triageNewIssues(input) {
|
|
|
221
235
|
if (updatedDesc !== existingDesc) {
|
|
222
236
|
updatePayload.description = updatedDesc;
|
|
223
237
|
}
|
|
224
|
-
await
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
forceNeedsDesign,
|
|
229
|
-
pipelineLabel,
|
|
238
|
+
await Promise.all([
|
|
239
|
+
linearClient.updateIssue(issue.id, updatePayload),
|
|
240
|
+
linearClient.createComment({
|
|
241
|
+
issueId: issue.id,
|
|
242
|
+
body: renderTriageComment(result, { forceNeedsDesign, pipelineLabel }),
|
|
230
243
|
}),
|
|
231
|
-
|
|
244
|
+
]);
|
|
232
245
|
if (input.db) {
|
|
233
246
|
void logAuditEventUnchecked(input.db, pmTriageClassifiedEvent({
|
|
234
247
|
issueId: issue.identifier,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"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"}
|
package/dist/pm/conflict.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import type { ConflictCheckResult } from "./types.js";
|
|
|
2
2
|
export interface ActiveRun {
|
|
3
3
|
issueId: string;
|
|
4
4
|
branch: string;
|
|
5
|
+
/** Local worktree path for this run. Used as fallback when the branch has not yet been pushed to origin. */
|
|
6
|
+
worktreePath?: string;
|
|
5
7
|
}
|
|
6
8
|
export interface GetActiveFileMapsInput {
|
|
7
9
|
activeRuns: ActiveRun[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAUtD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,4GAA4G;IAC5G,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CA4CnC;AAwCD,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAqC9B"}
|
package/dist/pm/conflict.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { parseJsonObject } from "../executor/agent-stream.js";
|
|
2
2
|
import { createLogger } from "../logger.js";
|
|
3
3
|
const log = createLogger({ component: "PmAgent:conflict" });
|
|
4
|
+
function parseGitLines(output) {
|
|
5
|
+
return output.split("\n").map((f) => f.trim()).filter(Boolean);
|
|
6
|
+
}
|
|
4
7
|
export async function getActiveFileMaps(input) {
|
|
5
8
|
const { activeRuns, defaultBranch, repoDir, execGit } = input;
|
|
6
9
|
const fileMaps = new Map();
|
|
@@ -13,21 +16,68 @@ export async function getActiveFileMaps(input) {
|
|
|
13
16
|
log.warn("git fetch failed, proceeding with local refs");
|
|
14
17
|
}
|
|
15
18
|
for (const run of activeRuns) {
|
|
19
|
+
// Deterministically check whether the branch exists on origin before diffing.
|
|
20
|
+
// This avoids conflating "branch not yet pushed" with genuine git failures.
|
|
21
|
+
let branchOnOrigin = false;
|
|
16
22
|
try {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
await execGit(["rev-parse", "--verify", "--quiet", `origin/${run.branch}`], repoDir);
|
|
24
|
+
branchOnOrigin = true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Branch not on origin yet — expected for in-flight runs that haven't pushed.
|
|
28
|
+
}
|
|
29
|
+
if (branchOnOrigin) {
|
|
30
|
+
// Branch already pushed — use the standard origin-diff path.
|
|
31
|
+
try {
|
|
32
|
+
const output = await execGit(["diff", "--name-only", `origin/${defaultBranch}..origin/${run.branch}`], repoDir);
|
|
33
|
+
fileMaps.set(run.issueId, new Set(parseGitLines(output)));
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
log.warn({ issueId: run.issueId, branch: run.branch, err }, "git diff failed, treating as empty");
|
|
37
|
+
fileMaps.set(run.issueId, new Set());
|
|
38
|
+
}
|
|
23
39
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
40
|
+
else {
|
|
41
|
+
// Branch not yet on origin — read in-progress files from the local worktree.
|
|
42
|
+
// This is the normal state for runs that are still executing stages.
|
|
43
|
+
log.debug({ issueId: run.issueId, branch: run.branch }, "branch not yet on origin, reading worktree for conflict detection");
|
|
44
|
+
fileMaps.set(run.issueId, await getWorktreeFiles(run, defaultBranch, execGit));
|
|
27
45
|
}
|
|
28
46
|
}
|
|
29
47
|
return fileMaps;
|
|
30
48
|
}
|
|
49
|
+
async function getWorktreeFiles(run, defaultBranch, execGit) {
|
|
50
|
+
if (!run.worktreePath)
|
|
51
|
+
return new Set();
|
|
52
|
+
const files = new Set();
|
|
53
|
+
// Run both git operations in parallel — they are independent reads.
|
|
54
|
+
const [diffResult, statusResult] = await Promise.allSettled([
|
|
55
|
+
execGit(["diff", "--name-only", `origin/${defaultBranch}...HEAD`], run.worktreePath),
|
|
56
|
+
execGit(["status", "--porcelain"], run.worktreePath),
|
|
57
|
+
]);
|
|
58
|
+
if (diffResult.status === "fulfilled") {
|
|
59
|
+
for (const f of parseGitLines(diffResult.value)) {
|
|
60
|
+
files.add(f);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
log.warn({ issueId: run.issueId, worktreePath: run.worktreePath, err: diffResult.reason }, "worktree diff failed, skipping committed files");
|
|
65
|
+
}
|
|
66
|
+
if (statusResult.status === "fulfilled") {
|
|
67
|
+
for (const line of statusResult.value.split("\n")) {
|
|
68
|
+
if (line.length < 4)
|
|
69
|
+
continue;
|
|
70
|
+
const path = line.slice(3).trim();
|
|
71
|
+
// Renamed files appear as "old -> new"; take the destination name.
|
|
72
|
+
const parts = path.split(" -> ");
|
|
73
|
+
files.add(parts[parts.length - 1]);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
log.warn({ issueId: run.issueId, worktreePath: run.worktreePath, err: statusResult.reason }, "worktree status failed, skipping uncommitted files");
|
|
78
|
+
}
|
|
79
|
+
return files;
|
|
80
|
+
}
|
|
31
81
|
export async function predictConflict(input) {
|
|
32
82
|
const { candidateDescription, activeFileMaps, callClaude, sanitize } = input;
|
|
33
83
|
const allActiveFiles = [];
|
package/dist/pm/conflict.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"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"}
|
package/dist/pm/scheduler.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { type StuckIssueResult } from "./actions/recover-stuck.js";
|
|
|
10
10
|
import { type StartTodoInput, type StartTodoResult } from "./actions/start-todo.js";
|
|
11
11
|
import { getActiveFileMaps, predictConflict } from "./conflict.js";
|
|
12
12
|
import type { Db, AnyDb } from "../db/client.js";
|
|
13
|
+
import { type AuthMonitor } from "../executor/auth-monitor.js";
|
|
13
14
|
/**
|
|
14
15
|
* BEC-184 / BEC-227: parse the PM_AGENT_STUCK_RUN_AGE_MIN env var (default 120 min).
|
|
15
16
|
* Controls how long a 'running' run must be active before it's treated as a
|
|
@@ -31,6 +32,8 @@ export interface PmSchedulerDeps {
|
|
|
31
32
|
slackBotToken: string;
|
|
32
33
|
repoCloneDir?: string;
|
|
33
34
|
defaultBranch?: string;
|
|
35
|
+
/** Base directory where per-run worktrees are created. Defaults to $HOME/data/runs (matching runner default). */
|
|
36
|
+
agentRunDir?: string;
|
|
34
37
|
runner?: {
|
|
35
38
|
resume: (issueId: string) => Promise<void>;
|
|
36
39
|
start: (issue: any, pipelineKey: string, pipelineConfig: any, repoConfig: any, sanitizedIssue: any) => Promise<void>;
|
|
@@ -38,6 +41,8 @@ export interface PmSchedulerDeps {
|
|
|
38
41
|
pipelineConfigs?: Record<string, any>;
|
|
39
42
|
repoConfigs?: Record<string, any>;
|
|
40
43
|
actions?: Partial<PmSchedulerActions>;
|
|
44
|
+
/** Injectable auth monitor — defaults to the real createAuthMonitor. Used by tests to avoid slow real API calls. */
|
|
45
|
+
authMonitor?: AuthMonitor;
|
|
41
46
|
}
|
|
42
47
|
interface PmSchedulerActions {
|
|
43
48
|
evaluateBudget: (input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/pm/scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9E,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAoB,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC3H,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACjG,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/pm/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/pm/scheduler.js
CHANGED
|
@@ -11,6 +11,9 @@ import { resolveApprovals } from "./actions/resolve-approvals.js";
|
|
|
11
11
|
import { recoverRetriableRuns } from "./actions/recover.js";
|
|
12
12
|
import { recoverStuckInProgressIssues } from "./actions/recover-stuck.js";
|
|
13
13
|
import { startTodoIssues } from "./actions/start-todo.js";
|
|
14
|
+
import { getCircuitBreakerProbeConfig } from "./actions/circuit-breaker-config.js";
|
|
15
|
+
import { selectProbeCandidates } from "./actions/select-probe-candidates.js";
|
|
16
|
+
import { sweepRecoveredCircuitBreakers } from "./actions/sweep-recovered-circuit-breakers.js";
|
|
14
17
|
import { getActiveFileMaps, predictConflict } from "./conflict.js";
|
|
15
18
|
import { fetchCircuitBrokenIssues, ACTIVE_STATUSES } from "./actions/db-queries.js";
|
|
16
19
|
import { PmSlackNotifier } from "./slack.js";
|
|
@@ -28,6 +31,10 @@ import { pruneExpiredSessions } from "../auth/index.js";
|
|
|
28
31
|
import { recomputeCostRollups } from "../cost/index.js";
|
|
29
32
|
import { createAuthMonitor } from "../executor/auth-monitor.js";
|
|
30
33
|
const log = createLogger({ component: "PmAgent:scheduler" });
|
|
34
|
+
function captureTickError(tick, key, err, msg) {
|
|
35
|
+
log.error({ err }, msg);
|
|
36
|
+
tick.errors.push(`${key}: ${err.message}`);
|
|
37
|
+
}
|
|
31
38
|
/**
|
|
32
39
|
* BEC-184 / BEC-227: parse the PM_AGENT_STUCK_RUN_AGE_MIN env var (default 120 min).
|
|
33
40
|
* Controls how long a 'running' run must be active before it's treated as a
|
|
@@ -53,7 +60,7 @@ export function createPmScheduler(deps) {
|
|
|
53
60
|
// BEC-207: AuthMonitor — periodic Claude session health-check (every 6h).
|
|
54
61
|
// Alerts to the PM agent's Slack channel when SLACK_ERROR_ALERTS=true.
|
|
55
62
|
// No-ops when CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY is set.
|
|
56
|
-
const authMonitor = createAuthMonitor({
|
|
63
|
+
const authMonitor = deps.authMonitor ?? createAuthMonitor({
|
|
57
64
|
slackBotToken: deps.slackBotToken || undefined,
|
|
58
65
|
slackErrorChannel: process.env.SLACK_ERROR_ALERTS === "true"
|
|
59
66
|
? deps.config.slackChannelId
|
|
@@ -69,6 +76,12 @@ export function createPmScheduler(deps) {
|
|
|
69
76
|
}
|
|
70
77
|
return slackNotifier;
|
|
71
78
|
}
|
|
79
|
+
// BEC-238: fire the reactions:read scope probe once at scheduler creation.
|
|
80
|
+
// Non-blocking — failure is caught inside probeReactionsScope and logged warn.
|
|
81
|
+
// Guard on slackBotToken so tests that pass an empty string skip the probe.
|
|
82
|
+
if (deps.slackBotToken && deps.config.slackChannelId) {
|
|
83
|
+
void getSlackNotifier().probeReactionsScope();
|
|
84
|
+
}
|
|
72
85
|
async function tryAcquireLock() {
|
|
73
86
|
if (!isPostgres(deps.db))
|
|
74
87
|
return true;
|
|
@@ -118,8 +131,7 @@ export function createPmScheduler(deps) {
|
|
|
118
131
|
: await evaluateBudget({ db, config });
|
|
119
132
|
}
|
|
120
133
|
catch (err) {
|
|
121
|
-
|
|
122
|
-
tick.errors.push(`budget: ${err.message}`);
|
|
134
|
+
captureTickError(tick, "budget", err, "budget evaluation failed");
|
|
123
135
|
evaluation = {
|
|
124
136
|
scopes: [],
|
|
125
137
|
worstTier: "ok",
|
|
@@ -216,8 +228,7 @@ export function createPmScheduler(deps) {
|
|
|
216
228
|
}
|
|
217
229
|
}
|
|
218
230
|
catch (err) {
|
|
219
|
-
|
|
220
|
-
tick.errors.push(`recover: ${err.message}`);
|
|
231
|
+
captureTickError(tick, "recover", err, "recovery sweep failed");
|
|
221
232
|
}
|
|
222
233
|
// Fetch workflow states once per tick to avoid redundant Linear API round-trips
|
|
223
234
|
let stateMap = new Map();
|
|
@@ -226,8 +237,7 @@ export function createPmScheduler(deps) {
|
|
|
226
237
|
stateMap = await resolveWorkflowStates(await getLinearClient(), config.teamIds);
|
|
227
238
|
}
|
|
228
239
|
catch (err) {
|
|
229
|
-
|
|
230
|
-
tick.errors.push(`resolveWorkflowStates: ${err.message}`);
|
|
240
|
+
captureTickError(tick, "resolveWorkflowStates", err, "resolveWorkflowStates failed");
|
|
231
241
|
}
|
|
232
242
|
}
|
|
233
243
|
// --- Stuck In Progress issue recovery sweep ---
|
|
@@ -252,12 +262,45 @@ export function createPmScheduler(deps) {
|
|
|
252
262
|
}
|
|
253
263
|
}
|
|
254
264
|
catch (err) {
|
|
255
|
-
|
|
256
|
-
tick.errors.push(`recoverStuck: ${err.message}`);
|
|
265
|
+
captureTickError(tick, "recoverStuck", err, "stuck issue recovery sweep failed");
|
|
257
266
|
}
|
|
258
267
|
}
|
|
259
268
|
// Compute available slots once for both startTodo and promote
|
|
260
269
|
const slotsAvailable = config.maxInFlight - (tick.budgetGuard.activeCount ?? 0);
|
|
270
|
+
// BEC-236 — half-open circuit-breaker probe. Picks at most `cap` issues
|
|
271
|
+
// per tick that the breaker would normally skip; promote + startTodo
|
|
272
|
+
// receive this Set as probeOverrideIds and bypass the skip for them.
|
|
273
|
+
const probeConfig = getCircuitBreakerProbeConfig();
|
|
274
|
+
const breakerThreshold = config.maxConsecutiveFailures > 0
|
|
275
|
+
? config.maxConsecutiveFailures
|
|
276
|
+
: 3;
|
|
277
|
+
let probeOverrideIds = new Set();
|
|
278
|
+
if (db && !probeConfig.disabled) {
|
|
279
|
+
try {
|
|
280
|
+
probeOverrideIds = await selectProbeCandidates(db, {
|
|
281
|
+
cap: probeConfig.maxProbesPerTick,
|
|
282
|
+
cooldownMs: probeConfig.cooldownMs,
|
|
283
|
+
maxConsecutiveFailures: breakerThreshold,
|
|
284
|
+
now: Date.now(),
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
captureTickError(tick, "probe", err, "selectProbeCandidates failed");
|
|
289
|
+
}
|
|
290
|
+
// BEC-236 — sweep recovered issues. The runner can't drive recovery
|
|
291
|
+
// itself (no `linearClient` in its scope), so each tick scans for
|
|
292
|
+
// state rows whose consecutive-failure count has dropped (= a
|
|
293
|
+
// `completed` run landed). Recovery deletes the state row and
|
|
294
|
+
// strips the Tier-5-added `needs-design` label.
|
|
295
|
+
try {
|
|
296
|
+
await sweepRecoveredCircuitBreakers(db, await getLinearClient(), {
|
|
297
|
+
maxConsecutiveFailures: breakerThreshold,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
captureTickError(tick, "sweepRecovered", err, "sweepRecoveredCircuitBreakers failed");
|
|
302
|
+
}
|
|
303
|
+
}
|
|
261
304
|
// --- Start pipelines for orphaned Todo issues ---
|
|
262
305
|
if (deps.runner?.start && deps.pipelineConfigs && deps.repoConfigs) {
|
|
263
306
|
try {
|
|
@@ -279,6 +322,7 @@ export function createPmScheduler(deps) {
|
|
|
279
322
|
// BEC-181: omit getFailureCount so startTodoIssues uses the batch
|
|
280
323
|
// batchCountConsecutiveFailures path (single DB round-trip for all
|
|
281
324
|
// candidates) instead of per-issue N+1 queries.
|
|
325
|
+
probeOverrideIds,
|
|
282
326
|
});
|
|
283
327
|
const started = todoResults.filter((r) => r.started);
|
|
284
328
|
if (started.length > 0) {
|
|
@@ -288,8 +332,7 @@ export function createPmScheduler(deps) {
|
|
|
288
332
|
}
|
|
289
333
|
}
|
|
290
334
|
catch (err) {
|
|
291
|
-
|
|
292
|
-
tick.errors.push(`startTodo: ${err.message}`);
|
|
335
|
+
captureTickError(tick, "startTodo", err, "startTodoIssues failed");
|
|
293
336
|
}
|
|
294
337
|
}
|
|
295
338
|
try {
|
|
@@ -306,8 +349,7 @@ export function createPmScheduler(deps) {
|
|
|
306
349
|
});
|
|
307
350
|
}
|
|
308
351
|
catch (err) {
|
|
309
|
-
|
|
310
|
-
tick.errors.push(`triage: ${err.message}`);
|
|
352
|
+
captureTickError(tick, "triage", err, "triage failed");
|
|
311
353
|
}
|
|
312
354
|
try {
|
|
313
355
|
const approvalResult = actions
|
|
@@ -323,8 +365,7 @@ export function createPmScheduler(deps) {
|
|
|
323
365
|
tick.approvalsPending = approvalResult.stillPending;
|
|
324
366
|
}
|
|
325
367
|
catch (err) {
|
|
326
|
-
|
|
327
|
-
tick.errors.push(`resolveApprovals: ${err.message}`);
|
|
368
|
+
captureTickError(tick, "resolveApprovals", err, "resolve approvals failed");
|
|
328
369
|
}
|
|
329
370
|
if (isPmPaused()) {
|
|
330
371
|
tick.paused = true;
|
|
@@ -336,31 +377,34 @@ export function createPmScheduler(deps) {
|
|
|
336
377
|
tick.promoted = await actions.promoteReadyIssues({});
|
|
337
378
|
}
|
|
338
379
|
else {
|
|
339
|
-
const
|
|
380
|
+
const agentRunDir = deps.agentRunDir ?? join(homedir(), "data", "runs");
|
|
340
381
|
const baseDir = deps.repoCloneDir ?? join(homedir(), "work", "repos");
|
|
341
382
|
const defaultBranch = deps.defaultBranch ?? "main";
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
const candidates = await Promise.all(entries.map(async (entry) => {
|
|
348
|
-
const candidate = `${baseDir}/${entry}`;
|
|
383
|
+
const { readdir, stat } = await import("node:fs/promises");
|
|
384
|
+
// Fetch active runs from DB and scan for the first cloned repo dir in parallel.
|
|
385
|
+
const [activeRuns, repoDir] = await Promise.all([
|
|
386
|
+
getActiveRunsFromDb(db, agentRunDir),
|
|
387
|
+
(async () => {
|
|
349
388
|
try {
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
389
|
+
const entries = await readdir(baseDir);
|
|
390
|
+
const candidates = await Promise.all(entries.map(async (entry) => {
|
|
391
|
+
const candidate = `${baseDir}/${entry}`;
|
|
392
|
+
try {
|
|
393
|
+
const s = await stat(`${candidate}/.git`);
|
|
394
|
+
if (s.isDirectory())
|
|
395
|
+
return candidate;
|
|
396
|
+
}
|
|
397
|
+
catch { /* not a git repo */ }
|
|
398
|
+
return null;
|
|
399
|
+
}));
|
|
400
|
+
return candidates.find((c) => c !== null) ?? baseDir;
|
|
353
401
|
}
|
|
354
|
-
catch {
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
}
|
|
361
|
-
catch {
|
|
362
|
-
log.warn("could not scan repoCloneDir for git repos");
|
|
363
|
-
}
|
|
402
|
+
catch {
|
|
403
|
+
log.warn("could not scan repoCloneDir for git repos");
|
|
404
|
+
return baseDir;
|
|
405
|
+
}
|
|
406
|
+
})(),
|
|
407
|
+
]);
|
|
364
408
|
const fileMaps = await getActiveFileMaps({
|
|
365
409
|
activeRuns,
|
|
366
410
|
defaultBranch,
|
|
@@ -385,12 +429,12 @@ export function createPmScheduler(deps) {
|
|
|
385
429
|
// BEC-181: omit getFailureCount so promoteReadyIssues uses the batch
|
|
386
430
|
// batchCountConsecutiveFailures path (single DB round-trip for all
|
|
387
431
|
// candidates) instead of per-issue N+1 queries.
|
|
432
|
+
probeOverrideIds,
|
|
388
433
|
});
|
|
389
434
|
}
|
|
390
435
|
}
|
|
391
436
|
catch (err) {
|
|
392
|
-
|
|
393
|
-
tick.errors.push(`promote: ${err.message}`);
|
|
437
|
+
captureTickError(tick, "promote", err, "promote failed");
|
|
394
438
|
}
|
|
395
439
|
}
|
|
396
440
|
if (!isPmPaused() && isFeatureLicensed("approval-workflows")) {
|
|
@@ -421,15 +465,13 @@ export function createPmScheduler(deps) {
|
|
|
421
465
|
tick.deprioritizeRequested = depResult.value;
|
|
422
466
|
}
|
|
423
467
|
else {
|
|
424
|
-
|
|
425
|
-
tick.errors.push(`deprioritize: ${depResult.reason.message}`);
|
|
468
|
+
captureTickError(tick, "deprioritize", depResult.reason, "deprioritize failed");
|
|
426
469
|
}
|
|
427
470
|
if (cancelResult.status === "fulfilled") {
|
|
428
471
|
tick.cancelRequested = cancelResult.value;
|
|
429
472
|
}
|
|
430
473
|
else {
|
|
431
|
-
|
|
432
|
-
tick.errors.push(`cancel: ${cancelResult.reason.message}`);
|
|
474
|
+
captureTickError(tick, "cancel", cancelResult.reason, "cancel failed");
|
|
433
475
|
}
|
|
434
476
|
}
|
|
435
477
|
// BEC-223: Populate circuit-broken issues for the digest before posting.
|
|
@@ -510,10 +552,11 @@ export function createPmScheduler(deps) {
|
|
|
510
552
|
},
|
|
511
553
|
};
|
|
512
554
|
}
|
|
513
|
-
async function getActiveRunsFromDb(db) {
|
|
555
|
+
async function getActiveRunsFromDb(db, agentRunDir) {
|
|
514
556
|
try {
|
|
515
557
|
const rows = await db
|
|
516
558
|
.select({
|
|
559
|
+
id: pipelineRuns.id,
|
|
517
560
|
issueId: pipelineRuns.issueId,
|
|
518
561
|
branch: pipelineRuns.branch,
|
|
519
562
|
})
|
|
@@ -521,7 +564,11 @@ async function getActiveRunsFromDb(db) {
|
|
|
521
564
|
.where(inArray(pipelineRuns.status, [...ACTIVE_STATUSES]));
|
|
522
565
|
return rows
|
|
523
566
|
.filter((r) => r.branch)
|
|
524
|
-
.map((r) => ({
|
|
567
|
+
.map((r) => ({
|
|
568
|
+
issueId: r.issueId,
|
|
569
|
+
branch: r.branch,
|
|
570
|
+
worktreePath: join(agentRunDir, r.id, "worktree"),
|
|
571
|
+
}));
|
|
525
572
|
}
|
|
526
573
|
catch {
|
|
527
574
|
return [];
|