@bridge_gpt/mcp-server 0.2.66 → 0.2.68

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 (171) hide show
  1. package/README.md +421 -83
  2. package/build/agent-capabilities/probes.js +15 -5
  3. package/build/agent-launchers/claude-executor-adapter.js +70 -16
  4. package/build/agent-launchers/executor-adapter.js +7 -4
  5. package/build/agents.generated.js +22 -2
  6. package/build/bitbucket-workspace-remote.js +136 -0
  7. package/build/bootstrap-project-identity.js +24 -0
  8. package/build/bounded-wait.js +67 -10
  9. package/build/bridge-permissions.js +829 -0
  10. package/build/claude-settings.js +18 -0
  11. package/build/cli-help.js +21 -0
  12. package/build/command-assets-doctor.js +24 -70
  13. package/build/command-provisioning.js +29 -5
  14. package/build/commands.generated.js +12 -12
  15. package/build/conductor/bridge-api-client.js +857 -1
  16. package/build/conductor/bring-up-facts.js +1 -1
  17. package/build/conductor/command-drift-production.js +92 -0
  18. package/build/conductor/command-drift.js +89 -0
  19. package/build/conductor/doctor.js +72 -29
  20. package/build/conductor/epic-branch-ci-inspection.js +1375 -0
  21. package/build/conductor/epic-implementer-cli.js +98 -28
  22. package/build/conductor/errors.js +4 -3
  23. package/build/conductor/gate-discovery.js +890 -0
  24. package/build/conductor/guided-repair.js +6 -2
  25. package/build/conductor/hook-runtime-qualification.js +1 -1
  26. package/build/conductor/install-doctor.js +15 -3
  27. package/build/conductor/json-output.js +63 -0
  28. package/build/conductor/merge-execution-contract.js +27 -8
  29. package/build/conductor/merge-execution-eligibility.js +3 -2
  30. package/build/conductor/pr-ci-producer.js +1 -1
  31. package/build/conductor/readiness-cli.js +113 -12
  32. package/build/conductor/readiness-sections.js +410 -9
  33. package/build/conductor/readiness.js +388 -33
  34. package/build/conductor/recovery-cli.js +310 -12
  35. package/build/conductor/recovery-operations.js +167 -3
  36. package/build/conductor/repair-contract.js +54 -3
  37. package/build/conductor/repository-workflow-remedy.js +125 -0
  38. package/build/conductor/tools.js +2 -2
  39. package/build/conductor-bundle-artifacts.js +8 -0
  40. package/build/connect-bitbucket-api.js +41 -6
  41. package/build/connect-bitbucket.js +106 -33
  42. package/build/credential-store.js +207 -47
  43. package/build/docs.generated.js +62 -3
  44. package/build/doctor.js +92 -1
  45. package/build/drive-epic-key.js +6 -5
  46. package/build/drive-epic.js +129 -61
  47. package/build/epic-coherence-input.js +2 -1
  48. package/build/epic-coherence-input.test-fixtures.js +4 -3
  49. package/build/epic-implementer-bin.js +1379 -28
  50. package/build/epic-implementer-bundle-cli.js +2 -2
  51. package/build/epic-workarounds-path.js +39 -0
  52. package/build/executor/cli.js +33 -2
  53. package/build/executor/completion-contract.js +66 -10
  54. package/build/executor/completion-supervision.js +4 -0
  55. package/build/executor/deps.js +4 -1
  56. package/build/executor/env.js +19 -0
  57. package/build/executor/gate-qualification-job.js +499 -0
  58. package/build/executor/guarded-fast-forward-push.js +129 -0
  59. package/build/executor/heartbeat.js +1 -1
  60. package/build/executor/http-client.js +20 -0
  61. package/build/executor/integration-job.js +122 -8
  62. package/build/executor/job-errors.js +33 -1
  63. package/build/executor/job-runner.js +813 -87
  64. package/build/executor/likely-tests.js +290 -0
  65. package/build/executor/live-worker-registry.js +1 -1
  66. package/build/executor/observation.js +37 -3
  67. package/build/executor/packaged-recipe.js +106 -0
  68. package/build/executor/permissions.js +115 -28
  69. package/build/executor/platform.js +1 -1
  70. package/build/executor/preflight.js +112 -26
  71. package/build/executor/process-containment.js +36 -12
  72. package/build/executor/process.js +15 -7
  73. package/build/executor/prompt-spec.js +33 -1
  74. package/build/executor/recently-failed-tests-file.js +71 -0
  75. package/build/executor/reconcile-overlap-job.js +41 -23
  76. package/build/executor/required-verification.js +1 -1
  77. package/build/executor/required-work-ledger.js +111 -18
  78. package/build/executor/resume-pre-spawn.js +2 -0
  79. package/build/executor/retirement.js +69 -0
  80. package/build/executor/runner.js +122 -13
  81. package/build/executor/service-unit.js +7 -1
  82. package/build/executor/test-clock.js +15 -0
  83. package/build/executor/types.js +32 -0
  84. package/build/executor/viewer-tabs.js +58 -8
  85. package/build/executor/worker-command.js +23 -7
  86. package/build/executor/worker-diagnostics.js +37 -0
  87. package/build/executor/worker-finalization.js +113 -34
  88. package/build/executor/worker-guard-hook.js +316 -58
  89. package/build/executor/worker-log.js +4 -3
  90. package/build/executor/worker-verification-guidance.js +37 -0
  91. package/build/executor/worktree.js +166 -8
  92. package/build/first-build-advisory.js +97 -0
  93. package/build/generated-assets-advisory.js +14 -0
  94. package/build/generated-assets-catalog.js +66 -0
  95. package/build/generated-assets-context.js +46 -0
  96. package/build/generated-assets-dependencies.js +26 -0
  97. package/build/generated-assets-doctor.js +50 -0
  98. package/build/generated-assets-health.js +65 -0
  99. package/build/generated-assets-host.js +17 -0
  100. package/build/generated-assets-inventory.js +17 -0
  101. package/build/generated-assets-paths.js +60 -0
  102. package/build/generated-assets-publisher.js +133 -0
  103. package/build/generated-assets-remedy.js +25 -0
  104. package/build/generated-assets-repair.js +72 -0
  105. package/build/generated-assets-session.js +71 -0
  106. package/build/generated-assets-test-support.js +35 -0
  107. package/build/index.js +1224 -1054
  108. package/build/init.js +54 -177
  109. package/build/install-bridge-conductor-gate.js +1372 -0
  110. package/build/install-bridge-conductor.js +296 -41
  111. package/build/install-bridge.js +547 -40
  112. package/build/mcp-install-state.js +50 -4
  113. package/build/merge-workflow-install.js +3 -4
  114. package/build/phase-context-git-probe.js +68 -0
  115. package/build/phase-result-artifacts.js +173 -5
  116. package/build/pipeline-utils.js +6 -2
  117. package/build/pipelines.generated.js +34 -160
  118. package/build/plan-execution-ledger.js +2 -32
  119. package/build/plane/alembic-head.js +12 -3
  120. package/build/plane/base-worktree-guard.js +147 -0
  121. package/build/plane/cli.js +217 -17
  122. package/build/plane/code-snapshot.js +468 -0
  123. package/build/plane/defaults.js +48 -3
  124. package/build/plane/endpoint.js +41 -0
  125. package/build/plane/manifest.js +136 -2
  126. package/build/plane/member-roster.js +94 -19
  127. package/build/plane/preflight.js +83 -2
  128. package/build/plane/process-cwd.js +67 -0
  129. package/build/plane/restart.js +542 -0
  130. package/build/plane/shutdown.js +31 -0
  131. package/build/plane/status.js +143 -8
  132. package/build/plane/supervisor.js +586 -179
  133. package/build/plane/types.js +54 -2
  134. package/build/printed-remedy-commands.js +52 -0
  135. package/build/readiness-check.js +1 -1
  136. package/build/readme.generated.js +1 -1
  137. package/build/repair-assets.js +93 -0
  138. package/build/review-generation.js +22 -0
  139. package/build/run-unit-tests-launcher.js +130 -49
  140. package/build/secret-redaction.js +33 -0
  141. package/build/setup-epic.js +152 -22
  142. package/build/sfcc/config.js +9 -0
  143. package/build/sfcc/credentials.js +100 -38
  144. package/build/sfcc/hostname.js +67 -0
  145. package/build/sfcc/permissions.js +17 -13
  146. package/build/sfcc/register.js +1 -1
  147. package/build/sfcc/tool-wrapper.js +39 -43
  148. package/build/sfcc/write-grants.js +17 -11
  149. package/build/sfcc/write-result.js +4 -3
  150. package/build/sfcc/writes-site-preference.js +20 -8
  151. package/build/start-tickets-prereqs.js +70 -16
  152. package/build/start-tickets.js +208 -36
  153. package/build/tool-error-envelope.js +61 -0
  154. package/build/tool-surface-gating.js +36 -0
  155. package/build/upgrade-cli.js +55 -1
  156. package/build/version.generated.js +3 -3
  157. package/build/visual-diff.js +22 -1
  158. package/build/worker-guard-hook-bin.js +4 -6
  159. package/build/worker-guard-hook-main.js +47 -0
  160. package/build/worktree-core.js +145 -6
  161. package/docs/EPIC-IMPLEMENTER-INSTALL.md +867 -0
  162. package/docs/EPIC-IMPLEMENTER.md +728 -0
  163. package/docs/install/mcp-tool-integrations.md +24 -15
  164. package/docs/install/sfcc-integration.md +12 -4
  165. package/package.json +3 -3
  166. package/pipelines/greenfield-setup.json +4 -128
  167. package/pipelines/implement-ticket.json +3 -2
  168. package/pipelines/plan-epic.json +0 -5
  169. package/pipelines/review-ticket.json +1 -1
  170. package/docs/CONDUCTOR.md +0 -605
  171. package/pipelines/idea-to-pr.json +0 -49
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
@@ -60,6 +79,7 @@ account — it will ask.
60
79
  - [Operational commands](#operational-commands)
61
80
  - [Extra Capabilities](#extra-capabilities)
62
81
  - [Salesforce B2C Commerce (SFCC) Tools](#salesforce-b2c-commerce-sfcc-tools)
82
+ - [Epic Implementer](#epic-implementer)
63
83
  - [CLI Subcommands](#cli-subcommands)
64
84
  - [Custom Pipelines](#custom-pipelines)
65
85
  - [Environment Variables](#environment-variables)
@@ -67,7 +87,7 @@ account — it will ask.
67
87
  - [Personal model routing preferences](#personal-model-routing-preferences)
68
88
  - [Reference](#reference)
69
89
 
70
- For advanced epic/multi-agent orchestration, see [CONDUCTOR.md](./docs/CONDUCTOR.md).
90
+ To drive a whole epic of tickets automatically, start with [Epic Implementer](#epic-implementer) below. The command details are in [The Epic Implementer](#the-epic-implementer), and the full reference is [EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md).
71
91
 
72
92
  ## Installation details
73
93
 
@@ -216,8 +236,8 @@ re-run the command from the right directory — if you already had a `.vscode/`,
216
236
  (`npx -y @bridge_gpt/mcp-server`) with no subcommand, you started the MCP *server*,
217
237
  not the installer. It is waiting for an editor to connect over stdio, which is
218
238
  exactly what it should do when your editor launches it — but from a terminal it
219
- looks like a hang. It prints a line saying so. Press Ctrl-C and run
220
- `npx -y @bridge_gpt/mcp-server install` instead. The explicit spelling
239
+ looks like a hang. It prints a stderr guidance block explaining this. Press Ctrl-C
240
+ and run `npx -y @bridge_gpt/mcp-server install` instead. The explicit spelling
221
241
  `npx -y @bridge_gpt/mcp-server serve` starts the server on purpose.
222
242
 
223
243
  **"It can't reach Bridge" or "my key was rejected."** The installer checks
@@ -373,7 +393,7 @@ later boot.
373
393
  "mcpServers": {
374
394
  "bridge": {
375
395
  "command": "npx",
376
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.66", "serve"],
396
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.68", "serve"],
377
397
  "env": {
378
398
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
379
399
  "BAPI_REPO_NAME": "your-repo",
@@ -395,7 +415,7 @@ later boot.
395
415
  "bridge": {
396
416
  "type": "stdio",
397
417
  "command": "npx",
398
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.66", "serve"],
418
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.68", "serve"],
399
419
  "env": {
400
420
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
401
421
  "BAPI_REPO_NAME": "your-repo",
@@ -417,7 +437,7 @@ later boot.
417
437
  "bridge": {
418
438
  "type": "stdio",
419
439
  "command": "npx",
420
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.66", "serve"],
440
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.68", "serve"],
421
441
  "env": {
422
442
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
423
443
  "BAPI_REPO_NAME": "your-repo",
@@ -440,7 +460,7 @@ Windsurf only supports global MCP configuration.
440
460
  "mcpServers": {
441
461
  "bridge": {
442
462
  "command": "npx",
443
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.66", "serve"],
463
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.68", "serve"],
444
464
  "env": {
445
465
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
446
466
  "BAPI_REPO_NAME": "your-repo",
@@ -459,7 +479,7 @@ Windsurf only supports global MCP configuration.
459
479
  ```toml
460
480
  [mcp_servers.bridge]
461
481
  command = "npx"
462
- args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.66", "serve"]
482
+ args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.68", "serve"]
463
483
 
464
484
  [mcp_servers.bridge.env]
465
485
  BAPI_BASE_URL = "https://bridgegpt-api.com"
@@ -584,7 +604,7 @@ The tools worth knowing for most tickets.
584
604
  - **What it does:** Analyzes a single task or feature specification to define, refine, and structure one or more actionable Jira tickets. It maps the code paths, dependencies, and project conventions the task would touch, settles acceptance criteria with you on a decision page, then compares the viable implementation approaches and their trade-offs so the ticket work is grounded in the real codebase. Along the way it surfaces the ambiguities that still need deciding and can pull in optional web or deep research where the answer is not in the code.
585
605
  - **When it's useful:** (Architecture | Refinement) Before writing a ticket or a plan, when you're unsure how a change would fit the existing code and want the open questions and the realistic options laid out first.
586
606
  - **How to use it:** `/define-tickets <task>` — *"Define the tickets we'd need to add a Mistral LLM provider."*
587
- - **Flags:** None.
607
+ - **Flags:** `--auto` runs unattended, `--allow-duplicate` proceeds past a known duplicate, and `--max-children=N` caps the ticket count (default 10). `--allow-duplicate` and `--max-children=N` take effect only with `--auto`.
588
608
 
589
609
  **5. AI Council**
590
610
  - **What it does:** Fans your problem out to two different models and returns their approaches, in technical, design, discovery, or general mode.
@@ -638,6 +658,12 @@ Good to know, but not needed every day.
638
658
  - **How to use it:** `/create-decision-page <topic or open questions>` — e.g. *"how we handle rate limiting"* — or leave it empty to frame the open choices already raised earlier in the conversation.
639
659
  - **Flags:** None.
640
660
 
661
+ **7. Drive Epic Run**
662
+ - **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.
663
+ - **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.
664
+ - **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.
665
+ - **Flags:** None — the epic key and an optional plan path are the only arguments.
666
+
641
667
  ### Now and then
642
668
 
643
669
  Useful once in a while.
@@ -738,10 +764,10 @@ Slash commands that drive several tools at once. Start Tickets, Review and Start
738
764
  - **Flags:** None — name a specific standards file in your request to have it applied when drafting.
739
765
 
740
766
  **3. Idea to Ticket**
741
- - **What it does:** Turns a one-line idea into a Jira Task/Spike (or an Epic plus child tickets), with research, duplicate detection, and a critique pass built in.
742
- - **When it's useful:** (Refinement | Automation) When you have a rough idea and want a fully-formed, uploaded ticket without the manual draft-and-refine loop.
767
+ - **What it does:** A deprecation alias for `/define-tickets`, kept for one release. It prints a one-line notice and forwards your idea and flags unchanged to `/define-tickets`.
768
+ - **When it's useful:** (Refinement | Automation) Only while you migrate; use `/define-tickets` for new work.
743
769
  - **How to use it:** `/idea-to-ticket <idea>`
744
- - **Flags:** None.
770
+ - **Flags:** `--auto`, `--allow-duplicate`, and `--max-children=N`, all forwarded to `/define-tickets`. Without `--auto` you get the attended `define-tickets` flow; `--allow-duplicate` and `--max-children=N` take effect only with `--auto`.
745
771
 
746
772
  **4. Plan Epic**
747
773
  - **What it does:** Decomposes a large epic into sub-tasks with a structured exploration doc for each.
@@ -751,7 +777,8 @@ Slash commands that drive several tools at once. Start Tickets, Review and Start
751
777
 
752
778
  #### Ticket-authoring posture
753
779
 
754
- `/define-tickets`, `/idea-to-ticket`, and `/plan-epic` all decide ticket shape
780
+ `/define-tickets` is the single ticket-creation entry point. It, the deprecated
781
+ `/idea-to-ticket` alias, and `/plan-epic` all decide ticket shape
755
782
  the same way, as does the `jira-ticket-writer` agent they draft through. A fresh install inherits this with no configuration
756
783
  step and no server call; the full rationale and the closed exception list ship as
757
784
  `docs/bridge-ticket-authoring.md`.
@@ -774,7 +801,7 @@ step and no server call; the full rationale and the closed exception list ship a
774
801
  then fans out one writer invocation per entry against that frozen manifest. A
775
802
  rendering invocation never re-splits, merges, reorders, or rescopes.
776
803
  - **Handed off once.** An epic handoff names exactly one entry point,
777
- [`drive-epic`](#drive-epic) — never a choice between conductors.
804
+ [`drive-epic`](#drive-epic) — never a choice between two ways to run it.
778
805
 
779
806
  **5. Run Tests**
780
807
  - **What it does:** Runs the unit and E2E suites and autonomously triages/fixes failures (via the test-correction agent).
@@ -883,13 +910,13 @@ Accepted key spellings: `hostname`/`host`, `client-id`/`clientId`/`client_id`, `
883
910
 
884
911
  Credentials resolve in **three tiers, highest first** — the environment wins over `dw.json`, not the other way round:
885
912
 
886
- 1. An explicit dotted `instance` argument on the call, **plus** `SFCC_CLIENT_ID` and `SFCC_CLIENT_SECRET` in the environment. Secrets are never read from `dw.json` on this tier, so an explicit instance without those two env values is an error.
913
+ 1. An explicit dotted `instance` argument on the call. An unapproved host is refused with `403` `TARGET_NOT_SANDBOX` **before** any credential lookup. An approved host is matched against the configs in `dw.json` (single or `configs[]`); a config for that exact host supplies the credentials. Otherwise `SFCC_CLIENT_ID` and `SFCC_CLIENT_SECRET` in the environment are the fallback, and with neither the call fails as `CREDENTIAL_RESOLUTION_FAILED` (`400`).
887
914
  2. `SFCC_HOSTNAME` **and** `SFCC_CLIENT_ID` **and** `SFCC_CLIENT_SECRET`, all three set.
888
915
  3. `dw.json`.
889
916
 
890
917
  Because tier 2 outranks tier 3, a stale `SFCC_HOSTNAME` left in the environment silently wins over the `dw.json` you are looking at. Check both when a tool reports an unexpected host.
891
918
 
892
- **Use a single-config `dw.json`, or set all three `SFCC_*` variables.** A multi-entry `configs[]` array is **rejected outright** — it is not a working setup that merely requires an explicit `instance` on every call. Two things make that workaround unavailable: an explicit `instance` takes tier 1, which needs the client id and secret in the environment anyway, and most tools cannot accept a hostname at all — the value must contain a dot, and the site-preference tools constrain `instance` to `staging | development | sandbox | production`, none of which is a hostname.
919
+ **With a multi-entry `configs[]` array, name the sandbox on each call.** Pass one of the listed hostnames as `instance` and that config's credentials are used. Without an `instance`, a multi-config `dw.json` fails as `multi-sandbox`, listing the full hostnames. Most tools cannot accept a hostname at all — the value must contain a dot, and the site-preference tools constrain `instance` to `staging | development | sandbox | production`, none of which is a hostname — so a single-config `dw.json` (or all three `SFCC_*` variables) remains the simplest setup.
893
920
 
894
921
  **3. Enable the tools you want.** Add the groups to `BRIDGE_MCP_PROFILE` in the MCP server `env` block (it is comma-separated), then **restart the MCP client**:
895
922
 
@@ -904,9 +931,9 @@ Because tier 2 outranks tier 3, a stale `SFCC_HOSTNAME` left in the environment
904
931
  Read what it prints before pasting it. The output is **two labelled blocks**, and they are not equivalent:
905
932
 
906
933
  - **READ/SEARCH TOOL GRANTS** — what the `sfcc` read tools need: `get` on `/system_object_definitions`, and `get` + `post` on `/system_object_definitions/**`, `/site_preferences/**`, and `/custom_object_definitions/**`. The `post` is OCAPI's convention for its `*_search` endpoints, not a mutation — but it is a grant you are pasting, so it is labelled for what it is rather than as "read-only".
907
- - **MUTATION GRANTS** — required by the nine `sfcc-write` tools and by nothing else: `put`/`patch` on `/system_object_definitions/**` and `/custom_object_definitions/**`, and `patch` on `/site_preferences/**`. Paste this block only if you intend to enable `sfcc-write`.
934
+ - **MUTATION GRANTS** — required by the nine `sfcc-write` tools and by nothing else: `put`/`patch` on `/system_object_definitions/**` and `/custom_object_definitions/**`, and `patch` on `/sites/*/site_preferences/**` (value writes are site-scoped; the read/search grant keeps the org-level `/site_preferences/**`). Paste this block only if you intend to enable `sfcc-write`. **If you pasted an earlier mutation grant, it lacks the site-scoped resource:** replace `<YOUR_CLIENT_ID>` with your client id in the newly printed grant and paste it again before running value writes.
908
935
 
909
- Neither block grants `delete`, and neither pastes the global `resource_id: "/**"` that would cover every Data API resource. Each entry names one resource family — `/system_object_definitions`, `/custom_object_definitions/**`, `/site_preferences/**` — so the wildcard is scoped to the family, not to the API. Within a family it is still broad, and `write_attributes` is `(**)`, so a throwaway sandbox is the right place for these.
936
+ Neither block grants `delete`, and neither pastes the global `resource_id: "/**"` that would cover every Data API resource. Each entry names one resource family — `/system_object_definitions`, `/custom_object_definitions/**`, `/site_preferences/**` (read/search), `/sites/*/site_preferences/**` (mutation) — so the wildcard is scoped to the family, not to the API. Within a family it is still broad, and `write_attributes` is `(**)`, so a throwaway sandbox is the right place for these.
910
937
 
911
938
  </details>
912
939
 
@@ -982,7 +1009,7 @@ Attribute-definition reads and writes can return an attribute's `default_value`
982
1009
 
983
1010
  **Diagnostics** (registered by the `sfcc` profile)
984
1011
  - `sfcc_setup_status` — report on every prerequisite: Bridge API key, repo name, `version` config, `dw.json` presence/uniqueness, AM (OCAPI) token acquisition, and the independent **SFCC Log Query (WebDAV)** capability that gates `sfcc_log_query`.
985
- - `check_permissions` — probe OCAPI access via `GET /system_object_definitions`; on 401/403, print the exact OCAPI Settings JSON to paste in Business Manager (read/search grants for the `sfcc` tools, mutation grants for the `sfcc-write` tools). An explicit `instance` hostname is still subject to the sandbox check below.
1012
+ - `check_permissions` — probe OCAPI **read** access via `GET /system_object_definitions` (it does not probe write access); on 401/403, print the exact OCAPI Settings JSON to paste in Business Manager (read/search grants for the `sfcc` tools, mutation grants for the `sfcc-write` tools). An explicit `instance` hostname is still subject to the sandbox check below.
986
1013
 
987
1014
  **System object model — reads** (needs the `sfcc` profile)
988
1015
  - `system_object_list` — list system object types (Product, Order, Customer, …).
@@ -1007,7 +1034,7 @@ Attribute-definition reads and writes can return an attribute's `default_value`
1007
1034
  - `site_preference_group_list` — list the preference groups on a site. This is the discovery tool the other two reads depend on: both take a group, and this is how you find one.
1008
1035
  - `site_preference_get` — list the preference **identifiers** in a group.
1009
1036
  - `site_preference_search` — search/filter preference identifiers within a group.
1010
- - `site_preference_values_set` — **write** (sandbox only): set custom preference values via `PATCH /site_preferences/preference_groups/{group}/sandbox` with a flat map of `c_`-prefixed ids to string/number/boolean/string[] values. A bad group returns 404 `CustomPreferenceGroupNotFoundException`; echoes grant JSON on 403.
1037
+ - `site_preference_values_set` — **write** (sandbox only): set custom preference values for one required `site_id` via `PATCH /sites/{site_id}/site_preferences/preference_groups/{group}/sandbox` with a flat map of `c_`-prefixed ids to string/number/boolean/string[] values. A bad group returns 404 `CustomPreferenceGroupNotFoundException`; echoes grant JSON on 403.
1011
1038
 
1012
1039
  > **Site preference values are write-only through this surface.** `site_preference_get` and `site_preference_search` return **ids only, never values** — an unset preference and one set to the empty string are indistinguishable. So you can *set* a value with `site_preference_values_set` and have no way to read it back through an MCP tool. Business Manager is the supported path to read a preference value.
1013
1040
 
@@ -1019,6 +1046,77 @@ Attribute-definition reads and writes can return an attribute's `default_value`
1019
1046
  - **Auth is separate from OCAPI.** Log retrieval uses **HTTP Basic auth** — a Business Manager username + a **40-character WebDAV access key** — *not* the OCAPI Account Manager OAuth token the other SFCC tools use. A valid AM bearer token 401s on `/Logs`. `sfcc_setup_status` step 5 (AM/OCAPI token) and step 6 (WebDAV log access) are independent: one can be green while the other is not.
1020
1047
  - **Local / air-gapped fallback.** The primary path above is the only path this tool takes. For air-gapped development, the documented fallback is Salesforce's own **`@salesforce/b2c-cli`**, shelled out to directly: `b2c logs get --since <window> --search <q> --json`. There is no MCP alternative to reach for — `@salesforce/b2c-dx-mcp` ships **no `logs_*` tool** as of 1.1.2, and every log workflow in the vendor toolkit goes through the CLI anyway (see the [vendor manual](../docs/mcp/b2c-commerce-developer.md)). It is **not** the primary path because its credentials live client-side and its output has **not** passed Bridge's redaction/filter. If you use it, its output must be treated as raw: route it back through the same server-side Python `LogSource` composition and `RedactionPort`/T3 filter workflow — never paste or relay unredacted CLI output to an LLM.
1021
1048
 
1049
+ ## Epic Implementer
1050
+
1051
+ The Epic Implementer drives a whole epic, several related tickets, from an
1052
+ approved plan to merged pull requests. It hands each child ticket to an agent on
1053
+ your machine, waits for CI and code review, and merges each child PR into an
1054
+ `epic/<KEY>` branch. A person merges the final pull request into your default
1055
+ branch.
1056
+
1057
+ By default a run with two or more tickets is **unattended**: it merges child
1058
+ PRs on its own. `--attended` opts out.
1059
+
1060
+ **What it requires**
1061
+
1062
+ - macOS or Linux, with `git`, the GitHub CLI (`gh`, logged in), the Claude Code
1063
+ CLI (`claude`, logged in), and Worktrunk (`wt`) on your `PATH`.
1064
+ - Bridge installed in the repository, and the Bridge GitHub App connected.
1065
+ - The repository's Epic Implementer defaults, including the CI check each
1066
+ ticket must pass (`install conductor`). For unattended runs, that check must
1067
+ be a job in one of the two workflow files below, for example
1068
+ `epic-implementer-ci / gate`.
1069
+ - `.github/workflows/claude-review.yml` and
1070
+ `.github/workflows/epic-implementer-ci.yml` on your default branch, then the
1071
+ repository indexed (or re-indexed) after they merge. The epic branch is cut
1072
+ from the indexed commit.
1073
+ - For unattended runs: an escalation channel (the account email, or a webhook)
1074
+ and a merge credential in `BAPI_LOCAL_MERGE_TOKEN`.
1075
+
1076
+ **How to set it up**
1077
+
1078
+ The easy way is to ask your agent:
1079
+
1080
+ > Set up the Epic Implementer by following `docs/install/epic-implementer-install.md`.
1081
+
1082
+ `install` copies that guide into your project. It is also in this package as
1083
+ [EPIC-IMPLEMENTER-INSTALL.md](./docs/EPIC-IMPLEMENTER-INSTALL.md). It checks
1084
+ each step, asks before anything that writes, and tells you which commands you
1085
+ must run yourself.
1086
+
1087
+ By hand, the outline is:
1088
+
1089
+ ```bash
1090
+ npx -y @bridge_gpt/mcp-server install # if Bridge is not installed yet
1091
+ npx -y @bridge_gpt/mcp-server connect-github --repo <repo_name> # connect the GitHub App
1092
+ npx -y @bridge_gpt/mcp-server install conductor --required-check "epic-implementer-ci / gate" \
1093
+ --review-policy verdict_protocol \
1094
+ --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
1095
+ export BAPI_LOCAL_MERGE_TOKEN="$(gh auth token)" # in the shell that runs drive-epic
1096
+ npx -y @bridge_gpt/mcp-server epic-implementer readiness --json # read-only check of every prerequisite
1097
+ ```
1098
+
1099
+ After `install conductor`, restart your MCP client so the Epic Implementer tools
1100
+ appear. Add `epic-implementer-ci.yml` (the guide has a template) and the
1101
+ `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
1102
+ your default branch. Once it merges, index the repository with
1103
+ `/parse-repository`.
1104
+
1105
+ **How to run an epic**
1106
+
1107
+ 1. `/plan-epic <EPIC>` splits an existing epic ticket into child tickets and
1108
+ writes a plan (`epic-plan.dag.json`). Its last step creates and approves an
1109
+ unattended run.
1110
+ 2. `/drive-epic-run <EPIC> [<plan path>]` previews, asks you once, starts the
1111
+ run, and watches it to the end. It takes no flags. For `--attended` or
1112
+ `--policy-file <path>`, use the shell instead:
1113
+ `npx -y @bridge_gpt/mcp-server drive-epic <EPIC> --plan-file <path> [--attended]`.
1114
+ 3. Monitor with the `get_epic_snapshot` and `explain_run` MCP tools, or
1115
+ `npx -y @bridge_gpt/mcp-server notifications --repo <repo_name> --run <EPIC> --follow`.
1116
+
1117
+ See [The Epic Implementer](#the-epic-implementer) for every command, and
1118
+ [EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md) for the full reference.
1119
+
1022
1120
  ## CLI Subcommands
1023
1121
 
1024
1122
  Beyond `--init` / `--upgrade`, the package ships operational subcommands of the **single `bridge-api-mcp-server` bin** (not separate binaries) — so they travel with the package to every consumer. See [Usage Documentation → Start Tickets](#regularly-useful) for *when* to use `start-tickets`; this section is the full CLI reference.
@@ -1044,7 +1142,7 @@ npx -y @bridge_gpt/mcp-server start-tickets [flags] KEY [KEY ...]
1044
1142
  | `--base-branch <BRANCH>` | `main` | Cut new worktrees from `<BRANCH>` and refresh `origin/<BRANCH>` instead of `main` |
1045
1143
  | `--no-refresh-main` | off (the configured base branch is refreshed) | Skip refresh of the configured base branch (default `main`). Historical flag name preserved for backward compatibility — despite the name, it now skips refresh of whatever `--base-branch` resolves to. |
1046
1144
  | `--max-parallel N` | `3` | Max worktrees created concurrently |
1047
- | `--conductor` | off | Opt into the Conductor system (per-worker `BAPI_EPIC_IMPLEMENTER_*` env + Claude hook injection, lifecycle ledger events, and a supervisor peer tab). **Default off** — a plain run spawns `cd <worktree> && <agent> '/implement-ticket <KEY>'`. |
1145
+ | `--conductor` | off | Opt into Epic Implementer observability (per-worker `BAPI_EPIC_IMPLEMENTER_*` env + Claude hook injection, lifecycle ledger events, and a supervisor peer tab). The flag keeps its name from before the Epic Implementer rename. **Default off** — a plain run spawns `cd <worktree> && <agent> '/implement-ticket <KEY>'`. |
1048
1146
  | `-h`, `--help` | — | Show usage |
1049
1147
 
1050
1148
  Each `KEY` must match `[A-Z]+-[0-9]+` (e.g., `BAPI-248`). The CLI creates/switches each worktree up front (throttled by `--max-parallel`), then opens one tab/session per successful worktree running the selected agent. Claude is the default. Cursor with `--auto` runs headlessly after a bounded authentication/readiness check; manual Cursor runs remain interactive for human review gates. To launch Cursor Agent instead of Claude Code:
@@ -1063,7 +1161,7 @@ For Codex, `GET /jira/codex-model-catalog?repo_name=...` is the sole tier-to-mod
1063
1161
 
1064
1162
  **Machine-carried `--auto-tier` handoff (BAPI-1236).** Passing `--auto-tier cheap|basic|premium` also bypasses the per-ticket difficulty lookup, but — unlike `--tier` — the carried tier IS routed through the launching session's own `maximize_subscription` downshift, exactly once. A malformed, empty, or repeated `--auto-tier` value is a hard parser error (no fail-open sentinel), and `--tier`/`--auto-tier` are mutually exclusive regardless of order. `/review-and-implement` uses this flag, never `--tier`, to hand its review-time raw tier snapshot to the fresh implementation session — so a `maximize_subscription` repo still gets the downshift on the chained handoff instead of silently skipping it.
1065
1163
 
1066
- **Conductor observability (opt-in via `--conductor`, BAPI-394).** Conductor is **off by default**. With `--conductor`, a run mints a conductor `run_id`, emits events into the local ledger (`~/.config/bridge/events.db`), opens a supervisor peer tab, and (for Claude Code) injects a secret-free lifecycle hook into each worktree; it also sets `BRIDGE_MCP_PROFILE=conductor` so workers get the conductor MCP tools. Observability is best-effort — a conductor failure never blocks a spawn, and `--dry-run` performs no conductor side effects. (Epic-tick dispatch always enables conductor internally.) See **[CONDUCTOR.md](./docs/CONDUCTOR.md)** for the full observability, git-hook, done-gate, and auto-merge reference.
1164
+ **Epic Implementer observability (opt-in via `--conductor`, BAPI-394).** The flag keeps its name from before the Epic Implementer rename. Observability is **off by default**. With `--conductor`, a run mints a `run_id`, emits events into the local ledger (`~/.config/bridge/events.db`), opens a supervisor peer tab, and (for Claude Code) injects a secret-free lifecycle hook into each worktree. It also **merges** `epic_implementer` into the workers' `BRIDGE_MCP_PROFILE`, so workers get the Epic Implementer MCP tools. Observability is best-effort — a failure here never blocks a spawn, and `--dry-run` performs no observability side effects. See **[EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md)** for the full observability, git-hook, done-gate, and auto-merge reference.
1067
1165
 
1068
1166
  **Cross-platform spawning.** The CLI routes spawning per platform; `--dry-run` previews the platform-correct command form on any OS. An unsupported `process.platform` (not `darwin`/`win32`/`linux`) fails fast with a clear "unsupported platform" message.
1069
1167
 
@@ -1073,6 +1171,55 @@ For Codex, `GET /jira/codex-model-catalog?repo_name=...` is the sole tier-to-mod
1073
1171
 
1074
1172
  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).
1075
1173
 
1174
+ ### Missing packaged workflow files
1175
+
1176
+ Run read-only `doctor` to distinguish absent, unreadable, unsafe, and uncertain
1177
+ workflow files. Healthy discovery adds no recovery prose. Confirmed loss in a
1178
+ root-bound initialized installation adds bounded recovery metadata and guidance;
1179
+ unknown hosts, fallback roots, legacy inventories, and newer bundle additions do
1180
+ not establish historical loss. Readable customized or uncommitted files count as
1181
+ present; committing generated files is unnecessary.
1182
+
1183
+ ```sh
1184
+ npx -y '@bridge_gpt/mcp-server@<running-version>' repair-assets --project-root '/path/to/project' --host claude
1185
+ ```
1186
+
1187
+ Replace `<running-version>` with the running package version. Both explicit root and host
1188
+ options authorize fill-only provisioning without inventory. Otherwise repair
1189
+ requires a matching inventory at the exact selected root; callers in a project
1190
+ subdirectory must supply `--project-root`. The canonical selected root is printed
1191
+ before writes. Unpinned `npx -y @bridge_gpt/mcp-server repair-assets` intentionally
1192
+ selects the latest package, which may introduce new assets.
1193
+
1194
+ | Host | Packaged destinations |
1195
+ | --- | --- |
1196
+ | `claude` | `.claude/commands/`, `.claude/agents/`, shipped documentation |
1197
+ | `cursor` | `.cursor/commands/`, shipped documentation; no native agent definitions |
1198
+ | `codex` | `.agents/skills/bridge-*/SKILL.md`, shipped documentation |
1199
+ | `copilot` | Independent `.github/prompts/`, `.github/skills/`, `.github/agents/`, shipped documentation |
1200
+
1201
+ Repair preserves existing bytes and concurrent creation winners. It prepares
1202
+ complete temporary files, flushes/closes them, and publishes with exclusive hard
1203
+ links. A confined Linux procfs adapter supports writes; macOS/Windows currently
1204
+ refuse missing-file writes because a qualified descriptor-relative adapter is
1205
+ unavailable. Non-files, permissions, unsafe ancestry, unsupported publication, or
1206
+ cleanup failures produce a nonzero exit and distinct diagnostics. Repair does not
1207
+ refresh or upgrade existing content.
1208
+
1209
+ When a missing host command prevents Bridge invocation, run the terminal command
1210
+ from the established root, then refresh/reconnect and run doctor. Hosts may cache
1211
+ lists or ignore notifications; healthy files do not guarantee host presentation.
1212
+ If the mismatch persists, consult host support.
1213
+
1214
+ Plans/reviews/research reports are generated outputs: retrieve identified existing
1215
+ results using `get_plan`, `wait_for_ticket_review` for eligible canonical legs,
1216
+ `get_deep_research(task_id)`, or `get_council(council_id)`. Never silently rerun paid
1217
+ generation. Agent-reviewed rewrites must be recreated and reviewed before
1218
+ publication; neither retrieval nor installer repair reconstructs them.
1219
+
1220
+ Custom pipelines/instructions, MCP registration/configuration, credentials,
1221
+ onboarding/API setup, and Windsurf are outside packaged repair.
1222
+
1076
1223
  ### `doctor`
1077
1224
 
1078
1225
  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:
@@ -1087,7 +1234,7 @@ The report also includes a **Claude login** advisory: whether the host's own
1087
1234
  `~/.claude.json` carries a login marker. This is informational only — it never
1088
1235
  blocks the doctor run and cannot guarantee the next worker spawn will
1089
1236
  authenticate. See
1090
- [Claude login for conductor workers](#claude-login-for-conductor-workers).
1237
+ [Claude login for Epic Implementer workers](#claude-login-for-epic-implementer-workers).
1091
1238
 
1092
1239
  It is **read-only**: it never installs anything, modifies your system, adds an npm `postinstall`, spawns a terminal, or starts the MCP server, and there is no `--fix`. For each prerequisite it prints found/missing and, when missing, the exact per-OS install command **as a manual instruction you run yourself**. The checked set is the `start-tickets` preflight prerequisites **plus `uv`** **plus the selected agent's command** (`claude` by default, or `cursor-agent` with `--agent cursor-agent`). The Worktrunk binary is probed via the resolved name (honoring `BAPI_WORKTRUNK_BIN`), not a hard-coded one. **Exit code:** `0` when all required prerequisites are present, non-zero when any is missing or the platform is unsupported. A failing `start-tickets` preflight now hints you to run `doctor` for an actionable diagnostics report.
1093
1240
 
@@ -1107,30 +1254,107 @@ worker against a stale base prints the same advisory and **still spawns the
1107
1254
  worker**. Remedy and full diagnosis:
1108
1255
  `docs/claude/runbooks/claude-review-base-branch-drift.md`.
1109
1256
 
1257
+ ### The Epic Implementer
1258
+
1259
+ The Epic Implementer drives a whole epic — several related tickets — from an
1260
+ approved plan to merged pull requests, with little help from you. It was called
1261
+ the "conductor" before BAPI-1077..1083 renamed it. A few command, flag, and path
1262
+ names still say `conductor`; each is noted where it appears.
1263
+
1264
+ It has two parts:
1265
+
1266
+ - **The v2 engine.** A reconciler on the Bridge API server decides every step. An
1267
+ executor on your machine runs the jobs it hands out, one agent session per child
1268
+ ticket. This is what drives an epic.
1269
+ - **Observability** (`start-tickets --conductor`). An opt-in local event ledger,
1270
+ supervisor tab, and git hooks. It is off by default, and driving an epic does not
1271
+ need it.
1272
+
1273
+ The path from an epic to a finished run:
1274
+
1275
+ 1. **Plan.** `/plan-epic` splits the epic into child tickets and a plan DAG
1276
+ (`epic-plan.dag.json`). `emit-epic-implementer-bundle finalize` writes the DAG
1277
+ and the meta file that `drive-epic` uses to find it.
1278
+ 2. **Set up the repository, once.**
1279
+ `npx -y @bridge_gpt/mcp-server install conductor --required-check <check>`
1280
+ (also spelled `install-bridge conductor`; the name predates the rename). It runs
1281
+ a read-only doctor and writes the done gate from your required CI check(s). It
1282
+ 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,
1283
+ and save a launch profile. With its own consent, it adds `epic_implementer` to
1284
+ `BRIDGE_MCP_PROFILE` in your host MCP configs. Run `install conductor --help`
1285
+ for every option.
1286
+ 3. **Launch and drive.** In Claude Code, `/drive-epic-run <EPIC> [<plan path>]`
1287
+ previews the launch, asks you once, creates the run through `drive-epic`, and
1288
+ then watches and recovers it. From a shell, [`drive-epic <EPIC>`](#drive-epic)
1289
+ creates the run and starts its executor.
1290
+ 4. **Monitor.** The MCP tools `get_epic_snapshot` and `explain_run` (they need the
1291
+ `epic_implementer` profile; see [Environment Variables](#environment-variables)),
1292
+ `notifications <EPIC|run-id> [--follow]`, `epic-implementer epic-status`, and
1293
+ `executor watch <job>`.
1294
+ 5. **Recover.** `epic-implementer unpark`, `adopt-current-head-and-unpark`,
1295
+ `continue-child`, `resume-run`, `stop-run`, and `abandon-run` (terminal and
1296
+ irreversible). Run `npx -y @bridge_gpt/mcp-server epic-implementer --help` for
1297
+ the full list.
1298
+
1299
+ `epic-implementer readiness` is a read-only report of every prerequisite, the
1300
+ unattended ones included, each with its state and one named fix. The full
1301
+ reference — architecture, the CI gate, supervisor config, observability, and git
1302
+ hooks — is in [EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md).
1303
+
1304
+ **Old variable names stop every command (BAPI-1190).** Every `BAPI_CONDUCTOR_*`
1305
+ variable was renamed to `BAPI_EPIC_IMPLEMENTER_*`, and the few old `CONDUCTOR_*`
1306
+ names without the `BAPI_` prefix (the node path, for one) now start with
1307
+ `EPIC_IMPLEMENTER_`. There are no aliases. If any old name is set, every
1308
+ entry point — the MCP server included — prints the old names and exits `1`.
1309
+ Rename or unset them.
1310
+
1110
1311
  ### `drive-epic`
1111
1312
 
1112
- The one conductor entry point every Bridge surface names. Give it an epic key and
1113
- it reads conductor readiness for your repository and routes to the single path
1114
- your project can actually run:
1313
+ The one Epic Implementer entry point every Bridge surface names. Give it an epic
1314
+ key and it reads Epic Implementer readiness for your repository and routes to the
1315
+ single path your project can actually run:
1115
1316
 
1116
1317
  ```
1117
1318
  npx -y @bridge_gpt/mcp-server drive-epic <EPIC>
1118
1319
  ```
1119
1320
 
1120
- You are never asked to choose. `drive-epic` routes to exactly one conductor, the
1321
+ You are never asked to choose. `drive-epic` routes to exactly one engine, the
1121
1322
  v2 engine — one transition authority per epic is what keeps an epic from wedging.
1122
1323
  Readiness green routes to the v2 bootstrap below (pass `--plan-file`
1123
1324
  and `drive-epic` runs it for you); readiness not green reports that the v2 engine
1124
- is not ready to drive this epic — there is no alternative conductor to fall back
1125
- to — and prints no conductor invocation. If readiness is **unknown** — unreachable,
1126
- unauthorized, or malformed — it escalates and prints no conductor invocation at
1325
+ is not ready to drive this epic — there is no alternative engine to fall back
1326
+ to — and prints no run command. If readiness is **unknown** — unreachable,
1327
+ unauthorized, or malformed — it escalates and prints no run command at
1127
1328
  all, because an unknown owner is not the same as a not-ready one. No branch,
1128
1329
  including every error path, ever offers you two paths.
1129
1330
 
1130
1331
  `drive-epic` owns no branch behavior of its own — it forwards `--feature-branch
1131
1332
  <name>`, `--into-base`, and `--attended` verbatim to `setup-epic`, which decides
1132
1333
  the strategy and the posture (see below). With none of them, a multi-ticket epic
1133
- runs on `epic/<KEY>`, unattended.
1334
+ runs on `epic/<KEY>`, unattended. It also forwards `--repo` and the policy flags:
1335
+ `--policy-file <path>` (the complete run policy), `--review-policy <src>` (a
1336
+ per-run review policy: `repository_policy`, `verdict_protocol`,
1337
+ `native_review_decision`, or `none`; omitted, the server stamps `repository_policy`
1338
+ at first approval for a new feature-branch run, and `verdict_protocol` is the
1339
+ explicit AI-review opt-in), and `--replace-policy` (allow replacing a live run's
1340
+ stored policy).
1341
+
1342
+ **Every run gets an executor (BAPI-1279).** Once `drive-epic` creates a run, it
1343
+ starts an executor scoped to that run in the background, from this checkout's Git
1344
+ top level. The executor claims only that run's jobs, logs to
1345
+ `.bridge/executors/<run>.log`, and exits on its own when the run is done or
1346
+ abandoned. You do not start one by hand. Run `drive-epic` from a Git work tree
1347
+ inside the target repository — it checks this before creating anything. If the
1348
+ executor fails to start, the run is left intact and `drive-epic` prints the log
1349
+ path and the exact command to start it by hand.
1350
+
1351
+ **Choosing the server.** With no flags, `drive-epic` targets production and uses
1352
+ the stored `bapi:<repo>` key when there is one. `--base-url <url>` (or
1353
+ `BAPI_BASE_URL`) names another server. `--launch-profile <name>` (or
1354
+ `BAPI_EPIC_LAUNCH_PROFILE`) selects a host-local profile saved by
1355
+ `install conductor --launch-profile <name>`; use one for a local server or a
1356
+ durable host. With a profile, `--base-url` must agree with it. A stored key
1357
+ approved for a different endpoint is never sent.
1134
1358
 
1135
1359
  **Finding the plan from the epic key (BAPI-1285).** `--plan-file` is optional.
1136
1360
  Without it, `drive-epic` searches `{docs_dir}/epic-plans/*/epic-plan.meta.json` for a
@@ -1166,9 +1390,10 @@ requests a lane, or starts or signals an executor. With `--json` (valid only wit
1166
1390
  `--dry-run`) stdout carries exactly one JSON document with `epic_key`, `target`,
1167
1391
  `readiness`, `live_run`, `plan`, `summary`, `decision`, and `refusal`. The
1168
1392
  readiness `reason_id` and `remedy` are the strings the real refusal prints. The
1169
- webhook URL, credentials, and policy contents are never included. The preview does
1170
- probes only a selected loopback plane after a network readiness failure and an
1171
- available plan. A refused port plus passing local preflight yields a conditional
1393
+ webhook URL, credentials, and policy contents are never included. The preview
1394
+ probes a local plane only when the target is a loopback plane, readiness failed on
1395
+ the network, and a plan is available. A refused port plus passing local preflight
1396
+ yields a conditional
1172
1397
  `create` with optional `cold_start` (`plane_endpoint`, `will_start_plane: true`,
1173
1398
  `live_run_checked: false`), `live_run: null`, and partial offline setup validation.
1174
1399
  The real launch attempts guarded startup, then rechecks run existence and server
@@ -1177,6 +1402,15 @@ port probes, and ordinary production previews keep their existing refusal or
1177
1402
  create behavior. `target.source` is optional and appears only for selected
1178
1403
  profiles (`profile` or `profile-env`).
1179
1404
 
1405
+ #### Running the server yourself (Bridge API source checkout only)
1406
+
1407
+ The rest of this section, and [`plane up`](#plane-up--claim-scope-is-required)
1408
+ below, apply only when you run the Bridge API server on your own machine. That
1409
+ needs a Bridge API **source checkout**: `plane up` must run from its repository
1410
+ root (the directory holding `main.py`, `worker.py`, and `alembic.ini`), and its
1411
+ executor lanes run from that checkout's `mcp_server/build/index.js`, never from
1412
+ npx. If you target production, skip this part.
1413
+
1180
1414
  **The composed bring-up is two-phase (BAPI-1102).** With `--plan-file` on a
1181
1415
  repository whose readiness is missing only the runtime facts, one invocation runs,
1182
1416
  in order: the **control plane** (Bridge API server + reconciler, each gated on its
@@ -1186,24 +1420,23 @@ observer** last, then the ready banner. The order is forced: an executor lane mu
1186
1420
  carry an explicit claim scope, and the run it is scoped to does not exist until the
1187
1421
  server is up and `setup-epic` has run.
1188
1422
 
1189
- A composed plane serves **exactly one** run; start a second plane for a second
1190
- epic. If `setup-epic` fails, the control plane is left running and **no executor
1191
- lane is spawned**. If the lanes fail to become ready, the control plane and the
1192
- committed run are both left intact and the observer is not started — nothing is
1193
- rolled back, because a local process that failed to start says nothing about
1194
- whether the run is valid.
1423
+ A plane's executor lanes serve **exactly one** run — the run it is bound to. A
1424
+ second epic does **not** start a second plane: it attaches to the running plane's
1425
+ reconciler and gets its own run-scoped executor. Two planes on one database are
1426
+ not supported. If `setup-epic` fails, the control plane is left running and **no
1427
+ executor lane is spawned**. If the lanes fail to become ready, the control plane
1428
+ and the committed run are both left intact and the observer is not started —
1429
+ nothing is rolled back, because a local process that failed to start says nothing
1430
+ about whether the run is valid.
1195
1431
 
1196
1432
  "Plane ready" reports **processes**, not dispatchability: if the run cuts an epic
1197
1433
  branch, the reconciler holds ticket dispatch until that branch's index scope
1198
1434
  finishes preparing.
1199
1435
 
1200
- Two conductors is a transitional state. When one is eliminated, `drive-epic` is
1201
- the only thing that changes.
1202
-
1203
1436
  ### `plane up` — claim scope is required
1204
1437
 
1205
- `plane up` starts the runtime on its own, and every executor lane it starts needs
1206
- an explicit claim scope:
1438
+ `plane up` starts the runtime on its own, from a Bridge API source checkout, and
1439
+ every executor lane it starts needs an explicit claim scope:
1207
1440
 
1208
1441
  ```
1209
1442
  npx -y @bridge_gpt/mcp-server plane up --epic-run-id <run-id> # repeatable
@@ -1223,13 +1456,13 @@ then signals the recorded process group.
1223
1456
 
1224
1457
  ### `setup-epic`
1225
1458
 
1226
- Bootstraps an Epic Conductor v2 run in one command — creates the epic run, stores the plan DAG, and approves it:
1459
+ Bootstraps an Epic Implementer v2 run in one command — creates the epic run, stores the plan DAG, and approves it. `drive-epic` runs it for you; call it directly only when you want the bootstrap on its own:
1227
1460
 
1228
1461
  ```
1229
1462
  npx -y @bridge_gpt/mcp-server setup-epic --epic-key <KEY> --plan-file <path-to-epic-plan.dag.json>
1230
1463
  ```
1231
1464
 
1232
- The plan sidecar is produced by the `decompose-epic` pipeline step. `setup-epic` validates it locally (unique ticket keys, resolvable dependency references, acyclicity) before sending anything, so a malformed plan fails legibly instead of as a bare HTTP 400. It is **idempotent**: re-running it on an epic that already has a live run reuses that run rather than minting a second one. `--dry-run` validates and previews the calls without mutating anything; `--json` emits a single machine-readable result object.
1465
+ The plan sidecar is produced by the `decompose-epic` pipeline step (the `/plan-epic` flow). `setup-epic` validates it locally (unique ticket keys, resolvable dependency references, acyclicity) before sending anything, so a malformed plan fails legibly instead of as a bare HTTP 400. It is **idempotent**: re-running it on an epic that already has a live run reuses that run rather than minting a second one. `--dry-run` validates and previews the calls without mutating anything; `--json` emits a single machine-readable result object. It takes the same policy flags as `drive-epic` (`--policy-file`, `--review-policy`, `--replace-policy`), plus `--plan-version` and `--local-only`; see `setup-epic --help`.
1233
1466
 
1234
1467
  **The command above uses an epic branch.** For a plan with **two or more** nodes and
1235
1468
  no branch flag, `setup-epic` derives `epic/<KEY>`: every child-ticket PR targets that
@@ -1261,49 +1494,61 @@ default, or, when it declares none, as an explicit recorded `no_ci_gate` mode.
1261
1494
  An unattended run has two **repository** prerequisites — consent
1262
1495
  (`unattended_epic_implementer_allowed`, ON by default; the repository owner can switch
1263
1496
  "Allow unattended Epic Implementer runs" off and on in the Bridge admin panel's Setup
1264
- page) and a verified notify webhook default — plus
1497
+ page) and an **escalation channel** (BAPI-1274): a verified notify webhook, or,
1498
+ when the policy declares no webhook, an email address on the account — plus
1265
1499
  confirmed default-branch review/CI workflows. Each is refused by name **before any
1266
1500
  run row is created** (`target_not_allowed`, `webhook_unverified`,
1267
- `repository_readiness_unconfirmed`), and `drive-epic` readiness and `doctor` both
1268
- list them with their current state. `notify.local_sink` does not satisfy the webhook
1269
- prerequisite.
1270
-
1271
- > **Rollout note.** The client-side default and the server-side admission,
1272
- > stamping, and readiness changes must be released as **one compatible unit**. The
1273
- > new default's shape (`v2_auto_merge_enabled: true` with no `required_checks`) is
1274
- > exactly what the create route refused before BAPI-1102, so shipping the client
1275
- > half alone would 422 every unattended run at `POST /jira/epic-runs/runs`.
1276
- > Deploying only the server half is safe and inert: it narrows two refusals and adds
1277
- > a first-approval stamp, and **rewrites no existing run**. No database migration and
1278
- > no new environment variable is introduced — `config_projects.unattended_epic_implementer_allowed`
1279
- > and `epic_supervisor_setup.done_gate_config` already exist and are read as-is.
1280
-
1281
- Once the plan is approved, the **server-side reconciler** picks the run up within ~30s. To execute claimed jobs on your machine, run `executor`:
1501
+ `repository_readiness_unconfirmed`). A missing channel is still refused as
1502
+ `webhook_unverified`. A declared webhook that fails verification never falls back
1503
+ to email, and `notify.local_sink` does not count as a channel.
1504
+ `epic-implementer readiness` and `drive-epic` both list these prerequisites with
1505
+ their current state.
1506
+
1507
+ Once the plan is approved, the **server-side reconciler** picks the run up within
1508
+ ~30s. If you ran `setup-epic` directly, start an executor for the run yourself
1509
+ (`drive-epic` does this for you). An executor needs exactly one claim scope, or it
1510
+ refuses to start:
1282
1511
 
1283
1512
  ```
1284
- npx -y @bridge_gpt/mcp-server executor --repo <name>
1513
+ npx -y @bridge_gpt/mcp-server executor --repo <name> --epic-run-id <run-id> --exit-when-run-terminal
1514
+ npx -y @bridge_gpt/mcp-server executor --repo <name> --repo-wide # every run in the repo
1285
1515
  ```
1286
1516
 
1287
- ### Conductor (epic & multi-agent orchestration)
1517
+ `executor install-service` generates a launchd/systemd user unit so a durable
1518
+ executor survives a reboot. `--base-url` or `BAPI_BASE_URL` is required: the
1519
+ executor has no production fallback.
1288
1520
 
1289
- Conductor is an **opt-in, off-by-default** layer for epic supervision, inter-agent messaging, done-gate evaluation, local git-hook event producers, and conditional auto-merge. Its full reference — the v2 architecture (server-side reconciler + local executor), `setup-epic`, `epic-implementer install-git-hooks`, the supervisor `done_gate_config` / `auto_merge_enabled` settings, and the observability stream — lives in **[CONDUCTOR.md](./docs/CONDUCTOR.md)**. (The event-ledger CLI was renamed from `conductor` to `epic-implementer`; the retained `conductor` bin name is now a fixed migration pointer.)
1521
+ ### Epic Implementer reference
1522
+
1523
+ The full reference — the v2 architecture (server-side reconciler + local
1524
+ executor), the CI gate, `epic-implementer install-git-hooks`, the supervisor
1525
+ `done_gate_config` / `auto_merge_enabled` settings, and the opt-in observability
1526
+ stream — lives in **[EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md)**.
1527
+ Auto-merge into the epic branch is **on by default** for unattended runs (see
1528
+ [`setup-epic`](#setup-epic)); only the `--conductor` observability layer is off by
1529
+ default.
1530
+
1531
+ Two retired names remain as failing pointers. The event-ledger CLI was renamed
1532
+ from `conductor` to `epic-implementer`, and `emit-conductor-bundle` to
1533
+ `emit-epic-implementer-bundle`; the old names now print the new name and exit.
1290
1534
 
1291
1535
  > The v1 `epic-implementer epic-tick` command is **frozen** — it throws on every invocation. There is nothing to schedule locally, and `epic-implementer doctor` flags any epic-tick schedule left over from an earlier release so you can cancel it.
1292
1536
 
1293
1537
  <!-- BEGIN GENERATED: merge-workflow-install (managed by mcp_server/scripts/sync-readme-merge-workflow.js — DO NOT EDIT BY HAND) -->
1294
- ### `install-bridge conductor --merge-workflow`
1538
+ ### `install conductor --merge-workflow`
1295
1539
 
1296
1540
  Generates the Epic Implementer **merge workflow** plus its CODEOWNERS fragment
1297
1541
  and repository-rule guidance, commits them on a managed branch, pushes with
1298
1542
  **your own git identity**, and opens a pull request with **your own `gh`**.
1299
1543
 
1300
1544
  ```
1301
- npx -y @bridge_gpt/mcp-server install-bridge conductor --merge-workflow --codeowner <@org/team|@user>
1545
+ npx -y @bridge_gpt/mcp-server install conductor --merge-workflow --codeowner <@org/team|@user>
1302
1546
  ```
1303
1547
 
1304
- `--codeowner` is **required** and takes exactly one `@user` or `@org/team`. It is
1305
- never inferred from repository metadata, and a documentation placeholder is
1306
- rejected. `--dry-run` prints the plan and performs **no** write: no branch, no
1548
+ `--codeowner` is **required** and takes exactly one `@user` or `@org/team`. Bridge
1549
+ cannot infer the code owner, so replace `<@org/team|@user>` with the one `@user` or
1550
+ `@org/team` who should review the workflow file before running; the placeholder
1551
+ itself is rejected. `--dry-run` prints the plan and performs **no** write: no branch, no
1307
1552
  file, no install-state write, no commit, no push, and no pull request.
1308
1553
 
1309
1554
  **Bridge performs no repository write, and the pull request is never merged for
@@ -1472,12 +1717,14 @@ If a custom pipeline has the same key as a built-in pipeline, the custom version
1472
1717
  | `SFCC_HOSTNAME` | No | _(none)_ | SFCC sandbox hostname. Part of the environment credential tier — `SFCC_HOSTNAME`, `SFCC_CLIENT_ID`, and `SFCC_CLIENT_SECRET` must **all three** be set for that tier to apply, and a complete tier takes precedence over `dw.json` |
1473
1718
  | `SFCC_CLIENT_ID` | No | _(none)_ | Account Manager API client id. See `SFCC_HOSTNAME` — all three are needed together. Also required on its own when a tool is called with an explicit dotted `instance` |
1474
1719
  | `SFCC_CLIENT_SECRET` | No | _(none)_ | Account Manager API client secret. See `SFCC_HOSTNAME` — all three are needed together. Never sent to Bridge; it goes only to the Account Manager token endpoint |
1475
- | `CLAUDE_CODE_OAUTH_TOKEN` | No | _(none)_ | The supported headless authentication input for conductor workers. Export it into the **executor process's own** environment; Bridge forwards it unchanged into the worker and stores it nowhere — no credential-store entry, no disk, never sent to Bridge. See [Claude login for conductor workers](#claude-login-for-conductor-workers) |
1720
+ | `CLAUDE_CODE_OAUTH_TOKEN` | No | _(none)_ | The supported headless authentication input for Epic Implementer workers. Export it into the **executor process's own** environment; Bridge forwards it unchanged into the worker and stores it nowhere — no credential-store entry, no disk, never sent to Bridge. See [Claude login for Epic Implementer workers](#claude-login-for-epic-implementer-workers) |
1476
1721
  | `BAPI_INSTALL_DEBUG` | No | _(unset)_ | Set to any non-empty value to unlock raw diagnostics in `install` and the `apply_install_manifest` path — the underlying error message and stack behind an `unexpected error` summary. The installer's own failure text tells you to set it |
1477
1722
  | `BAPI_SIGNUP_EMAIL` | No | _(none)_ | Selects the self-serve signup route without `--email`. Precedence: `--email` first, then this variable, then the visible interactive prompt |
1478
1723
  | `BAPI_INVITE` | No | _(none)_ | Invite code for `install`, for scripting. Like `--invite <code>`, it exposes the code to your shell history and the process list — prefer bare `--invite` and the hidden prompt |
1479
- | `BAPI_PLANE_PYTHON` | No | `python` | Executable used for the Python members of `plane up`. Point it at a venv interpreter when `python` on `PATH` is not the one you want |
1724
+ | `BAPI_PLANE_PYTHON` | No | `python` | Executable used for the Python members of `plane up` (Bridge API source checkout only). Point it at a venv interpreter when `python` on `PATH` is not the one you want |
1480
1725
  | `BAPI_PLANE_UVICORN` | No | `uvicorn` | Executable used for the server member of `plane up` |
1726
+ | `BAPI_PLANE_PORT` | No | `8000` | Port for the local plane server (`127.0.0.1`). Only for `plane up` and a local `drive-epic` target, from a Bridge API source checkout |
1727
+ | `BAPI_EPIC_LAUNCH_PROFILE` | No | _(none)_ | Selects a host-local launch profile (saved by `install conductor --launch-profile`) for `drive-epic`. `--launch-profile` takes precedence. See [`drive-epic`](#drive-epic) |
1481
1728
  | `BAPI_DOCS_DIR` | No | `docs/tmp` | Local directory for saving plans, critiques, and research reports |
1482
1729
  | `BAPI_PIPELINES_DIR` | No | `.bridge/pipelines` | Directory for user-defined custom pipeline JSON files |
1483
1730
  | `BAPI_WORKTRUNK_BIN` | No | `wt` (`git-wt` on Windows) | Override the Worktrunk executable name/path used by `start-tickets` for nonstandard installs |
@@ -1487,7 +1734,7 @@ If a custom pipeline has the same key as a built-in pipeline, the custom version
1487
1734
  | `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 |
1488
1735
  | `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 |
1489
1736
  | `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 |
1490
- | `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), `conductor` (+ 8 conductor/event/supervisor tools), `pipeline-authoring` (+ 5 pipeline run/admin tools — `get_pipeline_recipe` is NOT gated; it 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,conductor`; 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)). Conductor/epic sessions launched via `start-tickets --conductor` **merge** `conductor` 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,conductor`. A normal `start-tickets` run stays on `core`. |
1737
+ | `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`. |
1491
1738
 
1492
1739
  Environment values are **trimmed**, and only a non-empty result wins. A
1493
1740
  whitespace-only `BAPI_API_KEY` therefore does not override anything: it falls
@@ -1657,9 +1904,9 @@ work. Two supported paths write it for you:
1657
1904
 
1658
1905
  Run it without `--write-credentials` to preview; add the flag to write the store.
1659
1906
 
1660
- ### Claude login for conductor workers
1907
+ ### Claude login for Epic Implementer workers
1661
1908
 
1662
- Conductor workers are **not** isolated into a private Claude configuration
1909
+ Epic Implementer workers are **not** isolated into a private Claude configuration
1663
1910
  directory — they run with the executor host's own `HOME`, so a worker
1664
1911
  authenticates the same way any interactive `claude` invocation on that host
1665
1912
  does. The prerequisite is simple: run
@@ -1742,7 +1989,7 @@ The full surface, for when you need the complete enumeration. Day-to-day, use [U
1742
1989
 
1743
1990
  ### MCP tools
1744
1991
 
1745
- The authoritative tool catalog covers **78 tools** (enumerated below). What's actually registered in a session depends on `BRIDGE_MCP_PROFILE`: the default `core` profile loads a trimmed subset, and the conductor/pipeline-authoring/SFCC tools are added only under their respective profiles (see [Environment Variables](#environment-variables)). Async AI tools follow a request/get pattern: call the `request_*` tool to kick off generation, then the matching `get_*` tool to retrieve the result (or pass `wait_for_result: true` to poll automatically).
1992
+ The authoritative tool catalog covers **78 tools** (enumerated below). What's actually registered in a session depends on `BRIDGE_MCP_PROFILE`: the default `core` profile loads a trimmed subset, and the Epic Implementer (`epic_implementer`), estimation, and SFCC tools are added only under their respective profiles (see [Environment Variables](#environment-variables)). Async AI tools follow a request/get pattern: call the `request_*` tool to kick off generation, then the matching `get_*` tool to retrieve the result (or pass `wait_for_result: true` to poll automatically).
1746
1993
 
1747
1994
  - **Connectivity & identity** — `ping` (its JSON also carries `docs_dir`, `role`, and `customer_type`)
1748
1995
  - **Team & access** — `invite_member` (admin-only; mints a scoped access key for a teammate on an already-configured project — the plaintext key is shown exactly once)
@@ -1754,6 +2001,7 @@ The authoritative tool catalog covers **78 tools** (enumerated below). What's ac
1754
2001
  - **Ticket lifecycle** — `track_ticket`, `update_ticket_state`, `get_ticket_state`, `get_ticket_state_tree` (live repo-wide lifecycle + dependency tree; read-only, no mutation parameter)
1755
2002
  - **Jira status** — `update_jira_status` (pass `status: "auto"` to resolve the configured post-PR status server-side)
1756
2003
  - **Repository & CI** — `parse_repository` (`action`: `start`, `status`), `regenerate_directory_map`, `create_pull_request`, `merge_pull_request`, `resolve_ci_checks`, `poll_ci_checks`, `wait_for_ci_checks` (the last two are hidden until `ci_check_config` resolves, and share one visibility gate)
2004
+ - **Epics** — `assess_epic_implementer_eligibility` (core; read-only prediction, before a run, of which epic children change workflow files and so need hand review; the old `assess_epic_conductor_eligibility` name returns `tool_removed`), `estimate_epic` (`estimation` profile), and `get_epic_snapshot` / `explain_run` (`epic_implementer` profile; read-only run state and "why is it stuck"; an unknown run returns `status: "unknown"`)
1757
2005
  - **Pipelines & automation** — `get_pipeline_recipe` (returns a fully resolved recipe the agent executes step-by-step)
1758
2006
  - **Config** — `get_project_standards`, `config_field` (operations: `get`, `update`, `list`), `model_thresholds` (actions: `get`, `set`, `clear`; the only way to set personal thresholds)
1759
2007
 
@@ -1765,9 +2013,8 @@ Pipelines are declarative, multi-step workflows your AI agent executes step-by-s
1765
2013
  |---|---|---|
1766
2014
  | `implement-ticket` | Generate a plan, execute the implementation, commit, open a PR, and monitor CI | `/implement-ticket PROJ-123` |
1767
2015
  | `review-ticket` | Full ticket quality review: clarifying questions + critique plus an automatic second-opinion pass, then evaluation and decision capture. The backend owns round orchestration; pass `--rounds=1` for a single-pass review or `--rounds=2` to force the full second-opinion review, or omit `--rounds` to let the backend decide adaptively. Internal atomic pipeline invoked by `/review-tickets` (inline for one key, spawned per tab for several) and by `/review-and-implement`, `/review-and-start`, and `/start-tickets`. | `/review-tickets PROJ-123` |
1768
- | `idea-to-ticket` | Turn an idea into a Jira Task/Spike (or Epic + children) with research, dedup, and critique | `/idea-to-ticket "<idea>"` |
2016
+ | `idea-to-ticket` | Deprecated, superseded by `/define-tickets`; still resolvable through `get_pipeline_recipe` for one release, with no new consumers | `/define-tickets "<idea>"` |
1769
2017
  | `plan-epic` | Decompose an epic into sub-tasks with a structured exploration doc for each | `/plan-epic "<epic>"` |
1770
- | `full-automation` | Client-side wrapper: runs the `idea-to-ticket` recipe, then hands the created keys to `/review-and-start --auto` | `/idea-to-pr "<idea>"` |
1771
2018
  | `learn-repository` | Analyze codebase architecture, testing, review, and documentation standards, then upload to Bridge | `/learn-repository` |
1772
2019
 
1773
2020
  ### Pipeline response envelope
@@ -1778,3 +2025,94 @@ plus `total_steps`, `auto_approve`, and `execution_mode`. Each step is either an
1778
2025
  text). `execution_mode` is `inline` — the calling agent executes every step
1779
2026
  itself and keeps its own durable record through `record_phase_result` /
1780
2027
  `record_checkpoint`. There is no server-side orchestrator and no run to resume.
2028
+
2029
+
2030
+ ## Start Tickets troubleshooting
2031
+
2032
+ `start-tickets` reports actual worktree paths and branches in its stable summary,
2033
+ then explains successfully spawned sessions. Work from each reported folder: its
2034
+ branch is already checked out there and normally cannot also be checked out in
2035
+ the original folder. Folder names and locations come from Worktrunk configuration;
2036
+ do not infer them from the original checkout.
2037
+
2038
+ Monitor the selected agent in the reported Terminal/iTerm tab, Windows Terminal
2039
+ tab, PowerShell fallback window, or detached tmux session. Linux output prints
2040
+ the exact `tmux attach -t ...` commands. When a destination is not reported, treat
2041
+ it as unknown. A spawned session has started; it has not completed implementation
2042
+ or review. Review workflows review independently before opening a fresh
2043
+ implementation session. Coordinate ownership across multiple independent
2044
+ sessions and pause affected work when overlapping changes cause conflicts.
2045
+
2046
+ For mixed failures, only `spawned` rows describe running sessions. Retain failed
2047
+ row warnings and the CLI exit status. Dry-run and all-failed results open no
2048
+ successful sessions. After a failure, read-only diagnostics are allowed:
2049
+
2050
+ ```bash
2051
+ npx -y @bridge_gpt/mcp-server doctor --agent codex
2052
+ ```
2053
+
2054
+ The interactive installer separates **Required for launcher** tools from
2055
+ **Recommended diagnostics** (`uv`, selected agent, ast-grep, ripgrep, lizard).
2056
+ Missing recommendations and the **Git compatibility advisory** add no install or
2057
+ launcher admission gate. Doctor performs no automatic repair, installation, PATH
2058
+ mutation, authentication, or terminal launch. The existing launcher still checks
2059
+ Git presence and repository work-tree context at launch.
2060
+
2061
+ ### Worktrunk and Git compatibility evidence
2062
+
2063
+ The documented comparison baseline is **Worktrunk v0.80.0**, whose
2064
+ [tagged Git-version source](https://github.com/max-sixty/worktrunk/blob/v0.80.0/src/git/version.rs)
2065
+ sets the minimum to **Git 2.43.0**. This is the release-specific baseline Bridge
2066
+ recommends for this advisory, not a universal rule for every Worktrunk release or
2067
+ a requirement to install the latest Git. The onboarding report observed Git
2068
+ **2.39.5** being rejected with a **2.43.0** minimum; it did not identify the
2069
+ Worktrunk release, so that observation alone is not release verification.
2070
+
2071
+ Doctor and the installer report the resolved Git executable and numeric version
2072
+ when available, with compatible, incompatible, and unknown advisory states.
2073
+ An arbitrary nonempty `BAPI_WORKTRUNK_BIN` override has an unconfirmed release
2074
+ requirement and is not assumed compatible with this baseline. On macOS,
2075
+ installing another Git does not ensure the launcher resolves it. Verify the
2076
+ executable and version selected on PATH before changing your installation:
2077
+
2078
+ ```bash
2079
+ which git
2080
+ git --version
2081
+ ```
2082
+
2083
+ ### Saved planning work and launch readiness
2084
+
2085
+ Successful ticket/plan creation does not establish executor, policy, VCS, or
2086
+ indexing readiness. A finalized epic completion may show one bounded read-only
2087
+ `drive-epic '<EPIC>' --dry-run --json` preview. Ready means **ready at preview
2088
+ time**; a conditional cold start still needs guarded startup/live validation.
2089
+ Returned target, refusal reasons, remedies, and `availability_text` remain
2090
+ authoritative. An unavailable preview leaves readiness unconfirmed while saved
2091
+ work remains successful. Free-form plans or unresolved child keys must be
2092
+ finalized first. Actual launch retains its consent and admission checks.
2093
+
2094
+ ## Backend-owned bootstrap identity (BAPI-1438)
2095
+
2096
+ Ordinary new creation uses a friendly display label. Labels may repeat and never
2097
+ select credentials. For a scripted operator invite use `install --invite --display-name "My project"`
2098
+ and supply the invitation through the existing private input mechanism. In an
2099
+ interactive terminal the folder basename is a suggested label. Self-serve signup
2100
+ still requires emailed-code verification in an interactive terminal.
2101
+
2102
+ Use `--repo <canonical-name>` or `BAPI_REPO_NAME` for existing-key registration
2103
+ or explicit legacy creation. Existing keys cannot use `--display-name`; creation
2104
+ cannot combine that flag with a canonical selector.
2105
+
2106
+ Rerun from the original folder with the same invitation or signup method after
2107
+ an interrupted install. The original proof and label are reused; another entered
2108
+ label does not rename the recovered project. Preserve recovery storage when an
2109
+ outcome is unknown, a challenge cannot be recovered, or installation asks for support.
2110
+ Never delete possibly redeemed proof to restart. Ordinary invite tokens and
2111
+ verification codes are not stored.
2112
+
2113
+ Credential storage uses bounded exclusive locking without timeout-based stealing.
2114
+ An abandoned lock needs installation support. POSIX systems sync the containing
2115
+ directory; Windows uses file sync plus atomic replacement because portable Node
2116
+ directory handles are unavailable. A failure after rename is an uncertain durability
2117
+ outcome: the new bytes may already exist. Rerun reloads the actual store under lock;
2118
+ there is no guarantee that old pending bytes survive every failure.