@wildwinter/toolkit 0.2.0 → 0.2.1

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.
@@ -1,96 +1,741 @@
1
1
  {
2
2
  "about": "Value validation. A case gives a field declaration and a value (valueProblems), or a target and a node's entry (entryProblems), with the nodes that exist for references as kind:id. Paths are relative to the value or entry. A problem's severity is error unless the case says warning; `options` is checked where given.",
3
3
  "cases": [
4
- { "name": "scalars that fit pass", "decl": { "name": "a", "type": "text" }, "value": "hello", "problems": [] },
5
- { "name": "multiline is text", "decl": { "name": "a", "type": "multiline" }, "value": "one\ntwo", "problems": [] },
6
- { "name": "text is not a number", "decl": { "name": "a", "type": "text" }, "value": 3,
7
- "problems": [{ "path": "", "code": "wrong-type" }] },
8
- { "name": "a number within its range", "decl": { "name": "a", "type": "number", "min": 0, "max": 5 }, "value": 5, "problems": [] },
9
- { "name": "a number below its minimum", "decl": { "name": "a", "type": "number", "min": 0 }, "value": -1,
10
- "problems": [{ "path": "", "code": "below-min" }] },
11
- { "name": "a number above its maximum", "decl": { "name": "a", "type": "number", "max": 5 }, "value": 6,
12
- "problems": [{ "path": "", "code": "above-max" }] },
13
- { "name": "a boolean is not a string", "decl": { "name": "a", "type": "boolean" }, "value": "true",
14
- "problems": [{ "path": "", "code": "wrong-type" }] },
15
- { "name": "an enum value", "decl": { "name": "a", "type": "enum", "values": ["x", "y"] }, "value": "y", "problems": [] },
16
- { "name": "an enum may be none chosen", "decl": { "name": "a", "type": "enum", "values": ["x", "y"] }, "value": "", "problems": [] },
17
- { "name": "an enum value that is not listed", "decl": { "name": "a", "type": "enum", "values": ["x", "y"] }, "value": "z",
18
- "problems": [{ "path": "", "code": "not-a-value", "options": ["x", "y"] }] },
19
- { "name": "flags, a subset", "decl": { "name": "a", "type": "flags", "values": ["x", "y"] }, "value": ["y"], "problems": [] },
20
- { "name": "flags naming something unlisted", "decl": { "name": "a", "type": "flags", "values": ["x", "y"] }, "value": ["x", "q"],
21
- "problems": [{ "path": "", "code": "not-a-value", "options": ["x", "y"] }] },
22
- { "name": "flags are a list", "decl": { "name": "a", "type": "flags", "values": ["x"] }, "value": "x",
23
- "problems": [{ "path": "", "code": "wrong-type" }] },
24
- { "name": "a quality on a stage", "decl": { "name": "a", "type": "quality", "stages": ["p", "q", "r", "s"] }, "value": "q", "problems": [] },
25
- { "name": "a quality may not be none chosen", "decl": { "name": "a", "type": "quality", "stages": ["p", "q"] }, "value": "",
26
- "problems": [{ "path": "", "code": "not-a-stage", "options": ["p", "q"] }] },
27
- { "name": "a stage that is gone offers the whole ladder", "decl": { "name": "a", "type": "quality", "stages": ["p", "q", "r", "s"] }, "value": "gone",
28
- "problems": [{ "path": "", "code": "not-a-stage", "options": ["p", "q", "r", "s"] }] },
29
- { "name": "a renamed stage is a warning until the project takes the new name", "decl": { "name": "a", "type": "quality", "stages": ["p", "q"], "renamedStages": { "old": "q" } }, "value": "old",
30
- "problems": [{ "path": "", "code": "renamed-stage", "severity": "warning", "options": ["q"] }] },
31
- { "name": "a reference to a node that exists", "decl": { "name": "a", "type": "reference", "to": "card" }, "value": "c_1",
32
- "refs": ["card:c_1"], "problems": [] },
33
- { "name": "a reference to a node that does not", "decl": { "name": "a", "type": "reference", "to": "card" }, "value": "c_2",
34
- "refs": ["card:c_1", "deck:c_2"], "problems": [{ "path": "", "code": "no-such-node" }] },
35
- { "name": "an empty reference names nothing and is allowed", "decl": { "name": "a", "type": "reference", "to": "card" }, "value": "",
36
- "refs": [], "problems": [] },
37
- { "name": "a reference is a string", "decl": { "name": "a", "type": "reference", "to": "card" }, "value": 7,
38
- "problems": [{ "path": "", "code": "wrong-type" }] },
39
- { "name": "references are not checked when the host gives no nodes", "decl": { "name": "a", "type": "reference", "to": "card" }, "value": "c_9",
40
- "problems": [] },
41
- { "name": "a record, field by field",
42
- "decl": { "name": "cue", "type": "record", "fields": [
43
- { "name": "sound", "type": "text", "required": true }, { "name": "gain", "type": "number", "max": 1 }, { "name": "at", "type": "reference", "to": "tag" }
44
- ] },
45
- "value": { "gain": 2, "at": "v_x", "colour": "red" }, "refs": ["tag:v_y"],
46
- "problems": [
47
- { "path": "sound", "code": "required" },
48
- { "path": "gain", "code": "above-max" },
49
- { "path": "at", "code": "no-such-node" },
50
- { "path": "colour", "code": "unknown-field", "severity": "warning" }
51
- ] },
52
- { "name": "a record is an object", "decl": { "name": "cue", "type": "record", "fields": [{ "name": "s", "type": "text" }] }, "value": ["s"],
53
- "problems": [{ "path": "", "code": "wrong-type" }] },
54
- { "name": "a map keyed by reference: keys and values checked",
55
- "decl": { "name": "perf", "type": "map", "key": { "type": "reference", "to": "tag" }, "of": { "type": "enum", "values": ["smile", "frown"] } },
56
- "value": { "v_a": "smile", "v_gone": "frown", "v_b": "shrug" }, "refs": ["tag:v_a", "tag:v_b"],
57
- "problems": [
58
- { "path": "v_gone", "code": "no-such-node" },
59
- { "path": "v_b", "code": "not-a-value", "options": ["smile", "frown"] }
60
- ] },
61
- { "name": "a map keyed by text takes any key, quoted in a path when it must be",
62
- "decl": { "name": "m", "type": "map", "key": { "type": "text" }, "of": { "type": "number" } },
63
- "value": { "first one": "1", "b": 2 },
64
- "problems": [{ "path": "[\"first one\"]", "code": "wrong-type" }] },
65
- { "name": "a list with ids: each id present and unique, each item checked",
66
- "decl": { "name": "beats", "type": "list", "id": "id", "of": { "type": "record", "fields": [{ "name": "id", "type": "text" }, { "name": "at", "type": "number", "min": 0 }] } },
67
- "value": [{ "id": "b1", "at": 1 }, { "id": "b1", "at": 2 }, { "at": -1 }],
68
- "problems": [
69
- { "path": "[1].id", "code": "duplicate-id" },
70
- { "path": "[2].id", "code": "missing-id" },
71
- { "path": "[2].at", "code": "below-min" }
72
- ] },
73
- { "name": "a list without ids: each item checked",
74
- "decl": { "name": "words", "type": "list", "of": { "type": "text" } },
75
- "value": ["a", 2, "c"],
76
- "problems": [{ "path": "[1]", "code": "wrong-type" }] },
77
- { "name": "a list is an array", "decl": { "name": "words", "type": "list", "of": { "type": "text" } }, "value": "a",
78
- "problems": [{ "path": "", "code": "wrong-type" }] },
79
- { "name": "an entry: required fields, unknown fields, each value",
80
- "target": { "fields": [
81
- { "name": "loud", "type": "boolean", "required": true },
82
- { "name": "tone", "type": "enum", "values": ["calm", "tense"] },
83
- { "name": "note", "type": "text" }
84
- ] },
85
- "entry": { "tone": "wild", "tune": "calm" },
86
- "problems": [
87
- { "path": "loud", "code": "required" },
88
- { "path": "tone", "code": "not-a-value", "options": ["calm", "tense"] },
89
- { "path": "tune", "code": "unknown-field", "severity": "warning" }
90
- ] },
91
- { "name": "an empty entry is fine when nothing is required",
92
- "target": { "fields": [{ "name": "note", "type": "text" }] }, "entry": {}, "problems": [] },
93
- { "name": "an entry is an object", "target": { "fields": [{ "name": "note", "type": "text" }] }, "entry": "note",
94
- "problems": [{ "path": "", "code": "wrong-type" }] }
4
+ {
5
+ "name": "scalars that fit pass",
6
+ "decl": {
7
+ "name": "a",
8
+ "type": "text"
9
+ },
10
+ "value": "hello",
11
+ "problems": []
12
+ },
13
+ {
14
+ "name": "multiline is text",
15
+ "decl": {
16
+ "name": "a",
17
+ "type": "multiline"
18
+ },
19
+ "value": "one\ntwo",
20
+ "problems": []
21
+ },
22
+ {
23
+ "name": "text is not a number",
24
+ "decl": {
25
+ "name": "a",
26
+ "type": "text"
27
+ },
28
+ "value": 3,
29
+ "problems": [
30
+ {
31
+ "path": "",
32
+ "code": "wrong-type"
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ "name": "a number within its range",
38
+ "decl": {
39
+ "name": "a",
40
+ "type": "number",
41
+ "min": 0,
42
+ "max": 5
43
+ },
44
+ "value": 5,
45
+ "problems": []
46
+ },
47
+ {
48
+ "name": "a number below its minimum",
49
+ "decl": {
50
+ "name": "a",
51
+ "type": "number",
52
+ "min": 0
53
+ },
54
+ "value": -1,
55
+ "problems": [
56
+ {
57
+ "path": "",
58
+ "code": "below-min"
59
+ }
60
+ ]
61
+ },
62
+ {
63
+ "name": "a number above its maximum",
64
+ "decl": {
65
+ "name": "a",
66
+ "type": "number",
67
+ "max": 5
68
+ },
69
+ "value": 6,
70
+ "problems": [
71
+ {
72
+ "path": "",
73
+ "code": "above-max"
74
+ }
75
+ ]
76
+ },
77
+ {
78
+ "name": "a boolean is not a string",
79
+ "decl": {
80
+ "name": "a",
81
+ "type": "boolean"
82
+ },
83
+ "value": "true",
84
+ "problems": [
85
+ {
86
+ "path": "",
87
+ "code": "wrong-type"
88
+ }
89
+ ]
90
+ },
91
+ {
92
+ "name": "an enum value",
93
+ "decl": {
94
+ "name": "a",
95
+ "type": "enum",
96
+ "values": [
97
+ "x",
98
+ "y"
99
+ ]
100
+ },
101
+ "value": "y",
102
+ "problems": []
103
+ },
104
+ {
105
+ "name": "an enum may be none chosen",
106
+ "decl": {
107
+ "name": "a",
108
+ "type": "enum",
109
+ "values": [
110
+ "x",
111
+ "y"
112
+ ]
113
+ },
114
+ "value": "",
115
+ "problems": []
116
+ },
117
+ {
118
+ "name": "an enum value that is not listed",
119
+ "decl": {
120
+ "name": "a",
121
+ "type": "enum",
122
+ "values": [
123
+ "x",
124
+ "y"
125
+ ]
126
+ },
127
+ "value": "z",
128
+ "problems": [
129
+ {
130
+ "path": "",
131
+ "code": "not-a-value",
132
+ "options": [
133
+ "x",
134
+ "y"
135
+ ]
136
+ }
137
+ ]
138
+ },
139
+ {
140
+ "name": "flags, a subset",
141
+ "decl": {
142
+ "name": "a",
143
+ "type": "flags",
144
+ "values": [
145
+ "x",
146
+ "y"
147
+ ]
148
+ },
149
+ "value": [
150
+ "y"
151
+ ],
152
+ "problems": []
153
+ },
154
+ {
155
+ "name": "flags naming something unlisted",
156
+ "decl": {
157
+ "name": "a",
158
+ "type": "flags",
159
+ "values": [
160
+ "x",
161
+ "y"
162
+ ]
163
+ },
164
+ "value": [
165
+ "x",
166
+ "q"
167
+ ],
168
+ "problems": [
169
+ {
170
+ "path": "",
171
+ "code": "not-a-value",
172
+ "options": [
173
+ "x",
174
+ "y"
175
+ ]
176
+ }
177
+ ]
178
+ },
179
+ {
180
+ "name": "flags are a list",
181
+ "decl": {
182
+ "name": "a",
183
+ "type": "flags",
184
+ "values": [
185
+ "x"
186
+ ]
187
+ },
188
+ "value": "x",
189
+ "problems": [
190
+ {
191
+ "path": "",
192
+ "code": "wrong-type"
193
+ }
194
+ ]
195
+ },
196
+ {
197
+ "name": "a quality on a stage",
198
+ "decl": {
199
+ "name": "a",
200
+ "type": "quality",
201
+ "stages": [
202
+ "p",
203
+ "q",
204
+ "r",
205
+ "s"
206
+ ]
207
+ },
208
+ "value": "q",
209
+ "problems": []
210
+ },
211
+ {
212
+ "name": "a quality may not be none chosen",
213
+ "decl": {
214
+ "name": "a",
215
+ "type": "quality",
216
+ "stages": [
217
+ "p",
218
+ "q"
219
+ ]
220
+ },
221
+ "value": "",
222
+ "problems": [
223
+ {
224
+ "path": "",
225
+ "code": "not-a-stage",
226
+ "options": [
227
+ "p",
228
+ "q"
229
+ ]
230
+ }
231
+ ]
232
+ },
233
+ {
234
+ "name": "a stage that is gone offers the whole ladder",
235
+ "decl": {
236
+ "name": "a",
237
+ "type": "quality",
238
+ "stages": [
239
+ "p",
240
+ "q",
241
+ "r",
242
+ "s"
243
+ ]
244
+ },
245
+ "value": "gone",
246
+ "problems": [
247
+ {
248
+ "path": "",
249
+ "code": "not-a-stage",
250
+ "options": [
251
+ "p",
252
+ "q",
253
+ "r",
254
+ "s"
255
+ ]
256
+ }
257
+ ]
258
+ },
259
+ {
260
+ "name": "a renamed stage is a warning until the project takes the new name",
261
+ "decl": {
262
+ "name": "a",
263
+ "type": "quality",
264
+ "stages": [
265
+ "p",
266
+ "q"
267
+ ],
268
+ "renamedStages": {
269
+ "old": "q"
270
+ }
271
+ },
272
+ "value": "old",
273
+ "problems": [
274
+ {
275
+ "path": "",
276
+ "code": "renamed-stage",
277
+ "severity": "warning",
278
+ "options": [
279
+ "q"
280
+ ]
281
+ }
282
+ ]
283
+ },
284
+ {
285
+ "name": "a reference to a node that exists",
286
+ "decl": {
287
+ "name": "a",
288
+ "type": "reference",
289
+ "to": "card"
290
+ },
291
+ "value": "c_1",
292
+ "refs": [
293
+ "card:c_1"
294
+ ],
295
+ "problems": []
296
+ },
297
+ {
298
+ "name": "a reference to a node that does not",
299
+ "decl": {
300
+ "name": "a",
301
+ "type": "reference",
302
+ "to": "card"
303
+ },
304
+ "value": "c_2",
305
+ "refs": [
306
+ "card:c_1",
307
+ "deck:c_2"
308
+ ],
309
+ "problems": [
310
+ {
311
+ "path": "",
312
+ "code": "no-such-node"
313
+ }
314
+ ]
315
+ },
316
+ {
317
+ "name": "an empty reference names nothing and is allowed",
318
+ "decl": {
319
+ "name": "a",
320
+ "type": "reference",
321
+ "to": "card"
322
+ },
323
+ "value": "",
324
+ "refs": [],
325
+ "problems": []
326
+ },
327
+ {
328
+ "name": "a reference is a string",
329
+ "decl": {
330
+ "name": "a",
331
+ "type": "reference",
332
+ "to": "card"
333
+ },
334
+ "value": 7,
335
+ "problems": [
336
+ {
337
+ "path": "",
338
+ "code": "wrong-type"
339
+ }
340
+ ]
341
+ },
342
+ {
343
+ "name": "references are not checked when the host gives no nodes",
344
+ "decl": {
345
+ "name": "a",
346
+ "type": "reference",
347
+ "to": "card"
348
+ },
349
+ "value": "c_9",
350
+ "problems": []
351
+ },
352
+ {
353
+ "name": "a record, field by field",
354
+ "decl": {
355
+ "name": "cue",
356
+ "type": "record",
357
+ "fields": [
358
+ {
359
+ "name": "sound",
360
+ "type": "text",
361
+ "required": true
362
+ },
363
+ {
364
+ "name": "gain",
365
+ "type": "number",
366
+ "max": 1
367
+ },
368
+ {
369
+ "name": "at",
370
+ "type": "reference",
371
+ "to": "tag"
372
+ }
373
+ ]
374
+ },
375
+ "value": {
376
+ "gain": 2,
377
+ "at": "v_x",
378
+ "colour": "red"
379
+ },
380
+ "refs": [
381
+ "tag:v_y"
382
+ ],
383
+ "problems": [
384
+ {
385
+ "path": "sound",
386
+ "code": "required"
387
+ },
388
+ {
389
+ "path": "gain",
390
+ "code": "above-max"
391
+ },
392
+ {
393
+ "path": "at",
394
+ "code": "no-such-node"
395
+ },
396
+ {
397
+ "path": "colour",
398
+ "code": "unknown-field",
399
+ "severity": "warning"
400
+ }
401
+ ]
402
+ },
403
+ {
404
+ "name": "a record is an object",
405
+ "decl": {
406
+ "name": "cue",
407
+ "type": "record",
408
+ "fields": [
409
+ {
410
+ "name": "s",
411
+ "type": "text"
412
+ }
413
+ ]
414
+ },
415
+ "value": [
416
+ "s"
417
+ ],
418
+ "problems": [
419
+ {
420
+ "path": "",
421
+ "code": "wrong-type"
422
+ }
423
+ ]
424
+ },
425
+ {
426
+ "name": "a map keyed by reference: keys and values checked",
427
+ "decl": {
428
+ "name": "perf",
429
+ "type": "map",
430
+ "key": {
431
+ "type": "reference",
432
+ "to": "tag"
433
+ },
434
+ "of": {
435
+ "type": "enum",
436
+ "values": [
437
+ "smile",
438
+ "frown"
439
+ ]
440
+ }
441
+ },
442
+ "value": {
443
+ "v_a": "smile",
444
+ "v_gone": "frown",
445
+ "v_b": "shrug"
446
+ },
447
+ "refs": [
448
+ "tag:v_a",
449
+ "tag:v_b"
450
+ ],
451
+ "problems": [
452
+ {
453
+ "path": "v_gone",
454
+ "code": "no-such-node"
455
+ },
456
+ {
457
+ "path": "v_b",
458
+ "code": "not-a-value",
459
+ "options": [
460
+ "smile",
461
+ "frown"
462
+ ]
463
+ }
464
+ ]
465
+ },
466
+ {
467
+ "name": "a map keyed by text takes any key, quoted in a path when it must be",
468
+ "decl": {
469
+ "name": "m",
470
+ "type": "map",
471
+ "key": {
472
+ "type": "text"
473
+ },
474
+ "of": {
475
+ "type": "number"
476
+ }
477
+ },
478
+ "value": {
479
+ "first one": "1",
480
+ "b": 2
481
+ },
482
+ "problems": [
483
+ {
484
+ "path": "[\"first one\"]",
485
+ "code": "wrong-type"
486
+ }
487
+ ]
488
+ },
489
+ {
490
+ "name": "a list with ids: each id present and unique, each item checked",
491
+ "decl": {
492
+ "name": "beats",
493
+ "type": "list",
494
+ "id": "id",
495
+ "of": {
496
+ "type": "record",
497
+ "fields": [
498
+ {
499
+ "name": "id",
500
+ "type": "text"
501
+ },
502
+ {
503
+ "name": "at",
504
+ "type": "number",
505
+ "min": 0
506
+ }
507
+ ]
508
+ }
509
+ },
510
+ "value": [
511
+ {
512
+ "id": "b1",
513
+ "at": 1
514
+ },
515
+ {
516
+ "id": "b1",
517
+ "at": 2
518
+ },
519
+ {
520
+ "at": -1
521
+ }
522
+ ],
523
+ "problems": [
524
+ {
525
+ "path": "[1].id",
526
+ "code": "duplicate-id"
527
+ },
528
+ {
529
+ "path": "[2].id",
530
+ "code": "missing-id"
531
+ },
532
+ {
533
+ "path": "[2].at",
534
+ "code": "below-min"
535
+ }
536
+ ]
537
+ },
538
+ {
539
+ "name": "a list without ids: each item checked",
540
+ "decl": {
541
+ "name": "words",
542
+ "type": "list",
543
+ "of": {
544
+ "type": "text"
545
+ }
546
+ },
547
+ "value": [
548
+ "a",
549
+ 2,
550
+ "c"
551
+ ],
552
+ "problems": [
553
+ {
554
+ "path": "[1]",
555
+ "code": "wrong-type"
556
+ }
557
+ ]
558
+ },
559
+ {
560
+ "name": "a list is an array",
561
+ "decl": {
562
+ "name": "words",
563
+ "type": "list",
564
+ "of": {
565
+ "type": "text"
566
+ }
567
+ },
568
+ "value": "a",
569
+ "problems": [
570
+ {
571
+ "path": "",
572
+ "code": "wrong-type"
573
+ }
574
+ ]
575
+ },
576
+ {
577
+ "name": "an entry: required fields, unknown fields, each value",
578
+ "target": {
579
+ "fields": [
580
+ {
581
+ "name": "loud",
582
+ "type": "boolean",
583
+ "required": true
584
+ },
585
+ {
586
+ "name": "tone",
587
+ "type": "enum",
588
+ "values": [
589
+ "calm",
590
+ "tense"
591
+ ]
592
+ },
593
+ {
594
+ "name": "note",
595
+ "type": "text"
596
+ }
597
+ ]
598
+ },
599
+ "entry": {
600
+ "tone": "wild",
601
+ "tune": "calm"
602
+ },
603
+ "problems": [
604
+ {
605
+ "path": "loud",
606
+ "code": "required"
607
+ },
608
+ {
609
+ "path": "tone",
610
+ "code": "not-a-value",
611
+ "options": [
612
+ "calm",
613
+ "tense"
614
+ ]
615
+ },
616
+ {
617
+ "path": "tune",
618
+ "code": "unknown-field",
619
+ "severity": "warning"
620
+ }
621
+ ]
622
+ },
623
+ {
624
+ "name": "an empty entry is fine when nothing is required",
625
+ "target": {
626
+ "fields": [
627
+ {
628
+ "name": "note",
629
+ "type": "text"
630
+ }
631
+ ]
632
+ },
633
+ "entry": {},
634
+ "problems": []
635
+ },
636
+ {
637
+ "name": "an entry is an object",
638
+ "target": {
639
+ "fields": [
640
+ {
641
+ "name": "note",
642
+ "type": "text"
643
+ }
644
+ ]
645
+ },
646
+ "entry": "note",
647
+ "problems": [
648
+ {
649
+ "path": "",
650
+ "code": "wrong-type"
651
+ }
652
+ ]
653
+ }
654
+ ],
655
+ "claims": [
656
+ {
657
+ "name": "a claim without values takes the host's, and keeps its own label, help and value help",
658
+ "claim": {
659
+ "setting": "moodField",
660
+ "type": "enum",
661
+ "label": "Mood",
662
+ "help": "How it feels.",
663
+ "valueHelp": {
664
+ "calm": "Unhurried.",
665
+ "wild": "Unused."
666
+ }
667
+ },
668
+ "host": {
669
+ "type": "enum",
670
+ "values": [
671
+ "calm",
672
+ "tense"
673
+ ],
674
+ "default": "calm"
675
+ },
676
+ "effective": {
677
+ "setting": "moodField",
678
+ "type": "enum",
679
+ "label": "Mood",
680
+ "help": "How it feels.",
681
+ "valueHelp": {
682
+ "calm": "Unhurried.",
683
+ "wild": "Unused."
684
+ },
685
+ "values": [
686
+ "calm",
687
+ "tense"
688
+ ],
689
+ "default": "calm"
690
+ }
691
+ },
692
+ {
693
+ "name": "a claim's own values stand",
694
+ "claim": {
695
+ "setting": "moodField",
696
+ "type": "enum",
697
+ "values": [
698
+ "calm"
699
+ ]
700
+ },
701
+ "host": {
702
+ "type": "enum",
703
+ "values": [
704
+ "calm",
705
+ "tense"
706
+ ]
707
+ },
708
+ "effective": {
709
+ "setting": "moodField",
710
+ "type": "enum",
711
+ "values": [
712
+ "calm"
713
+ ]
714
+ }
715
+ },
716
+ {
717
+ "name": "a quality claim takes the host's ladder, as a claimed field keeps the host's",
718
+ "claim": {
719
+ "setting": "actField",
720
+ "type": "quality",
721
+ "label": "Act"
722
+ },
723
+ "host": {
724
+ "type": "quality",
725
+ "stages": [
726
+ "setup",
727
+ "turn"
728
+ ]
729
+ },
730
+ "effective": {
731
+ "setting": "actField",
732
+ "type": "quality",
733
+ "label": "Act",
734
+ "stages": [
735
+ "setup",
736
+ "turn"
737
+ ]
738
+ }
739
+ }
95
740
  ]
96
741
  }