@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
|
@@ -28,6 +28,13 @@ export interface PromoteInput {
|
|
|
28
28
|
* Leave undefined to disable the breaker (default behavior).
|
|
29
29
|
*/
|
|
30
30
|
maxConsecutiveFailures?: number;
|
|
31
|
+
/**
|
|
32
|
+
* BEC-236 — issue IDs the half-open probe selected this tick. Issues in
|
|
33
|
+
* this Set bypass the consecutive-failures circuit-breaker skip, allowing
|
|
34
|
+
* exactly one probe run per cooldown window. When undefined, breaker
|
|
35
|
+
* behavior is unchanged from BEC-161/181.
|
|
36
|
+
*/
|
|
37
|
+
probeOverrideIds?: Set<string>;
|
|
31
38
|
/**
|
|
32
39
|
* BEC-161/BEC-181: returns the number of consecutive failed runs for an
|
|
33
40
|
* issue. Tests inject a stub here (avoids real DB rows). Production omits
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/promote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/promote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAuBhD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrE,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,kFAAkF;IAClF,EAAE,CAAC,EAAE,KAAK,CAAC;IACX;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA2UtF"}
|
|
@@ -5,6 +5,7 @@ import { createLogger } from "../../logger.js";
|
|
|
5
5
|
import { truncateWithEllipsis } from "../../util/strings.js";
|
|
6
6
|
import { logAuditEventUnchecked, pmPromotedEvent, pmSkippedCircuitBreakerEvent, pmEscalatedToNeedsDesignEvent, } from "../../audit/index.js";
|
|
7
7
|
import { batchCountConsecutiveFailures, getLastFailureError, } from "./db-queries.js";
|
|
8
|
+
import { circuitBreakerState } from "../../db/schema.js";
|
|
8
9
|
/**
|
|
9
10
|
* Tier 5 — the pipeline label assigned to issues that have tripped the
|
|
10
11
|
* consecutive-failures circuit breaker. Mirrors the observer-marker gate
|
|
@@ -86,7 +87,8 @@ export async function promoteReadyIssues(input) {
|
|
|
86
87
|
const failureCount = input.getFailureCount
|
|
87
88
|
? await input.getFailureCount(candidate.identifier)
|
|
88
89
|
: (prefetchedFailureCounts.get(candidate.identifier) ?? 0);
|
|
89
|
-
if (failureCount >= input.maxConsecutiveFailures
|
|
90
|
+
if (failureCount >= input.maxConsecutiveFailures &&
|
|
91
|
+
!input.probeOverrideIds?.has(candidate.identifier)) {
|
|
90
92
|
log.warn({ issueId: candidate.identifier, failureCount, threshold: input.maxConsecutiveFailures }, "skipped promote: circuit-breaker engaged (too many consecutive failures)");
|
|
91
93
|
if (input.db) {
|
|
92
94
|
void logAuditEventUnchecked(input.db, pmSkippedCircuitBreakerEvent({
|
|
@@ -182,6 +184,20 @@ export async function promoteReadyIssues(input) {
|
|
|
182
184
|
log.warn({ issueId: candidate.identifier, err }, "Tier 5 escalation: Slack alert failed");
|
|
183
185
|
}
|
|
184
186
|
}
|
|
187
|
+
// BEC-236 — record the Tier-5 escalation so the half-open probe can
|
|
188
|
+
// distinguish our auto-added needs-design from a human's. Idempotent on
|
|
189
|
+
// issue_id PK so re-escalations of the same issue don't double-insert.
|
|
190
|
+
if (input.db) {
|
|
191
|
+
try {
|
|
192
|
+
await input.db
|
|
193
|
+
.insert(circuitBreakerState)
|
|
194
|
+
.values({ issueId: candidate.identifier, escalatedAt: new Date() })
|
|
195
|
+
.onConflictDoNothing();
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
log.warn({ err, issueId: candidate.identifier }, "failed to insert circuit_breaker_state row (probe recovery will skip this issue)");
|
|
199
|
+
}
|
|
200
|
+
}
|
|
185
201
|
if (input.db) {
|
|
186
202
|
void logAuditEventUnchecked(input.db, pmEscalatedToNeedsDesignEvent({
|
|
187
203
|
issueId: candidate.identifier,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../../src/pm/actions/promote.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../../src/pm/actions/promote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { LinearClient } from "@linear/sdk";
|
|
2
|
+
import type { AnyDb } from "../../db/client.js";
|
|
3
|
+
export interface RecoverCircuitBreakerInput {
|
|
4
|
+
db: AnyDb;
|
|
5
|
+
/** Linear issue identifier (e.g. "BEC-1") — the human-facing identifier, NOT the UUID. */
|
|
6
|
+
issueId: string;
|
|
7
|
+
linearClient: LinearClient | {
|
|
8
|
+
issue: (id: string) => any;
|
|
9
|
+
updateIssue: (id: string, payload: any) => any;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* BEC-236 — invoked when a pipeline run reaches terminal `completed`
|
|
14
|
+
* status. If the issue has a circuit_breaker_state row (i.e. we
|
|
15
|
+
* Tier-5-escalated it earlier), drop the row and strip the
|
|
16
|
+
* `needs-design` label. Idempotent and safe to call for any completed
|
|
17
|
+
* run — early-returns when no state row exists, so human-added
|
|
18
|
+
* needs-design labels are preserved.
|
|
19
|
+
*/
|
|
20
|
+
export declare function recoverCircuitBreaker(input: RecoverCircuitBreakerInput): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=recover-circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover-circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/recover-circuit-breaker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAOhD,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,KAAK,CAAC;IACV,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EACR,YAAY,GACZ;QACE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,GAAG,CAAC;QAC3B,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,GAAG,CAAC;KAChD,CAAC;CACP;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm";
|
|
2
|
+
import { circuitBreakerState } from "../../db/schema.js";
|
|
3
|
+
import { createLogger } from "../../logger.js";
|
|
4
|
+
import { logAuditEventUnchecked } from "../../audit/writer.js";
|
|
5
|
+
import { pmCircuitBreakerRecoveredEvent } from "../../audit/events.js";
|
|
6
|
+
const log = createLogger({ component: "PmAgent:recover-breaker" });
|
|
7
|
+
/**
|
|
8
|
+
* BEC-236 — invoked when a pipeline run reaches terminal `completed`
|
|
9
|
+
* status. If the issue has a circuit_breaker_state row (i.e. we
|
|
10
|
+
* Tier-5-escalated it earlier), drop the row and strip the
|
|
11
|
+
* `needs-design` label. Idempotent and safe to call for any completed
|
|
12
|
+
* run — early-returns when no state row exists, so human-added
|
|
13
|
+
* needs-design labels are preserved.
|
|
14
|
+
*/
|
|
15
|
+
export async function recoverCircuitBreaker(input) {
|
|
16
|
+
const { db, issueId, linearClient } = input;
|
|
17
|
+
const rows = (await db
|
|
18
|
+
.select({ probeAttempts: circuitBreakerState.probeAttempts })
|
|
19
|
+
.from(circuitBreakerState)
|
|
20
|
+
.where(eq(circuitBreakerState.issueId, issueId)));
|
|
21
|
+
if (rows.length === 0)
|
|
22
|
+
return; // not our escalation, leave label alone
|
|
23
|
+
const probeAttempts = rows[0].probeAttempts;
|
|
24
|
+
// Delete the state row first — if label removal fails, the next run will
|
|
25
|
+
// re-attempt the label removal but the breaker state is already cleared.
|
|
26
|
+
await db
|
|
27
|
+
.delete(circuitBreakerState)
|
|
28
|
+
.where(eq(circuitBreakerState.issueId, issueId));
|
|
29
|
+
try {
|
|
30
|
+
const issue = await linearClient.issue(issueId);
|
|
31
|
+
const labelConn = await issue.labels();
|
|
32
|
+
const surviving = labelConn.nodes
|
|
33
|
+
.filter((l) => l.name.toLowerCase() !== "needs-design")
|
|
34
|
+
.map((l) => l.id);
|
|
35
|
+
await linearClient.updateIssue(issue.id, { labelIds: surviving });
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
log.warn({ err, issueId }, "recoverCircuitBreaker: failed to remove needs-design label");
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
await logAuditEventUnchecked(db, pmCircuitBreakerRecoveredEvent({ issueId, probeAttempts }));
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
log.warn({ err, issueId }, "recoverCircuitBreaker: failed to log audit event");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=recover-circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover-circuit-breaker.js","sourceRoot":"","sources":["../../../src/pm/actions/recover-circuit-breaker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC,CAAC;AAcnE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAiC;IAEjC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAE5C,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE;SACnB,MAAM,CAAC,EAAE,aAAa,EAAE,mBAAmB,CAAC,aAAa,EAAE,CAAC;SAC5D,IAAI,CAAC,mBAAmB,CAAC;SACzB,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAEhD,CAAC;IACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,wCAAwC;IAEvE,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAE5C,yEAAyE;IACzE,yEAAyE;IACzE,MAAM,EAAE;SACL,MAAM,CAAC,mBAAmB,CAAC;SAC3B,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAO,YAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK;aAC9B,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC;aACxE,GAAG,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpC,MAAO,YAAoB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,OAAO,EAAE,EAChB,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,sBAAsB,CAC1B,EAAE,EACF,8BAA8B,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAC3D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,OAAO,EAAE,EAChB,kDAAkD,CACnD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AnyDb } from "../../db/client.js";
|
|
2
|
+
export interface SelectProbeCandidatesOptions {
|
|
3
|
+
cap: number;
|
|
4
|
+
cooldownMs: number;
|
|
5
|
+
maxConsecutiveFailures: number;
|
|
6
|
+
now: number;
|
|
7
|
+
/** Escape hatch from `getCircuitBreakerProbeConfig().disabled`. */
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* BEC-236 — pick at most `cap` circuit-broken issues whose cooldown
|
|
12
|
+
* window has elapsed, mark them probed (`last_probe_at = now`,
|
|
13
|
+
* `probe_attempts += 1`), and emit one `pm.circuit_breaker_probe` audit
|
|
14
|
+
* event per. Returns the issue IDs the caller should bypass the breaker
|
|
15
|
+
* skip for in this tick.
|
|
16
|
+
*
|
|
17
|
+
* Round-robin: candidates are ordered by oldest `last_probe_at` first
|
|
18
|
+
* (NULLs first) so no issue starves.
|
|
19
|
+
*/
|
|
20
|
+
export declare function selectProbeCandidates(db: AnyDb, opts: SelectProbeCandidatesOptions): Promise<Set<string>>;
|
|
21
|
+
//# sourceMappingURL=select-probe-candidates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-probe-candidates.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/select-probe-candidates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAQhD,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,KAAK,EACT,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CA8EtB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { asc, inArray, isNull, lte, or, sql } from "drizzle-orm";
|
|
2
|
+
import { circuitBreakerState } from "../../db/schema.js";
|
|
3
|
+
import { batchCountConsecutiveFailures } from "./db-queries.js";
|
|
4
|
+
import { createLogger } from "../../logger.js";
|
|
5
|
+
import { logAuditEventUnchecked } from "../../audit/writer.js";
|
|
6
|
+
import { pmCircuitBreakerProbeEvent } from "../../audit/events.js";
|
|
7
|
+
const log = createLogger({ component: "PmAgent:probe" });
|
|
8
|
+
/**
|
|
9
|
+
* BEC-236 — pick at most `cap` circuit-broken issues whose cooldown
|
|
10
|
+
* window has elapsed, mark them probed (`last_probe_at = now`,
|
|
11
|
+
* `probe_attempts += 1`), and emit one `pm.circuit_breaker_probe` audit
|
|
12
|
+
* event per. Returns the issue IDs the caller should bypass the breaker
|
|
13
|
+
* skip for in this tick.
|
|
14
|
+
*
|
|
15
|
+
* Round-robin: candidates are ordered by oldest `last_probe_at` first
|
|
16
|
+
* (NULLs first) so no issue starves.
|
|
17
|
+
*/
|
|
18
|
+
export async function selectProbeCandidates(db, opts) {
|
|
19
|
+
if (opts.disabled)
|
|
20
|
+
return new Set();
|
|
21
|
+
// Defensive: when maxConsecutiveFailures is 0 the breaker is effectively
|
|
22
|
+
// disabled (BEC-181 documents this), so there's nothing to probe — and the
|
|
23
|
+
// downstream filter `count >= 0` would elect every state-row issue,
|
|
24
|
+
// including already-recovered ones.
|
|
25
|
+
if (opts.maxConsecutiveFailures <= 0)
|
|
26
|
+
return new Set();
|
|
27
|
+
// Pull all eligible rows: cooldown elapsed OR never probed.
|
|
28
|
+
// Drizzle's lte() calls toDriver() on the Date, converting it to epoch-
|
|
29
|
+
// seconds for SQLite (matching how last_probe_at is stored).
|
|
30
|
+
const cooldownCutoff = new Date(opts.now - opts.cooldownMs);
|
|
31
|
+
const rows = (await db
|
|
32
|
+
.select({
|
|
33
|
+
issueId: circuitBreakerState.issueId,
|
|
34
|
+
lastProbeAt: circuitBreakerState.lastProbeAt,
|
|
35
|
+
probeAttempts: circuitBreakerState.probeAttempts,
|
|
36
|
+
})
|
|
37
|
+
.from(circuitBreakerState)
|
|
38
|
+
.where(or(isNull(circuitBreakerState.lastProbeAt), lte(circuitBreakerState.lastProbeAt, cooldownCutoff)))
|
|
39
|
+
.orderBy(
|
|
40
|
+
// NULLs first (never probed → most eligible), then oldest-first.
|
|
41
|
+
sql `CASE WHEN ${circuitBreakerState.lastProbeAt} IS NULL THEN 0 ELSE 1 END`, asc(circuitBreakerState.lastProbeAt)));
|
|
42
|
+
if (rows.length === 0)
|
|
43
|
+
return new Set();
|
|
44
|
+
// Filter out issues whose failure count has dropped (a `completed` run landed).
|
|
45
|
+
const failureCounts = await batchCountConsecutiveFailures(db, rows.map((r) => r.issueId));
|
|
46
|
+
const eligible = rows.filter((r) => (failureCounts.get(r.issueId) ?? 0) >= opts.maxConsecutiveFailures);
|
|
47
|
+
const picked = eligible.slice(0, opts.cap);
|
|
48
|
+
if (picked.length === 0)
|
|
49
|
+
return new Set();
|
|
50
|
+
const pickedIds = picked.map((r) => r.issueId);
|
|
51
|
+
// Atomically bump last_probe_at + probe_attempts for the picked set.
|
|
52
|
+
await db
|
|
53
|
+
.update(circuitBreakerState)
|
|
54
|
+
.set({
|
|
55
|
+
lastProbeAt: new Date(opts.now),
|
|
56
|
+
probeAttempts: sql `${circuitBreakerState.probeAttempts} + 1`,
|
|
57
|
+
})
|
|
58
|
+
.where(inArray(circuitBreakerState.issueId, pickedIds));
|
|
59
|
+
// Emit one audit event per probe. Best-effort — failures don't block the tick.
|
|
60
|
+
// The "age" we know cheaply here is age since the previous probe (or null
|
|
61
|
+
// for never-probed issues, surfaced as -1). Age since the last actual
|
|
62
|
+
// failure would require a separate query per issue — not worth the N+1.
|
|
63
|
+
for (const r of picked) {
|
|
64
|
+
const lastProbeAgeMin = r.lastProbeAt
|
|
65
|
+
? Math.floor((opts.now - r.lastProbeAt.getTime()) / 60_000)
|
|
66
|
+
: -1;
|
|
67
|
+
try {
|
|
68
|
+
await logAuditEventUnchecked(db, pmCircuitBreakerProbeEvent({
|
|
69
|
+
issueId: r.issueId,
|
|
70
|
+
consecutiveFailures: failureCounts.get(r.issueId) ?? 0,
|
|
71
|
+
lastProbeAgeMin,
|
|
72
|
+
probeAttempts: r.probeAttempts + 1,
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
log.warn({ err, issueId: r.issueId }, "failed to log circuit-breaker probe audit event");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return new Set(pickedIds);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=select-probe-candidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-probe-candidates.js","sourceRoot":"","sources":["../../../src/pm/actions/select-probe-candidates.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,13 @@ export interface StartTodoInput {
|
|
|
26
26
|
* round-trip for all candidates via the required `db` field).
|
|
27
27
|
*/
|
|
28
28
|
getFailureCount?: (issueId: string) => Promise<number>;
|
|
29
|
+
/**
|
|
30
|
+
* BEC-236 — issue IDs the half-open probe selected this tick. Issues in
|
|
31
|
+
* this Set bypass the consecutive-failures circuit-breaker skip, allowing
|
|
32
|
+
* exactly one probe run per cooldown window. When undefined, breaker
|
|
33
|
+
* behavior is unchanged from BEC-161/181.
|
|
34
|
+
*/
|
|
35
|
+
probeOverrideIds?: Set<string>;
|
|
29
36
|
}
|
|
30
37
|
export interface StartTodoResult {
|
|
31
38
|
identifier: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-todo.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/start-todo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAIhD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAOpD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,GAAG,CAAC;IAClB,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"start-todo.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/start-todo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAIhD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAOpD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,GAAG,CAAC;IAClB,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CAmN5B"}
|
|
@@ -78,7 +78,8 @@ export async function startTodoIssues(input) {
|
|
|
78
78
|
const failureCount = input.getFailureCount
|
|
79
79
|
? await input.getFailureCount(issue.identifier)
|
|
80
80
|
: (prefetchedFailureCounts.get(issue.identifier) ?? 0);
|
|
81
|
-
if (failureCount >= input.maxConsecutiveFailures
|
|
81
|
+
if (failureCount >= input.maxConsecutiveFailures &&
|
|
82
|
+
!input.probeOverrideIds?.has(issue.identifier)) {
|
|
82
83
|
log.warn({ identifier: issue.identifier, failureCount, threshold: input.maxConsecutiveFailures }, "circuit-breaker engaged — skipping start");
|
|
83
84
|
void logAuditEventUnchecked(db, pmSkippedCircuitBreakerEvent({
|
|
84
85
|
issueId: issue.identifier,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-todo.js","sourceRoot":"","sources":["../../../src/pm/actions/start-todo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAI1E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"start-todo.js","sourceRoot":"","sources":["../../../src/pm/actions/start-todo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { LinearClient } from "@linear/sdk";
|
|
2
|
+
import type { AnyDb } from "../../db/client.js";
|
|
3
|
+
export interface SweepRecoveredOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Threshold the breaker uses. Issues whose consecutive-failure count has
|
|
6
|
+
* dropped below this are recoverable.
|
|
7
|
+
*/
|
|
8
|
+
maxConsecutiveFailures: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* BEC-236 — PM tick sweep that completes circuit-breaker recovery.
|
|
12
|
+
*
|
|
13
|
+
* The runner can't drive recovery itself because it has no `linearClient` in
|
|
14
|
+
* scope (it talks to Linear only through the notifier, which doesn't expose
|
|
15
|
+
* label edits). Instead, every PM tick scans `circuit_breaker_state` for
|
|
16
|
+
* rows whose corresponding issue now has `batchCountConsecutiveFailures` <
|
|
17
|
+
* threshold — i.e. a `completed` run has landed since the last failure
|
|
18
|
+
* streak. Those rows are handed to `recoverCircuitBreaker`, which deletes
|
|
19
|
+
* the row and strips the Tier-5-added `needs-design` label.
|
|
20
|
+
*
|
|
21
|
+
* Lag relative to run completion is at most one PM tick (~30 min). That's
|
|
22
|
+
* fine for the recovery use case — the row stays visible to `ura circuit
|
|
23
|
+
* list` until cleared, but nothing functional depends on instant cleanup.
|
|
24
|
+
*/
|
|
25
|
+
export declare function sweepRecoveredCircuitBreakers(db: AnyDb, linearClient: LinearClient, opts: SweepRecoveredOptions): Promise<{
|
|
26
|
+
recovered: string[];
|
|
27
|
+
}>;
|
|
28
|
+
//# sourceMappingURL=sweep-recovered-circuit-breakers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep-recovered-circuit-breakers.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/sweep-recovered-circuit-breakers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAOhD,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,KAAK,EACT,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA2BlC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { circuitBreakerState } from "../../db/schema.js";
|
|
2
|
+
import { batchCountConsecutiveFailures } from "./db-queries.js";
|
|
3
|
+
import { recoverCircuitBreaker } from "./recover-circuit-breaker.js";
|
|
4
|
+
import { createLogger } from "../../logger.js";
|
|
5
|
+
const log = createLogger({ component: "PmAgent:sweep-recovery" });
|
|
6
|
+
/**
|
|
7
|
+
* BEC-236 — PM tick sweep that completes circuit-breaker recovery.
|
|
8
|
+
*
|
|
9
|
+
* The runner can't drive recovery itself because it has no `linearClient` in
|
|
10
|
+
* scope (it talks to Linear only through the notifier, which doesn't expose
|
|
11
|
+
* label edits). Instead, every PM tick scans `circuit_breaker_state` for
|
|
12
|
+
* rows whose corresponding issue now has `batchCountConsecutiveFailures` <
|
|
13
|
+
* threshold — i.e. a `completed` run has landed since the last failure
|
|
14
|
+
* streak. Those rows are handed to `recoverCircuitBreaker`, which deletes
|
|
15
|
+
* the row and strips the Tier-5-added `needs-design` label.
|
|
16
|
+
*
|
|
17
|
+
* Lag relative to run completion is at most one PM tick (~30 min). That's
|
|
18
|
+
* fine for the recovery use case — the row stays visible to `ura circuit
|
|
19
|
+
* list` until cleared, but nothing functional depends on instant cleanup.
|
|
20
|
+
*/
|
|
21
|
+
export async function sweepRecoveredCircuitBreakers(db, linearClient, opts) {
|
|
22
|
+
const rows = (await db
|
|
23
|
+
.select({ issueId: circuitBreakerState.issueId })
|
|
24
|
+
.from(circuitBreakerState));
|
|
25
|
+
if (rows.length === 0)
|
|
26
|
+
return { recovered: [] };
|
|
27
|
+
const issueIds = rows.map((r) => r.issueId);
|
|
28
|
+
const counts = await batchCountConsecutiveFailures(db, issueIds);
|
|
29
|
+
const recoverable = issueIds.filter((id) => (counts.get(id) ?? 0) < opts.maxConsecutiveFailures);
|
|
30
|
+
if (recoverable.length === 0)
|
|
31
|
+
return { recovered: [] };
|
|
32
|
+
const recovered = [];
|
|
33
|
+
for (const id of recoverable) {
|
|
34
|
+
try {
|
|
35
|
+
await recoverCircuitBreaker({ db, issueId: id, linearClient });
|
|
36
|
+
recovered.push(id);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
log.warn({ err, issueId: id }, "sweepRecoveredCircuitBreakers: recovery failed for issue");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (recovered.length > 0) {
|
|
43
|
+
log.info({ recovered }, "circuit-breaker recovery sweep cleared issues");
|
|
44
|
+
}
|
|
45
|
+
return { recovered };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=sweep-recovered-circuit-breakers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep-recovered-circuit-breakers.js","sourceRoot":"","sources":["../../../src/pm/actions/sweep-recovered-circuit-breakers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,CAAC;AAUlE;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,EAAS,EACT,YAA0B,EAC1B,IAA2B;IAE3B,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE;SACnB,MAAM,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,CAAC;SAChD,IAAI,CAAC,mBAAmB,CAAC,CAA+B,CAAC;IAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAEhD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAEjE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CACjC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAC5D,CAAC;IACF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAEvD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,qBAAqB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;YAC/D,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,0DAA0D,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,+CAA+C,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -20,7 +20,21 @@ export interface TriagePromptInput {
|
|
|
20
20
|
identifier: string;
|
|
21
21
|
title: string;
|
|
22
22
|
description: string | null | undefined;
|
|
23
|
+
/** When true, the description already contains a parsed **Acceptance Criteria:** section; prompt builders omit AC generation to avoid divergent regeneration. */
|
|
24
|
+
hasPreSuppliedACs?: boolean;
|
|
23
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse hand-written acceptance criteria from a Linear issue description.
|
|
28
|
+
*
|
|
29
|
+
* Scans for the canonical `**Acceptance Criteria:**` marker and extracts
|
|
30
|
+
* following bullet items (`- [ ] text`, `- [x] text`, or `- text`).
|
|
31
|
+
* Stops at the first non-bullet, non-empty line (i.e. a new section or prose).
|
|
32
|
+
* Returns an empty array when the marker is absent or no items follow it.
|
|
33
|
+
*
|
|
34
|
+
* Only parses from the canonical marker — NOT from arbitrary free-text —
|
|
35
|
+
* so generic prose that mentions "criteria" is never accidentally harvested.
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseHandWrittenACs(description: string | null | undefined): string[];
|
|
24
38
|
/**
|
|
25
39
|
* Returns true iff the env explicitly disables Triage v2. Strict equality
|
|
26
40
|
* on the string `"true"` — mirrors `URATEAM_DISABLE_*_GATE` conventions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage-prompt.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/triage-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"triage-prompt.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/triage-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,iKAAiK;IACjK,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAoBpF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE1E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GACjC,MAAM,CAyBR;AA0ED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GACjC,MAAM,CAiER"}
|
|
@@ -16,6 +16,42 @@
|
|
|
16
16
|
* See `specs/001-triage-v2/research.md` for the rationale behind each
|
|
17
17
|
* prompt-engineering primitive.
|
|
18
18
|
*/
|
|
19
|
+
/**
|
|
20
|
+
* Parse hand-written acceptance criteria from a Linear issue description.
|
|
21
|
+
*
|
|
22
|
+
* Scans for the canonical `**Acceptance Criteria:**` marker and extracts
|
|
23
|
+
* following bullet items (`- [ ] text`, `- [x] text`, or `- text`).
|
|
24
|
+
* Stops at the first non-bullet, non-empty line (i.e. a new section or prose).
|
|
25
|
+
* Returns an empty array when the marker is absent or no items follow it.
|
|
26
|
+
*
|
|
27
|
+
* Only parses from the canonical marker — NOT from arbitrary free-text —
|
|
28
|
+
* so generic prose that mentions "criteria" is never accidentally harvested.
|
|
29
|
+
*/
|
|
30
|
+
export function parseHandWrittenACs(description) {
|
|
31
|
+
if (!description)
|
|
32
|
+
return [];
|
|
33
|
+
const marker = "**Acceptance Criteria:**";
|
|
34
|
+
const idx = description.indexOf(marker);
|
|
35
|
+
if (idx === -1)
|
|
36
|
+
return [];
|
|
37
|
+
const afterMarker = description.slice(idx + marker.length);
|
|
38
|
+
const items = [];
|
|
39
|
+
for (const line of afterMarker.split("\n")) {
|
|
40
|
+
const trimmed = line.trim();
|
|
41
|
+
if (trimmed === "")
|
|
42
|
+
continue; // blank lines between items are fine
|
|
43
|
+
const match = trimmed.match(/^-\s+(?:\[.?\]\s+)?(.+)$/);
|
|
44
|
+
if (match) {
|
|
45
|
+
const text = match[1].trim();
|
|
46
|
+
if (text.length > 0)
|
|
47
|
+
items.push(text);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
break; // non-bullet non-empty line → end of AC section
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return items;
|
|
54
|
+
}
|
|
19
55
|
/**
|
|
20
56
|
* Returns true iff the env explicitly disables Triage v2. Strict equality
|
|
21
57
|
* on the string `"true"` — mirrors `URATEAM_DISABLE_*_GATE` conventions.
|
|
@@ -33,21 +69,27 @@ export function isV2Disabled(env = process.env) {
|
|
|
33
69
|
*/
|
|
34
70
|
export function buildTriageV1Prompt(issue, sanitize) {
|
|
35
71
|
const sanitizedDesc = sanitize(issue.description ?? "");
|
|
36
|
-
|
|
72
|
+
const acBlock = issue.hasPreSuppliedACs
|
|
73
|
+
? ""
|
|
74
|
+
: `IMPORTANT rules for generating acceptance criteria:\n` +
|
|
75
|
+
`1. INTEGRATION: Every new function, module, or utility MUST have a criterion that specifies where it is called from in existing code (e.g. "runner.ts calls checkFoo() after the test stage completes"). Code that is exported but never imported outside its own test file is incomplete.\n` +
|
|
76
|
+
`2. DOCUMENTATION: If the change adds new configuration, public API, CLI flags, or changes behavior, include a criterion requiring updates to relevant documentation (CLAUDE.md, README.md, deploy/README.md, or inline JSDoc).\n` +
|
|
77
|
+
`3. TESTING: Include a criterion for tests that exercise the integration path, not just the utility in isolation.\n` +
|
|
78
|
+
`4. Each criterion must be concrete and verifiable by reading the code — avoid vague criteria like "works correctly" or "is implemented".\n\n`;
|
|
79
|
+
const jsonSchema = issue.hasPreSuppliedACs
|
|
80
|
+
? `{"priority": <1-4 where 1=urgent>, "labels": [<"bug"|"feature"|"backend"|"frontend"|"infra"|"docs">], "complexity": <"trivial"|"small"|"medium"|"large">, "rationale": "<one sentence>", "approachSummary": "<3-5 lines>", "openQuestions": [], "antiAcceptanceCriteria": ["<not-this>", ...]}`
|
|
81
|
+
: `{"priority": <1-4 where 1=urgent>, "labels": [<"bug"|"feature"|"backend"|"frontend"|"infra"|"docs">], "complexity": <"trivial"|"small"|"medium"|"large">, "rationale": "<one sentence>", "approachSummary": "<3-5 lines>", "openQuestions": [], "antiAcceptanceCriteria": ["<not-this>", ...], "acceptanceCriteria": ["<integration criterion — specifies call site in existing code>", "<behavior criterion — testable outcome>", "<documentation criterion — if applicable>", ...]}`;
|
|
82
|
+
return (`Classify this software issue${issue.hasPreSuppliedACs ? "" : ", generate acceptance criteria,"} and produce a design doc. Respond with ONLY a JSON object, no other text.\n\n` +
|
|
37
83
|
`Issue: ${issue.identifier}\n` +
|
|
38
84
|
`Title: ${sanitize(issue.title)}\n` +
|
|
39
85
|
`Description: ${sanitizedDesc}\n\n` +
|
|
40
|
-
|
|
41
|
-
`1. INTEGRATION: Every new function, module, or utility MUST have a criterion that specifies where it is called from in existing code (e.g. "runner.ts calls checkFoo() after the test stage completes"). Code that is exported but never imported outside its own test file is incomplete.\n` +
|
|
42
|
-
`2. DOCUMENTATION: If the change adds new configuration, public API, CLI flags, or changes behavior, include a criterion requiring updates to relevant documentation (CLAUDE.md, README.md, deploy/README.md, or inline JSDoc).\n` +
|
|
43
|
-
`3. TESTING: Include a criterion for tests that exercise the integration path, not just the utility in isolation.\n` +
|
|
44
|
-
`4. Each criterion must be concrete and verifiable by reading the code — avoid vague criteria like "works correctly" or "is implemented".\n\n` +
|
|
86
|
+
acBlock +
|
|
45
87
|
`Tier 4 — DESIGN DOC fields:\n` +
|
|
46
88
|
`- approachSummary: 3-5 lines describing what the implementation will do at a level the operator can sanity-check before spending implement-stage tokens. Concrete enough that someone reading it could predict the diff shape.\n` +
|
|
47
89
|
`- openQuestions: list of unknowns that the operator must answer before implement is safe — ambiguous requirements, missing API contracts, undecided trade-offs. EMPTY when the issue is clearly specified. NON-EMPTY forces routing to "needs-design" so a human answers before any implement-stage tokens are spent.\n` +
|
|
48
90
|
`- antiAcceptanceCriteria: list of "things this should NOT do" — explicit out-of-scope items so the agent doesn't drift (e.g. "must NOT change other pipelines' configs", "must NOT add new dependencies"). Helps the agent stay narrow.\n\n` +
|
|
49
91
|
`Respond with exactly this JSON format (no markdown, no explanation, just the JSON). The canonical form for openQuestions is the EMPTY array \`[]\` — only populate it when the issue is genuinely ambiguous and you cannot proceed without operator input. Do not invent questions for clear specs.\n` +
|
|
50
|
-
|
|
92
|
+
jsonSchema);
|
|
51
93
|
}
|
|
52
94
|
// ---------------------------------------------------------------------------
|
|
53
95
|
// Tier 6a — Triage v2 prompt (Anthropic prompt-engineering best practices).
|
|
@@ -149,11 +191,12 @@ The schema (every field is required unless marked optional):
|
|
|
149
191
|
"needs-design". Empty array (\`[]\`) is canonical
|
|
150
192
|
when the issue is clearly specified.
|
|
151
193
|
antiAcceptanceCriteria: array of strings — things the implementation must
|
|
152
|
-
NOT do (out-of-scope items).
|
|
194
|
+
NOT do (out-of-scope items).${issue.hasPreSuppliedACs ? `
|
|
195
|
+
(acceptanceCriteria is PRE-SUPPLIED from the issue description — omit this field)` : `
|
|
153
196
|
acceptanceCriteria: array of strings — concrete, testable behaviors.
|
|
154
197
|
Each must specify either (a) a call-site in
|
|
155
198
|
existing code, (b) a measurable outcome, or
|
|
156
|
-
(c) a documentation update
|
|
199
|
+
(c) a documentation update.`}
|
|
157
200
|
|
|
158
201
|
(Tier 6b — all optional, drop when not applicable to the issue:)
|
|
159
202
|
assumptions: array of strings (max 10) — what the agent will
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage-prompt.js","sourceRoot":"","sources":["../../../src/pm/actions/triage-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"triage-prompt.js","sourceRoot":"","sources":["../../../src/pm/actions/triage-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAkDhD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,uFAAuF;IACvF,EAAE,CAAC,EAAE,KAAK,CAAC;CACZ;AAoBD,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAyPjF"}
|