@bridge_gpt/mcp-server 0.2.67 → 0.2.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +272 -51
  2. package/build/agent-launchers/claude-executor-adapter.js +27 -0
  3. package/build/agents.generated.js +22 -2
  4. package/build/bitbucket-workspace-remote.js +136 -0
  5. package/build/bootstrap-project-identity.js +24 -0
  6. package/build/bridge-permissions.js +1362 -0
  7. package/build/check-update-cli.js +74 -0
  8. package/build/claude-settings.js +102 -2
  9. package/build/cli-help.js +27 -0
  10. package/build/codex-home.js +9 -1
  11. package/build/codex-launcher-pin.js +598 -0
  12. package/build/command-assets-doctor.js +24 -70
  13. package/build/command-provisioning.js +29 -5
  14. package/build/commands.generated.js +9 -9
  15. package/build/conductor/bridge-api-client.js +714 -0
  16. package/build/conductor/command-drift-production.js +92 -0
  17. package/build/conductor/command-drift.js +89 -0
  18. package/build/conductor/doctor.js +69 -26
  19. package/build/conductor/epic-branch-ci-inspection.js +1375 -0
  20. package/build/conductor/epic-implementer-cli.js +76 -22
  21. package/build/conductor/gate-discovery.js +890 -0
  22. package/build/conductor/install-doctor.js +15 -3
  23. package/build/conductor/json-output.js +63 -0
  24. package/build/conductor/readiness-cli.js +95 -10
  25. package/build/conductor/readiness-sections.js +369 -3
  26. package/build/conductor/readiness.js +211 -8
  27. package/build/conductor/recovery-cli.js +110 -4
  28. package/build/conductor/recovery-operations.js +99 -1
  29. package/build/connect-bitbucket-api.js +41 -6
  30. package/build/connect-bitbucket.js +106 -33
  31. package/build/connect-github-api.js +33 -14
  32. package/build/credential-store.js +207 -47
  33. package/build/docs.generated.js +57 -3
  34. package/build/doctor.js +198 -4
  35. package/build/drive-epic.js +45 -8
  36. package/build/epic-coherence-input.test-fixtures.js +4 -3
  37. package/build/epic-implementer-bin.js +1369 -25
  38. package/build/epic-workarounds-path.js +39 -0
  39. package/build/executor/cli.js +30 -0
  40. package/build/executor/completion-contract.js +20 -5
  41. package/build/executor/deps.js +4 -1
  42. package/build/executor/gate-qualification-job.js +499 -0
  43. package/build/executor/guarded-fast-forward-push.js +129 -0
  44. package/build/executor/http-client.js +43 -4
  45. package/build/executor/integration-job.js +122 -8
  46. package/build/executor/job-errors.js +8 -1
  47. package/build/executor/job-runner.js +589 -47
  48. package/build/executor/likely-tests.js +290 -0
  49. package/build/executor/live-worker-registry.js +1 -1
  50. package/build/executor/observation.js +31 -2
  51. package/build/executor/packaged-recipe.js +106 -0
  52. package/build/executor/permissions.js +115 -28
  53. package/build/executor/platform.js +1 -1
  54. package/build/executor/preflight.js +61 -12
  55. package/build/executor/process-containment.js +36 -12
  56. package/build/executor/process.js +15 -7
  57. package/build/executor/prompt-spec.js +33 -1
  58. package/build/executor/recently-failed-tests-file.js +71 -0
  59. package/build/executor/reconcile-overlap-job.js +41 -23
  60. package/build/executor/required-verification.js +1 -1
  61. package/build/executor/required-work-ledger.js +105 -17
  62. package/build/executor/retirement.js +69 -0
  63. package/build/executor/runner.js +114 -11
  64. package/build/executor/test-clock.js +15 -0
  65. package/build/executor/types.js +32 -0
  66. package/build/executor/viewer-tabs.js +58 -8
  67. package/build/executor/worker-command.js +23 -7
  68. package/build/executor/worker-diagnostics.js +37 -0
  69. package/build/executor/worker-finalization.js +31 -5
  70. package/build/executor/worker-guard-hook.js +179 -25
  71. package/build/executor/worker-log.js +4 -3
  72. package/build/executor/worker-verification-guidance.js +37 -0
  73. package/build/executor/worktree.js +88 -11
  74. package/build/first-build-advisory.js +97 -0
  75. package/build/generated-assets-advisory.js +14 -0
  76. package/build/generated-assets-catalog.js +66 -0
  77. package/build/generated-assets-context.js +46 -0
  78. package/build/generated-assets-dependencies.js +26 -0
  79. package/build/generated-assets-doctor.js +50 -0
  80. package/build/generated-assets-health.js +65 -0
  81. package/build/generated-assets-host.js +17 -0
  82. package/build/generated-assets-inventory.js +17 -0
  83. package/build/generated-assets-paths.js +60 -0
  84. package/build/generated-assets-publisher.js +133 -0
  85. package/build/generated-assets-remedy.js +25 -0
  86. package/build/generated-assets-repair.js +72 -0
  87. package/build/generated-assets-session.js +71 -0
  88. package/build/generated-assets-test-support.js +35 -0
  89. package/build/index.js +1109 -695
  90. package/build/init.js +54 -177
  91. package/build/install-bridge-conductor-gate.js +1372 -0
  92. package/build/install-bridge-conductor.js +289 -36
  93. package/build/install-bridge.js +722 -252
  94. package/build/launcher-config-inspection.js +184 -19
  95. package/build/mcp-host-targets.js +4 -0
  96. package/build/mcp-identity.js +7 -0
  97. package/build/mcp-install-state.js +50 -4
  98. package/build/merge-workflow-install.js +3 -4
  99. package/build/pipeline-utils.js +6 -2
  100. package/build/pipelines.generated.js +22 -142
  101. package/build/plan-execution-ledger.js +2 -32
  102. package/build/plane/manifest.js +16 -1
  103. package/build/plane/preflight.js +54 -1
  104. package/build/printed-remedy-commands.js +16 -1
  105. package/build/readme.generated.js +1 -1
  106. package/build/repair-assets.js +93 -0
  107. package/build/run-unit-tests-launcher.js +130 -49
  108. package/build/secret-redaction.js +33 -0
  109. package/build/session-upgrade-notice.js +86 -0
  110. package/build/setup-epic.js +108 -3
  111. package/build/start-tickets-prereqs.js +70 -16
  112. package/build/start-tickets.js +44 -5
  113. package/build/tool-call-advisory.js +162 -0
  114. package/build/tool-surface-gating.js +32 -57
  115. package/build/update-check.js +97 -16
  116. package/build/update-status.js +61 -71
  117. package/build/upgrade-advice.js +15 -11
  118. package/build/upgrade-cli.js +398 -17
  119. package/build/version.generated.js +3 -3
  120. package/build/worker-guard-hook-bin.js +3 -2
  121. package/build/worker-guard-hook-main.js +1 -1
  122. package/build/worktree-core.js +15 -2
  123. package/docs/EPIC-IMPLEMENTER-INSTALL.md +30 -12
  124. package/docs/EPIC-IMPLEMENTER.md +68 -2
  125. package/package.json +3 -3
  126. package/pipelines/greenfield-setup.json +4 -128
  127. package/pipelines/implement-ticket.json +3 -2
package/README.md CHANGED
@@ -10,16 +10,35 @@ From your **project root**, run:
10
10
  npx -y @bridge_gpt/mcp-server install
11
11
  ```
12
12
 
13
- That is the whole setup command. It works whether or not you already have a Bridge
14
- account — it will ask.
13
+ That command starts guided setup. It works whether or not you already have a Bridge
14
+ account — it will ask; follow the remaining onboarding instructions afterward.
15
+
16
+ ### Already ran `npm i @bridge_gpt/mcp-server`?
17
+
18
+ > The package and its executable aliases are installed, but your intended project
19
+ > and MCP host still need setup. From your intended project root, run:
20
+ >
21
+ > ```bash
22
+ > npx -y @bridge_gpt/mcp-server install
23
+ > ```
24
+ >
25
+ > You do not need to uninstall the package first. [Continue with the step-by-step
26
+ > setup instructions](#installing-step-by-step) for sign-in, host selection,
27
+ > reload/trust, and agent handoff.
28
+
29
+ > Package installation is passive: Bridge cannot detect or notify someone who only
30
+ > installs the package and does nothing else. Successful lifecycle output is not a
31
+ > reliable default-install notification because `foreground-scripts` normally
32
+ > defaults to false, and `ignore-scripts` can disable hooks entirely.
15
33
 
16
34
  > We recommend **the command above** instead of the `npm i @bridge_gpt/mcp-server`
17
35
  > one in npm's sidebar, because it **will make set up much easier**.
18
36
 
19
37
  **What it will do**
20
38
 
21
- - **Bootstraps the Bridge MCP for you** — one command and your editor's agent can
22
- use Bridge's tools and slash commands on this project.
39
+ - **Starts guided Bridge MCP setup** — after completing the remaining onboarding
40
+ instructions, your editor's agent can use Bridge's tools and slash commands on
41
+ this project.
23
42
  - Registers a `bridge` MCP server in your editor's MCP config, leaving any
24
43
  other servers you have configured untouched.
25
44
  - Creates and updates the files it needs inside your project root: slash commands
@@ -84,27 +103,41 @@ you run it in your home directory, your editor will not find any of it.
84
103
  npx -y @bridge_gpt/mcp-server install
85
104
  ```
86
105
 
87
- **3. Answer the sign-in question.** On a first run it asks whether you already have
88
- a token:
106
+ **3. Answer the sign-in question.** On a first run it asks one question:
89
107
 
90
108
  ```
91
- 1. I need a token
92
- 2. I already have a token
109
+ Email (or press Enter if you already have a token):
93
110
  ```
94
111
 
95
- - Choose **1** if you have nothing yet. It asks for your email address and a name
96
- for your new Bridge project, then creates both for you.
97
- - Choose **2** if someone gave you a token — either a Bridge API key or an invite
112
+ - Type your **email address** if you have nothing yet. The installer first shows
113
+ how your email is used, then sends you a verification code. Your new Bridge
114
+ project is named after your folder, with no question asked unless the folder
115
+ name cannot be used. Rename it later on the Setup page.
116
+ - Press **Enter** if someone gave you a token — either a Bridge API key or an invite
98
117
  code. Paste it at the hidden prompt; you do not have to say which kind it is,
99
118
  because the installer recognizes it. Nothing is echoed as you type.
100
119
 
101
- There is no default answer, so pressing Enter alone selects nothing. If you would
102
- rather not be asked, pass the answer up front instead — see
120
+ One mistyped answer gets a hint and a second try. If you would rather not be
121
+ asked, pass the answer up front instead — see
103
122
  [Choosing how you sign in](#choosing-how-you-sign-in).
104
123
 
105
- **4. Pick which editors to configure.** The installer detects the MCP hosts on your
106
- machine and asks which ones to set up. Pick every editor you actually use for this
107
- project; you can re-run the command later to add another.
124
+ **4. Confirm which editors to configure.** The installer detects the MCP hosts on
125
+ your machine and ticks them for you (`[x]`). Press Enter to accept the ticked tools,
126
+ or type the numbers you use (for example `1,3`) to replace them. You can re-run the
127
+ command later to add another.
128
+
129
+ **Optimization.** The installer then asks how Bridge should balance quality and
130
+ cost: **Quality** (full-depth planning and review), **Speed** (one planning pass,
131
+ one review), or **Token Efficiency** (Speed settings, with simpler tickets handed to
132
+ smaller models, to stretch your Claude Code, Cursor, or Codex subscription). Press
133
+ Enter to keep Quality (or your saved choice). Change it later by running
134
+ `/teach-bridge` in your agent.
135
+
136
+ When you are done answering, the installer writes Bridge's guidance for your agent
137
+ between `<!-- BEGIN BRIDGE MCP GUIDANCE -->` and `<!-- END BRIDGE MCP GUIDANCE -->`
138
+ without asking. It prints how to remove that region. Then it prints the defaults it
139
+ chose — project name, ticket keys when your project uses local tickets,
140
+ optimization, and guidance — just before offering to open the setup session.
108
141
 
109
142
  **5. Reload your MCP host.** Editors read their MCP configuration at startup, so a
110
143
  freshly written config is not live until you reload. Restart the editor, or use its
@@ -114,7 +147,9 @@ project's `.mcp.json` the first time.
114
147
  **6. Finish in the agent session the installer opens — when it opens one.** The
115
148
  last thing the installer does is offer to open a fresh agent session running
116
149
  `/install-bridge`, which reads your codebase, fills in the remaining project
117
- settings, and prints a short report of what Bridge can help with. Let it finish.
150
+ settings, and prints a short report of what Bridge can help with. Let it finish. To
151
+ invite teammates later, open the project's Security page from the Setup page and
152
+ create a key.
118
153
 
119
154
  Three things all have to hold for that session to open: your selection has to
120
155
  include a host the installer can launch, the run has to be on an interactive
@@ -155,14 +190,15 @@ committing anything that can hold a credential.
155
190
 
156
191
  **Prompts you will see.** More than the sign-in question, in three groups:
157
192
 
158
- - *Always on a first bare interactive run:* the sign-in question, a hidden prompt
159
- for a token (or a visible one for an email), a project name for a brand-new
160
- project, a picker for which editors to configure, and an offer to connect GitHub
161
- (`Connect GitHub? [y/N]:`).
193
+ - *Always on a first bare interactive run:* the email-or-token question (a blank
194
+ answer opens a hidden prompt for a token), the verification code, a picker for
195
+ which editors to configure (detected ones are pre-ticked), the optimization
196
+ choice, and an offer to connect GitHub (`Connect GitHub? [y/N]:`).
162
197
  - *Conditional on your situation:* a confirmation when the directory has no `.git`
163
- (default **No**, and declining aborts); a *"Which tool should open? [1-N]"*
164
- chooser when your selection contains more than one launchable tool; and the
165
- consent prompt before the final agent session.
198
+ (default **No**, and declining aborts); a project name when your folder name
199
+ cannot be used as one; and the consent prompt before the final agent session. With
200
+ more than one launchable tool selected, the first one is used and the installer
201
+ says so; pass `--agent` to choose another.
166
202
  - *Overwrite confirmations, each default **No** and each skippable with `--force`:*
167
203
  a saved key for this project already exists; a host config already contains a
168
204
  `BAPI_API_KEY`; a **git-tracked** config would receive your real key; a saved but
@@ -217,8 +253,8 @@ re-run the command from the right directory — if you already had a `.vscode/`,
217
253
  (`npx -y @bridge_gpt/mcp-server`) with no subcommand, you started the MCP *server*,
218
254
  not the installer. It is waiting for an editor to connect over stdio, which is
219
255
  exactly what it should do when your editor launches it — but from a terminal it
220
- looks like a hang. It prints a line saying so. Press Ctrl-C and run
221
- `npx -y @bridge_gpt/mcp-server install` instead. The explicit spelling
256
+ looks like a hang. It prints a stderr guidance block explaining this. Press Ctrl-C
257
+ and run `npx -y @bridge_gpt/mcp-server install` instead. The explicit spelling
222
258
  `npx -y @bridge_gpt/mcp-server serve` starts the server on purpose.
223
259
 
224
260
  **"It can't reach Bridge" or "my key was rejected."** The installer checks
@@ -283,7 +319,7 @@ Creates a brand-new Bridge project for that address and your first admin key in
283
319
  command. No account, no key, and no invite needed beforehand. The address labels
284
320
  your new workspace and may receive a setup message; delivery is best-effort, so
285
321
  nothing waits on it. The email is visible as you type (it is not a secret) and is
286
- never written to a log. This is the same route as answering **1** at the prompt.
322
+ never written to a log. This is the same route as typing an email at the prompt.
287
323
 
288
324
  **You were sent an invite code.**
289
325
 
@@ -374,7 +410,7 @@ later boot.
374
410
  "mcpServers": {
375
411
  "bridge": {
376
412
  "command": "npx",
377
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"],
413
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"],
378
414
  "env": {
379
415
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
380
416
  "BAPI_REPO_NAME": "your-repo",
@@ -396,7 +432,7 @@ later boot.
396
432
  "bridge": {
397
433
  "type": "stdio",
398
434
  "command": "npx",
399
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"],
435
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"],
400
436
  "env": {
401
437
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
402
438
  "BAPI_REPO_NAME": "your-repo",
@@ -418,7 +454,7 @@ later boot.
418
454
  "bridge": {
419
455
  "type": "stdio",
420
456
  "command": "npx",
421
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"],
457
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"],
422
458
  "env": {
423
459
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
424
460
  "BAPI_REPO_NAME": "your-repo",
@@ -441,7 +477,7 @@ Windsurf only supports global MCP configuration.
441
477
  "mcpServers": {
442
478
  "bridge": {
443
479
  "command": "npx",
444
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"],
480
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"],
445
481
  "env": {
446
482
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
447
483
  "BAPI_REPO_NAME": "your-repo",
@@ -460,7 +496,7 @@ Windsurf only supports global MCP configuration.
460
496
  ```toml
461
497
  [mcp_servers.bridge]
462
498
  command = "npx"
463
- args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"]
499
+ args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"]
464
500
 
465
501
  [mcp_servers.bridge.env]
466
502
  BAPI_BASE_URL = "https://bridgegpt-api.com"
@@ -525,12 +561,46 @@ converge, and nothing is reported as complete in that case. The causes:
525
561
  - the upgrade finished but left an **unconfigured** MCP entry — one that would
526
562
  authenticate as nobody.
527
563
 
564
+ #### Upgrade notices
565
+
528
566
  The server checks for updates on startup. The check is cached for a day and never
529
- blocks startup. When a newer version is known, it surfaces in two places you do
530
- not have to go looking for: a one-line warning on the server's **stderr**, and a
531
- short advisory attached to the ordinary `tools/list` response so the agent in the
532
- session can see that some tools may be missing or renamed in the older build.
533
- Neither requires calling `ping` or `doctor`.
567
+ blocks startup or a tool call. When a newer version is known, you hear about it
568
+ once, in a place you do not have to go looking for:
569
+
570
+ - **The first completed tool result.** In an eligible session, the first tool call
571
+ that finishes carries one extra line naming both versions and `/upgrade-bridge`.
572
+ It tells the agent to mention the upgrade and to run it only if you say yes.
573
+ Failed tool calls count too.
574
+ - **Startup instructions.** If the local cache already shows a newer version, the
575
+ server's instructions to the agent say so from the first message.
576
+ - **A Claude Code `SessionStart` hook.** `install` and `upgrade` add one hook to
577
+ `.claude/settings.local.json`, pinned to the same version as your project's
578
+ launcher. It runs `check-update` and shows the notice at the start of a fresh
579
+ session. The hook is for Claude Code only and is per developer (that file is
580
+ gitignored). Bridge records the exact command in `.bridge/bridge-permissions.json`,
581
+ so a changed pin replaces it and removal deletes only that command. Cursor and
582
+ Codex have no hook; they get the startup instructions and the tool-result line.
583
+ - **`doctor` and `start-tickets`.** `doctor` shows `Bridge MCP version` beside the
584
+ package version, from a fresh lookup that does not touch the cache. `start-tickets`
585
+ prints one reminder to stderr when the cache shows a newer version.
586
+
587
+ The notice is decided without waiting for any lookup. While the latest version is
588
+ unknown, or a result cannot safely carry the extra line, the session keeps its
589
+ chance and tries again on a later call.
590
+
591
+ It stays **silent** when you are current, when the latest version is unknown, in
592
+ unattended worker sessions (`BAPI_WORKER_BRANCH` or `BAPI_EPIC_IMPLEMENTER_WORKER_ID`
593
+ set), and when `BAPI_MCP_UPDATE_CHECK_ENABLED` is off.
594
+
595
+ `BAPI_MCP_UPDATE_CHECK_FAKE_LATEST` is a manual-only override for trying the notice.
596
+ It must be a plain `MAJOR.MINOR.PATCH` release; anything else is ignored. It never
597
+ changes what `install` or `upgrade` pin to.
598
+
599
+ Two limits to know. The startup instructions and the hook read the cache the server
600
+ fills, so a machine that has never run the server may show no notice at session
601
+ start. And a cold, pinned `npx` launch of the hook can take longer than its
602
+ five-second timeout, in which case it stays silent; run `doctor`, or launch the
603
+ pinned CLI once, to warm it.
534
604
 
535
605
  Re-running `install` on an already-configured project is safe: it refreshes the
536
606
  scaffolded files without overwriting your stored credential unless you pass
@@ -570,15 +640,15 @@ The tools worth knowing for most tickets.
570
640
  - **Flags:** `--auto` auto-accept findings and skip the approval gates · `--rounds=1` a cheaper single-pass review that still evaluates findings and captures decisions · `--rounds=2` force the full second-opinion review · omit `--rounds` to let the difficulty-adaptive review policy decide.
571
641
 
572
642
  **2. Start Tickets**
573
- - **What it does:** Creates one git worktree per ticket and spawns an agent session in each to implement them in parallel.
643
+ - **What it does:** Builds several tickets at once, each in its own copy of the repo (a git worktree) with its own agent.
574
644
  - **When it's useful:** (Implementation | Automation) When you're ready to start building one or more refined tickets concurrently.
575
- - **How to use it:** `/start-tickets BAPI-248 BAPI-250` (see [CLI Subcommands](#cli-subcommands) for the full flag table and cross-platform behavior).
645
+ - **How to use it:** `/start-tickets BAPI-248 BAPI-250`
576
646
  - **Flags:** `--auto` skip the approval gates · `--base-branch <branch>` branch off something other than the default · `--workflow implement|review-and-implement` selects which slash command each spawned worktree runs · `--rounds=1|2` forwarded to the review phase, valid only with `--workflow review-and-implement` · `--tier cheap|basic|premium` strict manual model-routing override · `--auto-tier cheap|basic|premium` machine-carried raw tier for chained automation (posture-adjusted; used internally by the `/review-and-implement` handoff), mutually exclusive with `--tier`.
577
647
 
578
648
  **3. Review and Start**
579
- - **What it does:** Spawns one worktree per ticket; each session reviews the ticket inline and, after a per-ticket proceed/halt gate, hands off to a **fresh implementation session** that reuses the same worktree — review and implementation run in two separate agent contexts, not one shared session.
649
+ - **What it does:** Like Start Tickets, but each ticket is reviewed first and only built if it passes.
580
650
  - **When it's useful:** (Refinement | Implementation | Automation) The **recommended front door** for "review these tickets, then implement the ones that pass," starting from existing ticket keys (unlike `/idea-to-pr`, which only accepts an idea).
581
- - **How to use it:** `/review-and-start BAPI-248 BAPI-250` (single or multiple keys flow through the identical code path).
651
+ - **How to use it:** `/review-and-start BAPI-248 BAPI-250`
582
652
  - **Flags:** `--auto` auto-approves both the review and the implementation phase of every spawned session · `--rounds=1|2` forwarded to the review phase · `--agent`, `--base-branch`, `--max-parallel`, `--dry-run` mirror `/start-tickets`.
583
653
 
584
654
  **4. Define Tickets**
@@ -610,7 +680,7 @@ Good to know, but not needed every day.
610
680
  - **Flags:** Name the issue type (Bug / Story / Task / Epic) and, for a child ticket under an epic, the parent key.
611
681
 
612
682
  **2. Plan Ticket**
613
- - **What it does:** Generates a step-by-step implementation plan for a ticket that references real files in your codebase.
683
+ - **What it does:** Writes a step-by-step plan for a ticket that points at the real files to change.
614
684
  - **When it's useful:** (Refinement | Implementation) Once a ticket is solid and you want a concrete build plan before — or instead of — auto-implementing it.
615
685
  - **How to use it:** `/plan-ticket BAPI-123`
616
686
  - **Flags:** `--provider <name>` choose the model provider · `--second-opinion <provider>` cross-check the plan with a second provider.
@@ -640,9 +710,9 @@ Good to know, but not needed every day.
640
710
  - **Flags:** None.
641
711
 
642
712
  **7. Drive Epic Run**
643
- - **What it does:** Launches an Epic Implementer run through `drive-epic` after a preview and an explicit yes — or attaches to the epic's live run — then drives it to a terminal state, applying one sanctioned recovery verb at a time and keeping a written tally.
713
+ - **What it does:** Builds a whole epic for you. Bridge works through the child tickets in order, merges each one into the epic branch, and fixes routine problems along the way, so you only step in when it truly needs you. It shows you a preview and waits for your yes before it starts.
644
714
  - **When it's useful:** (Implementation | Automation) When an epic has an approved plan and you want its child tickets built and merged into the epic branch with one session watching the run.
645
- - **How to use it:** `/drive-epic-run <EPIC> [<plan path>]` — e.g. `/drive-epic-run BAPI-1145`; the plan is found automatically when the path is omitted.
715
+ - **How to use it:** `/drive-epic-run BAPI-1145`
646
716
  - **Flags:** None — the epic key and an optional plan path are the only arguments.
647
717
 
648
718
  ### Now and then
@@ -733,7 +803,7 @@ Useful once in a while.
733
803
  Slash commands that drive several tools at once. Start Tickets, Review and Start, and Define Tickets are documented above under [Regularly useful](#regularly-useful); Create Decision Page is documented above under [Occasionally useful](#occasionally-useful); Regression Check and Scan Test Coverage are documented above under [Now and then](#now-and-then) — the rest live here.
734
804
 
735
805
  **1. Implement Ticket**
736
- - **What it does:** Full build for one ticket: generate a plan, write the code, commit, open a PR, and monitor CI.
806
+ - **What it does:** Builds one ticket end to end: plans it, writes the code, opens a pull request, and watches CI.
737
807
  - **When it's useful:** (Implementation) When a ticket is ready and you want it taken from plan to open PR in one go.
738
808
  - **How to use it:** `/implement-ticket BAPI-123` (command only — "implement X" as free text almost always triggers a freehand build instead of the Bridge plan→code→PR→CI pipeline).
739
809
  - **Flags:** `--auto` skip the approval gates (e.g. auto-commit/push).
@@ -1071,14 +1141,15 @@ By hand, the outline is:
1071
1141
  npx -y @bridge_gpt/mcp-server install # if Bridge is not installed yet
1072
1142
  npx -y @bridge_gpt/mcp-server connect-github --repo <repo_name> # connect the GitHub App
1073
1143
  npx -y @bridge_gpt/mcp-server install conductor --required-check "epic-implementer-ci / gate" \
1074
- --allowed-bot "<bot>" --secret-name <SECRET_NAME> --branches "<default branch>,epic/**"
1144
+ --review-policy verdict_protocol \
1145
+ --allowed-bot "<bot>" --secret-name <SECRET_NAME> --branches "<default branch>,epic/**" # AI review is opt-in; omit all four to skip the claude-review workflow
1075
1146
  export BAPI_LOCAL_MERGE_TOKEN="$(gh auth token)" # in the shell that runs drive-epic
1076
1147
  npx -y @bridge_gpt/mcp-server epic-implementer readiness --json # read-only check of every prerequisite
1077
1148
  ```
1078
1149
 
1079
1150
  After `install conductor`, restart your MCP client so the Epic Implementer tools
1080
1151
  appear. Add `epic-implementer-ci.yml` (the guide has a template) and the
1081
- `claude-review.yml` that `install conductor` wrote, through a pull request into
1152
+ `claude-review.yml` that `install conductor` wrote (only when you opted in to AI review with `--review-policy verdict_protocol`), through a pull request into
1082
1153
  your default branch. Once it merges, index the repository with
1083
1154
  `/parse-repository`.
1084
1155
 
@@ -1151,6 +1222,55 @@ For Codex, `GET /jira/codex-model-catalog?repo_name=...` is the sole tier-to-mod
1151
1222
 
1152
1223
  Per-OS prerequisites: macOS `wt`, `git`, `osascript`; Windows `git-wt`, Git for Windows / Git Bash, Windows Terminal or PowerShell; Linux `wt`, `git`, `tmux`. Set `BAPI_WORKTRUNK_BIN` to override the Worktrunk executable name/path for nonstandard installs (`doctor` honors it too). The read-only `doctor` subcommand (below) additionally surfaces a missing `uv` — Worktrunk's `pre-start` hook runs `uv`, but live preflight does not check it — and the selected agent's command; run `doctor --agent cursor-agent` to also check `cursor-agent` (it prints `cursor-agent login` as an informational auth reminder).
1153
1224
 
1225
+ ### Missing packaged workflow files
1226
+
1227
+ Run read-only `doctor` to distinguish absent, unreadable, unsafe, and uncertain
1228
+ workflow files. Healthy discovery adds no recovery prose. Confirmed loss in a
1229
+ root-bound initialized installation adds bounded recovery metadata and guidance;
1230
+ unknown hosts, fallback roots, legacy inventories, and newer bundle additions do
1231
+ not establish historical loss. Readable customized or uncommitted files count as
1232
+ present; committing generated files is unnecessary.
1233
+
1234
+ ```sh
1235
+ npx -y '@bridge_gpt/mcp-server@<running-version>' repair-assets --project-root '/path/to/project' --host claude
1236
+ ```
1237
+
1238
+ Replace `<running-version>` with the running package version. Both explicit root and host
1239
+ options authorize fill-only provisioning without inventory. Otherwise repair
1240
+ requires a matching inventory at the exact selected root; callers in a project
1241
+ subdirectory must supply `--project-root`. The canonical selected root is printed
1242
+ before writes. Unpinned `npx -y @bridge_gpt/mcp-server repair-assets` intentionally
1243
+ selects the latest package, which may introduce new assets.
1244
+
1245
+ | Host | Packaged destinations |
1246
+ | --- | --- |
1247
+ | `claude` | `.claude/commands/`, `.claude/agents/`, shipped documentation |
1248
+ | `cursor` | `.cursor/commands/`, shipped documentation; no native agent definitions |
1249
+ | `codex` | `.agents/skills/bridge-*/SKILL.md`, shipped documentation |
1250
+ | `copilot` | Independent `.github/prompts/`, `.github/skills/`, `.github/agents/`, shipped documentation |
1251
+
1252
+ Repair preserves existing bytes and concurrent creation winners. It prepares
1253
+ complete temporary files, flushes/closes them, and publishes with exclusive hard
1254
+ links. A confined Linux procfs adapter supports writes; macOS/Windows currently
1255
+ refuse missing-file writes because a qualified descriptor-relative adapter is
1256
+ unavailable. Non-files, permissions, unsafe ancestry, unsupported publication, or
1257
+ cleanup failures produce a nonzero exit and distinct diagnostics. Repair does not
1258
+ refresh or upgrade existing content.
1259
+
1260
+ When a missing host command prevents Bridge invocation, run the terminal command
1261
+ from the established root, then refresh/reconnect and run doctor. Hosts may cache
1262
+ lists or ignore notifications; healthy files do not guarantee host presentation.
1263
+ If the mismatch persists, consult host support.
1264
+
1265
+ Plans/reviews/research reports are generated outputs: retrieve identified existing
1266
+ results using `get_plan`, `wait_for_ticket_review` for eligible canonical legs,
1267
+ `get_deep_research(task_id)`, or `get_council(council_id)`. Never silently rerun paid
1268
+ generation. Agent-reviewed rewrites must be recreated and reviewed before
1269
+ publication; neither retrieval nor installer repair reconstructs them.
1270
+
1271
+ Custom pipelines/instructions, MCP registration/configuration, credentials,
1272
+ onboarding/API setup, and Windsurf are outside packaged repair.
1273
+
1154
1274
  ### `doctor`
1155
1275
 
1156
1276
  The package also ships a strictly **read-only** `doctor` subcommand — titled **`bridge doctor — read-only diagnostics`** — that diagnoses your whole Bridge install without changing anything:
@@ -1210,14 +1330,21 @@ The path from an epic to a finished run:
1210
1330
  `npx -y @bridge_gpt/mcp-server install conductor --required-check <check>`
1211
1331
  (also spelled `install-bridge conductor`; the name predates the rename). It runs
1212
1332
  a read-only doctor and writes the done gate from your required CI check(s). It
1213
- can also scaffold the `claude-review` workflow, write an executor service unit,
1333
+ can also scaffold the `claude-review` workflow (only with the explicit AI-review opt-in, `--review-policy verdict_protocol`; omitting the flag persists no repository review choice and scaffolds none), write an executor service unit,
1214
1334
  and save a launch profile. With its own consent, it adds `epic_implementer` to
1215
1335
  `BRIDGE_MCP_PROFILE` in your host MCP configs. Run `install conductor --help`
1216
1336
  for every option.
1217
1337
  3. **Launch and drive.** In Claude Code, `/drive-epic-run <EPIC> [<plan path>]`
1218
1338
  previews the launch, asks you once, creates the run through `drive-epic`, and
1219
1339
  then watches and recovers it. From a shell, [`drive-epic <EPIC>`](#drive-epic)
1220
- creates the run and starts its executor.
1340
+ creates the run and starts its executor. In Claude Code, `/drive-epic-run` first
1341
+ checks whether Bridge's auto-mode sandbox description is in
1342
+ `~/.claude/settings.json`. Only when it is missing, it asks you once, in the
1343
+ session, and writes it only after an explicit yes. You can add it yourself with
1344
+ `npx -y @bridge_gpt/mcp-server bridge-permissions` (run from the project root; it
1345
+ asks first), inspect it with `bridge-permissions --check --json`, and remove it
1346
+ with `install --remove-bridge-permissions`. `install` itself never touches that
1347
+ file.
1221
1348
  4. **Monitor.** The MCP tools `get_epic_snapshot` and `explain_run` (they need the
1222
1349
  `epic_implementer` profile; see [Environment Variables](#environment-variables)),
1223
1350
  `notifications <EPIC|run-id> [--follow]`, `epic-implementer epic-status`, and
@@ -1264,7 +1391,10 @@ including every error path, ever offers you two paths.
1264
1391
  the strategy and the posture (see below). With none of them, a multi-ticket epic
1265
1392
  runs on `epic/<KEY>`, unattended. It also forwards `--repo` and the policy flags:
1266
1393
  `--policy-file <path>` (the complete run policy), `--review-policy <src>` (a
1267
- per-run review policy), and `--replace-policy` (allow replacing a live run's
1394
+ per-run review policy: `repository_policy`, `verdict_protocol`,
1395
+ `native_review_decision`, or `none`; omitted, the server stamps `repository_policy`
1396
+ at first approval for a new feature-branch run, and `verdict_protocol` is the
1397
+ explicit AI-review opt-in), and `--replace-policy` (allow replacing a live run's
1268
1398
  stored policy).
1269
1399
 
1270
1400
  **Every run gets an executor (BAPI-1279).** Once `drive-epic` creates a run, it
@@ -1660,7 +1790,7 @@ If a custom pipeline has the same key as a built-in pipeline, the custom version
1660
1790
  | `BAPI_MCP_UPGRADE_ADVICE_ENABLED` | No | _(enabled)_ | MCP-local opt-out for proactively surfacing upgrade advice in pipeline recipe preambles. Set to `false`/`0`/`no`/`off`/`disabled` to suppress. Disabling it does **not** change the `/jira/ping` response or server-side upgrade computation — it only gates the recipe-preamble convention |
1661
1791
  | `BAPI_MCP_TOOL_SURFACE_GATING_ENABLED` | No | _(enabled)_ | MCP-local kill switch for **dynamic tool-surface capability gating** (see [Dynamic tool-surface gating](#dynamic-tool-surface-gating-capability-availability)). Default-on; set to `false`/`0`/`no`/`off`/`disabled` to skip the startup probe, the recurring poll, and the custom `tools/list` handler entirely, restoring the SDK's previous full profile-derived surface. Fail-open: any probe timeout, unreachable backend, non-2xx, malformed payload, incomplete evaluation, or unsupported schema advertises the full profile |
1662
1792
  | `BAPI_MCP_TOOL_SURFACE_POLL_ENABLED` | No | _(disabled)_ | Opt IN to the recurring tool-surface **poll**. Default-**off**: a session gates once via the startup probe and never re-probes. Set to `true`/`1`/`yes`/`on`/`enabled` to restore the jittered 12–18 s heartbeat that pushes `notifications/tools/list_changed` on mid-session capability changes. No effect when gating itself is disabled |
1663
- | `BAPI_MCP_UPDATE_CHECK_ENABLED` | No | _(enabled)_ | MCP-local kill switch for the cached update check run at startup. Default-on; set to `false`/`0`/`no`/`off`/`disabled` to skip it entirely — no npm registry request, no update-cache read/write, no stderr advice, and no `tools/list` advisory decoration. Any other value is treated as enabled. Useful behind a firewall/registry-restricted network, and used by the payload-measurement harness so a stale local cache can never perturb a capture |
1793
+ | `BAPI_MCP_UPDATE_CHECK_ENABLED` | No | _(enabled)_ | MCP-local kill switch for the cached update check run at startup. Default-on; set to `false`/`0`/`no`/`off`/`disabled` to skip it entirely — no npm registry request, no update-cache read/write, and no upgrade notice on any surface (see [Upgrade notices](#upgrade-notices)). Any other value is treated as enabled. Useful behind a firewall/registry-restricted network, and used by the payload-measurement harness so a stale local cache can never perturb a capture |
1664
1794
  | `CURSOR_API_KEY` | No | _(none)_ | API key used to authenticate `cursor-agent` when launching `start-tickets`/scheduled runs with `--agent cursor-agent`. Not needed for the default Claude Code agent |
1665
1795
  | `BRIDGE_MCP_PROFILE` | No | `core` | Startup-time tool registration profile — a **comma-separated** list of groups controlling which tool groups are registered when the server starts. `core` is always implicitly included. Valid groups: `core` (default — normal coding tools only), `epic_implementer` (+ the 2 Epic Implementer tools, `get_epic_snapshot` and `explain_run`), `pipeline-authoring` (adds **no** tools since BAPI-909; still accepted so old configs keep working — `get_pipeline_recipe` stays in `core` because the recipe-driven slash commands depend on it), `estimation` (+ `estimate_epic`, which is **hidden by default** — `/estimate-epic` needs this group), `sfcc` (+ the 8 heavy SFCC read tools, `sfcc_log_query`, and the `sfcc_setup_status`/`check_permissions` diagnostics — read-only, see [Salesforce B2C Commerce (SFCC) Tools](#salesforce-b2c-commerce-sfcc-tools)), `sfcc-write` (+ the 9 destructive SFCC write tools — independent of `sfcc`, which does not enable them; see [Read and write profiles](#read-and-write-profiles)), and `full` (shortcut that expands to every group, **including `estimation` and `sfcc-write`**). Example: `sfcc,epic_implementer`; use `sfcc,sfcc-write` for reads plus writes. Unknown, blank, or malformed tokens are dropped (falling back to `core`). Dynamic mid-session switching via `tools/list_changed` is unsupported — groups are resolved once at process startup, so **changing this variable requires restarting the MCP server**. That is separate from the learn/onboarding tools, which are gated per session and can appear mid-session without a restart (see [Learn/onboarding tool availability](#learnonboarding-tool-availability)). Epic Implementer sessions launched via `start-tickets --conductor` **merge** `epic_implementer` into the parent process's already-resolved groups at the spawn boundary rather than replacing them — a project running on `sfcc` spawns workers on `core,sfcc,epic_implementer`. The retired token `conductor` is no longer valid and is dropped like any unknown token. A normal `start-tickets` run stays on `core`. |
1666
1796
 
@@ -1953,3 +2083,94 @@ plus `total_steps`, `auto_approve`, and `execution_mode`. Each step is either an
1953
2083
  text). `execution_mode` is `inline` — the calling agent executes every step
1954
2084
  itself and keeps its own durable record through `record_phase_result` /
1955
2085
  `record_checkpoint`. There is no server-side orchestrator and no run to resume.
2086
+
2087
+
2088
+ ## Start Tickets troubleshooting
2089
+
2090
+ `start-tickets` reports actual worktree paths and branches in its stable summary,
2091
+ then explains successfully spawned sessions. Work from each reported folder: its
2092
+ branch is already checked out there and normally cannot also be checked out in
2093
+ the original folder. Folder names and locations come from Worktrunk configuration;
2094
+ do not infer them from the original checkout.
2095
+
2096
+ Monitor the selected agent in the reported Terminal/iTerm tab, Windows Terminal
2097
+ tab, PowerShell fallback window, or detached tmux session. Linux output prints
2098
+ the exact `tmux attach -t ...` commands. When a destination is not reported, treat
2099
+ it as unknown. A spawned session has started; it has not completed implementation
2100
+ or review. Review workflows review independently before opening a fresh
2101
+ implementation session. Coordinate ownership across multiple independent
2102
+ sessions and pause affected work when overlapping changes cause conflicts.
2103
+
2104
+ For mixed failures, only `spawned` rows describe running sessions. Retain failed
2105
+ row warnings and the CLI exit status. Dry-run and all-failed results open no
2106
+ successful sessions. After a failure, read-only diagnostics are allowed:
2107
+
2108
+ ```bash
2109
+ npx -y @bridge_gpt/mcp-server doctor --agent codex
2110
+ ```
2111
+
2112
+ The interactive installer separates **Required for launcher** tools from
2113
+ **Recommended diagnostics** (`uv`, selected agent, ast-grep, ripgrep, lizard).
2114
+ Missing recommendations and the **Git compatibility advisory** add no install or
2115
+ launcher admission gate. Doctor performs no automatic repair, installation, PATH
2116
+ mutation, authentication, or terminal launch. The existing launcher still checks
2117
+ Git presence and repository work-tree context at launch.
2118
+
2119
+ ### Worktrunk and Git compatibility evidence
2120
+
2121
+ The documented comparison baseline is **Worktrunk v0.80.0**, whose
2122
+ [tagged Git-version source](https://github.com/max-sixty/worktrunk/blob/v0.80.0/src/git/version.rs)
2123
+ sets the minimum to **Git 2.43.0**. This is the release-specific baseline Bridge
2124
+ recommends for this advisory, not a universal rule for every Worktrunk release or
2125
+ a requirement to install the latest Git. The onboarding report observed Git
2126
+ **2.39.5** being rejected with a **2.43.0** minimum; it did not identify the
2127
+ Worktrunk release, so that observation alone is not release verification.
2128
+
2129
+ Doctor and the installer report the resolved Git executable and numeric version
2130
+ when available, with compatible, incompatible, and unknown advisory states.
2131
+ An arbitrary nonempty `BAPI_WORKTRUNK_BIN` override has an unconfirmed release
2132
+ requirement and is not assumed compatible with this baseline. On macOS,
2133
+ installing another Git does not ensure the launcher resolves it. Verify the
2134
+ executable and version selected on PATH before changing your installation:
2135
+
2136
+ ```bash
2137
+ which git
2138
+ git --version
2139
+ ```
2140
+
2141
+ ### Saved planning work and launch readiness
2142
+
2143
+ Successful ticket/plan creation does not establish executor, policy, VCS, or
2144
+ indexing readiness. A finalized epic completion may show one bounded read-only
2145
+ `drive-epic '<EPIC>' --dry-run --json` preview. Ready means **ready at preview
2146
+ time**; a conditional cold start still needs guarded startup/live validation.
2147
+ Returned target, refusal reasons, remedies, and `availability_text` remain
2148
+ authoritative. An unavailable preview leaves readiness unconfirmed while saved
2149
+ work remains successful. Free-form plans or unresolved child keys must be
2150
+ finalized first. Actual launch retains its consent and admission checks.
2151
+
2152
+ ## Backend-owned bootstrap identity (BAPI-1438)
2153
+
2154
+ Ordinary new creation uses a friendly display label. Labels may repeat and never
2155
+ select credentials. For a scripted operator invite use `install --invite --display-name "My project"`
2156
+ and supply the invitation through the existing private input mechanism. In an
2157
+ interactive terminal the folder basename is a suggested label. Self-serve signup
2158
+ still requires emailed-code verification in an interactive terminal.
2159
+
2160
+ Use `--repo <canonical-name>` or `BAPI_REPO_NAME` for existing-key registration
2161
+ or explicit legacy creation. Existing keys cannot use `--display-name`; creation
2162
+ cannot combine that flag with a canonical selector.
2163
+
2164
+ Rerun from the original folder with the same invitation or signup method after
2165
+ an interrupted install. The original proof and label are reused; another entered
2166
+ label does not rename the recovered project. Preserve recovery storage when an
2167
+ outcome is unknown, a challenge cannot be recovered, or installation asks for support.
2168
+ Never delete possibly redeemed proof to restart. Ordinary invite tokens and
2169
+ verification codes are not stored.
2170
+
2171
+ Credential storage uses bounded exclusive locking without timeout-based stealing.
2172
+ An abandoned lock needs installation support. POSIX systems sync the containing
2173
+ directory; Windows uses file sync plus atomic replacement because portable Node
2174
+ directory handles are unavailable. A failure after rename is an uncertain durability
2175
+ outcome: the new bytes may already exist. Rerun reloads the actual store under lock;
2176
+ there is no guarantee that old pending bytes survive every failure.
@@ -1,6 +1,7 @@
1
1
  import { evaluateClaudeMcpShadowingPolicy, inspectClaudeUserConfigForMcpShadowing, resolveClaudeUserConfigPath, } from "../claude-user-config-doctor.js";
2
2
  import { createDefaultAgentCapabilitiesDeps } from "../agent-capabilities/default-deps.js";
3
3
  import { runDenyEnforcementPreflight, } from "../conductor/deny-enforcement-preflight.js";
4
+ import { CLAUDE_DISABLE_AUTO_MEMORY_ENV } from "../claude-settings.js";
4
5
  import { buildExecutorBaseWorkerEnv } from "../executor/env.js";
5
6
  import { ExecutorNamedError } from "../executor/job-errors.js";
6
7
  import { provisionExecutorDenyLayer } from "../executor/permissions.js";
@@ -267,6 +268,24 @@ export function buildClaudeWatcherNudgeMessage(liveTaskIds) {
267
268
  "background log tail), you may stop that watcher. Do not cancel, kill, or abandon any " +
268
269
  "required work in order to finish sooner.");
269
270
  }
271
+ /**
272
+ * BAPI-1395 — the nudge sent when the post-result completion window opens and
273
+ * only the worker's own background Bash is live. The executor cannot tell a
274
+ * task that merely waits (a polling loop, a `sleep`) from a genuine background
275
+ * operation, so it must not ask for blanket cancellation: only tasks that are
276
+ * merely waiting are to be stopped.
277
+ */
278
+ export function buildClaudeCompletionWindowNudgeMessage(liveTaskIds) {
279
+ const ids = liveTaskIds
280
+ .map((id) => boundedIdentifier(id))
281
+ .filter((id) => id !== null)
282
+ .slice(0, NUDGE_MAX_TASK_IDS);
283
+ const named = ids.length > 0 ? ` (task ids: ${ids.join(", ")})` : "";
284
+ return claudeStdinUserLine(`Your result was received, but background shell tasks you started are still running${named}. ` +
285
+ "Stop only the tasks of your own that are merely waiting (for example a sleep or a polling " +
286
+ "loop). Leave any background operation that is doing real work running so it can finish and " +
287
+ "report its outcome. Do not cancel, kill, or abandon required work in order to finish sooner.");
288
+ }
270
289
  // ---------------------------------------------------------------------------
271
290
  // Runtime identity probe (BAPI-1301, D4a)
272
291
  // ---------------------------------------------------------------------------
@@ -372,6 +391,13 @@ export function buildClaudeWorkerEnv(parentEnv, options = {}) {
372
391
  if (typeof token === "string") {
373
392
  env[CLAUDE_OAUTH_TOKEN_ENV] = token;
374
393
  }
394
+ // BAPI-1397 (F6) — a worker must never write the OWNER's Claude auto-memory.
395
+ // The deny-layer provisioning also writes `autoMemoryEnabled: false` into the
396
+ // worktree's settings; the environment form is set here as well because it
397
+ // wins over settings and does not depend on that file write succeeding. Set
398
+ // after the parent environment is filtered, so nothing inherited can turn it
399
+ // back on.
400
+ env[CLAUDE_DISABLE_AUTO_MEMORY_ENV] = "1";
375
401
  return env;
376
402
  }
377
403
  /**
@@ -620,6 +646,7 @@ export function createClaudeExecutorAdapter(spec, deps = {}) {
620
646
  transport: COMPLETION_EVIDENCE_TRANSPORT,
621
647
  probeRuntime: (probeDeps) => probeClaudeCompletionRuntime(spec.command, probeDeps),
622
648
  buildWatcherNudge: buildClaudeWatcherNudgeMessage,
649
+ buildCompletionWindowNudge: buildClaudeCompletionWindowNudgeMessage,
623
650
  };
624
651
  return {
625
652
  identity: {