@json-to-office/jto 4.5.0 → 5.2.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 (31) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/client/assets/{HomePage-CSBsGUBL.js → HomePage-FzRGVdrO.js} +4 -4
  3. package/dist/client/assets/{HomePage-CSBsGUBL.js.map → HomePage-FzRGVdrO.js.map} +1 -1
  4. package/dist/client/assets/{JsonEditorPage-BHVA2YLP.js → JsonEditorPage-DjbLMda1.js} +3 -3
  5. package/dist/client/assets/{JsonEditorPage-BHVA2YLP.js.map → JsonEditorPage-DjbLMda1.js.map} +1 -1
  6. package/dist/client/assets/{MonacoPluginProvider-D5aUgKZi.js → MonacoPluginProvider-CRemSLoy.js} +5 -5
  7. package/dist/client/assets/{MonacoPluginProvider-D5aUgKZi.js.map → MonacoPluginProvider-CRemSLoy.js.map} +1 -1
  8. package/dist/client/assets/{_virtual_jto-plugin-type-libs-gZZSIMe7.js → _virtual_jto-plugin-type-libs-Bns9FJk1.js} +56 -5
  9. package/dist/client/assets/{_virtual_jto-plugin-type-libs-gZZSIMe7.js.map → _virtual_jto-plugin-type-libs-Bns9FJk1.js.map} +1 -1
  10. package/dist/client/assets/_virtual_jto-sandbox-runtime-l26u1ylW.js +2 -0
  11. package/dist/client/assets/_virtual_jto-sandbox-runtime-l26u1ylW.js.map +1 -0
  12. package/dist/client/assets/{editor-Ce9XFPWx.js → editor-CclDHMVO.js} +2 -2
  13. package/dist/client/assets/{editor-Ce9XFPWx.js.map → editor-CclDHMVO.js.map} +1 -1
  14. package/dist/client/assets/{editor-monaco-json-u3bIh2LA.js → editor-monaco-json-D3j3jSTr.js} +2 -2
  15. package/dist/client/assets/{editor-monaco-json-u3bIh2LA.js.map → editor-monaco-json-D3j3jSTr.js.map} +1 -1
  16. package/dist/client/assets/{index-CHGFn3dH.js → index-CHWwrrUS.js} +4 -4
  17. package/dist/client/assets/index-CHWwrrUS.js.map +1 -0
  18. package/dist/client/assets/{index-DruKDred.js → index-gnUT72CY.js} +2 -2
  19. package/dist/client/assets/{index-DruKDred.js.map → index-gnUT72CY.js.map} +1 -1
  20. package/dist/client/assets/{preview-Bjxi6Nq3.js → preview-Co1OedmP.js} +2 -2
  21. package/dist/client/assets/preview-Co1OedmP.js.map +1 -0
  22. package/dist/client/assets/{useQualityAnalysis-AZKgMcJ7.js → useQualityAnalysis-CKVtQGjt.js} +3 -3
  23. package/dist/client/assets/{useQualityAnalysis-AZKgMcJ7.js.map → useQualityAnalysis-CKVtQGjt.js.map} +1 -1
  24. package/dist/client/index.html +1 -1
  25. package/dist/client/templates/consulting-deck-blocks.pptx.json +1057 -156
  26. package/dist/client/templates/technical-report-blocks.docx.json +1703 -0
  27. package/package.json +7 -7
  28. package/dist/client/assets/_virtual_jto-sandbox-runtime-CVTtmFTd.js +0 -2
  29. package/dist/client/assets/_virtual_jto-sandbox-runtime-CVTtmFTd.js.map +0 -1
  30. package/dist/client/assets/index-CHGFn3dH.js.map +0 -1
  31. package/dist/client/assets/preview-Bjxi6Nq3.js.map +0 -1
@@ -0,0 +1,1703 @@
1
+ {
2
+ "name": "docx",
3
+ "props": {
4
+ "theme": "consulting",
5
+ "qualityProfile": "technical-report",
6
+ "metadata": {
7
+ "title": "Load test results ahead of the seasonal peak",
8
+ "author": "Platform engineering",
9
+ "company": "Platform engineering",
10
+ "date": "September 2026"
11
+ },
12
+ "blocks": {
13
+ "cover": {
14
+ "description": "A themed title page; optional subtitle, logo and metadata collapse when omitted.",
15
+ "slots": {
16
+ "title": {
17
+ "type": "string",
18
+ "oneLine": true,
19
+ "maxWords": 12,
20
+ "required": true
21
+ },
22
+ "subtitle": {
23
+ "type": "string",
24
+ "oneLine": true,
25
+ "maxWords": 20,
26
+ "required": false
27
+ },
28
+ "client": {
29
+ "type": "string",
30
+ "oneLine": true,
31
+ "maxWords": 8,
32
+ "required": false
33
+ },
34
+ "date": {
35
+ "type": "string",
36
+ "oneLine": true,
37
+ "maxWords": 6,
38
+ "required": false
39
+ },
40
+ "confidentiality": {
41
+ "type": "string",
42
+ "oneLine": true,
43
+ "maxWords": 8,
44
+ "required": false
45
+ },
46
+ "logo": {
47
+ "type": "component"
48
+ }
49
+ },
50
+ "body": [
51
+ {
52
+ "$if": "/logo",
53
+ "then": {
54
+ "$slot": "/logo"
55
+ }
56
+ },
57
+ {
58
+ "name": "paragraph",
59
+ "props": {
60
+ "text": "",
61
+ "spacing": {
62
+ "before": {
63
+ "$measure": "height",
64
+ "fraction": 0.22,
65
+ "unit": "pt"
66
+ },
67
+ "after": 0
68
+ }
69
+ }
70
+ },
71
+ {
72
+ "name": "divider",
73
+ "props": {
74
+ "thickness": {
75
+ "$theme": "/chrome/cover/rule/weightPt",
76
+ "default": 3
77
+ },
78
+ "color": {
79
+ "$theme": "/chrome/cover/rule/color",
80
+ "default": "borderPrimary"
81
+ },
82
+ "spacing": {
83
+ "before": 4,
84
+ "after": 6
85
+ }
86
+ }
87
+ },
88
+ {
89
+ "$if": "/client",
90
+ "then": {
91
+ "name": "paragraph",
92
+ "props": {
93
+ "text": {
94
+ "$slot": "/client"
95
+ },
96
+ "font": {
97
+ "family": {
98
+ "$theme": "/fonts/body/family",
99
+ "default": "Calibri"
100
+ },
101
+ "size": {
102
+ "$theme": "/styles/eyebrow/size",
103
+ "default": 9
104
+ },
105
+ "bold": {
106
+ "$theme": "/styles/eyebrow/bold",
107
+ "default": true
108
+ },
109
+ "color": {
110
+ "$theme": "/styles/eyebrow/color",
111
+ "default": "accent"
112
+ }
113
+ },
114
+ "spacing": {
115
+ "before": 0,
116
+ "after": 4
117
+ },
118
+ "keepNext": true
119
+ }
120
+ }
121
+ },
122
+ {
123
+ "name": "paragraph",
124
+ "props": {
125
+ "text": {
126
+ "$slot": "/title"
127
+ },
128
+ "spacing": {
129
+ "before": 0,
130
+ "after": 10
131
+ },
132
+ "font": {
133
+ "family": {
134
+ "$theme": "/fonts/body/family",
135
+ "default": "Calibri"
136
+ },
137
+ "size": {
138
+ "$theme": "/styles/display/size",
139
+ "default": 26
140
+ },
141
+ "bold": {
142
+ "$theme": "/styles/display/bold",
143
+ "default": true
144
+ },
145
+ "color": {
146
+ "$theme": "/styles/display/color",
147
+ "default": "textPrimary"
148
+ },
149
+ "lineSpacing": {
150
+ "type": "multiple",
151
+ "value": 1.1
152
+ }
153
+ },
154
+ "keepNext": true
155
+ }
156
+ },
157
+ {
158
+ "$if": "/subtitle",
159
+ "then": {
160
+ "name": "paragraph",
161
+ "props": {
162
+ "text": {
163
+ "$slot": "/subtitle"
164
+ },
165
+ "font": {
166
+ "family": {
167
+ "$theme": "/fonts/body/family",
168
+ "default": "Calibri"
169
+ },
170
+ "size": {
171
+ "$theme": "/styles/subtitle/size",
172
+ "default": 13
173
+ },
174
+ "bold": {
175
+ "$theme": "/styles/subtitle/bold",
176
+ "default": false
177
+ },
178
+ "color": {
179
+ "$theme": "/styles/subtitle/color",
180
+ "default": "textPrimary"
181
+ },
182
+ "lineSpacing": {
183
+ "type": "multiple",
184
+ "value": 1.1
185
+ }
186
+ },
187
+ "spacing": {
188
+ "before": 0,
189
+ "after": 6
190
+ },
191
+ "keepNext": true
192
+ }
193
+ }
194
+ },
195
+ {
196
+ "$if": "/date",
197
+ "then": {
198
+ "name": "paragraph",
199
+ "props": {
200
+ "text": {
201
+ "$slot": "/date"
202
+ },
203
+ "font": {
204
+ "family": {
205
+ "$theme": "/fonts/body/family",
206
+ "default": "Calibri"
207
+ },
208
+ "size": {
209
+ "$theme": "/styles/label/size",
210
+ "default": 9
211
+ },
212
+ "bold": {
213
+ "$theme": "/styles/label/bold",
214
+ "default": false
215
+ },
216
+ "color": {
217
+ "$theme": "/styles/label/color",
218
+ "default": "textPrimary"
219
+ }
220
+ },
221
+ "spacing": {
222
+ "before": 0,
223
+ "after": 4
224
+ }
225
+ }
226
+ }
227
+ },
228
+ {
229
+ "$if": "/confidentiality",
230
+ "then": {
231
+ "name": "paragraph",
232
+ "props": {
233
+ "text": {
234
+ "$slot": "/confidentiality"
235
+ },
236
+ "font": {
237
+ "family": {
238
+ "$theme": "/fonts/body/family",
239
+ "default": "Calibri"
240
+ },
241
+ "size": {
242
+ "$theme": "/styles/label/size",
243
+ "default": 9
244
+ },
245
+ "bold": {
246
+ "$theme": "/styles/label/bold",
247
+ "default": false
248
+ },
249
+ "color": {
250
+ "$theme": "/styles/label/color",
251
+ "default": "textPrimary"
252
+ }
253
+ },
254
+ "spacing": {
255
+ "before": 0,
256
+ "after": 2
257
+ }
258
+ }
259
+ }
260
+ }
261
+ ]
262
+ },
263
+ "running-head": {
264
+ "description": "Document title in the header and confidentiality, page fields and date in the footer, inherited by every later section; those sections continue on the page.",
265
+ "slots": {
266
+ "title": {
267
+ "type": "string",
268
+ "oneLine": true,
269
+ "maxWords": 6,
270
+ "required": false
271
+ },
272
+ "confidentiality": {
273
+ "type": "string",
274
+ "oneLine": true,
275
+ "maxWords": 4,
276
+ "required": false
277
+ },
278
+ "date": {
279
+ "type": "string",
280
+ "oneLine": true,
281
+ "maxWords": 3,
282
+ "required": false
283
+ },
284
+ "pageNumbers": {
285
+ "type": "boolean",
286
+ "default": true
287
+ }
288
+ },
289
+ "body": [],
290
+ "section": {
291
+ "scope": "following",
292
+ "pageBreak": true,
293
+ "header": [
294
+ {
295
+ "name": "paragraph",
296
+ "props": {
297
+ "text": {
298
+ "$slot": "/title",
299
+ "default": {
300
+ "$context": "/document/title",
301
+ "default": ""
302
+ }
303
+ },
304
+ "font": {
305
+ "family": {
306
+ "$theme": "/fonts/body/family",
307
+ "default": "Calibri"
308
+ },
309
+ "size": {
310
+ "$theme": "/styles/tracker/size",
311
+ "default": 8
312
+ },
313
+ "bold": {
314
+ "$theme": "/styles/tracker/bold",
315
+ "default": false
316
+ },
317
+ "color": {
318
+ "$theme": "/styles/tracker/color",
319
+ "default": "textMuted"
320
+ }
321
+ },
322
+ "spacing": {
323
+ "before": 0,
324
+ "after": 0
325
+ }
326
+ }
327
+ },
328
+ {
329
+ "name": "divider",
330
+ "props": {
331
+ "thickness": {
332
+ "$theme": "/chrome/runningHead/rule/weightPt",
333
+ "default": 0.5
334
+ },
335
+ "color": {
336
+ "$theme": "/chrome/runningHead/rule/color",
337
+ "default": "borderPrimary"
338
+ },
339
+ "spacing": {
340
+ "before": 4,
341
+ "after": 6
342
+ }
343
+ }
344
+ }
345
+ ],
346
+ "footer": [
347
+ {
348
+ "name": "divider",
349
+ "props": {
350
+ "thickness": {
351
+ "$theme": "/chrome/confidentialFooter/rule/weightPt",
352
+ "default": 0.5
353
+ },
354
+ "color": {
355
+ "$theme": "/chrome/confidentialFooter/rule/color",
356
+ "default": "borderPrimary"
357
+ },
358
+ "spacing": {
359
+ "before": 4,
360
+ "after": 6
361
+ }
362
+ }
363
+ },
364
+ {
365
+ "name": "paragraph",
366
+ "props": {
367
+ "text": {
368
+ "$join": [
369
+ {
370
+ "$slot": "/confidentiality",
371
+ "default": ""
372
+ },
373
+ {
374
+ "$if": "/pageNumbers",
375
+ "then": "{PAGE} / {TOTAL_PAGES}",
376
+ "else": ""
377
+ },
378
+ {
379
+ "$slot": "/date",
380
+ "default": ""
381
+ }
382
+ ],
383
+ "separator": "\t",
384
+ "keepEmpty": true
385
+ },
386
+ "font": {
387
+ "family": {
388
+ "$theme": "/fonts/body/family",
389
+ "default": "Calibri"
390
+ },
391
+ "size": {
392
+ "$theme": "/styles/footer/size",
393
+ "default": 8
394
+ },
395
+ "bold": {
396
+ "$theme": "/styles/footer/bold",
397
+ "default": false
398
+ },
399
+ "color": {
400
+ "$theme": "/styles/footer/color",
401
+ "default": "textMuted"
402
+ }
403
+ },
404
+ "tabStops": [
405
+ {
406
+ "type": "center",
407
+ "position": {
408
+ "$measure": "width",
409
+ "fraction": 0.5,
410
+ "unit": "twip"
411
+ }
412
+ },
413
+ {
414
+ "type": "right",
415
+ "position": {
416
+ "$measure": "width",
417
+ "unit": "twip"
418
+ }
419
+ }
420
+ ],
421
+ "spacing": {
422
+ "before": 0,
423
+ "after": 0
424
+ }
425
+ }
426
+ }
427
+ ]
428
+ }
429
+ },
430
+ "section-opener": {
431
+ "description": "A numbered section heading.",
432
+ "slots": {
433
+ "number": {
434
+ "type": "string",
435
+ "oneLine": true,
436
+ "maxWords": 3,
437
+ "required": false
438
+ },
439
+ "title": {
440
+ "type": "string",
441
+ "oneLine": true,
442
+ "maxWords": 12,
443
+ "required": true
444
+ }
445
+ },
446
+ "body": [
447
+ {
448
+ "$if": "/number",
449
+ "then": {
450
+ "name": "paragraph",
451
+ "props": {
452
+ "text": {
453
+ "$slot": "/number"
454
+ },
455
+ "font": {
456
+ "family": {
457
+ "$theme": "/fonts/body/family",
458
+ "default": "Calibri"
459
+ },
460
+ "size": {
461
+ "$theme": "/styles/eyebrow/size",
462
+ "default": 9
463
+ },
464
+ "bold": {
465
+ "$theme": "/styles/eyebrow/bold",
466
+ "default": true
467
+ },
468
+ "color": {
469
+ "$theme": "/styles/eyebrow/color",
470
+ "default": "accent"
471
+ }
472
+ },
473
+ "keepNext": true
474
+ }
475
+ }
476
+ },
477
+ {
478
+ "name": "heading",
479
+ "props": {
480
+ "text": {
481
+ "$slot": "/title"
482
+ },
483
+ "level": 1
484
+ }
485
+ }
486
+ ]
487
+ },
488
+ "key-takeaways": {
489
+ "description": "Executive conclusions with bounded one-line takeaways. Copy and adapt this document-local example.",
490
+ "slots": {
491
+ "label": {
492
+ "type": "string",
493
+ "oneLine": true,
494
+ "maxWords": 8,
495
+ "required": false,
496
+ "default": "Key takeaways"
497
+ },
498
+ "items": {
499
+ "type": "array",
500
+ "required": true,
501
+ "minItems": 3,
502
+ "maxItems": 5,
503
+ "items": {
504
+ "type": "string",
505
+ "oneLine": true,
506
+ "maxWords": 25,
507
+ "required": true
508
+ }
509
+ }
510
+ },
511
+ "body": [
512
+ {
513
+ "name": "divider",
514
+ "props": {
515
+ "thickness": {
516
+ "$theme": "/chrome/keyTakeaways/rule/weightPt",
517
+ "default": 1.5
518
+ },
519
+ "color": {
520
+ "$theme": "/chrome/keyTakeaways/rule/color",
521
+ "default": "borderPrimary"
522
+ },
523
+ "spacing": {
524
+ "before": 4,
525
+ "after": 6
526
+ }
527
+ }
528
+ },
529
+ {
530
+ "name": "paragraph",
531
+ "props": {
532
+ "text": {
533
+ "$slot": "/label"
534
+ },
535
+ "font": {
536
+ "family": {
537
+ "$theme": "/fonts/body/family",
538
+ "default": "Calibri"
539
+ },
540
+ "size": {
541
+ "$theme": "/styles/label/size",
542
+ "default": 9
543
+ },
544
+ "bold": {
545
+ "$theme": "/styles/label/bold",
546
+ "default": true
547
+ },
548
+ "color": {
549
+ "$theme": "/styles/label/color",
550
+ "default": "textPrimary"
551
+ }
552
+ },
553
+ "keepNext": true
554
+ }
555
+ },
556
+ {
557
+ "name": "list",
558
+ "props": {
559
+ "items": {
560
+ "$slot": "/items"
561
+ }
562
+ }
563
+ },
564
+ {
565
+ "name": "divider",
566
+ "props": {
567
+ "thickness": {
568
+ "$theme": "/chrome/keyTakeaways/rule/weightPt",
569
+ "default": 0.5
570
+ },
571
+ "color": {
572
+ "$theme": "/chrome/keyTakeaways/rule/color",
573
+ "default": "borderPrimary"
574
+ },
575
+ "spacing": {
576
+ "before": 4,
577
+ "after": 6
578
+ }
579
+ }
580
+ }
581
+ ]
582
+ },
583
+ "callout": {
584
+ "description": "An aside set off by a hairline rule down its left edge: a short label over up to sixty words of text. No fill, so it reads as a note beside the argument rather than a box in it.",
585
+ "slots": {
586
+ "label": {
587
+ "type": "string",
588
+ "oneLine": true,
589
+ "maxWords": 6,
590
+ "default": "Note"
591
+ },
592
+ "text": {
593
+ "type": "string",
594
+ "required": true,
595
+ "maxWords": 60
596
+ }
597
+ },
598
+ "body": [
599
+ {
600
+ "name": "text-box",
601
+ "props": {
602
+ "width": "100%",
603
+ "style": {
604
+ "padding": {
605
+ "top": 2,
606
+ "bottom": 2,
607
+ "left": 10,
608
+ "right": 0
609
+ },
610
+ "border": {
611
+ "left": {
612
+ "style": "solid",
613
+ "width": 0.75,
614
+ "color": {
615
+ "$theme": "/palette/rule",
616
+ "default": "borderPrimary"
617
+ }
618
+ }
619
+ }
620
+ }
621
+ },
622
+ "children": [
623
+ {
624
+ "name": "paragraph",
625
+ "props": {
626
+ "text": {
627
+ "$slot": "/label"
628
+ },
629
+ "font": {
630
+ "family": {
631
+ "$theme": "/fonts/body/family",
632
+ "default": "Calibri"
633
+ },
634
+ "size": {
635
+ "$theme": "/styles/label/size",
636
+ "default": 9
637
+ },
638
+ "bold": {
639
+ "$theme": "/styles/label/bold",
640
+ "default": true
641
+ },
642
+ "color": {
643
+ "$theme": "/styles/label/color",
644
+ "default": "textPrimary"
645
+ }
646
+ },
647
+ "spacing": {
648
+ "before": 0,
649
+ "after": 2
650
+ },
651
+ "keepNext": true
652
+ }
653
+ },
654
+ {
655
+ "name": "paragraph",
656
+ "props": {
657
+ "text": {
658
+ "$slot": "/text"
659
+ },
660
+ "spacing": {
661
+ "before": 0,
662
+ "after": 0
663
+ }
664
+ }
665
+ }
666
+ ]
667
+ }
668
+ ]
669
+ },
670
+ "data-table": {
671
+ "description": "A sourced numeric table: a title, a text column of row labels at a fifth of the measure, one to five data columns right-aligned by construction, then optional notes and a source line. With its header, 24 rows keep the table on one page; the table-design rule checks the compiled table for mixed decimals.",
672
+ "slots": {
673
+ "title": {
674
+ "type": "string",
675
+ "required": true,
676
+ "oneLine": true,
677
+ "maxWords": 16
678
+ },
679
+ "labelHeader": {
680
+ "type": "string",
681
+ "oneLine": true,
682
+ "maxWords": 4,
683
+ "default": "",
684
+ "description": "Header of the row-label column."
685
+ },
686
+ "labels": {
687
+ "type": "array",
688
+ "required": true,
689
+ "minItems": 1,
690
+ "maxItems": 24,
691
+ "items": {
692
+ "type": "string",
693
+ "oneLine": true,
694
+ "maxWords": 5
695
+ },
696
+ "description": "Row labels, top to bottom. Every data column lists its cells in this order and at this count."
697
+ },
698
+ "columns": {
699
+ "type": "array",
700
+ "required": true,
701
+ "minItems": 1,
702
+ "maxItems": 5,
703
+ "items": {
704
+ "type": "object",
705
+ "properties": {
706
+ "header": {
707
+ "type": "string",
708
+ "required": true,
709
+ "oneLine": true,
710
+ "maxWords": 4,
711
+ "maxLength": 14,
712
+ "description": "Column header; put the unit here: Revenue (€m)."
713
+ },
714
+ "cells": {
715
+ "type": "array",
716
+ "required": true,
717
+ "minItems": 1,
718
+ "maxItems": 24,
719
+ "items": {
720
+ "type": "string",
721
+ "maxLength": 10
722
+ },
723
+ "description": "One formatted value per row label, rounded the same way down the column."
724
+ },
725
+ "numeric": {
726
+ "type": "boolean",
727
+ "default": true,
728
+ "description": "Right-align header and cells so digits line up by place value. Set false for a text column."
729
+ }
730
+ }
731
+ }
732
+ },
733
+ "notes": {
734
+ "type": "string",
735
+ "maxWords": 40,
736
+ "description": "What the reader needs to interpret the figures: definitions, periods, exclusions."
737
+ },
738
+ "source": {
739
+ "type": "string",
740
+ "maxWords": 20,
741
+ "role": "source"
742
+ }
743
+ },
744
+ "body": [
745
+ {
746
+ "name": "paragraph",
747
+ "props": {
748
+ "text": {
749
+ "$slot": "/title"
750
+ },
751
+ "font": {
752
+ "family": {
753
+ "$theme": "/fonts/body/family",
754
+ "default": "Calibri"
755
+ },
756
+ "size": {
757
+ "$theme": "/styles/label/size",
758
+ "default": 9
759
+ },
760
+ "bold": {
761
+ "$theme": "/styles/label/bold",
762
+ "default": true
763
+ },
764
+ "color": {
765
+ "$theme": "/styles/label/color",
766
+ "default": "textPrimary"
767
+ }
768
+ },
769
+ "spacing": {
770
+ "before": 8,
771
+ "after": 4
772
+ },
773
+ "keepNext": true
774
+ }
775
+ },
776
+ {
777
+ "name": "table",
778
+ "props": {
779
+ "width": 100,
780
+ "repeatHeaderOnPageBreak": true,
781
+ "rows": {
782
+ "$each": "/labels",
783
+ "template": {
784
+ "cantSplit": true
785
+ }
786
+ },
787
+ "columns": [
788
+ {
789
+ "width": "22%",
790
+ "header": {
791
+ "content": {
792
+ "$slot": "/labelHeader"
793
+ },
794
+ "padding": {
795
+ "left": 0,
796
+ "right": 6
797
+ }
798
+ },
799
+ "cellDefaults": {
800
+ "padding": {
801
+ "left": 0,
802
+ "right": 6
803
+ }
804
+ },
805
+ "cells": {
806
+ "$each": "/labels",
807
+ "template": {
808
+ "content": {
809
+ "$item": ""
810
+ }
811
+ }
812
+ }
813
+ },
814
+ {
815
+ "$each": "/columns",
816
+ "template": {
817
+ "header": {
818
+ "content": {
819
+ "$item": "/header"
820
+ },
821
+ "horizontalAlignment": {
822
+ "$if": {
823
+ "$item": "/numeric"
824
+ },
825
+ "then": "right",
826
+ "else": "left"
827
+ },
828
+ "padding": {
829
+ "left": 6,
830
+ "right": 0
831
+ }
832
+ },
833
+ "cellDefaults": {
834
+ "horizontalAlignment": {
835
+ "$if": {
836
+ "$item": "/numeric"
837
+ },
838
+ "then": "right",
839
+ "else": "left"
840
+ },
841
+ "padding": {
842
+ "left": 6,
843
+ "right": 0
844
+ }
845
+ },
846
+ "cells": {
847
+ "$each": {
848
+ "$item": "/cells"
849
+ },
850
+ "template": {
851
+ "content": {
852
+ "$item": ""
853
+ }
854
+ }
855
+ }
856
+ }
857
+ }
858
+ ]
859
+ }
860
+ },
861
+ {
862
+ "$if": "/notes",
863
+ "then": {
864
+ "name": "paragraph",
865
+ "props": {
866
+ "text": {
867
+ "$slot": "/notes"
868
+ },
869
+ "font": {
870
+ "family": {
871
+ "$theme": "/fonts/body/family",
872
+ "default": "Calibri"
873
+ },
874
+ "size": {
875
+ "$theme": "/styles/source/size",
876
+ "default": 8
877
+ },
878
+ "bold": {
879
+ "$theme": "/styles/source/bold",
880
+ "default": false
881
+ },
882
+ "color": {
883
+ "$theme": "/styles/source/color",
884
+ "default": "textMuted"
885
+ }
886
+ },
887
+ "spacing": {
888
+ "before": 4,
889
+ "after": 0
890
+ }
891
+ }
892
+ }
893
+ },
894
+ {
895
+ "$if": "/source",
896
+ "then": {
897
+ "name": "block",
898
+ "props": {
899
+ "ref": "source-line",
900
+ "slots": {
901
+ "text": {
902
+ "$slot": "/source"
903
+ }
904
+ }
905
+ }
906
+ }
907
+ }
908
+ ]
909
+ },
910
+ "source-line": {
911
+ "description": "A hairline and a source line in the source role, under a figure or a table. The data blocks invoke it; copy it to add a source to anything else.",
912
+ "slots": {
913
+ "text": {
914
+ "type": "string",
915
+ "required": true,
916
+ "maxWords": 20,
917
+ "role": "source"
918
+ }
919
+ },
920
+ "body": [
921
+ {
922
+ "name": "divider",
923
+ "props": {
924
+ "thickness": 0.5,
925
+ "color": {
926
+ "$theme": "/palette/rule",
927
+ "default": "borderPrimary"
928
+ },
929
+ "spacing": {
930
+ "before": 4,
931
+ "after": 4
932
+ }
933
+ }
934
+ },
935
+ {
936
+ "name": "paragraph",
937
+ "props": {
938
+ "text": {
939
+ "$slot": "/text"
940
+ },
941
+ "font": {
942
+ "family": {
943
+ "$theme": "/fonts/body/family",
944
+ "default": "Calibri"
945
+ },
946
+ "size": {
947
+ "$theme": "/styles/source/size",
948
+ "default": 8
949
+ },
950
+ "bold": {
951
+ "$theme": "/styles/source/bold",
952
+ "default": false
953
+ },
954
+ "color": {
955
+ "$theme": "/styles/source/color",
956
+ "default": "textMuted"
957
+ }
958
+ },
959
+ "spacing": {
960
+ "before": 0,
961
+ "after": 8
962
+ }
963
+ }
964
+ }
965
+ ]
966
+ },
967
+ "figure-caption": {
968
+ "description": "The numbered caption under a figure: **Figure N.** and the text, N being a Word SEQ field over the figure sequence. chart-figure and figure invoke it, so charts and images number together.",
969
+ "slots": {
970
+ "text": {
971
+ "type": "string",
972
+ "required": true,
973
+ "oneLine": true,
974
+ "maxWords": 20
975
+ }
976
+ },
977
+ "body": [
978
+ {
979
+ "name": "paragraph",
980
+ "props": {
981
+ "text": {
982
+ "$join": [
983
+ "**Figure {SEQ:figure}.** ",
984
+ {
985
+ "$slot": "/text"
986
+ }
987
+ ]
988
+ },
989
+ "font": {
990
+ "family": {
991
+ "$theme": "/fonts/body/family",
992
+ "default": "Calibri"
993
+ },
994
+ "size": {
995
+ "$theme": "/styles/label/size",
996
+ "default": 9
997
+ },
998
+ "bold": false,
999
+ "color": {
1000
+ "$theme": "/styles/label/color",
1001
+ "default": "textPrimary"
1002
+ }
1003
+ },
1004
+ "spacing": {
1005
+ "before": 4,
1006
+ "after": 2
1007
+ },
1008
+ "keepNext": true
1009
+ }
1010
+ }
1011
+ ]
1012
+ },
1013
+ "chart-figure": {
1014
+ "description": "A numbered, sourced chart: the chart itself (highcharts through the export server, or a native chart on the office-open renderer), a caption that says what it shows, an optional takeaway beneath, and the source line the report cites. The source is required; the figure number is a Word SEQ field.",
1015
+ "slots": {
1016
+ "chart": {
1017
+ "type": "component",
1018
+ "required": true,
1019
+ "description": "A highcharts or chart component. Put the unit in the value-axis title: Revenue (€m)."
1020
+ },
1021
+ "caption": {
1022
+ "type": "string",
1023
+ "required": true,
1024
+ "oneLine": true,
1025
+ "maxWords": 20,
1026
+ "description": "What the chart shows, as a statement: Revenue by quarter, 2026."
1027
+ },
1028
+ "takeaway": {
1029
+ "type": "string",
1030
+ "maxWords": 30,
1031
+ "role": "takeaway",
1032
+ "description": "The one sentence the reader should leave with."
1033
+ },
1034
+ "source": {
1035
+ "type": "string",
1036
+ "required": true,
1037
+ "maxWords": 20,
1038
+ "role": "source"
1039
+ }
1040
+ },
1041
+ "body": [
1042
+ {
1043
+ "$slot": "/chart"
1044
+ },
1045
+ {
1046
+ "name": "block",
1047
+ "props": {
1048
+ "ref": "figure-caption",
1049
+ "slots": {
1050
+ "text": {
1051
+ "$slot": "/caption"
1052
+ }
1053
+ }
1054
+ }
1055
+ },
1056
+ {
1057
+ "$if": "/takeaway",
1058
+ "then": {
1059
+ "name": "paragraph",
1060
+ "props": {
1061
+ "text": {
1062
+ "$slot": "/takeaway"
1063
+ },
1064
+ "font": {
1065
+ "family": {
1066
+ "$theme": "/fonts/body/family",
1067
+ "default": "Calibri"
1068
+ },
1069
+ "color": {
1070
+ "$theme": "/styles/quote/color",
1071
+ "default": "textSecondary"
1072
+ }
1073
+ },
1074
+ "spacing": {
1075
+ "before": 0,
1076
+ "after": 2
1077
+ }
1078
+ }
1079
+ }
1080
+ },
1081
+ {
1082
+ "$if": "/source",
1083
+ "then": {
1084
+ "name": "block",
1085
+ "props": {
1086
+ "ref": "source-line",
1087
+ "slots": {
1088
+ "text": {
1089
+ "$slot": "/source"
1090
+ }
1091
+ }
1092
+ }
1093
+ }
1094
+ }
1095
+ ]
1096
+ },
1097
+ "footnotes": {
1098
+ "description": "Notes and sources: every distinct source-role slot value the document's block invocations carry, in order, as a numbered list under a label — the engine's /sources context. Emits nothing when no invocation cites a source.",
1099
+ "slots": {
1100
+ "title": {
1101
+ "type": "string",
1102
+ "oneLine": true,
1103
+ "maxWords": 6,
1104
+ "default": "Notes and sources"
1105
+ }
1106
+ },
1107
+ "body": [
1108
+ {
1109
+ "$if": {
1110
+ "$context": "/sources"
1111
+ },
1112
+ "then": [
1113
+ {
1114
+ "name": "divider",
1115
+ "props": {
1116
+ "thickness": 0.5,
1117
+ "color": {
1118
+ "$theme": "/palette/rule",
1119
+ "default": "borderPrimary"
1120
+ },
1121
+ "spacing": {
1122
+ "before": 12,
1123
+ "after": 4
1124
+ }
1125
+ }
1126
+ },
1127
+ {
1128
+ "name": "paragraph",
1129
+ "props": {
1130
+ "text": {
1131
+ "$slot": "/title"
1132
+ },
1133
+ "font": {
1134
+ "family": {
1135
+ "$theme": "/fonts/body/family",
1136
+ "default": "Calibri"
1137
+ },
1138
+ "size": {
1139
+ "$theme": "/styles/label/size",
1140
+ "default": 9
1141
+ },
1142
+ "bold": true,
1143
+ "color": {
1144
+ "$theme": "/styles/label/color",
1145
+ "default": "textPrimary"
1146
+ }
1147
+ },
1148
+ "spacing": {
1149
+ "before": 0,
1150
+ "after": 4
1151
+ },
1152
+ "keepNext": true
1153
+ }
1154
+ },
1155
+ {
1156
+ "name": "list",
1157
+ "props": {
1158
+ "format": "decimal",
1159
+ "items": {
1160
+ "$each": {
1161
+ "$context": "/sources"
1162
+ },
1163
+ "template": {
1164
+ "$item": ""
1165
+ }
1166
+ }
1167
+ }
1168
+ }
1169
+ ]
1170
+ }
1171
+ ]
1172
+ },
1173
+ "memo-header": {
1174
+ "description": "The head of a memo, in place of a cover: an eyebrow, the subject as the title, then To, From, Date and an optional Cc as labelled lines sharing one tab stop, closed by a rule. A running head declared in the same section still numbers the pages.",
1175
+ "slots": {
1176
+ "label": {
1177
+ "type": "string",
1178
+ "oneLine": true,
1179
+ "maxWords": 4,
1180
+ "default": "Technical memo"
1181
+ },
1182
+ "subject": {
1183
+ "type": "string",
1184
+ "required": true,
1185
+ "oneLine": true,
1186
+ "maxWords": 16
1187
+ },
1188
+ "to": {
1189
+ "type": "string",
1190
+ "required": true,
1191
+ "oneLine": true,
1192
+ "maxWords": 12
1193
+ },
1194
+ "from": {
1195
+ "type": "string",
1196
+ "required": true,
1197
+ "oneLine": true,
1198
+ "maxWords": 12
1199
+ },
1200
+ "date": {
1201
+ "type": "string",
1202
+ "required": true,
1203
+ "oneLine": true,
1204
+ "maxWords": 6
1205
+ },
1206
+ "cc": {
1207
+ "type": "string",
1208
+ "oneLine": true,
1209
+ "maxWords": 12
1210
+ }
1211
+ },
1212
+ "body": [
1213
+ {
1214
+ "name": "paragraph",
1215
+ "props": {
1216
+ "text": {
1217
+ "$slot": "/label"
1218
+ },
1219
+ "font": {
1220
+ "family": {
1221
+ "$theme": "/fonts/body/family",
1222
+ "default": "Calibri"
1223
+ },
1224
+ "size": {
1225
+ "$theme": "/styles/eyebrow/size",
1226
+ "default": 9
1227
+ },
1228
+ "bold": {
1229
+ "$theme": "/styles/eyebrow/bold",
1230
+ "default": true
1231
+ },
1232
+ "color": {
1233
+ "$theme": "/styles/eyebrow/color",
1234
+ "default": "accent"
1235
+ }
1236
+ },
1237
+ "spacing": {
1238
+ "before": 0,
1239
+ "after": 4
1240
+ },
1241
+ "keepNext": true
1242
+ }
1243
+ },
1244
+ {
1245
+ "name": "paragraph",
1246
+ "props": {
1247
+ "text": {
1248
+ "$slot": "/subject"
1249
+ },
1250
+ "font": {
1251
+ "family": {
1252
+ "$theme": "/fonts/body/family",
1253
+ "default": "Calibri"
1254
+ },
1255
+ "size": {
1256
+ "$theme": "/styles/heading1/size",
1257
+ "default": 16
1258
+ },
1259
+ "bold": {
1260
+ "$theme": "/styles/heading1/bold",
1261
+ "default": true
1262
+ },
1263
+ "color": {
1264
+ "$theme": "/styles/heading1/color",
1265
+ "default": "primary"
1266
+ }
1267
+ },
1268
+ "spacing": {
1269
+ "before": 0,
1270
+ "after": 10
1271
+ },
1272
+ "keepNext": true
1273
+ }
1274
+ },
1275
+ {
1276
+ "name": "paragraph",
1277
+ "props": {
1278
+ "text": {
1279
+ "$join": [
1280
+ "**To**",
1281
+ {
1282
+ "$slot": "/to"
1283
+ }
1284
+ ],
1285
+ "separator": "\t"
1286
+ },
1287
+ "tabStops": [
1288
+ {
1289
+ "type": "left",
1290
+ "position": 1134
1291
+ }
1292
+ ],
1293
+ "spacing": {
1294
+ "before": 0,
1295
+ "after": 2
1296
+ },
1297
+ "keepNext": true
1298
+ }
1299
+ },
1300
+ {
1301
+ "name": "paragraph",
1302
+ "props": {
1303
+ "text": {
1304
+ "$join": [
1305
+ "**From**",
1306
+ {
1307
+ "$slot": "/from"
1308
+ }
1309
+ ],
1310
+ "separator": "\t"
1311
+ },
1312
+ "tabStops": [
1313
+ {
1314
+ "type": "left",
1315
+ "position": 1134
1316
+ }
1317
+ ],
1318
+ "spacing": {
1319
+ "before": 0,
1320
+ "after": 2
1321
+ },
1322
+ "keepNext": true
1323
+ }
1324
+ },
1325
+ {
1326
+ "name": "paragraph",
1327
+ "props": {
1328
+ "text": {
1329
+ "$join": [
1330
+ "**Date**",
1331
+ {
1332
+ "$slot": "/date"
1333
+ }
1334
+ ],
1335
+ "separator": "\t"
1336
+ },
1337
+ "tabStops": [
1338
+ {
1339
+ "type": "left",
1340
+ "position": 1134
1341
+ }
1342
+ ],
1343
+ "spacing": {
1344
+ "before": 0,
1345
+ "after": 2
1346
+ },
1347
+ "keepNext": true
1348
+ }
1349
+ },
1350
+ {
1351
+ "$if": "/cc",
1352
+ "then": {
1353
+ "name": "paragraph",
1354
+ "props": {
1355
+ "text": {
1356
+ "$join": [
1357
+ "**Cc**",
1358
+ {
1359
+ "$slot": "/cc"
1360
+ }
1361
+ ],
1362
+ "separator": "\t"
1363
+ },
1364
+ "tabStops": [
1365
+ {
1366
+ "type": "left",
1367
+ "position": 1134
1368
+ }
1369
+ ],
1370
+ "spacing": {
1371
+ "before": 0,
1372
+ "after": 2
1373
+ },
1374
+ "keepNext": true
1375
+ }
1376
+ }
1377
+ },
1378
+ {
1379
+ "name": "divider",
1380
+ "props": {
1381
+ "thickness": {
1382
+ "$theme": "/chrome/keyTakeaways/rule/weightPt",
1383
+ "default": 1.5
1384
+ },
1385
+ "color": {
1386
+ "$theme": "/chrome/cover/rule/color",
1387
+ "default": "borderPrimary"
1388
+ },
1389
+ "spacing": {
1390
+ "before": 8,
1391
+ "after": 12
1392
+ }
1393
+ }
1394
+ }
1395
+ ]
1396
+ }
1397
+ }
1398
+ },
1399
+ "children": [
1400
+ {
1401
+ "name": "section",
1402
+ "children": [
1403
+ {
1404
+ "name": "block",
1405
+ "props": {
1406
+ "ref": "cover",
1407
+ "slots": {
1408
+ "title": "The platform holds 2.4 times normal traffic; 3.2 needs two fixes",
1409
+ "subtitle": "Load test results ahead of the seasonal peak, for the platform engineering group",
1410
+ "client": "Platform engineering",
1411
+ "date": "September 2026",
1412
+ "confidentiality": "Internal"
1413
+ }
1414
+ }
1415
+ }
1416
+ ]
1417
+ },
1418
+ {
1419
+ "name": "section",
1420
+ "children": [
1421
+ {
1422
+ "name": "block",
1423
+ "props": {
1424
+ "ref": "running-head",
1425
+ "slots": {
1426
+ "confidentiality": "Internal",
1427
+ "date": "September 2026"
1428
+ }
1429
+ }
1430
+ },
1431
+ {
1432
+ "name": "toc",
1433
+ "props": {
1434
+ "scope": "document",
1435
+ "title": "Contents",
1436
+ "depth": {
1437
+ "from": 1,
1438
+ "to": 2
1439
+ }
1440
+ }
1441
+ },
1442
+ {
1443
+ "name": "block",
1444
+ "props": {
1445
+ "ref": "section-opener",
1446
+ "slots": {
1447
+ "number": "1",
1448
+ "title": "Summary: not ready for 3.2 times without two changes"
1449
+ }
1450
+ }
1451
+ },
1452
+ {
1453
+ "name": "block",
1454
+ "props": {
1455
+ "ref": "key-takeaways",
1456
+ "slots": {
1457
+ "label": "Summary",
1458
+ "items": [
1459
+ "The system held to 2.4 times normal traffic; beyond it checkout p99 rose from 340 ms to 4.1 s.",
1460
+ "The first bottleneck is the payments connection pool, saturated at 200 connections; raising it to 500 moved the ceiling to 3.1 times.",
1461
+ "The second bottleneck is the inventory write lock; with both fixes the expected ceiling is 3.6 times, above the 3.2 forecast."
1462
+ ]
1463
+ }
1464
+ }
1465
+ },
1466
+ {
1467
+ "name": "paragraph",
1468
+ "props": {
1469
+ "text": "The seasonal peak is forecast at 3.2 times normal traffic. Four load-test runs against staging show the platform holding to 2.4 times as delivered, to 3.1 times with the payments pool raised, and to an estimated 3.6 times once the inventory write lock is addressed. Both fixes are scheduled before the peak; this report sets out the method, the runs, the two bottlenecks and the readiness statement."
1470
+ }
1471
+ }
1472
+ ]
1473
+ },
1474
+ {
1475
+ "name": "section",
1476
+ "children": [
1477
+ {
1478
+ "name": "block",
1479
+ "props": {
1480
+ "ref": "section-opener",
1481
+ "slots": {
1482
+ "number": "2",
1483
+ "title": "Scope and method"
1484
+ }
1485
+ }
1486
+ },
1487
+ {
1488
+ "name": "paragraph",
1489
+ "props": {
1490
+ "text": "Runs replayed the checkout, search and account journeys from the busiest hour of last year's peak, scaled by a multiplier of normal traffic, against the staging cluster sized as production. Each run held its multiplier for twenty minutes after a five-minute ramp; the reported latency is the p99 of checkout requests in the steady twenty minutes, and the error rate counts responses other than 2xx."
1491
+ }
1492
+ },
1493
+ {
1494
+ "name": "block",
1495
+ "props": {
1496
+ "ref": "callout",
1497
+ "slots": {
1498
+ "label": "Assumptions",
1499
+ "text": "Staging matches production in instance types and counts but not in cache warmth: the first five minutes of every run are excluded for that reason. The replay carries no payment-provider latency; the provider's own limit of 400 requests a second is treated as headroom, not as a bottleneck."
1500
+ }
1501
+ }
1502
+ }
1503
+ ]
1504
+ },
1505
+ {
1506
+ "name": "section",
1507
+ "children": [
1508
+ {
1509
+ "name": "block",
1510
+ "props": {
1511
+ "ref": "section-opener",
1512
+ "slots": {
1513
+ "number": "3",
1514
+ "title": "Results"
1515
+ }
1516
+ }
1517
+ },
1518
+ {
1519
+ "name": "paragraph",
1520
+ "props": {
1521
+ "text": "Latency stayed flat to 2.0 times and rose sharply between 2.0 and 2.4 times, where the payments service exhausted its connection pool. Figure 1 shows checkout p99 by multiplier for the delivered configuration and for the run with the pool raised to 500."
1522
+ }
1523
+ },
1524
+ {
1525
+ "name": "block",
1526
+ "props": {
1527
+ "ref": "chart-figure",
1528
+ "slots": {
1529
+ "chart": {
1530
+ "name": "highcharts",
1531
+ "props": {
1532
+ "width": "100%",
1533
+ "options": {
1534
+ "chart": {
1535
+ "type": "column",
1536
+ "width": 900,
1537
+ "height": 460
1538
+ },
1539
+ "title": {
1540
+ "text": null
1541
+ },
1542
+ "xAxis": {
1543
+ "categories": ["1.0", "1.5", "2.0", "2.4", "3.1"],
1544
+ "title": {
1545
+ "text": "Multiplier of normal traffic"
1546
+ }
1547
+ },
1548
+ "yAxis": {
1549
+ "min": 0,
1550
+ "title": {
1551
+ "text": "Checkout p99 (ms)"
1552
+ }
1553
+ },
1554
+ "series": [
1555
+ {
1556
+ "name": "Pool of 200",
1557
+ "data": [340, 350, 380, 4100, null]
1558
+ },
1559
+ {
1560
+ "name": "Pool of 500",
1561
+ "data": [340, 345, 360, 410, 3800]
1562
+ }
1563
+ ],
1564
+ "credits": {
1565
+ "enabled": false
1566
+ }
1567
+ }
1568
+ }
1569
+ },
1570
+ "caption": "Checkout p99 latency by traffic multiplier, delivered pool against the raised pool",
1571
+ "takeaway": "Raising the payments pool from 200 to 500 connections moves the latency cliff from 2.4 to 3.1 times normal traffic.",
1572
+ "source": "Source: load test runs 7 to 10, staging, 28 August 2026."
1573
+ }
1574
+ }
1575
+ },
1576
+ {
1577
+ "name": "heading",
1578
+ "props": {
1579
+ "level": 2,
1580
+ "text": "3.1 The first bottleneck: the payments connection pool"
1581
+ }
1582
+ },
1583
+ {
1584
+ "name": "paragraph",
1585
+ "props": {
1586
+ "text": "At 2.4 times, the payments service held 200 open connections and queued the rest; queue wait accounted for 3.6 s of the 4.1 s p99. Raising the pool to 500 removed the queue at 2.4 times and held p99 at 410 ms. The database behind the service showed no pressure at either setting."
1587
+ }
1588
+ },
1589
+ {
1590
+ "name": "heading",
1591
+ "props": {
1592
+ "level": 2,
1593
+ "text": "3.2 The second bottleneck: the inventory write lock"
1594
+ }
1595
+ },
1596
+ {
1597
+ "name": "paragraph",
1598
+ "props": {
1599
+ "text": "With the pool raised, the run at 3.1 times failed on the inventory database instead: stock decrements serialise on a row lock per product, and the ten best-selling products took 86% of the wait. Batching decrements per product every 200 ms is expected to lift the ceiling to about 3.6 times; that estimate comes from the lock-wait share, not from a run."
1600
+ }
1601
+ },
1602
+ {
1603
+ "name": "block",
1604
+ "props": {
1605
+ "ref": "data-table",
1606
+ "slots": {
1607
+ "title": "Load-test runs, steady state after the ramp",
1608
+ "labelHeader": "Run",
1609
+ "labels": [
1610
+ "Run 7, pool 200",
1611
+ "Run 8, pool 200",
1612
+ "Run 9, pool 500",
1613
+ "Run 10, pool 500"
1614
+ ],
1615
+ "columns": [
1616
+ {
1617
+ "header": "Multiplier",
1618
+ "cells": ["2.0", "2.4", "2.4", "3.1"]
1619
+ },
1620
+ {
1621
+ "header": "p99 (ms)",
1622
+ "cells": ["380", "4100", "410", "3800"]
1623
+ },
1624
+ {
1625
+ "header": "Errors (%)",
1626
+ "cells": ["0.0", "2.4", "0.0", "1.9"]
1627
+ },
1628
+ {
1629
+ "header": "Limit",
1630
+ "cells": ["none", "pool", "none", "lock"],
1631
+ "numeric": false
1632
+ }
1633
+ ],
1634
+ "notes": "p99 is the 99th percentile of checkout requests over the steady twenty minutes; errors count responses other than 2xx. Runs 9 and 10 carry the payments pool at 500 connections.",
1635
+ "source": "Source: load test runs 7 to 10, staging, 28 August 2026."
1636
+ }
1637
+ }
1638
+ }
1639
+ ]
1640
+ },
1641
+ {
1642
+ "name": "section",
1643
+ "children": [
1644
+ {
1645
+ "name": "block",
1646
+ "props": {
1647
+ "ref": "section-opener",
1648
+ "slots": {
1649
+ "number": "4",
1650
+ "title": "Fixes and expected headroom"
1651
+ }
1652
+ }
1653
+ },
1654
+ {
1655
+ "name": "paragraph",
1656
+ "props": {
1657
+ "text": "Raise the payments connection pool to 500 (configuration only, tested in run 9); batch inventory decrements per product every 200 ms (a code change, estimated at four engineer-days, not yet tested under load). Together they are expected to carry 3.6 times normal traffic, a margin of 12% over the forecast peak."
1658
+ }
1659
+ },
1660
+ {
1661
+ "name": "block",
1662
+ "props": {
1663
+ "ref": "callout",
1664
+ "slots": {
1665
+ "label": "Risk",
1666
+ "text": "The inventory estimate rests on the lock-wait share, and batching changes the stock-visible-to-customer window from immediate to 200 ms. A fifth run with both fixes is scheduled for the week before the peak; without it the readiness below is conditional."
1667
+ }
1668
+ }
1669
+ }
1670
+ ]
1671
+ },
1672
+ {
1673
+ "name": "section",
1674
+ "children": [
1675
+ {
1676
+ "name": "block",
1677
+ "props": {
1678
+ "ref": "section-opener",
1679
+ "slots": {
1680
+ "number": "5",
1681
+ "title": "Readiness statement"
1682
+ }
1683
+ }
1684
+ },
1685
+ {
1686
+ "name": "paragraph",
1687
+ "props": {
1688
+ "text": "As delivered, the platform is not ready for the forecast peak. With the pool raised it holds 3.1 times, within 3% of the forecast and without margin. With both fixes in place and confirmed by the fifth run, the platform is ready with a 12% margin; that confirmation is the gate."
1689
+ }
1690
+ },
1691
+ {
1692
+ "name": "block",
1693
+ "props": {
1694
+ "ref": "footnotes",
1695
+ "slots": {
1696
+ "title": "References"
1697
+ }
1698
+ }
1699
+ }
1700
+ ]
1701
+ }
1702
+ ]
1703
+ }