@bridge_gpt/mcp-server 0.2.65 → 0.2.67

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 (132) hide show
  1. package/README.md +269 -82
  2. package/build/agent-capabilities/probes.js +15 -5
  3. package/build/agent-launchers/claude-executor-adapter.js +55 -34
  4. package/build/agent-launchers/executor-adapter.js +34 -4
  5. package/build/agents.generated.js +1 -1
  6. package/build/bounded-wait.js +67 -10
  7. package/build/bridge-config.js +104 -0
  8. package/build/codex-bridge-profile.js +10 -1
  9. package/build/commands.generated.js +12 -12
  10. package/build/conductor/bridge-api-client.js +372 -10
  11. package/build/conductor/bring-up-facts.js +1 -1
  12. package/build/conductor/doctor.js +3 -3
  13. package/build/conductor/epic-child-continuation.js +61 -34
  14. package/build/conductor/epic-implementer-cli.js +34 -6
  15. package/build/conductor/errors.js +4 -3
  16. package/build/conductor/guided-repair.js +327 -0
  17. package/build/conductor/hook-runtime-qualification.js +1 -1
  18. package/build/conductor/merge-execution-contract.js +27 -8
  19. package/build/conductor/merge-execution-eligibility.js +3 -2
  20. package/build/conductor/pr-ci-producer.js +1 -1
  21. package/build/conductor/readiness-cli.js +46 -9
  22. package/build/conductor/readiness-sections.js +41 -6
  23. package/build/conductor/readiness.js +204 -30
  24. package/build/conductor/recovery-cli.js +703 -20
  25. package/build/conductor/recovery-operations.js +392 -3
  26. package/build/conductor/repair-contract.js +112 -3
  27. package/build/conductor/repository-workflow-remedy.js +125 -0
  28. package/build/conductor/tools.js +2 -2
  29. package/build/conductor-bundle-artifacts.js +8 -0
  30. package/build/credential-store.js +5 -4
  31. package/build/diagnostic-text.js +36 -0
  32. package/build/docs.generated.js +8 -3
  33. package/build/doctor.js +70 -10
  34. package/build/drive-epic-key.js +6 -5
  35. package/build/drive-epic.js +479 -131
  36. package/build/epic-coherence-input.js +2 -1
  37. package/build/epic-implementer-bin.js +30 -26
  38. package/build/epic-implementer-bundle-cli.js +2 -2
  39. package/build/epic-launch-diagnostic.js +31 -0
  40. package/build/epic-launch-profile.js +44 -14
  41. package/build/executor/cli.js +3 -2
  42. package/build/executor/completion-contract.js +48 -5
  43. package/build/executor/completion-supervision.js +9 -0
  44. package/build/executor/correction-dispatch.js +60 -0
  45. package/build/executor/env.js +25 -0
  46. package/build/executor/heartbeat.js +1 -1
  47. package/build/executor/http-client.js +35 -0
  48. package/build/executor/integration-job.js +6 -1
  49. package/build/executor/job-errors.js +38 -4
  50. package/build/executor/job-log-registry.js +340 -73
  51. package/build/executor/job-runner.js +485 -74
  52. package/build/executor/job-types.js +8 -13
  53. package/build/executor/observation.js +6 -1
  54. package/build/executor/preflight.js +136 -10
  55. package/build/executor/prompt-spec.js +113 -9
  56. package/build/executor/required-work-ledger.js +6 -1
  57. package/build/executor/resume-pre-spawn.js +2 -0
  58. package/build/executor/runner.js +31 -2
  59. package/build/executor/service-unit.js +7 -1
  60. package/build/executor/stale-artifacts.js +5 -4
  61. package/build/executor/types.js +1 -0
  62. package/build/executor/watch-cli.js +35 -8
  63. package/build/executor/worker-command.js +43 -43
  64. package/build/executor/worker-finalization.js +161 -43
  65. package/build/executor/worker-guard-hook.js +152 -12
  66. package/build/executor/worker-log.js +137 -70
  67. package/build/executor/worktree-gc.js +30 -6
  68. package/build/executor/worktree.js +82 -1
  69. package/build/index.js +482 -660
  70. package/build/init.js +107 -4
  71. package/build/install-bridge-conductor.js +8 -6
  72. package/build/install-bridge.js +287 -23
  73. package/build/install-doctor.js +172 -30
  74. package/build/install-reexec.js +69 -7
  75. package/build/macos-terminal-permission-guidance.js +16 -0
  76. package/build/model-thresholds-tool.js +185 -0
  77. package/build/phase-context-git-probe.js +68 -0
  78. package/build/phase-result-artifacts.js +173 -5
  79. package/build/pipelines.generated.js +19 -25
  80. package/build/plane/alembic-head.js +12 -3
  81. package/build/plane/base-worktree-guard.js +147 -0
  82. package/build/plane/cli.js +217 -17
  83. package/build/plane/code-snapshot.js +468 -0
  84. package/build/plane/defaults.js +48 -3
  85. package/build/plane/endpoint.js +41 -0
  86. package/build/plane/manifest.js +120 -1
  87. package/build/plane/member-roster.js +94 -19
  88. package/build/plane/preflight.js +30 -2
  89. package/build/plane/process-cwd.js +67 -0
  90. package/build/plane/restart.js +542 -0
  91. package/build/plane/shutdown.js +31 -0
  92. package/build/plane/status.js +145 -6
  93. package/build/plane/supervisor.js +588 -177
  94. package/build/plane/types.js +54 -2
  95. package/build/plane/worker-exit-code.js +2 -0
  96. package/build/printed-remedy-commands.js +37 -0
  97. package/build/project-root.js +99 -0
  98. package/build/readiness-check.js +1 -1
  99. package/build/readme.generated.js +1 -1
  100. package/build/review-generation.js +22 -0
  101. package/build/review-tickets.js +156 -13
  102. package/build/setup-epic.js +224 -127
  103. package/build/sfcc/config.js +9 -0
  104. package/build/sfcc/credentials.js +100 -38
  105. package/build/sfcc/hostname.js +67 -0
  106. package/build/sfcc/permissions.js +17 -13
  107. package/build/sfcc/register.js +1 -1
  108. package/build/sfcc/setup-status.js +2 -0
  109. package/build/sfcc/tool-wrapper.js +41 -43
  110. package/build/sfcc/tools-configured.js +96 -0
  111. package/build/sfcc/write-grants.js +17 -11
  112. package/build/sfcc/write-result.js +4 -3
  113. package/build/sfcc/writes-site-preference.js +20 -8
  114. package/build/start-tickets.js +332 -79
  115. package/build/tool-error-envelope.js +61 -0
  116. package/build/upgrade-cli.js +109 -24
  117. package/build/version.generated.js +3 -3
  118. package/build/visual-diff.js +22 -1
  119. package/build/windows-npm-entry.js +103 -0
  120. package/build/worker-guard-hook-bin.js +3 -5
  121. package/build/worker-guard-hook-main.js +47 -0
  122. package/build/worktree-core.js +136 -9
  123. package/docs/EPIC-IMPLEMENTER-INSTALL.md +849 -0
  124. package/docs/EPIC-IMPLEMENTER.md +662 -0
  125. package/docs/install/mcp-tool-integrations.md +25 -15
  126. package/docs/install/sfcc-integration.md +21 -8
  127. package/package.json +1 -1
  128. package/pipelines/implement-ticket.json +1 -1
  129. package/pipelines/plan-epic.json +0 -5
  130. package/pipelines/review-ticket.json +1 -1
  131. package/docs/CONDUCTOR.md +0 -605
  132. package/pipelines/idea-to-pr.json +0 -49
package/README.md CHANGED
@@ -60,6 +60,7 @@ account — it will ask.
60
60
  - [Operational commands](#operational-commands)
61
61
  - [Extra Capabilities](#extra-capabilities)
62
62
  - [Salesforce B2C Commerce (SFCC) Tools](#salesforce-b2c-commerce-sfcc-tools)
63
+ - [Epic Implementer](#epic-implementer)
63
64
  - [CLI Subcommands](#cli-subcommands)
64
65
  - [Custom Pipelines](#custom-pipelines)
65
66
  - [Environment Variables](#environment-variables)
@@ -67,7 +68,7 @@ account — it will ask.
67
68
  - [Personal model routing preferences](#personal-model-routing-preferences)
68
69
  - [Reference](#reference)
69
70
 
70
- For advanced epic/multi-agent orchestration, see [CONDUCTOR.md](./docs/CONDUCTOR.md).
71
+ 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
72
 
72
73
  ## Installation details
73
74
 
@@ -252,9 +253,13 @@ workflows. Bridge-spawned Codex workers then select it automatically, including
252
253
  the fresh implementation session after review. Pass `--codex-profile=off` to
253
254
  decline; the installer leaves any existing profile content intact. On package
254
255
  upgrade, the next Bridge-spawned worker refreshes an older, unmodified managed
255
- profile before launch. If a profile
256
- already contains user-authored or conflicting content, the installer leaves it
257
- untouched and reports that workers cannot use it. Run `doctor --agent codex` to
256
+ profile before launch. The profile preapproves review-decision capture, the
257
+ fixed reviewed-document publisher, and the implementation phase-result record,
258
+ so those required Bridge writes do not enter Codex Auto-review. The general
259
+ `attachment` tool stays on automatic review because it also supports deletion
260
+ and replacement. If a profile already contains user-authored or conflicting
261
+ content, the installer leaves it untouched and reports that workers cannot use
262
+ it. Run `doctor --agent codex` to
258
263
  inspect the current status. To use the profile in a Codex session you open
259
264
  yourself, run `codex --profile bridge`. Bridge `--auto` controls recipe gates;
260
265
  Codex MCP tool approvals are a separate setting. The profile does not change
@@ -369,7 +374,7 @@ later boot.
369
374
  "mcpServers": {
370
375
  "bridge": {
371
376
  "command": "npx",
372
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.65", "serve"],
377
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"],
373
378
  "env": {
374
379
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
375
380
  "BAPI_REPO_NAME": "your-repo",
@@ -391,7 +396,7 @@ later boot.
391
396
  "bridge": {
392
397
  "type": "stdio",
393
398
  "command": "npx",
394
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.65", "serve"],
399
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"],
395
400
  "env": {
396
401
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
397
402
  "BAPI_REPO_NAME": "your-repo",
@@ -413,7 +418,7 @@ later boot.
413
418
  "bridge": {
414
419
  "type": "stdio",
415
420
  "command": "npx",
416
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.65", "serve"],
421
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"],
417
422
  "env": {
418
423
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
419
424
  "BAPI_REPO_NAME": "your-repo",
@@ -436,7 +441,7 @@ Windsurf only supports global MCP configuration.
436
441
  "mcpServers": {
437
442
  "bridge": {
438
443
  "command": "npx",
439
- "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.65", "serve"],
444
+ "args": ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"],
440
445
  "env": {
441
446
  "BAPI_BASE_URL": "https://bridgegpt-api.com",
442
447
  "BAPI_REPO_NAME": "your-repo",
@@ -455,7 +460,7 @@ Windsurf only supports global MCP configuration.
455
460
  ```toml
456
461
  [mcp_servers.bridge]
457
462
  command = "npx"
458
- args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.65", "serve"]
463
+ args = ["-y", "--prefer-offline", "@bridge_gpt/mcp-server@0.2.67", "serve"]
459
464
 
460
465
  [mcp_servers.bridge.env]
461
466
  BAPI_BASE_URL = "https://bridgegpt-api.com"
@@ -580,7 +585,7 @@ The tools worth knowing for most tickets.
580
585
  - **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.
581
586
  - **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.
582
587
  - **How to use it:** `/define-tickets <task>` — *"Define the tickets we'd need to add a Mistral LLM provider."*
583
- - **Flags:** None.
588
+ - **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`.
584
589
 
585
590
  **5. AI Council**
586
591
  - **What it does:** Fans your problem out to two different models and returns their approaches, in technical, design, discovery, or general mode.
@@ -634,6 +639,12 @@ Good to know, but not needed every day.
634
639
  - **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.
635
640
  - **Flags:** None.
636
641
 
642
+ **7. Drive Epic Run**
643
+ - **What it does:** Launches an Epic Implementer run through `drive-epic` after a preview and an explicit yes — or attaches to the epic's live run — then drives it to a terminal state, applying one sanctioned recovery verb at a time and keeping a written tally.
644
+ - **When it's useful:** (Implementation | Automation) When an epic has an approved plan and you want its child tickets built and merged into the epic branch with one session watching the run.
645
+ - **How to use it:** `/drive-epic-run <EPIC> [<plan path>]` — e.g. `/drive-epic-run BAPI-1145`; the plan is found automatically when the path is omitted.
646
+ - **Flags:** None — the epic key and an optional plan path are the only arguments.
647
+
637
648
  ### Now and then
638
649
 
639
650
  Useful once in a while.
@@ -734,10 +745,10 @@ Slash commands that drive several tools at once. Start Tickets, Review and Start
734
745
  - **Flags:** None — name a specific standards file in your request to have it applied when drafting.
735
746
 
736
747
  **3. Idea to Ticket**
737
- - **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.
738
- - **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.
748
+ - **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`.
749
+ - **When it's useful:** (Refinement | Automation) Only while you migrate; use `/define-tickets` for new work.
739
750
  - **How to use it:** `/idea-to-ticket <idea>`
740
- - **Flags:** None.
751
+ - **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`.
741
752
 
742
753
  **4. Plan Epic**
743
754
  - **What it does:** Decomposes a large epic into sub-tasks with a structured exploration doc for each.
@@ -747,7 +758,8 @@ Slash commands that drive several tools at once. Start Tickets, Review and Start
747
758
 
748
759
  #### Ticket-authoring posture
749
760
 
750
- `/define-tickets`, `/idea-to-ticket`, and `/plan-epic` all decide ticket shape
761
+ `/define-tickets` is the single ticket-creation entry point. It, the deprecated
762
+ `/idea-to-ticket` alias, and `/plan-epic` all decide ticket shape
751
763
  the same way, as does the `jira-ticket-writer` agent they draft through. A fresh install inherits this with no configuration
752
764
  step and no server call; the full rationale and the closed exception list ship as
753
765
  `docs/bridge-ticket-authoring.md`.
@@ -770,7 +782,7 @@ step and no server call; the full rationale and the closed exception list ship a
770
782
  then fans out one writer invocation per entry against that frozen manifest. A
771
783
  rendering invocation never re-splits, merges, reorders, or rescopes.
772
784
  - **Handed off once.** An epic handoff names exactly one entry point,
773
- [`drive-epic`](#drive-epic) — never a choice between conductors.
785
+ [`drive-epic`](#drive-epic) — never a choice between two ways to run it.
774
786
 
775
787
  **5. Run Tests**
776
788
  - **What it does:** Runs the unit and E2E suites and autonomously triages/fixes failures (via the test-correction agent).
@@ -879,13 +891,13 @@ Accepted key spellings: `hostname`/`host`, `client-id`/`clientId`/`client_id`, `
879
891
 
880
892
  Credentials resolve in **three tiers, highest first** — the environment wins over `dw.json`, not the other way round:
881
893
 
882
- 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.
894
+ 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`).
883
895
  2. `SFCC_HOSTNAME` **and** `SFCC_CLIENT_ID` **and** `SFCC_CLIENT_SECRET`, all three set.
884
896
  3. `dw.json`.
885
897
 
886
898
  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.
887
899
 
888
- **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.
900
+ **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.
889
901
 
890
902
  **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**:
891
903
 
@@ -893,16 +905,16 @@ Because tier 2 outranks tier 3, a stale `SFCC_HOSTNAME` left in the environment
893
905
  "env": { "BRIDGE_MCP_PROFILE": "sfcc" }
894
906
  ```
895
907
 
896
- `sfcc` gives the eight read tools plus `sfcc_log_query`. For the nine destructive write tools as well, use `"sfcc,sfcc-write"`; `full` expands to every group and is therefore write-capable. Without any of these, only the diagnostic tools are registered.
908
+ `sfcc` gives the two diagnostics, the eight read tools, and `sfcc_log_query`. For the nine destructive write tools as well, use `"sfcc,sfcc-write"`; `full` expands to every group and is therefore write-capable. Without any of these, no SFCC tool is registered — not even the diagnostics.
897
909
 
898
910
  **4. Verify and grant OCAPI access.** With `sfcc` selected in step 3 (both diagnostics live in that profile), ask your agent to run `sfcc_setup_status` (expect all checks ✓), then `check_permissions`. If it reports HTTP 401/403, it prints the exact OCAPI Settings JSON to paste in Business Manager (**Administration → Site Development → Open Commerce API Settings → Data API** tab); save it there and re-run. Restart the MCP client after any credential or env change — a running session does not pick them up.
899
911
 
900
912
  Read what it prints before pasting it. The output is **two labelled blocks**, and they are not equivalent:
901
913
 
902
914
  - **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".
903
- - **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`.
915
+ - **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.
904
916
 
905
- 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.
917
+ 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.
906
918
 
907
919
  </details>
908
920
 
@@ -978,7 +990,7 @@ Attribute-definition reads and writes can return an attribute's `default_value`
978
990
 
979
991
  **Diagnostics** (registered by the `sfcc` profile)
980
992
  - `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`.
981
- - `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.
993
+ - `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.
982
994
 
983
995
  **System object model — reads** (needs the `sfcc` profile)
984
996
  - `system_object_list` — list system object types (Product, Order, Customer, …).
@@ -1003,7 +1015,7 @@ Attribute-definition reads and writes can return an attribute's `default_value`
1003
1015
  - `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.
1004
1016
  - `site_preference_get` — list the preference **identifiers** in a group.
1005
1017
  - `site_preference_search` — search/filter preference identifiers within a group.
1006
- - `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.
1018
+ - `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.
1007
1019
 
1008
1020
  > **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.
1009
1021
 
@@ -1015,6 +1027,76 @@ Attribute-definition reads and writes can return an attribute's `default_value`
1015
1027
  - **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.
1016
1028
  - **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.
1017
1029
 
1030
+ ## Epic Implementer
1031
+
1032
+ The Epic Implementer drives a whole epic, several related tickets, from an
1033
+ approved plan to merged pull requests. It hands each child ticket to an agent on
1034
+ your machine, waits for CI and code review, and merges each child PR into an
1035
+ `epic/<KEY>` branch. A person merges the final pull request into your default
1036
+ branch.
1037
+
1038
+ By default a run with two or more tickets is **unattended**: it merges child
1039
+ PRs on its own. `--attended` opts out.
1040
+
1041
+ **What it requires**
1042
+
1043
+ - macOS or Linux, with `git`, the GitHub CLI (`gh`, logged in), the Claude Code
1044
+ CLI (`claude`, logged in), and Worktrunk (`wt`) on your `PATH`.
1045
+ - Bridge installed in the repository, and the Bridge GitHub App connected.
1046
+ - The repository's Epic Implementer defaults, including the CI check each
1047
+ ticket must pass (`install conductor`). For unattended runs, that check must
1048
+ be a job in one of the two workflow files below, for example
1049
+ `epic-implementer-ci / gate`.
1050
+ - `.github/workflows/claude-review.yml` and
1051
+ `.github/workflows/epic-implementer-ci.yml` on your default branch, then the
1052
+ repository indexed (or re-indexed) after they merge. The epic branch is cut
1053
+ from the indexed commit.
1054
+ - For unattended runs: an escalation channel (the account email, or a webhook)
1055
+ and a merge credential in `BAPI_LOCAL_MERGE_TOKEN`.
1056
+
1057
+ **How to set it up**
1058
+
1059
+ The easy way is to ask your agent:
1060
+
1061
+ > Set up the Epic Implementer by following `docs/install/epic-implementer-install.md`.
1062
+
1063
+ `install` copies that guide into your project. It is also in this package as
1064
+ [EPIC-IMPLEMENTER-INSTALL.md](./docs/EPIC-IMPLEMENTER-INSTALL.md). It checks
1065
+ each step, asks before anything that writes, and tells you which commands you
1066
+ must run yourself.
1067
+
1068
+ By hand, the outline is:
1069
+
1070
+ ```bash
1071
+ npx -y @bridge_gpt/mcp-server install # if Bridge is not installed yet
1072
+ npx -y @bridge_gpt/mcp-server connect-github --repo <repo_name> # connect the GitHub App
1073
+ npx -y @bridge_gpt/mcp-server install conductor --required-check "epic-implementer-ci / gate" \
1074
+ --allowed-bot "<bot>" --secret-name <SECRET_NAME> --branches "<default branch>,epic/**"
1075
+ export BAPI_LOCAL_MERGE_TOKEN="$(gh auth token)" # in the shell that runs drive-epic
1076
+ npx -y @bridge_gpt/mcp-server epic-implementer readiness --json # read-only check of every prerequisite
1077
+ ```
1078
+
1079
+ After `install conductor`, restart your MCP client so the Epic Implementer tools
1080
+ appear. Add `epic-implementer-ci.yml` (the guide has a template) and the
1081
+ `claude-review.yml` that `install conductor` wrote, through a pull request into
1082
+ your default branch. Once it merges, index the repository with
1083
+ `/parse-repository`.
1084
+
1085
+ **How to run an epic**
1086
+
1087
+ 1. `/plan-epic <EPIC>` splits an existing epic ticket into child tickets and
1088
+ writes a plan (`epic-plan.dag.json`). Its last step creates and approves an
1089
+ unattended run.
1090
+ 2. `/drive-epic-run <EPIC> [<plan path>]` previews, asks you once, starts the
1091
+ run, and watches it to the end. It takes no flags. For `--attended` or
1092
+ `--policy-file <path>`, use the shell instead:
1093
+ `npx -y @bridge_gpt/mcp-server drive-epic <EPIC> --plan-file <path> [--attended]`.
1094
+ 3. Monitor with the `get_epic_snapshot` and `explain_run` MCP tools, or
1095
+ `npx -y @bridge_gpt/mcp-server notifications --repo <repo_name> --run <EPIC> --follow`.
1096
+
1097
+ See [The Epic Implementer](#the-epic-implementer) for every command, and
1098
+ [EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md) for the full reference.
1099
+
1018
1100
  ## CLI Subcommands
1019
1101
 
1020
1102
  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.
@@ -1040,7 +1122,7 @@ npx -y @bridge_gpt/mcp-server start-tickets [flags] KEY [KEY ...]
1040
1122
  | `--base-branch <BRANCH>` | `main` | Cut new worktrees from `<BRANCH>` and refresh `origin/<BRANCH>` instead of `main` |
1041
1123
  | `--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. |
1042
1124
  | `--max-parallel N` | `3` | Max worktrees created concurrently |
1043
- | `--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>'`. |
1125
+ | `--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>'`. |
1044
1126
  | `-h`, `--help` | — | Show usage |
1045
1127
 
1046
1128
  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:
@@ -1059,7 +1141,7 @@ For Codex, `GET /jira/codex-model-catalog?repo_name=...` is the sole tier-to-mod
1059
1141
 
1060
1142
  **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.
1061
1143
 
1062
- **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.
1144
+ **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.
1063
1145
 
1064
1146
  **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.
1065
1147
 
@@ -1083,7 +1165,7 @@ The report also includes a **Claude login** advisory: whether the host's own
1083
1165
  `~/.claude.json` carries a login marker. This is informational only — it never
1084
1166
  blocks the doctor run and cannot guarantee the next worker spawn will
1085
1167
  authenticate. See
1086
- [Claude login for conductor workers](#claude-login-for-conductor-workers).
1168
+ [Claude login for Epic Implementer workers](#claude-login-for-epic-implementer-workers).
1087
1169
 
1088
1170
  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.
1089
1171
 
@@ -1103,30 +1185,104 @@ worker against a stale base prints the same advisory and **still spawns the
1103
1185
  worker**. Remedy and full diagnosis:
1104
1186
  `docs/claude/runbooks/claude-review-base-branch-drift.md`.
1105
1187
 
1188
+ ### The Epic Implementer
1189
+
1190
+ The Epic Implementer drives a whole epic — several related tickets — from an
1191
+ approved plan to merged pull requests, with little help from you. It was called
1192
+ the "conductor" before BAPI-1077..1083 renamed it. A few command, flag, and path
1193
+ names still say `conductor`; each is noted where it appears.
1194
+
1195
+ It has two parts:
1196
+
1197
+ - **The v2 engine.** A reconciler on the Bridge API server decides every step. An
1198
+ executor on your machine runs the jobs it hands out, one agent session per child
1199
+ ticket. This is what drives an epic.
1200
+ - **Observability** (`start-tickets --conductor`). An opt-in local event ledger,
1201
+ supervisor tab, and git hooks. It is off by default, and driving an epic does not
1202
+ need it.
1203
+
1204
+ The path from an epic to a finished run:
1205
+
1206
+ 1. **Plan.** `/plan-epic` splits the epic into child tickets and a plan DAG
1207
+ (`epic-plan.dag.json`). `emit-epic-implementer-bundle finalize` writes the DAG
1208
+ and the meta file that `drive-epic` uses to find it.
1209
+ 2. **Set up the repository, once.**
1210
+ `npx -y @bridge_gpt/mcp-server install conductor --required-check <check>`
1211
+ (also spelled `install-bridge conductor`; the name predates the rename). It runs
1212
+ a read-only doctor and writes the done gate from your required CI check(s). It
1213
+ can also scaffold the `claude-review` workflow, write an executor service unit,
1214
+ and save a launch profile. With its own consent, it adds `epic_implementer` to
1215
+ `BRIDGE_MCP_PROFILE` in your host MCP configs. Run `install conductor --help`
1216
+ for every option.
1217
+ 3. **Launch and drive.** In Claude Code, `/drive-epic-run <EPIC> [<plan path>]`
1218
+ previews the launch, asks you once, creates the run through `drive-epic`, and
1219
+ then watches and recovers it. From a shell, [`drive-epic <EPIC>`](#drive-epic)
1220
+ creates the run and starts its executor.
1221
+ 4. **Monitor.** The MCP tools `get_epic_snapshot` and `explain_run` (they need the
1222
+ `epic_implementer` profile; see [Environment Variables](#environment-variables)),
1223
+ `notifications <EPIC|run-id> [--follow]`, `epic-implementer epic-status`, and
1224
+ `executor watch <job>`.
1225
+ 5. **Recover.** `epic-implementer unpark`, `adopt-current-head-and-unpark`,
1226
+ `continue-child`, `resume-run`, `stop-run`, and `abandon-run` (terminal and
1227
+ irreversible). Run `npx -y @bridge_gpt/mcp-server epic-implementer --help` for
1228
+ the full list.
1229
+
1230
+ `epic-implementer readiness` is a read-only report of every prerequisite, the
1231
+ unattended ones included, each with its state and one named fix. The full
1232
+ reference — architecture, the CI gate, supervisor config, observability, and git
1233
+ hooks — is in [EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md).
1234
+
1235
+ **Old variable names stop every command (BAPI-1190).** Every `BAPI_CONDUCTOR_*`
1236
+ variable was renamed to `BAPI_EPIC_IMPLEMENTER_*`, and the few old `CONDUCTOR_*`
1237
+ names without the `BAPI_` prefix (the node path, for one) now start with
1238
+ `EPIC_IMPLEMENTER_`. There are no aliases. If any old name is set, every
1239
+ entry point — the MCP server included — prints the old names and exits `1`.
1240
+ Rename or unset them.
1241
+
1106
1242
  ### `drive-epic`
1107
1243
 
1108
- The one conductor entry point every Bridge surface names. Give it an epic key and
1109
- it reads conductor readiness for your repository and routes to the single path
1110
- your project can actually run:
1244
+ The one Epic Implementer entry point every Bridge surface names. Give it an epic
1245
+ key and it reads Epic Implementer readiness for your repository and routes to the
1246
+ single path your project can actually run:
1111
1247
 
1112
1248
  ```
1113
1249
  npx -y @bridge_gpt/mcp-server drive-epic <EPIC>
1114
1250
  ```
1115
1251
 
1116
- You are never asked to choose. `drive-epic` routes to exactly one conductor, the
1252
+ You are never asked to choose. `drive-epic` routes to exactly one engine, the
1117
1253
  v2 engine — one transition authority per epic is what keeps an epic from wedging.
1118
1254
  Readiness green routes to the v2 bootstrap below (pass `--plan-file`
1119
1255
  and `drive-epic` runs it for you); readiness not green reports that the v2 engine
1120
- is not ready to drive this epic — there is no alternative conductor to fall back
1121
- to — and prints no conductor invocation. If readiness is **unknown** — unreachable,
1122
- unauthorized, or malformed — it escalates and prints no conductor invocation at
1256
+ is not ready to drive this epic — there is no alternative engine to fall back
1257
+ to — and prints no run command. If readiness is **unknown** — unreachable,
1258
+ unauthorized, or malformed — it escalates and prints no run command at
1123
1259
  all, because an unknown owner is not the same as a not-ready one. No branch,
1124
1260
  including every error path, ever offers you two paths.
1125
1261
 
1126
1262
  `drive-epic` owns no branch behavior of its own — it forwards `--feature-branch
1127
1263
  <name>`, `--into-base`, and `--attended` verbatim to `setup-epic`, which decides
1128
1264
  the strategy and the posture (see below). With none of them, a multi-ticket epic
1129
- runs on `epic/<KEY>`, unattended.
1265
+ runs on `epic/<KEY>`, unattended. It also forwards `--repo` and the policy flags:
1266
+ `--policy-file <path>` (the complete run policy), `--review-policy <src>` (a
1267
+ per-run review policy), and `--replace-policy` (allow replacing a live run's
1268
+ stored policy).
1269
+
1270
+ **Every run gets an executor (BAPI-1279).** Once `drive-epic` creates a run, it
1271
+ starts an executor scoped to that run in the background, from this checkout's Git
1272
+ top level. The executor claims only that run's jobs, logs to
1273
+ `.bridge/executors/<run>.log`, and exits on its own when the run is done or
1274
+ abandoned. You do not start one by hand. Run `drive-epic` from a Git work tree
1275
+ inside the target repository — it checks this before creating anything. If the
1276
+ executor fails to start, the run is left intact and `drive-epic` prints the log
1277
+ path and the exact command to start it by hand.
1278
+
1279
+ **Choosing the server.** With no flags, `drive-epic` targets production and uses
1280
+ the stored `bapi:<repo>` key when there is one. `--base-url <url>` (or
1281
+ `BAPI_BASE_URL`) names another server. `--launch-profile <name>` (or
1282
+ `BAPI_EPIC_LAUNCH_PROFILE`) selects a host-local profile saved by
1283
+ `install conductor --launch-profile <name>`; use one for a local server or a
1284
+ durable host. With a profile, `--base-url` must agree with it. A stored key
1285
+ approved for a different endpoint is never sent.
1130
1286
 
1131
1287
  **Finding the plan from the epic key (BAPI-1285).** `--plan-file` is optional.
1132
1288
  Without it, `drive-epic` searches `{docs_dir}/epic-plans/*/epic-plan.meta.json` for a
@@ -1162,8 +1318,26 @@ requests a lane, or starts or signals an executor. With `--json` (valid only wit
1162
1318
  `--dry-run`) stdout carries exactly one JSON document with `epic_key`, `target`,
1163
1319
  `readiness`, `live_run`, `plan`, `summary`, `decision`, and `refusal`. The
1164
1320
  readiness `reason_id` and `remedy` are the strings the real refusal prints. The
1165
- webhook URL, credentials, and policy contents are never included. The preview does
1166
- not probe ports, so a local plane that is not listening reads as unknown readiness.
1321
+ webhook URL, credentials, and policy contents are never included. The preview
1322
+ probes a local plane only when the target is a loopback plane, readiness failed on
1323
+ the network, and a plan is available. A refused port plus passing local preflight
1324
+ yields a conditional
1325
+ `create` with optional `cold_start` (`plane_endpoint`, `will_start_plane: true`,
1326
+ `live_run_checked: false`), `live_run: null`, and partial offline setup validation.
1327
+ The real launch attempts guarded startup, then rechecks run existence and server
1328
+ validation; the preview does not guarantee creation. Remote targets, non-refused
1329
+ port probes, and ordinary production previews keep their existing refusal or
1330
+ create behavior. `target.source` is optional and appears only for selected
1331
+ profiles (`profile` or `profile-env`).
1332
+
1333
+ #### Running the server yourself (Bridge API source checkout only)
1334
+
1335
+ The rest of this section, and [`plane up`](#plane-up--claim-scope-is-required)
1336
+ below, apply only when you run the Bridge API server on your own machine. That
1337
+ needs a Bridge API **source checkout**: `plane up` must run from its repository
1338
+ root (the directory holding `main.py`, `worker.py`, and `alembic.ini`), and its
1339
+ executor lanes run from that checkout's `mcp_server/build/index.js`, never from
1340
+ npx. If you target production, skip this part.
1167
1341
 
1168
1342
  **The composed bring-up is two-phase (BAPI-1102).** With `--plan-file` on a
1169
1343
  repository whose readiness is missing only the runtime facts, one invocation runs,
@@ -1174,24 +1348,23 @@ observer** last, then the ready banner. The order is forced: an executor lane mu
1174
1348
  carry an explicit claim scope, and the run it is scoped to does not exist until the
1175
1349
  server is up and `setup-epic` has run.
1176
1350
 
1177
- A composed plane serves **exactly one** run; start a second plane for a second
1178
- epic. If `setup-epic` fails, the control plane is left running and **no executor
1179
- lane is spawned**. If the lanes fail to become ready, the control plane and the
1180
- committed run are both left intact and the observer is not started — nothing is
1181
- rolled back, because a local process that failed to start says nothing about
1182
- whether the run is valid.
1351
+ A plane's executor lanes serve **exactly one** run — the run it is bound to. A
1352
+ second epic does **not** start a second plane: it attaches to the running plane's
1353
+ reconciler and gets its own run-scoped executor. Two planes on one database are
1354
+ not supported. If `setup-epic` fails, the control plane is left running and **no
1355
+ executor lane is spawned**. If the lanes fail to become ready, the control plane
1356
+ and the committed run are both left intact and the observer is not started —
1357
+ nothing is rolled back, because a local process that failed to start says nothing
1358
+ about whether the run is valid.
1183
1359
 
1184
1360
  "Plane ready" reports **processes**, not dispatchability: if the run cuts an epic
1185
1361
  branch, the reconciler holds ticket dispatch until that branch's index scope
1186
1362
  finishes preparing.
1187
1363
 
1188
- Two conductors is a transitional state. When one is eliminated, `drive-epic` is
1189
- the only thing that changes.
1190
-
1191
1364
  ### `plane up` — claim scope is required
1192
1365
 
1193
- `plane up` starts the runtime on its own, and every executor lane it starts needs
1194
- an explicit claim scope:
1366
+ `plane up` starts the runtime on its own, from a Bridge API source checkout, and
1367
+ every executor lane it starts needs an explicit claim scope:
1195
1368
 
1196
1369
  ```
1197
1370
  npx -y @bridge_gpt/mcp-server plane up --epic-run-id <run-id> # repeatable
@@ -1211,13 +1384,13 @@ then signals the recorded process group.
1211
1384
 
1212
1385
  ### `setup-epic`
1213
1386
 
1214
- Bootstraps an Epic Conductor v2 run in one command — creates the epic run, stores the plan DAG, and approves it:
1387
+ 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:
1215
1388
 
1216
1389
  ```
1217
1390
  npx -y @bridge_gpt/mcp-server setup-epic --epic-key <KEY> --plan-file <path-to-epic-plan.dag.json>
1218
1391
  ```
1219
1392
 
1220
- 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.
1393
+ 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`.
1221
1394
 
1222
1395
  **The command above uses an epic branch.** For a plan with **two or more** nodes and
1223
1396
  no branch flag, `setup-epic` derives `epic/<KEY>`: every child-ticket PR targets that
@@ -1249,49 +1422,61 @@ default, or, when it declares none, as an explicit recorded `no_ci_gate` mode.
1249
1422
  An unattended run has two **repository** prerequisites — consent
1250
1423
  (`unattended_epic_implementer_allowed`, ON by default; the repository owner can switch
1251
1424
  "Allow unattended Epic Implementer runs" off and on in the Bridge admin panel's Setup
1252
- page) and a verified notify webhook default — plus
1425
+ page) and an **escalation channel** (BAPI-1274): a verified notify webhook, or,
1426
+ when the policy declares no webhook, an email address on the account — plus
1253
1427
  confirmed default-branch review/CI workflows. Each is refused by name **before any
1254
1428
  run row is created** (`target_not_allowed`, `webhook_unverified`,
1255
- `repository_readiness_unconfirmed`), and `drive-epic` readiness and `doctor` both
1256
- list them with their current state. `notify.local_sink` does not satisfy the webhook
1257
- prerequisite.
1258
-
1259
- > **Rollout note.** The client-side default and the server-side admission,
1260
- > stamping, and readiness changes must be released as **one compatible unit**. The
1261
- > new default's shape (`v2_auto_merge_enabled: true` with no `required_checks`) is
1262
- > exactly what the create route refused before BAPI-1102, so shipping the client
1263
- > half alone would 422 every unattended run at `POST /jira/epic-runs/runs`.
1264
- > Deploying only the server half is safe and inert: it narrows two refusals and adds
1265
- > a first-approval stamp, and **rewrites no existing run**. No database migration and
1266
- > no new environment variable is introduced — `config_projects.unattended_epic_implementer_allowed`
1267
- > and `epic_supervisor_setup.done_gate_config` already exist and are read as-is.
1268
-
1269
- Once the plan is approved, the **server-side reconciler** picks the run up within ~30s. To execute claimed jobs on your machine, run `executor`:
1429
+ `repository_readiness_unconfirmed`). A missing channel is still refused as
1430
+ `webhook_unverified`. A declared webhook that fails verification never falls back
1431
+ to email, and `notify.local_sink` does not count as a channel.
1432
+ `epic-implementer readiness` and `drive-epic` both list these prerequisites with
1433
+ their current state.
1434
+
1435
+ Once the plan is approved, the **server-side reconciler** picks the run up within
1436
+ ~30s. If you ran `setup-epic` directly, start an executor for the run yourself
1437
+ (`drive-epic` does this for you). An executor needs exactly one claim scope, or it
1438
+ refuses to start:
1270
1439
 
1271
1440
  ```
1272
- npx -y @bridge_gpt/mcp-server executor --repo <name>
1441
+ npx -y @bridge_gpt/mcp-server executor --repo <name> --epic-run-id <run-id> --exit-when-run-terminal
1442
+ npx -y @bridge_gpt/mcp-server executor --repo <name> --repo-wide # every run in the repo
1273
1443
  ```
1274
1444
 
1275
- ### Conductor (epic & multi-agent orchestration)
1445
+ `executor install-service` generates a launchd/systemd user unit so a durable
1446
+ executor survives a reboot. `--base-url` or `BAPI_BASE_URL` is required: the
1447
+ executor has no production fallback.
1448
+
1449
+ ### Epic Implementer reference
1450
+
1451
+ The full reference — the v2 architecture (server-side reconciler + local
1452
+ executor), the CI gate, `epic-implementer install-git-hooks`, the supervisor
1453
+ `done_gate_config` / `auto_merge_enabled` settings, and the opt-in observability
1454
+ stream — lives in **[EPIC-IMPLEMENTER.md](./docs/EPIC-IMPLEMENTER.md)**.
1455
+ Auto-merge into the epic branch is **on by default** for unattended runs (see
1456
+ [`setup-epic`](#setup-epic)); only the `--conductor` observability layer is off by
1457
+ default.
1276
1458
 
1277
- 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.)
1459
+ Two retired names remain as failing pointers. The event-ledger CLI was renamed
1460
+ from `conductor` to `epic-implementer`, and `emit-conductor-bundle` to
1461
+ `emit-epic-implementer-bundle`; the old names now print the new name and exit.
1278
1462
 
1279
1463
  > 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.
1280
1464
 
1281
1465
  <!-- BEGIN GENERATED: merge-workflow-install (managed by mcp_server/scripts/sync-readme-merge-workflow.js — DO NOT EDIT BY HAND) -->
1282
- ### `install-bridge conductor --merge-workflow`
1466
+ ### `install conductor --merge-workflow`
1283
1467
 
1284
1468
  Generates the Epic Implementer **merge workflow** plus its CODEOWNERS fragment
1285
1469
  and repository-rule guidance, commits them on a managed branch, pushes with
1286
1470
  **your own git identity**, and opens a pull request with **your own `gh`**.
1287
1471
 
1288
1472
  ```
1289
- npx -y @bridge_gpt/mcp-server install-bridge conductor --merge-workflow --codeowner <@org/team|@user>
1473
+ npx -y @bridge_gpt/mcp-server install conductor --merge-workflow --codeowner <@org/team|@user>
1290
1474
  ```
1291
1475
 
1292
- `--codeowner` is **required** and takes exactly one `@user` or `@org/team`. It is
1293
- never inferred from repository metadata, and a documentation placeholder is
1294
- rejected. `--dry-run` prints the plan and performs **no** write: no branch, no
1476
+ `--codeowner` is **required** and takes exactly one `@user` or `@org/team`. Bridge
1477
+ cannot infer the code owner, so replace `<@org/team|@user>` with the one `@user` or
1478
+ `@org/team` who should review the workflow file before running; the placeholder
1479
+ itself is rejected. `--dry-run` prints the plan and performs **no** write: no branch, no
1295
1480
  file, no install-state write, no commit, no push, and no pull request.
1296
1481
 
1297
1482
  **Bridge performs no repository write, and the pull request is never merged for
@@ -1456,16 +1641,18 @@ If a custom pipeline has the same key as a built-in pipeline, the custom version
1456
1641
  | `BAPI_BASE_URL` (`executor` subcommand) | **Yes** | _(none)_ | The `executor` deliberately has **no** production fallback — it refuses to start rather than guess a target |
1457
1642
  | `BAPI_REPO_NAME` | Yes | _(none)_ | Jira project/repository identifier configured in Bridge API |
1458
1643
  | `BAPI_API_KEY` | No | _(none)_ | A Bridge credential **is** required; this environment variable is only the first place the server looks for it. When it is unset the server resolves the credential from the user-scoped store (`~/.config/bridge/credentials.json`, target `bapi:<repo>`), which is why generated MCP registrations are secret-free |
1459
- | `BAPI_PROJECT_ROOT` | No | _(see fallback order)_ | Absolute path to project root. Anchors `BAPI_DOCS_DIR` and `BAPI_PIPELINES_DIR` resolution. Resolved once, in order: `BAPI_PROJECT_ROOT` → the connected client's MCP `roots/list` → `CLAUDE_PROJECT_DIR` → `process.cwd()`. Several paths *write* it into a generated registration (`--init`, host-config provisioning, the worktree `mcp-invoke` shim) — that is provenance, not a runtime default |
1644
+ | `BAPI_PROJECT_ROOT` | No | _(see fallback order)_ | Absolute path to project root. Anchors `BAPI_DOCS_DIR` and `BAPI_PIPELINES_DIR` resolution. Resolved once, in order: `BAPI_PROJECT_ROOT` → the connected client's MCP `roots/list` → `CLAUDE_PROJECT_DIR` → `process.cwd()`. The explicit value is validated: it is used only when it exists, is a folder, and contains `.git` (a folder, or a worktree's `.git` file) or `.bridge/config`. Otherwise it is ignored and the next source is used, so a path committed from another machine is harmless. The later sources are not validated. The server logs the chosen root and its source to stderr once (for example `Bridge MCP: project root /home/b/app (from roots/list); BAPI_PROJECT_ROOT /Users/a/app ignored: does not exist`), and `doctor` reports whether each configured value is valid. The check proves the path looks like a project, not that it is *this* project. Several paths *write* it into a generated registration (`--init`, `install`, `upgrade`, host-config provisioning, the worktree `mcp-invoke` shim) — that is provenance, not a runtime default; a git-tracked config keeps its existing value. What each host passes at start: see the per-host table in `docs/claude/cli-install-architecture.md` (§5a) |
1460
1645
  | `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` |
1461
1646
  | `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` |
1462
1647
  | `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 |
1463
- | `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) |
1648
+ | `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) |
1464
1649
  | `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 |
1465
1650
  | `BAPI_SIGNUP_EMAIL` | No | _(none)_ | Selects the self-serve signup route without `--email`. Precedence: `--email` first, then this variable, then the visible interactive prompt |
1466
1651
  | `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 |
1467
- | `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 |
1652
+ | `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 |
1468
1653
  | `BAPI_PLANE_UVICORN` | No | `uvicorn` | Executable used for the server member of `plane up` |
1654
+ | `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 |
1655
+ | `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) |
1469
1656
  | `BAPI_DOCS_DIR` | No | `docs/tmp` | Local directory for saving plans, critiques, and research reports |
1470
1657
  | `BAPI_PIPELINES_DIR` | No | `.bridge/pipelines` | Directory for user-defined custom pipeline JSON files |
1471
1658
  | `BAPI_WORKTRUNK_BIN` | No | `wt` (`git-wt` on Windows) | Override the Worktrunk executable name/path used by `start-tickets` for nonstandard installs |
@@ -1475,7 +1662,7 @@ If a custom pipeline has the same key as a built-in pipeline, the custom version
1475
1662
  | `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 |
1476
1663
  | `BAPI_MCP_UPDATE_CHECK_ENABLED` | No | _(enabled)_ | MCP-local kill switch for the cached update check run at startup. Default-on; set to `false`/`0`/`no`/`off`/`disabled` to skip it entirely — no npm registry request, no update-cache read/write, no stderr advice, and no `tools/list` advisory decoration. Any other value is treated as enabled. Useful behind a firewall/registry-restricted network, and used by the payload-measurement harness so a stale local cache can never perturb a capture |
1477
1664
  | `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 |
1478
- | `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`. |
1665
+ | `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`. |
1479
1666
 
1480
1667
  Environment values are **trimmed**, and only a non-empty result wins. A
1481
1668
  whitespace-only `BAPI_API_KEY` therefore does not override anything: it falls
@@ -1645,9 +1832,9 @@ work. Two supported paths write it for you:
1645
1832
 
1646
1833
  Run it without `--write-credentials` to preview; add the flag to write the store.
1647
1834
 
1648
- ### Claude login for conductor workers
1835
+ ### Claude login for Epic Implementer workers
1649
1836
 
1650
- Conductor workers are **not** isolated into a private Claude configuration
1837
+ Epic Implementer workers are **not** isolated into a private Claude configuration
1651
1838
  directory — they run with the executor host's own `HOME`, so a worker
1652
1839
  authenticates the same way any interactive `claude` invocation on that host
1653
1840
  does. The prerequisite is simple: run
@@ -1730,7 +1917,7 @@ The full surface, for when you need the complete enumeration. Day-to-day, use [U
1730
1917
 
1731
1918
  ### MCP tools
1732
1919
 
1733
- The authoritative tool catalog covers **77 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).
1920
+ 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).
1734
1921
 
1735
1922
  - **Connectivity & identity** — `ping` (its JSON also carries `docs_dir`, `role`, and `customer_type`)
1736
1923
  - **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)
@@ -1742,8 +1929,9 @@ The authoritative tool catalog covers **77 tools** (enumerated below). What's ac
1742
1929
  - **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)
1743
1930
  - **Jira status** — `update_jira_status` (pass `status: "auto"` to resolve the configured post-PR status server-side)
1744
1931
  - **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)
1932
+ - **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"`)
1745
1933
  - **Pipelines & automation** — `get_pipeline_recipe` (returns a fully resolved recipe the agent executes step-by-step)
1746
- - **Config** — `get_project_standards`, `config_field` (operations: `get`, `update`, `list`)
1934
+ - **Config** — `get_project_standards`, `config_field` (operations: `get`, `update`, `list`), `model_thresholds` (actions: `get`, `set`, `clear`; the only way to set personal thresholds)
1747
1935
 
1748
1936
  ### Bundled pipelines
1749
1937
 
@@ -1753,9 +1941,8 @@ Pipelines are declarative, multi-step workflows your AI agent executes step-by-s
1753
1941
  |---|---|---|
1754
1942
  | `implement-ticket` | Generate a plan, execute the implementation, commit, open a PR, and monitor CI | `/implement-ticket PROJ-123` |
1755
1943
  | `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` |
1756
- | `idea-to-ticket` | Turn an idea into a Jira Task/Spike (or Epic + children) with research, dedup, and critique | `/idea-to-ticket "<idea>"` |
1944
+ | `idea-to-ticket` | Deprecated, superseded by `/define-tickets`; still resolvable through `get_pipeline_recipe` for one release, with no new consumers | `/define-tickets "<idea>"` |
1757
1945
  | `plan-epic` | Decompose an epic into sub-tasks with a structured exploration doc for each | `/plan-epic "<epic>"` |
1758
- | `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>"` |
1759
1946
  | `learn-repository` | Analyze codebase architecture, testing, review, and documentation standards, then upload to Bridge | `/learn-repository` |
1760
1947
 
1761
1948
  ### Pipeline response envelope