@webpresso/plugin-opencode 0.0.6 → 0.0.7

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.
@@ -0,0 +1,159 @@
1
+ ---
2
+ type: skill
3
+ slug: tooling-friction
4
+ title: Tooling Friction
5
+ status: active
6
+ scope: repo
7
+ applies_to: [agents]
8
+ related: [verify, ultragoal, tech-debt, devex-review, land-policy]
9
+ created: "2026-08-03"
10
+ last_reviewed: "2026-08-03"
11
+ name: tooling-friction
12
+ description: "After land, capture MCP/CLI friction tips (optional; never blocks.)"
13
+ argument-hint: "[--promote] [blueprint-slug|pr-number|session]"
14
+ ---
15
+
16
+ # Tooling Friction
17
+
18
+ Optional post-land **product signal** for MCP/CLI/hooks/CI pain so Webpresso tooling can improve. Not a land gate. Not a full session debrief.
19
+
20
+ ## Boundary
21
+
22
+ | Owns | Does not own |
23
+ | ---------------------------------------------------- | -------------------------------------------------- |
24
+ | Structured friction tips after land-ish success | Code bugs (`/investigate` → `/fix`) |
25
+ | Optional promote to tech-debt (`--category tooling`) | Blueprint claim corrections (`blueprints/errata/`) |
26
+ | Local planning-state JSON (gitignored) | Human DX audits (`/devex-review`) |
27
+ | Soft bookend from `/verify` Phase 7 | Required PR section, finalize/merge blockers |
28
+
29
+ ## When
30
+
31
+ - After `/verify` Phase 7 (esp. green or `--merge-ready`) **and** medium+ tooling waste is already recalled
32
+ - Explicit `/tooling-friction` or user asks for tooling papercuts / agent tax feedback
33
+ - Blueprint completed or PR merged **and** gates burned meaningful tokens
34
+
35
+ ## When not
36
+
37
+ - Work still in-flight (stay in fix/verify)
38
+ - Smooth session with no tooling pain → **silence** (do not invent tips)
39
+ - Product-code root cause unknown → investigate first
40
+ - One-off transient network blips without a product fix
41
+
42
+ ## Workflow
43
+
44
+ 1. **Recall only** — do not re-ingest full CI logs or transcripts.
45
+ 2. If zero medium+ findings → stop: `skipped: no tooling friction`.
46
+ 3. Emit **1–3** findings (hard cap 8 for schema headroom; prefer ≤3).
47
+ 4. Write JSON to:
48
+
49
+ ```text
50
+ .agent/planning/state/tooling-friction/YYYY-MM-DD-<slug|pr|session>.json
51
+ ```
52
+
53
+ Create parent dirs as needed. Path is under the durable planning **state** surface (see `Agents.md`). `.agent/` is gitignored — **never** `git add` captures.
54
+
55
+ 5. Optional `--promote` or severity `high`/`critical`:
56
+ `wp tech-debt new "<short title>" --severity <s> --category tooling --status accepted`
57
+ Set `promoted_to` to the resulting path.
58
+ 6. Optional one-line `wp_session_capture` pointer to the JSON path — no paste-back walls.
59
+
60
+ **Rate limit:** at most **one** capture per verify bookend.
61
+
62
+ ## Store path (SSOT)
63
+
64
+ `.agent/planning/state/tooling-friction/*.json` — planning `state/`, not a new top-level under `planning/`.
65
+
66
+ ## Schema v1
67
+
68
+ ```json
69
+ {
70
+ "schema_version": 1,
71
+ "captured_at": "2026-08-03T15:00:00Z",
72
+ "session": {
73
+ "host": "claude",
74
+ "session_id": "optional-max-128",
75
+ "blueprint_slug": "optional",
76
+ "pr_number": 1239,
77
+ "branch": "optional-max-200"
78
+ },
79
+ "findings": [
80
+ {
81
+ "id": "tf-status-ci-skew",
82
+ "severity": "high",
83
+ "surface": "pr",
84
+ "tool": "wp_pr_status",
85
+ "kind": "friction",
86
+ "signal": "status_ci_skew",
87
+ "symptom": "wp_pr_merge blocked while GitHub CLEAN and PR Policy green.",
88
+ "token_waste": "high",
89
+ "time_waste_minutes": 25,
90
+ "recurrence": "session",
91
+ "suggested_fix": "Align land readiness evidence with PR Policy (body+trailers; git-diff subject).",
92
+ "evidence_refs": ["pr:1239"],
93
+ "promoted_to": null
94
+ }
95
+ ],
96
+ "notes": "optional ≤400 chars theme"
97
+ }
98
+ ```
99
+
100
+ ### Closed enums
101
+
102
+ | Field | Values |
103
+ | ----------- | -------------------------------------------------------------------------------------------------------------------- |
104
+ | severity | `low` `medium` `high` `critical` |
105
+ | surface | `mcp` `cli` `hook` `pr` `ci` `review-gate` `session-memory` `host` `docs` |
106
+ | kind | `friction` `missing` `docs` `workaround` `incident` |
107
+ | signal | `retry_loop` `schema_confuse` `timeout` `wrong_facade` `missing_capability` `docs_mismatch` `status_ci_skew` `other` |
108
+ | token_waste | `none` `low` `medium` `high` |
109
+ | host | `claude` `codex` `opencode` `grok` `other` |
110
+ | recurrence | `once` `session` `chronic` |
111
+
112
+ ### Limits
113
+
114
+ - findings: prefer ≤3 (schema max 8)
115
+ - `symptom` / `suggested_fix`: ≤280 chars
116
+ - `notes`: ≤400 chars
117
+ - `evidence_refs`: ≤5 items × ≤200 chars (run ids, receipt names, `pr:N` — **not** log bodies)
118
+ - `token_waste` bands: none &lt;1k · low 1–5k · medium 5–20k · high &gt;20k or multi-retry (estimate only)
119
+
120
+ ## Few-shot tips
121
+
122
+ **Good**
123
+
124
+ - `wp_pr_merge: land readiness disagrees with GitHub CLEAN / PR Policy (status_ci_skew, high)`
125
+ - `wp_review_gate: re-approve after ledger-only commits; subject binding unclear (retry_loop, medium)`
126
+ - `wp_pr_upsert: bare Review model "Grok" fails provider regex; needs "grok reviewer" (schema_confuse, low)`
127
+
128
+ **Bad**
129
+
130
+ - Full CI log paste
131
+ - "Tools are confusing sometimes"
132
+ - `suggested_fix: raise the timeout` (forbidden; see no-timeout-as-fix)
133
+
134
+ ## Anti-patterns (iron)
135
+
136
+ 1. No secrets, tokens, `.env`, auth headers
137
+ 2. No full logs/transcripts
138
+ 3. **Never block land** — missing capture ≠ incomplete
139
+ 4. No inventing tips on smooth runs
140
+ 5. No timeout-as-fix suggestions
141
+ 6. No blueprint errata misuse
142
+ 7. No committing `.agent/` captures
143
+ 8. No auto-open GitHub issues per tip
144
+
145
+ ## Integration
146
+
147
+ - **Canonical soft bookend:** `/verify` Phase 7 — if medium+ tooling waste recalled, run once.
148
+ - Other surfaces (ultragoal/delivery): optional cross-link only — do not multi-prompt.
149
+ - Land policy, finalize, and merge tools must not require this skill.
150
+
151
+ ## Output (agent reply)
152
+
153
+ ```text
154
+ tooling-friction: wrote .agent/planning/state/tooling-friction/<file>.json
155
+ findings: 2 (high=1, medium=1)
156
+ promoted: none | tech-debt/...
157
+ ```
158
+
159
+ Or: `tooling-friction: skipped: no tooling friction`
@@ -7,14 +7,20 @@ scope: repo
7
7
  applies_to: [agents]
8
8
  related: [autopilot, plan-refine, verify, fix, opencode-go]
9
9
  created: "2026-07-10"
10
- last_reviewed: "2026-07-21"
10
+ last_reviewed: "2026-08-03"
11
11
  name: ultragoal
12
- description: "Run durable multi-blueprint ultragoals through evidence-gated handoffs."
12
+ description: "Multi-blueprint ultragoal with budgets. Use for overnight, parallel execute, sleep with stop."
13
13
  argument-hint: "<new|status|handoff|run|cancel> [brief]"
14
14
  ---
15
15
 
16
16
  # Ultragoal
17
17
 
18
+ ## Use when (freeform)
19
+
20
+ - "ultragoal", "overnight", "go to sleep", "full autopilot" **with** named budgets/stop
21
+ - "spawn many in parallel", multi-blueprint ready-set execution
22
+ - Reject unbound "complete everything while I sleep" without stop condition / budgets
23
+
18
24
  Use `wp ultragoal` / MCP `wp_ultragoal_*` as the durable controller for work spanning
19
25
  one or more blueprints. Prefer this spine over host-local mega-sessions or ad-hoc
20
26
  multi-agent swarms.
@@ -32,6 +38,105 @@ Reject unbudgeted sleep-mode briefs (“complete all”, “full autopilot”,
32
38
  unless they name a blueprint/slug, budgets, and a stop condition. Route vague briefs
33
39
  through `plan-refine` first (or require `force:` only when the user explicitly opts out).
34
40
 
41
+ ## Executor preflight
42
+
43
+ `wp ultragoal start` validates every requested host before it persists a durable run or
44
+ permits supervisor worktree allocation. Built-in hosts validate both the executable and the
45
+ CLI grammar Ultragoal invokes; the generic `process` host validates executable availability
46
+ only. An incompatible wrapper fails with `UG_HOST_UNAVAILABLE`, the configured invocation
47
+ path, the missing surface, and its remediation variable. Diagnostics mention the canonical
48
+ target as secondary context only when the invocation path is a symlink.
49
+
50
+ | Host | Override variable |
51
+ | -------- | ------------------------------- |
52
+ | Claude | `WP_ULTRAGOAL_CLAUDE_COMMAND` |
53
+ | Codex | `WP_ULTRAGOAL_CODEX_COMMAND` |
54
+ | Grok | `WP_ULTRAGOAL_GROK_COMMAND` |
55
+ | OpenCode | `WP_ULTRAGOAL_OPENCODE_COMMAND` |
56
+ | Process | `WP_ULTRAGOAL_PROCESS_COMMAND` |
57
+
58
+ Upgrade the installed CLI or point the named variable at a compatible executable. Then
59
+ restart the process that owns the adapter: probe successes and failures are cached by
60
+ canonical executable for that adapter's lifetime. Missing paths are rechecked and symlink
61
+ retargeting is re-probed, but an in-place executable repair still requires an adapter-owner
62
+ restart. Grok execution requires a separately installed and authenticated Grok Build CLI.
63
+ `wp install` does not install or authenticate Grok Build.
64
+
65
+ Existing `WP_ULTRAGOAL_<HOST>_COMMAND` configurations remain supported; no environment
66
+ variable migration is required. Their executables must satisfy the current semantic probe
67
+ and invocation contract after an upgrade. The generic process host is additive: integrations
68
+ that opt into it configure `WP_ULTRAGOAL_PROCESS_COMMAND` and, when needed, the JSON argument
69
+ array described below.
70
+
71
+ Start probes each unique requested host concurrently, then reports the first failure in
72
+ requested-host order. A failed preflight occurs before durable run creation, ledger writes,
73
+ supervisor launch, or attempt/worktree allocation. Built-in probes validate the grammar they
74
+ invoke: Codex `exec --json --sandbox workspace-write`, Claude prompt/streaming output/bypass
75
+ permission flags, OpenCode `run --format json --auto`, and Grok headless prompt/streaming
76
+ output/approval/workspace-sandbox flags. Grok also runs an auth-free `inspect --json` check
77
+ against a temporary working directory so invalid sandbox profiles fail before execution.
78
+
79
+ Preflight does **not** validate authentication, provider quota or billing, network
80
+ reachability, or secrets isolation. Those failures remain runtime/provider concerns.
81
+
82
+ ### Host normalization and recovery
83
+
84
+ Ultragoal trims and normalizes the default host and per-task `taskHosts` values once when it
85
+ resolves the plan, then persists that normalized mapping. Task IDs are never normalized: a
86
+ per-task entry must use the exact executable task ID. Blank host values, missing task IDs,
87
+ and overrides for controller-only tasks fail with `UG_HOST_CONFIG_INVALID`; an unrecognized
88
+ normalized host fails with `UG_HOST_UNKNOWN`.
89
+
90
+ An initial host failure still occurs before owner-head lookup, durable run or ledger creation,
91
+ supervisor launch, and worktree allocation. Once a run already exists, the supervisor fills
92
+ only the ready executable tasks that fit the currently free concurrency slots. If one host is
93
+ unavailable, available siblings in that ready slice start and are durably attached to the run;
94
+ the unavailable task gets no attempt or worktree. The supervisor then records its exit and
95
+ reports the first host failure in task order. The `supervisor-exited` record leaves the run
96
+ nonterminal and the attached handles/worktrees recoverable.
97
+
98
+ After upgrading or overriding the unavailable host, adopt the run. Adoption creates a fresh
99
+ host registry and probe cache, recovers the already attached work, and schedules the task that
100
+ could not start. Do not convert a cached availability failure into a retry attempt or mark an
101
+ otherwise recoverable run terminal.
102
+
103
+ ### Generic process contract
104
+
105
+ Set `WP_ULTRAGOAL_PROCESS_COMMAND` to an executable. Optional
106
+ `WP_ULTRAGOAL_PROCESS_ARGS_JSON` must be a JSON array of string arguments. Ultragoal appends
107
+ these fixed arguments after the configured arguments; process integrations must accept them:
108
+
109
+ ```text
110
+ --task <task.json> --events <events.jsonl> --responses <responses.jsonl>
111
+ ```
112
+
113
+ The same absolute paths are available as `UG_TASK_PATH`, `UG_EVENTS_PATH`, and
114
+ `UG_RESPONSES_PATH`; `UG_ATTEMPT_ID` and `UG_WORKTREE` identify the attempt and its working
115
+ tree. The executable runs with that worktree as its current directory. It writes one JSON
116
+ object per line to the events file using one of these shapes:
117
+
118
+ ```json
119
+ {"type":"attention","attentionId":"question-1","prompt":"Proceed?"}
120
+ {"type":"response-ack","attentionId":"question-1"}
121
+ {"type":"completed"}
122
+ {"type":"failed","reason":"optional explanation"}
123
+ ```
124
+
125
+ Ultragoal appends responses as JSONL objects with `type: "response"`, the matching
126
+ `attentionId`, `response`, and `createdAt`. The process must emit `response-ack` with that
127
+ identifier after consuming a response. The protocol paths and `UG_*` variables are fixed;
128
+ the configured JSON arguments may add process-specific flags but cannot replace them.
129
+
130
+ ### Execution authority and isolation
131
+
132
+ Ultragoal worktrees protect git integration boundaries; they are **not** operating-system
133
+ sandboxes. Codex uses its `workspace-write` sandbox. Grok's `workspace` sandbox may read
134
+ anywhere, write in its current directory, `~/.grok`, and temporary directories, and permits
135
+ child-process network access. Claude `bypassPermissions`, OpenCode `--auto` mode, and custom
136
+ `process` executables retain substantial user authority. OpenCode disables automatic updates
137
+ and sharing and denies external-directory access, but those policy settings do not make it an
138
+ OS sandbox. Run Ultragoal only with providers, configuration, and task content you trust.
139
+
35
140
  ## Tooling map (use these; do not reimplement with Bash)
36
141
 
37
142
  | Phase | Prefer MCP / CLI | Purpose |
@@ -70,6 +175,8 @@ Fallback to `wp …` CLI only when the matching MCP tool is unavailable. Prefer
70
175
  7. **Validate / land:** local proof with `wp_qa` / targeted tools; outside review only when
71
176
  merge-ready and within `review_budget` — **exactly one sequential** outside voice unless
72
177
  the user sets N (the default value lives in `workflow-skills-routing.md`).
178
+ Controller validation evidence is **machine-qa (prior QA phase) + N outside voices**
179
+ (default N=1), not two outside model reviewers at budget 1.
73
180
  Use `wp_review_gate` only for exact-version draft plan approval/auto-promotion.
74
181
  Use advisory `wp_review_run` for implementation/phase outside voice; it never
75
182
  mutates blueprint approval state. A CLI delivery gate is explicit
@@ -171,9 +278,20 @@ start the gate again instead of spinning a wait loop.
171
278
 
172
279
  ## Snapshot / dirty worktree
173
280
 
174
- - Ultragoal ledger appends to blueprint `reviews.md` / `review-events.jsonl` /
175
- `review-artifacts/**`.
176
- - These paths under both `blueprints/**` and monorepo `webpresso/blueprints/**` are
177
- **evidence-only dirt** and must not fail `createCleanSourceSnapshot`.
178
- - Dirty **source** paths (including `_overview.md` task status edits) still fail closed
179
- until committed. Use `wp_session_snapshot` before risky branch switches.
281
+ - **Never edit primary.** Ultragoal and locked blueprint mutations refuse
282
+ primary-like checkouts; planning SSOT lives only in managed owner worktrees.
283
+ - On a **linked managed worktree**, uncommitted `blueprints/**` dirt (review
284
+ ledgers, `_overview.md` lifecycle, promote/finalize renames) is
285
+ controller-owned and must not fail `createCleanSourceSnapshot` / block
286
+ `wp ultragoal run` after task_verify or promotion.
287
+ - On a **primary-like checkout**, only review ledgers/artifacts are ignored;
288
+ dirty `_overview.md` still fails closed so primary never silently absorbs
289
+ planning pollution. Product source outside blueprints always fails closed.
290
+ - Committed blueprint documents still participate in the HEAD source snapshot
291
+ hash (QA/land identity). Commit blueprint + product changes when claiming
292
+ merge-ready.
293
+
294
+ ## After land (optional)
295
+
296
+ If MCP/CLI/hooks/CI gates burned medium+ tokens this program, consider
297
+ `/tooling-friction` once. Never required for land complete.
@@ -5,16 +5,22 @@ title: Verify
5
5
  status: active
6
6
  scope: repo
7
7
  applies_to: [agents]
8
- related: [testing-philosophy, tph]
8
+ related: [testing-philosophy, tph, land-policy]
9
9
  created: "2026-05-07"
10
- last_reviewed: "2026-07-21"
10
+ last_reviewed: "2026-08-03"
11
11
  name: verify
12
- description: "Post-implementation quality gate: run checks, TPH audit, cleanup, docs, proof."
12
+ description: "Post-impl quality gate. Use for verify, merge-ready, land, done. Local=0 outside voice."
13
13
  argument-hint: "<target> [--full|--merge-ready] where target is: package|file|plan-slug|all"
14
14
  ---
15
15
 
16
16
  # Verify
17
17
 
18
+ ## Use when (freeform)
19
+
20
+ - "verify", "are we done?", "merge-ready", "land", "merge it" (with land-policy)
21
+ - final completeness before push or PR claim
22
+ - **Not** for multi-host review swarms — default local has **0** outside voice
23
+
18
24
  Post-implementation quality gate. Run after implementation exists, before claiming `done`.
19
25
 
20
26
  `/fix` owns investigation-if-missing, root-cause analysis, and the minimal
@@ -149,10 +155,11 @@ wp ci-preflight
149
155
  ```
150
156
 
151
157
  That is fail-fast branch-scoped format → guardrails → typecheck → lint →
152
- test. Agent-kit itself enforces it from `.husky/pre-push`; consumer repos may
153
- keep pre-push checks user-owned, so run the command explicitly before pushing.
154
- Do **not** claim push-ready if preflight failed. Do **not** bypass hooks to ship
155
- red work.
158
+ test. Run it after the final commit and make no further worktree or base-ref
159
+ changes before pushing. Agent-kit's `.husky/pre-push` checks the resulting
160
+ exact-state receipt without rerunning the suite after Git opens the remote
161
+ transport; consumer repos may keep pre-push checks user-owned. Do **not** claim
162
+ push-ready if preflight failed. Do **not** bypass hooks to ship red work.
156
163
 
157
164
  Rules:
158
165
 
@@ -218,26 +225,79 @@ If behavior is already locked and the remaining work is purely anti-slop
218
225
  cleanup, route that pass through `ai-deslop` first rather than broadening
219
226
  `verify` into a writer lane.
220
227
 
228
+ **Default branch when green:** if behavioral proof is green and the diff still
229
+ shows machine-shaped noise, dead wrappers, or elegance debt, run or recommend
230
+ `ai-deslop` on the changed scope before the final done claim.
231
+
221
232
  This phase exists to catch the garbage that often slips in beside otherwise-correct work.
222
233
 
223
234
  ## Phase 6 — Outside-model approval gate (**`--merge-ready` only**)
224
235
 
236
+ **Anti-stampede:** never fan out parallel multi-host reviews. Default local
237
+ verify uses **zero** outside voice. Merge-ready uses **exactly one sequential**
238
+ outside voice unless the user sets N. If you needed "600 reviews", the bug is
239
+ in outside-voice usage — stop and fix the gate, do not multiply reviewers.
240
+
225
241
  **Skip this entire phase** for default `/verify` and `/verify --full`. Local
226
242
  `done` claims do not require outside voice.
227
243
 
228
- Before claiming **merge-ready**, obtain outside-voice approvals only under this policy:
244
+ This phase implements **land-policy M7** (delivery vs advisory). Full land
245
+ language and dual-label contract:
246
+ [`catalog/agent/rules/land-policy.md`](../../rules/land-policy.md).
247
+
248
+ Before claiming **merge-ready** / land:
249
+
250
+ ### 1. Classify with immutable refs
251
+
252
+ Run `wp_audit` with `kind: "risk-review-coverage"` using:
253
+
254
+ - immutable PR **base** SHA
255
+ - immutable **authority** (head) SHA
256
+ - PR-description body (`--pr-body-file`)
257
+
258
+ Do not substitute mutable branch names for authority when the audit needs a SHA.
259
+ SSOT: `evaluateSensitiveReviewPolicy` in `src/review/sensitive-review-policy.ts`;
260
+ CI job in `.github/workflows/pr-policy.yml`.
261
+
262
+ ### 2. Sensitive → delivery until satisfied
263
+
264
+ When classification is **sensitive**:
229
265
 
230
- Default merge-ready policy:
266
+ - Require delivery review via `risk-review-coverage` / `wp_review_gate`
267
+ (purpose delivery) / qualifying lane approvals for the current
268
+ `wp-git-diff-v1` subject until `policySatisfied`.
269
+ - Launch **exactly one** `wp_review_gate` delivery attempt with
270
+ `--base-ref <base-sha>` and `--authority-ref <head-sha>`. Do not substitute
271
+ `HEAD` for the authority SHA, and do not relaunch while the same subject has
272
+ an in-progress gate.
273
+ - `Review-skip` is **FORBIDDEN** (`sensitive-review-skip-forbidden`).
274
+ - Completed owner blueprint must be present in the PR
275
+ (`sensitive-no-completed-owner` otherwise).
276
+ - Process label when blocked: `sensitive-blocked`. When delivery lane
277
+ approves: `delivery-approved`.
231
278
 
232
- - Require **exactly one** extra model approval unless the user sets a different N.
233
- - At most **one OpenCode Go reviewer** counts toward the requirement unless the user
234
- explicitly asks for multiple OpenCode models.
235
- - Invoke the selected reviewer **once**. Do not probe, retry, or rotate providers
236
- automatically, and never fan out parallel multi-host review swarms.
237
- - If the user asks for more, fewer, zero, or specific reviewers, follow that instruction
238
- and report the chosen requirement.
239
- - These approvals are model outside-voice approvals, not a substitute for human GitHub
240
- reviews or branch-protection approvals.
279
+ ### 3. Standard skip or one advisory outside voice
280
+
281
+ When classification is **standard**:
282
+
283
+ - Prefer a specific trailer when justified:
284
+
285
+ ```text
286
+ Review-skip: SKIP standard-risk; <why ≥8 chars>
287
+ ```
288
+
289
+ Must be start-of-line. Process label: `standard-skip`.
290
+
291
+ - Otherwise obtain **exactly one sequential** advisory outside voice
292
+ (`wp_review_run` or host skill). Process label: `outside-approved`.
293
+ - At most **one OpenCode Go reviewer** counts unless the user asks for more.
294
+ - Invoke the selected reviewer **once**. Do not probe, retry, or rotate
295
+ providers automatically, and **never** fan out parallel multi-host review
296
+ swarms.
297
+ - If the user asks for more, fewer, zero, or specific reviewers, follow that
298
+ instruction and report the chosen requirement.
299
+ - These approvals are model outside-voice approvals, not a substitute for human
300
+ GitHub reviews or branch-protection approvals.
241
301
 
242
302
  Reviewer preference (pick **one** path):
243
303
 
@@ -247,7 +307,16 @@ Reviewer preference (pick **one** path):
247
307
  - Prefer skills: `claude`, `codex`, `grok`, or one of `opencode-go` / `qwen` /
248
308
  `deepseek` / `glm` / `kimi` / `minimax` / `mimo`.
249
309
 
250
- Approval evidence requirements:
310
+ ### 4. Dual product/process labels on every land claim
311
+
312
+ Always emit:
313
+
314
+ - **Product status:** `complete` | `incomplete`
315
+ - **Process status:** `outside-approved` | `standard-skip` | `sensitive-blocked` | `delivery-approved`
316
+
317
+ Never invent a land-now skip. See `land-policy` for the full table.
318
+
319
+ ### Approval evidence requirements
251
320
 
252
321
  - Blueprint plan approval: use `wp_review_gate` with the current `bpv1` version.
253
322
  It records the review and promotes an approved draft atomically by default.
@@ -256,8 +325,10 @@ Approval evidence requirements:
256
325
  observed; wait timeout/abort/in-progress/not-found are not reviewer verdicts.
257
326
  `not_found` means there is no active or terminal gate for that subject; refresh
258
327
  state and start the gate again instead of continuing to wait.
259
- - Implementation approval: invoke `wp_review_run` exactly once with the selected
260
- provider and an expected verdict marker. Do not run a separate provider probe.
328
+ - Implementation / delivery approval: for sensitive PRs use `wp_review_gate`
329
+ purpose delivery on the immutable subject; for standard advisory use
330
+ `wp_review_run` exactly once with the selected provider and an expected
331
+ verdict marker. Do not run a separate provider probe.
261
332
  - Each gate reviewer must return exactly one schema-valid JSON review object;
262
333
  never infer a verdict from Markdown. The gate derives approval from typed
263
334
  findings: blockers reject, nits approve with nits, and no findings approve.
@@ -282,3 +353,8 @@ Report:
282
353
  When catalog assets or generated instruction surfaces changed, include public-package-safety or package-surface leak checks.
283
354
 
284
355
  If any required check is missing, the correct result is **not done yet**, not a softer claim.
356
+
357
+ **Tooling friction (optional):** if this session burned medium+ tokens on MCP/CLI/hooks/CI
358
+ gates (not product code), run `/tooling-friction` once and write tips under
359
+ `.agent/planning/state/tooling-friction/`. Skip when the path was smooth. Never
360
+ blocks land — see the `tooling-friction` skill.