thumbgate 1.29.2 → 1.30.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 (55) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.well-known/mcp/server-card.json +1 -1
  3. package/adapters/claude/.mcp.json +2 -2
  4. package/adapters/forge/forge.yaml +3 -3
  5. package/adapters/mcp/server-stdio.js +78 -7
  6. package/adapters/opencode/opencode.json +1 -1
  7. package/bin/cli.js +7 -5
  8. package/config/mcp-allowlists.json +26 -2
  9. package/config/post-deploy-marketing-pages.json +26 -1
  10. package/package.json +38 -7
  11. package/public/architecture.html +130 -0
  12. package/public/assets/diagrams/agent-integration.png +0 -0
  13. package/public/assets/diagrams/before-after.svg +21 -0
  14. package/public/assets/diagrams/decision.svg +36 -0
  15. package/public/assets/diagrams/feedback-pipeline.png +0 -0
  16. package/public/assets/diagrams/loop.svg +34 -0
  17. package/public/assets/diagrams/plugin-topology.png +0 -0
  18. package/public/assets/diagrams/pre-action-gate-loop.svg +59 -0
  19. package/public/assets/diagrams/stack.svg +18 -0
  20. package/public/assets/diagrams/thumbgate-architecture.png +0 -0
  21. package/public/case-studies.html +151 -0
  22. package/public/eval-scorecard.html +195 -0
  23. package/public/eval-scorecard.json +18 -0
  24. package/public/evaluations.html +168 -0
  25. package/public/index.html +4 -3
  26. package/public/numbers.html +2 -2
  27. package/public/whitepaper.html +189 -0
  28. package/scripts/activation-quickstart.js +1 -0
  29. package/scripts/agent-outcome-monitor.js +71 -1
  30. package/scripts/billing.js +3 -1
  31. package/scripts/claude-feedback-sync.js +3 -2
  32. package/scripts/cli-feedback.js +13 -7
  33. package/scripts/cross-encoder-reranker.js +3 -0
  34. package/scripts/feedback-aggregate.js +5 -2
  35. package/scripts/feedback-loop.js +244 -182
  36. package/scripts/gates-engine.js +81 -4
  37. package/scripts/generate-case-study-outreach.js +253 -0
  38. package/scripts/generate-eval-scorecard.js +276 -0
  39. package/scripts/growth-campaigns.js +183 -0
  40. package/scripts/jsonl-watcher.js +1 -0
  41. package/scripts/lesson-inference.js +23 -4
  42. package/scripts/lesson-retrieval.js +71 -4
  43. package/scripts/lesson-search.js +26 -3
  44. package/scripts/mcp-config.js +26 -5
  45. package/scripts/mcp-oauth.js +37 -2
  46. package/scripts/model-eval.js +308 -0
  47. package/scripts/parallel-workflow-orchestrator.js +86 -22
  48. package/scripts/published-cli.js +11 -1
  49. package/scripts/refresh-proof-pack.js +261 -0
  50. package/scripts/risk-scorer.js +144 -15
  51. package/scripts/statusline-local-stats.js +1 -1
  52. package/scripts/thumbgate-bench.js +13 -0
  53. package/scripts/tool-kpi-tracker.js +124 -0
  54. package/scripts/tool-registry.js +49 -1
  55. package/src/api/server.js +230 -86
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "thumbgate",
3
3
  "description": "One 👎 becomes a hard rule the agent cannot bypass. Captures thumbs-down feedback, distills it into PreToolUse Pre-Action Checks, enforced across every future Claude Code session.",
4
- "version": "1.29.2",
4
+ "version": "1.30.0",
5
5
  "author": {
6
6
  "name": "Igor Ganapolsky",
7
7
  "email": "ig5973700@gmail.com",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.29.2",
3
+ "version": "1.30.0",
4
4
  "description": "ThumbGate — 👍👎 feedback that teaches your AI agent. Thumbs down a mistake, it never happens again.",
5
5
  "homepage": "https://thumbgate.ai",
6
6
  "transport": "stdio",
@@ -2,13 +2,13 @@
2
2
  "mcpServers": {
3
3
  "thumbgate": {
4
4
  "command": "npx",
5
- "args": ["--yes", "--package", "thumbgate@1.29.2", "thumbgate", "serve"]
5
+ "args": ["--yes", "--package", "thumbgate@1.30.0", "thumbgate", "serve"]
6
6
  }
7
7
  },
8
8
  "hooks": {
9
9
  "preToolUse": {
10
10
  "command": "npx",
11
- "args": ["--yes", "--package", "thumbgate@1.29.2", "thumbgate", "gate-check"]
11
+ "args": ["--yes", "--package", "thumbgate@1.30.0", "thumbgate", "gate-check"]
12
12
  }
13
13
  }
14
14
  }
@@ -9,12 +9,12 @@ version: "1"
9
9
  skills:
10
10
  thumbgate-gate-check:
11
11
  description: "ThumbGate PreToolUse gate — blocks known-bad tool calls"
12
- command: "npx --yes --package thumbgate@1.29.2 thumbgate gate-check"
12
+ command: "npx --yes --package thumbgate@1.30.0 thumbgate gate-check"
13
13
  trigger: pre_tool_use
14
14
 
15
15
  thumbgate-feedback:
16
16
  description: "ThumbGate feedback capture — logs user prompt context"
17
- command: "npx --yes --package thumbgate@1.29.2 thumbgate hook-auto-capture"
17
+ command: "npx --yes --package thumbgate@1.30.0 thumbgate hook-auto-capture"
18
18
  trigger: user_prompt
19
19
 
20
20
  mcp:
@@ -23,6 +23,6 @@ mcp:
23
23
  args:
24
24
  - "--yes"
25
25
  - "--package"
26
- - "thumbgate@1.29.2"
26
+ - "thumbgate@1.30.0"
27
27
  - "thumbgate"
28
28
  - "serve"
@@ -96,6 +96,7 @@ const {
96
96
  requestEscalation,
97
97
  } = require('../../scripts/human-escalation');
98
98
  const { recordReasoningTrace } = require('../../scripts/agent-reasoning-traces');
99
+ const { recordToolCall } = require('../../scripts/tool-kpi-tracker');
99
100
  const {
100
101
  evaluateOperationalIntegrity,
101
102
  } = require('../../scripts/operational-integrity');
@@ -316,7 +317,7 @@ const {
316
317
  finalizeSession: finalizeFeedbackSession,
317
318
  } = require('../../scripts/feedback-session');
318
319
 
319
- const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.29.2' };
320
+ const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.30.0' };
320
321
  const COMMERCE_CATEGORIES = [
321
322
  'product_recommendation',
322
323
  'brand_compliance',
@@ -379,6 +380,9 @@ function toTextResult(payload) {
379
380
  const text = typeof payload === 'string' ? payload : JSON.stringify(payload, null, 2);
380
381
  return {
381
382
  content: [{ type: 'text', text }],
383
+ ...(payload !== null && typeof payload === 'object'
384
+ ? { structuredContent: payload }
385
+ : {}),
382
386
  };
383
387
  }
384
388
 
@@ -416,7 +420,7 @@ function toCaptureFeedbackTextResult(result) {
416
420
  if (reminder) {
417
421
  blocks.push({ type: 'text', text: reminder });
418
422
  }
419
- return { content: blocks };
423
+ return { content: blocks, structuredContent: result };
420
424
  }
421
425
 
422
426
  function formatContextPack(pack) {
@@ -758,10 +762,27 @@ function buildEstimateUncertaintyResponse(args = {}) {
758
762
  }
759
763
 
760
764
  async function callTool(name, args = {}) {
765
+ const attemptStartMs = Date.now();
761
766
  const activeProfile = getActiveMcpProfile();
762
- assertToolAllowed(name, activeProfile);
767
+ try {
768
+ assertToolAllowed(name, activeProfile);
769
+ } catch (error) {
770
+ recordMcpToolTrace(name, args, {
771
+ success: false,
772
+ category: 'profile_denied',
773
+ evidence: [error.message],
774
+ latencyMs: Date.now() - attemptStartMs,
775
+ });
776
+ throw error;
777
+ }
763
778
  const capability = getToolCapability(name);
764
779
  if (!capability.available) {
780
+ recordMcpToolTrace(name, args, {
781
+ success: false,
782
+ category: 'capability',
783
+ evidence: capability.missingModules,
784
+ latencyMs: Date.now() - attemptStartMs,
785
+ });
765
786
  if (capability.availability === 'private_core') {
766
787
  return unavailablePrivateMcpFeature(name);
767
788
  }
@@ -788,6 +809,7 @@ async function callTool(name, args = {}) {
788
809
  success: false,
789
810
  category: 'contract',
790
811
  evidence: validation.errors,
812
+ latencyMs: Date.now() - attemptStartMs,
791
813
  });
792
814
  throw err;
793
815
  }
@@ -803,6 +825,7 @@ async function callTool(name, args = {}) {
803
825
  success: false,
804
826
  category: 'permission',
805
827
  evidence: [firewallResult.message],
828
+ latencyMs: Date.now() - attemptStartMs,
806
829
  });
807
830
  throw err;
808
831
  }
@@ -816,11 +839,24 @@ async function callTool(name, args = {}) {
816
839
  success: false,
817
840
  category: err.errorCategory || 'execution',
818
841
  evidence: [err.code || err.message || 'tool execution failed'],
819
- latencyMs: Date.now() - startMs,
842
+ latencyMs: Date.now() - attemptStartMs,
820
843
  });
821
844
  throw err;
822
845
  }
823
846
  const latencyMs = Date.now() - startMs;
847
+ const outputValidation = validateMcpToolOutput(toolDef, result);
848
+ if (!outputValidation.valid) {
849
+ const err = new Error(`Structured output contract violation on '${name}': ${outputValidation.errors.join('; ')}`);
850
+ err.errorCategory = 'output_contract';
851
+ err.isRetryable = false;
852
+ recordMcpToolTrace(name, args, {
853
+ success: false,
854
+ category: 'output_contract',
855
+ evidence: outputValidation.errors,
856
+ latencyMs,
857
+ });
858
+ throw err;
859
+ }
824
860
  recordMcpToolTrace(name, args, {
825
861
  success: true,
826
862
  category: 'success',
@@ -840,7 +876,31 @@ async function callTool(name, args = {}) {
840
876
  return result;
841
877
  }
842
878
 
879
+ function validateMcpToolOutput(toolDef, result) {
880
+ if (!toolDef || !toolDef.outputSchema) return { valid: true, errors: [] };
881
+ const { validateStructuredOutput } = require('../../scripts/tool-contract-validator');
882
+ if (!result || result.structuredContent === undefined) {
883
+ return { valid: false, errors: ['Tool response is missing structuredContent'] };
884
+ }
885
+ return validateStructuredOutput(result.structuredContent, toolDef.outputSchema);
886
+ }
887
+
843
888
  function recordMcpToolTrace(name, args, outcome = {}) {
889
+ try {
890
+ recordToolCall({
891
+ toolName: name,
892
+ serverName: 'mcp',
893
+ latencyMs: Number(outcome.latencyMs || 0),
894
+ success: outcome.success === true,
895
+ agentId: args.agentId || args.processId || args.taskId || 'unknown',
896
+ metadata: {
897
+ category: outcome.category || 'unknown',
898
+ traceId: args.traceId || args.taskId || null,
899
+ },
900
+ });
901
+ } catch {
902
+ // KPI telemetry must not change the tool's functional outcome.
903
+ }
844
904
  try {
845
905
  const traceId = args.traceId || args.taskId || `mcp-${Date.now()}-${name}`;
846
906
  recordReasoningTrace({
@@ -888,10 +948,13 @@ async function callToolInner(name, args) {
888
948
  // action receipt (this action -> this outcome) before promotion. Returns
889
949
  // args unchanged when there is no matching receipt (non-breaking).
890
950
  const pairedFeedback = pairFeedbackWithReceipt(args);
891
- return toCaptureFeedbackTextResult(captureFeedback(pairedFeedback));
951
+ return toCaptureFeedbackTextResult(captureFeedback({
952
+ ...pairedFeedback,
953
+ reviewOrigin: 'automated',
954
+ }));
892
955
  }
893
956
  case 'feedback_summary':
894
- return toTextResult(feedbackSummary(Number(args.recent || 20)));
957
+ return toTextResult(feedbackSummary(Number(args.recent || 20), { humanOnly: true }));
895
958
  case 'search_lessons': {
896
959
  const module = loadPrivateMcpModule('lessonSearch');
897
960
  if (!module) return unavailablePrivateMcpFeature('search_lessons');
@@ -899,6 +962,9 @@ async function callToolInner(name, args) {
899
962
  limit: Number(args.limit || 10),
900
963
  category: args.category,
901
964
  tags: Array.isArray(args.tags) ? args.tags : [],
965
+ scope: args.scope,
966
+ requireScope: args.requireScope === true,
967
+ includeShared: args.includeShared !== false,
902
968
  }));
903
969
  }
904
970
  case 'suggest_fix':
@@ -918,6 +984,9 @@ async function callToolInner(name, args) {
918
984
  {
919
985
  candidateCount: 20,
920
986
  maxResults: Number(args.maxResults || 5),
987
+ scope: args.scope,
988
+ requireScope: args.requireScope === true,
989
+ includeShared: args.includeShared !== false,
921
990
  },
922
991
  ));
923
992
  }
@@ -970,7 +1039,7 @@ async function callToolInner(name, args) {
970
1039
  return toTextResult(document);
971
1040
  }
972
1041
  case 'feedback_stats':
973
- return toTextResult(analyzeFeedback());
1042
+ return toTextResult(analyzeFeedback(undefined, { humanOnly: true }));
974
1043
  case 'diagnose_failure':
975
1044
  return buildDiagnoseFailureResponse(args);
976
1045
  case 'reflect_on_feedback':
@@ -1148,6 +1217,7 @@ async function callToolInner(name, args) {
1148
1217
  workflowContract: args.workflowContract,
1149
1218
  repoPath: args.repoPath,
1150
1219
  localOnly: args.localOnly === true,
1220
+ ttlMs: args.ttlMs,
1151
1221
  clear: args.clear === true,
1152
1222
  }),
1153
1223
  });
@@ -1744,5 +1814,6 @@ module.exports = {
1744
1814
  listAvailableTools,
1745
1815
  unavailablePrivateMcpFeature,
1746
1816
  callToolInner,
1817
+ validateMcpToolOutput,
1747
1818
  },
1748
1819
  };
@@ -7,7 +7,7 @@
7
7
  "npx",
8
8
  "--yes",
9
9
  "--package",
10
- "thumbgate@1.29.2",
10
+ "thumbgate@1.30.0",
11
11
  "thumbgate",
12
12
  "serve"
13
13
  ],
package/bin/cli.js CHANGED
@@ -1185,7 +1185,7 @@ function capture() {
1185
1185
  }
1186
1186
 
1187
1187
  if (args.summary) {
1188
- console.log(feedbackSummary(Number(args.recent || 20)));
1188
+ console.log(feedbackSummary(Number(args.recent || 20), { humanOnly: true }));
1189
1189
  return;
1190
1190
  }
1191
1191
 
@@ -1271,6 +1271,7 @@ function capture() {
1271
1271
  whatWorked: args['what-worked'],
1272
1272
  tags: args.tags,
1273
1273
  gateAction: gateAction || undefined,
1274
+ reviewOrigin: 'human',
1274
1275
  });
1275
1276
 
1276
1277
  if (result.accepted) {
@@ -1386,6 +1387,7 @@ function feedbackSelfTest() {
1386
1387
  ? (args['what-worked'] || 'Feedback capture persisted and was verified by a self-test')
1387
1388
  : undefined,
1388
1389
  tags: args.tags || 'self-test,dogfood,feedback-capture',
1390
+ reviewOrigin: 'automated',
1389
1391
  });
1390
1392
 
1391
1393
  const paths = getFeedbackPaths();
@@ -1444,7 +1446,7 @@ function stats() {
1444
1446
  trackEvent('cli_stats', { command: 'stats' });
1445
1447
  const args = parseArgs(process.argv.slice(3));
1446
1448
  const { analyzeFeedback } = require(path.join(PKG_ROOT, 'scripts', 'feedback-loop'));
1447
- const data = analyzeFeedback();
1449
+ const data = analyzeFeedback(undefined, { humanOnly: true });
1448
1450
 
1449
1451
  // Gate enforcement stats — runtime intercepts + configured gates
1450
1452
  let gateData = { blocked: 0, warned: 0, passed: 0, byGate: {} };
@@ -1761,7 +1763,7 @@ function summary() {
1761
1763
  const args = parseArgs(process.argv.slice(3));
1762
1764
  const { feedbackSummary, analyzeFeedback } = require(path.join(PKG_ROOT, 'scripts', 'feedback-loop'));
1763
1765
  if (args.json) {
1764
- const data = analyzeFeedback();
1766
+ const data = analyzeFeedback(undefined, { humanOnly: true });
1765
1767
  console.log(JSON.stringify({
1766
1768
  total: data.total,
1767
1769
  positives: data.totalPositive,
@@ -1771,7 +1773,7 @@ function summary() {
1771
1773
  }, null, 2));
1772
1774
  return;
1773
1775
  }
1774
- console.log(feedbackSummary(Number(args.recent || 20)));
1776
+ console.log(feedbackSummary(Number(args.recent || 20), { humanOnly: true }));
1775
1777
  }
1776
1778
 
1777
1779
  function lessons() {
@@ -2861,7 +2863,7 @@ function sessionStart() {
2861
2863
  } catch (_) { /* best-effort fallback sync */ }
2862
2864
  const { analyzeFeedback } = require(path.join(PKG_ROOT, 'scripts', 'feedback-loop'));
2863
2865
  const { refreshStatuslineCache } = require(path.join(PKG_ROOT, 'scripts', 'hook-thumbgate-cache-updater'));
2864
- refreshStatuslineCache(analyzeFeedback());
2866
+ refreshStatuslineCache(analyzeFeedback(undefined, { humanOnly: true }));
2865
2867
 
2866
2868
  // Build a top-level <system-reminder> block that Claude Code's SessionStart
2867
2869
  // hook surfaces to the agent as first-class context — not buried stderr.
@@ -46,6 +46,11 @@
46
46
  "detect_noop",
47
47
  "record_action_receipt",
48
48
  "get_action_receipts",
49
+ "record_task_outcome",
50
+ "get_task_outcomes",
51
+ "get_agent_outcome_metrics",
52
+ "request_human_escalation",
53
+ "list_human_escalations",
49
54
  "verify_claim",
50
55
  "check_operational_integrity",
51
56
  "workflow_sentinel",
@@ -73,6 +78,7 @@
73
78
  "run_self_distill",
74
79
  "self_distill_status",
75
80
  "context_stuff_lessons",
81
+ "parallel_workflow",
76
82
  "perplexity_search",
77
83
  "perplexity_ask",
78
84
  "perplexity_research",
@@ -105,6 +111,11 @@
105
111
  "get_branch_governance",
106
112
  "approve_protected_action",
107
113
  "track_action",
114
+ "record_task_outcome",
115
+ "get_task_outcomes",
116
+ "get_agent_outcome_metrics",
117
+ "request_human_escalation",
118
+ "list_human_escalations",
108
119
  "verify_claim",
109
120
  "check_operational_integrity",
110
121
  "workflow_sentinel",
@@ -115,6 +126,7 @@
115
126
  "require_evidence_for_claim",
116
127
  "session_report",
117
128
  "generate_operator_artifact",
129
+ "parallel_workflow",
118
130
  "suggest_fix"
119
131
  ],
120
132
  "commerce": [
@@ -129,6 +141,11 @@
129
141
  "get_branch_governance",
130
142
  "approve_protected_action",
131
143
  "track_action",
144
+ "record_task_outcome",
145
+ "get_task_outcomes",
146
+ "get_agent_outcome_metrics",
147
+ "request_human_escalation",
148
+ "list_human_escalations",
132
149
  "verify_claim",
133
150
  "check_operational_integrity",
134
151
  "workflow_sentinel",
@@ -156,11 +173,12 @@
156
173
  "list_harnesses",
157
174
  "list_intents",
158
175
  "plan_intent",
159
- "start_handoff",
160
- "complete_handoff",
161
176
  "context_provenance",
162
177
  "get_scope_state",
163
178
  "get_branch_governance",
179
+ "get_task_outcomes",
180
+ "get_agent_outcome_metrics",
181
+ "list_human_escalations",
164
182
  "verify_claim",
165
183
  "check_operational_integrity",
166
184
  "workflow_sentinel",
@@ -202,6 +220,9 @@
202
220
  "context_provenance",
203
221
  "get_scope_state",
204
222
  "get_branch_governance",
223
+ "get_task_outcomes",
224
+ "get_agent_outcome_metrics",
225
+ "list_human_escalations",
205
226
  "verify_claim",
206
227
  "check_operational_integrity",
207
228
  "workflow_sentinel",
@@ -237,6 +258,9 @@
237
258
  "list_harnesses",
238
259
  "get_scope_state",
239
260
  "get_branch_governance",
261
+ "get_task_outcomes",
262
+ "get_agent_outcome_metrics",
263
+ "list_human_escalations",
240
264
  "verify_claim",
241
265
  "check_operational_integrity",
242
266
  "workflow_sentinel",
@@ -5,7 +5,7 @@
5
5
  {
6
6
  "route": "/",
7
7
  "sentinel": "Stop AI agent mistakes before they cost you",
8
- "description": "Home page hero (lifeblood never regress)"
8
+ "description": "Home page hero (lifeblood \u2014 never regress)"
9
9
  },
10
10
  {
11
11
  "route": "/pro",
@@ -75,6 +75,31 @@
75
75
  "route": "/leash-beta",
76
76
  "sentinel": "Stop Runaway AI Agents From Freezing Your Machine",
77
77
  "description": "Hermes Mobile founding beta / Leash Pro pricing landing"
78
+ },
79
+ {
80
+ "route": "/whitepaper",
81
+ "sentinel": "How we know ThumbGate works",
82
+ "description": "Evaluation white paper"
83
+ },
84
+ {
85
+ "route": "/architecture",
86
+ "sentinel": "Architecture diagrams",
87
+ "description": "Public diagram gallery"
88
+ },
89
+ {
90
+ "route": "/eval-scorecard",
91
+ "sentinel": "Eval scorecard",
92
+ "description": "ThumbGate Bench scorecard"
93
+ },
94
+ {
95
+ "route": "/evaluations",
96
+ "sentinel": "How We Evaluate",
97
+ "description": "ML evaluation methodology page"
98
+ },
99
+ {
100
+ "route": "/case-studies",
101
+ "sentinel": "Case studies",
102
+ "description": "Dogfood case studies proof page"
78
103
  }
79
104
  ]
80
105
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.29.2",
3
+ "version": "1.30.0",
4
4
  "description": "ThumbGate Pre-Action Checks self-improve from ranked lessons and repeated failures, hard-block detected secret leaks, and block matches in strict mode.",
5
5
  "homepage": "https://thumbgate.ai",
6
6
  "repository": {
@@ -200,6 +200,7 @@
200
200
  "scripts/revenue-action-eligibility.js",
201
201
  "scripts/revenue-evidence-remediation.js",
202
202
  "scripts/reward-hacking-guardrails.js",
203
+ "scripts/model-eval.js",
203
204
  "scripts/risk-scorer.js",
204
205
  "scripts/rlaif-self-audit.js",
205
206
  "scripts/rubric-engine.js",
@@ -249,6 +250,7 @@
249
250
  "scripts/tool-contract-validator.js",
250
251
  "scripts/tool-registry.js",
251
252
  "scripts/task-outcomes.js",
253
+ "scripts/tool-kpi-tracker.js",
252
254
  "scripts/upstream-contribution-engine.js",
253
255
  "scripts/user-profile.js",
254
256
  "scripts/validate-workflow-contract.js",
@@ -313,6 +315,13 @@
313
315
  "public/learn.html",
314
316
  "public/lessons.html",
315
317
  "public/numbers.html",
318
+ "public/assets/diagrams/",
319
+ "public/whitepaper.html",
320
+ "public/evaluations.html",
321
+ "public/eval-scorecard.html",
322
+ "public/eval-scorecard.json",
323
+ "public/case-studies.html",
324
+ "public/architecture.html",
316
325
  "public/partner-intake.html",
317
326
  "public/pricing.html",
318
327
  "public/pro.html",
@@ -324,7 +333,10 @@
324
333
  "public/brand/",
325
334
  "public/js/",
326
335
  "skills/thumbgate/SKILL.md",
327
- "src/"
336
+ "src/",
337
+ "scripts/generate-eval-scorecard.js",
338
+ "scripts/refresh-proof-pack.js",
339
+ "scripts/generate-case-study-outreach.js"
328
340
  ],
329
341
  "scripts": {
330
342
  "canary:snapshot": "node scripts/gate-decision-canary.js --snapshot",
@@ -427,7 +439,7 @@
427
439
  "social:prospect:bluesky": "node scripts/social-bluesky-prospecting.js",
428
440
  "social:prospect:bluesky:dry": "node scripts/social-bluesky-prospecting.js --dry-run",
429
441
  "social:reply-publish:bluesky:dry": "node scripts/social-reply-monitor-bluesky.js --publish-approved --dry-run",
430
- "test": "npm run test:python && npm run test:schema && npm run test:loop && npm run test:dpo && npm run test:kto && npm run test:api && npm run test:proof && npm run test:e2e && npm run test:rlaif && npm run test:attribution && npm run test:quality && npm run test:intelligence && npm run test:training-export && npm run test:deployment && npm run test:operational-integrity && npm run test:workflow && npm run test:grafana-revenue-evidence && npm run test:billing && npm run test:billing-setup && npm run test:cli && npm run test:watcher && npm run test:autoresearch && npm run test:ops && npm run test:session-analyzer && npm run test:tessl && npm run test:canary && npm run test:gates && npm run test:evoskill && npm run test:gates-hardening && npm run test:workers && npm run test:social-analytics && npm run test:memalign && npm run test:xmemory-lite && npm run test:filesystem-search && npm run test:platform-limits && npm run test:post-video && npm run test:post-everywhere-instagram && npm run test:post-everywhere-channels && npm run test:obsidian-export && npm run test:lesson-db && npm run test:lesson-rotation && npm run test:memory-dedup && npm run test:feedback-quality && npm run test:sync-version && npm run test:release-window && npm run test:check-congruence && npm run test:tool-registry && npm run test:repeat-metric && npm run test:noop-detect && npm run test:action-receipts && npm run test:feedback-to-rules && npm run test:memory-firewall && npm run test:memory-scope-readiness && npm run test:belief-update && npm run test:hosted-config && npm run test:operational-summary && npm run test:operational-dashboard && npm run test:operator-artifacts && npm run test:operator-key-auth && npm run test:cloudflare-sandbox && npm run test:mcp-config && npm run test:mcp-tool-annotations && npm run test:mcp-oauth && npm run test:mcp-oauth-flow && npm run test:plan-gate && npm run test:ai-component-inventory && npm run test:verification-evidence && npm run test:pulse && npm run test:semantic-layer && npm run test:data-pipeline && npm run test:optimize-context && npm run test:principle-extractor && npm run test:analytics-window && npm run test:funnel-analytics && npm run test:experiment-tracker && npm run test:build-metadata && npm run test:context-engine && npm run test:hf-papers && npm run test:marketing-experiment && npm run test:seo-gsd && npm run test:verify-run && npm run test:entitlement && npm run test:export-dpo-pairs && npm run test:export-hf-dataset && npm run test:license && npm run test:imperative-detector && npm run test:audit-pr-bot-contamination && npm run test:stripe-bootstrap-saas-catalog && npm run test:postinstall && npm run test:funnel-invariants && npm run test:cli-telemetry && npm run test:pro-parity && npm run test:model-tier-router && npm run test:computer-use-firewall && npm run test:skill-exporter && npm run test:statusline && npm run test:statusline-cache-aggregate && npm run test:public-repo-hygiene && npm run test:no-internal-orchestration-leaks && npm run test:evolution && npm run test:org-dashboard && npm run test:multi-hop-recall && npm run test:synthetic-dpo && npm run test:thumbgate-skill && npm run test:learn-hub && npm run test:feedback-fallback && npm run test:metaclaw && npm run test:server-lock && npm run test:control-tower && npm run test:pii-scanner && npm run test:data-governance && npm run test:lesson-inference && npm run test:semantic-dedup && npm run test:fs-utils && npm run test:cli-schema && npm run test:explore && npm run test:lesson-reranker && npm run test:lesson-retrieval && npm run test:lesson-semantic-retrieval && npm run test:cross-encoder && npm run test:reflector-agent && npm run test:feedback-session && npm run test:feedback-history-distiller && npm run test:hallucination-detector && npm run test:history-distiller && npm run test:predictive-insights && npm run test:predictive-credible-range && npm run test:prove-predictive-insights && npm run test:statusbar-cli && npm run test:generate-instagram-card && npm run test:instagram-thumbgate-post && npm run test:publish-instagram-thumbgate && npm run test:lesson-synthesis && npm run test:lesson-canonical && npm run test:background-governance && npm run test:memory-migration && npm run test:prompt-dlp && npm run test:ephemeral-store && npm run test:agent-security && npm run test:skill-progressive && npm run test:per-step-scoring && npm run test:weekly-auto-post && npm run test:social-post-hourly && npm run test:social-quality-gate && npm run test:a2ui-engine && npm run test:gate-satisfy && npm run test:money-watcher && npm run test:budget && npm run test:quick-start && npm run test:utm && npm run test:product-feedback && npm run test:feedback-root-consolidator && npm run test:engagement-audit && npm run test:install-growth-automation && npm run test:publish-thumbgate-launch && npm run test:reconcile-thumbgate-campaign && npm run test:reddit-publisher && npm run test:schedule-thumbgate-campaign && npm run test:social-reply-monitor && npm run test:sync-launch-assets && npm run test:ai-search-visibility && npm run test:perplexity && npm run test:xss-checkout-escape && npm run test:security-scanner && npm run test:llm-client && npm run test:managed-lesson-agent && npm run test:self-distill && npm run test:meta-agent && npm run test:harness-selector && npm run test:thumbgate-bench && npm run test:seo-guides && npm run test:enforcement-loop && npm run test:cli-agent-experience && npm run test:bot-detection && npm run test:checkout-archived-product-guard && npm run test:postgres-guard && npm run test:checkout-bot-guard && npm run test:checkout-pro-confirmation-gate && npm run test:pricing-page-telemetry && npm run test:session-health && npm run test:session-episodes && npm run test:spec-gate && npm run test:decision-trace && npm run test:dashboard-insights && npm run test:telemetry-tracked-link-slug && npm run test:prompt-eval && npm run test:gate-coherence && npm run test:gate-eval && npm run test:high-roi && npm run test:public-static-assets && npm run test:token-savings && npm run test:numbers-page && npm run test:workflow-gate-checkpoint && npm run test:lesson-export-import && npm run test:landing-page-claims && npm run test:competitive-positioning-marketing && npm run test:medium-weekly && npm run test:dashboard-deeplink-e2e && npm run test:public-package-parity && npm run test:token-savings-dashboard && npm run test:cursor-wiring && npm run test:pretooluse-injection && npm run test:recent-corrective-context && npm run test:durability-step && npm run test:mailer && npm run test:brand-assets && npm run test:enforcement-teeth && npm run test:bayes-optimal-gate && npm run test:swarm-coordinator && npm run test:session-report && npm run test:agent-reasoning-traces && npm run test:judge-reward && npm run test:llm-behavior-monitor && npm run test:prompting-os && npm run test:single-use-credential-gate && npm run test:structured-prompt-driven && npm run test:require-evidence-gate && npm run test:rule-validator && npm run test:bluesky-atproto && npm run test:social-reply-monitor-bluesky && npm run test:bluesky-delete-replies && npm run test:architect-kit-memory-bridge && npm run test:sonar-review-hotspots && npm run test:actionable-remediations && npm run test:gemini-embedding-policy && npm run test:agent-design-governance && npm run test:public-core-boundary && npm run test:hook-stop-verify-deploy && npm run test:hook-stop-anti-claim && npm run test:stop-hook-json-contract && npm run test:plausible-server-events && npm run test:activation-tracker && npm run test:activation-onboarding && npm run test:unified-revenue-rollup && npm run test:conversion-rate-stats && npm run test:external-customer-audit && npm run test:telemetry-export && npm run test:stripe-checkout-diagnostic && npm run test:stripe-business-identity-probe && npm run test:revenue-observability-doctor && npm run test:jsonl-window && npm run test:observability-env && npm run test:public-bundle-ratchet && npm run test:pack-runtime-integrity && npm run test:hook-self-protection && npm run test:self-protect-enforcement && npm run test:never-bypass-branch-protection && npm run test:stripe-payment-link-update && npm run test:ci-cd-hygiene-audit && npm run test:verify-marketing-pages-deployed && npm run test:install-email-capture && npm run test:install-shim && npm run test:hook-runtime-subcommands && npm run test:implementation-notes && npm run test:daily-block-cap && npm run test:free-to-paid-conversion-units && npm run test:metrics-real-endpoint && npm run test:cli-trial-and-help && npm run test:cost-cli && npm run test:silent-failure-cluster && npm run test:proof:truth && node --test tests/adaptive-reliability.test.js && npm run test:mcp-oauth-reviewer && npm run test:dfcx-gate && npm run test:dfcx-gate-server && npm run test:vertex-scorer && npm run test:dashboard-chat && npm run test:gitar-integration && npm run test:secret-redaction && npm run test:discoverable-skills && npm run test:discoverable-skill-skills && npm run test:sync-telemetry && npm run test:leak-scanner && npm run test:team-sync && npm run test:eval-rag && npm run test:async-eval-observability && npm run test:letta-adapter && npm run test:policy-engine-adapter && npm run test:tool-contract-validator && npm run test:check-update && npm run test:hermes-gate && npm run test:memory-provider-enforcement-bridge && npm run test:publisher-credential-guards && npm run test:reddit-browser-notification-watch && npm run test:payment-rails && npm run test:service-checkout-price-integrity && npm run test:cursor-marketplace-doctor && npm run test:plugin-hooks-manifest && npm run test:okara-money-promo-automation",
442
+ "test": "npm run test:python && npm run test:schema && npm run test:loop && npm run test:dpo && npm run test:kto && npm run test:api && npm run test:proof && npm run test:e2e && npm run test:rlaif && npm run test:attribution && npm run test:quality && npm run test:intelligence && npm run test:training-export && npm run test:deployment && npm run test:operational-integrity && npm run test:workflow && npm run test:proof-pack-cadence && npm run test:grafana-revenue-evidence && npm run test:billing && npm run test:billing-setup && npm run test:cli && npm run test:watcher && npm run test:autoresearch && npm run test:ops && npm run test:session-analyzer && npm run test:tessl && npm run test:canary && npm run test:gates && npm run test:evoskill && npm run test:gates-hardening && npm run test:workers && npm run test:social-analytics && npm run test:memalign && npm run test:xmemory-lite && npm run test:filesystem-search && npm run test:platform-limits && npm run test:post-video && npm run test:post-everywhere-instagram && npm run test:post-everywhere-channels && npm run test:obsidian-export && npm run test:lesson-db && npm run test:lesson-rotation && npm run test:memory-dedup && npm run test:feedback-quality && npm run test:sync-version && npm run test:release-window && npm run test:check-congruence && npm run test:tool-registry && npm run test:repeat-metric && npm run test:noop-detect && npm run test:action-receipts && npm run test:feedback-to-rules && npm run test:memory-firewall && npm run test:memory-scope-readiness && npm run test:belief-update && npm run test:hosted-config && npm run test:operational-summary && npm run test:operational-dashboard && npm run test:operator-artifacts && npm run test:operator-key-auth && npm run test:cloudflare-sandbox && npm run test:mcp-config && npm run test:mcp-tool-annotations && npm run test:mcp-oauth && npm run test:mcp-oauth-flow && npm run test:plan-gate && npm run test:ai-component-inventory && npm run test:verification-evidence && npm run test:pulse && npm run test:semantic-layer && npm run test:data-pipeline && npm run test:optimize-context && npm run test:principle-extractor && npm run test:analytics-window && npm run test:funnel-analytics && npm run test:experiment-tracker && npm run test:build-metadata && npm run test:context-engine && npm run test:hf-papers && npm run test:marketing-experiment && npm run test:seo-gsd && npm run test:verify-run && npm run test:entitlement && npm run test:export-dpo-pairs && npm run test:export-hf-dataset && npm run test:license && npm run test:imperative-detector && npm run test:audit-pr-bot-contamination && npm run test:stripe-bootstrap-saas-catalog && npm run test:postinstall && npm run test:funnel-invariants && npm run test:cli-telemetry && npm run test:pro-parity && npm run test:model-tier-router && npm run test:computer-use-firewall && npm run test:skill-exporter && npm run test:statusline && npm run test:statusline-cache-aggregate && npm run test:public-repo-hygiene && npm run test:no-internal-orchestration-leaks && npm run test:evolution && npm run test:org-dashboard && npm run test:multi-hop-recall && npm run test:synthetic-dpo && npm run test:thumbgate-skill && npm run test:learn-hub && npm run test:feedback-fallback && npm run test:metaclaw && npm run test:server-lock && npm run test:control-tower && npm run test:pii-scanner && npm run test:data-governance && npm run test:lesson-inference && npm run test:semantic-dedup && npm run test:fs-utils && npm run test:cli-schema && npm run test:explore && npm run test:lesson-reranker && npm run test:lesson-retrieval && npm run test:lesson-semantic-retrieval && npm run test:cross-encoder && npm run test:reflector-agent && npm run test:feedback-session && npm run test:feedback-history-distiller && npm run test:hallucination-detector && npm run test:history-distiller && npm run test:predictive-insights && npm run test:predictive-credible-range && npm run test:prove-predictive-insights && npm run test:statusbar-cli && npm run test:generate-instagram-card && npm run test:instagram-thumbgate-post && npm run test:publish-instagram-thumbgate && npm run test:lesson-synthesis && npm run test:lesson-canonical && npm run test:background-governance && npm run test:memory-migration && npm run test:prompt-dlp && npm run test:ephemeral-store && npm run test:agent-security && npm run test:skill-progressive && npm run test:per-step-scoring && npm run test:weekly-auto-post && npm run test:social-post-hourly && npm run test:social-quality-gate && npm run test:a2ui-engine && npm run test:gate-satisfy && npm run test:money-watcher && npm run test:budget && npm run test:quick-start && npm run test:utm && npm run test:product-feedback && npm run test:feedback-root-consolidator && npm run test:engagement-audit && npm run test:install-growth-automation && npm run test:publish-thumbgate-launch && npm run test:reconcile-thumbgate-campaign && npm run test:reddit-publisher && npm run test:schedule-thumbgate-campaign && npm run test:social-reply-monitor && npm run test:sync-launch-assets && npm run test:ai-search-visibility && npm run test:perplexity && npm run test:xss-checkout-escape && npm run test:security-scanner && npm run test:llm-client && npm run test:managed-lesson-agent && npm run test:self-distill && npm run test:meta-agent && npm run test:harness-selector && npm run test:thumbgate-bench && npm run test:seo-guides && npm run test:enforcement-loop && npm run test:cli-agent-experience && npm run test:bot-detection && npm run test:checkout-archived-product-guard && npm run test:postgres-guard && npm run test:checkout-bot-guard && npm run test:checkout-pro-confirmation-gate && npm run test:pricing-page-telemetry && npm run test:session-health && npm run test:session-episodes && npm run test:spec-gate && npm run test:decision-trace && npm run test:dashboard-insights && npm run test:telemetry-tracked-link-slug && npm run test:prompt-eval && npm run test:gate-coherence && npm run test:gate-eval && npm run test:high-roi && npm run test:public-static-assets && npm run test:token-savings && npm run test:numbers-page && npm run test:workflow-gate-checkpoint && npm run test:lesson-export-import && npm run test:landing-page-claims && npm run test:competitive-positioning-marketing && npm run test:medium-weekly && npm run test:dashboard-deeplink-e2e && npm run test:public-package-parity && npm run test:token-savings-dashboard && npm run test:cursor-wiring && npm run test:pretooluse-injection && npm run test:recent-corrective-context && npm run test:durability-step && npm run test:mailer && npm run test:brand-assets && npm run test:enforcement-teeth && npm run test:bayes-optimal-gate && npm run test:swarm-coordinator && npm run test:session-report && npm run test:agent-reasoning-traces && npm run test:judge-reward && npm run test:llm-behavior-monitor && npm run test:prompting-os && npm run test:single-use-credential-gate && npm run test:structured-prompt-driven && npm run test:require-evidence-gate && npm run test:rule-validator && npm run test:bluesky-atproto && npm run test:social-reply-monitor-bluesky && npm run test:bluesky-delete-replies && npm run test:architect-kit-memory-bridge && npm run test:sonar-review-hotspots && npm run test:actionable-remediations && npm run test:gemini-embedding-policy && npm run test:agent-design-governance && npm run test:public-core-boundary && npm run test:hook-stop-verify-deploy && npm run test:hook-stop-anti-claim && npm run test:stop-hook-json-contract && npm run test:plausible-server-events && npm run test:activation-tracker && npm run test:activation-onboarding && npm run test:unified-revenue-rollup && npm run test:conversion-rate-stats && npm run test:external-customer-audit && npm run test:telemetry-export && npm run test:stripe-checkout-diagnostic && npm run test:stripe-business-identity-probe && npm run test:revenue-observability-doctor && npm run test:jsonl-window && npm run test:observability-env && npm run test:public-bundle-ratchet && npm run test:pack-runtime-integrity && npm run test:hook-self-protection && npm run test:self-protect-enforcement && npm run test:never-bypass-branch-protection && npm run test:stripe-payment-link-update && npm run test:ci-cd-hygiene-audit && npm run test:verify-marketing-pages-deployed && npm run test:install-email-capture && npm run test:install-shim && npm run test:hook-runtime-subcommands && npm run test:implementation-notes && npm run test:daily-block-cap && npm run test:free-to-paid-conversion-units && npm run test:metrics-real-endpoint && npm run test:cli-trial-and-help && npm run test:cost-cli && npm run test:silent-failure-cluster && npm run test:proof:truth && node --test tests/adaptive-reliability.test.js && npm run test:mcp-oauth-reviewer && npm run test:dfcx-gate && npm run test:dfcx-gate-server && npm run test:vertex-scorer && npm run test:dashboard-chat && npm run test:gitar-integration && npm run test:secret-redaction && npm run test:discoverable-skills && npm run test:discoverable-skill-skills && npm run test:sync-telemetry && npm run test:leak-scanner && npm run test:team-sync && npm run test:eval-rag && npm run test:async-eval-observability && npm run test:letta-adapter && npm run test:policy-engine-adapter && npm run test:tool-contract-validator && npm run test:check-update && npm run test:hermes-gate && npm run test:memory-provider-enforcement-bridge && npm run test:publisher-credential-guards && npm run test:reddit-browser-notification-watch && npm run test:payment-rails && npm run test:service-checkout-price-integrity && npm run test:cursor-marketplace-doctor && npm run test:plugin-hooks-manifest && npm run test:okara-money-promo-automation && npm run test:retrieval-window && npm run test:risk-quality && npm run test:eval-mining && npm run test:state-backup && npm run test:eval-golden && npm run test:task-scope-lease",
431
443
  "test:python": "python3 -m pytest tests/*.py",
432
444
  "test:check-update": "node --test tests/check-update.test.js",
433
445
  "test:hook-stop-verify-deploy": "node --test tests/hook-stop-verify-deploy.test.js",
@@ -566,7 +578,7 @@
566
578
  "test:training-export": "node --test tests/training-export.test.js tests/databricks-export.test.js",
567
579
  "test:deployment": "node --test tests/deployment.test.js tests/deploy-policy.test.js tests/publish-decision.test.js tests/changeset-check.test.js tests/release-notes.test.js tests/sonarcloud-workflow.test.js tests/package-boundary.test.js tests/public-package-boundary.test.js tests/packed-feedback-retrieval-e2e.test.js tests/packed-provider-payment-reconciler-e2e.test.js tests/packed-revenue-remediation-e2e.test.js",
568
580
  "test:operational-integrity": "node --test tests/operational-integrity.test.js tests/sync-branch-protection.test.js",
569
- "test:workflow": "node --test tests/parallel-workflow.test.js tests/workflow-contract.test.js tests/positioning-contract.test.js tests/docs-claim-hygiene.test.js tests/thumbgate-scope.test.js tests/workflow-runs.test.js tests/workflow-sprint-intake.test.js tests/workflow-intake-queue.test.js tests/revenue-pack-utils.test.js tests/apollo-acquisition.test.js tests/sales-pipeline.test.js tests/provider-payment-reconciler.test.js tests/reddit-dm-outreach-evidence.test.js tests/gtm-sales-evidence-commands.test.js tests/revenue-action-eligibility.test.js tests/revenue-evidence-remediation.test.js tests/gtm-revenue-action-eligibility.test.js tests/revenue-offer-ladder.test.js tests/revenue-offer-system.test.js tests/buyer-paths.test.js tests/github-outreach.test.js tests/enterprise-story.test.js tests/guide-conversion-path.test.js tests/buyer-intent-revenue-assist.test.js",
581
+ "test:workflow": "node --test tests/parallel-workflow.test.js tests/parallel-workflow-public.test.js tests/workflow-contract.test.js tests/positioning-contract.test.js tests/docs-claim-hygiene.test.js tests/thumbgate-scope.test.js tests/workflow-runs.test.js tests/workflow-sprint-intake.test.js tests/workflow-intake-queue.test.js tests/revenue-pack-utils.test.js tests/apollo-acquisition.test.js tests/sales-pipeline.test.js tests/provider-payment-reconciler.test.js tests/reddit-dm-outreach-evidence.test.js tests/gtm-sales-evidence-commands.test.js tests/revenue-action-eligibility.test.js tests/revenue-evidence-remediation.test.js tests/gtm-revenue-action-eligibility.test.js tests/revenue-offer-ladder.test.js tests/revenue-offer-system.test.js tests/buyer-paths.test.js tests/github-outreach.test.js tests/enterprise-story.test.js tests/guide-conversion-path.test.js tests/buyer-intent-revenue-assist.test.js && node --test tests/eval-proof-pack-pages.test.js && npm run test:proof-pack-cadence",
570
582
  "test:revenue-evidence-remediation": "node --test tests/revenue-evidence-remediation.test.js",
571
583
  "test:grafana-revenue-evidence": "node --test tests/grafana-revenue-evidence.test.js",
572
584
  "test:sales-pipeline": "node --test tests/sales-pipeline.test.js tests/provider-payment-reconciler.test.js tests/reddit-dm-outreach-evidence.test.js tests/gtm-sales-evidence-commands.test.js",
@@ -655,7 +667,7 @@
655
667
  "test:control-tower": "node --test tests/control-tower.test.js",
656
668
  "test:pii-scanner": "node --test tests/pii-scanner.test.js",
657
669
  "test:data-governance": "node --test tests/data-governance.test.js",
658
- "test:lesson-inference": "node --test tests/conversation-context.test.js tests/lesson-inference.test.js tests/lesson-prompt-shape.test.js",
670
+ "test:lesson-inference": "node --test tests/conversation-context.test.js tests/lesson-inference.test.js tests/lesson-prompt-shape.test.js tests/lesson-stats-review-origin.test.js",
659
671
  "test:lesson-retrieval": "node --test tests/lesson-retrieval.test.js",
660
672
  "test:lesson-semantic-retrieval": "node --test tests/lesson-semantic-retrieval.test.js",
661
673
  "test:cross-encoder": "node --test tests/cross-encoder-reranker.test.js",
@@ -696,6 +708,7 @@
696
708
  "social:publish:latest-release-article": "node scripts/social-analytics/publish-latest-release-article.js",
697
709
  "social:publish:latest-release-fallbacks": "node scripts/social-analytics/publish-latest-release-fallbacks.js",
698
710
  "social:verify:latest-release": "node scripts/social-analytics/verify-latest-release-posts.js",
711
+ "social:verify:marketing-agent": "node scripts/social-analytics/verify-marketing-agent-campaign.js",
699
712
  "social:schedule:campaign": "node scripts/social-analytics/schedule-thumbgate-campaign.js",
700
713
  "social:install:growth": "node scripts/social-analytics/install-growth-automation.js",
701
714
  "social:reconcile:campaign": "node scripts/social-analytics/reconcile-thumbgate-campaign.js",
@@ -838,7 +851,25 @@
838
851
  "observability:setup": "node scripts/observability-setup.js",
839
852
  "observability:doctor": "node scripts/revenue-observability-doctor.js",
840
853
  "test:jsonl-window": "node --test tests/jsonl-window.test.js",
841
- "test:observability-env": "node --test tests/observability-env.test.js"
854
+ "test:observability-env": "node --test tests/observability-env.test.js",
855
+ "test:retrieval-window": "node --test tests/lesson-retrieval-recency-window.test.js",
856
+ "eval:risk": "node scripts/eval-risk-model.js",
857
+ "test:risk-quality": "node --test tests/risk-model-quality.test.js tests/model-eval.test.js",
858
+ "state:backup": "node scripts/state-backup.js",
859
+ "state:backup:verify": "node scripts/state-backup.js --verify",
860
+ "state:restore": "node scripts/state-backup.js --restore",
861
+ "test:state-backup": "node --test tests/state-backup.test.js",
862
+ "eval:mine": "node scripts/mine-eval-set.js",
863
+ "eval:baseline": "node scripts/eval-baseline.js",
864
+ "test:eval-golden": "node --test tests/gate-golden-set.test.js",
865
+ "test:eval-mining": "node --test tests/mine-eval-set.test.js tests/eval-baseline.test.js",
866
+ "test:task-scope-lease": "node --test tests/task-scope-lease.test.js",
867
+ "eval-scorecard:generate": "node scripts/generate-eval-scorecard.js",
868
+ "proof-pack:refresh": "node scripts/refresh-proof-pack.js --write",
869
+ "proof-pack:refresh:check": "node scripts/refresh-proof-pack.js --check",
870
+ "proof-pack:schedule": "node scripts/schedule-manager.js install --label proof-pack-scorecard --spec 'daily 06:15' --command 'npm run proof-pack:refresh' --workingDirectory .",
871
+ "outreach:case-study": "node scripts/generate-case-study-outreach.js",
872
+ "test:proof-pack-cadence": "node --test tests/refresh-proof-pack.test.js tests/case-study-outreach.test.js"
842
873
  },
843
874
  "keywords": [
844
875
  "mcp",
@@ -922,7 +953,7 @@
922
953
  "@changesets/changelog-github": "^0.7.0",
923
954
  "@changesets/cli": "^2.31.0",
924
955
  "@playwright/test": "^1.60.0",
925
- "c8": "^11.0.0",
956
+ "c8": "^12.0.0",
926
957
  "undici": "^8.5.0"
927
958
  },
928
959
  "hotfix": "gate-check-bypass-2026-06-03"