@yemi33/minions 0.1.2447 → 0.1.2449
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/bin/cli-api-client.js +1 -1
- package/bin/install-internal-minions.js +1382 -44
- package/bin/install-layout.js +150 -0
- package/bin/minions.js +460 -167
- package/dashboard/docs/typography.md +65 -12
- package/dashboard/js/command-center.js +66 -7
- package/dashboard/js/detail-panel.js +36 -0
- package/dashboard/js/memory-panel.js +59 -12
- package/dashboard/js/qa.js +186 -45
- package/dashboard/js/refresh.js +148 -12
- package/dashboard/js/render-dispatch.js +3 -4
- package/dashboard/js/render-inbox.js +2 -2
- package/dashboard/js/render-other.js +3 -3
- package/dashboard/js/render-pipelines.js +14 -0
- package/dashboard/js/render-plans.js +57 -9
- package/dashboard/js/render-prd.js +132 -23
- package/dashboard/js/render-prs.js +195 -166
- package/dashboard/js/render-schedules.js +63 -3
- package/dashboard/js/render-utils.js +3 -3
- package/dashboard/js/render-watches.js +19 -3
- package/dashboard/js/render-work-items.js +238 -30
- package/dashboard/js/settings.js +205 -54
- package/dashboard/js/utils.js +51 -1
- package/dashboard/pages/home.html +1 -1
- package/dashboard/pages/qa.html +1 -16
- package/dashboard/pages/work.html +40 -0
- package/dashboard/shared/cc-limits.js +79 -0
- package/dashboard/shared/pr-filters.js +21 -38
- package/dashboard/shared/project-git-summary.js +1 -1
- package/dashboard/shared/record-filters.js +169 -0
- package/dashboard/shared/watches-source.js +1 -1
- package/dashboard/shared/welcome-popup.js +1 -1
- package/dashboard/shared/wi-filters.js +302 -0
- package/dashboard/slim/body.html +1 -0
- package/dashboard/slim/js/command-send.js +26 -0
- package/dashboard/slim/js/modals-tiles.js +380 -39
- package/dashboard/slim/js/status.js +13 -21
- package/dashboard/slim/layout.html +1 -0
- package/dashboard/slim/panel-bootstrap.js +6 -2
- package/dashboard/slim/styles.css +38 -0
- package/dashboard/styles.css +159 -55
- package/dashboard-build.js +52 -6
- package/dashboard.js +956 -423
- package/docs/README.md +11 -6
- package/docs/api-errors.md +2 -2
- package/docs/architecture-review-2026-07-09.md +1 -1
- package/docs/architecture.excalidraw +2 -2
- package/docs/auto-discovery.md +18 -9
- package/docs/branch-derivation.md +4 -4
- package/docs/capture-demos.js +39 -2
- package/docs/ci-runner-canary.md +123 -0
- package/docs/claude-md-propagation.md +2 -2
- package/docs/cloud-agent-dispatch.md +204 -0
- package/docs/command-center.md +7 -7
- package/docs/completion-reports.md +43 -20
- package/docs/constants.md +10 -3
- package/docs/constellation-bridge.md +134 -6
- package/docs/constellation-style-telemetry.md +4 -4
- package/docs/contracts/capability-protocol.v1.json +165 -0
- package/docs/cooldown-merge-semantics.md +12 -12
- package/docs/copilot-cli-schema.md +7 -7
- package/docs/cross-repo-plans.md +10 -10
- package/docs/dead-code-audit-retractions.md +5 -5
- package/docs/default-branch-ci.md +173 -0
- package/docs/deprecated.json +31 -31
- package/docs/design-inbox-entries-schema.md +3 -3
- package/docs/design-language.md +1051 -0
- package/docs/design-state-storage.md +11 -11
- package/docs/diagnostics-crash-reports.md +9 -9
- package/docs/diagnostics-memory.md +5 -5
- package/docs/documentation-audit-2026-07-09.md +7 -7
- package/docs/engine-restart.md +90 -5
- package/docs/harness-mode.md +1 -1
- package/docs/internal-install.md +338 -39
- package/docs/kb-dedup-duplicate-pair-investigation.md +5 -5
- package/docs/kb-pr3223-cascade-archiving.md +1 -1
- package/docs/kb-pr696-merge-conflict-docs.md +6 -6
- package/docs/kb-sweep.md +35 -35
- package/docs/keep-processes.md +1 -1
- package/docs/live-checkout-mode.md +30 -30
- package/docs/managed-spawn.md +18 -14
- package/docs/named-agents.md +7 -7
- package/docs/plan-lifecycle.md +69 -2
- package/docs/pr-author-identity.md +114 -0
- package/docs/pr-auto-fix-dispatch.md +19 -4
- package/docs/pr-comment-followup.md +6 -6
- package/docs/pr-review-fix-loop.md +59 -10
- package/docs/process-termination.md +40 -0
- package/docs/proposals/repo-pool-for-live-checkout.md +13 -13
- package/docs/qa-runbook-lifecycle.md +367 -17
- package/docs/qa-runbooks.md +3 -3
- package/docs/rfc-completion-json.md +18 -18
- package/docs/runtime-adapters.md +26 -21
- package/docs/security.md +6 -6
- package/docs/self-improvement.md +4 -4
- package/docs/shared-lifecycle-module-map.md +473 -472
- package/docs/skills.md +52 -3
- package/docs/slim-ux/concepts.md +121 -116
- package/docs/specs/agent-configurability.md +18 -18
- package/docs/specs/agent-rename.md +18 -18
- package/docs/team-memory.md +38 -21
- package/docs/timeouts-and-liveness.md +118 -10
- package/docs/tutorials/01-install-and-connect.md +1 -1
- package/docs/watches.md +40 -39
- package/docs/workspace-manifests.md +4 -4
- package/docs/worktree-lifecycle.md +293 -14
- package/engine/README.md +46 -0
- package/engine/{ado-comment.js → ado/comment.js} +8 -8
- package/engine/{ado-git-auth.js → ado/git-auth.js} +4 -4
- package/engine/{ado.js → ado/index.js} +417 -63
- package/engine/{ado-status.js → ado/status.js} +6 -8
- package/engine/{ado-token.js → ado/token.js} +1 -1
- package/engine/{acp-transport.js → agents/acp-transport.js} +62 -22
- package/engine/{agent-worker-pool.js → agents/agent-worker-pool.js} +17 -8
- package/engine/{cc-worker-pool.js → agents/cc-worker-pool.js} +16 -6
- package/engine/{claude-md-context.js → agents/claude-md-context.js} +5 -5
- package/engine/{harness-context.js → agents/harness-context.js} +5 -5
- package/engine/{harness.js → agents/harness.js} +3 -3
- package/engine/{llm.js → agents/llm.js} +18 -14
- package/engine/{model-discovery.js → agents/model-discovery.js} +2 -2
- package/engine/{playbook.js → agents/playbook.js} +155 -22
- package/engine/{pooled-agent-process.js → agents/pooled-agent-process.js} +14 -12
- package/engine/{preflight.js → agents/preflight.js} +29 -10
- package/engine/{spawn-agent.js → agents/spawn-agent.js} +25 -14
- package/engine/{spawn-phase-watchdog.js → agents/spawn-phase-watchdog.js} +16 -7
- package/engine/{steering.js → agents/steering.js} +5 -5
- package/engine/{tools-inventory.js → agents/tools-inventory.js} +2 -2
- package/engine/{agent-api-validation.js → api/agent-api-validation.js} +2 -2
- package/engine/{api-validation.js → api/api-validation.js} +1 -1
- package/engine/api/bridge.js +787 -0
- package/engine/{cc-api-validation.js → api/cc-api-validation.js} +1 -1
- package/engine/api/companion.js +560 -0
- package/engine/{content-api-validation.js → api/content-api-validation.js} +2 -2
- package/engine/{pr-issue-validation.js → api/pr-issue-validation.js} +33 -6
- package/engine/{settings-validation.js → api/settings-validation.js} +32 -4
- package/engine/api-contracts/agent-content.js +4 -4
- package/engine/api-contracts/capability-manifest.js +236 -0
- package/engine/api-contracts/capability-protocol.js +333 -0
- package/engine/api-contracts/cc-ops.js +1 -1
- package/engine/api-contracts/config-runtime.js +5 -0
- package/engine/api-contracts/core.js +28 -1
- package/engine/api-contracts/index.js +100 -0
- package/engine/api-contracts/orchestration.js +18 -5
- package/engine/api-contracts/pull-requests.js +37 -6
- package/engine/api-contracts/qa-process.js +29 -6
- package/engine/api-contracts/work-plan-prd.js +21 -1
- package/engine/cloud/contract.js +212 -0
- package/engine/cloud/index.js +159 -0
- package/engine/{execution-model.js → core/execution-model.js} +1 -1
- package/engine/{features.js → core/features.js} +4 -4
- package/engine/{operator-identity.js → core/operator-identity.js} +1 -1
- package/engine/{queries.js → core/queries.js} +201 -36
- package/engine/{safe-expr.js → core/safe-expr.js} +1 -1
- package/engine/{shared.js → core/shared.js} +1637 -175
- package/engine/{stdio-timestamps.js → core/stdio-timestamps.js} +1 -1
- package/engine/{untrusted-fence.js → core/untrusted-fence.js} +3 -3
- package/engine/db/index.js +11 -2
- package/engine/db/migrations/002-dispatches.js +3 -3
- package/engine/db/migrations/003-work-items.js +1 -1
- package/engine/db/migrations/004-pull-requests.js +1 -1
- package/engine/db/migrations/006-metrics.js +1 -1
- package/engine/db/migrations/007-watches.js +2 -2
- package/engine/db/migrations/008-small-state.js +1 -1
- package/engine/db/migrations/009-qa.js +1 -1
- package/engine/db/migrations/010-pr-links.js +1 -1
- package/engine/db/migrations/011-remaining-state.js +1 -1
- package/engine/db/migrations/012-steering-deliveries.js +2 -2
- package/engine/db/migrations/013-backfill-broken-note-links.js +1 -1
- package/engine/db/migrations/014-pr-fix-target-prefs.js +2 -2
- package/engine/db/migrations/015-plans-prds.js +0 -0
- package/engine/db/migrations/018-sql-only-cutover.js +2 -2
- package/engine/db/migrations/021-archived-work-items.js +1 -1
- package/engine/db/migrations/022-global-cc-session.js +1 -1
- package/engine/db/migrations/023-engine-state.js +1 -1
- package/engine/db/migrations/025-malformed-work-item-phantoms.js +1 -1
- package/engine/db/migrations/027-review-learning-lifecycle.js +1 -1
- package/engine/db/migrations/029-repair-reused-versions.js +20 -0
- package/engine/db/migrations/031-pr-author-identity.js +137 -0
- package/engine/{consolidation.js → memory/consolidation.js} +6 -6
- package/engine/{kb-sweep-runner.js → memory/kb-sweep-runner.js} +2 -2
- package/engine/{kb-sweep.js → memory/kb-sweep.js} +9 -7
- package/engine/{memory-retrieval.js → memory/memory-retrieval.js} +46 -4
- package/engine/{memory-store.js → memory/memory-store.js} +3 -3
- package/engine/{promotion.js → memory/promotion.js} +3 -3
- package/engine/{review-learning-backfill.js → memory/review-learning-backfill.js} +6 -6
- package/engine/{review-learning.js → memory/review-learning.js} +10 -5
- package/engine/{diagnostics-memory.js → observability/diagnostics-memory.js} +1 -1
- package/engine/{logs-store.js → observability/logs-store.js} +5 -5
- package/engine/{metrics-store.js → observability/metrics-store.js} +4 -4
- package/engine/{check-status.js → operations/check-status.js} +3 -3
- package/engine/{cli.js → operations/cli.js} +271 -113
- package/engine/{distribution.js → operations/distribution.js} +5 -6
- package/engine/{cleanup.js → orchestration/cleanup.js} +72 -45
- package/engine/{cooldown.js → orchestration/cooldown.js} +5 -5
- package/engine/{dispatch-events.js → orchestration/dispatch-events.js} +2 -2
- package/engine/{dispatch.js → orchestration/dispatch.js} +129 -36
- package/engine/orchestration/failed-scheduled-cleanup.js +274 -0
- package/engine/{lifecycle.js → orchestration/lifecycle.js} +198 -90
- package/engine/{meeting.js → orchestration/meeting.js} +6 -16
- package/engine/{pipeline.js → orchestration/pipeline.js} +12 -12
- package/engine/{pre-dispatch-eval.js → orchestration/pre-dispatch-eval.js} +10 -9
- package/engine/{routing.js → orchestration/routing.js} +3 -3
- package/engine/{schedule-bootstrap.js → orchestration/schedule-bootstrap.js} +4 -4
- package/engine/{scheduler.js → orchestration/scheduler.js} +38 -8
- package/engine/{timeout.js → orchestration/timeout.js} +158 -109
- package/engine/{db-events.js → persistence/db-events.js} +2 -2
- package/engine/{dispatch-store.js → persistence/dispatch-store.js} +7 -7
- package/engine/{inbox-store.js → persistence/inbox-store.js} +2 -2
- package/engine/{note-link-backfill.js → persistence/note-link-backfill.js} +4 -4
- package/engine/{pr-fix-target-store.js → persistence/pr-fix-target-store.js} +8 -8
- package/engine/{pull-requests-store.js → persistence/pull-requests-store.js} +21 -7
- package/engine/{small-state-store.js → persistence/small-state-store.js} +31 -31
- package/engine/persistence/state-operations.js +350 -0
- package/engine/{steering-store.js → persistence/steering-store.js} +6 -6
- package/engine/{issues.js → planning/issues.js} +2 -2
- package/engine/{plan-prd-validation.js → planning/plan-prd-validation.js} +8 -2
- package/engine/planning/prd-result-sidecar.js +190 -0
- package/engine/{prd-store.js → planning/prd-store.js} +17 -17
- package/engine/{project-discovery.js → planning/project-discovery.js} +5 -5
- package/engine/{projects.js → planning/projects.js} +10 -10
- package/engine/{resolve-area.js → planning/resolve-area.js} +1 -1
- package/engine/{work-item-validation.js → planning/work-item-validation.js} +39 -3
- package/engine/{work-items-store.js → planning/work-items-store.js} +29 -21
- package/engine/{keep-process-sweep.js → processes/keep-process-sweep.js} +57 -17
- package/engine/{managed-spawn-launcher.js → processes/managed-spawn-launcher.js} +3 -3
- package/engine/{managed-spawn.js → processes/managed-spawn.js} +97 -46
- package/engine/{process-utils.js → processes/process-utils.js} +599 -55
- package/engine/{abandoned-pr-reconciliation.js → providers/abandoned-pr-reconciliation.js} +17 -7
- package/engine/{comment-classifier.js → providers/comment-classifier.js} +85 -17
- package/engine/{comment-format.js → providers/comment-format.js} +5 -5
- package/engine/{gh-comment.js → providers/gh-comment.js} +15 -15
- package/engine/{gh-token.js → providers/gh-token.js} +4 -4
- package/engine/{github.js → providers/github.js} +131 -54
- package/engine/{pr-action.js → providers/pr-action.js} +13 -12
- package/engine/{pr-clone-keep.js → providers/pr-clone-keep.js} +7 -7
- package/engine/{pr-devbox.js → providers/pr-devbox.js} +6 -6
- package/engine/{pr-fix-target.js → providers/pr-fix-target.js} +13 -13
- package/engine/{pr-remote-patch.js → providers/pr-remote-patch.js} +4 -4
- package/engine/{pr-resolve.js → providers/pr-resolve.js} +7 -7
- package/engine/{pr-temp-clone.js → providers/pr-temp-clone.js} +5 -5
- package/engine/{pr-track.js → providers/pr-track.js} +11 -13
- package/engine/{shared-branch-pr-reconcile.js → providers/shared-branch-pr-reconcile.js} +4 -4
- package/engine/qa/auto-prd-qa.js +313 -0
- package/engine/{qa-from-prd.js → qa/from-prd.js} +42 -12
- package/engine/qa/prd-session.js +240 -0
- package/engine/{qa-process-validation.js → qa/process-validation.js} +14 -9
- package/engine/{qa-runbooks.js → qa/runbooks.js} +1 -1
- package/engine/{qa-runs.js → qa/runs.js} +286 -15
- package/engine/{qa-sessions.js → qa/sessions.js} +595 -49
- package/engine/qa/visual-journey.js +654 -0
- package/engine/{qa-runners.js → qa-runners/index.js} +7 -7
- package/engine/qa-runners/maestro.js +3 -3
- package/engine/qa-runners/playwright.js +2 -2
- package/engine/{restart-health.js → recovery/restart-health.js} +48 -4
- package/engine/recovery/stop-stack.js +607 -0
- package/engine/{supervisor.js → recovery/supervisor.js} +105 -175
- package/engine/{watchdog.js → recovery/watchdog.js} +136 -13
- package/engine/runtimes/claude.js +14 -12
- package/engine/runtimes/codex.js +8 -6
- package/engine/runtimes/copilot.js +17 -16
- package/engine/{watch-actions.js → watches/actions.js} +13 -13
- package/engine/{watches.js → watches/index.js} +43 -32
- package/engine/{watches-store.js → watches/store.js} +4 -4
- package/engine/{create-pr-worktree.js → worktrees/create-pr.js} +1 -1
- package/engine/{worktree-gc.js → worktrees/gc.js} +70 -22
- package/engine/worktrees/inventory.js +671 -0
- package/engine/{live-checkout.js → worktrees/live-checkout.js} +4 -4
- package/engine/{worktree-pool.js → worktrees/pool.js} +2 -2
- package/engine/{worktree-preflight.js → worktrees/preflight.js} +1 -0
- package/engine/worktrees/quarantine-refs.js +173 -0
- package/engine.js +1137 -208
- package/minions.js +147 -77
- package/package.json +10 -6
- package/playbooks/_pr-description-audit.md +110 -78
- package/playbooks/build-fix-complex.md +2 -0
- package/playbooks/fix.md +16 -12
- package/playbooks/implement-shared.md +2 -0
- package/playbooks/implement.md +19 -20
- package/playbooks/plan-to-prd.md +18 -3
- package/playbooks/qa-session-draft.md +136 -1
- package/playbooks/qa-session-execute.md +80 -2
- package/playbooks/qa-session-setup.md +17 -1
- package/playbooks/qa-validate.md +1 -1
- package/playbooks/setup.md +2 -0
- package/playbooks/shared-rules.md +25 -32
- package/playbooks/templates/followup-dispatch.md +4 -3
- package/playbooks/verify.md +1 -1
- package/prompts/cc-system.md +19 -27
- package/watch-plugins/README.md +92 -0
- package/watch-plugins/ado-author-prs.js +336 -0
- package/watch-plugins/gh-author-prs.js +375 -0
- package/watch-plugins/http.js +474 -0
- package/watch-plugins/teams-channel.js +869 -0
- package/docs/dev-composite-workflow.md +0 -101
- package/docs/pr-screenshots/pr-886/after-single-header.png +0 -0
- package/docs/pr-screenshots/pr-886/before-duplicate-header.png +0 -0
- package/docs/pr-screenshots/pr-895/01-cancellation-reason-detail.png +0 -0
- package/docs/pr-screenshots/pr-899/worker-pool-worktrees-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-899/worker-pool-worktrees-BEFORE.png +0 -0
- package/docs/pr-screenshots/pr-901/projects-tab-default.png +0 -0
- package/docs/pr-screenshots/pr-901/projects-tab-fmf-selected.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-AFTER-crop.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-BEFORE-crop.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-BEFORE.png +0 -0
- package/docs/pr-screenshots/pr-916/model-picker-dropdown-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-979/auto-fix-pane-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-979/auto-fix-pane-BEFORE.png +0 -0
- package/docs/pr-screenshots/pr-985/pr-column-em-dash-AFTER.png +0 -0
- package/docs/pr-screenshots/pr-985/pr-column-em-dash-BEFORE.png +0 -0
- package/docs/visual-evidence-ci.md +0 -103
- package/engine/bridge.js +0 -379
- package/engine/quarantine-refs.js +0 -103
- package/engine/state-operations.js +0 -178
- /package/engine/{steering-constraints.js → agents/steering-constraints.js} +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Default-branch CI (post-merge gate)
|
|
2
|
+
|
|
3
|
+
Companion to the PR gate. Workflows:
|
|
4
|
+
|
|
5
|
+
| Workflow | Trigger | Runs |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `.github/workflows/pr-tests.yml` | `pull_request` → `main`, `workflow_dispatch`, `workflow_call` | `npm run lint` + `npm test` (blocking) and the perf bucket (non-blocking) |
|
|
8
|
+
| `.github/workflows/default-branch-tests.yml` | `push` → `main`, `workflow_dispatch` | Calls the PR gate, then files/updates a tracking issue on failure |
|
|
9
|
+
|
|
10
|
+
## Why a post-merge gate is required
|
|
11
|
+
|
|
12
|
+
A `pull_request` gate proves each branch green **at its own tip**. It cannot
|
|
13
|
+
prove the **merged** tree green, because that tree does not exist until the
|
|
14
|
+
merge lands.
|
|
15
|
+
|
|
16
|
+
The motivating class of defect is merge-order breakage: two PRs are each green
|
|
17
|
+
in isolation, merge cleanly (no textual conflict), and are broken only in
|
|
18
|
+
combination — one removes an identifier while the other adds a reference to it.
|
|
19
|
+
Nothing in either PR's diff is wrong; the *combination* is. Concretely, the
|
|
20
|
+
incident that produced this workflow left dangling identifier references in a
|
|
21
|
+
module, so every consumer failed at load time. That turned `npm run lint` red
|
|
22
|
+
with `no-undef` errors and cascaded a whole suite off a single load error — on
|
|
23
|
+
PRs whose diffs never touched the code, including a docs-only PR.
|
|
24
|
+
|
|
25
|
+
Without a post-merge run:
|
|
26
|
+
|
|
27
|
+
- the first signal is unrelated PRs turning red hours later;
|
|
28
|
+
- the signal is ambiguous, because it appears on diffs that cannot explain it;
|
|
29
|
+
- triage cost lands on whoever opens the next PR, not on the merge that broke it.
|
|
30
|
+
|
|
31
|
+
The post-merge gate makes the merged tree the thing that is executed, so the
|
|
32
|
+
break is reported against the merge commit that caused it, immediately, and
|
|
33
|
+
independently of anyone opening a PR.
|
|
34
|
+
|
|
35
|
+
## Reuse direction is load-bearing
|
|
36
|
+
|
|
37
|
+
`default-branch-tests.yml` **calls** `pr-tests.yml` (`uses:
|
|
38
|
+
./.github/workflows/pr-tests.yml`). The reuse must point that way, not the
|
|
39
|
+
reverse:
|
|
40
|
+
|
|
41
|
+
- A reusable-workflow *call* renames the resulting check from `Unit Tests` to
|
|
42
|
+
`<caller job> / Unit Tests`. The branch ruleset on `main` requires the status
|
|
43
|
+
check context `Unit Tests` **by exact string**, so making the PR gate a caller
|
|
44
|
+
of a shared workflow would leave every PR waiting on a check that can never
|
|
45
|
+
report.
|
|
46
|
+
- Copying the job into a second workflow instead of calling it is the other
|
|
47
|
+
failure mode: the copy drifts, and the post-merge gate quietly stops testing
|
|
48
|
+
what the PR gate tests — which is the same "nobody executes this combination"
|
|
49
|
+
hole in a new place.
|
|
50
|
+
|
|
51
|
+
So the job definition lives once, in `pr-tests.yml`, and the post-merge
|
|
52
|
+
workflow is a thin caller.
|
|
53
|
+
|
|
54
|
+
## Cost controls
|
|
55
|
+
|
|
56
|
+
- The non-blocking perf bucket opts out of the post-merge run
|
|
57
|
+
(`if: ${{ github.event_name != 'push' }}`; inside a called workflow
|
|
58
|
+
`github.event_name` is the *caller's* event). It is already non-blocking on
|
|
59
|
+
PRs, so re-running it after the merge buys no gating signal.
|
|
60
|
+
- `concurrency` is keyed on the ref with `cancel-in-progress: true`. The gate
|
|
61
|
+
answers "is the default branch healthy right now?", and a superseded run's
|
|
62
|
+
tree is a strict ancestor of the newer one, so a defect that is still present
|
|
63
|
+
is still caught. The trade-off is deliberate: a defect introduced *and*
|
|
64
|
+
reverted between two runs is not separately reported.
|
|
65
|
+
- No matrix dimension is added. Runner topology follows the fork
|
|
66
|
+
(`ubuntu-latest` here; see [distribution.md](distribution.md) for the dual-CI
|
|
67
|
+
split).
|
|
68
|
+
|
|
69
|
+
## When it goes red
|
|
70
|
+
|
|
71
|
+
The failing run is the primary signal. `report-failure` additionally opens — or
|
|
72
|
+
comments on, if one is already open — an issue titled
|
|
73
|
+
`Default branch is red: post-merge gate failing on main`, so the breakage has an
|
|
74
|
+
owner and a place to record the fix-forward-or-revert decision. Lookup is an
|
|
75
|
+
exact-title match over `gh issue list` (a single JSON array, pull requests
|
|
76
|
+
excluded, internally paginated) rather than the search API, which is eventually
|
|
77
|
+
consistent and would file a duplicate on the next failing merge.
|
|
78
|
+
|
|
79
|
+
Issue filing is scoped to `github.ref == 'refs/heads/main'` so a manual
|
|
80
|
+
`workflow_dispatch` used to exercise the wiring never files an issue.
|
|
81
|
+
|
|
82
|
+
## Lockfile versions must exist in the self-hosted runner's reachable registry
|
|
83
|
+
|
|
84
|
+
yemi33's blocking lanes — `pr-tests.yml`'s `Unit Tests (Windows)` and
|
|
85
|
+
`publish.yml`'s `validate` — run on a corporate-managed self-hosted Windows
|
|
86
|
+
host, and that host has two properties that together constrain what the
|
|
87
|
+
committed lockfile is allowed to contain:
|
|
88
|
+
|
|
89
|
+
1. **`registry.npmjs.org` is unreachable from it.** The connection is rejected
|
|
90
|
+
during the TLS handshake (`schannel: SEC_E_ILLEGAL_MESSAGE`, npm reports
|
|
91
|
+
`ERR_SSL_SSL/TLS_ALERT_HANDSHAKE_FAILURE`), not merely proxied.
|
|
92
|
+
2. **npm is pointed at an internal Azure Artifacts mirror** by the machine's
|
|
93
|
+
user and global `npmrc`. npm's default `replace-registry-host=npmjs` then
|
|
94
|
+
rewrites every `registry.npmjs.org` tarball URL in the committed lockfile to
|
|
95
|
+
that mirror at install time, so `resolved` in `package-lock.json` describes
|
|
96
|
+
intent, not the host actually contacted.
|
|
97
|
+
|
|
98
|
+
So the self-hosted lane can only install versions the mirror actually carries,
|
|
99
|
+
and a lockfile entry the mirror lacks fails `npm ci` with `E404` — taking down
|
|
100
|
+
the PR gate *and* the npm release, since `validate` gates `publish`.
|
|
101
|
+
|
|
102
|
+
**Pinning the public registry in CI does not fix this** — not via
|
|
103
|
+
`actions/setup-node`'s `registry-url`, not via `NPM_CONFIG_REGISTRY`, not via
|
|
104
|
+
`npm ci --registry=…`. All three only convert the `E404` into a TLS handshake
|
|
105
|
+
failure, because property 1 is a network-level block. The mirror is the only
|
|
106
|
+
package source that lane has.
|
|
107
|
+
|
|
108
|
+
A candidate version must therefore satisfy **two** independent constraints:
|
|
109
|
+
it has to exist on the mirror, *and* it has to sit at or above its security
|
|
110
|
+
patch floor. Availability alone is not a sufficient reason to choose a version.
|
|
111
|
+
|
|
112
|
+
The worked precedent is `brace-expansion`. A transitive dev-dependency bump
|
|
113
|
+
from 1.1.16 to 1.1.18 (opg#1170, backported as yemi33#4299) moved the lockfile
|
|
114
|
+
past the mirror, which serves `1.1.16` but returns 404 for `1.1.17` and
|
|
115
|
+
`1.1.18` while remaining current for everything else. Reverting the lockfile to
|
|
116
|
+
1.1.16 restores `npm ci` — and is **not** an acceptable fix: 1.1.16 is
|
|
117
|
+
vulnerable to GHSA-mh99-v99m-4gvg (CVE-2026-14257, HIGH), whose 1.x patch floor
|
|
118
|
+
is exactly the missing 1.1.17. The org's `GitOps/AdvancedSecurity` dependency
|
|
119
|
+
review correctly fails such a PR with `Dependency review detected vulnerable`,
|
|
120
|
+
and that check is org-managed — it cannot be configured away from this repo.
|
|
121
|
+
|
|
122
|
+
Comparing the two sides settles it. The mirror's newest per major line was
|
|
123
|
+
`1.1.16 / 2.1.2 / 3.0.2 / 4.0.1 / 5.0.8`; the advisory's patch floors are
|
|
124
|
+
`1.1.17 / 2.1.3 / 3.0.3 / 5.0.8`. Only **5.0.8** satisfies both. But
|
|
125
|
+
`brace-expansion` 5.x exports a named `expand` rather than a callable default,
|
|
126
|
+
so forcing it under `minimatch@3.x` fails at require time with
|
|
127
|
+
`TypeError: expand is not a function` — meaning no `overrides` entry on
|
|
128
|
+
`brace-expansion` alone can work.
|
|
129
|
+
|
|
130
|
+
The fix is to move the *parent*. `eslint@10` drops `@eslint/eslintrc` and
|
|
131
|
+
depends on `minimatch@^10.2.5`, which in turn depends on
|
|
132
|
+
`brace-expansion@^5.0.5` and resolves to the patched, mirror-available 5.0.8.
|
|
133
|
+
So the tree lands on a non-vulnerable version by ordinary resolution, with **no
|
|
134
|
+
`overrides` entry at all** — nothing forced against a declared range, and
|
|
135
|
+
nothing for Dependabot to re-propose and re-break.
|
|
136
|
+
|
|
137
|
+
The rule to carry forward: when the mirror lacks a version, do not pin below a
|
|
138
|
+
security patch floor to buy availability. Find a version that satisfies both,
|
|
139
|
+
upgrading the dependency's parent when the compatible-and-patched version lives
|
|
140
|
+
in a newer major. If no such version exists, escalate to the mirror owners to
|
|
141
|
+
have the patched version stocked rather than shipping a known-vulnerable pin.
|
|
142
|
+
Confirm availability from the runner host with
|
|
143
|
+
`npm view <pkg> versions --json`, and check the floor against the advisory
|
|
144
|
+
(`gh api /advisories/<GHSA-id>`).
|
|
145
|
+
|
|
146
|
+
## Merge queue: evaluated, deliberately not implemented
|
|
147
|
+
|
|
148
|
+
A GitHub merge queue is the strictly stronger answer to this defect class: it
|
|
149
|
+
builds the *prospective* merged result and tests it **before** it lands, so a
|
|
150
|
+
merge-order break is **prevented** rather than detected after the fact. It was
|
|
151
|
+
evaluated and rejected for now on three repo-specific grounds:
|
|
152
|
+
|
|
153
|
+
1. **It would be routinely bypassed.** Merges here are performed with
|
|
154
|
+
`gh pr merge --admin` (the documented policy for this repo, and what the
|
|
155
|
+
engine's auto-merge path uses). Administrative merges bypass the queue
|
|
156
|
+
entirely, so the queue would give assurance it is not actually providing —
|
|
157
|
+
worse than an honest post-merge gate. Adopting a queue therefore requires
|
|
158
|
+
first changing how merges are performed, which is a policy change, not a CI
|
|
159
|
+
change.
|
|
160
|
+
2. **Cost and latency.** A queue runs a full CI pass per queued PR against a
|
|
161
|
+
speculative merge commit. This repository merges frequently (agent PRs,
|
|
162
|
+
scheduled review PRs, dependabot), so the queue would multiply full runs and
|
|
163
|
+
serialize merges behind an ~8-minute lint + unit pass.
|
|
164
|
+
3. **It is not free to wire correctly.** The required check must also report on
|
|
165
|
+
`merge_group` events; if the workflow does not trigger on `merge_group`, the
|
|
166
|
+
queue stalls indefinitely waiting for a check that never runs. That is a
|
|
167
|
+
sharper failure mode than the one being fixed and deserves its own change.
|
|
168
|
+
|
|
169
|
+
The post-merge gate is cheap, correct regardless of merge method (including
|
|
170
|
+
`--admin`), and closes the *detection* hole today. Revisit the merge queue if
|
|
171
|
+
and when administrative-bypass merging stops being the norm; at that point this
|
|
172
|
+
workflow's job-reuse structure is already the piece a `merge_group` trigger
|
|
173
|
+
would hang off.
|
package/docs/deprecated.json
CHANGED
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
"description": "Legacy per-agent descriptive-metadata array `agents.<id>.skills` in config.json, renamed to `agents.<id>.expertise` to remove the name collision with executable runtime/harness skills (SKILL.md). The tags appear in the agent identity prompt and provide a soft preference to `pickReReviewAgentHints` when selecting a re-reviewer; they are not hard routing constraints. A read-compat shim honors the old key so operator configs still carrying `skills` (and no `expertise`) keep working.",
|
|
5
5
|
"code": [
|
|
6
6
|
{
|
|
7
|
-
"file": "engine/playbook.js",
|
|
7
|
+
"file": "engine/agents/playbook.js",
|
|
8
8
|
"lines": "1094",
|
|
9
9
|
"note": "buildSystemPrompt reads `agent.expertise ?? agent.skills ?? []` for the `Expertise:` identity line"
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
|
-
"file": "engine/lifecycle.js",
|
|
12
|
+
"file": "engine/orchestration/lifecycle.js",
|
|
13
13
|
"lines": "5317-5321",
|
|
14
14
|
"note": "pickReReviewAgentHints reads `agent.expertise` with an `agent.skills` array fallback"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
|
-
"file": "engine/queries.js",
|
|
17
|
+
"file": "engine/core/queries.js",
|
|
18
18
|
"lines": "830-832",
|
|
19
19
|
"note": "getAgents normalizes `expertise: a.expertise ?? a.skills ?? []` so the dashboard/settings UI always receives `expertise`"
|
|
20
20
|
},
|
|
@@ -26,19 +26,19 @@
|
|
|
26
26
|
],
|
|
27
27
|
"removalGate": "Telemetry / a config sweep across all known engines must show no persisted `config.agents.<id>.skills` key (only `expertise`) for >=30 consecutive days, confirming every operator config has been re-saved through the dashboard (which drops the legacy key) or hand-migrated.",
|
|
28
28
|
"targetRemovalDate": "2026-09-17",
|
|
29
|
-
"notes": "Safe to remove on or after 2026-09-17 (~3 release windows) once the removal gate clears. Removal scope: drop the `?? agent.skills` / `?? a.skills` fallbacks in engine/playbook.js:1094, engine/lifecycle.js:5317-5319, and engine/queries.js:832; drop the `updates.skills` legacy branch + `delete config.agents[id].skills` in dashboard.js:11245-11252; and update docs/named-agents.md to stop mentioning the legacy key. Does NOT touch the unrelated executable-skills system (queries.js harnesses, runtime adapters, dashboard renderSkills, SKILL.md tooling)."
|
|
29
|
+
"notes": "Safe to remove on or after 2026-09-17 (~3 release windows) once the removal gate clears. Removal scope: drop the `?? agent.skills` / `?? a.skills` fallbacks in engine/agents/playbook.js:1094, engine/orchestration/lifecycle.js:5317-5319, and engine/core/queries.js:832; drop the `updates.skills` legacy branch + `delete config.agents[id].skills` in dashboard.js:11245-11252; and update docs/named-agents.md to stop mentioning the legacy key. Does NOT touch the unrelated executable-skills system (queries.js harnesses, runtime adapters, dashboard renderSkills, SKILL.md tooling)."
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"id": "config-poll-key-migration",
|
|
33
|
-
"location": "engine/queries.js:126-163",
|
|
33
|
+
"location": "engine/core/queries.js:126-163",
|
|
34
34
|
"function": "migrateDeprecatedConfigPollKeysOnce",
|
|
35
35
|
"reason": "One-time boot migration that renames legacy engine config keys (adoPollStatusEvery → prPollStatusEvery, adoPollCommentsEvery → prPollCommentsEvery). Keys were renamed on 2026-04-16; this shim ensures any persisted config.json on a long-lived host gets transparently rewritten on next boot.",
|
|
36
36
|
"targetRemovalDate": "2026-08-09",
|
|
37
|
-
"notes": "Safe to delete on or after 2026-08-09 (3 months after the rename) once we are confident every engine has rebooted at least once and the closure-flagged migration (_configPollKeyMigrationChecked at line 124) is no longer reachable on any persisted config. Removal is one function + the call site in getConfig() at engine/queries.js:166."
|
|
37
|
+
"notes": "Safe to delete on or after 2026-08-09 (3 months after the rename) once we are confident every engine has rebooted at least once and the closure-flagged migration (_configPollKeyMigrationChecked at line 124) is no longer reachable on any persisted config. Removal is one function + the call site in getConfig() at engine/core/queries.js:166."
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"id": "legacy-done-aliases",
|
|
41
|
-
"location": "engine/cleanup.js:1165-1166",
|
|
41
|
+
"location": "engine/orchestration/cleanup.js:1165-1166",
|
|
42
42
|
"constants": [
|
|
43
43
|
"LEGACY_DONE_ALIASES",
|
|
44
44
|
"LEGACY_NEEDS_REVIEW_STATUS"
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"reason": "Read-side tolerance: cleanup sweep auto-migrates four obsolete work-item / PRD status strings ('in-pr', 'implemented', 'complete', 'needs-human-review') to the canonical 'done' / 'failed' values. The aliases are no longer written anywhere in the engine; the constants exist only to repair stale SQL records imported from old engine versions.",
|
|
47
47
|
"status": "active",
|
|
48
48
|
"targetRemovalDate": null,
|
|
49
|
-
"notes": "Keep indefinitely until telemetry shows zero migrations for 30 consecutive days across all project scopes and PRDs. At that point the constants and both _migrateLegacyItem branches in engine/cleanup.js can be deleted."
|
|
49
|
+
"notes": "Keep indefinitely until telemetry shows zero migrations for 30 consecutive days across all project scopes and PRDs. At that point the constants and both _migrateLegacyItem branches in engine/orchestration/cleanup.js can be deleted."
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
"id": "config-claude-binary-override",
|
|
@@ -58,17 +58,17 @@
|
|
|
58
58
|
"note": "resolveBinary() respects config.claude.binary on every Claude spawn (probes npm package dir or direct binary path)"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
|
-
"file": "engine/shared.js",
|
|
61
|
+
"file": "engine/core/shared.js",
|
|
62
62
|
"lines": "2482-2496",
|
|
63
63
|
"note": "warnings.push({ id: 'deprecated-config-claude' }) — surface-only; never deletes the override"
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
"file": "engine/shared.js",
|
|
66
|
+
"file": "engine/core/shared.js",
|
|
67
67
|
"lines": "3120-3124",
|
|
68
68
|
"note": "DEFAULT_CLAUDE.binary baseline that the warning + prune logic compares against"
|
|
69
69
|
}
|
|
70
70
|
],
|
|
71
|
-
"removalGate": "Telemetry: the `deprecated-config-claude` warning emitted at engine/shared.js:2492-2495 must report zero hits across all known engines for >=30 consecutive days, AND a sweep of every persisted config.json must show no `config.claude.binary` value that diverges from DEFAULT_CLAUDE.binary. Only then is the override branch in resolveBinary() (engine/runtimes/claude.js:82-86) removable, along with the `_deprecatedConfigClaudeFields` membership for `binary` and the warning emitter at engine/shared.js:2482-2496.",
|
|
71
|
+
"removalGate": "Telemetry: the `deprecated-config-claude` warning emitted at engine/core/shared.js:2492-2495 must report zero hits across all known engines for >=30 consecutive days, AND a sweep of every persisted config.json must show no `config.claude.binary` value that diverges from DEFAULT_CLAUDE.binary. Only then is the override branch in resolveBinary() (engine/runtimes/claude.js:82-86) removable, along with the `_deprecatedConfigClaudeFields` membership for `binary` and the warning emitter at engine/core/shared.js:2482-2496.",
|
|
72
72
|
"status": "active",
|
|
73
73
|
"targetRemovalDate": null,
|
|
74
74
|
"notes": "Do NOT set targetRemovalDate — removal must be signal-gated, not calendar-gated. This entry is paired with `prune-default-claude-config`: the prune strips DEFAULT-matching values but intentionally preserves user overrides, which is precisely why the override branch in claude.js stays reachable. Removing the override before the prune entry's gate clears would silently break installs that still rely on a custom binary path."
|
|
@@ -78,12 +78,12 @@
|
|
|
78
78
|
"description": "applyLegacyCcModelMigration: in-memory shim that promotes legacy `engine.ccModel` to `engine.defaultModel` when defaultModel is unset, so single-model installs keep working after the runtime fleet refactor (P-3b8e5f1d). No on-disk rewrite — the persisted config.json continues to carry the legacy `ccModel` field. Called unconditionally on every engine boot from cli.start().",
|
|
79
79
|
"code": [
|
|
80
80
|
{
|
|
81
|
-
"file": "engine/shared.js",
|
|
81
|
+
"file": "engine/core/shared.js",
|
|
82
82
|
"lines": "2407",
|
|
83
83
|
"note": "applyLegacyCcModelMigration definition (function signature + once-per-process flag via _resetLegacyCcModelMigrationFlag)"
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
|
-
"file": "engine/cli.js",
|
|
86
|
+
"file": "engine/operations/cli.js",
|
|
87
87
|
"lines": "477",
|
|
88
88
|
"note": "Boot call site inside start(); wrapped in try/catch so a migration failure cannot block startup"
|
|
89
89
|
},
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"note": "Source-inspection test pinning the cli.js boot call site"
|
|
114
114
|
}
|
|
115
115
|
],
|
|
116
|
-
"removalGate": "Telemetry: the once-per-boot deprecation log line emitted by applyLegacyCcModelMigration (via the injected logger at engine/shared.js:2407) must show zero promotion events across all known engines for >=30 consecutive days, AND a sweep of every persisted config.json must confirm no `engine.ccModel` field remains. Once both conditions hold, removal deletes the function + _resetLegacyCcModelMigrationFlag export at engine/shared.js:4977, the boot call at engine/cli.js:477, the CLAUDE.md:316 paragraph and docs/slim-ux/concepts.md:671 reference, and the tests at runtime-fleet-helpers.test.js:209-254 + :500-505 + unit.test.js:19801.",
|
|
116
|
+
"removalGate": "Telemetry: the once-per-boot deprecation log line emitted by applyLegacyCcModelMigration (via the injected logger at engine/core/shared.js:2407) must show zero promotion events across all known engines for >=30 consecutive days, AND a sweep of every persisted config.json must confirm no `engine.ccModel` field remains. Once both conditions hold, removal deletes the function + _resetLegacyCcModelMigrationFlag export at engine/core/shared.js:4977, the boot call at engine/operations/cli.js:477, the CLAUDE.md:316 paragraph and docs/slim-ux/concepts.md:671 reference, and the tests at runtime-fleet-helpers.test.js:209-254 + :500-505 + unit.test.js:19801.",
|
|
117
117
|
"status": "active",
|
|
118
118
|
"targetRemovalDate": null,
|
|
119
119
|
"notes": "Do NOT set targetRemovalDate — gating is signal-based. The function is silent on no-op (returns false without logging), so the meaningful telemetry signal is the absence of the promotion log line over the sweep window, NOT the absence of function invocations (cli.js calls it every boot regardless)."
|
|
@@ -123,12 +123,12 @@
|
|
|
123
123
|
"description": "pruneDefaultClaudeConfig: active sanitizer that strips generated `config.claude.{binary,outputFormat,allowedTools,permissionMode}` defaults from persisted config.json so the `deprecated-config-claude` warning stops tripping on stale defaults left by older `minions init` versions. Sub-cluster of `config-claude-binary-override` — the prune deliberately preserves non-default user overrides (binary/allowedTools), which is what keeps the override branch in engine/runtimes/claude.js load-bearing.",
|
|
124
124
|
"code": [
|
|
125
125
|
{
|
|
126
|
-
"file": "engine/shared.js",
|
|
126
|
+
"file": "engine/core/shared.js",
|
|
127
127
|
"lines": "3126",
|
|
128
128
|
"note": "pruneDefaultClaudeConfig definition: preserves non-default binary/allowedTools, always strips permissionMode + outputFormat"
|
|
129
129
|
},
|
|
130
130
|
{
|
|
131
|
-
"file": "engine/shared.js",
|
|
131
|
+
"file": "engine/core/shared.js",
|
|
132
132
|
"lines": "5673",
|
|
133
133
|
"note": "Module export entry"
|
|
134
134
|
},
|
|
@@ -168,24 +168,24 @@
|
|
|
168
168
|
"note": "Source-inspection test pinning the dashboard handler call site"
|
|
169
169
|
}
|
|
170
170
|
],
|
|
171
|
-
"removalGate": "Telemetry: pruneDefaultClaudeConfig must return false (no mutation) for every call across all known engines for >=30 consecutive days (add an `_engine.pruneDefaultClaudeConfigStrips` counter if needed to observe this), AND the parent `config-claude-binary-override` entry must have already cleared its own gate. The dependency is strict: removing the prune while users still rely on the override branch would surface the `deprecated-config-claude` warning on every stale generated default. Once both conditions hold, removal is the function definition (engine/shared.js:3126), the export at :5673, all 5 call sites (dashboard.js:202, :9116, :9331, :9450; minions.js:385), and the tests at unit.test.js:2260-2303 + runtime-fleet-helpers.test.js:546.",
|
|
171
|
+
"removalGate": "Telemetry: pruneDefaultClaudeConfig must return false (no mutation) for every call across all known engines for >=30 consecutive days (add an `_engine.pruneDefaultClaudeConfigStrips` counter if needed to observe this), AND the parent `config-claude-binary-override` entry must have already cleared its own gate. The dependency is strict: removing the prune while users still rely on the override branch would surface the `deprecated-config-claude` warning on every stale generated default. Once both conditions hold, removal is the function definition (engine/core/shared.js:3126), the export at :5673, all 5 call sites (dashboard.js:202, :9116, :9331, :9450; minions.js:385), and the tests at unit.test.js:2260-2303 + runtime-fleet-helpers.test.js:546.",
|
|
172
172
|
"status": "active",
|
|
173
173
|
"targetRemovalDate": null,
|
|
174
174
|
"notes": "Do NOT set targetRemovalDate — gating is signal-based AND ordered. This entry MUST NOT be removed before `config-claude-binary-override` clears its gate, otherwise installs with stale defaults will flood the deprecation channel until their next config save. The 5 call sites form a complete coverage net: load (dashboard.js:202 + minions.js:385) + save (dashboard.js:9116/9331/9450), so any code path that touches config.json runs the sanitizer."
|
|
175
175
|
},
|
|
176
176
|
{
|
|
177
177
|
"id": "ado-throttle-arg-less-shim",
|
|
178
|
-
"description": "Arg-less form of isAdoThrottled() in engine/ado.js. Introduced by W-mq03l6zh0006f0a1-b as a back-compat shim during the per-org ADO throttle isolation rollout: pre-rollout, isAdoThrottled() collapsed the single process-global tracker to one boolean; post-rollout, the canonical form is isAdoThrottled(orgBase) against the per-org Map. The arg-less call site is preserved transiently so engine code (and any in-process callers) that haven't yet been threaded through with a per-org `orgBase` keep returning the safe global-OR (true if ANY org is currently throttled) — preventing a regression where new poll work bypasses a still-warm throttle backoff on an unrelated noisy org.",
|
|
178
|
+
"description": "Arg-less form of isAdoThrottled() in engine/ado/index.js. Introduced by W-mq03l6zh0006f0a1-b as a back-compat shim during the per-org ADO throttle isolation rollout: pre-rollout, isAdoThrottled() collapsed the single process-global tracker to one boolean; post-rollout, the canonical form is isAdoThrottled(orgBase) against the per-org Map. The arg-less call site is preserved transiently so engine code (and any in-process callers) that haven't yet been threaded through with a per-org `orgBase` keep returning the safe global-OR (true if ANY org is currently throttled) — preventing a regression where new poll work bypasses a still-warm throttle backoff on an unrelated noisy org.",
|
|
179
179
|
"deprecated": "2026-06-04",
|
|
180
180
|
"status": "removed",
|
|
181
181
|
"removedDate": "2026-06-25",
|
|
182
182
|
"code": [
|
|
183
183
|
{
|
|
184
|
-
"file": "engine/ado.js",
|
|
184
|
+
"file": "engine/ado/index.js",
|
|
185
185
|
"note": "isAdoThrottled() arg-less branch and the global-OR fold over the per-org Map. Single call site to migrate: shared.getAdoOrgBase(project) is already in scope at every consumer."
|
|
186
186
|
}
|
|
187
187
|
],
|
|
188
|
-
"removalGate": "Two conditions must hold simultaneously: (a) grep `engine/ado.js` for `isAdoThrottled\\s*\\(\\s*\\)` and confirm zero arg-less call sites remain across the engine — every caller passes a concrete `orgBase` resolved via `shared.getAdoOrgBase(project)`; (b) `GET /api/diagnostics/ado-throttle` on a live engine has been observed for >=2 consecutive weeks reporting per-org keys (proves the per-org Map is populated under load and the global-OR isn't masking a regression). Once both hold, removal deletes the arg-less branch in isAdoThrottled and the global-OR fold; callers that still pass no argument become an immediate, surfaced bug rather than a silent over-throttle.",
|
|
188
|
+
"removalGate": "Two conditions must hold simultaneously: (a) grep `engine/ado/index.js` for `isAdoThrottled\\s*\\(\\s*\\)` and confirm zero arg-less call sites remain across the engine — every caller passes a concrete `orgBase` resolved via `shared.getAdoOrgBase(project)`; (b) `GET /api/diagnostics/ado-throttle` on a live engine has been observed for >=2 consecutive weeks reporting per-org keys (proves the per-org Map is populated under load and the global-OR isn't masking a regression). Once both hold, removal deletes the arg-less branch in isAdoThrottled and the global-OR fold; callers that still pass no argument become an immediate, surfaced bug rather than a silent over-throttle.",
|
|
189
189
|
"targetRemovalDate": "2026-08-03",
|
|
190
190
|
"notes": "Introduced by W-mq03l6zh0006f0a1 (Per-org ADO throttle isolation). 60-day window (2 release cycles + buffer) gives the in-flight per-org migration time to land + observe per-org keys on the diagnostics endpoint. Observable live at GET /api/diagnostics/ado-throttle — the endpoint reports a single `global` key while the arg-less shim is still load-bearing, and per-org `<orgBase>` keys once isolation is complete; that key shape is the human-readable signal for whether this shim can retire."
|
|
191
191
|
},
|
|
@@ -194,11 +194,11 @@
|
|
|
194
194
|
"description": "Legacy `project.worktreeMode` config field (enum 'isolated'|'live'). Consolidated by W-mqiaw974 (issue #241) into a single `project.checkoutMode` field (enum 'worktree'|'live'): the old 'isolated' value became the implicit default 'worktree', and the overlapping/never-shipped 'shared' value was removed. The write side is migrated — buildProjectEntry, dashboard settings POST, and projects.addProject all write `checkoutMode`, and the dashboard settings/merge paths delete any stale `worktreeMode` key on save. What survives is a READ-BRIDGE ONLY: `shared.resolveCheckoutMode(project)` (and the `isLiveCheckoutProject` predicate built on it) reads canonical `checkoutMode` first, then falls back to the legacy `worktreeMode` field ('isolated'→'worktree', 'live'→'live') so an un-migrated config.json keeps dispatching live-checkout projects correctly. `validateCheckoutMode` also silently coerces a submitted legacy 'isolated' value to 'worktree'.",
|
|
195
195
|
"code": [
|
|
196
196
|
{
|
|
197
|
-
"file": "engine/shared.js",
|
|
197
|
+
"file": "engine/core/shared.js",
|
|
198
198
|
"note": "resolveCheckoutMode reads project.worktreeMode as the fallback when checkoutMode is absent; validateCheckoutMode coerces 'isolated'→'worktree'. The only surviving reads of the legacy field are these two back-compat bridges."
|
|
199
199
|
},
|
|
200
200
|
{
|
|
201
|
-
"file": "engine/projects.js",
|
|
201
|
+
"file": "engine/planning/projects.js",
|
|
202
202
|
"note": "addProject threads options.checkoutMode ?? options.worktreeMode into buildProjectEntry (accepts the legacy options key)."
|
|
203
203
|
},
|
|
204
204
|
{
|
|
@@ -226,13 +226,13 @@
|
|
|
226
226
|
},
|
|
227
227
|
{
|
|
228
228
|
"id": "discover-review-skills",
|
|
229
|
-
"description": "engine/discover-review-skills.js — standalone module that discovered and surfaced review-skill annotations from agent output. Superseded by the inline skill-extraction logic in engine/lifecycle.js during the skill-system consolidation.",
|
|
229
|
+
"description": "engine/discover-review-skills.js — standalone module that discovered and surfaced review-skill annotations from agent output. Superseded by the inline skill-extraction logic in engine/orchestration/lifecycle.js during the skill-system consolidation.",
|
|
230
230
|
"code": [],
|
|
231
231
|
"deprecated": "2026-06-29",
|
|
232
232
|
"status": "removed",
|
|
233
233
|
"removedDate": "2026-06-29",
|
|
234
234
|
"targetRemovalDate": null,
|
|
235
|
-
"notes": "engine/discover-review-skills.js does not exist on disk. The functionality was folded into engine/lifecycle.js skill extraction. No callers remain."
|
|
235
|
+
"notes": "engine/discover-review-skills.js does not exist on disk. The functionality was folded into engine/orchestration/lifecycle.js skill extraction. No callers remain."
|
|
236
236
|
},
|
|
237
237
|
{
|
|
238
238
|
"id": "discover-review-skills-shim",
|
|
@@ -254,12 +254,12 @@
|
|
|
254
254
|
"description": "Read compatibility for hybrid validation work items created with type `build-and-test` before the engine enforced the distinction between canonical work-item types and playbook names. Routing normalizes the legacy value to canonical `test`; liveValidation config validation also normalizes it on save.",
|
|
255
255
|
"code": [
|
|
256
256
|
{
|
|
257
|
-
"file": "engine/routing.js",
|
|
257
|
+
"file": "engine/orchestration/routing.js",
|
|
258
258
|
"lines": "normalizeWorkType",
|
|
259
259
|
"note": "Maps legacy work-item type `build-and-test` to WORK_TYPE.TEST."
|
|
260
260
|
},
|
|
261
261
|
{
|
|
262
|
-
"file": "engine/shared.js",
|
|
262
|
+
"file": "engine/core/shared.js",
|
|
263
263
|
"lines": "normalizeLiveValidationWorkType",
|
|
264
264
|
"note": "Normalizes persisted liveValidation.type values before routing and validation."
|
|
265
265
|
}
|
|
@@ -294,7 +294,7 @@
|
|
|
294
294
|
"note": "Codex-specific legacy wrapper flag emitter."
|
|
295
295
|
},
|
|
296
296
|
{
|
|
297
|
-
"file": "engine/spawn-agent.js",
|
|
297
|
+
"file": "engine/agents/spawn-agent.js",
|
|
298
298
|
"lines": "parseSpawnArgs",
|
|
299
299
|
"note": "Parses each historical named adapter option in addition to the canonical `--runtime-options` payload."
|
|
300
300
|
}
|
|
@@ -302,7 +302,7 @@
|
|
|
302
302
|
"deprecated": "2026-07-13",
|
|
303
303
|
"status": "active",
|
|
304
304
|
"targetRemovalDate": "2026-10-13",
|
|
305
|
-
"removalGate": "Do not remove before three release windows have shipped with adapter API v1. Add or inspect spawn-wrapper telemetry that distinguishes invocations containing `--runtime-options` from named-flags-only invocations; named-flags-only usage must remain at zero across all known engines and integrations for >=30 consecutive days. Also confirm no external tooling invokes engine/spawn-agent.js with named adapter flags.",
|
|
305
|
+
"removalGate": "Do not remove before three release windows have shipped with adapter API v1. Add or inspect spawn-wrapper telemetry that distinguishes invocations containing `--runtime-options` from named-flags-only invocations; named-flags-only usage must remain at zero across all known engines and integrations for >=30 consecutive days. Also confirm no external tooling invokes engine/agents/spawn-agent.js with named adapter flags.",
|
|
306
306
|
"removalScope": "Delete buildSpawnFlags from the three bundled adapters; simplify contract.buildSpawnFlags to emit only `--runtime <name> --runtime-options <payload>`; remove the individual adapter-option cases from spawn-agent.parseSpawnArgs while retaining `--runtime`, `--runtime-options`, and generic passthrough handling; update the named-flag compatibility assertions in test/unit.test.js, test/unit/auto-recovery.test.js, test/unit/copilot-adapter.test.js, and test/unit/spawn-agent-helpers.test.js.",
|
|
307
307
|
"autoRemoveSafe": false,
|
|
308
308
|
"notes": "The opaque payload is additive, not encrypted. This bridge is deliberately time-bounded but external-caller-gated; reaching the calendar date alone is insufficient."
|
|
@@ -337,10 +337,10 @@
|
|
|
337
337
|
},
|
|
338
338
|
{
|
|
339
339
|
"id": "preapprove-workspace-mcps-wrapper",
|
|
340
|
-
"description": "Legacy exported helper name from before workspace preparation moved behind the runtime adapter contract. engine/spawn-agent.js still exports preApproveWorkspaceMcps(), which resolves the selected adapter, delegates to prepareWorkspace(), and maps the generic `unsupported-runtime` result back to the historical `not-claude` reason. Production engine dispatch now calls the runtime facade's prepareWorkspace() directly.",
|
|
340
|
+
"description": "Legacy exported helper name from before workspace preparation moved behind the runtime adapter contract. engine/agents/spawn-agent.js still exports preApproveWorkspaceMcps(), which resolves the selected adapter, delegates to prepareWorkspace(), and maps the generic `unsupported-runtime` result back to the historical `not-claude` reason. Production engine dispatch now calls the runtime facade's prepareWorkspace() directly.",
|
|
341
341
|
"code": [
|
|
342
342
|
{
|
|
343
|
-
"file": "engine/spawn-agent.js",
|
|
343
|
+
"file": "engine/agents/spawn-agent.js",
|
|
344
344
|
"lines": "preApproveWorkspaceMcps and module.exports",
|
|
345
345
|
"note": "Backward-compatible wrapper and export; no production engine call site remains."
|
|
346
346
|
},
|
|
@@ -359,7 +359,7 @@
|
|
|
359
359
|
"status": "active",
|
|
360
360
|
"targetRemovalDate": "2026-10-13",
|
|
361
361
|
"removalGate": "After at least three release windows, repository and supported-extension searches must show zero imports or calls to preApproveWorkspaceMcps outside its compatibility tests for >=30 consecutive days. Confirm all maintained callers resolve an adapter and invoke the runtime facade's prepareWorkspace() instead.",
|
|
362
|
-
"removalScope": "Delete preApproveWorkspaceMcps and its module.exports entry from engine/spawn-agent.js; migrate the wrapper tests in test/unit/spawn-agent-helpers.test.js to call engine/runtimes/claude.js#prepareWorkspace directly; retain the adapter implementation and engine.js facade call.",
|
|
362
|
+
"removalScope": "Delete preApproveWorkspaceMcps and its module.exports entry from engine/agents/spawn-agent.js; migrate the wrapper tests in test/unit/spawn-agent-helpers.test.js to call engine/runtimes/claude.js#prepareWorkspace directly; retain the adapter implementation and engine.js facade call.",
|
|
363
363
|
"autoRemoveSafe": false,
|
|
364
364
|
"notes": "The wrapper is synchronous and behavior-preserving, so there is no urgency to remove it before external usage is known to be zero."
|
|
365
365
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# inbox_entries Table Schema
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
|
-
The `inbox_entries` table and `engine/inbox-store.js` implement a persistent, time-ordered, unread-tracking message queue decoupled from the runtime work-item/dispatch lifecycle. The store API exists, but production engine, dashboard, and consolidation paths do not consume it yet; those paths still use their existing inbox mechanisms.
|
|
4
|
+
The `inbox_entries` table and `engine/persistence/inbox-store.js` implement a persistent, time-ordered, unread-tracking message queue decoupled from the runtime work-item/dispatch lifecycle. The store API exists, but production engine, dashboard, and consolidation paths do not consume it yet; those paths still use their existing inbox mechanisms.
|
|
5
5
|
|
|
6
6
|
## Schema Specification
|
|
7
7
|
|
|
@@ -61,7 +61,7 @@ The `inbox_entries` table and `engine/inbox-store.js` implement a persistent, ti
|
|
|
61
61
|
|
|
62
62
|
### Integration Status
|
|
63
63
|
|
|
64
|
-
The table currently has no foreign keys and `engine/inbox-store.js` has no production callers. Dispatch feedback, PR notifications, dashboard inbox views, and consolidation are potential consumers, not implemented relationships. Until those call sites migrate, this table is not the source of truth for `notes/inbox/` or agent steering inbox files.
|
|
64
|
+
The table currently has no foreign keys and `engine/persistence/inbox-store.js` has no production callers. Dispatch feedback, PR notifications, dashboard inbox views, and consolidation are potential consumers, not implemented relationships. Until those call sites migrate, this table is not the source of truth for `notes/inbox/` or agent steering inbox files.
|
|
65
65
|
|
|
66
66
|
## Performance Considerations
|
|
67
67
|
|
|
@@ -94,5 +94,5 @@ The table currently has no foreign keys and `engine/inbox-store.js` has no produ
|
|
|
94
94
|
## Related Code
|
|
95
95
|
|
|
96
96
|
- **Schema:** `engine/db/migrations/019-inbox-entries.js`.
|
|
97
|
-
- **Store:** `engine/inbox-store.js` (reads, transactional mutators, and best-effort `emitStateEvent('inbox', ...)` after real changes).
|
|
97
|
+
- **Store:** `engine/persistence/inbox-store.js` (reads, transactional mutators, and best-effort `emitStateEvent('inbox', ...)` after real changes).
|
|
98
98
|
- **Consumers:** none in production yet.
|