@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.
- package/README.md +269 -82
- package/build/agent-capabilities/probes.js +15 -5
- package/build/agent-launchers/claude-executor-adapter.js +55 -34
- package/build/agent-launchers/executor-adapter.js +34 -4
- package/build/agents.generated.js +1 -1
- package/build/bounded-wait.js +67 -10
- package/build/bridge-config.js +104 -0
- package/build/codex-bridge-profile.js +10 -1
- package/build/commands.generated.js +12 -12
- package/build/conductor/bridge-api-client.js +372 -10
- package/build/conductor/bring-up-facts.js +1 -1
- package/build/conductor/doctor.js +3 -3
- package/build/conductor/epic-child-continuation.js +61 -34
- package/build/conductor/epic-implementer-cli.js +34 -6
- package/build/conductor/errors.js +4 -3
- package/build/conductor/guided-repair.js +327 -0
- package/build/conductor/hook-runtime-qualification.js +1 -1
- package/build/conductor/merge-execution-contract.js +27 -8
- package/build/conductor/merge-execution-eligibility.js +3 -2
- package/build/conductor/pr-ci-producer.js +1 -1
- package/build/conductor/readiness-cli.js +46 -9
- package/build/conductor/readiness-sections.js +41 -6
- package/build/conductor/readiness.js +204 -30
- package/build/conductor/recovery-cli.js +703 -20
- package/build/conductor/recovery-operations.js +392 -3
- package/build/conductor/repair-contract.js +112 -3
- package/build/conductor/repository-workflow-remedy.js +125 -0
- package/build/conductor/tools.js +2 -2
- package/build/conductor-bundle-artifacts.js +8 -0
- package/build/credential-store.js +5 -4
- package/build/diagnostic-text.js +36 -0
- package/build/docs.generated.js +8 -3
- package/build/doctor.js +70 -10
- package/build/drive-epic-key.js +6 -5
- package/build/drive-epic.js +479 -131
- package/build/epic-coherence-input.js +2 -1
- package/build/epic-implementer-bin.js +30 -26
- package/build/epic-implementer-bundle-cli.js +2 -2
- package/build/epic-launch-diagnostic.js +31 -0
- package/build/epic-launch-profile.js +44 -14
- package/build/executor/cli.js +3 -2
- package/build/executor/completion-contract.js +48 -5
- package/build/executor/completion-supervision.js +9 -0
- package/build/executor/correction-dispatch.js +60 -0
- package/build/executor/env.js +25 -0
- package/build/executor/heartbeat.js +1 -1
- package/build/executor/http-client.js +35 -0
- package/build/executor/integration-job.js +6 -1
- package/build/executor/job-errors.js +38 -4
- package/build/executor/job-log-registry.js +340 -73
- package/build/executor/job-runner.js +485 -74
- package/build/executor/job-types.js +8 -13
- package/build/executor/observation.js +6 -1
- package/build/executor/preflight.js +136 -10
- package/build/executor/prompt-spec.js +113 -9
- package/build/executor/required-work-ledger.js +6 -1
- package/build/executor/resume-pre-spawn.js +2 -0
- package/build/executor/runner.js +31 -2
- package/build/executor/service-unit.js +7 -1
- package/build/executor/stale-artifacts.js +5 -4
- package/build/executor/types.js +1 -0
- package/build/executor/watch-cli.js +35 -8
- package/build/executor/worker-command.js +43 -43
- package/build/executor/worker-finalization.js +161 -43
- package/build/executor/worker-guard-hook.js +152 -12
- package/build/executor/worker-log.js +137 -70
- package/build/executor/worktree-gc.js +30 -6
- package/build/executor/worktree.js +82 -1
- package/build/index.js +482 -660
- package/build/init.js +107 -4
- package/build/install-bridge-conductor.js +8 -6
- package/build/install-bridge.js +287 -23
- package/build/install-doctor.js +172 -30
- package/build/install-reexec.js +69 -7
- package/build/macos-terminal-permission-guidance.js +16 -0
- package/build/model-thresholds-tool.js +185 -0
- package/build/phase-context-git-probe.js +68 -0
- package/build/phase-result-artifacts.js +173 -5
- package/build/pipelines.generated.js +19 -25
- package/build/plane/alembic-head.js +12 -3
- package/build/plane/base-worktree-guard.js +147 -0
- package/build/plane/cli.js +217 -17
- package/build/plane/code-snapshot.js +468 -0
- package/build/plane/defaults.js +48 -3
- package/build/plane/endpoint.js +41 -0
- package/build/plane/manifest.js +120 -1
- package/build/plane/member-roster.js +94 -19
- package/build/plane/preflight.js +30 -2
- package/build/plane/process-cwd.js +67 -0
- package/build/plane/restart.js +542 -0
- package/build/plane/shutdown.js +31 -0
- package/build/plane/status.js +145 -6
- package/build/plane/supervisor.js +588 -177
- package/build/plane/types.js +54 -2
- package/build/plane/worker-exit-code.js +2 -0
- package/build/printed-remedy-commands.js +37 -0
- package/build/project-root.js +99 -0
- package/build/readiness-check.js +1 -1
- package/build/readme.generated.js +1 -1
- package/build/review-generation.js +22 -0
- package/build/review-tickets.js +156 -13
- package/build/setup-epic.js +224 -127
- package/build/sfcc/config.js +9 -0
- package/build/sfcc/credentials.js +100 -38
- package/build/sfcc/hostname.js +67 -0
- package/build/sfcc/permissions.js +17 -13
- package/build/sfcc/register.js +1 -1
- package/build/sfcc/setup-status.js +2 -0
- package/build/sfcc/tool-wrapper.js +41 -43
- package/build/sfcc/tools-configured.js +96 -0
- package/build/sfcc/write-grants.js +17 -11
- package/build/sfcc/write-result.js +4 -3
- package/build/sfcc/writes-site-preference.js +20 -8
- package/build/start-tickets.js +332 -79
- package/build/tool-error-envelope.js +61 -0
- package/build/upgrade-cli.js +109 -24
- package/build/version.generated.js +3 -3
- package/build/visual-diff.js +22 -1
- package/build/windows-npm-entry.js +103 -0
- package/build/worker-guard-hook-bin.js +3 -5
- package/build/worker-guard-hook-main.js +47 -0
- package/build/worktree-core.js +136 -9
- package/docs/EPIC-IMPLEMENTER-INSTALL.md +849 -0
- package/docs/EPIC-IMPLEMENTER.md +662 -0
- package/docs/install/mcp-tool-integrations.md +25 -15
- package/docs/install/sfcc-integration.md +21 -8
- package/package.json +1 -1
- package/pipelines/implement-ticket.json +1 -1
- package/pipelines/plan-epic.json +0 -5
- package/pipelines/review-ticket.json +1 -1
- package/docs/CONDUCTOR.md +0 -605
- package/pipelines/idea-to-pr.json +0 -49
|
@@ -44,7 +44,6 @@ marked **— none**.
|
|
|
44
44
|
| **SFCC WebDAV logs** | WebDAV log credentials (separate from OCAPI) plus the `sfcc_log_monitor_enabled` flag. | `sfcc_webdav_hostname/username/access_key`, `sfcc_log_monitor_enabled` |
|
|
45
45
|
| **Deep-research flag** | The `deep_research_enabled` config flag on the project (403 otherwise). Web research runs via Gemini/OpenAI. | `config_projects.deep_research_enabled` |
|
|
46
46
|
| **Image provider** | An image model provider (OpenAI DALL·E / Google Imagen). | platform provider config |
|
|
47
|
-
| **Conductor ledger** | The local conductor event ledger (`~/.config/bridge/events.db`) — a local file, not a remote service. | local file |
|
|
48
47
|
|
|
49
48
|
## Profiles (a form of BLOCK)
|
|
50
49
|
|
|
@@ -56,13 +55,13 @@ activated. `core` is always implicitly included.
|
|
|
56
55
|
| Profile | Registered when |
|
|
57
56
|
|---|---|
|
|
58
57
|
| `core` | always |
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
58
|
+
| `epic_implementer` | includes `epic_implementer` or `full` — the Epic Implementer run tools. The old token `conductor` is not valid and is dropped |
|
|
59
|
+
| `estimation` | includes `estimation` or `full` — `estimate_epic` |
|
|
60
|
+
| `pipeline-authoring` | includes `pipeline-authoring` or `full` — registers **no** tools since BAPI-909; still accepted so old configs keep working |
|
|
61
|
+
| `sfcc` | includes `sfcc` or `full` — the OCAPI **read** tools, `sfcc_log_query`, and the two SFCC diagnostics |
|
|
62
62
|
| `sfcc-write` | includes `sfcc-write` or `full` — the destructive SFCC **write** tools. Independent of `sfcc`: neither group implies the other (BAPI-817) |
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
`ACTIVE_GROUPS.has("pipeline-authoring")`.
|
|
64
|
+
`get_pipeline_recipe` was never gated by `pipeline-authoring`; it is a `core` tool.
|
|
66
65
|
|
|
67
66
|
> **This document deliberately states no tool counts.** Counts drift on every
|
|
68
67
|
> ticket that adds or moves a tool, and nothing here is generated, so a number
|
|
@@ -85,6 +84,7 @@ These are never gated (`NEVER_GATED_ROUTE_KEYS`) or run entirely locally.
|
|
|
85
84
|
| `get_project_standards` | — none |
|
|
86
85
|
| `invite_member` | — none (mints a scoped key in the Bridge DB; admin-only) |
|
|
87
86
|
| `config_field` (get/update/list) | — none |
|
|
87
|
+
| `model_thresholds` (get/set/clear) | — none (project and member scopes are admin-only) |
|
|
88
88
|
| `get_install_manifest` | — none |
|
|
89
89
|
| `apply_install_manifest` | — none |
|
|
90
90
|
| `persist_routing_credential` | — none (`LOCAL`) |
|
|
@@ -146,7 +146,14 @@ by tier.
|
|
|
146
146
|
|
|
147
147
|
| Tool | Dependencies (class) |
|
|
148
148
|
|---|---|
|
|
149
|
-
| `estimate_epic` | Jira **[BLOCK]** (resolves the repo from `jira_ticket_key`); no code-index dep |
|
|
149
|
+
| `estimate_epic` | Jira **[BLOCK]** (resolves the repo from `jira_ticket_key`); no code-index dep; registered only under the `estimation` profile |
|
|
150
|
+
|
|
151
|
+
**Epic Implementer eligibility:**
|
|
152
|
+
|
|
153
|
+
| Tool | Dependencies (class) |
|
|
154
|
+
|---|---|
|
|
155
|
+
| `assess_epic_implementer_eligibility` | — none (read-only; predicts which epic children change workflow files from their text; needs no VCS or code index; fails open to `status: "unavailable"`) |
|
|
156
|
+
| `assess_epic_conductor_eligibility` | — none (retired name; always returns `tool_removed` / 410 naming `assess_epic_implementer_eligibility`) |
|
|
150
157
|
|
|
151
158
|
### Repository parse / index — VCS
|
|
152
159
|
|
|
@@ -246,21 +253,24 @@ Constraints worth knowing before calling it:
|
|
|
246
253
|
authoritative, so a tool-side pass followed by a server refusal is expected for a
|
|
247
254
|
legacy approved comment that carries no head proof.
|
|
248
255
|
|
|
249
|
-
## `
|
|
256
|
+
## `epic_implementer` profile
|
|
250
257
|
|
|
251
|
-
Profile-gated **[BLOCK]** to register.
|
|
252
|
-
|
|
253
|
-
rather than
|
|
258
|
+
Profile-gated **[BLOCK]** to register. Both tools are read-only and need an Epic
|
|
259
|
+
Implementer run to exist; for an unknown epic or run they return
|
|
260
|
+
`status: "unknown"` rather than an error. The local event ledger
|
|
261
|
+
(`~/.config/bridge/events.db`) is driven by the `epic-implementer` CLI and the git
|
|
262
|
+
hooks, not by MCP tools.
|
|
254
263
|
|
|
255
264
|
| Tool | Dependencies (class) |
|
|
256
265
|
|---|---|
|
|
257
|
-
| `get_epic_snapshot` | Profile-gated **[BLOCK]** · Bridge API epic
|
|
266
|
+
| `get_epic_snapshot` | Profile-gated **[BLOCK]** · Bridge API epic run state (by epic key) |
|
|
267
|
+
| `explain_run` | Profile-gated **[BLOCK]** · Bridge API epic run state (by run id or epic key; `ticket_key` narrows it) |
|
|
258
268
|
|
|
259
269
|
---
|
|
260
270
|
|
|
261
271
|
## `sfcc` group
|
|
262
272
|
|
|
263
|
-
###
|
|
273
|
+
### Diagnostics (gated behind the `sfcc` group since BAPI-912)
|
|
264
274
|
|
|
265
275
|
| Tool | Dependencies (class) |
|
|
266
276
|
|---|---|
|
|
@@ -272,7 +282,7 @@ rather than by MCP tools, so only the epic snapshot remains registered here.
|
|
|
272
282
|
All are profile-gated **[BLOCK]** to register, and all require SFCC OCAPI creds +
|
|
273
283
|
`version` config + a reachable sandbox → SFCC OCAPI **[BLOCK]**.
|
|
274
284
|
|
|
275
|
-
Every SFCC tool — including the two
|
|
285
|
+
Every SFCC tool — including the two diagnostics above — additionally
|
|
276
286
|
crosses the resolved-hostname sandbox boundary at invocation time: if the host
|
|
277
287
|
the credentials resolve to is not a recognized developer sandbox, the call is
|
|
278
288
|
refused with `403 TARGET_NOT_SANDBOX` before any request leaves the machine
|
|
@@ -330,7 +340,7 @@ wanting both selects `sfcc,sfcc-write` (or `full`).
|
|
|
330
340
|
| **SFCC OCAPI** | `check_permissions` + every gated SFCC read and write tool | — |
|
|
331
341
|
| **SFCC WebDAV logs** | `sfcc_log_query` | — |
|
|
332
342
|
| **Deep-research flag** | `request_deep_research`, `get_deep_research` | — |
|
|
333
|
-
| **Profile gating** | all `
|
|
343
|
+
| **Profile gating** | all `epic_implementer`, `estimation`, `sfcc`, and `sfcc-write` tools | — |
|
|
334
344
|
|
|
335
345
|
## Notes & caveats
|
|
336
346
|
|
|
@@ -80,13 +80,20 @@ future work. No `delete` is granted, because no shipped write tool performs one;
|
|
|
80
80
|
{ "resource_id": "/system_object_definitions", "methods": ["get"], "read_attributes": "(**)", "write_attributes": "(**)" },
|
|
81
81
|
{ "resource_id": "/system_object_definitions/**", "methods": ["get", "put", "patch"], "read_attributes": "(**)", "write_attributes": "(**)" },
|
|
82
82
|
{ "resource_id": "/custom_object_definitions/**", "methods": ["get", "put", "patch"], "read_attributes": "(**)", "write_attributes": "(**)" },
|
|
83
|
-
{ "resource_id": "/site_preferences/**",
|
|
83
|
+
{ "resource_id": "/sites/*/site_preferences/**", "methods": ["get", "patch"], "read_attributes": "(**)", "write_attributes": "(**)" }
|
|
84
84
|
]
|
|
85
85
|
}
|
|
86
86
|
```
|
|
87
87
|
|
|
88
88
|
Notes:
|
|
89
89
|
|
|
90
|
+
- Value writes (`site_preference_values_set`) are site-scoped: they need the mutation
|
|
91
|
+
resource `/sites/*/site_preferences/**`. The read/search grant keeps the org-level
|
|
92
|
+
`/site_preferences/**`. **If you pasted an earlier mutation grant, it lacks the
|
|
93
|
+
site-scoped resource.** Replace `<YOUR_CLIENT_ID>` with your client id in the newly
|
|
94
|
+
printed grant (`check_permissions` prints it) and paste it again before running
|
|
95
|
+
value writes.
|
|
96
|
+
- `check_permissions` probes a GET only. It shows read access, not write access.
|
|
90
97
|
- The `client_id` **must match** the Account Manager API client whose credentials you
|
|
91
98
|
put in `dw.json` / `SFCC_*` below. Replace the value above with your own client id if
|
|
92
99
|
it differs.
|
|
@@ -127,29 +134,35 @@ Create a `dw.json` in your project root (auto-added to git exclude — never com
|
|
|
127
134
|
```
|
|
128
135
|
|
|
129
136
|
Accepted key spellings: `hostname`/`host`, `client-id`/`clientId`/`client_id`,
|
|
130
|
-
`client-secret`/`clientSecret`/`client_secret`.
|
|
131
|
-
`configs[]` array
|
|
137
|
+
`client-secret`/`clientSecret`/`client_secret`. A single config is simplest. With a
|
|
138
|
+
multi-entry `configs[]` array, pass one of the listed sandbox hostnames as `instance`
|
|
139
|
+
and that config's credentials are used (an unapproved host is refused before any
|
|
140
|
+
credential lookup); without an `instance` the call fails as `multi-sandbox`. Alternatively, export
|
|
132
141
|
`SFCC_HOSTNAME` / `SFCC_CLIENT_ID` / `SFCC_CLIENT_SECRET` in the MCP server environment.
|
|
133
142
|
|
|
134
143
|
## 3. Set the repo `version` config field
|
|
135
144
|
|
|
136
145
|
Set the repo's `version` config to your SFCC project type — one of
|
|
137
146
|
`sfra | pwakit | sitegenesis | storefrontnext | hybrid`. The call-time gate reads this;
|
|
138
|
-
a non-SFCC value blocks
|
|
147
|
+
a non-SFCC value blocks the OCAPI tools (the eight reads, the nine writes, and
|
|
148
|
+
`check_permissions`). It does not block `sfcc_setup_status` or `sfcc_log_query` — log
|
|
149
|
+
query has its own backend gate. Set it via your
|
|
139
150
|
normal config path, the `config_field` MCP tool (operation `update`, field `version`),
|
|
140
151
|
or the `/teach-bridge` skill.
|
|
141
152
|
|
|
142
153
|
## 4. Enable the SFCC tools
|
|
143
154
|
|
|
144
|
-
|
|
145
|
-
|
|
155
|
+
No SFCC tool is registered by default — a session on the default `core` profile has
|
|
156
|
+
none. Every SFCC tool sits behind **two independent profile groups**:
|
|
146
157
|
|
|
147
158
|
| Group | Registers |
|
|
148
159
|
|---|---|
|
|
149
|
-
| `sfcc` | the 8 OCAPI read tools
|
|
160
|
+
| `sfcc` | the two diagnostics (`sfcc_setup_status`, `check_permissions`), the 8 OCAPI read tools, and `sfcc_log_query` — read-only |
|
|
150
161
|
| `sfcc-write` | the 9 destructive write tools |
|
|
151
162
|
|
|
152
|
-
Neither implies the other.
|
|
163
|
+
Neither implies the other. An `sfcc-write`-only session has no diagnostics, so it
|
|
164
|
+
cannot run `check_permissions` to print the grant JSON; use `sfcc,sfcc-write` when
|
|
165
|
+
you need writes. Add what you need to `BRIDGE_MCP_PROFILE` in the MCP server
|
|
153
166
|
`env` block (it is comma-separated), then **restart the MCP client**:
|
|
154
167
|
|
|
155
168
|
```json
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "implement-ticket",
|
|
3
|
-
"description": "
|
|
3
|
+
"description": "Initial feature workflow: generate a plan, produce artifacts, checkpoint to origin, verify, commit, open a PR, close post-PR gaps, and monitor CI. Re-entry of this initial workflow may reuse a fresh plan, but remaining-work corrections and continuations use versioned focused intent on the retained branch and never re-enter this recipe.",
|
|
4
4
|
"variables": ["ticket_key", "docs_dir", "provider"],
|
|
5
5
|
"steps": [
|
|
6
6
|
{
|
package/pipelines/plan-epic.json
CHANGED
|
@@ -54,11 +54,6 @@
|
|
|
54
54
|
"type": "agent_task",
|
|
55
55
|
"instruction_file": "write-epic-summary.md",
|
|
56
56
|
"description": "Write epic overview and summary document"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"type": "agent_task",
|
|
60
|
-
"instruction_file": "store-and-approve-epic-plan.md",
|
|
61
|
-
"description": "Create epic run, store the plan DAG, and approve it in the backend"
|
|
62
57
|
}
|
|
63
58
|
]
|
|
64
59
|
}
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
{
|
|
31
31
|
"type": "agent_task",
|
|
32
32
|
"id": "wait-for-ticket-review",
|
|
33
|
-
"instruction": "FIRST, check whether a review was actually submitted. The previous step runs with `on_error: warn_and_continue`, so a rejected submission (a 402, 403 or 500 from the generate endpoint, or a dropped connection) lets the pipeline continue into this step. If that step returned an error
|
|
33
|
+
"instruction": "FIRST, check whether a review was actually submitted. The previous step runs with `on_error: warn_and_continue`, so a rejected submission (a 402, 403 or 500 from the generate endpoint, or a dropped connection) lets the pipeline continue into this step. If that step returned an error envelope \u2014 a JSON object with a string `error`, a numeric `status`, and an `operation` field (for example `status: 403` with `error: \"ENTITLEMENT_REQUIRED\"`, or `status: 422` for too little ticket detail) \u2014 rather than its submission confirmation or a `recovery_get` envelope, do NOT wait: nothing is running, and `wait_for_ticket_review` cannot tell \"never submitted\" from \"still running\" \u2014 it would read `pending` in every window until the caller's own timeout. Treat a failed submission as a terminal failure, report the `status`, `error`, and `message` the previous step gave, and take the verdict contract's `revise` path.\n\nOtherwise, wait for the review submitted by the previous step to finish, using repeated BOUNDED windows.\n\nCall `wait_for_ticket_review` with `ticket_number` set to the ticket key. Each call uses the default 20-second window (set `budget_ms: 20000` explicitly if needed); do not use a longer window, because some MCP clients time out before a pending result arrives. The tool returns a JSON body with a `state` field:\n\n- `state: \"pending\"` \u2014 NORMAL and expected. The review is still running. Call the tool again immediately. Do NOT sleep, do NOT poll in a shell loop, and do NOT re-run `request_ticket_review`: re-submitting starts a second billable multi-model review and abandons the one already in flight.\n- `state: \"ready\"` \u2014 the review is over. BAPI-1121: a ready result has ALREADY persisted exactly the accepted documents and reconciled the canonical source files \u2014 it writes every leg in `saved_legs` to its canonical path and removes the stale canonical file for every leg in `withheld_legs`. Do NOT call `get_clarifying_questions` or `get_ticket_critique` after a ready result; those retrieval calls were removed from this recipe because reading them again could reintroduce exactly the stale content the wait just withheld. Treat `saved_legs` as the authoritative source set for the next steps, not file presence.\n - `freshness_basis: \"generation\"` is the normal case: `advanced_legs`/`saved_legs` are current-review evidence, proven newer than the submission. Any leg in `withheld_legs` was delivered but NOT proven current \u2014 surface its `reason` (`generation_not_advanced` or `identity_unreadable`) as a visible warning; do not describe the result as an ordinary cost-saved one-leg review when a withholding occurred. A leg in `absent_legs` with `reason: \"not_delivered\"` is an ordinary policy omission (e.g. an Easy-ticket clarify-only review) unless its status also flags it as policy-expected, in which case call that out too.\n - `freshness_basis: \"terminality_only\"` means no submission baseline was available (e.g. a resumed session) \u2014 `advanced_legs` is empty by construction and `saved_legs` was accepted on terminal delivery alone. Surface this prominently as a DEGRADED-freshness warning: the saved artifact(s) may be indistinguishable from a prior attachment, and the downstream identity-footer agreement check is the remaining backstop. Retain this warning when reporting to the next steps rather than treating a `terminality_only` ready result as equivalent to a `generation`-backed one.\n - If the result instead carries `state: \"error\"` alongside a persistence failure (an `ARTIFACT_PERSISTENCE_FAILED` `error`/`status`/`message` envelope), HALT rather than proceeding with whatever files happen to exist on disk \u2014 report the failure; the accepted legs already on disk before the failure are named in the envelope and are not lost, but nothing new was persisted for this window.\n- `state: \"error\"` \u2014 terminal. Report the `reason` and stop; the review will not complete on its own. `UPSTREAM_TERMINAL` means the review failed or expired server-side \u2014 take the verdict contract's `revise` path; do NOT open another wait window and do NOT re-run `request_ticket_review`. `NO_REVIEW_REQUESTED` means no review was submitted from this session and none is running; `NO_REVIEW_RUNNING` means the submitted review is no longer running on the server \u2014 treat both like `UPSTREAM_TERMINAL`. `INVALID_RESPONSE` means the delivered document could not be read.\n\nKeep looping on `pending` for as long as this session's own budget allows. There is no iteration cap here: the bound is the caller's \u2014 for the conductor's spec-review worker that is the existing 120-minute job timeout, which produces the ordinary liveness outcome if the review never lands. Never fabricate a verdict or a review result from a pending state.",
|
|
34
34
|
"description": "Wait for the submitted review in repeated bounded windows; a ready result has already persisted the accepted documents and reconciled the canonical files (BAPI-1121). Resumable: a pending result is a normal observation, not a failure.",
|
|
35
35
|
"on_error": "halt"
|
|
36
36
|
},
|