@claude-flow/cli 3.17.0 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -1
  2. package/dist/src/mcp-tools/agentdb-tools.js +52 -1
  3. package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
  4. package/dist/src/mcp-tools/browser-session-tools.d.ts +5 -1
  5. package/dist/src/mcp-tools/browser-session-tools.d.ts.map +1 -1
  6. package/dist/src/mcp-tools/browser-session-tools.js +92 -18
  7. package/dist/src/mcp-tools/browser-session-tools.js.map +1 -1
  8. package/dist/src/mcp-tools/hooks-tools.d.ts +1 -0
  9. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  10. package/dist/src/mcp-tools/hooks-tools.js +131 -0
  11. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  12. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  13. package/dist/src/mcp-tools/neural-tools.js +119 -84
  14. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  15. package/dist/src/memory/memory-bridge.d.ts +15 -2
  16. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  17. package/dist/src/memory/memory-bridge.js +64 -10
  18. package/dist/src/memory/memory-bridge.js.map +1 -1
  19. package/dist/src/ruvector/output-verifier.d.ts +83 -0
  20. package/dist/src/ruvector/output-verifier.d.ts.map +1 -0
  21. package/dist/src/ruvector/output-verifier.js +277 -0
  22. package/dist/src/ruvector/output-verifier.js.map +1 -0
  23. package/dist/src/ruvector/trajectory-tree.d.ts +113 -0
  24. package/dist/src/ruvector/trajectory-tree.d.ts.map +1 -0
  25. package/dist/src/ruvector/trajectory-tree.js +237 -0
  26. package/dist/src/ruvector/trajectory-tree.js.map +1 -0
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +1 -1
  29. package/plugins/ruflo-metaharness/agents/metaharness-architect.md +1 -1
  30. package/plugins/ruflo-metaharness/commands/ruflo-metaharness.md +5 -3
  31. package/plugins/ruflo-metaharness/scripts/_darwin.mjs +47 -39
  32. package/plugins/ruflo-metaharness/scripts/_harness.mjs +173 -104
  33. package/plugins/ruflo-metaharness/scripts/_invoke.mjs +231 -0
  34. package/plugins/ruflo-metaharness/scripts/_redblue.mjs +36 -75
  35. package/plugins/ruflo-metaharness/scripts/evolve.mjs +163 -3
  36. package/plugins/ruflo-metaharness/scripts/gepa.mjs +7 -53
  37. package/plugins/ruflo-metaharness/scripts/smoke.sh +98 -47
  38. package/plugins/ruflo-metaharness/scripts/test-graceful-degradation.mjs +16 -0
  39. package/plugins/ruflo-metaharness/skills/harness-evolve/SKILL.md +41 -2
  40. package/plugins/ruflo-metaharness/skills/harness-learn/SKILL.md +4 -2
  41. package/plugins/ruflo-metaharness/skills/harness-mcp-scan/SKILL.md +3 -1
  42. package/plugins/ruflo-metaharness/skills/harness-score/SKILL.md +1 -1
  43. package/plugins/ruflo-metaharness/skills/harness-threat-model/SKILL.md +3 -1
@@ -48,6 +48,7 @@ export declare const hooksWorkerDetect: MCPTool;
48
48
  export declare const hooksModelRoute: MCPTool;
49
49
  export declare const hooksModelOutcome: MCPTool;
50
50
  export declare const hooksModelStats: MCPTool;
51
+ export declare const hooksModelVerify: MCPTool;
51
52
  export declare const hooksCodemod: MCPTool;
52
53
  export declare const hooksWorkerCancel: MCPTool;
53
54
  export declare const hooksTeammateIdle: MCPTool;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/hooks-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,YAAY,CAAC;AAiBzD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASzD;AAwqBD,eAAO,MAAM,YAAY,EAAE,OAwC1B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OAyE3B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,OA6C7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,OAgF9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,OAgLxB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,OAoE1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,OA8CvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,OA2F1B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OA6L3B,CAAC;AAGF,eAAO,MAAM,YAAY,EAAE,OA4E1B,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,OA4K3B,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,OAoE9B,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,OA+E3B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAuI/B,CAAC;AAGF,eAAO,MAAM,eAAe,EAAE,OAuF7B,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,OAyCjC,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,OA+BzB,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,OAsCvB,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAkI/B,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,OAmEpC,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,OAyDlC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,OAmEjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,OA+QhC,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OA4E/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,OAwGhC,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,OAsapC,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,OAiGpC,CAAC;AAGF,eAAO,MAAM,0BAA0B,EAAE,OA8MxC,CAAC;AAgQF,eAAO,MAAM,eAAe,EAAE,OA8C7B,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,OAwIjC,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAuD/B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAkE/B,CAAC;AAiBF,eAAO,MAAM,eAAe,EAAE,OA+C7B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAgC/B,CAAC;AAGF,eAAO,MAAM,eAAe,EAAE,OAuB7B,CAAC;AAeF,eAAO,MAAM,YAAY,EAAE,OAmI1B,CAAC;AAqBF,eAAO,MAAM,iBAAiB,EAAE,OA0C/B,CAAC;AAOF,eAAO,MAAM,iBAAiB,EAAE,OAwB/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,OAoFhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,OAc3C,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,OAAO,EA6C/B,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"hooks-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp-tools/hooks-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,YAAY,CAAC;AAiBzD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASzD;AAwqBD,eAAO,MAAM,YAAY,EAAE,OAwC1B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OAyE3B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,OA6C7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,OAgF9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,OAgLxB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,OAoE1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,OA8CvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,OA2F1B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OA6L3B,CAAC;AAGF,eAAO,MAAM,YAAY,EAAE,OA4E1B,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,OA4K3B,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,OAoE9B,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,OA+E3B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAuI/B,CAAC;AAGF,eAAO,MAAM,eAAe,EAAE,OAuF7B,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,OAyCjC,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,OA+BzB,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,OAsCvB,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAkI/B,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,OAmEpC,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,OAmElC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,OAyEjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,OAqRhC,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OA4E/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,OA8IhC,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,OAsapC,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,OAiGpC,CAAC;AAGF,eAAO,MAAM,0BAA0B,EAAE,OA8MxC,CAAC;AAgQF,eAAO,MAAM,eAAe,EAAE,OA8C7B,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,OAwIjC,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAuD/B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAkE/B,CAAC;AAiBF,eAAO,MAAM,eAAe,EAAE,OA+C7B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,OAgC/B,CAAC;AAGF,eAAO,MAAM,eAAe,EAAE,OAuB7B,CAAC;AAWF,eAAO,MAAM,gBAAgB,EAAE,OAmD9B,CAAC;AAeF,eAAO,MAAM,YAAY,EAAE,OAmI1B,CAAC;AAqBF,eAAO,MAAM,iBAAiB,EAAE,OA0C/B,CAAC;AAOF,eAAO,MAAM,iBAAiB,EAAE,OAwB/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,OAoFhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,OAc3C,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,OAAO,EA8C/B,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -2384,12 +2384,14 @@ export const hooksTrajectoryStart = {
2384
2384
  properties: {
2385
2385
  task: { type: 'string', description: 'Task description' },
2386
2386
  agent: { type: 'string', description: 'Agent type' },
2387
+ sessionId: { type: 'string', description: 'Session id for the execution-state tree (default: CLAUDE_FLOW_SESSION_ID or "default")' },
2387
2388
  },
2388
2389
  required: ['task'],
2389
2390
  },
2390
2391
  handler: async (params) => {
2391
2392
  const task = params.task;
2392
2393
  const agent = params.agent || 'coder';
2394
+ const sessionId = params.sessionId || process.env.CLAUDE_FLOW_SESSION_ID || 'default';
2393
2395
  {
2394
2396
  const v = validateText(task, 'task');
2395
2397
  if (!v.valid)
@@ -2400,6 +2402,11 @@ export const hooksTrajectoryStart = {
2400
2402
  if (!v.valid)
2401
2403
  return { success: false, error: v.error };
2402
2404
  }
2405
+ if (params.sessionId) {
2406
+ const v = validateIdentifier(params.sessionId, 'sessionId');
2407
+ if (!v.valid)
2408
+ return { success: false, error: v.error };
2409
+ }
2403
2410
  const trajectoryId = `traj-${Date.now()}-${Math.random().toString(36).substring(7)}`;
2404
2411
  const startedAt = new Date().toISOString();
2405
2412
  // Create real trajectory entry in memory
@@ -2411,6 +2418,13 @@ export const hooksTrajectoryStart = {
2411
2418
  startedAt,
2412
2419
  };
2413
2420
  activeTrajectories.set(trajectoryId, trajectory);
2421
+ // MAGE-style execution-state-tree mirror (prototype, ruvector/trajectory-tree.ts).
2422
+ // Non-fatal by design — the semantic trajectory path below is untouched.
2423
+ try {
2424
+ const { getTrajectoryTree } = await import('../ruvector/trajectory-tree.js');
2425
+ getTrajectoryTree().openTrajectory({ sessionId, trajectoryId, task, agent });
2426
+ }
2427
+ catch { /* prototype path — never blocks trajectory recording */ }
2414
2428
  // Persist pending trajectory to disk so it survives MCP restarts
2415
2429
  const storeFn = await getRealStoreFunction();
2416
2430
  if (storeFn) {
@@ -2479,6 +2493,12 @@ export const hooksTrajectoryStep = {
2479
2493
  timestamp,
2480
2494
  });
2481
2495
  }
2496
+ // MAGE-style execution-state-tree mirror (prototype, non-fatal)
2497
+ try {
2498
+ const { getTrajectoryTree } = await import('../ruvector/trajectory-tree.js');
2499
+ getTrajectoryTree().appendStep({ trajectoryId, stepId, action, quality });
2500
+ }
2501
+ catch { /* prototype path — never blocks step recording */ }
2482
2502
  // ADR-130 Phase 3: fire-and-forget causal edge write
2483
2503
  // trajectory context node → step node (relation: "trajectory-caused")
2484
2504
  if (result) {
@@ -2563,6 +2583,12 @@ export const hooksTrajectoryEnd = {
2563
2583
  // Remove from active trajectories
2564
2584
  activeTrajectories.delete(trajectoryId);
2565
2585
  }
2586
+ // MAGE-style execution-state-tree mirror (prototype, non-fatal)
2587
+ try {
2588
+ const { getTrajectoryTree } = await import('../ruvector/trajectory-tree.js');
2589
+ getTrajectoryTree().closeTrajectory({ trajectoryId, success });
2590
+ }
2591
+ catch { /* prototype path — never blocks trajectory finalization */ }
2566
2592
  // SONA Learning - process trajectory outcome for routing optimization
2567
2593
  let sonaResult = {
2568
2594
  learned: false, patternKey: '', confidence: 0
@@ -2866,6 +2892,9 @@ export const hooksPatternSearch = {
2866
2892
  topK: { type: 'number', description: 'Number of results' },
2867
2893
  minConfidence: { type: 'number', description: 'Minimum similarity threshold (0-1)' },
2868
2894
  namespace: { type: 'string', description: 'Namespace to search (default: pattern)' },
2895
+ strategy: { type: 'string', enum: ['semantic', 'state-tree'], description: 'Retrieval strategy. Default "semantic" (unchanged behavior). "state-tree" returns the MAGE-style root→current execution-state path for a session instead of embedding search (prototype).' },
2896
+ sessionId: { type: 'string', description: 'Session id for strategy="state-tree" (default: CLAUDE_FLOW_SESSION_ID or "default")' },
2897
+ depth: { type: 'number', description: 'For strategy="state-tree": max path nodes returned, counted from the current node upward' },
2869
2898
  },
2870
2899
  required: ['query'],
2871
2900
  },
@@ -2874,6 +2903,7 @@ export const hooksPatternSearch = {
2874
2903
  const topK = params.topK || 5;
2875
2904
  const minConfidence = params.minConfidence || 0.3;
2876
2905
  const namespace = params.namespace || 'pattern';
2906
+ const strategy = params.strategy || 'semantic';
2877
2907
  {
2878
2908
  const v = validateText(query, 'query');
2879
2909
  if (!v.valid)
@@ -2884,6 +2914,44 @@ export const hooksPatternSearch = {
2884
2914
  if (!v.valid)
2885
2915
  return { success: false, error: v.error };
2886
2916
  }
2917
+ // Opt-in MAGE-style positional retrieval (prototype). Default stays the
2918
+ // semantic vector path below — zero behavior change unless requested.
2919
+ if (strategy === 'state-tree') {
2920
+ const sessionId = params.sessionId || process.env.CLAUDE_FLOW_SESSION_ID || 'default';
2921
+ if (params.sessionId) {
2922
+ const v = validateIdentifier(params.sessionId, 'sessionId');
2923
+ if (!v.valid)
2924
+ return { success: false, error: v.error };
2925
+ }
2926
+ try {
2927
+ const { getTrajectoryTree } = await import('../ruvector/trajectory-tree.js');
2928
+ const recall = getTrajectoryTree().recallPath({
2929
+ sessionId,
2930
+ depth: typeof params.depth === 'number' ? params.depth : undefined,
2931
+ siblingWindow: topK,
2932
+ });
2933
+ return {
2934
+ query,
2935
+ strategy: 'state-tree',
2936
+ backend: 'state-tree',
2937
+ sessionId: recall.sessionId,
2938
+ currentId: recall.currentId,
2939
+ path: recall.path,
2940
+ siblings: recall.siblings,
2941
+ note: 'Positional root→current execution-state path (no embedding search). Prototype — see ruvector/trajectory-tree.ts limitations.',
2942
+ };
2943
+ }
2944
+ catch (error) {
2945
+ return {
2946
+ query,
2947
+ strategy: 'state-tree',
2948
+ backend: 'state-tree-unavailable',
2949
+ path: [],
2950
+ siblings: [],
2951
+ error: String(error),
2952
+ };
2953
+ }
2954
+ }
2887
2955
  // Phase 3: Try ReasoningBank search via bridge first
2888
2956
  try {
2889
2957
  const bridge = await import('../memory/memory-bridge.js');
@@ -4293,6 +4361,68 @@ export const hooksModelStats = {
4293
4361
  };
4294
4362
  },
4295
4363
  };
4364
+ // Model verify — confidence-gated tier escalation (post-generation).
4365
+ // The heuristics live in ruvector/output-verifier.ts; this wrapper adds the
4366
+ // MCP surface and feeds the verdict into the SAME learning stream that
4367
+ // hooks_model-outcome uses (ModelRouter.recordOutcome → Thompson priors), so
4368
+ // the router learns from escalations. A dedicated tool (rather than a
4369
+ // "verify mode" on hooks_model-outcome) was chosen because outcome recording
4370
+ // is a terminal write while verify is a MID-LOOP decision point that returns
4371
+ // a verdict the agent acts on — overloading outcome would conflate the two
4372
+ // and break the route → generate → verify → (escalate) → outcome sequence.
4373
+ export const hooksModelVerify = {
4374
+ name: 'hooks_model-verify',
4375
+ description: 'Verify a generated output with CHEAP structural signals ($0, no LLM call) and get an escalation verdict — the post-generation half of confidence-gated tier routing (route → generate → verify → escalate on failure). Checks: empty/truncated output, refusal patterns, degenerate repetition, and real syntax parsing for code/JSON tasks (TypeScript compiler / JSON.parse). Returns {confident, reasons[], suggestedTier, suggestedModel, escalate}. By default the verdict is recorded into the model-routing learning stream (success when confident, escalated when not) so the bandit learns which task shapes the cheap tier fails on. Use when you just generated with the tier hooks_model-route picked and must decide accept-vs-escalate BEFORE acting on the output; accepting cheap-tier output unverified is wrong because structurally unusable results (refusals, truncation, unparseable code) silently propagate downstream, and pre-generation routing alone cannot catch them. Not a semantic-quality judge — it only catches structurally unusable outputs.',
4376
+ inputSchema: {
4377
+ type: 'object',
4378
+ properties: {
4379
+ task: { type: 'string', description: 'The task the output was generated for' },
4380
+ output: { type: 'string', description: 'The generated output to verify' },
4381
+ model: { type: 'string', enum: ['haiku', 'sonnet', 'opus'], description: 'Model that produced the output (drives the escalation ladder; default haiku)' },
4382
+ tierUsed: { type: 'number', enum: [1, 2, 3], description: 'Tier that produced the output; derived from model when absent' },
4383
+ taskKind: { type: 'string', enum: ['code', 'json', 'text', 'auto'], description: 'Force the task kind; default auto-detect' },
4384
+ record: { type: 'boolean', description: 'Record the verdict into the routing learning stream (default true; requires model)' },
4385
+ },
4386
+ required: ['task', 'output'],
4387
+ },
4388
+ handler: async (params) => {
4389
+ const task = params.task;
4390
+ const output = params.output;
4391
+ const model = params.model;
4392
+ {
4393
+ const v = validateText(task, 'task');
4394
+ if (!v.valid)
4395
+ return { success: false, error: v.error };
4396
+ }
4397
+ if (typeof output !== 'string')
4398
+ return { success: false, error: 'output must be a string' };
4399
+ const { verifyAndEscalate } = await import('../ruvector/output-verifier.js');
4400
+ const verdict = await verifyAndEscalate({
4401
+ task,
4402
+ output,
4403
+ model,
4404
+ tierUsed: params.tierUsed,
4405
+ taskKind: params.taskKind,
4406
+ });
4407
+ // Feed the verdict into the existing outcome/learning stream (same path
4408
+ // as hooks_model-outcome) so escalations update the Thompson priors.
4409
+ let recorded = false;
4410
+ if (params.record !== false && model) {
4411
+ const router = await getModelRouterInstance();
4412
+ if (router) {
4413
+ router.recordOutcome(task, model, verdict.confident ? 'success' : 'escalated');
4414
+ recorded = true;
4415
+ }
4416
+ }
4417
+ return {
4418
+ ...verdict,
4419
+ model: model ?? 'haiku',
4420
+ recorded,
4421
+ recordedOutcome: recorded ? (verdict.confident ? 'success' : 'escalated') : null,
4422
+ timestamp: new Date().toISOString(),
4423
+ };
4424
+ },
4425
+ };
4296
4426
  // Supported source extensions for codemods.
4297
4427
  const CODEMOD_EXTENSIONS = new Set(['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs', '.mts', '.cts']);
4298
4428
  const CODEMOD_MAX_FILES = 2000;
@@ -4686,6 +4816,7 @@ export const hooksTools = [
4686
4816
  hooksModelRoute,
4687
4817
  hooksModelOutcome,
4688
4818
  hooksModelStats,
4819
+ hooksModelVerify,
4689
4820
  // Deterministic Tier-1 codemod execution (ADR-143)
4690
4821
  hooksCodemod,
4691
4822
  ];