jev-recipes 0.6.1 → 0.7.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 (74) hide show
  1. package/README.md +57 -11
  2. package/dist/catalog/generated/details/completion-gate.json +110 -0
  3. package/dist/catalog/generated/details/context-prune.json +59 -0
  4. package/dist/catalog/generated/details/diff-hazards.json +112 -0
  5. package/dist/catalog/generated/details/model-route.json +82 -0
  6. package/dist/catalog/generated/details/route-many.json +68 -0
  7. package/dist/catalog/generated/details/tool-call-gate.json +123 -0
  8. package/dist/catalog/generated/details/wake-gate.json +40 -0
  9. package/dist/catalog/generated/loaders.js +7 -0
  10. package/dist/catalog/generated/metadata.js +217 -14
  11. package/dist/catalog/generated/names.d.ts +1 -1
  12. package/dist/catalog/generated/names.js +7 -0
  13. package/dist/catalog/schema.d.ts +7 -0
  14. package/dist/cli/schema.d.ts +21 -0
  15. package/dist/recipes/cancellation-check/schema.d.ts +6 -6
  16. package/dist/recipes/clarify/index.js +2 -2
  17. package/dist/recipes/completion-gate/demo.json +29 -0
  18. package/dist/recipes/completion-gate/index.d.ts +5 -0
  19. package/dist/recipes/completion-gate/index.js +53 -0
  20. package/dist/recipes/completion-gate/schema.d.ts +103 -0
  21. package/dist/recipes/completion-gate/schema.js +33 -0
  22. package/dist/recipes/context-prune/demo.json +40 -0
  23. package/dist/recipes/context-prune/index.d.ts +5 -0
  24. package/dist/recipes/context-prune/index.js +42 -0
  25. package/dist/recipes/context-prune/schema.d.ts +58 -0
  26. package/dist/recipes/context-prune/schema.js +23 -0
  27. package/dist/recipes/diff-hazards/demo.json +18 -0
  28. package/dist/recipes/diff-hazards/index.d.ts +5 -0
  29. package/dist/recipes/diff-hazards/index.js +48 -0
  30. package/dist/recipes/diff-hazards/schema.d.ts +96 -0
  31. package/dist/recipes/diff-hazards/schema.js +24 -0
  32. package/dist/recipes/extraction-fidelity/schema.d.ts +2 -2
  33. package/dist/recipes/handoff/schema.d.ts +1 -1
  34. package/dist/recipes/model-route/demo.json +45 -0
  35. package/dist/recipes/model-route/index.d.ts +5 -0
  36. package/dist/recipes/model-route/index.js +35 -0
  37. package/dist/recipes/model-route/schema.d.ts +51 -0
  38. package/dist/recipes/model-route/schema.js +16 -0
  39. package/dist/recipes/mood-match/schema.d.ts +2 -2
  40. package/dist/recipes/performance-feedback-facets/demo.json +1 -1
  41. package/dist/recipes/performance-feedback-facets/index.js +2 -2
  42. package/dist/recipes/product-match/schema.d.ts +2 -2
  43. package/dist/recipes/route-many/demo.json +53 -0
  44. package/dist/recipes/route-many/index.d.ts +5 -0
  45. package/dist/recipes/route-many/index.js +48 -0
  46. package/dist/recipes/route-many/schema.d.ts +49 -0
  47. package/dist/recipes/route-many/schema.js +30 -0
  48. package/dist/recipes/sound-match/schema.d.ts +2 -2
  49. package/dist/recipes/step-complete/demo.json +1 -1
  50. package/dist/recipes/step-complete/index.js +2 -2
  51. package/dist/recipes/symptom-facets/demo.json +1 -1
  52. package/dist/recipes/symptom-facets/index.js +3 -3
  53. package/dist/recipes/tool-call-gate/demo.json +26 -0
  54. package/dist/recipes/tool-call-gate/index.d.ts +5 -0
  55. package/dist/recipes/tool-call-gate/index.js +67 -0
  56. package/dist/recipes/tool-call-gate/schema.d.ts +134 -0
  57. package/dist/recipes/tool-call-gate/schema.js +34 -0
  58. package/dist/recipes/trip-purpose-kind/schema.d.ts +3 -3
  59. package/dist/recipes/verify/index.js +4 -3
  60. package/dist/recipes/wake-gate/demo.json +20 -0
  61. package/dist/recipes/wake-gate/index.d.ts +5 -0
  62. package/dist/recipes/wake-gate/index.js +16 -0
  63. package/dist/recipes/wake-gate/schema.d.ts +40 -0
  64. package/dist/recipes/wake-gate/schema.js +15 -0
  65. package/dist/src/answers.js +10 -4
  66. package/dist/src/batch.d.ts +12 -0
  67. package/dist/src/batch.js +23 -0
  68. package/dist/src/fanout.d.ts +20 -0
  69. package/dist/src/fanout.js +39 -0
  70. package/dist/src/index.d.ts +14 -0
  71. package/dist/src/index.js +7 -0
  72. package/dist/src/selection.d.ts +18 -0
  73. package/dist/src/selection.js +41 -11
  74. package/package.json +34 -3
@@ -0,0 +1,123 @@
1
+ {
2
+ "inputSchema": {
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "type": "object",
5
+ "properties": {
6
+ "request": { "type": "string" },
7
+ "toolCall": { "type": "string" },
8
+ "context": { "type": "string" },
9
+ "policy": { "type": "string" },
10
+ "minConfidence": { "type": "number", "minimum": 0, "maximum": 1 }
11
+ },
12
+ "required": ["request", "toolCall"]
13
+ },
14
+ "resultSchema": {
15
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
16
+ "type": "object",
17
+ "properties": {
18
+ "model": { "type": "string" },
19
+ "usage": {
20
+ "type": "object",
21
+ "properties": {
22
+ "input_tokens": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
23
+ "output_tokens": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
24
+ },
25
+ "required": ["input_tokens", "output_tokens"],
26
+ "additionalProperties": false
27
+ },
28
+ "status": { "type": "string", "enum": ["ready", "review"] },
29
+ "verdict": { "type": "string", "enum": ["allow", "ask", "deny", "unclear"] },
30
+ "suggestedAction": { "type": "string", "enum": ["allow", "ask", "deny"] },
31
+ "action": { "type": "string", "enum": ["allow", "ask", "deny"] },
32
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 },
33
+ "probabilities": {
34
+ "type": "object",
35
+ "propertyNames": { "type": "string", "enum": ["allow", "ask", "deny", "unclear"] },
36
+ "additionalProperties": { "type": "number", "minimum": 0, "maximum": 1 },
37
+ "required": ["allow", "ask", "deny", "unclear"]
38
+ },
39
+ "risks": {
40
+ "type": "object",
41
+ "properties": {
42
+ "irreversible": {
43
+ "type": "object",
44
+ "properties": {
45
+ "status": { "type": "string", "enum": ["ready", "review"] },
46
+ "verdict": { "type": "string", "enum": ["present", "absent"] },
47
+ "probability": { "type": "number", "minimum": 0, "maximum": 1 },
48
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 }
49
+ },
50
+ "required": ["status", "verdict", "probability", "confidence"],
51
+ "additionalProperties": false
52
+ },
53
+ "destructive": {
54
+ "type": "object",
55
+ "properties": {
56
+ "status": { "type": "string", "enum": ["ready", "review"] },
57
+ "verdict": { "type": "string", "enum": ["present", "absent"] },
58
+ "probability": { "type": "number", "minimum": 0, "maximum": 1 },
59
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 }
60
+ },
61
+ "required": ["status", "verdict", "probability", "confidence"],
62
+ "additionalProperties": false
63
+ },
64
+ "outOfScope": {
65
+ "type": "object",
66
+ "properties": {
67
+ "status": { "type": "string", "enum": ["ready", "review"] },
68
+ "verdict": { "type": "string", "enum": ["present", "absent"] },
69
+ "probability": { "type": "number", "minimum": 0, "maximum": 1 },
70
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 }
71
+ },
72
+ "required": ["status", "verdict", "probability", "confidence"],
73
+ "additionalProperties": false
74
+ },
75
+ "exfiltrates": {
76
+ "type": "object",
77
+ "properties": {
78
+ "status": { "type": "string", "enum": ["ready", "review"] },
79
+ "verdict": { "type": "string", "enum": ["present", "absent"] },
80
+ "probability": { "type": "number", "minimum": 0, "maximum": 1 },
81
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 }
82
+ },
83
+ "required": ["status", "verdict", "probability", "confidence"],
84
+ "additionalProperties": false
85
+ },
86
+ "injected": {
87
+ "type": "object",
88
+ "properties": {
89
+ "status": { "type": "string", "enum": ["ready", "review"] },
90
+ "verdict": { "type": "string", "enum": ["present", "absent"] },
91
+ "probability": { "type": "number", "minimum": 0, "maximum": 1 },
92
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 }
93
+ },
94
+ "required": ["status", "verdict", "probability", "confidence"],
95
+ "additionalProperties": false
96
+ }
97
+ },
98
+ "required": ["irreversible", "destructive", "outOfScope", "exfiltrates", "injected"],
99
+ "additionalProperties": false
100
+ },
101
+ "detected": {
102
+ "type": "array",
103
+ "items": {
104
+ "type": "string",
105
+ "enum": ["irreversible", "destructive", "outOfScope", "exfiltrates", "injected"]
106
+ }
107
+ }
108
+ },
109
+ "required": [
110
+ "model",
111
+ "usage",
112
+ "status",
113
+ "verdict",
114
+ "suggestedAction",
115
+ "action",
116
+ "confidence",
117
+ "probabilities",
118
+ "risks",
119
+ "detected"
120
+ ],
121
+ "additionalProperties": false
122
+ }
123
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "inputSchema": {
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "type": "object",
5
+ "properties": {
6
+ "waitingFor": { "type": "string" },
7
+ "event": { "type": "string" },
8
+ "context": { "type": "string" },
9
+ "minConfidence": { "type": "number", "minimum": 0, "maximum": 1 }
10
+ },
11
+ "required": ["waitingFor", "event"]
12
+ },
13
+ "resultSchema": {
14
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15
+ "type": "object",
16
+ "properties": {
17
+ "model": { "type": "string" },
18
+ "usage": {
19
+ "type": "object",
20
+ "properties": {
21
+ "input_tokens": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
22
+ "output_tokens": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }
23
+ },
24
+ "required": ["input_tokens", "output_tokens"],
25
+ "additionalProperties": false
26
+ },
27
+ "status": { "type": "string", "enum": ["ready", "review"] },
28
+ "verdict": { "type": "string", "enum": ["wake", "not_yet", "unrelated", "unclear"] },
29
+ "confidence": { "type": "number", "minimum": 0, "maximum": 1 },
30
+ "probabilities": {
31
+ "type": "object",
32
+ "propertyNames": { "type": "string", "enum": ["wake", "not_yet", "unrelated", "unclear"] },
33
+ "additionalProperties": { "type": "number", "minimum": 0, "maximum": 1 },
34
+ "required": ["wake", "not_yet", "unrelated", "unclear"]
35
+ }
36
+ },
37
+ "required": ["model", "usage", "status", "verdict", "confidence", "probabilities"],
38
+ "additionalProperties": false
39
+ }
40
+ }
@@ -46,12 +46,14 @@ export const recipeLoaders = {
46
46
  'commit-message-fit': () => import('../../recipes/commit-message-fit/index.js').then((recipe) => (input, options) => recipe.commitMessageFit(recipe.commitMessageFitInputSchema.parse(input), options)),
47
47
  'commitment-strength': () => import('../../recipes/commitment-strength/index.js').then((recipe) => (input, options) => recipe.commitmentStrength(recipe.commitmentStrengthInputSchema.parse(input), options)),
48
48
  'comparable-fit': () => import('../../recipes/comparable-fit/index.js').then((recipe) => (input, options) => recipe.comparableFit(recipe.comparableFitInputSchema.parse(input), options)),
49
+ 'completion-gate': () => import('../../recipes/completion-gate/index.js').then((recipe) => (input, options) => recipe.completionGate(recipe.completionGateInputSchema.parse(input), options)),
49
50
  'confirmation-match': () => import('../../recipes/confirmation-match/index.js').then((recipe) => (input, options) => recipe.confirmationMatch(recipe.confirmationMatchInputSchema.parse(input), options)),
50
51
  'consent-request': () => import('../../recipes/consent-request/index.js').then((recipe) => (input, options) => recipe.consentRequest(recipe.consentRequestInputSchema.parse(input), options)),
51
52
  'consent-scope-fit': () => import('../../recipes/consent-scope-fit/index.js').then((recipe) => (input, options) => recipe.consentScopeFit(recipe.consentScopeFitInputSchema.parse(input), options)),
52
53
  'constraint-strength': () => import('../../recipes/constraint-strength/index.js').then((recipe) => (input, options) => recipe.constraintStrength(recipe.constraintStrengthInputSchema.parse(input), options)),
53
54
  'content-facets': () => import('../../recipes/content-facets/index.js').then((recipe) => (input, options) => recipe.contentFacets(recipe.contentFacetsInputSchema.parse(input), options)),
54
55
  'content-freshness-signal': () => import('../../recipes/content-freshness-signal/index.js').then((recipe) => (input, options) => recipe.contentFreshnessSignal(recipe.contentFreshnessSignalInputSchema.parse(input), options)),
56
+ 'context-prune': () => import('../../recipes/context-prune/index.js').then((recipe) => (input, options) => recipe.contextPrune(recipe.contextPruneInputSchema.parse(input), options)),
55
57
  'context-role': () => import('../../recipes/context-role/index.js').then((recipe) => (input, options) => recipe.contextRole(recipe.contextRoleInputSchema.parse(input), options)),
56
58
  'continuation-compare': () => import('../../recipes/continuation-compare/index.js').then((recipe) => (input, options) => recipe.continuationCompare(recipe.continuationCompareInputSchema.parse(input), options)),
57
59
  'correction-target': () => import('../../recipes/correction-target/index.js').then((recipe) => (input, options) => recipe.correctionTarget(recipe.correctionTargetInputSchema.parse(input), options)),
@@ -60,6 +62,7 @@ export const recipeLoaders = {
60
62
  'deadline-risk': () => import('../../recipes/deadline-risk/index.js').then((recipe) => (input, options) => recipe.deadlineRisk(recipe.deadlineRiskInputSchema.parse(input), options)),
61
63
  'defect-report-facets': () => import('../../recipes/defect-report-facets/index.js').then((recipe) => (input, options) => recipe.defectReportFacets(recipe.defectReportFacetsInputSchema.parse(input), options)),
62
64
  'delegation-fit': () => import('../../recipes/delegation-fit/index.js').then((recipe) => (input, options) => recipe.delegationFit(recipe.delegationFitInputSchema.parse(input), options)),
65
+ 'diff-hazards': () => import('../../recipes/diff-hazards/index.js').then((recipe) => (input, options) => recipe.diffHazards(recipe.diffHazardsInputSchema.parse(input), options)),
63
66
  'disclosure-facets': () => import('../../recipes/disclosure-facets/index.js').then((recipe) => (input, options) => recipe.disclosureFacets(recipe.disclosureFacetsInputSchema.parse(input), options)),
64
67
  'dispute-kind': () => import('../../recipes/dispute-kind/index.js').then((recipe) => (input, options) => recipe.disputeKind(recipe.disputeKindInputSchema.parse(input), options)),
65
68
  'document-role': () => import('../../recipes/document-role/index.js').then((recipe) => (input, options) => recipe.documentRole(recipe.documentRoleInputSchema.parse(input), options)),
@@ -133,6 +136,7 @@ export const recipeLoaders = {
133
136
  'memory-value': () => import('../../recipes/memory-value/index.js').then((recipe) => (input, options) => recipe.memoryValue(recipe.memoryValueInputSchema.parse(input), options)),
134
137
  'message-facets': () => import('../../recipes/message-facets/index.js').then((recipe) => (input, options) => recipe.messageFacets(recipe.messageFacetsInputSchema.parse(input), options)),
135
138
  'methods-facets': () => import('../../recipes/methods-facets/index.js').then((recipe) => (input, options) => recipe.methodsFacets(recipe.methodsFacetsInputSchema.parse(input), options)),
139
+ 'model-route': () => import('../../recipes/model-route/index.js').then((recipe) => (input, options) => recipe.modelRoute(recipe.modelRouteInputSchema.parse(input), options)),
136
140
  'modulation-moment': () => import('../../recipes/modulation-moment/index.js').then((recipe) => (input, options) => recipe.modulationMoment(recipe.modulationMomentInputSchema.parse(input), options)),
137
141
  'mood-match': () => import('../../recipes/mood-match/index.js').then((recipe) => (input, options) => recipe.moodMatch(recipe.moodMatchInputSchema.parse(input), options)),
138
142
  'mood-request': () => import('../../recipes/mood-request/index.js').then((recipe) => (input, options) => recipe.moodRequest(recipe.moodRequestInputSchema.parse(input), options)),
@@ -198,6 +202,7 @@ export const recipeLoaders = {
198
202
  'rollback-signal': () => import('../../recipes/rollback-signal/index.js').then((recipe) => (input, options) => recipe.rollbackSignal(recipe.rollbackSignalInputSchema.parse(input), options)),
199
203
  'root-cause-depth': () => import('../../recipes/root-cause-depth/index.js').then((recipe) => (input, options) => recipe.rootCauseDepth(recipe.rootCauseDepthInputSchema.parse(input), options)),
200
204
  route: () => import('../../recipes/route/index.js').then((recipe) => (input, options) => recipe.route(recipe.routeInputSchema.parse(input), options)),
205
+ 'route-many': () => import('../../recipes/route-many/index.js').then((recipe) => (input, options) => recipe.routeMany(recipe.routeManyInputSchema.parse(input), options)),
201
206
  'rule-compliance': () => import('../../recipes/rule-compliance/index.js').then((recipe) => (input, options) => recipe.ruleCompliance(recipe.ruleComplianceInputSchema.parse(input), options)),
202
207
  'runbook-fit': () => import('../../recipes/runbook-fit/index.js').then((recipe) => (input, options) => recipe.runbookFit(recipe.runbookFitInputSchema.parse(input), options)),
203
208
  'safety-incident-kind': () => import('../../recipes/safety-incident-kind/index.js').then((recipe) => (input, options) => recipe.safetyIncidentKind(recipe.safetyIncidentKindInputSchema.parse(input), options)),
@@ -225,6 +230,7 @@ export const recipeLoaders = {
225
230
  'tension-level': () => import('../../recipes/tension-level/index.js').then((recipe) => (input, options) => recipe.tensionLevel(recipe.tensionLevelInputSchema.parse(input), options)),
226
231
  'ticket-match': () => import('../../recipes/ticket-match/index.js').then((recipe) => (input, options) => recipe.ticketMatch(recipe.ticketMatchInputSchema.parse(input), options)),
227
232
  'tone-check': () => import('../../recipes/tone-check/index.js').then((recipe) => (input, options) => recipe.toneCheck(recipe.toneCheckInputSchema.parse(input), options)),
233
+ 'tool-call-gate': () => import('../../recipes/tool-call-gate/index.js').then((recipe) => (input, options) => recipe.toolCallGate(recipe.toolCallGateInputSchema.parse(input), options)),
228
234
  'tool-compare': () => import('../../recipes/tool-compare/index.js').then((recipe) => (input, options) => recipe.toolCompare(recipe.toolCompareInputSchema.parse(input), options)),
229
235
  'tool-fit': () => import('../../recipes/tool-fit/index.js').then((recipe) => (input, options) => recipe.toolFit(recipe.toolFitInputSchema.parse(input), options)),
230
236
  'topic-shift': () => import('../../recipes/topic-shift/index.js').then((recipe) => (input, options) => recipe.topicShift(recipe.topicShiftInputSchema.parse(input), options)),
@@ -234,5 +240,6 @@ export const recipeLoaders = {
234
240
  'uncertainty-expression': () => import('../../recipes/uncertainty-expression/index.js').then((recipe) => (input, options) => recipe.uncertaintyExpression(recipe.uncertaintyExpressionInputSchema.parse(input), options)),
235
241
  'urgency-signal': () => import('../../recipes/urgency-signal/index.js').then((recipe) => (input, options) => recipe.urgencySignal(recipe.urgencySignalInputSchema.parse(input), options)),
236
242
  verify: () => import('../../recipes/verify/index.js').then((recipe) => (input, options) => recipe.verify(recipe.verifyInputSchema.parse(input), options)),
243
+ 'wake-gate': () => import('../../recipes/wake-gate/index.js').then((recipe) => (input, options) => recipe.wakeGate(recipe.wakeGateInputSchema.parse(input), options)),
237
244
  'workaround-fit': () => import('../../recipes/workaround-fit/index.js').then((recipe) => (input, options) => recipe.workaroundFit(recipe.workaroundFitInputSchema.parse(input), options)),
238
245
  };
@@ -26,7 +26,7 @@ export const recipeMetadata = [
26
26
  title: 'Label the side effects of an action',
27
27
  description: 'Which side effects does the described action involve: writing or modifying data, sending a message or notification, spending or moving money, deleting something, or calling an external service?',
28
28
  category: 'workflow',
29
- tags: ['agent', 'safety', 'action', 'side-effects', 'approval', 'labels'],
29
+ tags: ['agent', 'safety', 'action', 'side-effects', 'approval', 'labels', 'harness'],
30
30
  limitations: [
31
31
  'Labels the effects the action description states or plainly entails. It does not know what your tools actually do behind the description.',
32
32
  'Read-only lookups against an external API still count as external calls; whether that is acceptable is a policy decision for application code.',
@@ -49,7 +49,7 @@ export const recipeMetadata = [
49
49
  title: 'Grade action reversibility',
50
50
  description: 'How reversible is action, given any context, from a trivial undo to an irreversible external effect?',
51
51
  category: 'workflow',
52
- tags: ['agent', 'safety', 'action', 'reversibility', 'approval'],
52
+ tags: ['agent', 'safety', 'action', 'reversibility', 'approval', 'harness'],
53
53
  limitations: [
54
54
  'Grades the action as described. It does not know which undo, backup, or recall facilities your system actually provides unless context says so.',
55
55
  'Reversibility is not permission. An irreversible action may be exactly what the user asked for, and a trivial one may still be out of scope.',
@@ -67,7 +67,7 @@ export const recipeMetadata = [
67
67
  title: 'Check proposed action scope',
68
68
  description: 'Is proposedAction within the work requested in request and constraints?',
69
69
  category: 'workflow',
70
- tags: ['workflow', 'action', 'scope'],
70
+ tags: ['workflow', 'action', 'scope', 'harness'],
71
71
  limitations: [
72
72
  'Assesses semantic scope only. User authorization and access controls must be enforced by the application.',
73
73
  ],
@@ -1038,6 +1038,32 @@ export const recipeMetadata = [
1038
1038
  },
1039
1039
  ],
1040
1040
  },
1041
+ {
1042
+ id: 'completion-gate',
1043
+ title: 'Gate an agent claiming it is done',
1044
+ description: 'Did an agent finish task, judging report against evidence, with unproven claims, quietly narrowed scope, open questions, and unresolved errors flagged in the same call?',
1045
+ category: 'workflow',
1046
+ tags: ['agent', 'completion', 'stop-hook', 'verification', 'evidence', 'harness', 'done'],
1047
+ limitations: [
1048
+ 'Judges only the supplied report and evidence. It does not run tests or inspect the repository; supply that output in evidence.',
1049
+ 'A complete verdict means the supplied material shows the task done, not that the work is correct or well made.',
1050
+ ],
1051
+ useWhen: 'A coding agent says it is finished and you must decide, before accepting or before letting it stop, whether the work is actually complete.',
1052
+ related: [
1053
+ {
1054
+ id: 'step-complete',
1055
+ reason: 'Use step-complete to check one explicit completion condition against evidence.',
1056
+ },
1057
+ {
1058
+ id: 'goal-drift',
1059
+ reason: 'Use goal-drift while the agent is still working to catch a step that wanders from the goal.',
1060
+ },
1061
+ {
1062
+ id: 'result-plausibility',
1063
+ reason: 'Use result-plausibility to check whether a single tool result is a real answer.',
1064
+ },
1065
+ ],
1066
+ },
1041
1067
  {
1042
1068
  id: 'confirmation-match',
1043
1069
  title: 'Interpret a confirmation',
@@ -1179,6 +1205,33 @@ export const recipeMetadata = [
1179
1205
  },
1180
1206
  ],
1181
1207
  },
1208
+ {
1209
+ id: 'context-prune',
1210
+ title: 'Prune agent context',
1211
+ description: 'Which of items, earlier tool results and messages in an agent session, are still needed to finish objective, so the rest can be dropped from context?',
1212
+ category: 'memory',
1213
+ tags: ['agent', 'context', 'compaction', 'prune', 'memory', 'tool-results', 'harness'],
1214
+ limitations: [
1215
+ 'Judges each item on its own text and the stated objective. It cannot see dependencies between items unless their text makes them explicit.',
1216
+ 'Uncertain items stay in keep. A short objective that hides what the agent still has to do makes most items look unnecessary; state the remaining work concretely.',
1217
+ 'Accepts up to 50 items per call. Chunk longer histories and pass recent so later chunks know what was already handled.',
1218
+ ],
1219
+ useWhen: 'An agent session is growing long and you want to drop stale tool output and messages before the next model turn without summarizing what must stay verbatim.',
1220
+ related: [
1221
+ {
1222
+ id: 'rerank',
1223
+ reason: 'Use rerank to order passages by relevance to a query rather than decide what an agent still needs.',
1224
+ },
1225
+ {
1226
+ id: 'memory-value',
1227
+ reason: 'Use memory-value to decide whether a fact is worth storing long term.',
1228
+ },
1229
+ {
1230
+ id: 'progress-stall',
1231
+ reason: 'Use progress-stall to detect an agent that keeps reprocessing the same context.',
1232
+ },
1233
+ ],
1234
+ },
1182
1235
  {
1183
1236
  id: 'context-role',
1184
1237
  title: 'Identify a passage role',
@@ -1329,7 +1382,7 @@ export const recipeMetadata = [
1329
1382
  title: 'Check delegation fit',
1330
1383
  description: 'Does subtask fall within the capabilities described for the delegate?',
1331
1384
  category: 'workflow',
1332
- tags: ['agent', 'delegation', 'capabilities', 'routing', 'multi-agent'],
1385
+ tags: ['agent', 'delegation', 'capabilities', 'routing', 'multi-agent', 'harness'],
1333
1386
  limitations: [
1334
1387
  'Judges fit against the capabilities as written. Abilities the delegate has but the description omits count as missing.',
1335
1388
  'Reports whether the subtask is within scope, not whether the delegate would do it well or how long it would take.',
@@ -1346,6 +1399,41 @@ export const recipeMetadata = [
1346
1399
  },
1347
1400
  ],
1348
1401
  },
1402
+ {
1403
+ id: 'diff-hazards',
1404
+ title: 'Flag hazards in a code diff',
1405
+ description: 'Which hazards does diff introduce: leaked secrets, destructive commands, debug leftovers, weakened tests, or dependency changes?',
1406
+ category: 'workflow',
1407
+ tags: [
1408
+ 'diff',
1409
+ 'code-review',
1410
+ 'secrets',
1411
+ 'destructive',
1412
+ 'pre-commit',
1413
+ 'agent',
1414
+ 'safety',
1415
+ 'harness',
1416
+ ],
1417
+ limitations: [
1418
+ 'Reads only the supplied diff text. It does not run the code, resolve imports, or see files outside the diff.',
1419
+ 'A pattern that looks like a secret, such as an example key in documentation, may be flagged; treat detections as a prompt for review, not proof.',
1420
+ ],
1421
+ useWhen: 'A coding agent or pre-commit hook needs a fast screen of a diff for the mistakes that reviewers most often catch late.',
1422
+ related: [
1423
+ {
1424
+ id: 'change-risk',
1425
+ reason: 'Use change-risk to grade the overall shipping risk of a described change rather than flag specific hazards in the diff text.',
1426
+ },
1427
+ {
1428
+ id: 'commit-message-fit',
1429
+ reason: 'Use commit-message-fit to check whether the commit message describes the change.',
1430
+ },
1431
+ {
1432
+ id: 'breaking-change-signal',
1433
+ reason: 'Use breaking-change-signal to check whether a change breaks callers.',
1434
+ },
1435
+ ],
1436
+ },
1349
1437
  {
1350
1438
  id: 'disclosure-facets',
1351
1439
  title: 'Label what a property disclosure addresses',
@@ -2111,7 +2199,7 @@ export const recipeMetadata = [
2111
2199
  title: 'Detect goal drift',
2112
2200
  description: 'Does step still serve goal, or has work drifted to something goal did not ask for?',
2113
2201
  category: 'workflow',
2114
- tags: ['agent', 'goal', 'drift', 'scope', 'monitoring', 'gate'],
2202
+ tags: ['agent', 'goal', 'drift', 'scope', 'monitoring', 'gate', 'harness'],
2115
2203
  limitations: [
2116
2204
  'Judges a single step against the stated goal. It does not know whether the user later widened or changed the goal unless context says so.',
2117
2205
  'Reports drift, not whether the drifted work is harmful or valuable. Stopping, asking, or continuing is an application decision.',
@@ -2192,7 +2280,7 @@ export const recipeMetadata = [
2192
2280
  title: 'Grade handoff completeness',
2193
2281
  description: 'How ready is item, a work description being handed to another agent or person, to be picked up without asking questions, on a five-level rubric?',
2194
2282
  category: 'workflow',
2195
- tags: ['agent', 'delegation', 'handoff', 'completeness', 'multi-agent'],
2283
+ tags: ['agent', 'delegation', 'handoff', 'completeness', 'multi-agent', 'harness'],
2196
2284
  limitations: [
2197
2285
  'Grades what the item states, not whether the stated goal is correct, feasible, or worth doing.',
2198
2286
  'Cannot know what the recipient already knows, so shared context that is not written into the item counts as missing.',
@@ -2273,7 +2361,7 @@ export const recipeMetadata = [
2273
2361
  title: 'Detect agent-directed instructions',
2274
2362
  description: 'Does text contain instructions aimed at steering an AI system or agent?',
2275
2363
  category: 'workflow',
2276
- tags: ['security', 'prompt-injection', 'agent', 'safety', 'gate', 'retrieval'],
2364
+ tags: ['security', 'prompt-injection', 'agent', 'safety', 'gate', 'retrieval', 'harness'],
2277
2365
  limitations: [
2278
2366
  'Detects instruction-like content aimed at machines. It does not judge whether the instructions would succeed or are malicious.',
2279
2367
  'Quarantine, stripping, and logging decisions belong in application code.',
@@ -2356,7 +2444,7 @@ export const recipeMetadata = [
2356
2444
  title: 'Decide which conflicting instruction wins',
2357
2445
  description: 'When firstInstruction and secondInstruction conflict, which should take precedence under the stated policy?',
2358
2446
  category: 'workflow',
2359
- tags: ['agent', 'instructions', 'policy', 'precedence', 'comparison', 'safety'],
2447
+ tags: ['agent', 'instructions', 'policy', 'precedence', 'comparison', 'safety', 'harness'],
2360
2448
  limitations: [
2361
2449
  'Applies the policy as written. It does not decide whether the policy itself is sensible or whether the instructions really conflict.',
2362
2450
  'Depends on each instruction stating or implying its source; if the policy ranks by source and the source is not given, the result is unclear.',
@@ -2941,6 +3029,37 @@ export const recipeMetadata = [
2941
3029
  },
2942
3030
  ],
2943
3031
  },
3032
+ {
3033
+ id: 'model-route',
3034
+ title: 'Route a request to a model tier',
3035
+ description: 'Which of the described models should serve request, and how much reasoning effort does it need, decided in one call so a cheap model handles easy turns and a capable one handles hard turns?',
3036
+ category: 'workflow',
3037
+ tags: [
3038
+ 'agent',
3039
+ 'model-routing',
3040
+ 'cost',
3041
+ 'effort',
3042
+ 'reasoning',
3043
+ 'tiering',
3044
+ 'harness',
3045
+ 'gateway',
3046
+ ],
3047
+ limitations: [
3048
+ 'Chooses among the supplied descriptions only. The quality of the routing depends on how honestly each model entry describes its strengths, weaknesses, and cost.',
3049
+ 'The effort grade is a judgment about the request text, not a measurement; calibrate its thresholds against your own traffic.',
3050
+ ],
3051
+ useWhen: 'An agent harness, gateway, or proxy chooses per request which LLM and thinking level to use, and you want that choice made in well under a second.',
3052
+ related: [
3053
+ {
3054
+ id: 'route',
3055
+ reason: 'Use route to send a request to a named handler or team when no effort level is needed.',
3056
+ },
3057
+ {
3058
+ id: 'task-complexity',
3059
+ reason: 'Use task-complexity for a five-level complexity grade without picking a model.',
3060
+ },
3061
+ ],
3062
+ },
2944
3063
  {
2945
3064
  id: 'modulation-moment',
2946
3065
  title: 'Check whether now is a moment to change key',
@@ -3709,7 +3828,7 @@ export const recipeMetadata = [
3709
3828
  title: 'Detect a stalled agent',
3710
3829
  description: 'Does transcript, the recent agent steps, show the agent failing to make progress toward objective by repeating actions, circling, or reprocessing the same information?',
3711
3830
  category: 'workflow',
3712
- tags: ['agent', 'monitoring', 'loop', 'stall', 'safety'],
3831
+ tags: ['agent', 'monitoring', 'loop', 'stall', 'safety', 'harness'],
3713
3832
  limitations: [
3714
3833
  'Judges the window of steps supplied in transcript. A loop longer than the window, or progress made before it, is invisible.',
3715
3834
  'Reports that the agent is stalled, not why or what it should do instead. Interrupting, redirecting, or escalating is an application decision.',
@@ -4185,7 +4304,7 @@ export const recipeMetadata = [
4185
4304
  title: 'Check result plausibility',
4186
4305
  description: 'Is result a plausible, internally consistent answer to request rather than an error, placeholder, empty, or unrelated output dressed as data?',
4187
4306
  category: 'workflow',
4188
- tags: ['agent', 'tool-result', 'plausibility', 'validation', 'quality', 'gate'],
4307
+ tags: ['agent', 'tool-result', 'plausibility', 'validation', 'quality', 'gate', 'harness'],
4189
4308
  limitations: [
4190
4309
  'Judges internal consistency and fit to the request, not factual accuracy. A plausible result can still be wrong.',
4191
4310
  'A genuine empty answer, such as a search that legitimately found nothing, is only plausible if the result says so rather than returning blank output.',
@@ -4241,7 +4360,7 @@ export const recipeMetadata = [
4241
4360
  title: 'Decide whether to retry',
4242
4361
  description: 'Does failure describe a transient condition where an identical retry could succeed, given any attempt history?',
4243
4362
  category: 'workflow',
4244
- tags: ['agent', 'retry', 'failure', 'resilience', 'transient', 'gate'],
4363
+ tags: ['agent', 'retry', 'failure', 'resilience', 'transient', 'gate', 'harness'],
4245
4364
  limitations: [
4246
4365
  'Judges the failure text as written. It does not know your retry budget, backoff policy, or whether the action is safe to repeat.',
4247
4366
  'Says whether an identical retry could succeed, not whether a modified attempt would. Fixing inputs or permissions is a different decision.',
@@ -4417,6 +4536,28 @@ export const recipeMetadata = [
4417
4536
  },
4418
4537
  ],
4419
4538
  },
4539
+ {
4540
+ id: 'route-many',
4541
+ title: 'Route many requests in batches',
4542
+ description: 'Which named route handles each of up to 500 requests, judged in batched Jev requests so a queue of tickets, emails, or events is routed in a handful of calls instead of one per item?',
4543
+ category: 'support',
4544
+ tags: ['batch', 'routing', 'triage', 'queue', 'bulk', 'tickets', 'email', 'throughput'],
4545
+ limitations: [
4546
+ 'Every request in a batch shares one model call, so accuracy can fall as batches grow; the default batch size of 20 is a starting point to tune against your own labels.',
4547
+ 'Per-item results are independent judgments. The recipe does not deduplicate or group related requests.',
4548
+ ],
4549
+ useWhen: 'You have a backlog or stream of messages to route to the same set of handlers and want batched throughput with a per-item review outcome.',
4550
+ related: [
4551
+ {
4552
+ id: 'route',
4553
+ reason: 'Use route for a single request, or when each request has its own set of routes.',
4554
+ },
4555
+ {
4556
+ id: 'ticket-match',
4557
+ reason: 'Use ticket-match to link a new message to an existing ticket rather than a queue.',
4558
+ },
4559
+ ],
4560
+ },
4420
4561
  {
4421
4562
  id: 'rule-compliance',
4422
4563
  title: 'Check rule compliance',
@@ -4705,7 +4846,7 @@ export const recipeMetadata = [
4705
4846
  title: 'Check one completion condition',
4706
4847
  description: 'Does evidence establish that condition has been met?',
4707
4848
  category: 'workflow',
4708
- tags: ['workflow', 'step', 'complete', 'alignment-research'],
4849
+ tags: ['workflow', 'step', 'complete', 'alignment-research', 'harness'],
4709
4850
  limitations: [
4710
4851
  'Assesses supplied evidence for one condition. Use exact system state checks when the condition can be determined in code.',
4711
4852
  ],
@@ -5004,12 +5145,52 @@ export const recipeMetadata = [
5004
5145
  },
5005
5146
  ],
5006
5147
  },
5148
+ {
5149
+ id: 'tool-call-gate',
5150
+ title: 'Gate an agent tool call',
5151
+ description: 'Should an agent run toolCall now, ask a person first, or refuse it, given request and policy, with irreversible, destructive, out-of-scope, exfiltration, and injection risks flagged in the same call?',
5152
+ category: 'workflow',
5153
+ tags: [
5154
+ 'agent',
5155
+ 'tool-call',
5156
+ 'permission',
5157
+ 'guardrail',
5158
+ 'safety',
5159
+ 'injection',
5160
+ 'pre-tool-use',
5161
+ 'harness',
5162
+ ],
5163
+ limitations: [
5164
+ 'Judges the call as described in toolCall. Pass the actual tool name and arguments, not a summary written by the agent.',
5165
+ 'Deterministic rules such as allowlists, path restrictions, and rate limits are cheaper and more reliable for what they cover; run them first and use this recipe for the cases they leave open.',
5166
+ 'A review or ask outcome means a person should look; it does not itself block execution. The application must enforce the action.',
5167
+ ],
5168
+ useWhen: 'A coding or browsing agent is about to execute a tool call and you need an allow, ask, or deny decision plus the specific risks, in one fast request.',
5169
+ related: [
5170
+ {
5171
+ id: 'action-scope',
5172
+ reason: 'Use action-scope when you only need to know whether an action stays within the request.',
5173
+ },
5174
+ {
5175
+ id: 'action-reversibility',
5176
+ reason: 'Use action-reversibility for a five-level grade of how reversible one action is.',
5177
+ },
5178
+ {
5179
+ id: 'action-effects',
5180
+ reason: 'Use action-effects to label what kinds of side effects an action has.',
5181
+ },
5182
+ {
5183
+ id: 'injection-signal',
5184
+ reason: 'Use injection-signal to screen text for embedded instructions before an agent reads it.',
5185
+ },
5186
+ ],
5187
+ },
5007
5188
  {
5008
5189
  id: 'tool-compare',
5009
5190
  title: 'Compare two tools for a task',
5010
5191
  description: 'Which of firstTool and secondTool, as described by their stated capabilities, better fits task?',
5011
5192
  category: 'workflow',
5012
- tags: ['agent', 'tool-use', 'comparison', 'pairwise', 'planning', 'workflow'],
5193
+ tags: ['agent', 'tool-use', 'comparison', 'pairwise', 'planning', 'workflow', 'harness'],
5013
5194
  limitations: [
5014
5195
  'Compares the capability descriptions as written. It does not invoke either tool, check credentials, or know about tools not supplied.',
5015
5196
  'A tool can fit the task better and still be unavailable, rate-limited, or forbidden; availability and permission belong in application code.',
@@ -5031,7 +5212,7 @@ export const recipeMetadata = [
5031
5212
  title: 'Check a tool fit',
5032
5213
  description: 'Can the capabilities explicitly described in tool perform task?',
5033
5214
  category: 'workflow',
5034
- tags: ['workflow', 'tool', 'fit'],
5215
+ tags: ['workflow', 'tool', 'fit', 'harness'],
5035
5216
  limitations: [
5036
5217
  'Assesses a supplied capability description. It does not discover tools, validate credentials, or grant permission.',
5037
5218
  ],
@@ -5187,6 +5368,28 @@ export const recipeMetadata = [
5187
5368
  },
5188
5369
  ],
5189
5370
  },
5371
+ {
5372
+ id: 'wake-gate',
5373
+ title: 'Decide whether an event should wake a waiting agent',
5374
+ description: 'Should event wake an agent that is paused until waitingFor happens: wake now, keep waiting, or ignore it as unrelated?',
5375
+ category: 'workflow',
5376
+ tags: ['agent', 'wake', 'resume', 'event', 'pause', 'scheduler', 'long-running', 'harness'],
5377
+ limitations: [
5378
+ "Judges only the supplied event against the stated wait condition. It does not know about earlier events or the agent's full history unless context supplies them.",
5379
+ 'A wake verdict means the condition appears met or materially changed; the resumed agent still has to verify the actual state.',
5380
+ ],
5381
+ useWhen: 'A paused or sleeping agent receives a timer tick, webhook, message, or file change and you must decide whether to resume its model loop.',
5382
+ related: [
5383
+ {
5384
+ id: 'goal-drift',
5385
+ reason: "Use goal-drift to check whether a resumed agent's next step still serves its goal.",
5386
+ },
5387
+ {
5388
+ id: 'progress-stall',
5389
+ reason: 'Use progress-stall to detect an agent that keeps waking without making progress.',
5390
+ },
5391
+ ],
5392
+ },
5190
5393
  {
5191
5394
  id: 'workaround-fit',
5192
5395
  title: 'Check workaround fit',
@@ -1 +1 @@
1
- export declare const recipeNames: readonly ["action-compare", "action-effects", "action-reversibility", "action-scope", "age-appropriateness", "alert-actionability", "answer-consistency", "answer-coverage", "answer-disclosures", "answer-grade", "answer-invalidation", "answer-relevance", "answerability", "appeal-grounds-kind", "appointment-request-kind", "argument-fit", "attempted-step", "attribution-match", "audience-fit", "breaking-change-signal", "budget-fit", "budget-narrative-fit", "bug-report-completeness", "buying-intent", "cache-match", "cancellation-check", "care-urgency-wording", "category-fit", "causal-attribution", "causal-language-strength", "certainty-match", "change-meaning", "change-risk", "change-window-fit", "checkers-move", "choose-action", "citation-match", "citation-needed", "claim-facets", "claim-stance", "clarify", "clause-conflict", "clause-kind", "clickbait-level", "commit-message-fit", "commitment-strength", "comparable-fit", "confirmation-match", "consent-request", "consent-scope-fit", "constraint-strength", "content-facets", "content-freshness-signal", "context-role", "continuation-compare", "correction-target", "corrective-action-fit", "daw-request-kind", "deadline-risk", "defect-report-facets", "delegation-fit", "disclosure-facets", "dispute-kind", "document-role", "draft-compare", "dynamic-change", "eligibility-facets", "emotion-kind", "entity-match", "error-acknowledgment", "escalation-wording", "evaluation-mention", "evidence-conflict", "evidence-independence", "evidence-novelty", "evidence-strength", "exercise-select", "expense-category", "explanation-level", "extraction-fidelity", "fact-stability", "failure-kind", "fair-housing-wording", "feedback-actionability", "feedback-kind", "field-select", "financial-advice-signal", "finger-actions", "followup-link", "forecast-confidence-wording", "format-fit", "freshness-needed", "frustration-signal", "funder-fit", "game-action", "game-phase", "goal-drift", "grounding-level", "guest-request-facets", "handoff", "handoff-completeness", "headline-fit", "incident-match", "incident-severity-wording", "injection-signal", "instruction-clarity", "instruction-conflict", "instruction-fit", "instruction-priority", "instruction-readability", "instrument-issue-kind", "instrument-report-facets", "intake-question-fit", "intent-change", "invoice-facets", "issue-impact", "issue-recurrence", "itinerary-feasibility", "job-post-facets", "length-fit", "listener-request-kind", "listing-compare", "listing-fact-consistency", "log-line-kind", "loss-cause-kind", "lyric-mood-fit", "maintenance-hazard-wording", "medication-mention", "memory-relation", "memory-scope", "memory-subject", "memory-value", "message-facets", "methods-facets", "modulation-moment", "mood-match", "mood-request", "motivation-source", "move-explanation-fit", "narrative-consistency", "next-chord", "next-duration", "next-note", "notice-facets", "novelty-claim-level", "objection-kind", "objective-fit", "offer-terms-facets", "outcome-framing", "passage-compare", "passage-difficulty", "passage-duplicate", "passage-mood", "passage-standalone", "performance-feedback-facets", "persuasion-technique", "phrase-complete", "pii-presence", "plan-completeness", "policy-compliance", "policy-severity", "politeness-level", "postmortem-facets", "preference-kind", "priority-compare", "privacy-notice-facets", "product-match", "progress-stall", "promise-check", "proposal-facets", "qualification-evidence", "query-equivalence", "query-specificity", "question-assumption", "question-leading", "question-relevance", "reconciliation-match", "reference-resolve", "repeated-attempt", "repetition-level", "reply-template-match", "report-facets", "requirement-testability", "rerank", "resolution-check", "response-needed", "response-refusal", "result-outcome", "result-plausibility", "result-usefulness", "retrieval-needed", "retry-worthwhile", "review-comment-kind", "review-facets", "review-recommendation-kind", "review-response-fit", "rollback-signal", "root-cause-depth", "route", "rule-compliance", "runbook-fit", "safety-incident-kind", "satisfaction-signal", "search-intent-kind", "sentiment-shift", "settlement-offer-facets", "shipment-issue-kind", "slot-fit", "sound-match", "source-applicability", "spam-signal", "stage-evidence", "step-complete", "step-progress", "style-kind", "summary-coverage", "symptom-facets", "take-turn", "task-complexity", "task-dependency", "task-duplicate", "task-overlap", "tempo-change", "tension-level", "ticket-match", "tone-check", "tool-compare", "tool-fit", "topic-shift", "trip-purpose-kind", "troubleshooting-fit", "turn-intent", "uncertainty-expression", "urgency-signal", "verify", "workaround-fit"];
1
+ export declare const recipeNames: readonly ["action-compare", "action-effects", "action-reversibility", "action-scope", "age-appropriateness", "alert-actionability", "answer-consistency", "answer-coverage", "answer-disclosures", "answer-grade", "answer-invalidation", "answer-relevance", "answerability", "appeal-grounds-kind", "appointment-request-kind", "argument-fit", "attempted-step", "attribution-match", "audience-fit", "breaking-change-signal", "budget-fit", "budget-narrative-fit", "bug-report-completeness", "buying-intent", "cache-match", "cancellation-check", "care-urgency-wording", "category-fit", "causal-attribution", "causal-language-strength", "certainty-match", "change-meaning", "change-risk", "change-window-fit", "checkers-move", "choose-action", "citation-match", "citation-needed", "claim-facets", "claim-stance", "clarify", "clause-conflict", "clause-kind", "clickbait-level", "commit-message-fit", "commitment-strength", "comparable-fit", "completion-gate", "confirmation-match", "consent-request", "consent-scope-fit", "constraint-strength", "content-facets", "content-freshness-signal", "context-prune", "context-role", "continuation-compare", "correction-target", "corrective-action-fit", "daw-request-kind", "deadline-risk", "defect-report-facets", "delegation-fit", "diff-hazards", "disclosure-facets", "dispute-kind", "document-role", "draft-compare", "dynamic-change", "eligibility-facets", "emotion-kind", "entity-match", "error-acknowledgment", "escalation-wording", "evaluation-mention", "evidence-conflict", "evidence-independence", "evidence-novelty", "evidence-strength", "exercise-select", "expense-category", "explanation-level", "extraction-fidelity", "fact-stability", "failure-kind", "fair-housing-wording", "feedback-actionability", "feedback-kind", "field-select", "financial-advice-signal", "finger-actions", "followup-link", "forecast-confidence-wording", "format-fit", "freshness-needed", "frustration-signal", "funder-fit", "game-action", "game-phase", "goal-drift", "grounding-level", "guest-request-facets", "handoff", "handoff-completeness", "headline-fit", "incident-match", "incident-severity-wording", "injection-signal", "instruction-clarity", "instruction-conflict", "instruction-fit", "instruction-priority", "instruction-readability", "instrument-issue-kind", "instrument-report-facets", "intake-question-fit", "intent-change", "invoice-facets", "issue-impact", "issue-recurrence", "itinerary-feasibility", "job-post-facets", "length-fit", "listener-request-kind", "listing-compare", "listing-fact-consistency", "log-line-kind", "loss-cause-kind", "lyric-mood-fit", "maintenance-hazard-wording", "medication-mention", "memory-relation", "memory-scope", "memory-subject", "memory-value", "message-facets", "methods-facets", "model-route", "modulation-moment", "mood-match", "mood-request", "motivation-source", "move-explanation-fit", "narrative-consistency", "next-chord", "next-duration", "next-note", "notice-facets", "novelty-claim-level", "objection-kind", "objective-fit", "offer-terms-facets", "outcome-framing", "passage-compare", "passage-difficulty", "passage-duplicate", "passage-mood", "passage-standalone", "performance-feedback-facets", "persuasion-technique", "phrase-complete", "pii-presence", "plan-completeness", "policy-compliance", "policy-severity", "politeness-level", "postmortem-facets", "preference-kind", "priority-compare", "privacy-notice-facets", "product-match", "progress-stall", "promise-check", "proposal-facets", "qualification-evidence", "query-equivalence", "query-specificity", "question-assumption", "question-leading", "question-relevance", "reconciliation-match", "reference-resolve", "repeated-attempt", "repetition-level", "reply-template-match", "report-facets", "requirement-testability", "rerank", "resolution-check", "response-needed", "response-refusal", "result-outcome", "result-plausibility", "result-usefulness", "retrieval-needed", "retry-worthwhile", "review-comment-kind", "review-facets", "review-recommendation-kind", "review-response-fit", "rollback-signal", "root-cause-depth", "route", "route-many", "rule-compliance", "runbook-fit", "safety-incident-kind", "satisfaction-signal", "search-intent-kind", "sentiment-shift", "settlement-offer-facets", "shipment-issue-kind", "slot-fit", "sound-match", "source-applicability", "spam-signal", "stage-evidence", "step-complete", "step-progress", "style-kind", "summary-coverage", "symptom-facets", "take-turn", "task-complexity", "task-dependency", "task-duplicate", "task-overlap", "tempo-change", "tension-level", "ticket-match", "tone-check", "tool-call-gate", "tool-compare", "tool-fit", "topic-shift", "trip-purpose-kind", "troubleshooting-fit", "turn-intent", "uncertainty-expression", "urgency-signal", "verify", "wake-gate", "workaround-fit"];