@linimin/pi-letscook 0.1.52 → 0.1.54

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/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ### Changed
6
+
7
+ - removed workflow-aware prompt interception so only explicit `/cook` or `/cook <hint>` enters the workflow; ordinary prompts now always stay on the main chat path
8
+ - updated docs and release checks to describe explicit `/cook` entry instead of router-managed natural-language takeover
9
+
10
+ ## 0.1.54
11
+
12
+ ### Changed
13
+
14
+ - removed workflow-aware prompt interception so only explicit `/cook` or `/cook <hint>` enters the workflow; ordinary prompts now always stay on the main chat path
15
+ - updated docs and release checks to describe explicit `/cook` entry instead of router-managed natural-language takeover
16
+
17
+ ## 0.1.53
18
+
19
+ ### Changed
20
+
21
+ - removed assist mode from public routing behavior so natural-language entry is now either off or router, and made router the default trigger mode while keeping `/cook` as the canonical workflow boundary
22
+ - removed obsolete cook planning docs that no longer match the shipped router-only workflow entry behavior
23
+
5
24
  ## 0.1.52
6
25
 
7
26
  ### Changed
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  `/cook` turns main-chat discussion about concrete repo changes into a resumable repo workflow stored in repo-local `.agent/**` state.
4
4
 
5
- Natural-language routing is optional and shipped in three modes: `off` disables it, `assist` offers short confirm-first handoffs after clear workflow discussion, and `router` reviews each non-bypass user turn before implementation starts while leaving ordinary questions in the main chat. In every mode, `/cook` remains the canonical workflow boundary and manual fallback.
5
+ `/cook` is the explicit workflow boundary for starting, continuing, refocusing, or beginning the next round of long-running repo work.
6
6
 
7
7
  ## Use it when
8
8
 
@@ -46,10 +46,8 @@ Then run `/reload` in Pi.
46
46
  |---|---|
47
47
  | Start a long-running task | Discuss the concrete repo change in the main chat, then run `/cook` |
48
48
  | Bias mission detection toward one intent | Run `/cook <hint>` |
49
- | Change natural-language routing behavior | Set `PI_COMPLETION_TRIGGER_MODE=off`, `assist`, or `router` before starting Pi |
50
- | Hand off from discussion into the same `/cook` flow | In `assist`, say `開始做`, `開始實作`, or `go ahead`, then accept the confirmation |
51
49
  | Continue the current workflow | Run `/cook` |
52
- | Use the canonical fallback when natural-language routing does not fire or you want to bypass it | Run `/cook` explicitly |
50
+ | Refocus or start the next round | Discuss the new concrete repo change in the main chat, then run `/cook` |
53
51
 
54
52
  ## What `/cook` expects
55
53
 
@@ -61,20 +59,14 @@ Then run `/reload` in Pi.
61
59
 
62
60
  If recent discussion is missing, weak, ambiguous, assistant-produced, or only describes planning artifacts instead of concrete repo changes, `/cook` fails closed, leaves canonical `.agent/**` state unchanged, and tells you to clarify the mission in the main chat before rerunning `/cook`.
63
61
 
64
- ## Natural-language routing modes
62
+ ## Workflow entry
65
63
 
66
- Set `PI_COMPLETION_TRIGGER_MODE` before starting Pi if you want to change how natural-language routing behaves:
67
-
68
- - `off` — natural-language routing is disabled. Only explicit `/cook` or `/cook <hint>` can enter the workflow.
69
- - `assist` *(default)* — after clear discussion of a concrete repo change, short execution handoff phrases such as `開始做`, `開始實作`, or `go ahead` can offer to enter the same `/cook` flow before the primary agent starts implementation work.
70
- - `router` — the workflow-aware router reviews each non-bypass normal user turn before implementation starts. Ordinary questions stay in the main chat, while direct start/resume/refocus/next-round prompts can offer the shared `/cook` flow with confirmation or clarification.
64
+ Only explicit `/cook` or `/cook <hint>` enters the workflow. Ordinary prompts stay in the main chat and go straight to the primary agent.
71
65
 
72
66
  Important behavior:
73
- - natural-language routing is only a shortcut into `/cook`; `/cook` is still the canonical workflow boundary and manual fallback
67
+ - `/cook` is the canonical workflow boundary and manual entry point
74
68
  - startup, refocus, and next-round routing stay confirm-first; nothing silently starts a workflow
75
- - unclear router offers and classifier recovery stay fail-closed
76
- - in router mode, the original message only reaches the normal chat path if you explicitly choose **Send as normal chat**
77
- - explicit slash commands and ordinary main-chat questions continue normally unless you choose the workflow boundary
69
+ - explicit slash commands other than `/cook` continue normally in the main chat
78
70
 
79
71
  ## Typical examples
80
72
 
@@ -91,16 +83,9 @@ Bias proposal derivation toward a specific intent:
91
83
  /cook login redirect
92
84
  ```
93
85
 
94
- Hand off from discussion into the same `/cook` flow:
95
-
96
- ```text
97
- We should implement the natural-language routing path next.
98
- 開始做
99
- ```
100
-
101
86
  ## What happens when you run `/cook`
102
87
 
103
- `/cook` supports both bare discussion-driven startup and optional inline intent hints. Explicit `/cook` is always the canonical fallback, even when natural-language routing is enabled in `assist` or `router` mode.
88
+ `/cook` supports both bare discussion-driven startup and optional inline intent hints.
104
89
 
105
90
  | Repo state | What you'll see |
106
91
  |---|---|
@@ -116,7 +101,6 @@ We should implement the natural-language routing path next.
116
101
  - actions are **Start** and **Cancel**
117
102
  - **Cancel** is side-effect free: discuss changes in the main chat and rerun `/cook`
118
103
  - weak, ambiguous, assistant-produced, or planning-only discussion does not start a workflow
119
- - router-mode false positives and classifier failures stay fail-closed unless you explicitly choose **Send as normal chat**
120
104
  - when recent discussion suggests a different workflow, `/cook` shows a chooser before any canonical state rewrite
121
105
 
122
106
  When you accept startup or refocus, `/cook` persists the chosen workflow state in canonical `.agent/**` files before the re-ground round begins.
@@ -259,7 +243,6 @@ Run validation from the package root:
259
243
  npm run smoke-test
260
244
  npm run refocus-test
261
245
  npm run context-proposal-test
262
- bash ./scripts/cook-trigger-routing-test.sh
263
246
  bash scripts/canonical-evidence-artifact-test.sh
264
247
  npm run observability-status-test
265
248
  npm run evaluator-calibration-test
@@ -267,7 +250,7 @@ npm run rubric-contract-test
267
250
  npm run release-check
268
251
  ```
269
252
 
270
- `npm run release-check` is the broad packaged-release verifier. It begins with `bash .agent/verify_completion_control_plane.sh`, so missing or stale `.agent/verification-evidence.json` parity fails closed before the broader suite runs, then asserts the shipped `/cook` public parity surfaces in `README.md`, `CHANGELOG.md`, and the `/cook` help/fail-closed copy in `extensions/completion/index.ts`, reruns `bash ./scripts/cook-trigger-routing-test.sh` for workflow-aware router coverage including explicit **Send as normal chat** recovery, reruns the startup/refocus/context checks — including the critique-aware `/cook` confirmation regression and the smoke auto-resume prompt path — includes deterministic canonical evidence artifact coverage and includes deterministic active-slice contract coverage plus observability coverage, evaluator calibration, and the rubric-contract regression, and finishes with `npm pack --dry-run`.
253
+ `npm run release-check` is the broad packaged-release verifier. It begins with `bash .agent/verify_completion_control_plane.sh`, so missing or stale `.agent/verification-evidence.json` parity fails closed before the broader suite runs, then asserts the shipped `/cook` public parity surfaces in `README.md`, `CHANGELOG.md`, and the `/cook` help/fail-closed copy in `extensions/completion/index.ts`, reruns the startup/refocus/context checks — including the critique-aware `/cook` confirmation regression and the smoke auto-resume prompt path — includes deterministic canonical evidence artifact coverage and includes deterministic active-slice contract coverage plus observability coverage, evaluator calibration, and the rubric-contract regression, and finishes with `npm pack --dry-run`.
271
254
 
272
255
  The direct package-root verifier commands above intentionally self-isolate the repo-local extension when they shell back into `pi`, so you should not need to wrap them with `pi --no-extensions` even if `@linimin/pi-letscook` is also installed globally on the same machine.
273
256
 
@@ -14,7 +14,6 @@ import {
14
14
  markQueuedDriverPromptInFlight,
15
15
  registerCookCommand,
16
16
  } from "./driver";
17
- import { handleCookNaturalLanguageTrigger } from "./input-routing";
18
17
  import {
19
18
  assessMissionAnchor,
20
19
  collectRecentDiscussionEntries,
@@ -209,9 +208,9 @@ function maybeWriteTestSnapshot(targetPath: string | undefined, content: string)
209
208
 
210
209
  const COOK_MAIN_CHAT_RERUN_GUIDANCE = "Discuss changes in the main chat and rerun /cook.";
211
210
  const COOK_BARE_ONLY_GUIDANCE =
212
- "/cook remains the canonical workflow boundary. Natural-language routing can stay off, run in assist mode for short confirm-first handoffs, or run in router mode to review each non-bypass user turn before implementation starts, but the shared /cook flow still owns mission selection and confirmation.";
211
+ "/cook is the canonical workflow boundary. Discuss the concrete repo changes in the main chat, then run /cook when you want to start, continue, refocus, or begin the next workflow round.";
213
212
  const COOK_STRUCTURED_DISCUSSION_FAILURE_DETAIL =
214
- "/cook failed closed because recent discussion did not produce a clear execution-ready Mission/Scope/Constraints/Acceptance proposal for concrete repo changes. Assist and router modes only offer the same /cook flow, and router recovery only replays to normal chat when you explicitly choose Send as normal chat, so clarify the concrete repo changes in the main chat and rerun /cook.";
213
+ "/cook failed closed because recent discussion did not produce a clear execution-ready Mission/Scope/Constraints/Acceptance proposal for concrete repo changes. Clarify the concrete repo changes in the main chat and rerun /cook.";
215
214
 
216
215
  function buildCookCancellationMessage(prefix: string): string {
217
216
  return `${prefix}. ${COOK_MAIN_CHAT_RERUN_GUIDANCE}`;
@@ -931,7 +930,7 @@ export default function completionExtension(pi: ExtensionAPI) {
931
930
  structuredDiscussionFailureDetail: COOK_STRUCTURED_DISCUSSION_FAILURE_DETAIL,
932
931
  mainChatRerunGuidance: COOK_MAIN_CHAT_RERUN_GUIDANCE,
933
932
  cookCommandSpec: {
934
- description: "/cook workflow: start, continue, refocus, or start the next round; /cook stays canonical while natural-language routing can be off, assist, or router",
933
+ description: "/cook workflow: start, continue, refocus, or start the next round from an explicit /cook command",
935
934
  },
936
935
  buildContextProposalContinuationReason,
937
936
  completionKickoff,
@@ -961,9 +960,6 @@ export default function completionExtension(pi: ExtensionAPI) {
961
960
  shouldTreatBareActiveWorkflowProposalAsClearRefocus,
962
961
  };
963
962
 
964
- pi.on("input", async (event, ctx) => {
965
- return await handleCookNaturalLanguageTrigger(pi, event, ctx, driverDeps);
966
- });
967
963
 
968
964
  pi.on("session_start", async (_event, ctx) => {
969
965
  await refreshCompletionStatus({ ctx, ...statusSurfaceArgs });
@@ -3,8 +3,8 @@ import * as path from "node:path";
3
3
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
4
4
  import { runCookEntry, type CompletionDriverDeps } from "./driver";
5
5
  import {
6
- buildCookTriggerAssistConfirmationLayout,
7
6
  buildCookTriggerClarificationLayout,
7
+ buildCookTriggerConfirmationLayout,
8
8
  buildCookTriggerRecoveryLayout,
9
9
  maybeWriteCookTriggerClarificationSnapshot,
10
10
  maybeWriteCookTriggerConfirmationSnapshot,
@@ -89,13 +89,14 @@ function configuredTriggerMode(): NaturalLanguageCookTriggerMode {
89
89
  const raw =
90
90
  asString(process.env.PI_COMPLETION_TEST_TRIGGER_MODE)?.toLowerCase() ??
91
91
  asString(process.env.PI_COMPLETION_TRIGGER_MODE)?.toLowerCase() ??
92
- "assist";
93
- return raw === "off" || raw === "assist" || raw === "router" || raw === "auto" ? raw : "assist";
92
+ "router";
93
+ if (raw === "off") return "off";
94
+ if (raw === "router" || raw === "auto" || raw === "assist") return "router";
95
+ return "router";
94
96
  }
95
97
 
96
- function effectiveTriggerMode(mode: NaturalLanguageCookTriggerMode): "off" | "assist" | "router" {
98
+ function effectiveTriggerMode(mode: NaturalLanguageCookTriggerMode): "off" | "router" {
97
99
  if (mode === "off") return "off";
98
- if (mode === "assist") return "assist";
99
100
  return "router";
100
101
  }
101
102
 
@@ -445,7 +446,7 @@ async function promptCookTriggerTakeover(
445
446
  deps: CompletionDriverDeps,
446
447
  ): Promise<CookTriggerConfirmationAction> {
447
448
  const override = triggerConfirmationOverride();
448
- const layout = buildCookTriggerAssistConfirmationLayout({
449
+ const layout = buildCookTriggerConfirmationLayout({
449
450
  classification,
450
451
  mainChatRerunGuidance: deps.mainChatRerunGuidance,
451
452
  });
@@ -785,7 +786,7 @@ export async function handleCookNaturalLanguageTrigger(
785
786
  writeRoutingDecision(event, {
786
787
  mode: configuredMode,
787
788
  action: "handled",
788
- reason: ctx.hasUI ? "user_cancelled_takeover" : "assist_confirmation_unavailable",
789
+ reason: ctx.hasUI ? "user_cancelled_takeover" : "router_confirmation_unavailable",
789
790
  classification,
790
791
  }, {
791
792
  ...routingExtrasForArtifact(adoptedArtifact),
@@ -436,7 +436,7 @@ export function buildCookTriggerClarificationLayout(args: {
436
436
  };
437
437
  }
438
438
 
439
- export function buildCookTriggerAssistConfirmationLayout(args: {
439
+ export function buildCookTriggerConfirmationLayout(args: {
440
440
  classification: CookTriggerClassification;
441
441
  mainChatRerunGuidance: string;
442
442
  }): CookTriggerConfirmationLayout {
@@ -86,7 +86,7 @@ export type CompletionStatusSurface = {
86
86
  liveDetailsLines?: string[];
87
87
  };
88
88
 
89
- export type NaturalLanguageCookTriggerMode = "off" | "assist" | "router" | "auto";
89
+ export type NaturalLanguageCookTriggerMode = "off" | "router" | "auto";
90
90
  export type CookTriggerClassifierDecision = "offer_workflow" | "normal_prompt" | "unclear";
91
91
  export type CookTriggerWorkflowBias = "startup" | "resume" | "refocus" | "next_round" | "unknown";
92
92
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linimin/pi-letscook",
3
- "version": "0.1.52",
3
+ "version": "0.1.54",
4
4
  "description": "Pi package for long-running completion workflows with canonical .agent state, role-based subagents, continuity, and verification helpers.",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -912,7 +912,8 @@ git init -q
912
912
  PI_COOK_TRIGGER_EXTENSION_SOURCE_TEXT="開始做" \
913
913
  PI_COOK_TRIGGER_FALLBACK_PATH="$EXT_FALLBACK" \
914
914
  PI_COOK_TRIGGER_FALLBACK_SOURCE=extension \
915
- PI_COMPLETION_TEST_TRIGGER_MODE=assist \
915
+ PI_COMPLETION_TEST_TRIGGER_MODE=router \
916
+ PI_COMPLETION_TEST_TRIGGER_CLASSIFIER_OUTPUT="$NORMAL_CLASSIFIER_OUTPUT" \
916
917
  PI_COMPLETION_TEST_DRIVER_PROMPT_PATH="$EXT_PROMPT" \
917
918
  PI_COMPLETION_TEST_TRIGGER_CLASSIFIER_SNAPSHOT_PATH="$EXT_CLASSIFIER" \
918
919
  PI_COMPLETION_TEST_TRIGGER_ROUTING_PATH="$EXT_ROUTING" \
@@ -933,7 +934,6 @@ assert routing['action'] == 'continue', 'extension-originated turns should bypas
933
934
  assert routing['reason'] == 'extension_source', 'extension-originated turns should record the extension_source bypass reason'
934
935
  assert fallback['source'] == 'extension', 'extension-originated turns should continue to later extension-source handlers'
935
936
  assert fallback['text'] == '開始做', 'extension-originated turns should preserve the original extension text'
936
- assert not classifier.exists(), 'extension-originated turns should bypass the trigger classifier entirely'
937
937
  assert not driver_prompt.exists(), 'extension-originated turns should not queue a /cook driver prompt'
938
938
  assert not Path('.agent').exists(), 'extension-originated turns should not bootstrap canonical workflow state'
939
939
  PY
@@ -4,51 +4,47 @@ set -euo pipefail
4
4
  ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
5
  cd "$ROOT"
6
6
 
7
- echo "[release-check] running control-plane validation, /cook public parity, workflow-aware router coverage, role-runner extraction, startup/refocus/context regressions, canonical evidence artifact, active-slice contract, observability, legacy cleanup, evaluator calibration, and rubric contract coverage"
7
+ echo "[release-check] running control-plane validation, explicit-/cook parity, startup/refocus/context regressions, canonical evidence artifact, active-slice contract, observability, legacy cleanup, evaluator calibration, and rubric contract coverage"
8
8
  bash .agent/verify_completion_control_plane.sh
9
9
 
10
- echo "[release-check] verifying public /cook parity and workflow-aware router docs/help"
10
+ echo "[release-check] verifying public /cook parity and explicit-entry docs/help"
11
11
  python3 - <<'PY'
12
12
  import re
13
13
  from pathlib import Path
14
14
 
15
15
  checks = {
16
16
  "README.md": [
17
- "Natural-language routing is optional and shipped in three modes: `off` disables it, `assist` offers short confirm-first handoffs after clear workflow discussion, and `router` reviews each non-bypass user turn before implementation starts while leaving ordinary questions in the main chat.",
18
- "Set `PI_COMPLETION_TRIGGER_MODE` before starting Pi if you want to change how natural-language routing behaves:",
19
- "- `off` — natural-language routing is disabled. Only explicit `/cook` or `/cook <hint>` can enter the workflow.",
20
- "- `assist` *(default)* — after clear discussion of a concrete repo change, short execution handoff phrases such as `開始做`, `開始實作`, or `go ahead` can offer to enter the same `/cook` flow before the primary agent starts implementation work.",
21
- "- `router` — the workflow-aware router reviews each non-bypass normal user turn before implementation starts.",
22
- "the original message only reaches the normal chat path if you explicitly choose **Send as normal chat**",
23
- "Explicit `/cook` is always the canonical fallback, even when natural-language routing is enabled in `assist` or `router` mode.",
24
- "router-mode false positives and classifier failures stay fail-closed unless you explicitly choose **Send as normal chat**",
25
- "bash ./scripts/cook-trigger-routing-test.sh",
17
+ "`/cook` is the explicit workflow boundary for starting, continuing, refocusing, or beginning the next round of long-running repo work.",
18
+ "Only explicit `/cook` or `/cook <hint>` enters the workflow. Ordinary prompts stay in the main chat and go straight to the primary agent.",
19
+ "`/cook` is the canonical workflow boundary and manual entry point",
20
+ "Discuss the concrete repo change in the main chat, then run `/cook`",
26
21
  ],
27
22
  "CHANGELOG.md": [
28
- "updated README/help/release parity copy to describe the shipped `off` / `assist` / `router` natural-language routing behavior truthfully while keeping `/cook` as the canonical confirm-first workflow boundary and manual fallback",
29
- "documented the explicit router-mode **Send as normal chat** recovery path as a user choice, not as a silent downgrade, and kept public copy scoped to currently shipped router behavior rather than future auto-mode plans",
30
- "made `npm run release-check` fail closed on the shipped workflow-aware router docs/help contract while continuing to rerun `bash ./scripts/cook-trigger-routing-test.sh` alongside the existing `/cook` smoke/refocus/context regressions",
23
+ "removed workflow-aware prompt interception so only explicit `/cook` or `/cook <hint>` enters the workflow; ordinary prompts now always stay on the main chat path",
24
+ "updated docs and release checks to describe explicit `/cook` entry instead of router-managed natural-language takeover",
31
25
  ],
32
26
  "extensions/completion/index.ts": [
33
- 'description: "/cook workflow: start, continue, refocus, or start the next round; /cook stays canonical while natural-language routing can be off, assist, or router"',
27
+ 'description: "/cook workflow: start, continue, refocus, or start the next round from an explicit /cook command"',
34
28
  'const COOK_BARE_ONLY_GUIDANCE =',
35
- '"/cook remains the canonical workflow boundary. Natural-language routing can stay off, run in assist mode for short confirm-first handoffs, or run in router mode to review each non-bypass user turn before implementation starts, but the shared /cook flow still owns mission selection and confirmation."',
36
- '"/cook failed closed because recent discussion did not produce a clear execution-ready Mission/Scope/Constraints/Acceptance proposal for concrete repo changes. Assist and router modes only offer the same /cook flow, and router recovery only replays to normal chat when you explicitly choose Send as normal chat, so clarify the concrete repo changes in the main chat and rerun /cook."',
29
+ '"/cook is the canonical workflow boundary. Discuss the concrete repo changes in the main chat, then run /cook when you want to start, continue, refocus, or begin the next workflow round."',
30
+ '"/cook failed closed because recent discussion did not produce a clear execution-ready Mission/Scope/Constraints/Acceptance proposal for concrete repo changes. Clarify the concrete repo changes in the main chat and rerun /cook."',
37
31
  ],
38
32
  }
39
33
 
40
34
  forbidden = {
41
35
  "README.md": [
42
- "Assist-mode natural-language handoff can also offer to enter that same `/cook` flow before the primary agent starts implementation work, but `/cook` remains the canonical workflow boundary.",
43
- "## Natural-language handoff (assist mode)",
36
+ "Natural-language routing is optional and shipped in two modes",
37
+ "PI_COMPLETION_TRIGGER_MODE",
38
+ "workflow-aware router",
39
+ "Send as normal chat",
40
+ "bash ./scripts/cook-trigger-routing-test.sh",
44
41
  ],
45
42
  "CHANGELOG.md": ["compatibility" + " shim"],
46
43
  "extensions/completion/index.ts": [
47
- 'description: "/cook workflow: start, continue, refocus, or start the next round; assist-mode natural-language handoff can offer the same /cook boundary"',
48
- '"/cook remains the canonical workflow boundary. Assist-mode natural-language handoff can offer to enter the same /cook flow before implementation starts, while mission selection still comes from recent discussion, repo truth, and the approval-only confirmation flow."',
49
- '"/cook failed closed because recent discussion did not produce a clear execution-ready Mission/Scope/Constraints/Acceptance proposal for concrete repo changes. Natural-language handoff only offers to enter the same /cook flow, so clarify the concrete repo changes in the main chat and rerun /cook."',
50
- "temporary" + " compatibility" + " shim, pass /cook",
51
- "optional inline /cook hint",
44
+ 'description: "/cook workflow: start, continue, refocus, or start the next round; /cook stays canonical while natural-language routing can be off or router"',
45
+ '"/cook remains the canonical workflow boundary. Natural-language routing can stay off or run in router mode to review each non-bypass user turn before implementation starts, but the shared /cook flow still owns mission selection and confirmation."',
46
+ '"/cook failed closed because recent discussion did not produce a clear execution-ready Mission/Scope/Constraints/Acceptance proposal for concrete repo changes. Router mode only offers the same /cook flow, and router recovery only replays to normal chat when you explicitly choose Send as normal chat, so clarify the concrete repo changes in the main chat and rerun /cook."',
47
+ 'handleCookNaturalLanguageTrigger',
52
48
  ],
53
49
  }
54
50
 
@@ -65,7 +61,6 @@ for path, needles in forbidden.items():
65
61
  raise SystemExit(f"[release-check] found stale compatibility wording in {path}: {needle}")
66
62
  PY
67
63
 
68
- bash ./scripts/cook-trigger-routing-test.sh
69
64
  npm run smoke-test
70
65
  npm run refocus-test
71
66
  npm run context-proposal-test