@webpresso/plugin-opencode 0.0.15 → 0.0.17

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/bin/wp CHANGED
@@ -17,8 +17,11 @@
17
17
  # when the admitted repository's own .git/worktrees/*/gitdir names it.
18
18
  # 3. else (no checkout ancestor at all) the nearest ancestor
19
19
  # .webpressorc.json: its top-level exact-semver "runtime" pin
20
- # -> ~/.webpresso/runtimes/<pin>/wp (missing = error)
21
- # 4. else the newest stable ~/.webpresso/runtimes/<x.y.z>/wp
20
+ # -> ~/.webpresso/versions/<pin>/bin/wp, else the legacy
21
+ # ~/.webpresso/runtimes/<pin>/wp (missing = error)
22
+ # 4. else the installer's active release ~/.webpresso/current/bin/wp, else
23
+ # the newest stable ~/.webpresso/versions/<x.y.z>/bin/wp, else the legacy
24
+ # newest stable ~/.webpresso/runtimes/<x.y.z>/wp
22
25
  # 5. else a named error, exit 127 — never a different runtime. A pre-shim
23
26
  # ~/.webpresso/bin/wp is never run implicitly (nothing in it proves it is
24
27
  # a release rather than a development build); name it with
@@ -110,7 +113,12 @@ is_exact_semver() {
110
113
  return 0
111
114
  }
112
115
 
113
- runtimes_dir=${HOME:-}/.webpresso/runtimes
116
+ # Release layout literals; src/runtime/runtime-selector-vocab.ts (WP_RELEASE_LAYOUTS)
117
+ # is the authority and bin/wp-shim.subprocess.test.ts asserts both directions.
118
+ webpresso_home=${HOME:-}/.webpresso
119
+ current_release=$webpresso_home/current/bin/wp
120
+ versions_dir=$webpresso_home/versions
121
+ runtimes_dir=$webpresso_home/runtimes
114
122
 
115
123
  # Sets PIN to the top-level "runtime" of $1 (empty when absent). The document
116
124
  # is opened non-blocking, must be a regular file, and is read through a
@@ -146,33 +154,50 @@ read_pin() {
146
154
  return 1
147
155
  }
148
156
 
149
- choose_latest_release() {
150
- best=
157
+ # Sets BEST to the newest stable x.y.z under directory $1 whose release binary
158
+ # is "$1/<version>/$2" (an executable file); empty when there is none.
159
+ scan_releases() {
160
+ BEST=
151
161
  best_major=
152
162
  best_minor=
153
163
  best_patch=
154
- for entry in "$runtimes_dir"/*/; do
164
+ for entry in "$1"/*/; do
155
165
  [ -d "$entry" ] || continue
156
166
  entry=${entry%/}
157
167
  version=${entry##*/}
158
168
  is_exact_semver "$version" stable || continue
159
- [ -f "$entry/wp" ] && [ -x "$entry/wp" ] || continue
169
+ [ -f "$entry/$2" ] && [ -x "$entry/$2" ] || continue
160
170
  major=${version%%.*}
161
171
  rest=${version#*.}
162
172
  minor=${rest%%.*}
163
173
  patch=${rest#*.}
164
- if [ -z "$best" ] ||
174
+ if [ -z "$BEST" ] ||
165
175
  [ "$major" -gt "$best_major" ] ||
166
176
  { [ "$major" -eq "$best_major" ] && [ "$minor" -gt "$best_minor" ]; } ||
167
177
  { [ "$major" -eq "$best_major" ] && [ "$minor" -eq "$best_minor" ] && [ "$patch" -gt "$best_patch" ]; }; then
168
- best=$version
178
+ BEST=$version
169
179
  best_major=$major
170
180
  best_minor=$minor
171
181
  best_patch=$patch
172
182
  fi
173
183
  done
174
- if [ -n "$best" ]; then
175
- choose latest-release "$runtimes_dir/$best/wp"
184
+ }
185
+
186
+ # The installer's active release (the current link) wins, then the newest
187
+ # versions/x.y.z/bin/wp, then the legacy runtimes/x.y.z/wp.
188
+ choose_latest_release() {
189
+ if [ -f "$current_release" ] && [ -x "$current_release" ]; then
190
+ choose current-release "$current_release"
191
+ return 0
192
+ fi
193
+ scan_releases "$versions_dir" bin/wp
194
+ if [ -n "$BEST" ]; then
195
+ choose latest-release "$versions_dir/$BEST/bin/wp"
196
+ return 0
197
+ fi
198
+ scan_releases "$runtimes_dir" wp
199
+ if [ -n "$BEST" ]; then
200
+ choose latest-release "$runtimes_dir/$BEST/wp"
176
201
  return 0
177
202
  fi
178
203
  return 1
@@ -189,14 +214,15 @@ choose_release() {
189
214
  read_pin "$rc_file" || fail pin-invalid "$rc_file $PIN_PROBLEM."
190
215
  if [ -n "$PIN" ]; then
191
216
  is_exact_semver "$PIN" || fail pin-invalid "$rc_file pins runtime \"$PIN\"; use an exact version such as 1.2.3 (no ranges)."
192
- pinned=$runtimes_dir/$PIN/wp
193
- [ -f "$pinned" ] && [ -x "$pinned" ] || fail pin-not-installed "$rc_file pins runtime $PIN, but $pinned is not installed under $runtimes_dir."
217
+ pinned=$versions_dir/$PIN/bin/wp
218
+ [ -f "$pinned" ] && [ -x "$pinned" ] || pinned=$runtimes_dir/$PIN/wp
219
+ [ -f "$pinned" ] && [ -x "$pinned" ] || fail pin-not-installed "$rc_file pins runtime $PIN, but it is installed under neither $versions_dir/$PIN/bin/wp nor $runtimes_dir/$PIN/wp."
194
220
  choose pinned-release "$pinned"
195
221
  return 0
196
222
  fi
197
223
  fi
198
224
  choose_latest_release && return 0
199
- fail no-release-installed "no webpresso source checkout above $PWD and no release under $runtimes_dir; install the Webpresso app, or name a runtime explicitly with WEBPRESSO_WP_BIN (for example a pre-shim \$HOME/.webpresso/bin/wp release) or WP_FORCE_JIT_PATH (a source checkout)."
225
+ fail no-release-installed "no webpresso source checkout above $PWD and no release at $current_release, under $versions_dir or under $runtimes_dir; install the Webpresso app, or name a runtime explicitly with WEBPRESSO_WP_BIN (for example a pre-shim \$HOME/.webpresso/bin/wp release) or WP_FORCE_JIT_PATH (a source checkout)."
200
226
  }
201
227
 
202
228
  : "${WEBPRESSO_WP_BIN:=}"
package/index.js CHANGED
@@ -848,6 +848,47 @@ function sessionIdFrom(source) {
848
848
  const candidate = record.sessionID ?? record.sessionId ?? record.session_id;
849
849
  return typeof candidate === "string" && candidate.length > 0 ? candidate : null;
850
850
  }
851
+ var DELEGATION_POLICY = {
852
+ tool: "subagent",
853
+ option: "delegationAllowedAllocations",
854
+ maxEntries: 128,
855
+ maxLength: 256,
856
+ allocationPattern: /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+#[A-Za-z0-9._-]+$/u,
857
+ };
858
+ function enforceDelegationAllocation(options, input) {
859
+ const allowed = options?.[DELEGATION_POLICY.option];
860
+ if (
861
+ !Array.isArray(allowed) ||
862
+ allowed.length === 0 ||
863
+ allowed.length > DELEGATION_POLICY.maxEntries ||
864
+ !allowed.every(
865
+ (entry) =>
866
+ typeof entry === "string" &&
867
+ entry.length <= DELEGATION_POLICY.maxLength &&
868
+ DELEGATION_POLICY.allocationPattern.test(entry),
869
+ )
870
+ ) {
871
+ throw new Error(
872
+ "WP_DELEGATION_POLICY_INVALID: configure delegationAllowedAllocations with explicit provider/model#variant entries from the live model catalog.",
873
+ );
874
+ }
875
+ const model =
876
+ typeof input === "object" && input !== null && !Array.isArray(input) ? input.model : undefined;
877
+ if (
878
+ typeof model !== "string" ||
879
+ model.length > DELEGATION_POLICY.maxLength ||
880
+ !DELEGATION_POLICY.allocationPattern.test(model)
881
+ ) {
882
+ throw new Error(
883
+ "WP_DELEGATION_ALLOCATION_REQUIRED: supply an explicit provider/model#variant for every subagent call, including continuations.",
884
+ );
885
+ }
886
+ if (!allowed.includes(model)) {
887
+ throw new Error(
888
+ "WP_DELEGATION_ALLOCATION_DENIED: the requested model and variant are not in delegationAllowedAllocations.",
889
+ );
890
+ }
891
+ }
851
892
  var pinnedContextMatches = (ctx) => ctx;
852
893
  function applyModelCeilings(editor) {
853
894
  for (const { providerID, id, limit } of editor.list()) {
@@ -1162,6 +1203,10 @@ function createWebpressoOpenCodePlugin(deps = {}) {
1162
1203
  registrations.push(
1163
1204
  await host.tool.hook(OPENCODE_V2_DOMAIN_HOOKS.toolBefore, async (event) => {
1164
1205
  event.tool = canonicalToolName(event.tool);
1206
+ if (event.tool === DELEGATION_POLICY.tool) {
1207
+ enforceDelegationAllocation(host.options, event.input);
1208
+ return;
1209
+ }
1165
1210
  const sessionID = sessionIdFrom(event);
1166
1211
  const sessionDirectory = await resolveSessionDirectory(sessionID);
1167
1212
  const payload = hookInputForTool(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webpresso/plugin-opencode",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "private": false,
5
5
  "description": "OpenCode V2 plugin adapter package for the Webpresso app (wp CLI; pinned 2.0.32 setup/domain-hook contract).",
6
6
  "homepage": "https://github.com/webpresso/app#readme",
@@ -2,14 +2,17 @@
2
2
  "schemaVersion": 1,
3
3
  "host": "opencode",
4
4
  "packageName": "@webpresso/plugin-opencode",
5
- "packageVersion": "0.0.15",
5
+ "packageVersion": "0.0.17",
6
6
  "runtimeDirs": [],
7
7
  "skills": {
8
8
  "ai-deslop": {
9
9
  "digest": "sha256:cf07df5835037f10401400e220c1c923f5325a6149d59c231ce316e10595fdfc"
10
10
  },
11
+ "antigravity": {
12
+ "digest": "sha256:729c4dd74e5c6394c31de23d04f664140088ee58ddfc57f3a2751394945a938b"
13
+ },
11
14
  "autopilot": {
12
- "digest": "sha256:6a72b2db563a48742c501f20d509050f193a5d31f2d413f6bef838f277d470c1"
15
+ "digest": "sha256:8355f6ddc6e53e68ada49248bdd8d8beb0069ed09d3f2d346debc2401270445c"
13
16
  },
14
17
  "autoresearch": {
15
18
  "digest": "sha256:b4d51cd53beb4a3271827172dfbd0b1d27bd58761ca07a35d49a5d6324b87fdf"
@@ -21,19 +24,19 @@
21
24
  "digest": "sha256:21fd24862e7f7c8a1feadea6bc376492b136b99fc381cf1b8927c9db80615431"
22
25
  },
23
26
  "claude": {
24
- "digest": "sha256:0205d693121b740b76041f1e25925a70d665774f7493070cdd6df40d0058ffe6"
27
+ "digest": "sha256:63b7afb2b65f65fb142e5ef142f80516be00c54d449c5fa7d7897bcaa6cae657"
25
28
  },
26
29
  "codex": {
27
- "digest": "sha256:88837502404449b641b71dbc4f018c75dab6294ad98af29d41de50e98649ff0e"
30
+ "digest": "sha256:574669e040141e9986e362e9f46e3176aa47eccfda0f4589205d9d6d65e57b8d"
28
31
  },
29
32
  "deep-interview": {
30
- "digest": "sha256:79fbf86a86024a311583a1500bb6960c82ad1383cc9f8ed3f04bbace41848ff7"
33
+ "digest": "sha256:6feeaa35de63a0e1f39dbe2882ca91a72928a058f138d4d79e70d81d09209693"
31
34
  },
32
35
  "deep-research": {
33
36
  "digest": "sha256:ece766cb18869317d7c8992fc562920b03250ff8c44bdcb9eccdc3b21922a83f"
34
37
  },
35
38
  "delivery-program": {
36
- "digest": "sha256:ebd6b35036c12fa26ff98649ac57ede607b7b3526c401784670a5ce68369a691"
39
+ "digest": "sha256:a2222cc04fb5366026b951273e4e5d5d8c296d426d51706da8a6b56761a4567f"
37
40
  },
38
41
  "design-review": {
39
42
  "digest": "sha256:5b213735e2842568774572f36b198bccf03c03a54b2732484aadd023f04acb23"
@@ -42,22 +45,22 @@
42
45
  "digest": "sha256:306355888da0827e3523022077f731845726bbaaf595ca12515cc91d8605b5e6"
43
46
  },
44
47
  "fix": {
45
- "digest": "sha256:4804c546291316439aad3ea05fb7d3f043bc191abd8b9c180eb1d349f19f64cf"
48
+ "digest": "sha256:aa5caa229f0a56290bd6ad4487f41fd2933ac9e9cf4fdf2191f04a559bf66943"
46
49
  },
47
50
  "handoff": {
48
- "digest": "sha256:eda4410dc75019b40b1ffae5f301bfc1e57d9313241d170e4743d379a1b6d846"
51
+ "digest": "sha256:5d40899f54fabe3f6ec8f99b417345a433850585086570872a137a1d0d837002"
49
52
  },
50
53
  "hooks-doctor": {
51
- "digest": "sha256:9d9147e842246955f284854c35cf57237d4d056dca23f4c66019e1b44bb09eb6"
54
+ "digest": "sha256:6169e2b4b3638b9b5430811cd44e7952a54685b6f6556ebe81a9aee8ade1a3e0"
52
55
  },
53
56
  "investigate": {
54
- "digest": "sha256:778b3a1f38323e8dd6101c6ace26ff8aada1246b20952b3641d5d1049bc50055"
57
+ "digest": "sha256:b6d82b2dc76297167a8fb75422d1f7037c4b9f0c74186cc4a2d719246764ca7e"
55
58
  },
56
59
  "lore-protocol": {
57
60
  "digest": "sha256:a80fbacc765e8b886437b9fdf7dd71e1ceb1b98b939078ec90fc88d06a8b4c69"
58
61
  },
59
62
  "opencode-go": {
60
- "digest": "sha256:a304b282fa078f97c2aa6a7d040d30eaae4c735de0aa5edf3af7368f62491804"
63
+ "digest": "sha256:9498e4f9d9c1b8ee2355d9ca57c65eaf2a3a9dbc2ba11ef0c4b0428769949f05"
61
64
  },
62
65
  "plan-ceo-review": {
63
66
  "digest": "sha256:4d426158518dd71f8998770e8d4037bcbfa3c65d7265a93a4a78a9b015ba881e"
@@ -72,31 +75,31 @@
72
75
  "digest": "sha256:b728dad90254d4c9f81b3818321d34ab53519b79ce20ff3bfe08bfacb2aa3e86"
73
76
  },
74
77
  "plan-refine": {
75
- "digest": "sha256:cf2c0743a81b0d8954417482e7812212a6a90e5046926c44cd82a6a309dfdc26"
78
+ "digest": "sha256:8a0e38564627565d267b347a0361eb222b9ba230961998c2d6812874ea7cf608"
76
79
  },
77
80
  "ralplan": {
78
- "digest": "sha256:d3e8ab6285f9882d18ee9feabf51bb6dd9d81f8aaa243c050e9eeaa3436927af"
81
+ "digest": "sha256:95d02771d3e3a46d225b1bf9dd12a33e83c9e0dbe2c126aad24986c4cb1d98a3"
79
82
  },
80
83
  "team": {
81
- "digest": "sha256:c27107b46e0cd7b9c264a6f51f74f505920d63e7ee2a2d26d2f288592fd10bd2"
84
+ "digest": "sha256:e403a5a92d145e777d7a344fe8fc6fe5df44640691aa2319b6dfd50b909166f5"
82
85
  },
83
86
  "tech-debt": {
84
- "digest": "sha256:2018bf8dc5f338baee3d982a5bf28c48773befea08e44f33b70561c18d897c56"
87
+ "digest": "sha256:fd2f8e26e006c9c5ed5ef6f1678c3f7472a35dfd2f743e58f7ec348606399353"
85
88
  },
86
89
  "testing-philosophy": {
87
90
  "digest": "sha256:23fdad944b089de3cfcd13957a5ac10c37bd3d136b192029af69368bca1470db"
88
91
  },
89
92
  "tooling-friction": {
90
- "digest": "sha256:64992c6a789d0283b7379a914d7686af5db97fe48cb5929f800a11d8f8e8f126"
93
+ "digest": "sha256:6f94949b6910d88ff974a95f4cd67bbaca05579db88fbeacc50126a13faf800b"
91
94
  },
92
95
  "tph": {
93
96
  "digest": "sha256:bed3684a850651534f315d355cdeae50d951c429817df0f105cccdb7f4e1561b"
94
97
  },
95
98
  "ultragoal": {
96
- "digest": "sha256:344177e32690fe6355577abe50659cea1af682933a78eb13a11765d1a1ad66d7"
99
+ "digest": "sha256:e60091f795311fd4ee8779b60b04f835522163fcca5d27122740b66f66afeceb"
97
100
  },
98
101
  "verify": {
99
- "digest": "sha256:c77aeb48d1d605496ed3b573b598323aff439e2bc9950a4369da8b3b43886b6a"
102
+ "digest": "sha256:e1aa3baed96ef005b144e17fac8a2153b90a075b142acee2fdfba7c89e613765"
100
103
  }
101
104
  }
102
105
  }
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: antigravity
3
+ description: "Antigravity outside-voice reviewer through Webpresso MCP."
4
+ license: MIT
5
+ ---
6
+
7
+ # Antigravity outside-voice review
8
+
9
+ Use only for a requested content-bound plan or delivery review. Treat output as external advice
10
+ until independently verified.
11
+
12
+ ## MCP-only contract
13
+
14
+ - Call `review_gate` exactly once for the real plan version or delivery diff.
15
+ - Observe the same durable operation with `review_gate_wait` when needed.
16
+ - Never invoke a provider command, the legacy review CLI, or a removed review-run surface.
17
+ - If the review MCP is unavailable, stop and report it unavailable. There is no CLI fallback.
18
+
19
+ ## Gate call
20
+
21
+ ```jsonc
22
+ {
23
+ "project_id": "<project>",
24
+ "slug": "<blueprint-slug>",
25
+ "purpose": "delivery",
26
+ "base_ref": "<full-base-sha>",
27
+ "authority_ref": "<full-head-sha>",
28
+ "caller_model": "<your own model id, exactly as your host reports it>",
29
+ "repository_access": "none",
30
+ }
31
+ ```
32
+
33
+ Each newly executed provider review that reaches a verdict is one formal round of the
34
+ slug's budget, and its approval is authority. An identical-subject call replays the recorded
35
+ verdict with no new review and no new round. A partial approval, withheld because adjudication
36
+ is incomplete (not every prior finding was briefed, or a briefed prior claim was marked
37
+ still-open without a matching finding), grants no authority and spends no round.
38
+
39
+ ## Reviewer selection
40
+
41
+ Pass `caller_model` with your OWN model id, exactly as your host reports it, and omit
42
+ `provider`, `model`, and `effort`: the gate selects the reviewer route itself — a cross-family
43
+ reviewer chosen for capability, current provider limits, and measured daily cost — and reports
44
+ the choice in `policy_selection`. Never name a reviewer model, probe a provider CLI for its
45
+ catalog, or read a credential store to discover models at invocation time; provider catalog
46
+ discovery belongs to the snapshot drift workflow. An operator may still pass an explicit
47
+ `provider`/`model` as a human override; agents must not.
48
+
49
+ ## Review quality
50
+
51
+ Follow `catalog/agent/rules/review-methodology-sota.md`; report typed verdict, model,
52
+ artifact, grounded findings, and independently verified conclusions.
@@ -21,11 +21,11 @@ argument-hint: "<brief|force: brief>"
21
21
  - parallel ready-set execution under ultragoal controller
22
22
 
23
23
  Drive an approved brief through `plan -> execute -> qa -> validate -> land -> complete`
24
- using `wp_ultragoal_run` / `wp ultragoal run` and the current handoff.
24
+ using `ultragoal_run` / `wp ultragoal run` and the current handoff.
25
25
 
26
26
  ## Outside-voice (required)
27
27
 
28
- After each ultragoal **phase or plan-gate milestone**, run an **OpenCode Go** outside-voice review and pick the model by purpose. The purpose→family ordering lives in one place — the committed reviewer policy rendered into the `opencode-go` skill — so follow that skill and do not restate the ordering here. Resolve IDs from live `opencode models opencode-go`. `wp_review_gate` has one mode: purpose plan for exact-version draft plan approval/auto-promotion, purpose delivery for implementation/phase review; each new provider verdict is a formal round and an approval is authority immediately. Never self-approve. Full protocol: the `ultragoal` skill. Respect `review_budget` (default owned by `workflow-skills-routing.md`): one sequential path, no multi-host stampede.
28
+ After each ultragoal **phase or plan-gate milestone**, run an outside-voice review. Pass `caller_model` with your own model id and omit `provider`/`model`/`effort`: the gate selects the cross-family reviewer route itself (capability, limits, measured daily cost) and reports it in `policy_selection`. Never resolve model ids from a live catalog at invocation time. `review_gate` has one mode: purpose plan for exact-version draft plan approval/auto-promotion, purpose delivery for implementation/phase review; each new provider verdict is a formal round and an approval is authority immediately. Never self-approve. Full protocol: the `ultragoal` skill. Respect `review_budget` (default owned by `workflow-skills-routing.md`): one sequential path, no multi-host stampede.
29
29
 
30
30
  ## Vague gate
31
31
 
@@ -45,23 +45,23 @@ skill.
45
45
 
46
46
  ## Tooling map
47
47
 
48
- | Pipeline step | Tools |
49
- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
50
- | Plan | `plan-refine`, `wp_blueprint_*`, `wp_session_capture` for decisions |
51
- | Create controller | `wp_ultragoal_new`, `wp_worktree` |
52
- | Execute | ready-set via blueprint tools; `/goal` or parallel subagents; `wp_session_context` for delegates; `wp_blueprint_task_verify` only to complete tasks |
53
- | Opportunistic repair | `/fix` up to `fix_budget`; else handoff backlog |
54
- | QA | `wp_qa` / `wp_lint` / `wp_typecheck` / `wp_test`; PR checks via `wp_pr_status` / `wp_pr_wait` |
55
- | Validate | one outside voice if merge-bound (OpenCode Go by purpose, or claude/codex); `wp review gate` for authority |
56
- | Land | `wp_pr_upsert`, green required checks, merge + owner cleanup |
57
- | Blocked / stop | `wp_ultragoal_handoff` ≤40 lines; `wp_ultragoal_cancel` if abandoned |
48
+ | Pipeline step | Tools |
49
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
50
+ | Plan | `plan-refine`, `blueprint_*`, `session_capture` for decisions |
51
+ | Create controller | `ultragoal_new`, `worktree` |
52
+ | Execute | ready-set via blueprint tools; `/goal` or parallel subagents; `session_context` for delegates; `blueprint_task_verify` only to complete tasks |
53
+ | Opportunistic repair | `/fix` up to `fix_budget`; else handoff backlog |
54
+ | QA | `qa` / `lint` / `typecheck` / `test`; PR checks via `pr_status` / `pr_wait` |
55
+ | Validate | one outside voice if merge-bound (the gate picks the cross-family reviewer from `caller_model`); `wp review gate` for authority |
56
+ | Land | `pr_upsert`, green required checks, merge + owner cleanup |
57
+ | Blocked / stop | `ultragoal_handoff` ≤40 lines; if the send channel is capped, the handoff records send-budget state (attempt count, last canary result); judgment requests ride the typed envelope or are named in the manifest; preserve the outbox, never route around a pause; `ultragoal_cancel` if abandoned |
58
58
 
59
59
  ## Pipeline
60
60
 
61
61
  1. **Plan:** refine blueprints and satisfy provenance-backed promotion approvals.
62
62
  2. **Execute:** implement current **ready** tasks in parallel up to `concurrency`; use only
63
- `wp_blueprint_task_verify` to mark them done.
64
- 3. **QA:** run affected checks and `wp_qa`; preserve normalized failure evidence. Prefer
63
+ `blueprint_task_verify` to mark them done.
64
+ 3. **QA:** run affected checks and `qa`; preserve normalized failure evidence. Prefer
65
65
  PR-bound CI when a PR exists.
66
66
  4. **Validate:** obtain verification + code-review evidence within `review_budget`. Each
67
67
  lane appends a tracked `reviews.md` record in one of these exact forms:
@@ -73,10 +73,10 @@ skill.
73
73
 
74
74
  5. **Land:** require green PR checks, complete the blueprint in the same PR, merge, and
75
75
  run owner cleanup.
76
- 6. **Complete:** stop only when `wp_ultragoal_run` records terminal evidence.
76
+ 6. **Complete:** stop only when `ultragoal_run` records terminal evidence.
77
77
 
78
78
  Resume from durable state after interruption. Obey `WP_ULTRAGOAL_DISABLE=1`,
79
79
  iteration/error/validation caps, and repository ownership. Never self-approve, directly
80
80
  mark tasks done, bypass evidence, push to main, or increase timeouts (keep every loop bounded and never increase timeouts). After every phase
81
- transition recorded by `wp ultragoal run`, obtain a fresh OpenCode Go outside review
81
+ transition recorded by `wp ultragoal run`, obtain a fresh outside-voice review
82
82
  before treating the milestone as closed (see Outside-voice above and the `ultragoal` skill).
@@ -11,8 +11,8 @@ until independently verified.
11
11
 
12
12
  ## MCP-only contract
13
13
 
14
- - Call `wp_review_gate` exactly once for the real plan version or delivery diff.
15
- - Observe the same durable operation with `wp_review_gate_wait` when needed.
14
+ - Call `review_gate` exactly once for the real plan version or delivery diff.
15
+ - Observe the same durable operation with `review_gate_wait` when needed.
16
16
  - Never invoke a provider command, the legacy review CLI, or a removed review-run surface.
17
17
  - If the review MCP is unavailable, stop and report it unavailable. There is no CLI fallback.
18
18
 
@@ -25,7 +25,7 @@ until independently verified.
25
25
  "purpose": "delivery",
26
26
  "base_ref": "<full-base-sha>",
27
27
  "authority_ref": "<full-head-sha>",
28
- "provider": "claude",
28
+ "caller_model": "<your own model id, exactly as your host reports it>",
29
29
  "repository_access": "none",
30
30
  }
31
31
  ```
@@ -36,10 +36,15 @@ verdict with no new review and no new round. A partial approval, withheld becaus
36
36
  is incomplete (not every prior finding was briefed, or a briefed prior claim was marked
37
37
  still-open without a matching finding), grants no authority and spends no round.
38
38
 
39
- ## Model policy
39
+ ## Reviewer selection
40
40
 
41
- When the user names an exact model, pass it in the MCP `model` field. Otherwise omit
42
- that field and let the MCP owner select the configured provider default.
41
+ Pass `caller_model` with your OWN model id, exactly as your host reports it, and omit
42
+ `provider`, `model`, and `effort`: the gate selects the reviewer route itself — a cross-family
43
+ reviewer chosen for capability, current provider limits, and measured daily cost — and reports
44
+ the choice in `policy_selection`. Never name a reviewer model, probe a provider CLI for its
45
+ catalog, or read a credential store to discover models at invocation time; provider catalog
46
+ discovery belongs to the snapshot drift workflow. An operator may still pass an explicit
47
+ `provider`/`model` as a human override; agents must not.
43
48
 
44
49
  ## Review quality
45
50
 
@@ -11,8 +11,8 @@ until independently verified.
11
11
 
12
12
  ## MCP-only contract
13
13
 
14
- - Call `wp_review_gate` exactly once for the real plan version or delivery diff.
15
- - Observe the same durable operation with `wp_review_gate_wait` when needed.
14
+ - Call `review_gate` exactly once for the real plan version or delivery diff.
15
+ - Observe the same durable operation with `review_gate_wait` when needed.
16
16
  - Never invoke a provider command, the legacy review CLI, or a removed review-run surface.
17
17
  - If the review MCP is unavailable, stop and report it unavailable. There is no CLI fallback.
18
18
 
@@ -25,7 +25,7 @@ until independently verified.
25
25
  "purpose": "delivery",
26
26
  "base_ref": "<full-base-sha>",
27
27
  "authority_ref": "<full-head-sha>",
28
- "provider": "codex",
28
+ "caller_model": "<your own model id, exactly as your host reports it>",
29
29
  "repository_access": "none",
30
30
  }
31
31
  ```
@@ -36,10 +36,15 @@ verdict with no new review and no new round. A partial approval, withheld becaus
36
36
  is incomplete (not every prior finding was briefed, or a briefed prior claim was marked
37
37
  still-open without a matching finding), grants no authority and spends no round.
38
38
 
39
- ## Model policy
39
+ ## Reviewer selection
40
40
 
41
- When the user names an exact model, pass it in the MCP `model` field. Otherwise omit
42
- that field and let the MCP owner select the configured provider default.
41
+ Pass `caller_model` with your OWN model id, exactly as your host reports it, and omit
42
+ `provider`, `model`, and `effort`: the gate selects the reviewer route itself — a cross-family
43
+ reviewer chosen for capability, current provider limits, and measured daily cost — and reports
44
+ the choice in `policy_selection`. Never name a reviewer model, probe a provider CLI for its
45
+ catalog, or read a credential store to discover models at invocation time; provider catalog
46
+ discovery belongs to the snapshot drift workflow. An operator may still pass an explicit
47
+ `provider`/`model` as a human override; agents must not.
43
48
 
44
49
  ## Review quality
45
50
 
@@ -59,7 +59,7 @@ Max rounds is a hard cap, not a target. Do not continue only to reach a round co
59
59
  - Treat every answer as a claim to pressure-test: the next question should usually demand evidence or an example, expose a hidden assumption, force a tradeoff or boundary, or reframe root cause vs symptom.
60
60
  - Do not rotate to a new dimension just for coverage when the current answer is still vague. Stay on the thread until it is one layer deeper, one assumption clearer, or one boundary tighter.
61
61
  - Before crystallizing, complete at least one explicit pressure pass that revisits an earlier answer with a deeper, assumption- or tradeoff-focused follow-up.
62
- - Gather codebase facts via local search tools, `wp_session_*` retrieval, and read-only repo inspection before asking the user about internals.
62
+ - Gather codebase facts via local search tools, `session_*` retrieval, and read-only repo inspection before asking the user about internals.
63
63
  - Always run a preflight context intake before the first question.
64
64
  - For brownfield work, preflight must ground in docs before user-facing questions: inspect applicable `AGENTS.md`/`CLAUDE.md`, README/getting-started docs, relevant `docs/` contracts/plans/ADRs, existing blueprints under `blueprints/`, and any project glossary such as `UBIQUITOUS_LANGUAGE.md` when present.
65
65
  - Treat repo language as evidence, not authority: if the user uses a fuzzy, overloaded, or conflicting term, surface the specific doc/code wording and ask which meaning should govern.
@@ -82,17 +82,17 @@ Max rounds is a hard cap, not a target. Do not continue only to reach a round co
82
82
  ## Phase 0: Preflight Context Intake
83
83
 
84
84
  1. Parse `{{ARGUMENTS}}` and derive a short kebab-case task slug.
85
- 2. Attempt to load the latest relevant context for the slug from session memory via the `wp_session_search`/`wp_session_retrieve` MCP tools.
85
+ 2. Attempt to load the latest relevant context for the slug from session memory via the `session_search`/`session_retrieve` MCP tools.
86
86
  3. If the provided initial context (or loaded snapshot) is too large for safe prompt use, the first round must ask for a concise prompt-safe summary before scoring ambiguity or any downstream handoff. This gate is blocking: preserve goals, constraints, success criteria, non-goals, decision boundaries, and references to the full source documents.
87
87
  4. If no snapshot exists, create a minimum snapshot with: task statement, desired outcome, stated solution, probable intent hypothesis, known facts/evidence, constraints, unknowns/open questions, decision-boundary unknowns, likely codebase touchpoints, repo docs/rules inspected, terminology/doc-code conflicts found.
88
88
  5. For brownfield tasks, inspect the applicable documentation/rule surface before the first user-facing round. Prefer exact, nearby sources: governing `AGENTS.md`/`CLAUDE.md`, README/getting-started docs, relevant `docs/` contracts/plans/ADRs, existing blueprints, and project glossary/context files when present.
89
- 6. Capture the snapshot into session memory via `wp_session_capture` (tagged with the slug) and reference it in the interview state.
89
+ 6. Capture the snapshot into session memory via `session_capture` (tagged with the slug) and reference it in the interview state.
90
90
 
91
91
  ## Phase 1: Initialize
92
92
 
93
93
  1. Parse `{{ARGUMENTS}}` and the depth profile (`--quick|--standard|--deep`).
94
94
  2. Detect project context: use local search tools and read-only repo inspection to classify **brownfield** (existing codebase target) vs **greenfield**; for brownfield, collect relevant context before questioning.
95
- 3. Persist a lightweight resumable interview state to session memory via `wp_session_capture` (interview id, profile, type, initial idea, rounds, current ambiguity, threshold, max rounds, challenge modes used, current stage/focus, context snapshot reference), so a later session can resume via `wp_session_search`/`wp_session_restore`.
95
+ 3. Persist a lightweight resumable interview state to session memory via `session_capture` (interview id, profile, type, initial idea, rounds, current ambiguity, threshold, max rounds, challenge modes used, current stage/focus, context snapshot reference), so a later session can resume via `session_search`/`session_restore`.
96
96
  4. Announce kickoff with the profile, threshold, and current ambiguity.
97
97
 
98
98
  ## Phase 2: Socratic Interview Loop
@@ -178,7 +178,7 @@ Show the weighted breakdown table, readiness-gate status (`Non-goals`, `Decision
178
178
 
179
179
  ### 2e) Persist state
180
180
 
181
- Append the round result and updated scores to the slug-tagged interview state in session memory (`wp_session_capture`).
181
+ Append the round result and updated scores to the slug-tagged interview state in session memory (`session_capture`).
182
182
 
183
183
  ### 2f) Round controls
184
184
 
@@ -203,9 +203,9 @@ Track used modes in state to prevent repetition.
203
203
 
204
204
  When the threshold is met (or the user exits with warning / hard cap):
205
205
 
206
- 1. Create or update the versioned draft that owns this task with `wp_blueprint_put`, yielding `blueprints/draft/{slug}/`. In this repo, deep interviews exist to produce better blueprints before implementation; carry the returned `bpv1:` version through every replacement.
206
+ 1. Create or update the versioned draft that owns this task with `blueprint_put`, yielding `blueprints/draft/{slug}/`. In this repo, deep interviews exist to produce better blueprints before implementation; carry the returned `bpv1:` version through every replacement.
207
207
  2. Write the interview transcript summary to `blueprints/draft/{slug}/interview.md`.
208
- 3. Fold the execution-ready spec into `blueprints/draft/{slug}/_overview.md` (intent, scope, non-goals, decision boundaries, constraints, acceptance criteria), and capture a copy of the final spec + scores into session memory via `wp_session_capture`.
208
+ 3. Fold the execution-ready spec into `blueprints/draft/{slug}/_overview.md` (intent, scope, non-goals, decision boundaries, constraints, acceptance criteria), and capture a copy of the final spec + scores into session memory via `session_capture`.
209
209
 
210
210
  The spec should include: metadata (profile, rounds, final ambiguity, threshold, context type); context snapshot reference; prompt-safe initial-context summary when oversized context was provided, plus references to the full sources; the clarity breakdown table; Intent (why); Desired Outcome; In-Scope; Out-of-Scope / Non-goals; Decision Boundaries (what the agent may decide without confirmation); Constraints; testable acceptance criteria (prefer repo verification surfaces — `wp test`, `wp typecheck`, `wp audit` — over manual checks); assumptions exposed and their resolutions; pressure-pass findings (which answer was revisited and what changed); brownfield evidence-vs-inference notes; the Docs/Terminology Ledger; scenario/edge-case findings that shaped scope or acceptance; and the full or condensed transcript.
211
211
 
@@ -219,7 +219,7 @@ Present execution options after artifact generation using explicit handoff contr
219
219
  - **`autopilot`** — when the spec is already strong enough for direct planning plus execution. Consumer uses the spec as the clarified execution brief with the non-goals and acceptance criteria as binding context.
220
220
  - **`ultragoal`** — when the clarified work should become durable, sequentially tracked goal-mode work.
221
221
  - **`team`** — when the task is large, multi-lane, or blocker-sensitive enough to justify coordinated parallel execution.
222
- - **Blueprint lifecycle** — refine with `wp_blueprint_put`, review the exact version with `wp_review_gate`, and inspect the auto-promoted result with `wp_blueprint_get` when work should enter planned execution directly.
222
+ - **Blueprint lifecycle** — refine with `blueprint_put`, review the exact version with `review_gate`, then promote the approved version explicitly with `blueprint_promote` when work should enter planned execution directly (MCP `review_gate` never auto-promotes).
223
223
  - **Refine further** — re-enter the loop to resolve the highest-leverage remaining uncertainty when residual ambiguity is still too high or an early-exit/above-threshold warning indicates too much risk to proceed cleanly.
224
224
 
225
225
  For research-shaped requests (a research question, evaluator-backed analysis, or reference gathering), hand off to `autoresearch` after the interview converges on a validator-ready mission; keep the explicit `refine further` vs `launch` boundary and do not launch until the user confirms.
@@ -232,11 +232,11 @@ For research-shaped requests (a research question, evaluator-backed analysis, or
232
232
 
233
233
  <Tool_Usage>
234
234
 
235
- - Use local search tools, `wp_session_*` retrieval, and read-only repo inspection for codebase fact gathering.
235
+ - Use local search tools, `session_*` retrieval, and read-only repo inspection for codebase fact gathering.
236
236
  - Use the host's native structured-question tool (e.g. `AskUserQuestion`) for each round when available; otherwise ask one concise plain-text question and wait.
237
- - Keep context snapshots and resumable interview state in session memory via the `wp_session_*` MCP tools, tagged with the task slug.
237
+ - Keep context snapshots and resumable interview state in session memory via the `session_*` MCP tools, tagged with the task slug.
238
238
  - Read applicable repo docs/rules/context during preflight; write durable docs/glossary/ADR updates only when the user explicitly opts in and the content is public-safe.
239
- - Land transcript artifacts in the active task's blueprint folder; create/update `_overview.md` only through `wp_blueprint_put`.
239
+ - Land transcript artifacts in the active task's blueprint folder; create/update `_overview.md` only through `blueprint_put`.
240
240
  - Use `best-practice-research` when unresolved ambiguity depends on current external/upstream guidance.
241
241
  </Tool_Usage>
242
242
 
@@ -250,7 +250,7 @@ For research-shaped requests (a research question, evaluator-backed analysis, or
250
250
 
251
251
  <Final_Checklist>
252
252
 
253
- - [ ] Preflight context snapshot captured to session memory (`wp_session_capture`, slug-tagged)
253
+ - [ ] Preflight context snapshot captured to session memory (`session_capture`, slug-tagged)
254
254
  - [ ] Oversized initial context, if present, has a prompt-safe summary before scoring or handoff
255
255
  - [ ] Ambiguity score shown each round
256
256
  - [ ] Intent-first stage priority used before implementation detail
@@ -260,7 +260,7 @@ For research-shaped requests (a research question, evaluator-backed analysis, or
260
260
  - [ ] Challenge modes triggered at thresholds (when applicable)
261
261
  - [ ] `Non-goals` and `Decision Boundaries` explicit before handoff
262
262
  - [ ] Transcript written to `blueprints/draft/{slug}/interview.md`
263
- - [ ] Spec folded into `blueprints/draft/{slug}/_overview.md` through `wp_blueprint_put`
263
+ - [ ] Spec folded into `blueprints/draft/{slug}/_overview.md` through `blueprint_put`
264
264
  - [ ] Brownfield questions use evidence-backed confirmation and doc grounding when applicable
265
265
  - [ ] Fuzzy/conflicting terminology challenged against repo language when applicable
266
266
  - [ ] Handoff options provided (`ralplan`, `autopilot`, `ultragoal`, `team`, blueprint lifecycle)
@@ -28,14 +28,14 @@ Child membership comes only from `parent_roadmap`; do not maintain a second list
28
28
 
29
29
  ## Loop
30
30
 
31
- 1. Call `wp_delivery_status({ slug })`.
31
+ 1. Call `delivery_status({ slug })`.
32
32
  2. Treat its `version`, blockers, and exact returned action as the current derived
33
33
  truth. Do not reconstruct state from transcripts.
34
- 3. Dispatch only returned `wp_worktree` actions. Child work starts from the
34
+ 3. Dispatch only returned `worktree` actions. Child work starts from the
35
35
  delivery branch and child PRs target that branch.
36
36
  4. Integrate at most one child at a time. Recheck status immediately before
37
- calling `wp_pr_merge` with the exact returned head SHA.
38
- 5. An `enqueued` merge is not integrated. Call `wp_delivery_status` again and
37
+ calling `pr_merge` with the exact returned head SHA.
38
+ 5. An `enqueued` merge is not integrated. Call `delivery_status` again and
39
39
  wait for the merged postcondition.
40
40
  6. After every child PR is merged, verify the delivery branch and land its final
41
41
  PR to `delivery_base` through the same exact-SHA merge tool.