@bridge_gpt/mcp-server 0.2.69 → 0.2.70

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 (151) hide show
  1. package/README.md +140 -292
  2. package/build/agent-launchers/claude-executor-adapter.js +17 -4
  3. package/build/agents.generated.js +4 -4
  4. package/build/artifact-diff.js +110 -0
  5. package/build/bin-entrypoint.js +36 -0
  6. package/build/bridge-permissions.js +23 -4
  7. package/build/claude-review-workflow-drift.js +3 -3
  8. package/build/codex-bridge-profile.js +1 -1
  9. package/build/commands.generated.js +6 -6
  10. package/build/conductor/bridge-api-client.js +598 -19
  11. package/build/conductor/bring-up-facts.js +9 -9
  12. package/build/conductor/doctor.js +466 -18
  13. package/build/conductor/epic-child-continuation.js +54 -3
  14. package/build/conductor/epic-implementer-cli.js +132 -34
  15. package/build/conductor/epic-runtime.js +2 -2
  16. package/build/conductor/epic-state.js +1 -1
  17. package/build/conductor/hook-runtime-qualification.js +1 -1
  18. package/build/conductor/install-doctor.js +4 -2
  19. package/build/conductor/launch-need-probes.js +337 -0
  20. package/build/conductor/local-merge.js +241 -56
  21. package/build/conductor/merge-credential.js +172 -0
  22. package/build/conductor/merge-execution-eligibility.js +1 -1
  23. package/build/conductor/merged-child-check.js +95 -0
  24. package/build/conductor/plan-trim.js +30 -0
  25. package/build/conductor/pr-ci-producer.js +1 -1
  26. package/build/conductor/readiness-cli.js +11 -6
  27. package/build/conductor/readiness-prerequisites.js +41 -0
  28. package/build/conductor/readiness-sections.js +345 -55
  29. package/build/conductor/readiness.js +99 -87
  30. package/build/conductor/recovery-cli.js +606 -21
  31. package/build/conductor/recovery-operations.js +306 -7
  32. package/build/conductor/repair-contract.js +47 -2
  33. package/build/conductor/repository-workflow-remedy.js +8 -6
  34. package/build/conductor/stored-merge-credential.js +76 -0
  35. package/build/conductor/stored-merge-token-probe.js +28 -0
  36. package/build/conductor/temporary-plan.js +50 -0
  37. package/build/conductor/wait-run-cli.js +759 -0
  38. package/build/conductor/worker-database-doctor-inspector.js +49 -0
  39. package/build/conductor-bin.js +2 -2
  40. package/build/conductor-claude-hook-bin.js +2 -2
  41. package/build/conductor-claude-hook-removed-stub-bin.js +2 -5
  42. package/build/conductor-removed-stub-bin.js +2 -5
  43. package/build/credential-store.js +356 -13
  44. package/build/docs.generated.js +26 -13
  45. package/build/doctor.js +94 -32
  46. package/build/drive-epic-help.js +212 -0
  47. package/build/drive-epic.js +1840 -373
  48. package/build/epic-ci-workflow-drift.js +77 -0
  49. package/build/epic-ci-workflow-install.js +183 -0
  50. package/build/epic-ci-workflow.js +157 -0
  51. package/build/epic-contract-context.js +326 -0
  52. package/build/epic-implementer-bin.js +57 -41
  53. package/build/epic-implementer-claude-hook-bin.js +2 -2
  54. package/build/escalation-reachability.js +134 -0
  55. package/build/executor/cleanup-report.js +99 -0
  56. package/build/executor/cli.js +12 -1
  57. package/build/executor/completion-contract.js +66 -11
  58. package/build/executor/completion-supervision.js +99 -0
  59. package/build/executor/delivery-outcome.js +179 -0
  60. package/build/executor/deps.js +3 -0
  61. package/build/executor/env.js +71 -0
  62. package/build/executor/failure-reason-codes.js +126 -0
  63. package/build/executor/heartbeat.js +38 -0
  64. package/build/executor/http-client.js +72 -0
  65. package/build/executor/integration-job.js +298 -5
  66. package/build/executor/job-errors.js +36 -6
  67. package/build/executor/job-runner.js +720 -36
  68. package/build/executor/likely-tests.js +36 -2
  69. package/build/executor/merge-job.js +145 -2
  70. package/build/executor/observation.js +73 -4
  71. package/build/executor/permissions.js +193 -97
  72. package/build/executor/preflight.js +14 -3
  73. package/build/executor/process-containment.js +28 -2
  74. package/build/executor/prompt-spec.js +50 -5
  75. package/build/executor/rebase-finalization.js +38 -3
  76. package/build/executor/reconcile-overlap-job.js +35 -7
  77. package/build/executor/required-work-ledger.js +236 -81
  78. package/build/executor/resume-pre-spawn.js +38 -1
  79. package/build/executor/runner.js +91 -3
  80. package/build/executor/test-clock.js +8 -0
  81. package/build/executor/types.js +37 -2
  82. package/build/executor/worker-cli-launcher.js +259 -0
  83. package/build/executor/worker-command.js +41 -4
  84. package/build/executor/worker-database-target.js +91 -0
  85. package/build/executor/worker-database.js +908 -0
  86. package/build/executor/worker-finalization.js +106 -0
  87. package/build/executor/worker-guard-hook.js +203 -0
  88. package/build/executor/worker-resources.js +47 -0
  89. package/build/executor/worker-verification-guidance.js +15 -2
  90. package/build/executor/worktree.js +303 -15
  91. package/build/executor-launch.js +11 -1
  92. package/build/generated-assets-doctor.js +9 -1
  93. package/build/generated-assets-health.js +13 -4
  94. package/build/generated-assets-legacy.js +39 -0
  95. package/build/generated-assets-paths.js +12 -1
  96. package/build/generated-assets-repair.js +4 -1
  97. package/build/generated-assets-test-support.js +12 -0
  98. package/build/github-remote.js +33 -0
  99. package/build/github-sign-in.js +62 -0
  100. package/build/index.js +1067 -536
  101. package/build/init.js +39 -1
  102. package/build/install-bridge-conductor-gate.js +78 -0
  103. package/build/install-bridge-conductor-setup.js +413 -0
  104. package/build/install-bridge-conductor.js +1226 -267
  105. package/build/install-bridge.js +376 -60
  106. package/build/mcp-install-state.js +8 -2
  107. package/build/merge-pull-request.js +6 -0
  108. package/build/merge-workflow-install.js +763 -345
  109. package/build/phase-result-artifacts.js +75 -20
  110. package/build/pipeline-orchestrator.js +247 -4
  111. package/build/pipelines.generated.js +35 -35
  112. package/build/plan-discovery.js +15 -2
  113. package/build/plan-execution-ledger.js +306 -17
  114. package/build/plan-phase-routing.js +48 -13
  115. package/build/plane/cli.js +105 -51
  116. package/build/plane/defaults.js +3 -0
  117. package/build/plane/plane-freshness.js +294 -0
  118. package/build/plane/schema-compatibility.js +137 -0
  119. package/build/plane/shutdown-deps.js +38 -0
  120. package/build/plane/shutdown.js +83 -8
  121. package/build/plane/terminal-run-cleanup.js +303 -0
  122. package/build/printed-remedy-commands.js +26 -4
  123. package/build/readiness-check.js +6 -2
  124. package/build/readiness-prerequisites.generated.js +532 -0
  125. package/build/readme.generated.js +1 -1
  126. package/build/setup-epic.js +400 -30
  127. package/build/shared-resources.generated.js +5 -0
  128. package/build/start-tickets.js +28 -15
  129. package/build/test-command-detection.js +247 -0
  130. package/build/test-command-validation.js +73 -0
  131. package/build/testing-config-client.js +150 -0
  132. package/build/ticket-delivery-artifacts.js +258 -0
  133. package/build/ticket-delivery-enrollment.js +306 -0
  134. package/build/ticket-delivery.js +205 -0
  135. package/build/ticket-review-summary.js +14 -0
  136. package/build/upgrade-cli.js +13 -0
  137. package/build/v2-readiness-requirements.js +552 -0
  138. package/build/version.generated.js +3 -3
  139. package/build/worker-guard-hook-bin.js +2 -2
  140. package/build/worktree-core.js +22 -7
  141. package/docs/BRIDGE-DIRECTORY-README.md +48 -0
  142. package/docs/EPIC-IMPLEMENTER-INSTALL.md +12 -867
  143. package/docs/EPIC-IMPLEMENTER.md +104 -63
  144. package/docs/epic-implementer/getting-started.md +131 -0
  145. package/docs/epic-implementer/self-hosting.md +133 -0
  146. package/package.json +3 -3
  147. package/pipelines/idea-to-ticket.json +1 -1
  148. package/pipelines/implement-ticket.json +8 -8
  149. package/pipelines/review-ticket.json +2 -2
  150. package/design-assets/favicon/favicon-32x32.png +0 -0
  151. package/design-assets/just-logo-rough-draft.png +0 -0
package/README.md CHANGED
@@ -410,7 +410,7 @@ later boot.
410
410
  "mcpServers": {
411
411
  "bridge": {
412
412
  "command": "npx",
413
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"],
413
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.70", "serve"],
414
414
  "env": {
415
415
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
416
416
  "BAPI_REPO_NAME": "your-repo",
@@ -432,7 +432,7 @@ later boot.
432
432
  "bridge": {
433
433
  "type": "stdio",
434
434
  "command": "npx",
435
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"],
435
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.70", "serve"],
436
436
  "env": {
437
437
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
438
438
  "BAPI_REPO_NAME": "your-repo",
@@ -454,7 +454,7 @@ later boot.
454
454
  "bridge": {
455
455
  "type": "stdio",
456
456
  "command": "npx",
457
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"],
457
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.70", "serve"],
458
458
  "env": {
459
459
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
460
460
  "BAPI_REPO_NAME": "your-repo",
@@ -477,7 +477,7 @@ Windsurf only supports global MCP configuration.
477
477
  "mcpServers": {
478
478
  "bridge": {
479
479
  "command": "npx",
480
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"],
480
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.70", "serve"],
481
481
  "env": {
482
482
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
483
483
  "BAPI_REPO_NAME": "your-repo",
@@ -496,7 +496,7 @@ Windsurf only supports global MCP configuration.
496
496
  ```toml
497
497
  [mcp_servers.bridge]
498
498
  command = "npx"
499
- args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.69", "serve"]
499
+ args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.70", "serve"]
500
500
 
501
501
  [mcp_servers.bridge.env]
502
502
  BAPI_BASE_URL = "https://bridgegpt-api.com"
@@ -1099,74 +1099,26 @@ Attribute-definition reads and writes can return an attribute's `default_value`
1099
1099
 
1100
1100
  ## Epic Implementer
1101
1101
 
1102
- The Epic Implementer drives a whole epic, several related tickets, from an
1103
- approved plan to merged pull requests. It hands each child ticket to an agent on
1104
- your machine, waits for CI and code review, and merges each child PR into an
1105
- `epic/<KEY>` branch. A person merges the final pull request into your default
1106
- branch.
1102
+ The Epic Implementer drives a whole epic, several related tickets, from an approved plan to merged pull requests. It hands each child ticket to an agent on your machine, waits for CI and code review, and merges each child PR into an `epic/<KEY>` branch. A person merges the final pull request into your default branch.
1107
1103
 
1108
- By default a run with two or more tickets is **unattended**: it merges child
1109
- PRs on its own. `--attended` opts out.
1104
+ This is the one starting point. The same four steps work with Bridge's own ticket storage and with Jira:
1110
1105
 
1111
- **What it requires**
1106
+ 1. **Install.** `npx -y @bridge_gpt/mcp-server install` (skip it when Bridge is already installed).
1107
+ 2. **Set up.** `npx -y @bridge_gpt/mcp-server install conductor` checks everything, fixes what is missing, checks again, and ends with one verdict: "Ready for your first epic" or "Not ready: N steps left".
1108
+ 3. **Define the epic.** `/define-tickets` writes real child ticket keys, `epic-plan.dag.json`, and `epic-plan.meta.json`.
1109
+ 4. **Launch.** `/drive-epic-run <EPIC> [<plan path>]` previews, asks you once, creates the run through `drive-epic`, and drives it. From a shell, run `npx -y @bridge_gpt/mcp-server drive-epic <EPIC>`.
1112
1110
 
1113
- - macOS or Linux, with `git`, the GitHub CLI (`gh`, logged in), the Claude Code
1114
- CLI (`claude`, logged in), and Worktrunk (`wt`) on your `PATH`.
1115
- - Bridge installed in the repository, and the Bridge GitHub App connected.
1116
- - The repository's Epic Implementer defaults, including the CI check each
1117
- ticket must pass (`install conductor`). For unattended runs, that check must
1118
- be a job in one of the two workflow files below, for example
1119
- `epic-implementer-ci / gate`.
1120
- - `.github/workflows/claude-review.yml` and
1121
- `.github/workflows/epic-implementer-ci.yml` on your default branch, then the
1122
- repository indexed (or re-indexed) after they merge. The epic branch is cut
1123
- from the indexed commit.
1124
- - For unattended runs: an escalation channel (the account email, or a webhook)
1125
- and a merge credential in `BAPI_LOCAL_MERGE_TOKEN`.
1111
+ **Read the guide: [Run your first epic](./docs/epic-implementer/getting-started.md).** It lists every prerequisite with its fix. `install` also copies it into your project at `docs/install/epic-implementer-install.md`, so you can ask your agent:
1126
1112
 
1127
- **How to set it up**
1113
+ > Set up the Epic Implementer by following `docs/install/epic-implementer-install.md`. Run `npx -y @bridge_gpt/mcp-server install` to write or refresh that file.
1128
1114
 
1129
- The easy way is to ask your agent:
1115
+ Setup needs macOS or Linux, with `git`, the GitHub CLI (`gh`, signed in), the Claude Code CLI (`claude`, signed in), and Worktrunk (`wt`) on your `PATH`. By default a run with two or more tickets is **unattended**: it merges child PRs into the epic branch on its own. `--attended` opts out.
1130
1116
 
1131
- > Set up the Epic Implementer by following `docs/install/epic-implementer-install.md`.
1117
+ Merging child PRs needs a GitHub token. Setup can store one for this repository on your computer, under `github-merge:<host>/<owner>/<repo>` in your user credential store. `GITHUB_MERGE_TOKEN` still takes precedence when it is set.
1132
1118
 
1133
- `install` copies that guide into your project. It is also in this package as
1134
- [EPIC-IMPLEMENTER-INSTALL.md](./docs/EPIC-IMPLEMENTER-INSTALL.md). It checks
1135
- each step, asks before anything that writes, and tells you which commands you
1136
- must run yourself.
1119
+ `/plan-epic` is the advanced planner. It writes placeholder `TBD-N` keys, so you create the child tickets and run `emit-epic-implementer-bundle finalize` before `/drive-epic-run`. It never creates or approves a run.
1137
1120
 
1138
- By hand, the outline is:
1139
-
1140
- ```bash
1141
- npx -y @bridge_gpt/mcp-server install # if Bridge is not installed yet
1142
- npx -y @bridge_gpt/mcp-server connect-github --repo <repo_name> # connect the GitHub App
1143
- npx -y @bridge_gpt/mcp-server install conductor --required-check "epic-implementer-ci / gate" \
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
1146
- export BAPI_LOCAL_MERGE_TOKEN="$(gh auth token)" # in the shell that runs drive-epic
1147
- npx -y @bridge_gpt/mcp-server epic-implementer readiness --json # read-only check of every prerequisite
1148
- ```
1149
-
1150
- After `install conductor`, restart your MCP client so the Epic Implementer tools
1151
- appear. Add `epic-implementer-ci.yml` (the guide has a template) and the
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
1153
- your default branch. Once it merges, index the repository with
1154
- `/parse-repository`.
1155
-
1156
- **How to run an epic**
1157
-
1158
- 1. `/plan-epic <EPIC>` splits an existing epic ticket into child tickets and
1159
- writes a plan (`epic-plan.dag.json`). Its last step creates and approves an
1160
- unattended run.
1161
- 2. `/drive-epic-run <EPIC> [<plan path>]` previews, asks you once, starts the
1162
- run, and watches it to the end. It takes no flags. For `--attended` or
1163
- `--policy-file <path>`, use the shell instead:
1164
- `npx -y @bridge_gpt/mcp-server drive-epic <EPIC> --plan-file <path> [--attended]`.
1165
- 3. Monitor with the `get_epic_snapshot` and `explain_run` MCP tools, or
1166
- `npx -y @bridge_gpt/mcp-server notifications --repo <repo_name> --run <EPIC> --follow`.
1167
-
1168
- See [The Epic Implementer](#the-epic-implementer) for every command, and
1169
- [EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md) for the full reference.
1121
+ See [The Epic Implementer](#the-epic-implementer) for what each command is for, and [EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md) for the full reference.
1170
1122
 
1171
1123
  ## CLI Subcommands
1172
1124
 
@@ -1276,9 +1228,19 @@ onboarding/API setup, and Windsurf are outside packaged repair.
1276
1228
  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:
1277
1229
 
1278
1230
  ```
1279
- npx -y @bridge_gpt/mcp-server doctor [--agent <name>]
1231
+ npx -y @bridge_gpt/mcp-server doctor [--agent <name>] [--advanced]
1280
1232
  ```
1281
1233
 
1234
+ By default `doctor` works on a repository in any language: it makes **no `uv`,
1235
+ Alembic, or Python call**. `--advanced` adds the Python and self-host
1236
+ diagnostics — the `uv` check and the local plane credential section — for
1237
+ bridge-api and self-hosting owners.
1238
+
1239
+ Right after `Install status`, a **Getting started** section shows the two
1240
+ sign-ins a first epic needs: your Claude sign-in (it reads only `~/.claude.json`)
1241
+ and your GitHub CLI sign-in (one `gh auth status`, ten seconds at most). Each one
1242
+ that is not ready names its one fix. It never changes the exit code.
1243
+
1282
1244
  The report always leads with the advisory **`Install status`** section (repo identity, credential resolution, server connectivity, bootstrap-field completeness, integration credentials, indexing state) **before** the `start-tickets` prerequisite diagnostics; the launcher-cache and MCP tool-surface sections follow. `Install status` is read-only GETs only and never affects the exit code.
1283
1245
 
1284
1246
  The report also includes a **Claude login** advisory: whether the host's own
@@ -1287,7 +1249,7 @@ blocks the doctor run and cannot guarantee the next worker spawn will
1287
1249
  authenticate. See
1288
1250
  [Claude login for Epic Implementer workers](#claude-login-for-epic-implementer-workers).
1289
1251
 
1290
- 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.
1252
+ 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 the selected agent's command** (and **`uv`** with `--advanced`) (`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.
1291
1253
 
1292
1254
  **`claude-review` workflow lineage (advisory, read-only).** `doctor` also reports
1293
1255
  whether the current branch's `.github/workflows/claude-review.yml` matches the
@@ -1307,210 +1269,50 @@ worker**. Remedy and full diagnosis:
1307
1269
 
1308
1270
  ### The Epic Implementer
1309
1271
 
1310
- The Epic Implementer drives a whole epic — several related tickets — from an
1311
- approved plan to merged pull requests, with little help from you. It was called
1312
- the "conductor" before BAPI-1077..1083 renamed it. A few command, flag, and path
1313
- names still say `conductor`; each is noted where it appears.
1272
+ The Epic Implementer drives a whole epic — several related tickets — from an approved plan to merged pull requests, with little help from you. The getting-started guide in [the section above](#epic-implementer) is the one path; this section says what each command is for.
1314
1273
 
1315
1274
  It has two parts:
1316
1275
 
1317
- - **The v2 engine.** A reconciler on the Bridge API server decides every step. An
1318
- executor on your machine runs the jobs it hands out, one agent session per child
1319
- ticket. This is what drives an epic.
1320
- - **Observability** (`start-tickets --conductor`). An opt-in local event ledger,
1321
- supervisor tab, and git hooks. It is off by default, and driving an epic does not
1322
- need it.
1323
-
1324
- The path from an epic to a finished run:
1325
-
1326
- 1. **Plan.** `/plan-epic` splits the epic into child tickets and a plan DAG
1327
- (`epic-plan.dag.json`). `emit-epic-implementer-bundle finalize` writes the DAG
1328
- and the meta file that `drive-epic` uses to find it.
1329
- 2. **Set up the repository, once.**
1330
- `npx -y @bridge_gpt/mcp-server install conductor --required-check <check>`
1331
- (also spelled `install-bridge conductor`; the name predates the rename). It runs
1332
- a read-only doctor and writes the done gate from your required CI check(s). It
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,
1334
- and save a launch profile. With its own consent, it adds `epic_implementer` to
1335
- `BRIDGE_MCP_PROFILE` in your host MCP configs. Run `install conductor --help`
1336
- for every option.
1337
- 3. **Launch and drive.** In Claude Code, `/drive-epic-run <EPIC> [<plan path>]`
1338
- previews the launch, asks you once, creates the run through `drive-epic`, and
1339
- then watches and recovers it. From a shell, [`drive-epic <EPIC>`](#drive-epic)
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.
1348
- 4. **Monitor.** The MCP tools `get_epic_snapshot` and `explain_run` (they need the
1349
- `epic_implementer` profile; see [Environment Variables](#environment-variables)),
1350
- `notifications <EPIC|run-id> [--follow]`, `epic-implementer epic-status`, and
1351
- `executor watch <job>`.
1352
- 5. **Recover.** `epic-implementer unpark`, `adopt-current-head-and-unpark`,
1353
- `continue-child`, `resume-run`, `stop-run`, and `abandon-run` (terminal and
1354
- irreversible). Run `npx -y @bridge_gpt/mcp-server epic-implementer --help` for
1355
- the full list.
1356
-
1357
- `epic-implementer readiness` is a read-only report of every prerequisite, the
1358
- unattended ones included, each with its state and one named fix. The full
1359
- reference — architecture, the CI gate, supervisor config, observability, and git
1360
- hooks — is in [EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md).
1361
-
1362
- **Old variable names stop every command (BAPI-1190).** Every `BAPI_CONDUCTOR_*`
1363
- variable was renamed to `BAPI_EPIC_IMPLEMENTER_*`, and the few old `CONDUCTOR_*`
1364
- names without the `BAPI_` prefix (the node path, for one) now start with
1365
- `EPIC_IMPLEMENTER_`. There are no aliases. If any old name is set, every
1366
- entry point — the MCP server included — prints the old names and exits `1`.
1367
- Rename or unset them.
1276
+ - **The engine.** A reconciler on the Bridge API server decides every step. An executor on your machine runs the jobs it hands out, one agent session per child ticket. This is what drives an epic.
1277
+ - **Observability** (`start-tickets --conductor`). An opt-in local event ledger, supervisor tab, and git hooks. It is off by default, and driving an epic does not need it.
1278
+
1279
+ What each command is for:
1280
+
1281
+ - **`install conductor`** sets up the repository, once. It checks, fixes what is missing, checks again, and ends with one verdict. It is also spelled `install-bridge conductor`, and `install conductor --help` lists every option.
1282
+ - **`/define-tickets`** writes the child tickets and the plan files. **`/plan-epic`** is the advanced planner; it needs `emit-epic-implementer-bundle finalize` and never creates a run.
1283
+ - **`/drive-epic-run <EPIC> [<plan path>]`** previews the launch, asks you once, creates the run through [`drive-epic`](#drive-epic), then watches and recovers it. In Claude Code it first checks whether Bridge's auto-mode sandbox description is in `~/.claude/settings.json`. Only when it is missing, it asks you once, in the session, and writes it only after an explicit yes. You can add it yourself with `npx -y @bridge_gpt/mcp-server bridge-permissions` (run from the project root; it asks first), inspect it with `bridge-permissions --check --json`, and remove it with `install --remove-bridge-permissions`. `install` itself never touches that file.
1284
+ - **Monitor** with the MCP tools `get_epic_snapshot` and `explain_run` (they need the `epic_implementer` profile; see [Environment Variables](#environment-variables)), `notifications <EPIC|run-id> [--follow]`, `epic-implementer epic-status`, and `executor watch <job>`.
1285
+ - **Recover** with `epic-implementer unpark`, `adopt-current-head-and-unpark`, `continue-child`, `resume-run`, `stop-run`, and `abandon-run` (terminal and irreversible). Run `npx -y @bridge_gpt/mcp-server epic-implementer --help` for the full list.
1286
+
1287
+ `epic-implementer readiness` is a read-only report of every prerequisite, the unattended ones included, each with its state and one named fix.
1288
+
1289
+ **Old variable names stop every command.** Every `BAPI_CONDUCTOR_*` variable was renamed to `BAPI_EPIC_IMPLEMENTER_*`, and the few old `CONDUCTOR_*` names without the `BAPI_` prefix (the node path, for one) now start with `EPIC_IMPLEMENTER_`. There are no aliases. If any old name is set, every entry point — the MCP server included — prints the old names and exits `1`. Rename or unset them.
1368
1290
 
1369
1291
  ### `drive-epic`
1370
1292
 
1371
- The one Epic Implementer entry point every Bridge surface names. Give it an epic
1372
- key and it reads Epic Implementer readiness for your repository and routes to the
1373
- single path your project can actually run:
1293
+ The one launch command. Give it an epic key and it reads your repository's readiness and routes to the single path your project can run:
1374
1294
 
1375
1295
  ```
1376
1296
  npx -y @bridge_gpt/mcp-server drive-epic <EPIC>
1377
1297
  ```
1378
1298
 
1379
- You are never asked to choose. `drive-epic` routes to exactly one engine, the
1380
- v2 engine — one transition authority per epic is what keeps an epic from wedging.
1381
- Readiness green routes to the v2 bootstrap below (pass `--plan-file`
1382
- and `drive-epic` runs it for you); readiness not green reports that the v2 engine
1383
- is not ready to drive this epic — there is no alternative engine to fall back
1384
- to — and prints no run command. If readiness is **unknown** — unreachable,
1385
- unauthorized, or malformed — it escalates and prints no run command at
1386
- all, because an unknown owner is not the same as a not-ready one. No branch,
1387
- including every error path, ever offers you two paths.
1388
-
1389
- `drive-epic` owns no branch behavior of its own — it forwards `--feature-branch
1390
- <name>`, `--into-base`, and `--attended` verbatim to `setup-epic`, which decides
1391
- the strategy and the posture (see below). With none of them, a multi-ticket epic
1392
- runs on `epic/<KEY>`, unattended. It also forwards `--repo` and the policy flags:
1393
- `--policy-file <path>` (the complete run policy), `--review-policy <src>` (a
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
1398
- stored policy).
1399
-
1400
- **Every run gets an executor (BAPI-1279).** Once `drive-epic` creates a run, it
1401
- starts an executor scoped to that run in the background, from this checkout's Git
1402
- top level. The executor claims only that run's jobs, logs to
1403
- `.bridge/executors/<run>.log`, and exits on its own when the run is done or
1404
- abandoned. You do not start one by hand. Run `drive-epic` from a Git work tree
1405
- inside the target repository — it checks this before creating anything. If the
1406
- executor fails to start, the run is left intact and `drive-epic` prints the log
1407
- path and the exact command to start it by hand.
1408
-
1409
- **Choosing the server.** With no flags, `drive-epic` targets production and uses
1410
- the stored `bapi:<repo>` key when there is one. `--base-url <url>` (or
1411
- `BAPI_BASE_URL`) names another server. `--launch-profile <name>` (or
1412
- `BAPI_EPIC_LAUNCH_PROFILE`) selects a host-local profile saved by
1413
- `install conductor --launch-profile <name>`; use one for a local server or a
1414
- durable host. With a profile, `--base-url` must agree with it. A stored key
1415
- approved for a different endpoint is never sent.
1416
-
1417
- **Finding the plan from the epic key (BAPI-1285).** `--plan-file` is optional.
1418
- Without it, `drive-epic` searches `{docs_dir}/epic-plans/*/epic-plan.meta.json` for a
1419
- file whose `epic_key` is exactly this epic (`docs_dir` is `BAPI_DOCS_DIR`, else
1420
- `docs/tmp`, resolved against the Git top level; an absolute `BAPI_DOCS_DIR` is used
1421
- as given). Exactly one match with a sibling `epic-plan.dag.json` is used as if you
1422
- had passed `--plan-file`, and its path is printed before anything is created. Zero
1423
- matches, two or more, or an unusable meta file **stop** with the paths found and
1424
- create nothing, and a folder name, a child ticket key, or
1425
- `sibling-ticket-manifest.json` is never used to guess. A supplied `--plan-file`
1426
- always wins and discovery does not run.
1427
-
1428
- The meta file is `{"epic_key": "<KEY>"}`, written by `emit-epic-implementer-bundle
1429
- finalize` beside the DAG (its own atomic write, reported as `meta_path` in
1430
- `--json`). It is separate from `epic-plan.dag.json` on purpose: the DAG is sent to
1431
- the server, which rejects unknown fields. A plan finalized before this change has no
1432
- meta file, so it is reported as not found — pass its DAG with `--plan-file`.
1433
-
1434
- **A live run with no plan.** If the epic already has a live run and no plan was
1435
- supplied or found, `drive-epic` creates nothing. It makes sure that run has an
1436
- executor: it reuses a verified live one (never starting a second), starts one when
1437
- the old one is gone, starts none for a durable launch profile with a confirmed
1438
- repo-wide executor, and starts none when this checkout's plane is bound to that
1439
- run. An epic with several active runs (`live-run-ambiguous`), or a run that cannot
1440
- be read (`live-run-unknown`), is refused by name.
1441
-
1442
- **Preview with `--dry-run`.** `drive-epic <EPIC> --dry-run` is read-only. It reads
1443
- the target, readiness, the live run, and the plan, runs the bootstrap's own dry-run
1444
- validation when a plan is available, and reports the decision a real invocation
1445
- would make — `create`, `attach`, `refuse`, or `stop` (exit `0` for the first two,
1446
- `1` for the others). It never creates a run, cuts a branch, starts a plane,
1447
- requests a lane, or starts or signals an executor. With `--json` (valid only with
1448
- `--dry-run`) stdout carries exactly one JSON document with `epic_key`, `target`,
1449
- `readiness`, `live_run`, `plan`, `summary`, `decision`, and `refusal`. The
1450
- readiness `reason_id` and `remedy` are the strings the real refusal prints. The
1451
- webhook URL, credentials, and policy contents are never included. The preview
1452
- probes a local plane only when the target is a loopback plane, readiness failed on
1453
- the network, and a plan is available. A refused port plus passing local preflight
1454
- yields a conditional
1455
- `create` with optional `cold_start` (`plane_endpoint`, `will_start_plane: true`,
1456
- `live_run_checked: false`), `live_run: null`, and partial offline setup validation.
1457
- The real launch attempts guarded startup, then rechecks run existence and server
1458
- validation; the preview does not guarantee creation. Remote targets, non-refused
1459
- port probes, and ordinary production previews keep their existing refusal or
1460
- create behavior. `target.source` is optional and appears only for selected
1461
- profiles (`profile` or `profile-env`).
1462
-
1463
- #### Running the server yourself (Bridge API source checkout only)
1464
-
1465
- The rest of this section, and [`plane up`](#plane-up--claim-scope-is-required)
1466
- below, apply only when you run the Bridge API server on your own machine. That
1467
- needs a Bridge API **source checkout**: `plane up` must run from its repository
1468
- root (the directory holding `main.py`, `worker.py`, and `alembic.ini`), and its
1469
- executor lanes run from that checkout's `mcp_server/build/index.js`, never from
1470
- npx. If you target production, skip this part.
1471
-
1472
- **The composed bring-up is two-phase (BAPI-1102).** With `--plan-file` on a
1473
- repository whose readiness is missing only the runtime facts, one invocation runs,
1474
- in order: the **control plane** (Bridge API server + reconciler, each gated on its
1475
- own readiness), then `setup-epic` to create and approve the run, then **executor
1476
- lanes scoped to that run** with `--epic-run-id <run>`, then the **dead-man
1477
- observer** last, then the ready banner. The order is forced: an executor lane must
1478
- carry an explicit claim scope, and the run it is scoped to does not exist until the
1479
- server is up and `setup-epic` has run.
1480
-
1481
- A plane's executor lanes serve **exactly one** run — the run it is bound to. A
1482
- second epic does **not** start a second plane: it attaches to the running plane's
1483
- reconciler and gets its own run-scoped executor. Two planes on one database are
1484
- not supported. If `setup-epic` fails, the control plane is left running and **no
1485
- executor lane is spawned**. If the lanes fail to become ready, the control plane
1486
- and the committed run are both left intact and the observer is not started —
1487
- nothing is rolled back, because a local process that failed to start says nothing
1488
- about whether the run is valid.
1489
-
1490
- "Plane ready" reports **processes**, not dispatchability: if the run cuts an epic
1491
- branch, the reconciler holds ticket dispatch until that branch's index scope
1492
- finishes preparing.
1493
-
1494
- ### `plane up` — claim scope is required
1495
-
1496
- `plane up` starts the runtime on its own, from a Bridge API source checkout, and
1497
- every executor lane it starts needs an explicit claim scope:
1299
+ You are never asked to choose. If readiness is not green, it names each missing item with its fix and creates nothing. If readiness cannot be read (unreachable, unauthorized, or malformed), it stops and prints no run command, because an unknown state is not the same as a not-ready one.
1498
1300
 
1499
- ```
1500
- npx -y @bridge_gpt/mcp-server plane up --epic-run-id <run-id> # repeatable
1501
- npx -y @bridge_gpt/mcp-server plane up --repo-wide # or repository-wide
1502
- ```
1301
+ `drive-epic` owns no branch behavior of its own. It forwards `--feature-branch <name>`, `--into-base`, and `--attended` to `setup-epic`, which decides the strategy and the posture (see [`setup-epic`](#setup-epic)). With none of them, a multi-ticket epic runs on `epic/<KEY>`, unattended. It also forwards `--repo` and the policy flags: `--policy-file <path>` (the complete run policy), `--review-policy <src>` (a per-run review policy: `repository_policy`, `verdict_protocol`, `native_review_decision`, or `none`; omitted, the server stamps `repository_policy` at first approval for a new feature-branch run, and `verdict_protocol` is the explicit AI-review opt-in), and `--replace-policy` (allow replacing a live run's stored policy).
1302
+
1303
+ **Every run gets an executor.** Once `drive-epic` creates a run, it starts an executor scoped to that run in the background, from this checkout's Git top level. The executor claims only that run's jobs, logs to `.bridge/executors/<run>.log`, and exits on its own when the run is done or abandoned. You do not start one by hand. Run `drive-epic` from a Git work tree inside the target repository; it checks this before creating anything. If the executor fails to start, the run is left intact and `drive-epic` prints the log path and the exact command to start it by hand.
1304
+
1305
+ **Choosing the server.** With no flags, `drive-epic` targets production and uses the stored `bapi:<repo>` key when there is one. `--base-url <url>` (or `BAPI_BASE_URL`) names another server. A stored key approved for a different endpoint is never sent.
1306
+
1307
+ **Finding the plan from the epic key.** `--plan-file` is optional. Without it, `drive-epic` searches `{docs_dir}/epic-plans/*/epic-plan.meta.json` for a file whose `epic_key` is exactly this epic (`docs_dir` is `BAPI_DOCS_DIR`, else `docs/tmp`, resolved against the Git top level; an absolute `BAPI_DOCS_DIR` is used as given). Exactly one match with a sibling `epic-plan.dag.json` is used as if you had passed `--plan-file`, and its path is printed before anything is created. Zero matches, two or more, or an unusable meta file **stop** with the paths found and create nothing. A folder name, a child ticket key, or `sibling-ticket-manifest.json` is never used to guess. A supplied `--plan-file` always wins and discovery does not run.
1503
1308
 
1504
- The two are mutually exclusive. Asked to start lanes with neither, `plane up`
1505
- **refuses before spawning anything**, in the executor's own words. That is not a
1506
- new restriction — an executor started with no claim scope has refused to start
1507
- since BAPI-1026 — it is that refusal moved to where it is actionable, instead of
1508
- surfacing as a member crash and a full plane rollback.
1309
+ The meta file is `{"epic_key": "<KEY>"}`, written beside the DAG by `/define-tickets` and by `emit-epic-implementer-bundle finalize` (reported as `meta_path` in `--json`). It is separate from `epic-plan.dag.json` on purpose: the DAG is sent to the server, which rejects unknown fields. A plan finalized before the meta file existed has none, so pass its DAG with `--plan-file`.
1509
1310
 
1510
- `plane status` reports the lifecycle phase (control plane starting/ready, lanes
1511
- starting/ready, observer active, plane ready) and the epic run the plane is bound
1512
- to. `plane down` handles every intermediate phase: it stops the bound run first,
1513
- then signals the recorded process group.
1311
+ **A live run with no plan.** If the epic already has a live run and no plan was supplied or found, `drive-epic` creates nothing. It makes sure that run has an executor: it reuses a verified live one (never starting a second) and starts one when the old one is gone. An epic with several active runs (`live-run-ambiguous`), or a run that cannot be read (`live-run-unknown`), is refused by name.
1312
+
1313
+ **Preview with `--dry-run`.** `drive-epic <EPIC> --dry-run` is read-only. It reads the target, readiness, the live run, and the plan, runs the bootstrap's own dry-run validation when a plan is available, and shows the decision a real invocation would make: `create`, `attach`, `refuse`, or `stop` (exit `0` for the first two, `1` for the others). It never creates a run, cuts a branch, requests a lane, or starts or signals an executor. With `--json` (valid only with `--dry-run`) stdout carries exactly one JSON document with `epic_key`, `target`, `readiness`, `live_run`, `plan`, `summary`, `decision`, and `refusal`. The readiness `reason_id` and `remedy` are the strings the real refusal prints. The webhook URL, credentials, and policy contents are never included.
1314
+
1315
+ `drive-epic --help` lists every option. Owners who run their own Bridge server have extra steps: see `drive-epic --help-advanced`.
1514
1316
 
1515
1317
  ### `setup-epic`
1516
1318
 
@@ -1528,20 +1330,20 @@ branch, and one draft integration PR targets the repository base branch. This ho
1528
1330
  every path, CI and `--json` included. A single-node plan keeps the repository base
1529
1331
  branch, matching plain `start-tickets`.
1530
1332
 
1531
- > **Behavior change (BAPI-1009).** The same no-flag command previously ran children
1333
+ > **Behavior change.** The same no-flag command previously ran children
1532
1334
  > directly into the repository base branch. **Pass `--into-base` to restore that**, if
1533
1335
  > your automation depends on it. Pass `--feature-branch <name>` to override the derived
1534
1336
  > name, or to force a branch for a single-node plan. Passing both is a parse error,
1535
1337
  > refused before any file read, credential resolution, or network call.
1536
1338
 
1537
- **A run that selects an epic branch is created UNATTENDED (BAPI-1102).** Its
1339
+ **A run that selects an epic branch is created UNATTENDED.** Its
1538
1340
  `policy_json` carries `posture: "unattended"` and `v2_auto_merge_enabled: true`, so
1539
1341
  child PRs merge into the epic branch without parking for a human at every gate. The
1540
1342
  **integration PR into the repository base branch stays human-gated.** The run's CI
1541
1343
  gate is stamped **server-side at first approval** — from your repository's declared
1542
1344
  default, or, when it declares none, as an explicit recorded `no_ci_gate` mode.
1543
1345
 
1544
- > **Behavior change (BAPI-1102).** Pass `--attended` to restore the previous
1346
+ > **Behavior change.** Pass `--attended` to restore the previous
1545
1347
  > composition: `base_branch` plus an explicitly requested `--review-policy`, with no
1546
1348
  > posture and no auto-merge authorization. `--into-base`, single-node plans, and
1547
1349
  > branch-silent invocations are **unchanged** — they send no `policy_json` at all,
@@ -1552,7 +1354,7 @@ default, or, when it declares none, as an explicit recorded `no_ci_gate` mode.
1552
1354
  An unattended run has two **repository** prerequisites — consent
1553
1355
  (`unattended_epic_implementer_allowed`, ON by default; the repository owner can switch
1554
1356
  "Allow unattended Epic Implementer runs" off and on in the Bridge admin panel's Setup
1555
- page) and an **escalation channel** (BAPI-1274): a verified notify webhook, or,
1357
+ page) and an **escalation channel**: a verified notify webhook, or,
1556
1358
  when the policy declares no webhook, an email address on the account — plus
1557
1359
  confirmed default-branch review/CI workflows. Each is refused by name **before any
1558
1360
  run row is created** (`target_not_allowed`, `webhook_unverified`,
@@ -1562,33 +1364,52 @@ to email, and `notify.local_sink` does not count as a channel.
1562
1364
  `epic-implementer readiness` and `drive-epic` both list these prerequisites with
1563
1365
  their current state.
1564
1366
 
1565
- Once the plan is approved, the **server-side reconciler** picks the run up within
1566
- ~30s. If you ran `setup-epic` directly, start an executor for the run yourself
1567
- (`drive-epic` does this for you). An executor needs exactly one claim scope, or it
1568
- refuses to start:
1367
+ **One switch decides a run's own merges.** A run's child merges into its
1368
+ epic branch follow the Setup-page switch "Allow unattended Epic Implementer runs".
1369
+ They do not read the legacy repository flags (`auto_merge_enabled`,
1370
+ `merge_approval_required`), which still govern merges made outside a run (the plain
1371
+ merge route, the approval route, and the `merge_pull_request` tool). The integration
1372
+ PR into the base branch is never eligible. If the switch is turned off mid-run, the
1373
+ reconciler **holds** each child that reaches merging: `explain_run` shows a pending
1374
+ `unattended_posture_off` observation, no job is created, and no attempt is spent.
1375
+ Turning the switch back on resumes merging on the next tick with no `unpark`. A hold
1376
+ longer than the merging gate's deadline parks through the normal watchdog. A local or
1377
+ machine-token merge already handed to the executor before the switch-off may still
1378
+ finish.
1379
+
1380
+ **Launch capability summary.** An unattended `drive-epic` launch, and its
1381
+ `--dry-run`, check three rows before creating a run: the **unattended posture** (the
1382
+ Setup switch), **merge credential capability**, and **worktree preparation**. The
1383
+ server reports the resolved merge mode and the GitHub `owner/name`. In `local` mode the
1384
+ CLI probes `GITHUB_MERGE_TOKEN`, and in `machine_token` mode `BAPI_MACHINE_MERGE_TOKEN`,
1385
+ with `gh api --include repos/{owner}/{name}` and one pull-request read. Pass means the
1386
+ token has push permission and can read pull requests. `github_actions` mode shows one
1387
+ informational row and runs no local probe. The worktree row checks, without writing,
1388
+ that the executor clone's git `info/exclude` is present or writable.
1389
+
1390
+ Each row carries a `blocking` flag. Only a **proven** problem blocks: the switch is off,
1391
+ the token is missing or invalid, a `404` or a `200` without push permission, or an
1392
+ exclude that is neither present nor writable. A `401`, `403`, `429`, `5xx`, a network
1393
+ error, a timeout, an unresolved repository, a non-local executor clone (a plane lane
1394
+ or a durable launch profile), or an older server that does not report the new fields
1395
+ is a **"capability not verified"** warning, not a refusal. `--attended` and
1396
+ `--into-base` make all three rows informational. The probe does not prove branch
1397
+ protection or rulesets; those are still checked at merge time. Upgrade the server
1398
+ before the MCP package: an older server simply yields the warning.
1399
+
1400
+ Once the plan is approved, the **server-side reconciler** picks the run up within ~30s. If you ran `setup-epic` directly, start an executor for the run yourself (`drive-epic` does this for you). An executor needs exactly one claim scope, or it refuses to start, and it needs `--base-url` or `BAPI_BASE_URL`:
1569
1401
 
1570
1402
  ```
1571
1403
  npx -y @bridge_gpt/mcp-server executor --repo <name> --epic-run-id <run-id> --exit-when-run-terminal
1572
- npx -y @bridge_gpt/mcp-server executor --repo <name> --repo-wide # every run in the repo
1573
1404
  ```
1574
1405
 
1575
- `executor install-service` generates a launchd/systemd user unit so a durable
1576
- executor survives a reboot. `--base-url` or `BAPI_BASE_URL` is required: the
1577
- executor has no production fallback.
1406
+ For durable hosts, see `drive-epic --help-advanced`.
1578
1407
 
1579
1408
  ### Epic Implementer reference
1580
1409
 
1581
- The full reference — the v2 architecture (server-side reconciler + local
1582
- executor), the CI gate, `epic-implementer install-git-hooks`, the supervisor
1583
- `done_gate_config` / `auto_merge_enabled` settings, and the opt-in observability
1584
- stream — lives in **[EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md)**.
1585
- Auto-merge into the epic branch is **on by default** for unattended runs (see
1586
- [`setup-epic`](#setup-epic)); only the `--conductor` observability layer is off by
1587
- default.
1410
+ The full reference — how the engine works, the CI gate, `epic-implementer install-git-hooks`, the supervisor `done_gate_config` / `auto_merge_enabled` settings (which govern merges outside a run; a run's own merges follow the Setup-page switch), and the opt-in observability stream — is in **[EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md)**. It is a reference, not a second walkthrough: start with the [Epic Implementer](#epic-implementer) section above.
1588
1411
 
1589
- Two retired names remain as failing pointers. The event-ledger CLI was renamed
1590
- from `conductor` to `epic-implementer`, and `emit-conductor-bundle` to
1591
- `emit-epic-implementer-bundle`; the old names now print the new name and exit.
1412
+ Two retired names remain as failing pointers: the old event-ledger CLI name and `emit-conductor-bundle`. Both print the new name (`epic-implementer`, `emit-epic-implementer-bundle`) and exit.
1592
1413
 
1593
1414
  > 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.
1594
1415
 
@@ -1646,23 +1467,26 @@ Optionally set a repository Actions **variable** named `BAPI_BASE_URL` to point
1646
1467
 
1647
1468
  #### Merge credentials (`local` and `machine_token` modes)
1648
1469
 
1649
- No merge path reads an ambient `gh` login. Each mode reads exactly one
1650
- process-launch configuration key, with **no fallback** between them and none to
1651
- an inherited `GH_TOKEN`, `GITHUB_TOKEN`, a `gh auth` session, or the Bridge
1652
- credential store. Bridge never stores either value.
1470
+ No merge path reads an ambient `gh` login. The two modes are separate, with **no
1471
+ fallback** between them and none to an inherited `GH_TOKEN`, `GITHUB_TOKEN`, or a
1472
+ `gh auth` session.
1653
1473
 
1654
1474
  | Mode | Key | Provenance |
1655
1475
  |---|---|---|
1656
- | `local` | `BAPI_LOCAL_MERGE_TOKEN` | A configured local scoped credential. |
1657
- | `machine_token` | `BAPI_MACHINE_MERGE_TOKEN` | Your machine user's credential. |
1476
+ | `local` | `GITHUB_MERGE_TOKEN`, then `BAPI_LOCAL_MERGE_TOKEN`, then a stored entry | A scoped GitHub token for this repository. Setup can store one on your computer as `github-merge:<host>/<owner>/<repo>` in `~/.config/bridge/credentials.json`; either environment variable takes precedence over it. |
1477
+ | `machine_token` | `BAPI_MACHINE_MERGE_TOKEN` | Your machine user's credential, read from the environment only. A stored `github-merge:` entry does not configure this mode. |
1478
+
1479
+ Supply environment keys at process launch, or from an approved external secret manager.
1658
1480
 
1659
- Supply them at process launch, or from an approved external secret manager.
1481
+ A probe that passes shows the key has push permission and can read pull requests.
1482
+ It does not prove branch protection or repository rules; those are checked at merge time.
1660
1483
 
1661
1484
  | Preflight outcome | Remediation |
1662
1485
  |---|---|
1663
- | `*_credential_missing` | Set the mode's key in the environment this MCP server is launched with. |
1486
+ | `*_credential_missing` | Set the mode's key in the environment this MCP server is launched with. For `local` mode, setup can instead store a token for this repository. |
1664
1487
  | `*_credential_invalid` | GitHub rejected the configured credential. Rotate it and relaunch. |
1665
- | `*_credential_unpermitted` | It authenticates but cannot write to this repository. Grant it merge permission. |
1488
+ | `*_credential_unpermitted` | GitHub answered `404`, or `200` without push permission, for this repository. Grant it push access. |
1489
+ | capability probe unavailable | GitHub answered `401`, `403`, `429`, or `5xx`, or the probe timed out. At launch this is a "capability not verified" warning; at merge time the merge is refused. Retry, then check the token by hand. |
1666
1490
  | `local_gh_unavailable` | Install the GitHub CLI (`gh`) on the machine running this MCP server. |
1667
1491
 
1668
1492
  #### What the workflow does and does not do
@@ -1782,7 +1606,7 @@ If a custom pipeline has the same key as a built-in pipeline, the custom version
1782
1606
  | `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 |
1783
1607
  | `BAPI_PLANE_UVICORN` | No | `uvicorn` | Executable used for the server member of `plane up` |
1784
1608
  | `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 |
1785
- | `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) |
1609
+ | `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 --help-advanced` |
1786
1610
  | `BAPI_DOCS_DIR` | No | `docs/tmp` | Local directory for saving plans, critiques, and research reports |
1787
1611
  | `BAPI_PIPELINES_DIR` | No | `.bridge/pipelines` | Directory for user-defined custom pipeline JSON files |
1788
1612
  | `BAPI_WORKTRUNK_BIN` | No | `wt` (`git-wt` on Windows) | Override the Worktrunk executable name/path used by `start-tickets` for nonstandard installs |
@@ -2047,7 +1871,7 @@ The full surface, for when you need the complete enumeration. Day-to-day, use [U
2047
1871
 
2048
1872
  ### MCP tools
2049
1873
 
2050
- 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).
1874
+ The authoritative tool catalog covers **80 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).
2051
1875
 
2052
1876
  - **Connectivity & identity** — `ping` (its JSON also carries `docs_dir`, `role`, and `customer_type`)
2053
1877
  - **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)
@@ -2056,7 +1880,7 @@ The authoritative tool catalog covers **78 tools** (enumerated below). What's ac
2056
1880
  - **AI generation (request/get)** — `request_plan_generation`/`get_plan`, `create_doc`/`get_doc` (design docs by `doc_type`: tdd/architecture/fsd/prd, where `architecture` is an alias of `tdd`), `request_ticket_review` (writes both `get_clarifying_questions` and `get_ticket_critique`), `request_reimplement_context`/`get_reimplement_context`, `request_council`/`get_council`, `request_deep_research`/`get_deep_research`
2057
1881
  - **Bounded waits** — `wait_for_ticket_review`, `wait_for_ci_checks`. Each returns `state: "ready" | "pending" | "error"`; review waits default to 20 s and CI waits default to 240 s (both accept up to 240 s explicitly). `pending` is a normal, resumable result you call again on, never a failure. They exist so an agent can wait without a foreground `sleep` and without binding a long server-side operation to the 900 s MCP client deadline. `wait_for_ci_checks` reports only that checks are **terminal** — deciding pass or fail stays with the caller.
2058
1882
  - **Other AI** — `second_opinion`, `generate_image`, `generate_decision_page`, `visual_diff` (deterministic pixel diff of a rendered URL vs a design comp)
2059
- - **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)
1883
+ - **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), `get_epic_contract_context` (an epic child's parent requirements and sibling contracts, with explicit coverage; read-only)
2060
1884
  - **Jira status** — `update_jira_status` (pass `status: "auto"` to resolve the configured post-PR status server-side)
2061
1885
  - **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)
2062
1886
  - **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"`)
@@ -2168,9 +1992,33 @@ outcome is unknown, a challenge cannot be recovered, or installation asks for su
2168
1992
  Never delete possibly redeemed proof to restart. Ordinary invite tokens and
2169
1993
  verification codes are not stored.
2170
1994
 
1995
+ ### Didn't get the code?
1996
+
1997
+ The code comes from noreply@bridgegpt-api.com and usually arrives within
1998
+ two minutes. Delivery is retried for about two hours, so it can come late.
1999
+
2000
+ - Check your spam, junk, and quarantine folders. Search for
2001
+ noreply@bridgegpt-api.com.
2002
+ - At the code prompt, type r to send a new code. Earlier codes keep
2003
+ working. You can ask for up to two new codes, a minute apart.
2004
+ - Typed the wrong address? Press Ctrl-C and re-run install with the right
2005
+ one. Install offers to start a new signup.
2006
+ - A code lasts four hours. If it expires, re-run install from the same
2007
+ folder. Install offers to start a new signup.
2008
+ - A teammate on Bridge can send you an invite. Choose "I already have a
2009
+ token", or pass --invite.
2010
+ - Still stuck? Email info@bridgegpt.ai.
2011
+
2012
+ ### Credential storage
2013
+
2171
2014
  Credential storage uses bounded exclusive locking without timeout-based stealing.
2172
- An abandoned lock needs installation support. POSIX systems sync the containing
2015
+ An abandoned lock needs help: contact Bridge support at info@bridgegpt.ai and keep
2016
+ the recovery proof. POSIX systems sync the containing
2173
2017
  directory; Windows uses file sync plus atomic replacement because portable Node
2174
2018
  directory handles are unavailable. A failure after rename is an uncertain durability
2175
2019
  outcome: the new bytes may already exist. Rerun reloads the actual store under lock;
2176
2020
  there is no guarantee that old pending bytes survive every failure.
2021
+
2022
+ ### Out of scope
2023
+
2024
+ The CLI cannot diagnose non-delivery, a sender mismatch, or incompatible server behavior. It preserves saved attempts, uses the existing neutral guidance and server-enforced resend limits, and still permits the existing teammate-invite route; unresolved cases go to info@bridgegpt.ai, which does not promise a support-issued invite or a verification bypass.