@skhema/method 0.1.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.
- package/README.md +36 -0
- package/dist/definitions.d.ts +30 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +1117 -0
- package/dist/definitions.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +50 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +92 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +83 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +4 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +148 -0
- package/dist/validate.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1,1117 @@
|
|
|
1
|
+
import { COMPONENT_TYPES, ELEMENT_TYPES, SKHEMA_MAPPING, } from "@skhema/types/schema";
|
|
2
|
+
function titleCase(value) {
|
|
3
|
+
return value
|
|
4
|
+
.split("_")
|
|
5
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
6
|
+
.join(" ");
|
|
7
|
+
}
|
|
8
|
+
function syntacticSlot(id, description, required = true) {
|
|
9
|
+
return { id, label: titleCase(id), description, required };
|
|
10
|
+
}
|
|
11
|
+
function methodSlot(id, description, options = {}) {
|
|
12
|
+
const required = options.required ?? true;
|
|
13
|
+
const slotLabel = titleCase(id);
|
|
14
|
+
const definition = {
|
|
15
|
+
id,
|
|
16
|
+
label: slotLabel,
|
|
17
|
+
description,
|
|
18
|
+
required,
|
|
19
|
+
substitutable: options.substitutable ?? true,
|
|
20
|
+
cardinality: options.cardinality ?? (required ? "exactly_one" : "zero_or_one"),
|
|
21
|
+
evidence: options.evidence ??
|
|
22
|
+
(required ? "explicit_span_required" : "explicit_or_inferred"),
|
|
23
|
+
inference: options.inference ?? (required ? "not_allowed" : "allowed"),
|
|
24
|
+
acceptedEntityTypes: options.acceptedEntityTypes ?? [],
|
|
25
|
+
diagnostics: options.diagnostics ?? {
|
|
26
|
+
...(required ? { missing: `${slotLabel} is required.` } : {}),
|
|
27
|
+
weak: `${slotLabel} needs clearer method substance.`,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
if (options.examples) {
|
|
31
|
+
definition.examples = options.examples;
|
|
32
|
+
}
|
|
33
|
+
return definition;
|
|
34
|
+
}
|
|
35
|
+
function relationship(source, target, type, label, description, options = {}) {
|
|
36
|
+
return {
|
|
37
|
+
source,
|
|
38
|
+
target,
|
|
39
|
+
type,
|
|
40
|
+
label,
|
|
41
|
+
description,
|
|
42
|
+
cardinality: options.cardinality ?? "zero_or_more",
|
|
43
|
+
requiredForCompleteness: options.requiredForCompleteness ?? false,
|
|
44
|
+
evidence: options.evidence ?? "semantic_alignment",
|
|
45
|
+
scope: options.scope ?? ["same_strategy", "same_workspace"],
|
|
46
|
+
diagnostics: options.diagnostics ?? {
|
|
47
|
+
...(options.requiredForCompleteness ? { missing: `${label} is required for completeness.` } : {}),
|
|
48
|
+
weak: `${label} needs clearer evidence.`,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const indicativeSyntax = [
|
|
53
|
+
syntacticSlot("subject", "Noun that describes the subject performing or experiencing the action."),
|
|
54
|
+
syntacticSlot("direct_object", "Noun that describes the direct object of the verb."),
|
|
55
|
+
syntacticSlot("indirect_object", "Noun that describes the indirect object of the verb.", false),
|
|
56
|
+
];
|
|
57
|
+
const imperativeSyntax = [
|
|
58
|
+
syntacticSlot("verb", "Verb that describes the required action."),
|
|
59
|
+
syntacticSlot("subject", "Noun that describes the actor performing the action.", false),
|
|
60
|
+
syntacticSlot("direct_object", "Noun that describes the direct object of the verb."),
|
|
61
|
+
syntacticSlot("indirect_object", "Noun that describes the indirect object of the verb.", false),
|
|
62
|
+
];
|
|
63
|
+
const nounPhraseSyntax = [
|
|
64
|
+
syntacticSlot("noun_phrase", "Noun phrase that names the strategic option or object."),
|
|
65
|
+
syntacticSlot("verb", "Verb used if the phrase expresses a discontinuance or transition.", false),
|
|
66
|
+
syntacticSlot("direct_object", "Noun that describes the direct object of the verb.", false),
|
|
67
|
+
syntacticSlot("indirect_object", "Noun that describes the indirect object of the verb.", false),
|
|
68
|
+
syntacticSlot("subject", "Noun that describes the actor performing the action.", false),
|
|
69
|
+
];
|
|
70
|
+
const indicativeMethodSlots = [
|
|
71
|
+
methodSlot("adverbial_phrase", "Adverb phrase that modifies the subject or statement frame."),
|
|
72
|
+
methodSlot("noun_phrase", "Noun phrase that modifies the subject or statement frame."),
|
|
73
|
+
methodSlot("argument", "Phrase that specifies the main argument of the element."),
|
|
74
|
+
methodSlot("argument_modifier", "Phrase that modifies the main argument."),
|
|
75
|
+
methodSlot("agent", "Noun that describes an agent contributing to the concern.", { required: false }),
|
|
76
|
+
methodSlot("temporal_modifier", "Phrase that modifies the temporal aspect of the element.", {
|
|
77
|
+
required: false,
|
|
78
|
+
examples: ["in the next 12 months", "by 2030", "in Q2 2025"],
|
|
79
|
+
}),
|
|
80
|
+
];
|
|
81
|
+
const imperativeMethodSlots = [
|
|
82
|
+
methodSlot("relative_clause", "Relative clause that modifies the noun phrase.", {
|
|
83
|
+
required: false,
|
|
84
|
+
}),
|
|
85
|
+
methodSlot("adverbial_phrase", "Adverb phrase that modifies the verb action."),
|
|
86
|
+
];
|
|
87
|
+
const keyChallengeSlots = [
|
|
88
|
+
methodSlot("actor", "The organization, team, market participant, customer group, or decision-maker facing the challenge.", {
|
|
89
|
+
cardinality: "one_or_more",
|
|
90
|
+
acceptedEntityTypes: ["organization", "segment", "market_participant"],
|
|
91
|
+
diagnostics: {
|
|
92
|
+
missing: "Identify who is facing the challenge.",
|
|
93
|
+
weak: "Make the actor specific enough to guide strategy work.",
|
|
94
|
+
},
|
|
95
|
+
}),
|
|
96
|
+
methodSlot("causal_pressure", "The force, shift, constraint, or market change creating the challenge.", {
|
|
97
|
+
cardinality: "one_or_more",
|
|
98
|
+
acceptedEntityTypes: [
|
|
99
|
+
"externality",
|
|
100
|
+
"constraint",
|
|
101
|
+
"market_shift",
|
|
102
|
+
"competitive_pressure",
|
|
103
|
+
"regulatory_pressure",
|
|
104
|
+
],
|
|
105
|
+
diagnostics: {
|
|
106
|
+
missing: "Describe the force or change creating the challenge.",
|
|
107
|
+
weak: "Make the causal pressure concrete enough to explain why the challenge exists.",
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
methodSlot("consequence", "The material impact, risk, or strategic effect if the challenge is not addressed.", {
|
|
111
|
+
acceptedEntityTypes: ["impact", "metric", "risk", "outcome"],
|
|
112
|
+
diagnostics: {
|
|
113
|
+
missing: "Describe the material consequence of not addressing the challenge.",
|
|
114
|
+
weak: "Make the consequence observable or strategically material.",
|
|
115
|
+
},
|
|
116
|
+
}),
|
|
117
|
+
methodSlot("industry_context", "The industry or sector context, if present.", {
|
|
118
|
+
required: false,
|
|
119
|
+
acceptedEntityTypes: ["industry"],
|
|
120
|
+
diagnostics: {
|
|
121
|
+
weak: "Clarify the industry context if it changes the nature of the challenge.",
|
|
122
|
+
},
|
|
123
|
+
}),
|
|
124
|
+
methodSlot("geographic_context", "The location, market, or region context, if present.", {
|
|
125
|
+
required: false,
|
|
126
|
+
acceptedEntityTypes: ["geo", "market"],
|
|
127
|
+
diagnostics: {
|
|
128
|
+
weak: "Clarify geography if the challenge depends on location or market boundaries.",
|
|
129
|
+
},
|
|
130
|
+
}),
|
|
131
|
+
methodSlot("temporal_context", "The timeframe, deadline, period, or timing assumption, if present.", {
|
|
132
|
+
required: false,
|
|
133
|
+
acceptedEntityTypes: ["timeframe"],
|
|
134
|
+
diagnostics: {
|
|
135
|
+
weak: "Clarify timing if urgency or sequencing affects the strategic response.",
|
|
136
|
+
},
|
|
137
|
+
}),
|
|
138
|
+
methodSlot("constraint", "A limiting condition, dependency, or tradeoff that narrows the challenge.", {
|
|
139
|
+
required: false,
|
|
140
|
+
acceptedEntityTypes: ["constraint", "dependency", "tradeoff"],
|
|
141
|
+
diagnostics: {
|
|
142
|
+
weak: "Clarify the constraint if it changes what responses are viable.",
|
|
143
|
+
},
|
|
144
|
+
}),
|
|
145
|
+
methodSlot("decision_object", "The specific judgement, decision, resource, capability, or strategic object being pressured.", {
|
|
146
|
+
required: false,
|
|
147
|
+
acceptedEntityTypes: ["decision", "resource", "capability", "strategic_object"],
|
|
148
|
+
diagnostics: {
|
|
149
|
+
weak: "Clarify what decision or strategic object is under pressure.",
|
|
150
|
+
},
|
|
151
|
+
}),
|
|
152
|
+
];
|
|
153
|
+
const supportingFactSlots = [
|
|
154
|
+
methodSlot("subject", "The entity, activity, metric, market, or operating area the fact describes.", {
|
|
155
|
+
acceptedEntityTypes: ["organization", "segment", "metric", "market", "capability"],
|
|
156
|
+
diagnostics: {
|
|
157
|
+
missing: "Identify what the supporting fact is about.",
|
|
158
|
+
weak: "Make the subject of the fact specific enough to support a challenge.",
|
|
159
|
+
},
|
|
160
|
+
}),
|
|
161
|
+
methodSlot("evidence", "The observed fact, measurement, event, or data point that supports strategic judgement.", {
|
|
162
|
+
acceptedEntityTypes: ["metric", "event", "observation", "evidence"],
|
|
163
|
+
diagnostics: {
|
|
164
|
+
missing: "State the observed fact or evidence.",
|
|
165
|
+
weak: "Make the evidence concrete enough to be tested or cited.",
|
|
166
|
+
},
|
|
167
|
+
}),
|
|
168
|
+
methodSlot("direction", "The movement, comparison, or directional change in the evidence.", {
|
|
169
|
+
required: false,
|
|
170
|
+
acceptedEntityTypes: ["trend", "comparison", "directional_change"],
|
|
171
|
+
diagnostics: {
|
|
172
|
+
weak: "Clarify whether the fact is increasing, decreasing, stable, above, or below a reference point.",
|
|
173
|
+
},
|
|
174
|
+
}),
|
|
175
|
+
methodSlot("temporal_context", "The timeframe or period in which the fact applies.", {
|
|
176
|
+
required: false,
|
|
177
|
+
acceptedEntityTypes: ["timeframe"],
|
|
178
|
+
diagnostics: {
|
|
179
|
+
weak: "Clarify the time period for the supporting fact.",
|
|
180
|
+
},
|
|
181
|
+
}),
|
|
182
|
+
methodSlot("source_context", "The source, basis, or measurement context for the fact.", {
|
|
183
|
+
required: false,
|
|
184
|
+
substitutable: false,
|
|
185
|
+
acceptedEntityTypes: ["source", "dataset", "report", "experiment"],
|
|
186
|
+
diagnostics: {
|
|
187
|
+
weak: "Add the source or measurement basis if the fact needs auditability.",
|
|
188
|
+
},
|
|
189
|
+
}),
|
|
190
|
+
];
|
|
191
|
+
const impactSlots = [
|
|
192
|
+
methodSlot("affected_object", "The business outcome, stakeholder, asset, capability, or metric affected by the challenge.", {
|
|
193
|
+
acceptedEntityTypes: ["outcome", "metric", "stakeholder", "asset", "capability"],
|
|
194
|
+
diagnostics: {
|
|
195
|
+
missing: "Identify what is affected.",
|
|
196
|
+
weak: "Make the affected object specific enough to reason about consequences.",
|
|
197
|
+
},
|
|
198
|
+
}),
|
|
199
|
+
methodSlot("impact_mechanism", "The causal mechanism by which the challenge creates the impact.", {
|
|
200
|
+
acceptedEntityTypes: ["causal_mechanism", "constraint", "externality", "process"],
|
|
201
|
+
diagnostics: {
|
|
202
|
+
missing: "Explain how the challenge creates the impact.",
|
|
203
|
+
weak: "Make the causal mechanism clearer.",
|
|
204
|
+
},
|
|
205
|
+
}),
|
|
206
|
+
methodSlot("impact_magnitude", "The scale, severity, or materiality of the impact.", {
|
|
207
|
+
required: false,
|
|
208
|
+
acceptedEntityTypes: ["metric", "risk", "severity", "estimate"],
|
|
209
|
+
diagnostics: {
|
|
210
|
+
weak: "Clarify the scale or materiality of the impact if known.",
|
|
211
|
+
},
|
|
212
|
+
}),
|
|
213
|
+
methodSlot("temporal_context", "The timeframe over which the impact occurs or becomes material.", {
|
|
214
|
+
required: false,
|
|
215
|
+
acceptedEntityTypes: ["timeframe"],
|
|
216
|
+
diagnostics: {
|
|
217
|
+
weak: "Clarify when the impact occurs or becomes material.",
|
|
218
|
+
},
|
|
219
|
+
}),
|
|
220
|
+
methodSlot("downstream_consequence", "The further strategic consequence created by the immediate impact.", {
|
|
221
|
+
required: false,
|
|
222
|
+
acceptedEntityTypes: ["consequence", "risk", "outcome"],
|
|
223
|
+
diagnostics: {
|
|
224
|
+
weak: "Clarify the downstream consequence if it changes the strategic response.",
|
|
225
|
+
},
|
|
226
|
+
}),
|
|
227
|
+
];
|
|
228
|
+
const guidingPolicySlots = [
|
|
229
|
+
methodSlot("strategic_action", "The coherent action, posture, or policy direction that addresses the key challenge.", {
|
|
230
|
+
acceptedEntityTypes: ["approach", "method", "move", "position"],
|
|
231
|
+
diagnostics: {
|
|
232
|
+
missing: "State the strategic action or policy direction.",
|
|
233
|
+
weak: "Make the policy direction specific enough to guide choices.",
|
|
234
|
+
},
|
|
235
|
+
}),
|
|
236
|
+
methodSlot("decision_object", "The market, capability, offer, activity, resource, or choice the policy acts on.", {
|
|
237
|
+
acceptedEntityTypes: ["market", "capability", "product", "service", "resource", "activity"],
|
|
238
|
+
diagnostics: {
|
|
239
|
+
missing: "Identify what the guiding policy acts on.",
|
|
240
|
+
weak: "Make the decision object concrete enough to constrain action.",
|
|
241
|
+
},
|
|
242
|
+
}),
|
|
243
|
+
methodSlot("advantage_logic", "The rationale for why this policy creates advantage or resolves the challenge.", {
|
|
244
|
+
required: false,
|
|
245
|
+
acceptedEntityTypes: ["advantage", "capability", "mechanism", "tradeoff"],
|
|
246
|
+
diagnostics: {
|
|
247
|
+
weak: "Clarify why this policy is expected to work.",
|
|
248
|
+
},
|
|
249
|
+
}),
|
|
250
|
+
methodSlot("boundary", "The explicit limit, exclusion, or tradeoff implied by the policy.", {
|
|
251
|
+
required: false,
|
|
252
|
+
acceptedEntityTypes: ["scope", "constraint", "tradeoff"],
|
|
253
|
+
diagnostics: {
|
|
254
|
+
weak: "Clarify the boundary or tradeoff if the policy could be interpreted too broadly.",
|
|
255
|
+
},
|
|
256
|
+
}),
|
|
257
|
+
];
|
|
258
|
+
const competitorMoveSlots = [
|
|
259
|
+
methodSlot("competitor", "The competitor, substitute, entrant, channel, or market participant making the move.", {
|
|
260
|
+
acceptedEntityTypes: ["organization", "competitor", "substitute", "entrant", "channel"],
|
|
261
|
+
diagnostics: {
|
|
262
|
+
missing: "Identify who is making the competitor move.",
|
|
263
|
+
weak: "Make the competitor or market participant specific.",
|
|
264
|
+
},
|
|
265
|
+
}),
|
|
266
|
+
methodSlot("move", "The competitive action, investment, pricing change, distribution shift, or strategic posture being taken.", {
|
|
267
|
+
acceptedEntityTypes: ["move", "investment", "pricing", "distribution", "position"],
|
|
268
|
+
diagnostics: {
|
|
269
|
+
missing: "Describe the competitive move.",
|
|
270
|
+
weak: "Make the competitive action observable enough to track.",
|
|
271
|
+
},
|
|
272
|
+
}),
|
|
273
|
+
methodSlot("threat_logic", "Why the move matters for the organization's challenge, policy, or advantage.", {
|
|
274
|
+
required: false,
|
|
275
|
+
acceptedEntityTypes: ["threat", "pressure", "advantage", "risk"],
|
|
276
|
+
diagnostics: {
|
|
277
|
+
weak: "Clarify why this competitor move is strategically relevant.",
|
|
278
|
+
},
|
|
279
|
+
}),
|
|
280
|
+
methodSlot("temporal_context", "The timeframe in which the move is occurring or expected.", {
|
|
281
|
+
required: false,
|
|
282
|
+
acceptedEntityTypes: ["timeframe"],
|
|
283
|
+
diagnostics: {
|
|
284
|
+
weak: "Clarify when the move is occurring or expected.",
|
|
285
|
+
},
|
|
286
|
+
}),
|
|
287
|
+
];
|
|
288
|
+
const scopeSlots = [
|
|
289
|
+
methodSlot("included_domain", "The market, customer segment, geography, category, product, service, channel, or activity included in scope.", {
|
|
290
|
+
cardinality: "one_or_more",
|
|
291
|
+
acceptedEntityTypes: ["market", "segment", "geo", "category", "product", "service", "channel", "activity"],
|
|
292
|
+
diagnostics: {
|
|
293
|
+
missing: "Identify what is included in scope.",
|
|
294
|
+
weak: "Make the included scope specific enough to guide choices.",
|
|
295
|
+
},
|
|
296
|
+
}),
|
|
297
|
+
methodSlot("scope_action", "The action implied by the scope statement, such as target, prioritize, enter, avoid, or limit.", {
|
|
298
|
+
required: false,
|
|
299
|
+
acceptedEntityTypes: ["action", "priority", "boundary"],
|
|
300
|
+
diagnostics: {
|
|
301
|
+
weak: "Clarify the action implied by the scope statement.",
|
|
302
|
+
},
|
|
303
|
+
}),
|
|
304
|
+
methodSlot("excluded_domain", "The domain explicitly excluded or deprioritized by the scope.", {
|
|
305
|
+
required: false,
|
|
306
|
+
acceptedEntityTypes: ["market", "segment", "geo", "category", "product", "service", "channel", "activity"],
|
|
307
|
+
diagnostics: {
|
|
308
|
+
weak: "Clarify what is outside scope if the boundary matters.",
|
|
309
|
+
},
|
|
310
|
+
}),
|
|
311
|
+
methodSlot("boundary_condition", "The threshold, condition, or criterion that defines the scope boundary.", {
|
|
312
|
+
required: false,
|
|
313
|
+
acceptedEntityTypes: ["metric", "threshold", "condition", "criterion"],
|
|
314
|
+
diagnostics: {
|
|
315
|
+
weak: "Clarify the threshold or criterion that defines the scope boundary.",
|
|
316
|
+
},
|
|
317
|
+
}),
|
|
318
|
+
];
|
|
319
|
+
const constraintSlots = [
|
|
320
|
+
methodSlot("constraint_source", "The internal or external source creating the limitation.", {
|
|
321
|
+
acceptedEntityTypes: ["internality", "externality", "regulation", "resource", "capability", "market"],
|
|
322
|
+
diagnostics: {
|
|
323
|
+
missing: "Identify the source of the constraint.",
|
|
324
|
+
weak: "Make the constraint source specific enough to reason about.",
|
|
325
|
+
},
|
|
326
|
+
}),
|
|
327
|
+
methodSlot("limitation", "The limit, dependency, threshold, or condition that restricts viable choices.", {
|
|
328
|
+
acceptedEntityTypes: ["constraint", "dependency", "threshold", "condition", "tradeoff"],
|
|
329
|
+
diagnostics: {
|
|
330
|
+
missing: "Describe the limitation imposed by the constraint.",
|
|
331
|
+
weak: "Make the limitation concrete enough to constrain action.",
|
|
332
|
+
},
|
|
333
|
+
}),
|
|
334
|
+
methodSlot("affected_choice", "The policy, solution, action, investment, or capability affected by the constraint.", {
|
|
335
|
+
required: false,
|
|
336
|
+
acceptedEntityTypes: ["guiding_policy", "solution", "action", "investment", "capability"],
|
|
337
|
+
diagnostics: {
|
|
338
|
+
weak: "Clarify what choice the constraint affects.",
|
|
339
|
+
},
|
|
340
|
+
}),
|
|
341
|
+
methodSlot("constraint_type", "The category of constraint, such as fiscal, regulatory, competitive, technological, environmental, social, temporal, internal, or external.", {
|
|
342
|
+
required: false,
|
|
343
|
+
acceptedEntityTypes: ["constraint_type"],
|
|
344
|
+
diagnostics: {
|
|
345
|
+
weak: "Classify the constraint if type changes how it should be handled.",
|
|
346
|
+
},
|
|
347
|
+
}),
|
|
348
|
+
];
|
|
349
|
+
const solutionSlots = [
|
|
350
|
+
methodSlot("solution_object", "The option, initiative, intervention, product, process, or strategic move being considered.", {
|
|
351
|
+
acceptedEntityTypes: ["solution", "initiative", "product", "process", "move", "intervention"],
|
|
352
|
+
diagnostics: {
|
|
353
|
+
missing: "Identify the solution or strategic option being considered.",
|
|
354
|
+
weak: "Make the solution object specific enough to evaluate.",
|
|
355
|
+
},
|
|
356
|
+
}),
|
|
357
|
+
methodSlot("mechanism", "How the solution is expected to address the guiding policy or key challenge.", {
|
|
358
|
+
required: false,
|
|
359
|
+
acceptedEntityTypes: ["mechanism", "capability", "process", "advantage"],
|
|
360
|
+
diagnostics: {
|
|
361
|
+
weak: "Clarify how this solution is expected to work.",
|
|
362
|
+
},
|
|
363
|
+
}),
|
|
364
|
+
methodSlot("target_context", "The customer, market, geography, product, channel, capability, or activity the solution targets.", {
|
|
365
|
+
required: false,
|
|
366
|
+
acceptedEntityTypes: ["segment", "market", "geo", "product", "channel", "capability", "activity"],
|
|
367
|
+
diagnostics: {
|
|
368
|
+
weak: "Clarify the context or target for the solution.",
|
|
369
|
+
},
|
|
370
|
+
}),
|
|
371
|
+
methodSlot("tradeoff", "The sacrifice, exclusion, cost, or risk implied by choosing this solution.", {
|
|
372
|
+
required: false,
|
|
373
|
+
acceptedEntityTypes: ["tradeoff", "cost", "risk", "constraint"],
|
|
374
|
+
diagnostics: {
|
|
375
|
+
weak: "Clarify the tradeoff if it affects whether the solution is viable.",
|
|
376
|
+
},
|
|
377
|
+
}),
|
|
378
|
+
];
|
|
379
|
+
const assumptionHypothesisSlots = [
|
|
380
|
+
methodSlot("belief", "The unproven belief, condition, or causal claim that must hold true.", {
|
|
381
|
+
acceptedEntityTypes: ["belief", "condition", "claim", "causal_assumption"],
|
|
382
|
+
diagnostics: {
|
|
383
|
+
missing: "State the assumption or hypothesis that must be true.",
|
|
384
|
+
weak: "Make the assumption specific enough to test.",
|
|
385
|
+
},
|
|
386
|
+
}),
|
|
387
|
+
methodSlot("dependent_outcome", "The outcome, behavior, metric, or result that depends on the assumption being true.", {
|
|
388
|
+
required: false,
|
|
389
|
+
acceptedEntityTypes: ["outcome", "behavior", "metric", "result"],
|
|
390
|
+
diagnostics: {
|
|
391
|
+
weak: "Clarify what outcome depends on this assumption.",
|
|
392
|
+
},
|
|
393
|
+
}),
|
|
394
|
+
methodSlot("test_condition", "The observable condition or evidence that would confirm or disconfirm the assumption.", {
|
|
395
|
+
required: false,
|
|
396
|
+
acceptedEntityTypes: ["evidence", "metric", "threshold", "condition"],
|
|
397
|
+
diagnostics: {
|
|
398
|
+
weak: "Clarify how this assumption could be tested.",
|
|
399
|
+
},
|
|
400
|
+
}),
|
|
401
|
+
methodSlot("timeframe", "The period over which the assumption should hold or be tested.", {
|
|
402
|
+
required: false,
|
|
403
|
+
acceptedEntityTypes: ["timeframe"],
|
|
404
|
+
diagnostics: {
|
|
405
|
+
weak: "Clarify the timeframe for this assumption.",
|
|
406
|
+
},
|
|
407
|
+
}),
|
|
408
|
+
];
|
|
409
|
+
const experimentSlots = [
|
|
410
|
+
methodSlot("test_action", "The experiment, pilot, model, trial, survey, or analysis to perform.", {
|
|
411
|
+
acceptedEntityTypes: ["experiment", "pilot", "model", "survey", "analysis", "test"],
|
|
412
|
+
diagnostics: {
|
|
413
|
+
missing: "State the test action to perform.",
|
|
414
|
+
weak: "Make the experiment action specific enough to execute.",
|
|
415
|
+
},
|
|
416
|
+
}),
|
|
417
|
+
methodSlot("hypothesis_under_test", "The assumption, hypothesis, or uncertainty the experiment is designed to test.", {
|
|
418
|
+
required: false,
|
|
419
|
+
acceptedEntityTypes: ["assumption_hypothesis", "uncertainty", "belief"],
|
|
420
|
+
diagnostics: {
|
|
421
|
+
weak: "Clarify what assumption or uncertainty this experiment tests.",
|
|
422
|
+
},
|
|
423
|
+
}),
|
|
424
|
+
methodSlot("success_metric", "The metric, threshold, or evidence that determines the result of the experiment.", {
|
|
425
|
+
required: false,
|
|
426
|
+
acceptedEntityTypes: ["metric", "threshold", "evidence"],
|
|
427
|
+
diagnostics: {
|
|
428
|
+
weak: "Clarify how the experiment result will be judged.",
|
|
429
|
+
},
|
|
430
|
+
}),
|
|
431
|
+
methodSlot("sample_or_scope", "The sample, audience, geography, product set, or operating scope of the experiment.", {
|
|
432
|
+
required: false,
|
|
433
|
+
acceptedEntityTypes: ["segment", "sample", "geo", "product", "scope"],
|
|
434
|
+
diagnostics: {
|
|
435
|
+
weak: "Clarify the experiment scope.",
|
|
436
|
+
},
|
|
437
|
+
}),
|
|
438
|
+
];
|
|
439
|
+
const actionSlots = [
|
|
440
|
+
methodSlot("action", "The concrete task, decision, change, or implementation step to perform.", {
|
|
441
|
+
acceptedEntityTypes: ["action", "task", "decision", "change", "implementation_step"],
|
|
442
|
+
diagnostics: {
|
|
443
|
+
missing: "State the concrete action to perform.",
|
|
444
|
+
weak: "Make the action specific enough to assign or execute.",
|
|
445
|
+
},
|
|
446
|
+
}),
|
|
447
|
+
methodSlot("owner_or_actor", "The person, team, function, or partner responsible for the action.", {
|
|
448
|
+
required: false,
|
|
449
|
+
acceptedEntityTypes: ["person", "team", "function", "partner", "organization"],
|
|
450
|
+
diagnostics: {
|
|
451
|
+
weak: "Clarify who owns or performs the action.",
|
|
452
|
+
},
|
|
453
|
+
}),
|
|
454
|
+
methodSlot("target_object", "The process, product, customer, system, resource, or activity the action changes.", {
|
|
455
|
+
required: false,
|
|
456
|
+
acceptedEntityTypes: ["process", "product", "customer", "system", "resource", "activity"],
|
|
457
|
+
diagnostics: {
|
|
458
|
+
weak: "Clarify what the action changes.",
|
|
459
|
+
},
|
|
460
|
+
}),
|
|
461
|
+
methodSlot("timeframe", "The deadline, cadence, or timing of the action.", {
|
|
462
|
+
required: false,
|
|
463
|
+
acceptedEntityTypes: ["timeframe"],
|
|
464
|
+
diagnostics: {
|
|
465
|
+
weak: "Clarify when the action should happen.",
|
|
466
|
+
},
|
|
467
|
+
}),
|
|
468
|
+
];
|
|
469
|
+
const investmentSlots = [
|
|
470
|
+
methodSlot("investment_amount", "The quantity of capital, resources, or effort to invest.", {
|
|
471
|
+
acceptedEntityTypes: ["metric", "currency", "quantity", "resource"],
|
|
472
|
+
diagnostics: {
|
|
473
|
+
missing: "State the investment amount or resource commitment.",
|
|
474
|
+
weak: "Make the investment amount specific enough to compare.",
|
|
475
|
+
},
|
|
476
|
+
}),
|
|
477
|
+
methodSlot("investment_type", "The category or object of investment.", {
|
|
478
|
+
acceptedEntityTypes: ["capability", "system", "asset", "initiative", "resource"],
|
|
479
|
+
diagnostics: {
|
|
480
|
+
missing: "Identify what type of investment is being considered.",
|
|
481
|
+
weak: "Make the investment type specific.",
|
|
482
|
+
},
|
|
483
|
+
}),
|
|
484
|
+
methodSlot("investment_period", "The timeframe over which the investment is made or evaluated.", {
|
|
485
|
+
required: false,
|
|
486
|
+
acceptedEntityTypes: ["timeframe"],
|
|
487
|
+
diagnostics: {
|
|
488
|
+
weak: "Clarify the investment period.",
|
|
489
|
+
},
|
|
490
|
+
}),
|
|
491
|
+
];
|
|
492
|
+
const estimateSlots = [
|
|
493
|
+
methodSlot("estimate_amount", "The estimated quantity, value, range, or probability.", {
|
|
494
|
+
acceptedEntityTypes: ["metric", "currency", "quantity", "probability", "range"],
|
|
495
|
+
diagnostics: {
|
|
496
|
+
missing: "State the estimate amount, value, range, or probability.",
|
|
497
|
+
weak: "Make the estimate specific enough to compare or revise.",
|
|
498
|
+
},
|
|
499
|
+
}),
|
|
500
|
+
methodSlot("estimate_type", "The metric, outcome, cost, revenue, share, volume, or effect being estimated.", {
|
|
501
|
+
acceptedEntityTypes: ["metric", "outcome", "cost", "revenue", "share", "volume"],
|
|
502
|
+
diagnostics: {
|
|
503
|
+
missing: "Identify what is being estimated.",
|
|
504
|
+
weak: "Make the estimate type specific.",
|
|
505
|
+
},
|
|
506
|
+
}),
|
|
507
|
+
methodSlot("estimate_period", "The timeframe or period for the estimate.", {
|
|
508
|
+
required: false,
|
|
509
|
+
acceptedEntityTypes: ["timeframe"],
|
|
510
|
+
diagnostics: {
|
|
511
|
+
weak: "Clarify the estimate period.",
|
|
512
|
+
},
|
|
513
|
+
}),
|
|
514
|
+
methodSlot("basis", "The assumption, experiment, benchmark, or source that supports the estimate.", {
|
|
515
|
+
required: false,
|
|
516
|
+
substitutable: false,
|
|
517
|
+
acceptedEntityTypes: ["assumption_hypothesis", "experiment", "benchmark", "source"],
|
|
518
|
+
diagnostics: {
|
|
519
|
+
weak: "Clarify the basis for the estimate if auditability matters.",
|
|
520
|
+
},
|
|
521
|
+
}),
|
|
522
|
+
];
|
|
523
|
+
const baselineSlots = [
|
|
524
|
+
methodSlot("measured_object", "The metric, process, behavior, asset, segment, or outcome being measured as the starting point.", {
|
|
525
|
+
acceptedEntityTypes: ["metric", "process", "behavior", "asset", "segment", "outcome"],
|
|
526
|
+
diagnostics: {
|
|
527
|
+
missing: "Identify what the baseline measures.",
|
|
528
|
+
weak: "Make the measured object specific enough to compare against future outcomes.",
|
|
529
|
+
},
|
|
530
|
+
}),
|
|
531
|
+
methodSlot("baseline_value", "The starting value, level, state, quantity, or condition before intervention.", {
|
|
532
|
+
acceptedEntityTypes: ["metric", "quantity", "state", "condition", "value"],
|
|
533
|
+
diagnostics: {
|
|
534
|
+
missing: "State the baseline value or starting condition.",
|
|
535
|
+
weak: "Make the baseline value specific enough to compare.",
|
|
536
|
+
},
|
|
537
|
+
}),
|
|
538
|
+
methodSlot("measurement_period", "The period over which the baseline was measured.", {
|
|
539
|
+
required: false,
|
|
540
|
+
acceptedEntityTypes: ["timeframe"],
|
|
541
|
+
diagnostics: {
|
|
542
|
+
weak: "Clarify the measurement period for the baseline.",
|
|
543
|
+
},
|
|
544
|
+
}),
|
|
545
|
+
methodSlot("source_context", "The source, dataset, system, or evidence basis for the baseline.", {
|
|
546
|
+
required: false,
|
|
547
|
+
substitutable: false,
|
|
548
|
+
acceptedEntityTypes: ["source", "dataset", "system", "evidence"],
|
|
549
|
+
diagnostics: {
|
|
550
|
+
weak: "Clarify the source of the baseline if auditability matters.",
|
|
551
|
+
},
|
|
552
|
+
}),
|
|
553
|
+
methodSlot("comparison_context", "The comparator, prior period, benchmark, or reference point used to interpret the baseline.", {
|
|
554
|
+
required: false,
|
|
555
|
+
acceptedEntityTypes: ["benchmark", "prior_period", "reference_point", "comparison"],
|
|
556
|
+
diagnostics: {
|
|
557
|
+
weak: "Clarify the comparison context if it affects interpretation.",
|
|
558
|
+
},
|
|
559
|
+
}),
|
|
560
|
+
];
|
|
561
|
+
const outcomeSlots = [
|
|
562
|
+
methodSlot("target_object", "The metric, business result, customer behavior, capability, or strategic state targeted by the strategy.", {
|
|
563
|
+
acceptedEntityTypes: ["metric", "outcome", "behavior", "capability", "strategic_state"],
|
|
564
|
+
diagnostics: {
|
|
565
|
+
missing: "Identify what outcome is being targeted.",
|
|
566
|
+
weak: "Make the outcome object specific enough to measure.",
|
|
567
|
+
},
|
|
568
|
+
}),
|
|
569
|
+
methodSlot("target_value", "The desired value, state, quantity, threshold, or direction of the outcome.", {
|
|
570
|
+
acceptedEntityTypes: ["metric", "quantity", "threshold", "state", "direction"],
|
|
571
|
+
diagnostics: {
|
|
572
|
+
missing: "State the target value or desired state.",
|
|
573
|
+
weak: "Make the target value specific enough to judge success.",
|
|
574
|
+
},
|
|
575
|
+
}),
|
|
576
|
+
methodSlot("timeframe", "The timeframe by which the outcome should be achieved or assessed.", {
|
|
577
|
+
required: false,
|
|
578
|
+
acceptedEntityTypes: ["timeframe"],
|
|
579
|
+
diagnostics: {
|
|
580
|
+
weak: "Clarify when the outcome should be achieved.",
|
|
581
|
+
},
|
|
582
|
+
}),
|
|
583
|
+
methodSlot("success_condition", "The condition under which the outcome should be considered achieved.", {
|
|
584
|
+
required: false,
|
|
585
|
+
acceptedEntityTypes: ["condition", "threshold", "metric"],
|
|
586
|
+
diagnostics: {
|
|
587
|
+
weak: "Clarify what would count as success.",
|
|
588
|
+
},
|
|
589
|
+
}),
|
|
590
|
+
methodSlot("strategic_effect", "The strategic effect or business consequence expected if the outcome is achieved.", {
|
|
591
|
+
required: false,
|
|
592
|
+
acceptedEntityTypes: ["effect", "consequence", "advantage", "impact"],
|
|
593
|
+
diagnostics: {
|
|
594
|
+
weak: "Clarify why this outcome matters strategically.",
|
|
595
|
+
},
|
|
596
|
+
}),
|
|
597
|
+
];
|
|
598
|
+
const performanceVariableSlots = [
|
|
599
|
+
methodSlot("metric", "The variable, metric, indicator, or measure used to track performance.", {
|
|
600
|
+
acceptedEntityTypes: ["metric", "indicator", "measure", "variable"],
|
|
601
|
+
diagnostics: {
|
|
602
|
+
missing: "Identify the performance variable to track.",
|
|
603
|
+
weak: "Make the performance variable specific enough to measure.",
|
|
604
|
+
},
|
|
605
|
+
}),
|
|
606
|
+
methodSlot("measurement_method", "How the variable is measured, calculated, or observed.", {
|
|
607
|
+
required: false,
|
|
608
|
+
substitutable: false,
|
|
609
|
+
acceptedEntityTypes: ["method", "calculation", "system", "observation"],
|
|
610
|
+
diagnostics: {
|
|
611
|
+
weak: "Clarify how the performance variable is measured.",
|
|
612
|
+
},
|
|
613
|
+
}),
|
|
614
|
+
methodSlot("cadence", "How often the performance variable should be measured or reviewed.", {
|
|
615
|
+
required: false,
|
|
616
|
+
acceptedEntityTypes: ["timeframe", "cadence"],
|
|
617
|
+
diagnostics: {
|
|
618
|
+
weak: "Clarify how often this variable should be reviewed.",
|
|
619
|
+
},
|
|
620
|
+
}),
|
|
621
|
+
methodSlot("threshold", "The trigger, target, tolerance, or threshold used to interpret the variable.", {
|
|
622
|
+
required: false,
|
|
623
|
+
acceptedEntityTypes: ["threshold", "target", "tolerance", "metric"],
|
|
624
|
+
diagnostics: {
|
|
625
|
+
weak: "Clarify the threshold that makes this variable actionable.",
|
|
626
|
+
},
|
|
627
|
+
}),
|
|
628
|
+
methodSlot("owner_or_source", "The owner, system, dataset, or source responsible for the variable.", {
|
|
629
|
+
required: false,
|
|
630
|
+
substitutable: false,
|
|
631
|
+
acceptedEntityTypes: ["owner", "system", "dataset", "source"],
|
|
632
|
+
diagnostics: {
|
|
633
|
+
weak: "Clarify who owns or supplies this performance variable.",
|
|
634
|
+
},
|
|
635
|
+
}),
|
|
636
|
+
];
|
|
637
|
+
const capabilitySlots = [
|
|
638
|
+
methodSlot("capability", "The organizational ability, competency, resource, process, or capacity required to execute the strategy.", {
|
|
639
|
+
acceptedEntityTypes: ["capability", "competency", "resource", "process", "capacity"],
|
|
640
|
+
diagnostics: {
|
|
641
|
+
missing: "Identify the capability required to support the strategy.",
|
|
642
|
+
weak: "Make the capability specific enough to build, assess, or assign.",
|
|
643
|
+
},
|
|
644
|
+
}),
|
|
645
|
+
methodSlot("capability_purpose", "The strategic purpose or activity the capability enables.", {
|
|
646
|
+
required: false,
|
|
647
|
+
acceptedEntityTypes: ["purpose", "activity", "solution", "guiding_policy", "outcome"],
|
|
648
|
+
diagnostics: {
|
|
649
|
+
weak: "Clarify what strategic purpose this capability serves.",
|
|
650
|
+
},
|
|
651
|
+
}),
|
|
652
|
+
methodSlot("maturity_or_gap", "The current maturity, deficiency, gap, or development need for the capability.", {
|
|
653
|
+
required: false,
|
|
654
|
+
acceptedEntityTypes: ["maturity", "gap", "deficiency", "need"],
|
|
655
|
+
diagnostics: {
|
|
656
|
+
weak: "Clarify whether the capability exists, is weak, or needs to be built.",
|
|
657
|
+
},
|
|
658
|
+
}),
|
|
659
|
+
methodSlot("owner_or_location", "The function, team, partner, or part of the organization where the capability lives.", {
|
|
660
|
+
required: false,
|
|
661
|
+
acceptedEntityTypes: ["function", "team", "partner", "organization"],
|
|
662
|
+
diagnostics: {
|
|
663
|
+
weak: "Clarify where this capability is owned or located.",
|
|
664
|
+
},
|
|
665
|
+
}),
|
|
666
|
+
];
|
|
667
|
+
const systemSlots = [
|
|
668
|
+
methodSlot("system", "The process, tool, governance mechanism, operating system, data system, or routine that supports the capability.", {
|
|
669
|
+
acceptedEntityTypes: ["system", "process", "tool", "governance", "routine", "data_system"],
|
|
670
|
+
diagnostics: {
|
|
671
|
+
missing: "Identify the system that supports execution.",
|
|
672
|
+
weak: "Make the system specific enough to design or operate.",
|
|
673
|
+
},
|
|
674
|
+
}),
|
|
675
|
+
methodSlot("supported_capability", "The capability, action, or operating need the system supports.", {
|
|
676
|
+
required: false,
|
|
677
|
+
acceptedEntityTypes: ["capability", "action", "operation", "need"],
|
|
678
|
+
diagnostics: {
|
|
679
|
+
weak: "Clarify what capability or operating need this system supports.",
|
|
680
|
+
},
|
|
681
|
+
}),
|
|
682
|
+
methodSlot("operating_cadence", "The cadence, trigger, workflow, or operating rhythm for the system.", {
|
|
683
|
+
required: false,
|
|
684
|
+
acceptedEntityTypes: ["cadence", "trigger", "workflow", "timeframe"],
|
|
685
|
+
diagnostics: {
|
|
686
|
+
weak: "Clarify how or when the system operates.",
|
|
687
|
+
},
|
|
688
|
+
}),
|
|
689
|
+
methodSlot("control_or_feedback", "The control, feedback loop, metric, or governance signal used by the system.", {
|
|
690
|
+
required: false,
|
|
691
|
+
acceptedEntityTypes: ["control", "feedback", "metric", "governance"],
|
|
692
|
+
diagnostics: {
|
|
693
|
+
weak: "Clarify how the system controls or learns from performance.",
|
|
694
|
+
},
|
|
695
|
+
}),
|
|
696
|
+
];
|
|
697
|
+
const principleSlots = [
|
|
698
|
+
methodSlot("principle", "The durable rule, standard, belief, or operating doctrine that should guide decisions.", {
|
|
699
|
+
acceptedEntityTypes: ["principle", "standard", "belief", "doctrine", "rule"],
|
|
700
|
+
diagnostics: {
|
|
701
|
+
missing: "State the principle that should guide decisions.",
|
|
702
|
+
weak: "Make the principle specific enough to constrain choices.",
|
|
703
|
+
},
|
|
704
|
+
}),
|
|
705
|
+
methodSlot("decision_context", "The decision, behavior, system, team, or tradeoff the principle governs.", {
|
|
706
|
+
required: false,
|
|
707
|
+
acceptedEntityTypes: ["decision", "behavior", "system", "team", "tradeoff"],
|
|
708
|
+
diagnostics: {
|
|
709
|
+
weak: "Clarify what context this principle governs.",
|
|
710
|
+
},
|
|
711
|
+
}),
|
|
712
|
+
methodSlot("priority_or_tradeoff", "The priority, tradeoff, or preference implied by the principle.", {
|
|
713
|
+
required: false,
|
|
714
|
+
acceptedEntityTypes: ["priority", "tradeoff", "preference"],
|
|
715
|
+
diagnostics: {
|
|
716
|
+
weak: "Clarify what this principle prioritizes or rules out.",
|
|
717
|
+
},
|
|
718
|
+
}),
|
|
719
|
+
methodSlot("exception_condition", "The condition under which the principle may not apply.", {
|
|
720
|
+
required: false,
|
|
721
|
+
acceptedEntityTypes: ["condition", "exception", "constraint"],
|
|
722
|
+
diagnostics: {
|
|
723
|
+
weak: "Clarify exceptions if the principle is not universal.",
|
|
724
|
+
},
|
|
725
|
+
}),
|
|
726
|
+
];
|
|
727
|
+
function element(position, type, component, expectedMood, examples, options = {}) {
|
|
728
|
+
const schemaElement = Object.values(ELEMENT_TYPES).find((candidate) => candidate.value === type);
|
|
729
|
+
if (!schemaElement) {
|
|
730
|
+
throw new Error(`Unknown canonical element type: ${type}`);
|
|
731
|
+
}
|
|
732
|
+
const definition = {
|
|
733
|
+
type,
|
|
734
|
+
label: schemaElement.label,
|
|
735
|
+
acronym: schemaElement.acronym,
|
|
736
|
+
component,
|
|
737
|
+
position,
|
|
738
|
+
expectedMood,
|
|
739
|
+
syntacticSlots: options.syntacticSlots ??
|
|
740
|
+
(expectedMood === "imperative"
|
|
741
|
+
? imperativeSyntax
|
|
742
|
+
: expectedMood === "noun_phrase"
|
|
743
|
+
? nounPhraseSyntax
|
|
744
|
+
: indicativeSyntax),
|
|
745
|
+
methodSlots: options.methodSlots ??
|
|
746
|
+
(expectedMood === "imperative" || expectedMood === "noun_phrase"
|
|
747
|
+
? imperativeMethodSlots
|
|
748
|
+
: indicativeMethodSlots),
|
|
749
|
+
examples,
|
|
750
|
+
rules: {
|
|
751
|
+
examplesRequired: options.rules?.examplesRequired ?? true,
|
|
752
|
+
minimumRequiredSlots: options.rules?.minimumRequiredSlots ??
|
|
753
|
+
(options.methodSlots ?? (expectedMood === "imperative" || expectedMood === "noun_phrase"
|
|
754
|
+
? imperativeMethodSlots
|
|
755
|
+
: indicativeMethodSlots)).filter((slot) => slot.required).length,
|
|
756
|
+
allowInference: options.rules?.allowInference ?? false,
|
|
757
|
+
diagnostics: {
|
|
758
|
+
wrongMood: options.rules?.diagnostics?.wrongMood ??
|
|
759
|
+
`${schemaElement.label} should be written in ${expectedMood.replace("_", " ")} mood.`,
|
|
760
|
+
insufficient: options.rules?.diagnostics?.insufficient ??
|
|
761
|
+
`${schemaElement.label} does not yet contain enough method substance.`,
|
|
762
|
+
missing: options.rules?.diagnostics?.missing ??
|
|
763
|
+
`${schemaElement.label} is missing required method substance.`,
|
|
764
|
+
weak: options.rules?.diagnostics?.weak ??
|
|
765
|
+
`${schemaElement.label} needs sharper method substance.`,
|
|
766
|
+
invalid: options.rules?.diagnostics?.invalid ??
|
|
767
|
+
`${schemaElement.label} does not match its method definition.`,
|
|
768
|
+
},
|
|
769
|
+
},
|
|
770
|
+
};
|
|
771
|
+
if (options.aliases) {
|
|
772
|
+
definition.aliases = options.aliases;
|
|
773
|
+
}
|
|
774
|
+
if (options.allowedEntityTypes) {
|
|
775
|
+
definition.allowedEntityTypes = options.allowedEntityTypes;
|
|
776
|
+
}
|
|
777
|
+
return definition;
|
|
778
|
+
}
|
|
779
|
+
export const componentDefinitions = [
|
|
780
|
+
{
|
|
781
|
+
type: COMPONENT_TYPES.DIAGNOSIS.value,
|
|
782
|
+
label: COMPONENT_TYPES.DIAGNOSIS.label,
|
|
783
|
+
acronym: COMPONENT_TYPES.DIAGNOSIS.acronym,
|
|
784
|
+
position: 1,
|
|
785
|
+
},
|
|
786
|
+
{
|
|
787
|
+
type: COMPONENT_TYPES.METHOD.value,
|
|
788
|
+
label: COMPONENT_TYPES.METHOD.label,
|
|
789
|
+
acronym: COMPONENT_TYPES.METHOD.acronym,
|
|
790
|
+
position: 2,
|
|
791
|
+
},
|
|
792
|
+
{
|
|
793
|
+
type: COMPONENT_TYPES.INITIATIVES.value,
|
|
794
|
+
label: COMPONENT_TYPES.INITIATIVES.label,
|
|
795
|
+
acronym: COMPONENT_TYPES.INITIATIVES.acronym,
|
|
796
|
+
position: 3,
|
|
797
|
+
},
|
|
798
|
+
{
|
|
799
|
+
type: COMPONENT_TYPES.MEASURES.value,
|
|
800
|
+
label: COMPONENT_TYPES.MEASURES.label,
|
|
801
|
+
acronym: COMPONENT_TYPES.MEASURES.acronym,
|
|
802
|
+
position: 4,
|
|
803
|
+
},
|
|
804
|
+
{
|
|
805
|
+
type: COMPONENT_TYPES.SUPPORT.value,
|
|
806
|
+
label: COMPONENT_TYPES.SUPPORT.label,
|
|
807
|
+
acronym: COMPONENT_TYPES.SUPPORT.acronym,
|
|
808
|
+
position: 5,
|
|
809
|
+
},
|
|
810
|
+
];
|
|
811
|
+
const componentPosition = new Map(componentDefinitions.map((component) => [component.type, component.position]));
|
|
812
|
+
function elementPositionInSchema(type) {
|
|
813
|
+
for (const [component, elements] of Object.entries(SKHEMA_MAPPING.elementFlow)) {
|
|
814
|
+
const index = elements.findIndex((element) => element.value === type);
|
|
815
|
+
if (index === -1)
|
|
816
|
+
continue;
|
|
817
|
+
return (componentPosition.get(component) ?? 0) * 100 + index;
|
|
818
|
+
}
|
|
819
|
+
return 9999;
|
|
820
|
+
}
|
|
821
|
+
export const elementDefinitions = [
|
|
822
|
+
element(elementPositionInSchema("key_challenge"), "key_challenge", "diagnosis", "indicative", [
|
|
823
|
+
"Anti-competition laws in Australia hinder the ability to grow through acquisitions.",
|
|
824
|
+
], {
|
|
825
|
+
methodSlots: keyChallengeSlots,
|
|
826
|
+
rules: {
|
|
827
|
+
minimumRequiredSlots: 3,
|
|
828
|
+
diagnostics: {
|
|
829
|
+
insufficient: "A key challenge must identify who is facing the challenge, what pressure is creating it, and why it matters.",
|
|
830
|
+
},
|
|
831
|
+
},
|
|
832
|
+
}),
|
|
833
|
+
element(elementPositionInSchema("supporting_fact"), "supporting_fact", "diagnosis", "indicative", [
|
|
834
|
+
"Q1 FY24 sales reached $1.5M, 18% below the prior year.",
|
|
835
|
+
"Foot traffic declined 12% across metropolitan stores over the past two quarters.",
|
|
836
|
+
], {
|
|
837
|
+
methodSlots: supportingFactSlots,
|
|
838
|
+
rules: {
|
|
839
|
+
minimumRequiredSlots: 2,
|
|
840
|
+
diagnostics: {
|
|
841
|
+
insufficient: "A supporting fact must identify what is being measured or observed and state the evidence clearly.",
|
|
842
|
+
},
|
|
843
|
+
},
|
|
844
|
+
}),
|
|
845
|
+
element(elementPositionInSchema("impact"), "impact", "diagnosis", "indicative", [
|
|
846
|
+
"Employee turnover rates increase substantially when aggressive price competition limits earnings potential for sales personnel dependent on commission-based income.",
|
|
847
|
+
"Interest rate adjustments accelerate the depreciation of inventory holdings, reducing the collateral value available for securing additional floor plan financing.",
|
|
848
|
+
"Customer acquisition costs may remain high due to high percentage of offline media spend.",
|
|
849
|
+
], {
|
|
850
|
+
aliases: ["associated_impact"],
|
|
851
|
+
methodSlots: impactSlots,
|
|
852
|
+
rules: {
|
|
853
|
+
minimumRequiredSlots: 2,
|
|
854
|
+
diagnostics: {
|
|
855
|
+
insufficient: "An impact must identify what is affected and explain how the challenge creates that effect.",
|
|
856
|
+
},
|
|
857
|
+
},
|
|
858
|
+
}),
|
|
859
|
+
element(elementPositionInSchema("guiding_policy"), "guiding_policy", "method", "imperative", [
|
|
860
|
+
"Use dynamically adjusted prices during off-peak periods.",
|
|
861
|
+
"Shift down market to lower priced goods.",
|
|
862
|
+
"Focus on secondary sale periods.",
|
|
863
|
+
"Use network effects to expand our audience and identify new customer segments.",
|
|
864
|
+
], {
|
|
865
|
+
methodSlots: guidingPolicySlots,
|
|
866
|
+
allowedEntityTypes: [
|
|
867
|
+
"Category",
|
|
868
|
+
"Segment",
|
|
869
|
+
"Geography",
|
|
870
|
+
"Channel",
|
|
871
|
+
"Function",
|
|
872
|
+
"Cost",
|
|
873
|
+
"Labour",
|
|
874
|
+
"Approach",
|
|
875
|
+
"Method",
|
|
876
|
+
"Move",
|
|
877
|
+
"Position",
|
|
878
|
+
"Instrument",
|
|
879
|
+
"Source of Advantage",
|
|
880
|
+
"Resource",
|
|
881
|
+
"Other",
|
|
882
|
+
],
|
|
883
|
+
rules: {
|
|
884
|
+
minimumRequiredSlots: 2,
|
|
885
|
+
diagnostics: {
|
|
886
|
+
insufficient: "A guiding policy must state a strategic action and the object it acts on.",
|
|
887
|
+
},
|
|
888
|
+
},
|
|
889
|
+
}),
|
|
890
|
+
element(elementPositionInSchema("competitor_move"), "competitor_move", "method", "indicative", [
|
|
891
|
+
"Competitors will reduce stock levels at similar rates to maintain lower inventory costs.",
|
|
892
|
+
"Google may impose restrictions on third-party applications, making access to distribution channels more difficult.",
|
|
893
|
+
], {
|
|
894
|
+
methodSlots: competitorMoveSlots,
|
|
895
|
+
rules: {
|
|
896
|
+
minimumRequiredSlots: 2,
|
|
897
|
+
diagnostics: {
|
|
898
|
+
insufficient: "A competitor move must identify the actor making the move and the move being made.",
|
|
899
|
+
},
|
|
900
|
+
},
|
|
901
|
+
}),
|
|
902
|
+
element(elementPositionInSchema("scope"), "scope", "method", "imperative", [
|
|
903
|
+
"Open new stores in Australia and New Zealand.",
|
|
904
|
+
"Target women 25-45 years old.",
|
|
905
|
+
"Prioritize API-driven integrations with enterprise resource planning platforms.",
|
|
906
|
+
], {
|
|
907
|
+
methodSlots: scopeSlots,
|
|
908
|
+
allowedEntityTypes: ["Audience", "Market", "Category", "Product", "Service", "Vertical Stage", "Other"],
|
|
909
|
+
rules: {
|
|
910
|
+
minimumRequiredSlots: 1,
|
|
911
|
+
diagnostics: {
|
|
912
|
+
insufficient: "A scope element must define what is included, excluded, or bounded.",
|
|
913
|
+
},
|
|
914
|
+
},
|
|
915
|
+
}),
|
|
916
|
+
element(elementPositionInSchema("constraint"), "constraint", "method", "indicative", [
|
|
917
|
+
"Differences in advertising regulations across geographic regions means some campaigns cannot be replicated.",
|
|
918
|
+
"Production line volumes cannot exceed 2,000 units per day.",
|
|
919
|
+
], {
|
|
920
|
+
methodSlots: constraintSlots,
|
|
921
|
+
allowedEntityTypes: [
|
|
922
|
+
"internal",
|
|
923
|
+
"externality",
|
|
924
|
+
"fiscal",
|
|
925
|
+
"regulatory",
|
|
926
|
+
"competitive",
|
|
927
|
+
"technological",
|
|
928
|
+
"environmental",
|
|
929
|
+
"social",
|
|
930
|
+
"temporal",
|
|
931
|
+
"other",
|
|
932
|
+
],
|
|
933
|
+
rules: {
|
|
934
|
+
minimumRequiredSlots: 2,
|
|
935
|
+
diagnostics: {
|
|
936
|
+
insufficient: "A constraint must identify the source of the limitation and the limitation it imposes.",
|
|
937
|
+
},
|
|
938
|
+
},
|
|
939
|
+
}),
|
|
940
|
+
element(elementPositionInSchema("solution"), "solution", "initiatives", "noun_phrase", [
|
|
941
|
+
"Remove poor profit margin products.",
|
|
942
|
+
"Exit the Australian market.",
|
|
943
|
+
"Divest Catch of the Day and seek to acquire major global brand.",
|
|
944
|
+
], {
|
|
945
|
+
aliases: ["solution_alternative"],
|
|
946
|
+
methodSlots: solutionSlots,
|
|
947
|
+
rules: {
|
|
948
|
+
minimumRequiredSlots: 1,
|
|
949
|
+
diagnostics: {
|
|
950
|
+
insufficient: "A solution must identify the strategic option or intervention being considered.",
|
|
951
|
+
},
|
|
952
|
+
},
|
|
953
|
+
}),
|
|
954
|
+
element(elementPositionInSchema("assumption_hypothesis"), "assumption_hypothesis", "initiatives", "indicative", [
|
|
955
|
+
"Younger women are willing to pay a premium for prestige-like products sold through traditional mass channels.",
|
|
956
|
+
"Price reductions improve sales growth if increased customer transaction volume offsets a reduction in average spend.",
|
|
957
|
+
], {
|
|
958
|
+
methodSlots: assumptionHypothesisSlots,
|
|
959
|
+
rules: {
|
|
960
|
+
minimumRequiredSlots: 1,
|
|
961
|
+
diagnostics: {
|
|
962
|
+
insufficient: "An assumption hypothesis must state the belief or condition that needs to be true.",
|
|
963
|
+
},
|
|
964
|
+
},
|
|
965
|
+
}),
|
|
966
|
+
element(elementPositionInSchema("experiment"), "experiment", "initiatives", "imperative", [
|
|
967
|
+
"Conduct a market test by launching a limited edition prestige-like Olay product in select mass channels.",
|
|
968
|
+
"Model scenario with 4, 6, and 8 year projections.",
|
|
969
|
+
], {
|
|
970
|
+
methodSlots: experimentSlots,
|
|
971
|
+
rules: {
|
|
972
|
+
minimumRequiredSlots: 1,
|
|
973
|
+
diagnostics: {
|
|
974
|
+
insufficient: "An experiment must state the test action to perform.",
|
|
975
|
+
},
|
|
976
|
+
},
|
|
977
|
+
}),
|
|
978
|
+
element(elementPositionInSchema("action"), "action", "initiatives", "imperative", [
|
|
979
|
+
"Collaborate with retail partners to create a masstige in-store experience for Olay products.",
|
|
980
|
+
"Identify 10 new stores based on site selection analysis.",
|
|
981
|
+
], {
|
|
982
|
+
methodSlots: actionSlots,
|
|
983
|
+
rules: {
|
|
984
|
+
minimumRequiredSlots: 1,
|
|
985
|
+
diagnostics: {
|
|
986
|
+
insufficient: "An action must state the concrete task, decision, or implementation step to perform.",
|
|
987
|
+
},
|
|
988
|
+
},
|
|
989
|
+
}),
|
|
990
|
+
element(elementPositionInSchema("investment"), "investment", "initiatives", "noun_phrase", ["Return on Invested Capital."], {
|
|
991
|
+
methodSlots: investmentSlots,
|
|
992
|
+
rules: {
|
|
993
|
+
minimumRequiredSlots: 2,
|
|
994
|
+
diagnostics: {
|
|
995
|
+
insufficient: "An investment must identify the commitment amount and what is being invested in.",
|
|
996
|
+
},
|
|
997
|
+
},
|
|
998
|
+
}),
|
|
999
|
+
element(elementPositionInSchema("estimate"), "estimate", "initiatives", "indicative", [
|
|
1000
|
+
"500,000 new sales in first half.",
|
|
1001
|
+
"Incremental 1% gain in soft goods market share equals a $34m revenue opportunity.",
|
|
1002
|
+
], {
|
|
1003
|
+
methodSlots: estimateSlots,
|
|
1004
|
+
rules: {
|
|
1005
|
+
minimumRequiredSlots: 2,
|
|
1006
|
+
diagnostics: {
|
|
1007
|
+
insufficient: "An estimate must state what is being estimated and the estimated amount or range.",
|
|
1008
|
+
},
|
|
1009
|
+
},
|
|
1010
|
+
}),
|
|
1011
|
+
element(elementPositionInSchema("baseline"), "baseline", "measures", "indicative", [
|
|
1012
|
+
"Q1 FY24 sales reached $1.5M.",
|
|
1013
|
+
"5,000 SKUs have a profit margin below 25%.",
|
|
1014
|
+
], {
|
|
1015
|
+
methodSlots: baselineSlots,
|
|
1016
|
+
rules: {
|
|
1017
|
+
minimumRequiredSlots: 2,
|
|
1018
|
+
diagnostics: {
|
|
1019
|
+
insufficient: "A baseline must identify what is measured and the starting value or condition.",
|
|
1020
|
+
},
|
|
1021
|
+
},
|
|
1022
|
+
}),
|
|
1023
|
+
element(elementPositionInSchema("outcome"), "outcome", "measures", "noun_phrase", [
|
|
1024
|
+
"$2 million revenue by 2025.",
|
|
1025
|
+
"Total sales for Q3 FY25 to exceed $1.6M.",
|
|
1026
|
+
], {
|
|
1027
|
+
methodSlots: outcomeSlots,
|
|
1028
|
+
rules: {
|
|
1029
|
+
minimumRequiredSlots: 2,
|
|
1030
|
+
diagnostics: {
|
|
1031
|
+
insufficient: "An outcome must identify the target object and the desired value or state.",
|
|
1032
|
+
},
|
|
1033
|
+
},
|
|
1034
|
+
}),
|
|
1035
|
+
element(elementPositionInSchema("performance_variable"), "performance_variable", "measures", "noun_phrase", [
|
|
1036
|
+
"Average number of units sold per retailer.",
|
|
1037
|
+
"Weekly foot traffic exceeds 500.",
|
|
1038
|
+
], {
|
|
1039
|
+
methodSlots: performanceVariableSlots,
|
|
1040
|
+
rules: {
|
|
1041
|
+
minimumRequiredSlots: 1,
|
|
1042
|
+
diagnostics: {
|
|
1043
|
+
insufficient: "A performance variable must identify the metric or indicator to track.",
|
|
1044
|
+
},
|
|
1045
|
+
},
|
|
1046
|
+
}),
|
|
1047
|
+
element(elementPositionInSchema("capability"), "capability", "support", "noun_phrase", [
|
|
1048
|
+
"Inventory management: hold less stock and replenish on demand.",
|
|
1049
|
+
"Strategic site selection analysis with GIS competency.",
|
|
1050
|
+
], {
|
|
1051
|
+
methodSlots: capabilitySlots,
|
|
1052
|
+
rules: {
|
|
1053
|
+
minimumRequiredSlots: 1,
|
|
1054
|
+
diagnostics: {
|
|
1055
|
+
insufficient: "A capability must identify the organizational ability required to support the strategy.",
|
|
1056
|
+
},
|
|
1057
|
+
},
|
|
1058
|
+
}),
|
|
1059
|
+
element(elementPositionInSchema("system"), "system", "support", "noun_phrase", [
|
|
1060
|
+
"Implementation of a strategic sales management system focusing on high margin products.",
|
|
1061
|
+
"Daily store foot traffic analysis.",
|
|
1062
|
+
], {
|
|
1063
|
+
methodSlots: systemSlots,
|
|
1064
|
+
rules: {
|
|
1065
|
+
minimumRequiredSlots: 1,
|
|
1066
|
+
diagnostics: {
|
|
1067
|
+
insufficient: "A system must identify the process, tool, governance mechanism, or routine that supports execution.",
|
|
1068
|
+
},
|
|
1069
|
+
},
|
|
1070
|
+
}),
|
|
1071
|
+
element(elementPositionInSchema("principle"), "principle", "support", "imperative", [
|
|
1072
|
+
"Prioritize domestic market before considering international expansion.",
|
|
1073
|
+
"Put the customer first.",
|
|
1074
|
+
], {
|
|
1075
|
+
methodSlots: principleSlots,
|
|
1076
|
+
rules: {
|
|
1077
|
+
minimumRequiredSlots: 1,
|
|
1078
|
+
diagnostics: {
|
|
1079
|
+
insufficient: "A principle must state the durable rule or standard that should guide decisions.",
|
|
1080
|
+
},
|
|
1081
|
+
},
|
|
1082
|
+
}),
|
|
1083
|
+
];
|
|
1084
|
+
export const elementRelationshipDefinitions = [
|
|
1085
|
+
relationship("key_challenge", "supporting_fact", "EVIDENCED_BY", "Evidenced By", "A key challenge is evidenced by supporting facts."),
|
|
1086
|
+
relationship("key_challenge", "impact", "CAUSES", "Causes", "A key challenge causes or contributes to an impact."),
|
|
1087
|
+
relationship("key_challenge", "guiding_policy", "ADDRESSED_BY", "Addressed By", "A key challenge is addressed by a guiding policy.", {
|
|
1088
|
+
cardinality: "one_or_more",
|
|
1089
|
+
requiredForCompleteness: true,
|
|
1090
|
+
diagnostics: {
|
|
1091
|
+
missing: "Link the key challenge to at least one guiding policy.",
|
|
1092
|
+
},
|
|
1093
|
+
}),
|
|
1094
|
+
relationship("scope", "guiding_policy", "LIMITS", "Limits", "Scope limits the guiding policy."),
|
|
1095
|
+
relationship("constraint", "guiding_policy", "CONSTRAINS", "Constrains", "A constraint narrows or restricts a guiding policy."),
|
|
1096
|
+
relationship("competitor_move", "key_challenge", "THREATENS", "Threatens", "A competitor move can threaten or intensify a key challenge."),
|
|
1097
|
+
relationship("guiding_policy", "solution", "IMPLEMENTED_VIA", "Implemented Via", "A guiding policy is implemented through solutions.", {
|
|
1098
|
+
cardinality: "one_or_more",
|
|
1099
|
+
requiredForCompleteness: true,
|
|
1100
|
+
diagnostics: {
|
|
1101
|
+
missing: "Link the guiding policy to at least one solution.",
|
|
1102
|
+
},
|
|
1103
|
+
}),
|
|
1104
|
+
relationship("constraint", "solution", "CONSTRAINS", "Constrains", "A constraint limits a solution."),
|
|
1105
|
+
relationship("solution", "assumption_hypothesis", "VALIDATED_BY", "Validated By", "A solution is validated by assumptions or hypotheses."),
|
|
1106
|
+
relationship("assumption_hypothesis", "experiment", "TESTED_BY", "Tested By", "An assumption or hypothesis is tested by an experiment."),
|
|
1107
|
+
relationship("experiment", "action", "PRODUCES", "Produces", "An experiment produces actions or evidence for action."),
|
|
1108
|
+
relationship("solution", "investment", "REQUIRES_INVESTMENT", "Requires Investment", "A solution requires investment."),
|
|
1109
|
+
relationship("solution", "estimate", "ESTIMATED_AT", "Estimated At", "A solution is estimated by an estimate."),
|
|
1110
|
+
relationship("solution", "outcome", "TARGETS", "Targets", "A solution targets an outcome."),
|
|
1111
|
+
relationship("baseline", "outcome", "COMPARED_TO", "Compared To", "A baseline is compared to an outcome."),
|
|
1112
|
+
relationship("outcome", "performance_variable", "MEASURED_BY", "Measured By", "An outcome is measured by performance variables."),
|
|
1113
|
+
relationship("solution", "capability", "REQUIRES_CAPABILITY", "Requires Capability", "A solution requires capabilities."),
|
|
1114
|
+
relationship("capability", "system", "SUPPORTED_BY", "Supported By", "A capability is supported by systems."),
|
|
1115
|
+
relationship("system", "principle", "GOVERNED_BY", "Governed By", "A system is governed by principles."),
|
|
1116
|
+
];
|
|
1117
|
+
//# sourceMappingURL=definitions.js.map
|